Regression Homework 2 - Krisha Patel

Question 1

This problem uses the dataset prostate. Please install the book package faraway and run the following code to load the data

library(faraway)
data(prostate)
head(prostate)

(a) Give the scatter plot of the data. (5 pts) use lpsa as the response, which is the log of PSA, and consider only one predictor X, which is lcavol, the log cancer volume

plot(prostate$lpsa ~ prostate$lcavol)

(b) Report the sample means and sample standard deviations of lpsa and lcavol respectively, as well as their sample correlation. (5 pts)


mean(prostate$lpsa)
[1] 2.478387
mean(prostate$lcavol)
[1] 1.35001
sd(prostate$lpsa)
[1] 1.154329
sd(prostate$lcavol)
[1] 1.178625
cor(prostate$lpsa, prostate$lcavol)
[1] 0.7344603

(c) The rest of this problem is based on the simple linear regression model. Report the estimates ˆβ0, ˆβ1, se^2, and add the estimated regression line to the scatter plot. (5 pts)


lmodel <- lm(lpsa ~ lcavol, data = prostate)

summary(lmodel)

Call:
lm(formula = lpsa ~ lcavol, data = prostate)

Residuals:
     Min       1Q   Median       3Q      Max 
-1.67625 -0.41648  0.09859  0.50709  1.89673 

Coefficients:
            Estimate Std. Error t value Pr(>|t|)    
(Intercept)  1.50730    0.12194   12.36   <2e-16 ***
lcavol       0.71932    0.06819   10.55   <2e-16 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.7875 on 95 degrees of freedom
Multiple R-squared:  0.5394,    Adjusted R-squared:  0.5346 
F-statistic: 111.3 on 1 and 95 DF,  p-value: < 2.2e-16
plot(prostate$lpsa, prostate$lcavol, 
     main = "Predicting LPSA based on LCAVOL",
     abline(lmodel),
     asp = 1
     )

NA
NA
NA

The estimated β0 is 1.5073, β1 = 0.71932, and se^2 = 0.12194^2

(d) Give an interpretation of the slope ˆβ1 and the intercept ˆβ0?

(5 pts) The intercept, β0 hat, is Expected lpsa when lcavol = 0. The slope, β1 hat, is the expected change in lpsa for a one-unit increase in lcavol

(e) What is the R2? (5 pts)

The R^2 is 0.5394.

(f) Suppose for one patient, their lcavol is one sx lower than ̄x, how much is their lpsa expected to be smaller than ̄y (in the unit sy)? Here, ̄x and sx denote the sample mean and standard deviation of lcavol; ̄y and sy denote the sample mean and standard deviation of lpsa. Explain and show the calculation steps. (5 pts)

This is the linear regression equation: \[y = (\widehat{\beta_0}) + (\widehat{\beta_1})x\] The expected value of lpsa when lcavol = x bar (the sample mean) is \[y(\bar{x}) = (\widehat{\beta_0}) + (\widehat{\beta_1})\bar{x}\] And the expected value for lpsa one lcavol is one standard deviation below the mean is \[y(\bar{x}-sx) = (\widehat{\beta_0}) + (\widehat{\beta_1})(\bar{x}-sx)\] The difference is: \[ (\widehat{\beta_0}) + ((\widehat{\beta_1})\bar{x} - (\widehat{\beta_0}) + (\widehat{\beta_1})(\bar{x}-sx))\] which simplifies to:

\[(\widehat{\beta_1})sx\] This means that lpsa will be the above value smaller when lcavol is one standard deviation below the mean. Since we need to express the results in unit sy, to get the answer divide by sy.

\[\left(\frac{\widehat{\beta_1})sx}{sy}\right)\]

beta1_hat <- 0.71932
sx <- sd(prostate$lcavol)   
sy <- sd(prostate$lpsa)     

# Compute expected change in lpsa (in units of sy)
expected_decrease <- (beta1_hat * sx) / sy
expected_decrease
[1] 0.7344601

(g) Use summary statistics from summary(model) to compute the intervals to give 90% confidence intervals for β0 and β1. (10 pts)

From my notes, the confidence interval for 90% is calculated like this: \[[(\widehat{\beta_0}) - 1.645\sqrt{var(\widehat{\beta_0})}, (\widehat{\beta_0}) + 1.65\sqrt{var(\widehat{\beta_0})}]\]

sum_model <- summary(lmodel)
sum_model

Call:
lm(formula = lpsa ~ lcavol, data = prostate)

Residuals:
     Min       1Q   Median       3Q      Max 
-1.67625 -0.41648  0.09859  0.50709  1.89673 

Coefficients:
            Estimate Std. Error t value Pr(>|t|)    
(Intercept)  1.50730    0.12194   12.36   <2e-16 ***
lcavol       0.71932    0.06819   10.55   <2e-16 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.7875 on 95 degrees of freedom
Multiple R-squared:  0.5394,    Adjusted R-squared:  0.5346 
F-statistic: 111.3 on 1 and 95 DF,  p-value: < 2.2e-16
beta_0_hat <- coef(lmodel)[1] # 1.50730
#variance is the standed error^2. Since we are taking the square root of the variance, it will be easier to simply find the standard error. 
sqrt_var_beta0_hat <- (sum_model$coefficients[1,2]) # this gets the standard error for the intercept (0.12194)
start_value <- beta_0_hat - 1.645 * (sqrt_var_beta0_hat)
end_value <- beta_0_hat + 1.645 * (sqrt_var_beta0_hat)


message("90% confidence interval for beta 0 is: [", start_value, " , ",end_value,"]" )
90% confidence interval for beta 0 is: [1.30671185659567 , 1.70788400716243]
#now for beta_1
beta1_hat <- coef(lmodel)[2] #0.71932
sqrt_var_beta1_hat <- sum_model$coefficients[2,2] #0.06819
start_value_b1 <- beta1_hat  - 1.645 * (sqrt_var_beta1_hat)
end_value_b1 <- beta1_hat  + 1.645 * (sqrt_var_beta1_hat)

message("90% confidence interval for beta 1 is: [", start_value_b1, " , ",end_value_b1,"]" )
90% confidence interval for beta 1 is: [0.607142853744293 , 0.831497424460505]

