The R code is hidden by default. Please click on Show to view all
codes. Thank you.
Assignment 1
Question 1.
Import Data and load libraries from URL: https://bgreenwell.github.io/uc-bana7052/data/alumni.csv
url <- "https://bgreenwell.github.io/uc-bana7052/data/alumni.csv"
alumni <- read.csv(url)
str(alumni)
attach(alumni)
library(tidyverse)
a) Start with a basic exploratory data analysis. Show summary
statistics of the response variable and predictor variable.
The summary statistics of variable Percent_of_Classes_Under_20 (X
variable) is displayed below - the predictor variable
(percent_of_classes_under_20) has a median of 59.5 and a mean of 55.73.
Standard Deviation is 13.19. Minimum value is 29 and the maximum value
is 77.
summary(percent_of_classes_under_20)
Min. 1st Qu. Median Mean 3rd Qu. Max.
29.00 44.75 59.50 55.73 66.25 77.00
sd(percent_of_classes_under_20)
[1] 13.19371
The summary statistics of variable Alumni_Giving_Rate (Y variable) is
displayed below - the response variable (alumni_giving_rate) has a
median of 29 and a mean of 29.27. Standard deviation of 13.44. The
minimum value is 7 and the maximum value is 67.
summary(alumni_giving_rate)
Min. 1st Qu. Median Mean 3rd Qu. Max.
7.00 18.75 29.00 29.27 38.50 67.00
sd(alumni_giving_rate)
[1] 13.44135
b) What is the nature of the variables X and Y? Are there
“outliers” in the data; how might you define an outlier in this case?
What is the correlation coefficient? Draw a scatter plot. Any major
comments about the data?
cor.test(percent_of_classes_under_20, alumni_giving_rate)
Pearson's product-moment correlation
data: percent_of_classes_under_20 and alumni_giving_rate
t = 5.7344, df = 46, p-value = 7.228e-07
alternative hypothesis: true correlation is not equal to 0
95 percent confidence interval:
0.4427365 0.7856553
sample estimates:
cor
0.6456504
Based on the Pearson’s correlation test, we can see that X and Y has
a positive liner correlation. The correlation value is about 0.6457.
Also the p-value is less than the type 1 error threshold of 0.05, so we
can see that X and Y are strongly associated.
ggplot(alumni, aes(percent_of_classes_under_20, alumni_giving_rate)) +
geom_point() +
geom_smooth(method = "lm") +
labs(title = "Correlation between Percent of Class Under 20 and Giving Rate",
x = "Percent of Class Under 20",
y = "Alumni Giving Rate")

From the graphic above, I used a scatter point and a linear model to
identify if there are outliers. we can see that there are outliers in
this data. I would identify the outliers as points that are strongly
deviated away from the trend line.
c) Fit a simple linear regression to the data. What is your
estimated regression equation?
To fit a simple linear regression, we will need \(\beta_0\) and \(\beta_1\) as the Simple Linear Regression
is \(Y\) = \(\beta_0\) + \(\beta_1\)\(X\) + \(\epsilon\).
To find \(\beta_0\) and \(\beta_1\), I will use the lm()
in R.
fit <- lm(alumni_giving_rate ~ percent_of_classes_under_20, data = alumni)
summary(fit)
Call:
lm(formula = alumni_giving_rate ~ percent_of_classes_under_20,
data = alumni)
Residuals:
Min 1Q Median 3Q Max
-21.053 -7.158 -1.660 6.734 29.658
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) -7.3861 6.5655 -1.125 0.266
percent_of_classes_under_20 0.6578 0.1147 5.734 7.23e-07 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 10.38 on 46 degrees of freedom
Multiple R-squared: 0.4169, Adjusted R-squared: 0.4042
F-statistic: 32.88 on 1 and 46 DF, p-value: 7.228e-07
We can see that the intercept \(\beta_0\) is 37.1786 and the slope \(\beta_1\) is 0.6338. So the estimated
regression equation could be \(\hat{Y}\) = -7.3861 + 0.66\(X\)
d) Interpret your results (e.g., how would you interpret the
slope in this application?).
There is a positive linear relationship between the two variables.
The average giving rate will increase by an estimated 0.6338 percent for
every percentage increase on the Percent of Class Under 20.
Question 2: A Simulation Study (Simple Linear Regression). Assuming
the mean response is E(Y|X)=10+5X:
**a) Generate data with X∼N(μ=2,σ=0.1), sample size n=100, and error
term ϵ∼N(μ=0,σ=0.5).
set.seed(7052)
x <- rnorm(100, mean = 2, sd = 0.1)
error <- rnorm(100, mean = 0, sd = 0.5)
y <- 10 + 5 * x + error
data <- data.frame(x, y)
head(data)
b) Show summary statistics of the response variable and
predictor variable. Are there outliers? What is the correlation
coefficient? Draw a scatter plot.
Below are the summary statistics of response variable y and predictor
variable x.
summary(data)
x y
Min. :1.725 Min. :18.09
1st Qu.:1.923 1st Qu.:19.67
Median :2.001 Median :20.11
Mean :2.004 Mean :20.17
3rd Qu.:2.070 3rd Qu.:20.70
Max. :2.243 Max. :21.80
ggplot(data, aes(x, y)) +
geom_point() +
geom_smooth(method = "lm")