(h) Use built-in function to verify the 90% confidence intervals you computed in previous question for β0 and β1. (5 pts)

confint(lmodel, level = 0.90)
                  5 %     95 %
(Intercept) 1.3047545 1.709841
lcavol      0.6060482 0.832592

The values are very similar, however there seems to be a rounding issue with my original calculations.

(j) Suppose a new patient arrives, and their lcavol has been measured as x0 = 2. Denote their lpsa as y0 and its mean μ0 = E(y0). Give a prediction for μ0. Give a 95% confidence interval for μ0. Give a 95% prediction interval for y0. (You are allowed to use built-in function to answer this question.) (10 pts)


x0 <- 2
#create dataframe with new value
new_data <- data.frame(lcavol = x0)

# Prediction for mu0 (mean of lpsa)
lpsa_mean_prediction <- predict(lmodel, new_data)
print(paste("Prediction for μ0:", lpsa_mean_prediction))
[1] "Prediction for μ0: 2.94593821008385"
# 95% confidence interval for μ0
confidence_interval <- predict(lmodel, new_data, interval = "confidence")
print("95% Confidence Interval for μ0:")
[1] "95% Confidence Interval for μ0:"
print(confidence_interval)
       fit      lwr      upr
1 2.945938 2.764442 3.127434
# 95% prediction interval for y0 (individual lpsa)
prediction_interval <- predict(lmodel, new_data, interval = "prediction")
print("95% Prediction Interval for y0:")
[1] "95% Prediction Interval for y0:"
print(prediction_interval)
       fit      lwr      upr
1 2.945938 1.372054 4.519822

Question 2

Suppose β0 = 4, β1 = 6, σ^2 = 0.3 and n = 50. We also assume that the xi’s are independent and identically distributed as N(0, 1). Set seed set.seed(123) for the experiment and repeat the following N = 1000 times: • (i) Generate the data {(x1, y1), . . . ,(x50, y50)} from the model. [Note. Use the function rnorm() to generate the xi’s and ϵi ’s with corresponding means and standard deviations.] • (ii) Use the lm() function to get βˆ0, βˆ1 and ˆσ2

[Note. Suppose you get the model object out after calling the lm() function, you can get (βˆ0, βˆ1) using out\(coef. If you defineout.s=summary(out), you can get ˆσ using out.s\)sigma.]

set.seed(123)
N <- 1000
n <- 50
beta0 <- 4
beta1 <- 6
sigma2 <- 0.3

#this creates a vector with size 1000 so when the N simulations are run, the values are stored
beta0_hat <- numeric(N)
beta1_hat <- numeric(N)
sigma2_hat <- numeric(N)

#doing 1000 simulatpions
for (i in 1:N) {
  x <- rnorm(n, mean = 0, sd = 1)
  epsilon <- rnorm(n, mean = 0, sd = sqrt(sigma2))
  y <- beta0 + beta1 * x + epsilon
  out <- lm(y ~ x)
  beta0_hat[i] <- out$coef[1]
  beta1_hat[i] <- out$coef[2]
  out.s = summary(out)
  sigma2_hat[i] <- out.s$sigma^2
}

(a) Give a histogram of the 1000 βˆ 0. Report the sample variance of these 1000 βˆ 0. (5 pts)

hist(beta0_hat, main = "Histogram of β0 hat", xlab = "β0 hat")

var(beta0_hat) # 0.00573333
[1] 0.00573333

(b) Give a histogram of the 1000 βˆ1. Report the sample variance of these 1000 βˆ1. (5 pts)

hist(beta1_hat, main = "Histogram of β1 hat", xlab = "β1 hat")

var(beta1_hat) #0.006287197
[1] 0.006287197

(c) Give a histogram of the 1000 ˆσ2. (5 pts)

hist(sigma2_hat, main = "Histogram of sigma^2 hat", xlab = "sigma^2 hat")

(d) Assuming σ2 is known, give a histogram of the lengths of the 1000 90% confidence intervals of βˆ1 and report their average. (10 pts)


#to store the confidence interval lengths in a vector of size N
ci_lengths_known <- numeric(N)

for (i in 1:N) {
  # this will generate the data, like before
  x <- rnorm(n, mean = 0, sd = 1)
  epsilon <- rnorm(n, mean = 0, sd = sqrt(sigma2))
  y <- beta0 + beta1 * x + epsilon
  model <- lm(y ~ x)
  beta1_hat <- coef(model)[2]  # Estimated slope
  x_var <- sum((x - mean(x))^2)  # Sum of squared deviations
  
  # Compute CI length
  ci_length <- 2 * 1.645 * sqrt(sigma2 / x_var)
  ci_lengths_known[i] <- ci_length
}


hist(ci_lengths_known, main = "Histogram of 90% CI Lengths for β̂1 (Known σ²)",
     xlab = "CI Length")


#average CI length
mean(ci_lengths_known)
[1] 0.2606815
#0.2605582

(e) Assuming σ^2 is unknown, give a histogram of the lengths of the 1000 90% confidence interval lengths of βˆ1 and report their average. (10 pts)

#Since σ^2 is unknown, I will use t-distribution instead of normal distribution
t_val <- qt(0.95, df = n - 2)  # t-critical value for 90% CI

ci_lengths_unknown <- numeric(N)

#this follows what I did above
for (i in 1:N) {
  x <- rnorm(n, mean = 0, sd = 1)
  epsilon <- rnorm(n, mean = 0, sd = sqrt(sigma2))
  y <- beta0 + beta1 * x + epsilon
  model <- lm(y ~ x)
  beta1_hat <- coef(model)[2] 
  sum_model <- summary(model)
  sigma_hat2 <- sum_model$sigma^2 
  x_var <- sum((x - mean(x))^2)
  
  ci_length <- 2 * t_val * sqrt(sigma_hat2 / x_var)
  ci_lengths_unknown[i] <- ci_length
}

# Histogram of CI lengths
hist(ci_lengths_unknown, main = "Histogram of 90% CI Lengths for β̂1 (Unknown σ²)",
     xlab = "CI Length")


# average CI length
mean(ci_lengths_unknown)
[1] 0.2632748
#0.2632344

(f) Repeat (d) and (e) with n = 10 and comment on the lengths of confidence intervals obtained from known σ2 and unknown σ2. (5 pts)


n <- 10 #the new sample size
ci_lengths_known_10 <- numeric(N)
ci_lengths_unknown_10 <- numeric(N)
t_val_10 <- qt(0.95, df = n - 2)

for (i in 1:N) {
  x <- rnorm(n, mean = 0, sd = 1)
  epsilon <- rnorm(n, mean = 0, sd = sqrt(sigma2))
  y <- beta0 + beta1 * x + epsilon
  model <- lm(y ~ x)
  sum_model <- summary(model)
  sigma_hat <- sum_model$sigma
  x_var <- sum((x - mean(x))^2)
  
  ci_lengths_known_10[i] <- 2 * 1.645 * sqrt(sigma2 / x_var) #using normal value of 1.645 here
  ci_lengths_unknown_10[i] <- 2 * t_val_10 * sqrt(sigma_hat^2 / x_var) #using the calculated t_value here
}

hist(ci_lengths_known_10, main = "Histogram of CI Lengths (n=10, Known σ²)")

mean(ci_lengths_known_10) #0.657455
[1] 0.6555479
hist(ci_lengths_unknown_10, main = "Histogram of CI Lengths (n=10, Unknown σ²)")

mean(ci_lengths_unknown_10) #0.7151685
[1] 0.7253124

When the sample size is 10, the confidence intervals are about 3 times longer than when the sample size is 50 because of the increased variance in small samples. When σ² is unknown, the confidence interval lengths are slightly higher because there is an increase in estimation uncertainty.This is because each simulation will give a slightly different value of σ².