From the graph above, we can see there are a few outliers, some
points are far away from the trend line.
cor(x, y, method = "pearson")
[1] 0.8042198
The correlation coefficient is 0.8042.
c) Fit a simple linear regression. What is the estimated
model? Report the estimated coefficients. What is the model mean squared
error (MSE)?
The fitted SLR model and coefficients are below. The coefficients
intercept is 9.022, and the slope is 5.565.
fit2 <- lm( y ~ x, data)
print(fit2)
Call:
lm(formula = y ~ x, data = data)
Coefficients:
(Intercept) x
9.022 5.565
coef(fit2)
(Intercept) x
9.021796 5.565160
sigma(fit2)^2
[1] 0.2032934
The MSE is 0.203.
d) What is the sample mean of both X and Y? Plot the fitted
regression line and the point \((\bar{X},
\bar{Y})\). What do you find?
summary(data)
x y
Min. :1.725 Min. :18.09
1st Qu.:1.923 1st Qu.:19.67
Median :2.001 Median :20.11
Mean :2.004 Mean :20.17
3rd Qu.:2.070 3rd Qu.:20.70
Max. :2.243 Max. :21.80
From the summary statistics, we can see the sample mean of X is
2.004, and the sample mean for Y is 20.17.
plot(x, y, pch = 19)
abline(fit2, col = "darkorange", lwd = 2)
xbar <- mean(data$x)
ybar <- mean(data$y)
points(xbar, ybar, pch = 19, col = "blue", cex = 1.5)
text(xbar, ybar, label = expression(paste("(", xbar, ",", ybar, ")")), pos = 4, col = "blue")