LS0tCnRpdGxlOiAiSG9tZXdvcmsgMi0zIgphdXRob3I6ICdLcmlzaGEgUGF0ZWwsIGtzcDE2MicKZGF0ZTogIjIwMjUtMDItMjYiCm91dHB1dDogaHRtbF9ub3RlYm9vawplZGl0b3Jfb3B0aW9uczogCiAgbWFya2Rvd246IAogICAgd3JhcDogNzIKLS0tCgojIFJlZ3Jlc3Npb24gSG9tZXdvcmsgMiAtIEtyaXNoYSBQYXRlbAoKIyMjIFF1ZXN0aW9uIDEKClRoaXMgcHJvYmxlbSB1c2VzIHRoZSBkYXRhc2V0IHByb3N0YXRlLiBQbGVhc2UgaW5zdGFsbCB0aGUgYm9vayBwYWNrYWdlCmZhcmF3YXkgYW5kIHJ1biB0aGUgZm9sbG93aW5nIGNvZGUgdG8gbG9hZCB0aGUgZGF0YQoKYGBge3J9CmxpYnJhcnkoZmFyYXdheSkKZGF0YShwcm9zdGF0ZSkKaGVhZChwcm9zdGF0ZSkKYGBgCgojIyMjIChhKSBHaXZlIHRoZSBzY2F0dGVyIHBsb3Qgb2YgdGhlIGRhdGEuICg1IHB0cykgdXNlIGxwc2EgYXMgdGhlIHJlc3BvbnNlLCB3aGljaCBpcyB0aGUgbG9nIG9mIFBTQSwgYW5kIGNvbnNpZGVyIG9ubHkgb25lIHByZWRpY3RvciBYLCB3aGljaCBpcyBsY2F2b2wsIHRoZSBsb2cgY2FuY2VyIHZvbHVtZQoKYGBge3J9CnBsb3QocHJvc3RhdGUkbHBzYSB+IHByb3N0YXRlJGxjYXZvbCkKCmBgYAoKIyMjIyAoYikgUmVwb3J0IHRoZSBzYW1wbGUgbWVhbnMgYW5kIHNhbXBsZSBzdGFuZGFyZCBkZXZpYXRpb25zIG9mIGxwc2EgYW5kIGxjYXZvbCByZXNwZWN0aXZlbHksIGFzIHdlbGwgYXMgdGhlaXIgc2FtcGxlIGNvcnJlbGF0aW9uLiAoNSBwdHMpCgpgYGB7cn0KCm1lYW4ocHJvc3RhdGUkbHBzYSkgIyAyLjQ3ODM4NwptZWFuKHByb3N0YXRlJGxjYXZvbCkgIzEuMzUwMDEKCnNkKHByb3N0YXRlJGxwc2EpICMxLjE1NDMyOQpzZChwcm9zdGF0ZSRsY2F2b2wpICMxLjE3ODYyNQoKY29yKHByb3N0YXRlJGxwc2EsIHByb3N0YXRlJGxjYXZvbCkgIzAuNzM0NDYwMyBzZWVtcyBsaWtlIGEgbW9kZXJhdGUgdG8gaGlnaCBjb3JyZWxhdGlvbgoKYGBgCgojIyMjIChjKSBUaGUgcmVzdCBvZiB0aGlzIHByb2JsZW0gaXMgYmFzZWQgb24gdGhlIHNpbXBsZSBsaW5lYXIgcmVncmVzc2lvbiBtb2RlbC4gUmVwb3J0IHRoZSBlc3RpbWF0ZXMgy4bOsjAsIMuGzrIxLCBzZVxeMiwgYW5kIGFkZCB0aGUgZXN0aW1hdGVkIHJlZ3Jlc3Npb24gbGluZSB0byB0aGUgc2NhdHRlciBwbG90LiAoNSBwdHMpCgpgYGB7cn0KCmxtb2RlbCA8LSBsbShscHNhIH4gbGNhdm9sLCBkYXRhID0gcHJvc3RhdGUpCgpzdW1tYXJ5KGxtb2RlbCkKCnBsb3QocHJvc3RhdGUkbHBzYSwgcHJvc3RhdGUkbGNhdm9sLCAKICAgICBtYWluID0gIlByZWRpY3RpbmcgTFBTQSBiYXNlZCBvbiBMQ0FWT0wiLAogICAgIGFibGluZShsbW9kZWwpLAogICAgIGFzcCA9IDEKICAgICApCgoKCmBgYAoKVGhlIGVzdGltYXRlZCDOsjAgaXMgMS41MDczLCDOsjEgPSAwLjcxOTMyLCBhbmQgc2VcXjIgPSAwLjEyMTk0XF4yCgojIyMjIChkKSBHaXZlIGFuIGludGVycHJldGF0aW9uIG9mIHRoZSBzbG9wZSDLhs6yMSBhbmQgdGhlIGludGVyY2VwdCDLhs6yMD8KCig1IHB0cykgVGhlIGludGVyY2VwdCwgzrIwIGhhdCwgaXMgRXhwZWN0ZWQgbHBzYSB3aGVuIGxjYXZvbCA9IDAuIFRoZQpzbG9wZSwgzrIxIGhhdCwgaXMgdGhlIGV4cGVjdGVkIGNoYW5nZSBpbiBscHNhIGZvciBhIG9uZS11bml0IGluY3JlYXNlIGluCmxjYXZvbAoKIyMjIyAoZSkgV2hhdCBpcyB0aGUgUjI/ICg1IHB0cykgCgpUaGUgUlxeMiBpcyAwLjUzOTQuCgojIyMjIChmKSBTdXBwb3NlIGZvciBvbmUgcGF0aWVudCwgdGhlaXIgbGNhdm9sIGlzIG9uZSBzeCBsb3dlciB0aGFuIMyEeCwgaG93IG11Y2ggaXMgdGhlaXIgbHBzYSBleHBlY3RlZCB0byBiZSBzbWFsbGVyIHRoYW4gzIR5IChpbiB0aGUgdW5pdCBzeSk/IEhlcmUsIMyEeCBhbmQgc3ggZGVub3RlIHRoZSBzYW1wbGUgbWVhbiBhbmQgc3RhbmRhcmQgZGV2aWF0aW9uIG9mIGxjYXZvbDsgzIR5IGFuZCBzeSBkZW5vdGUgdGhlIHNhbXBsZSBtZWFuIGFuZCBzdGFuZGFyZCBkZXZpYXRpb24gb2YgbHBzYS4gRXhwbGFpbiBhbmQgc2hvdyB0aGUgY2FsY3VsYXRpb24gc3RlcHMuICg1IHB0cykKClRoaXMgaXMgdGhlIGxpbmVhciByZWdyZXNzaW9uIGVxdWF0aW9uOgokJHkgPSAoXHdpZGVoYXR7XGJldGFfMH0pICsgKFx3aWRlaGF0e1xiZXRhXzF9KXgkJCBUaGUgZXhwZWN0ZWQgdmFsdWUgb2YKbHBzYSB3aGVuIGxjYXZvbCA9IHggYmFyICh0aGUgc2FtcGxlIG1lYW4pIGlzCiQkeShcYmFye3h9KSA9IChcd2lkZWhhdHtcYmV0YV8wfSkgKyAoXHdpZGVoYXR7XGJldGFfMX0pXGJhcnt4fSQkIEFuZAp0aGUgZXhwZWN0ZWQgdmFsdWUgZm9yIGxwc2Egb25lIGxjYXZvbCBpcyBvbmUgc3RhbmRhcmQgZGV2aWF0aW9uIGJlbG93CnRoZSBtZWFuIGlzCiQkeShcYmFye3h9LXN4KSA9IChcd2lkZWhhdHtcYmV0YV8wfSkgKyAoXHdpZGVoYXR7XGJldGFfMX0pKFxiYXJ7eH0tc3gpJCQKVGhlIGRpZmZlcmVuY2UgaXM6CiQkIChcd2lkZWhhdHtcYmV0YV8wfSkgKyAgKChcd2lkZWhhdHtcYmV0YV8xfSlcYmFye3h9IC0gKFx3aWRlaGF0e1xiZXRhXzB9KSArIChcd2lkZWhhdHtcYmV0YV8xfSkoXGJhcnt4fS1zeCkpJCQKd2hpY2ggc2ltcGxpZmllcyB0bzoKCiQkKFx3aWRlaGF0e1xiZXRhXzF9KXN4JCQgVGhpcyBtZWFucyB0aGF0IGxwc2Egd2lsbCBiZSB0aGUgYWJvdmUgdmFsdWUKc21hbGxlciB3aGVuIGxjYXZvbCBpcyBvbmUgc3RhbmRhcmQgZGV2aWF0aW9uIGJlbG93IHRoZSBtZWFuLiBTaW5jZSB3ZQpuZWVkIHRvIGV4cHJlc3MgdGhlIHJlc3VsdHMgaW4gdW5pdCBzeSwgdG8gZ2V0IHRoZSBhbnN3ZXIgZGl2aWRlIGJ5IHN5LgoKJCRcbGVmdChcZnJhY3tcd2lkZWhhdHtcYmV0YV8xfSlzeH17c3l9XHJpZ2h0KSQkCgpgYGB7cn0KYmV0YTFfaGF0IDwtIDAuNzE5MzIKc3ggPC0gc2QocHJvc3RhdGUkbGNhdm9sKSAgIApzeSA8LSBzZChwcm9zdGF0ZSRscHNhKSAgICAgCgojIENvbXB1dGUgZXhwZWN0ZWQgY2hhbmdlIGluIGxwc2EgKGluIHVuaXRzIG9mIHN5KQpleHBlY3RlZF9kZWNyZWFzZSA8LSAoYmV0YTFfaGF0ICogc3gpIC8gc3kKZXhwZWN0ZWRfZGVjcmVhc2UKYGBgCgojIyMjIChnKSBVc2Ugc3VtbWFyeSBzdGF0aXN0aWNzIGZyb20gc3VtbWFyeShtb2RlbCkgdG8gY29tcHV0ZSB0aGUgaW50ZXJ2YWxzIHRvIGdpdmUgOTAlIGNvbmZpZGVuY2UgaW50ZXJ2YWxzIGZvciDOsjAgYW5kIM6yMS4gKDEwIHB0cykKCkZyb20gbXkgbm90ZXMsIHRoZSBjb25maWRlbmNlIGludGVydmFsIGZvciA5MCUgaXMgY2FsY3VsYXRlZCBsaWtlIHRoaXM6CiQkWyhcd2lkZWhhdHtcYmV0YV8wfSkgLSAxLjY0NVxzcXJ0e3Zhcihcd2lkZWhhdHtcYmV0YV8wfSl9LCAoXHdpZGVoYXR7XGJldGFfMH0pICsgMS42NVxzcXJ0e3Zhcihcd2lkZWhhdHtcYmV0YV8wfSl9XSQkCgpgYGB7cn0Kc3VtX21vZGVsIDwtIHN1bW1hcnkobG1vZGVsKQpzdW1fbW9kZWwKYmV0YV8wX2hhdCA8LSBjb2VmKGxtb2RlbClbMV0gIyAxLjUwNzMwCiN2YXJpYW5jZSBpcyB0aGUgc3RhbmRlZCBlcnJvcl4yLiBTaW5jZSB3ZSBhcmUgdGFraW5nIHRoZSBzcXVhcmUgcm9vdCBvZiB0aGUgdmFyaWFuY2UsIGl0IHdpbGwgYmUgZWFzaWVyIHRvIHNpbXBseSBmaW5kIHRoZSBzdGFuZGFyZCBlcnJvci4gCnNxcnRfdmFyX2JldGEwX2hhdCA8LSAoc3VtX21vZGVsJGNvZWZmaWNpZW50c1sxLDJdKSAjIHRoaXMgZ2V0cyB0aGUgc3RhbmRhcmQgZXJyb3IgZm9yIHRoZSBpbnRlcmNlcHQgKDAuMTIxOTQpCnN0YXJ0X3ZhbHVlIDwtIGJldGFfMF9oYXQgLSAxLjY0NSAqIChzcXJ0X3Zhcl9iZXRhMF9oYXQpCmVuZF92YWx1ZSA8LSBiZXRhXzBfaGF0ICsgMS42NDUgKiAoc3FydF92YXJfYmV0YTBfaGF0KQoKCm1lc3NhZ2UoIjkwJSBjb25maWRlbmNlIGludGVydmFsIGZvciBiZXRhIDAgaXM6IFsiLCBzdGFydF92YWx1ZSwgIiAsICIsZW5kX3ZhbHVlLCJdIiApCgojbm93IGZvciBiZXRhXzEKYmV0YTFfaGF0IDwtIGNvZWYobG1vZGVsKVsyXSAjMC43MTkzMgpzcXJ0X3Zhcl9iZXRhMV9oYXQgPC0gc3VtX21vZGVsJGNvZWZmaWNpZW50c1syLDJdICMwLjA2ODE5CnN0YXJ0X3ZhbHVlX2IxIDwtIGJldGExX2hhdCAgLSAxLjY0NSAqIChzcXJ0X3Zhcl9iZXRhMV9oYXQpCmVuZF92YWx1ZV9iMSA8LSBiZXRhMV9oYXQgICsgMS42NDUgKiAoc3FydF92YXJfYmV0YTFfaGF0KQoKbWVzc2FnZSgiOTAlIGNvbmZpZGVuY2UgaW50ZXJ2YWwgZm9yIGJldGEgMSBpczogWyIsIHN0YXJ0X3ZhbHVlX2IxLCAiICwgIixlbmRfdmFsdWVfYjEsIl0iICkKYGBgCgojIyMjIChoKSBVc2UgYnVpbHQtaW4gZnVuY3Rpb24gdG8gdmVyaWZ5IHRoZSA5MCUgY29uZmlkZW5jZSBpbnRlcnZhbHMgeW91IGNvbXB1dGVkIGluIHByZXZpb3VzIHF1ZXN0aW9uIGZvciDOsjAgYW5kIM6yMS4gKDUgcHRzKQoKYGBge3J9CmNvbmZpbnQobG1vZGVsLCBsZXZlbCA9IDAuOTApCmBgYAoKVGhlIHZhbHVlcyBhcmUgdmVyeSBzaW1pbGFyLCBob3dldmVyIHRoZXJlIHNlZW1zIHRvIGJlIGEgcm91bmRpbmcgaXNzdWUKd2l0aCBteSBvcmlnaW5hbCBjYWxjdWxhdGlvbnMuCgojIyMjIChpKSBJcyBscHNhIGxpbmVhcmx5IHJlbGF0ZWQgdG8gbGNhdm9sPyBBbnN3ZXIgdGhpcyBxdWVzdGlvbiBieSBmb3JtdWxhdGluZyBhbmQgcGVyZm9ybWluZyBhIHN0YXRpc3RpY2FsIGh5cG90aGVzaXMgdGVzdCwgYXQgbGV2ZWwgzrEgPSAwLjEuICg1IHB0cykKCkgwOiB0aGVyZSBpcyBubyBsaW5lYXIgcmVsYXRpb25zaGlwIGJldHdlZW4gbHBzYSBhbmQgbGNhdm9sIEhBOiB0aGVyZSBpcwphIGxpbmVhciByZWxhdGlvbnNoaXAgYmV0d2VlbiBscHNhIGFuZCBsY2F2b2wgYWxwaGEgPSAwLjEKc3VtbWFyeShsbW9kZWwpIHNob3dzIHVzIHRoYXQgdGhlIHBfdmFsdWUgaXMgMi4yZS0xNi4gU2luY2UgcCBcPCAwLjEsIHdlCnJlamVjdCBIMCBhbmQgYWNjZXB0IEhBIHdoaWNoIG1lYW5zIHRoYXQgbHBzYSBpcyBsaW5lYXJseSByZWxhdGVkIHRvCmxjYXZvbC4KCiMjIyMgKGopIFN1cHBvc2UgYSBuZXcgcGF0aWVudCBhcnJpdmVzLCBhbmQgdGhlaXIgbGNhdm9sIGhhcyBiZWVuIG1lYXN1cmVkIGFzIHgwID0gMi4gRGVub3RlIHRoZWlyIGxwc2EgYXMgeTAgYW5kIGl0cyBtZWFuIM68MCA9IEUoeTApLiBHaXZlIGEgcHJlZGljdGlvbiBmb3IgzrwwLiBHaXZlIGEgOTUlIGNvbmZpZGVuY2UgaW50ZXJ2YWwgZm9yIM68MC4gR2l2ZSBhIDk1JSBwcmVkaWN0aW9uIGludGVydmFsIGZvciB5MC4gKFlvdSBhcmUgYWxsb3dlZCB0byB1c2UgYnVpbHQtaW4gZnVuY3Rpb24gdG8gYW5zd2VyIHRoaXMgcXVlc3Rpb24uKSAoMTAgcHRzKQoKYGBge3J9Cgp4MCA8LSAyCiNjcmVhdGUgZGF0YWZyYW1lIHdpdGggbmV3IHZhbHVlCm5ld19kYXRhIDwtIGRhdGEuZnJhbWUobGNhdm9sID0geDApCgojIFByZWRpY3Rpb24gZm9yIG11MCAobWVhbiBvZiBscHNhKQpscHNhX21lYW5fcHJlZGljdGlvbiA8LSBwcmVkaWN0KGxtb2RlbCwgbmV3X2RhdGEpCnByaW50KHBhc3RlKCJQcmVkaWN0aW9uIGZvciDOvDA6IiwgbHBzYV9tZWFuX3ByZWRpY3Rpb24pKQoKIyA5NSUgY29uZmlkZW5jZSBpbnRlcnZhbCBmb3IgzrwwCmNvbmZpZGVuY2VfaW50ZXJ2YWwgPC0gcHJlZGljdChsbW9kZWwsIG5ld19kYXRhLCBpbnRlcnZhbCA9ICJjb25maWRlbmNlIikKcHJpbnQoIjk1JSBDb25maWRlbmNlIEludGVydmFsIGZvciDOvDA6IikKcHJpbnQoY29uZmlkZW5jZV9pbnRlcnZhbCkKCiMgOTUlIHByZWRpY3Rpb24gaW50ZXJ2YWwgZm9yIHkwIChpbmRpdmlkdWFsIGxwc2EpCnByZWRpY3Rpb25faW50ZXJ2YWwgPC0gcHJlZGljdChsbW9kZWwsIG5ld19kYXRhLCBpbnRlcnZhbCA9ICJwcmVkaWN0aW9uIikKcHJpbnQoIjk1JSBQcmVkaWN0aW9uIEludGVydmFsIGZvciB5MDoiKQpwcmludChwcmVkaWN0aW9uX2ludGVydmFsKQoKYGBgCgojIyBRdWVzdGlvbiAyCgpTdXBwb3NlIM6yMCA9IDQsIM6yMSA9IDYsIM+DXF4yID0gMC4zIGFuZCBuID0gNTAuIFdlIGFsc28gYXNzdW1lIHRoYXQgdGhlCnhp4oCZcyBhcmUgaW5kZXBlbmRlbnQgYW5kIGlkZW50aWNhbGx5IGRpc3RyaWJ1dGVkIGFzIE4oMCwgMSkuIFNldCBzZWVkCnNldC5zZWVkKDEyMykgZm9yIHRoZSBleHBlcmltZW50IGFuZCByZXBlYXQgdGhlIGZvbGxvd2luZyBOID0gMTAwMAp0aW1lczog4oCiIChpKSBHZW5lcmF0ZSB0aGUgZGF0YSB7KHgxLCB5MSksIC4gLiAuICwoeDUwLCB5NTApfSBmcm9tIHRoZQptb2RlbC4gW05vdGUuIFVzZSB0aGUgZnVuY3Rpb24gcm5vcm0oKSB0byBnZW5lcmF0ZSB0aGUgeGnigJlzIGFuZCDPtWkg4oCZcwp3aXRoIGNvcnJlc3BvbmRpbmcgbWVhbnMgYW5kIHN0YW5kYXJkIGRldmlhdGlvbnMuXSDigKIgKGlpKSBVc2UgdGhlIGxtKCkKZnVuY3Rpb24gdG8gZ2V0IM6yy4YwLCDOssuGMSBhbmQgy4bPgzIKCltOb3RlLiBTdXBwb3NlIHlvdSBnZXQgdGhlIG1vZGVsIG9iamVjdCBvdXQgYWZ0ZXIgY2FsbGluZyB0aGUgbG0oKQpmdW5jdGlvbiwgeW91IGNhbiBnZXQgKM6yy4YwLCDOssuGMSkgdXNpbmcKb3V0JGNvZWYuIElmIHlvdSBkZWZpbmVvdXQucz1zdW1tYXJ5KG91dCksIHlvdSBjYW4gZ2V0IMuGz4MgdXNpbmcgb3V0LnMkc2lnbWEuXQoKYGBge3J9CnNldC5zZWVkKDEyMykKTiA8LSAxMDAwCm4gPC0gNTAKYmV0YTAgPC0gNApiZXRhMSA8LSA2CnNpZ21hMiA8LSAwLjMKCiN0aGlzIGNyZWF0ZXMgYSB2ZWN0b3Igd2l0aCBzaXplIDEwMDAgc28gd2hlbiB0aGUgTiBzaW11bGF0aW9ucyBhcmUgcnVuLCB0aGUgdmFsdWVzIGFyZSBzdG9yZWQKYmV0YTBfaGF0IDwtIG51bWVyaWMoTikKYmV0YTFfaGF0IDwtIG51bWVyaWMoTikKc2lnbWEyX2hhdCA8LSBudW1lcmljKE4pCgojZG9pbmcgMTAwMCBzaW11bGF0cGlvbnMKZm9yIChpIGluIDE6TikgewogIHggPC0gcm5vcm0obiwgbWVhbiA9IDAsIHNkID0gMSkKICBlcHNpbG9uIDwtIHJub3JtKG4sIG1lYW4gPSAwLCBzZCA9IHNxcnQoc2lnbWEyKSkKICB5IDwtIGJldGEwICsgYmV0YTEgKiB4ICsgZXBzaWxvbgogIG91dCA8LSBsbSh5IH4geCkKICBiZXRhMF9oYXRbaV0gPC0gb3V0JGNvZWZbMV0KICBiZXRhMV9oYXRbaV0gPC0gb3V0JGNvZWZbMl0KICBvdXQucyA9IHN1bW1hcnkob3V0KQogIHNpZ21hMl9oYXRbaV0gPC0gb3V0LnMkc2lnbWFeMgp9CgoKYGBgCgojIyMjIChhKSBHaXZlIGEgaGlzdG9ncmFtIG9mIHRoZSAxMDAwIM6yy4YgMC4gUmVwb3J0IHRoZSBzYW1wbGUgdmFyaWFuY2Ugb2YgdGhlc2UgMTAwMCDOssuGIDAuICg1IHB0cykKCmBgYHtyfQpoaXN0KGJldGEwX2hhdCwgbWFpbiA9ICJIaXN0b2dyYW0gb2YgzrIwIGhhdCIsIHhsYWIgPSAizrIwIGhhdCIpCnZhcihiZXRhMF9oYXQpICMgMC4wMDU3MzMzMwpgYGAKCiMjIyMgKGIpIEdpdmUgYSBoaXN0b2dyYW0gb2YgdGhlIDEwMDAgzrLLhjEuIFJlcG9ydCB0aGUgc2FtcGxlIHZhcmlhbmNlIG9mIHRoZXNlIDEwMDAgzrLLhjEuICg1IHB0cykKCmBgYHtyfQpoaXN0KGJldGExX2hhdCwgbWFpbiA9ICJIaXN0b2dyYW0gb2YgzrIxIGhhdCIsIHhsYWIgPSAizrIxIGhhdCIpCnZhcihiZXRhMV9oYXQpICMwLjAwNjI4NzE5NwpgYGAKCiMjIyMgKGMpIEdpdmUgYSBoaXN0b2dyYW0gb2YgdGhlIDEwMDAgy4bPgzIuICg1IHB0cykKCmBgYHtyfQpoaXN0KHNpZ21hMl9oYXQsIG1haW4gPSAiSGlzdG9ncmFtIG9mIHNpZ21hXjIgaGF0IiwgeGxhYiA9ICJzaWdtYV4yIGhhdCIpCgpgYGAKCiMjIyMgKGQpIEFzc3VtaW5nIM+DMiBpcyBrbm93biwgZ2l2ZSBhIGhpc3RvZ3JhbSBvZiB0aGUgbGVuZ3RocyBvZiB0aGUgMTAwMCA5MCUgY29uZmlkZW5jZSBpbnRlcnZhbHMgb2YgzrLLhjEgYW5kIHJlcG9ydCB0aGVpciBhdmVyYWdlLiAoMTAgcHRzKQoKYGBge3J9CgojdG8gc3RvcmUgdGhlIGNvbmZpZGVuY2UgaW50ZXJ2YWwgbGVuZ3RocyBpbiBhIHZlY3RvciBvZiBzaXplIE4KY2lfbGVuZ3Roc19rbm93biA8LSBudW1lcmljKE4pCgpmb3IgKGkgaW4gMTpOKSB7CiAgIyB0aGlzIHdpbGwgZ2VuZXJhdGUgdGhlIGRhdGEsIGxpa2UgYmVmb3JlCiAgeCA8LSBybm9ybShuLCBtZWFuID0gMCwgc2QgPSAxKQogIGVwc2lsb24gPC0gcm5vcm0obiwgbWVhbiA9IDAsIHNkID0gc3FydChzaWdtYTIpKQogIHkgPC0gYmV0YTAgKyBiZXRhMSAqIHggKyBlcHNpbG9uCiAgbW9kZWwgPC0gbG0oeSB+IHgpCiAgYmV0YTFfaGF0IDwtIGNvZWYobW9kZWwpWzJdICAjIEVzdGltYXRlZCBzbG9wZQogIHhfdmFyIDwtIHN1bSgoeCAtIG1lYW4oeCkpXjIpICAjIFN1bSBvZiBzcXVhcmVkIGRldmlhdGlvbnMKICAKICAjIENvbXB1dGUgQ0kgbGVuZ3RoCiAgY2lfbGVuZ3RoIDwtIDIgKiAxLjY0NSAqIHNxcnQoc2lnbWEyIC8geF92YXIpCiAgY2lfbGVuZ3Roc19rbm93bltpXSA8LSBjaV9sZW5ndGgKfQoKCmhpc3QoY2lfbGVuZ3Roc19rbm93biwgbWFpbiA9ICJIaXN0b2dyYW0gb2YgOTAlIENJIExlbmd0aHMgZm9yIM6yzIIxIChLbm93biDPg8KyKSIsCiAgICAgeGxhYiA9ICJDSSBMZW5ndGgiKQoKI2F2ZXJhZ2UgQ0kgbGVuZ3RoCm1lYW4oY2lfbGVuZ3Roc19rbm93bikKIzAuMjYwNTU4MgoKYGBgCgojIyMjIChlKSBBc3N1bWluZyDPg1xeMiBpcyB1bmtub3duLCBnaXZlIGEgaGlzdG9ncmFtIG9mIHRoZSBsZW5ndGhzIG9mIHRoZSAxMDAwIDkwJSBjb25maWRlbmNlIGludGVydmFsIGxlbmd0aHMgb2YgzrLLhjEgYW5kIHJlcG9ydCB0aGVpciBhdmVyYWdlLiAoMTAgcHRzKQoKYGBge3J9CiNTaW5jZSDPg14yIGlzIHVua25vd24sIEkgd2lsbCB1c2UgdC1kaXN0cmlidXRpb24gaW5zdGVhZCBvZiBub3JtYWwgZGlzdHJpYnV0aW9uCnRfdmFsIDwtIHF0KDAuOTUsIGRmID0gbiAtIDIpICAjIHQtY3JpdGljYWwgdmFsdWUgZm9yIDkwJSBDSQoKY2lfbGVuZ3Roc191bmtub3duIDwtIG51bWVyaWMoTikKCiN0aGlzIGZvbGxvd3Mgd2hhdCBJIGRpZCBhYm92ZQpmb3IgKGkgaW4gMTpOKSB7CiAgeCA8LSBybm9ybShuLCBtZWFuID0gMCwgc2QgPSAxKQogIGVwc2lsb24gPC0gcm5vcm0obiwgbWVhbiA9IDAsIHNkID0gc3FydChzaWdtYTIpKQogIHkgPC0gYmV0YTAgKyBiZXRhMSAqIHggKyBlcHNpbG9uCiAgbW9kZWwgPC0gbG0oeSB+IHgpCiAgYmV0YTFfaGF0IDwtIGNvZWYobW9kZWwpWzJdIAogIHN1bV9tb2RlbCA8LSBzdW1tYXJ5KG1vZGVsKQogIHNpZ21hX2hhdDIgPC0gc3VtX21vZGVsJHNpZ21hXjIgCiAgeF92YXIgPC0gc3VtKCh4IC0gbWVhbih4KSleMikKICAKICBjaV9sZW5ndGggPC0gMiAqIHRfdmFsICogc3FydChzaWdtYV9oYXQyIC8geF92YXIpCiAgY2lfbGVuZ3Roc191bmtub3duW2ldIDwtIGNpX2xlbmd0aAp9CgojIEhpc3RvZ3JhbSBvZiBDSSBsZW5ndGhzCmhpc3QoY2lfbGVuZ3Roc191bmtub3duLCBtYWluID0gIkhpc3RvZ3JhbSBvZiA5MCUgQ0kgTGVuZ3RocyBmb3IgzrLMgjEgKFVua25vd24gz4PCsikiLAogICAgIHhsYWIgPSAiQ0kgTGVuZ3RoIikKCiMgYXZlcmFnZSBDSSBsZW5ndGgKbWVhbihjaV9sZW5ndGhzX3Vua25vd24pCiMwLjI2MzIzNDQKYGBgCgojIyMjIChmKSBSZXBlYXQgKGQpIGFuZCAoZSkgd2l0aCBuID0gMTAgYW5kIGNvbW1lbnQgb24gdGhlIGxlbmd0aHMgb2YgY29uZmlkZW5jZSBpbnRlcnZhbHMgb2J0YWluZWQgZnJvbSBrbm93biDPgzIgYW5kIHVua25vd24gz4MyLiAoNSBwdHMpCgpgYGB7cn0KCm4gPC0gMTAgI3RoZSBuZXcgc2FtcGxlIHNpemUKY2lfbGVuZ3Roc19rbm93bl8xMCA8LSBudW1lcmljKE4pCmNpX2xlbmd0aHNfdW5rbm93bl8xMCA8LSBudW1lcmljKE4pCnRfdmFsXzEwIDwtIHF0KDAuOTUsIGRmID0gbiAtIDIpCgpmb3IgKGkgaW4gMTpOKSB7CiAgeCA8LSBybm9ybShuLCBtZWFuID0gMCwgc2QgPSAxKQogIGVwc2lsb24gPC0gcm5vcm0obiwgbWVhbiA9IDAsIHNkID0gc3FydChzaWdtYTIpKQogIHkgPC0gYmV0YTAgKyBiZXRhMSAqIHggKyBlcHNpbG9uCiAgbW9kZWwgPC0gbG0oeSB+IHgpCiAgc3VtX21vZGVsIDwtIHN1bW1hcnkobW9kZWwpCiAgc2lnbWFfaGF0IDwtIHN1bV9tb2RlbCRzaWdtYQogIHhfdmFyIDwtIHN1bSgoeCAtIG1lYW4oeCkpXjIpCiAgCiAgY2lfbGVuZ3Roc19rbm93bl8xMFtpXSA8LSAyICogMS42NDUgKiBzcXJ0KHNpZ21hMiAvIHhfdmFyKSAjdXNpbmcgbm9ybWFsIHZhbHVlIG9mIDEuNjQ1IGhlcmUKICBjaV9sZW5ndGhzX3Vua25vd25fMTBbaV0gPC0gMiAqIHRfdmFsXzEwICogc3FydChzaWdtYV9oYXReMiAvIHhfdmFyKSAjdXNpbmcgdGhlIGNhbGN1bGF0ZWQgdF92YWx1ZSBoZXJlCn0KCmhpc3QoY2lfbGVuZ3Roc19rbm93bl8xMCwgbWFpbiA9ICJIaXN0b2dyYW0gb2YgQ0kgTGVuZ3RocyAobj0xMCwgS25vd24gz4PCsikiKQptZWFuKGNpX2xlbmd0aHNfa25vd25fMTApICMwLjY1NzQ1NQoKaGlzdChjaV9sZW5ndGhzX3Vua25vd25fMTAsIG1haW4gPSAiSGlzdG9ncmFtIG9mIENJIExlbmd0aHMgKG49MTAsIFVua25vd24gz4PCsikiKQptZWFuKGNpX2xlbmd0aHNfdW5rbm93bl8xMCkgIzAuNzE1MTY4NQoKCmBgYAoKV2hlbiB0aGUgc2FtcGxlIHNpemUgaXMgMTAsIHRoZSBjb25maWRlbmNlIGludGVydmFscyBhcmUgYWJvdXQgMyB0aW1lcwpsb25nZXIgdGhhbiB3aGVuIHRoZSBzYW1wbGUgc2l6ZSBpcyA1MCBiZWNhdXNlIG9mIHRoZSBpbmNyZWFzZWQgdmFyaWFuY2UKaW4gc21hbGwgc2FtcGxlcy4gV2hlbiDPg8KyIGlzIHVua25vd24sIHRoZSBjb25maWRlbmNlIGludGVydmFsIGxlbmd0aHMKYXJlIHNsaWdodGx5IGhpZ2hlciBiZWNhdXNlIHRoZXJlIGlzIGFuIGluY3JlYXNlIGluIGVzdGltYXRpb24KdW5jZXJ0YWludHkuVGhpcyBpcyBiZWNhdXNlIGVhY2ggc2ltdWxhdGlvbiB3aWxsIGdpdmUgYSBzbGlnaHRseQpkaWZmZXJlbnQgdmFsdWUgb2Ygz4PCsi4K