From the graph above, we can find that the LS regression line passes
through the point (xbar, ybar).
Question 3. Ordinary least squares (OLS) is typically used to
estimate the regression coefficients β_0 and β_1 in the simple linear
regression model by minimizing the residual sum of squares (RSS)
a) How about minimizing \(\sum_{i=1}^n (Y_i - \beta_0 - \beta_1 X_i) =
\sum_{i-1}^n \epsilon_i\)
Minimizing the sum of residuals doesn’t work well for regression
because the residuals can cancel each other out. For example, when one
of the residuals is positive and another one is positive, it can cancel
each other out.
b) How about minimizing \(\sum_{i=1}^n |Y_i - \beta_0 - \beta_1 X_i| =
\sum_{i-1}^n |\epsilon_i|\)
While it is an alternative to OLS, it’s not recommended because it
leads to non-differentiable objective functions and makes the
optimization process more complex.
c) Why is OLS a popular choice for estimating \(\beta_0\) and \(\beta_1\)?
The reason to use the OLS for estimating \(\beta_0\) and \(\beta_1\) is that it’s the best unbiased
linear estimator, we also call it BLUE.
Question 4: Establish the following relationships for the simple
linear regression model.
a) The fitted line passes through the point \((\bar{X},\bar{Y})\)
substitude \(X = \bar{X}\) to the
fitted regression line: \(\hat{Y_i} =
\hat{\beta_0} + \hat{\beta_1} X_i\).
$ = + X = + _{X}
\(\hat{Y} = \bar{Y}\)
b) \(\sum_{i=1}^n e_i = 0\)
Fitted regression line: \(\hat{Y_i} =
\hat{\beta_0} + \hat{\beta_1} X_i\)
each point i is: \(e_i = Y_i - \hat{Y_i} =
Y_i - (\hat{\beta_0} + \hat{\beta_1} X_i)\)
to show if the sum of \(e_i\) is
zero, substitute the expression for \(\hat{Y_i}\)
\(\sum_{i=1}^n e_i = \sum_{i=1}^n Y_i - n
\hat{\beta_0} - \hat{\beta_1} n \bar{X}\) \(\hat{\beta_0} = \bar{Y} - \hat{\beta_1}
\bar{X}\)
so: \(\sum_{i=1}^n e_i =n \bar{Y} - n
\bar{Y} + \hat{\beta_1} n \bar{X} - \hat{\beta_1} n \bar{X} =
0\)
c) \(\sum_{i=1}^n Y_i =
\sum_{i=1}^n \hat{Y_i}\)
Fitted regression line: \(\hat{Y_i} =
\hat{\beta_0} + \hat{\beta_1} X_i\)
\(\sum_{i=1}^n Y_i = \sum_{i=1}^n
(\hat{\beta_0} + \hat{\beta_1} X+i) = \hat{\beta_0} \sum_{i=1}^n 1 +
\hat{\beta_1} \sum_{i=1}^n X_i\)
\(\sum_{i=1}^n Y_i = n \hat{\beta_0} +
\hat{\beta_1} n \bar{X}\)
\(\hat{\beta_0} = \bar{Y} - \hat{\beta_1}
\bar{X}\)
\(\sum_{i=1}^n Y_i = n \bar{Y} -
\hat{\beta_1} n \bar{X} + \hat{\beta_1} n \bar{X} = n
\bar{Y}\)
since \(\bar{Y}\) is the mean of the
observed \(Y_i\) values, so:
\(\sum_{i=1}^n Y_i = n \bar{Y} =
\sum_{i=1}^n \bar{Y_i}\)
d) \(\sum_{i=1}^n X_i e_i =
0\)
We already approved that \(\sum_{i=1}^n e_i
= 0\).
\(\sum_{i=1}^n X_i e_i = X_i \sum_{i=1}^n
e_i = X_i * 0 = 0\)
e) \(\sum_{i=1}^n \hat{Y_i} e_i =
0\)
We already approved that \(\sum_{i=1}^n e_i
= 0\). \(\sum_{i=1}^n Y_i e_i = Y_i
\sum_{i=1}^n e_i = Y_i * 0 = 0\)
f) \(\sum_{i=1}^n e_i^2\) is
minimized
The regression line is the best linear approximation of the data, the
least squares approach provides the best linear unbiased estimators
under the assumption of the linear regression model.
LS0tCnRpdGxlOiAiQkFOQTcwNTJfQXNzaWdubWVudDFfUkZpc2NoZXIiCm91dHB1dDoKICBodG1sX25vdGVib29rOgogICAgY29kZV9mb2xkaW5nOiBoaWRlCi0tLQoKVGhlIFIgY29kZSBpcyBoaWRkZW4gYnkgZGVmYXVsdC4gUGxlYXNlIGNsaWNrIG9uIFNob3cgdG8gdmlldyBhbGwgY29kZXMuIFRoYW5rIHlvdS4KCiMjIyBBc3NpZ25tZW50IDEKCiMjIyMgUXVlc3Rpb24gMS4KSW1wb3J0IERhdGEgYW5kIGxvYWQgbGlicmFyaWVzIGZyb20gVVJMOiBodHRwczovL2JncmVlbndlbGwuZ2l0aHViLmlvL3VjLWJhbmE3MDUyL2RhdGEvYWx1bW5pLmNzdgpgYGB7ciBJbXBvcnQgRGF0YSBBbHVtbml9CnVybCA8LSAiaHR0cHM6Ly9iZ3JlZW53ZWxsLmdpdGh1Yi5pby91Yy1iYW5hNzA1Mi9kYXRhL2FsdW1uaS5jc3YiCmFsdW1uaSA8LSByZWFkLmNzdih1cmwpCnN0cihhbHVtbmkpCmF0dGFjaChhbHVtbmkpCmxpYnJhcnkodGlkeXZlcnNlKQpgYGAKCioqYSkgU3RhcnQgd2l0aCBhIGJhc2ljIGV4cGxvcmF0b3J5IGRhdGEgYW5hbHlzaXMuIFNob3cgc3VtbWFyeSBzdGF0aXN0aWNzIG9mIHRoZSByZXNwb25zZSB2YXJpYWJsZSBhbmQgcHJlZGljdG9yIHZhcmlhYmxlLioqCgpUaGUgc3VtbWFyeSBzdGF0aXN0aWNzIG9mIHZhcmlhYmxlIFBlcmNlbnRfb2ZfQ2xhc3Nlc19VbmRlcl8yMCAoWCB2YXJpYWJsZSkgaXMgZGlzcGxheWVkIGJlbG93IC0gdGhlIHByZWRpY3RvciB2YXJpYWJsZSAocGVyY2VudF9vZl9jbGFzc2VzX3VuZGVyXzIwKSBoYXMgYSBtZWRpYW4gb2YgNTkuNSBhbmQgYSBtZWFuIG9mIDU1LjczLiBTdGFuZGFyZCBEZXZpYXRpb24gaXMgMTMuMTkuIE1pbmltdW0gdmFsdWUgaXMgMjkgYW5kIHRoZSBtYXhpbXVtIHZhbHVlIGlzIDc3LgoKYGBge3Igc3VtbWFyeSBzdGF0aXN0aWNzIHN1bW1hcnkgeH0Kc3VtbWFyeShwZXJjZW50X29mX2NsYXNzZXNfdW5kZXJfMjApCnNkKHBlcmNlbnRfb2ZfY2xhc3Nlc191bmRlcl8yMCkKYGBgCgpUaGUgc3VtbWFyeSBzdGF0aXN0aWNzIG9mIHZhcmlhYmxlIEFsdW1uaV9HaXZpbmdfUmF0ZSAoWSB2YXJpYWJsZSkgaXMgZGlzcGxheWVkIGJlbG93IC0gdGhlIHJlc3BvbnNlIHZhcmlhYmxlIChhbHVtbmlfZ2l2aW5nX3JhdGUpIGhhcyBhIG1lZGlhbiBvZiAyOSBhbmQgYSBtZWFuIG9mIDI5LjI3LiBTdGFuZGFyZCBkZXZpYXRpb24gb2YgMTMuNDQuIFRoZSBtaW5pbXVtIHZhbHVlIGlzIDcgYW5kIHRoZSBtYXhpbXVtIHZhbHVlIGlzIDY3LgoKYGBge3Igc3VtbWFyeSB5fQpzdW1tYXJ5KGFsdW1uaV9naXZpbmdfcmF0ZSkKc2QoYWx1bW5pX2dpdmluZ19yYXRlKQpgYGAKCioqYikgV2hhdCBpcyB0aGUgbmF0dXJlIG9mIHRoZSB2YXJpYWJsZXMgWCBhbmQgWT8gQXJlIHRoZXJlIOKAnG91dGxpZXJz4oCdIGluIHRoZSBkYXRhOyBob3cgbWlnaHQgeW91IGRlZmluZSBhbiBvdXRsaWVyIGluIHRoaXMgY2FzZT8gV2hhdCBpcyB0aGUgY29ycmVsYXRpb24gY29lZmZpY2llbnQ/IERyYXcgYSBzY2F0dGVyIHBsb3QuIEFueSBtYWpvciBjb21tZW50cyBhYm91dCB0aGUgZGF0YT8qKgoKYGBge3IgY29ycmVsYXRpb24gYmV0d2VlbiB4IGFuZCB5fQpjb3IudGVzdChwZXJjZW50X29mX2NsYXNzZXNfdW5kZXJfMjAsIGFsdW1uaV9naXZpbmdfcmF0ZSkKYGBgCgpCYXNlZCBvbiB0aGUgUGVhcnNvbidzIGNvcnJlbGF0aW9uIHRlc3QsIHdlIGNhbiBzZWUgdGhhdCBYIGFuZCBZIGhhcyBhIHBvc2l0aXZlIGxpbmVyIGNvcnJlbGF0aW9uLiBUaGUgY29ycmVsYXRpb24gdmFsdWUgaXMgYWJvdXQgMC42NDU3LiBBbHNvIHRoZSBwLXZhbHVlIGlzIGxlc3MgdGhhbiB0aGUgdHlwZSAxIGVycm9yIHRocmVzaG9sZCBvZiAwLjA1LCBzbyB3ZSBjYW4gc2VlIHRoYXQgWCBhbmQgWSBhcmUgc3Ryb25nbHkgYXNzb2NpYXRlZC4KCmBgYHtyIGZpZzEsIGZpZy53aWR0aD02LCBmaWcuaGVpZ2h0PTQsIGZpZy5hbGlnbj0nY2VudGVyJ30KZ2dwbG90KGFsdW1uaSwgYWVzKHBlcmNlbnRfb2ZfY2xhc3Nlc191bmRlcl8yMCwgYWx1bW5pX2dpdmluZ19yYXRlKSkgKwogIGdlb21fcG9pbnQoKSArCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIikgKwogIGxhYnModGl0bGUgPSAiQ29ycmVsYXRpb24gYmV0d2VlbiBQZXJjZW50IG9mIENsYXNzIFVuZGVyIDIwIGFuZCBHaXZpbmcgUmF0ZSIsCiAgICAgICAgeCA9ICJQZXJjZW50IG9mIENsYXNzIFVuZGVyIDIwIiwKICAgICAgICB5ID0gIkFsdW1uaSBHaXZpbmcgUmF0ZSIpCmBgYAoKRnJvbSB0aGUgZ3JhcGhpYyBhYm92ZSwgSSB1c2VkIGEgc2NhdHRlciBwb2ludCBhbmQgYSBsaW5lYXIgbW9kZWwgdG8gaWRlbnRpZnkgaWYgdGhlcmUgYXJlIG91dGxpZXJzLiB3ZSBjYW4gc2VlIHRoYXQgdGhlcmUgYXJlIG91dGxpZXJzIGluIHRoaXMgZGF0YS4gSSB3b3VsZCBpZGVudGlmeSB0aGUgb3V0bGllcnMgYXMgcG9pbnRzIHRoYXQgYXJlIHN0cm9uZ2x5IGRldmlhdGVkIGF3YXkgZnJvbSB0aGUgdHJlbmQgbGluZS4KCioqYykgRml0IGEgc2ltcGxlIGxpbmVhciByZWdyZXNzaW9uIHRvIHRoZSBkYXRhLiBXaGF0IGlzIHlvdXIgZXN0aW1hdGVkIHJlZ3Jlc3Npb24gZXF1YXRpb24/KioKClRvIGZpdCBhIHNpbXBsZSBsaW5lYXIgcmVncmVzc2lvbiwgd2Ugd2lsbCBuZWVkICRcYmV0YV8wJCBhbmQgJFxiZXRhXzEkIGFzIHRoZSBTaW1wbGUgTGluZWFyIFJlZ3Jlc3Npb24gaXMgJFkkID0gJFxiZXRhXzAkICsgJFxiZXRhXzEkJFgkICsgJFxlcHNpbG9uJC4KClRvIGZpbmQgJFxiZXRhXzAkIGFuZCAkXGJldGFfMSQsIEkgd2lsbCB1c2UgdGhlIGBsbSgpYCBpbiBSLgpgYGB7ciBsaW5lYXIgbW9kZWwgMX0KZml0IDwtIGxtKGFsdW1uaV9naXZpbmdfcmF0ZSB+IHBlcmNlbnRfb2ZfY2xhc3Nlc191bmRlcl8yMCwgZGF0YSA9IGFsdW1uaSkKc3VtbWFyeShmaXQpCmBgYApXZSBjYW4gc2VlIHRoYXQgdGhlIGludGVyY2VwdCAkXGJldGFfMCQgaXMgMzcuMTc4NiBhbmQgdGhlIHNsb3BlICRcYmV0YV8xJCBpcyAwLjYzMzguIFNvIHRoZSBlc3RpbWF0ZWQgcmVncmVzc2lvbiBlcXVhdGlvbiBjb3VsZCBiZSAkXGhhdHtZfSQgPSAtNy4zODYxICsgMC42NiRYJAoKKipkKSBJbnRlcnByZXQgeW91ciByZXN1bHRzIChlLmcuLCBob3cgd291bGQgeW91IGludGVycHJldCB0aGUgc2xvcGUgaW4gdGhpcyBhcHBsaWNhdGlvbj8pLioqCgpUaGVyZSBpcyBhIHBvc2l0aXZlIGxpbmVhciByZWxhdGlvbnNoaXAgYmV0d2VlbiB0aGUgdHdvIHZhcmlhYmxlcy4gVGhlIGF2ZXJhZ2UgZ2l2aW5nIHJhdGUgd2lsbCBpbmNyZWFzZSBieSBhbiBlc3RpbWF0ZWQgMC42MzM4IHBlcmNlbnQgZm9yIGV2ZXJ5IHBlcmNlbnRhZ2UgaW5jcmVhc2Ugb24gdGhlIFBlcmNlbnQgb2YgQ2xhc3MgVW5kZXIgMjAuCgojIyMgUXVlc3Rpb24gMjogQSBTaW11bGF0aW9uIFN0dWR5IChTaW1wbGUgTGluZWFyIFJlZ3Jlc3Npb24pLiBBc3N1bWluZyB0aGUgbWVhbiByZXNwb25zZSBpcyBFKFl8WCk9MTArNVg6CgoqKmEpIEdlbmVyYXRlIGRhdGEgd2l0aCBY4oi8TijOvD0yLM+DPTAuMSksIHNhbXBsZSBzaXplIG49MTAwLCBhbmQgZXJyb3IgdGVybSDPteKIvE4ozrw9MCzPgz0wLjUpLiAKCmBgYHtyIGdlbmVyYXRlIGRhdGFzZXR9CnNldC5zZWVkKDcwNTIpCnggPC0gcm5vcm0oMTAwLCBtZWFuID0gMiwgc2QgPSAwLjEpCmVycm9yIDwtIHJub3JtKDEwMCwgbWVhbiA9IDAsIHNkID0gMC41KQp5IDwtIDEwICsgNSAqIHggKyBlcnJvcgpkYXRhIDwtIGRhdGEuZnJhbWUoeCwgeSkKaGVhZChkYXRhKQpgYGAKCioqYikgU2hvdyBzdW1tYXJ5IHN0YXRpc3RpY3Mgb2YgdGhlIHJlc3BvbnNlIHZhcmlhYmxlIGFuZCBwcmVkaWN0b3IgdmFyaWFibGUuIEFyZSB0aGVyZSBvdXRsaWVycz8gV2hhdCBpcyB0aGUgY29ycmVsYXRpb24gY29lZmZpY2llbnQ/IERyYXcgYSBzY2F0dGVyIHBsb3QuKioKCkJlbG93IGFyZSB0aGUgc3VtbWFyeSBzdGF0aXN0aWNzIG9mIHJlc3BvbnNlIHZhcmlhYmxlIHkgYW5kIHByZWRpY3RvciB2YXJpYWJsZSB4LgoKYGBge3Igc3VtbWFyeSBvZiB0aGUgZGF0YX0Kc3VtbWFyeShkYXRhKQpgYGAKCmBgYHtyIHBsb3QgdGhlIGRhdGFzZXQgdXNpbmcgZ2dwbG90LCBvdXQud2lkdGg9JzY1JScsIGZpZy5hbGlnbj0iY2VudGVyIn0KZ2dwbG90KGRhdGEsIGFlcyh4LCB5KSkgKwogIGdlb21fcG9pbnQoKSArCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIikgCmBgYAoKRnJvbSB0aGUgZ3JhcGggYWJvdmUsIHdlIGNhbiBzZWUgdGhlcmUgYXJlIGEgZmV3IG91dGxpZXJzLCBzb21lIHBvaW50cyBhcmUgZmFyIGF3YXkgZnJvbSB0aGUgdHJlbmQgbGluZS4KCmBgYHtyIGNvcnJlbGF0aW9uIGJldHdlZW4geCBhbmQgeSBpbiBkYXRhfQpjb3IoeCwgeSwgbWV0aG9kID0gInBlYXJzb24iKQpgYGAKClRoZSBjb3JyZWxhdGlvbiBjb2VmZmljaWVudCBpcyAwLjgwNDIuCgoqKmMpIEZpdCBhIHNpbXBsZSBsaW5lYXIgcmVncmVzc2lvbi4gV2hhdCBpcyB0aGUgZXN0aW1hdGVkIG1vZGVsPyBSZXBvcnQgdGhlIGVzdGltYXRlZCBjb2VmZmljaWVudHMuIFdoYXQgaXMgdGhlIG1vZGVsIG1lYW4gc3F1YXJlZCBlcnJvciAoTVNFKT8qKgoKVGhlIGZpdHRlZCBTTFIgbW9kZWwgYW5kIGNvZWZmaWNpZW50cyBhcmUgYmVsb3cuIFRoZSBjb2VmZmljaWVudHMgaW50ZXJjZXB0IGlzIDkuMDIyLCBhbmQgdGhlIHNsb3BlIGlzIDUuNTY1LgoKYGBge3IgbGluZWFyIHJlZ3Jlc3Npb24gZm9yIGRhdGF9CmZpdDIgPC0gbG0oIHkgfiB4LCBkYXRhKQpwcmludChmaXQyKQpjb2VmKGZpdDIpCmBgYAoKYGBge3IgTVNFIG9mIGRhdGF9CnNpZ21hKGZpdDIpXjIKYGBgCgpUaGUgTVNFIGlzIDAuMjAzLgoKKipkKSBXaGF0IGlzIHRoZSBzYW1wbGUgbWVhbiBvZiBib3RoIFggYW5kIFk/IFBsb3QgdGhlIGZpdHRlZCByZWdyZXNzaW9uIGxpbmUgYW5kIHRoZSBwb2ludCAkKFxiYXJ7WH0sIFxiYXJ7WX0pJC4gV2hhdCBkbyB5b3UgZmluZD8qKgoKYGBge3J9CnN1bW1hcnkoZGF0YSkKYGBgCgpGcm9tIHRoZSBzdW1tYXJ5IHN0YXRpc3RpY3MsIHdlIGNhbiBzZWUgdGhlIHNhbXBsZSBtZWFuIG9mIFggaXMgMi4wMDQsIGFuZCB0aGUgc2FtcGxlIG1lYW4gZm9yIFkgaXMgMjAuMTcuCgpgYGB7ciBhYmxpbmUgZGF0YSwgb3V0LndpZHRoPSc2NSUnLCBmaWcuYWxpZ249ImNlbnRlciJ9CnBsb3QoeCwgeSwgcGNoID0gMTkpCmFibGluZShmaXQyLCBjb2wgPSAiZGFya29yYW5nZSIsIGx3ZCA9IDIpCnhiYXIgPC0gbWVhbihkYXRhJHgpCnliYXIgPC0gbWVhbihkYXRhJHkpCnBvaW50cyh4YmFyLCB5YmFyLCBwY2ggPSAxOSwgY29sID0gImJsdWUiLCBjZXggPSAxLjUpCnRleHQoeGJhciwgeWJhciwgbGFiZWwgPSBleHByZXNzaW9uKHBhc3RlKCIoIiwgeGJhciwgIiwiLCB5YmFyLCAiKSIpKSwgcG9zID0gNCwgY29sID0gImJsdWUiKQpgYGAKCkZyb20gdGhlIGdyYXBoIGFib3ZlLCB3ZSBjYW4gZmluZCB0aGF0IHRoZSBMUyByZWdyZXNzaW9uIGxpbmUgcGFzc2VzIHRocm91Z2ggdGhlIHBvaW50ICh4YmFyLCB5YmFyKS4KCiMjIyBRdWVzdGlvbiAzLiBPcmRpbmFyeSBsZWFzdCBzcXVhcmVzIChPTFMpIGlzIHR5cGljYWxseSB1c2VkIHRvIGVzdGltYXRlIHRoZSByZWdyZXNzaW9uIGNvZWZmaWNpZW50cyDOsl8wIGFuZCDOsl8xIGluIHRoZSBzaW1wbGUgbGluZWFyIHJlZ3Jlc3Npb24gbW9kZWwgYnkgbWluaW1pemluZyB0aGUgcmVzaWR1YWwgc3VtIG9mIHNxdWFyZXMgKFJTUykKCioqYSkgCUhvdyBhYm91dCBtaW5pbWl6aW5nICRcc3VtX3tpPTF9Xm4gKFlfaSAtIFxiZXRhXzAgLSBcYmV0YV8xIFhfaSkgPSBcc3VtX3tpLTF9Xm4gXGVwc2lsb25faSQqKgoKTWluaW1pemluZyB0aGUgc3VtIG9mIHJlc2lkdWFscyBkb2Vzbid0IHdvcmsgd2VsbCBmb3IgcmVncmVzc2lvbiBiZWNhdXNlIHRoZSByZXNpZHVhbHMgY2FuIGNhbmNlbCBlYWNoIG90aGVyIG91dC4gRm9yIGV4YW1wbGUsIHdoZW4gb25lIG9mIHRoZSByZXNpZHVhbHMgaXMgcG9zaXRpdmUgYW5kIGFub3RoZXIgb25lIGlzIHBvc2l0aXZlLCBpdCBjYW4gY2FuY2VsIGVhY2ggb3RoZXIgb3V0LgoKKipiKSAJSG93IGFib3V0IG1pbmltaXppbmcgJFxzdW1fe2k9MX1ebiB8WV9pIC0gXGJldGFfMCAtIFxiZXRhXzEgWF9pfCA9IFxzdW1fe2ktMX1ebiB8XGVwc2lsb25faXwkKioKCldoaWxlIGl0IGlzIGFuIGFsdGVybmF0aXZlIHRvIE9MUywgaXQncyBub3QgcmVjb21tZW5kZWQgYmVjYXVzZSBpdCBsZWFkcyB0byBub24tZGlmZmVyZW50aWFibGUgb2JqZWN0aXZlIGZ1bmN0aW9ucyBhbmQgbWFrZXMgdGhlIG9wdGltaXphdGlvbiBwcm9jZXNzIG1vcmUgY29tcGxleC4KCioqYykgCVdoeSBpcyBPTFMgYSBwb3B1bGFyIGNob2ljZSBmb3IgZXN0aW1hdGluZyAkXGJldGFfMCQgYW5kICRcYmV0YV8xJD8qKgoKVGhlIHJlYXNvbiB0byB1c2UgdGhlIE9MUyBmb3IgZXN0aW1hdGluZyAkXGJldGFfMCQgYW5kICRcYmV0YV8xJCBpcyB0aGF0IGl0J3MgdGhlIGJlc3QgdW5iaWFzZWQgbGluZWFyIGVzdGltYXRvciwgd2UgYWxzbyBjYWxsIGl0IEJMVUUuCgojIyMgUXVlc3Rpb24gNDogRXN0YWJsaXNoIHRoZSBmb2xsb3dpbmcgcmVsYXRpb25zaGlwcyBmb3IgdGhlIHNpbXBsZSBsaW5lYXIgcmVncmVzc2lvbiBtb2RlbC4gCgoqKmEpIAlUaGUgZml0dGVkIGxpbmUgcGFzc2VzIHRocm91Z2ggdGhlIHBvaW50ICQoXGJhcntYfSxcYmFye1l9KSQqKgoKc3Vic3RpdHVkZSAkWCA9IFxiYXJ7WH0kIHRvIHRoZSBmaXR0ZWQgcmVncmVzc2lvbiBsaW5lOiAkXGhhdHtZX2l9ID0gXGhhdHtcYmV0YV8wfSArIFxoYXR7XGJldGFfMX0gWF9pJC4KCiRcaGF0e1l9ID0gXGhhdHtcYmV0YV8wfSArIFxoYXR7XGJldGFfMX0gWCA9IFxoYXR7XGJldGFfMH0gKyBcaGF0e1xiZXRhXzF9IFxiYXJfe1h9CgokXGhhdHtZfSA9IFxiYXJ7WX0kCgoqKmIpICRcc3VtX3tpPTF9Xm4gZV9pID0gMCQgKioKCkZpdHRlZCByZWdyZXNzaW9uIGxpbmU6ICRcaGF0e1lfaX0gPSBcaGF0e1xiZXRhXzB9ICsgXGhhdHtcYmV0YV8xfSBYX2kkCgplYWNoIHBvaW50IGkgaXM6ICRlX2kgPSBZX2kgLSBcaGF0e1lfaX0gPSBZX2kgLSAoXGhhdHtcYmV0YV8wfSArIFxoYXR7XGJldGFfMX0gWF9pKSQKCnRvIHNob3cgaWYgdGhlIHN1bSBvZiAkZV9pJCBpcyB6ZXJvLCBzdWJzdGl0dXRlIHRoZSBleHByZXNzaW9uIGZvciAkXGhhdHtZX2l9JAoKJFxzdW1fe2k9MX1ebiBlX2kgPSBcc3VtX3tpPTF9Xm4gWV9pIC0gbiBcaGF0e1xiZXRhXzB9IC0gXGhhdHtcYmV0YV8xfSBuIFxiYXJ7WH0kCiRcaGF0e1xiZXRhXzB9ID0gXGJhcntZfSAtIFxoYXR7XGJldGFfMX0gXGJhcntYfSQKCnNvOiAkXHN1bV97aT0xfV5uIGVfaSA9biBcYmFye1l9IC0gbiBcYmFye1l9ICsgXGhhdHtcYmV0YV8xfSBuIFxiYXJ7WH0gLSBcaGF0e1xiZXRhXzF9IG4gXGJhcntYfSA9IDAkCgoqKmMpICRcc3VtX3tpPTF9Xm4gWV9pID0gXHN1bV97aT0xfV5uIFxoYXR7WV9pfSQqKgoKRml0dGVkIHJlZ3Jlc3Npb24gbGluZTogJFxoYXR7WV9pfSA9IFxoYXR7XGJldGFfMH0gKyBcaGF0e1xiZXRhXzF9IFhfaSQKCiRcc3VtX3tpPTF9Xm4gWV9pID0gXHN1bV97aT0xfV5uIChcaGF0e1xiZXRhXzB9ICsgXGhhdHtcYmV0YV8xfSBYK2kpID0gXGhhdHtcYmV0YV8wfSBcc3VtX3tpPTF9Xm4gMSArIFxoYXR7XGJldGFfMX0gXHN1bV97aT0xfV5uIFhfaSQKCiRcc3VtX3tpPTF9Xm4gWV9pID0gbiBcaGF0e1xiZXRhXzB9ICsgXGhhdHtcYmV0YV8xfSBuIFxiYXJ7WH0kCgokXGhhdHtcYmV0YV8wfSA9IFxiYXJ7WX0gLSBcaGF0e1xiZXRhXzF9IFxiYXJ7WH0kCgokXHN1bV97aT0xfV5uIFlfaSA9IG4gXGJhcntZfSAtIFxoYXR7XGJldGFfMX0gbiBcYmFye1h9ICsgXGhhdHtcYmV0YV8xfSBuIFxiYXJ7WH0gPSBuIFxiYXJ7WX0kCgpzaW5jZSAkXGJhcntZfSQgaXMgdGhlIG1lYW4gb2YgdGhlIG9ic2VydmVkICRZX2kkIHZhbHVlcywgc286CgokXHN1bV97aT0xfV5uIFlfaSA9IG4gXGJhcntZfSA9IFxzdW1fe2k9MX1ebiBcYmFye1lfaX0kCgoKKipkKSAkXHN1bV97aT0xfV5uIFhfaSBlX2kgPSAwJCoqCgpXZSBhbHJlYWR5IGFwcHJvdmVkIHRoYXQgJFxzdW1fe2k9MX1ebiBlX2kgPSAwJC4KCiRcc3VtX3tpPTF9Xm4gWF9pIGVfaSA9IFhfaSBcc3VtX3tpPTF9Xm4gZV9pID0gWF9pICogMCA9IDAkCgoqKmUpICRcc3VtX3tpPTF9Xm4gXGhhdHtZX2l9IGVfaSA9IDAkKioKCldlIGFscmVhZHkgYXBwcm92ZWQgdGhhdCAkXHN1bV97aT0xfV5uIGVfaSA9IDAkLgokXHN1bV97aT0xfV5uIFlfaSBlX2kgPSBZX2kgXHN1bV97aT0xfV5uIGVfaSA9IFlfaSAqIDAgPSAwJAoKKipmKSAkXHN1bV97aT0xfV5uIGVfaV4yJCBpcyBtaW5pbWl6ZWQqKgoKVGhlIHJlZ3Jlc3Npb24gbGluZSBpcyB0aGUgYmVzdCBsaW5lYXIgYXBwcm94aW1hdGlvbiBvZiB0aGUgZGF0YSwgdGhlIGxlYXN0IHNxdWFyZXMgYXBwcm9hY2ggcHJvdmlkZXMgdGhlIGJlc3QgbGluZWFyIHVuYmlhc2VkIGVzdGltYXRvcnMgdW5kZXIgdGhlIGFzc3VtcHRpb24gb2YgdGhlIGxpbmVhciByZWdyZXNzaW9uIG1vZGVsLgoKCgoKCgo=