The primary difference between an ANOVA (Analysis of Variance) and a
t-test lies in the number of groups or categories being compared for
their means.
- t-test:
- Purpose: A t-test is used to compare the means of
two groups to see if they are significantly different from each
other.
- Types:
- Independent t-test (two-sample t-test): Compares
the means of two independent groups (e.g., men vs. women, treatment
vs. control).
- Paired t-test: Compares means from the same group
at different times (before and after a treatment, for example).
- Assumptions: Normal distribution of the data,
homogeneity of variances (for independent t-tests), and independent
observations.
- Limitation: Only suitable for comparing two groups
or conditions.
- ANOVA:
- Purpose: ANOVA is used when you want to compare the
means of three or more groups. It tests the overall significance of the
differences among group means.
- Types:
- One-way ANOVA: Compares the means of three or more
independent groups based on one independent variable (e.g., comparing
the test scores of students from different schools).
- Two-way ANOVA (or higher): Can handle two or more
independent variables (factors) and their interactions (e.g., comparing
test scores by school and by gender).
- Assumptions: Similar to the t-test, including the
assumption of normality, homogeneity of variances, and independent
observations.
- Limitation: While it can tell you that there is a
significant difference among groups, it doesn’t specify which specific
groups differ. Post-hoc tests are often needed for this.
Key Differences:
- Number of Groups: t-test is for comparing two
groups, while ANOVA is for three or more groups.
- Type of Comparison:
- t-test: Direct comparison between two groups.
- ANOVA: Tests for overall significance across multiple groups but
requires post-hoc tests for specific group comparisons.
- Usage Context: t-tests are simpler and more
straightforward when only two groups are involved. ANOVA is necessary
when dealing with more than two groups to avoid an inflated Type I error
rate that would occur with multiple t-tests.
Both tests are crucial tools in statistical analysis for determining
whether observed differences in data are significant or could have
occurred by chance.
ANOVA, or Analysis of Variance, is a statistical method used to
analyze the differences among group means in a sample. The
ANOVA test is particularly useful when you want to compare the means
of three or more groups. It helps to determine if there are any
statistically significant differences between the means of independent
(or sometimes related) groups.
Here’s a basic outline of when and how to use an ANOVA test:
When to Use ANOVA:
When you are comparing the means of three or more independent groups.
When the data is normally distributed (though ANOVA is robust to slight
deviations from this assumption). When the variances of populations are
equal (homogeneity of variance). When the observations are independent
of each other. How to Perform ANOVA in R:
Use a dataset: For this example, let’s use R’s built-in mtcars
dataset. Formulate a hypothesis: Null hypothesis (H0) states that there
are no differences among group means. The alternative hypothesis (H1)
states that at least one group mean is different. Conduct the ANOVA test
using R functions. Let’s go through an R code example. We’ll use the
mtcars dataset and compare the means of miles per gallon (mpg) across
different numbers of gears (gear).
?mtcars :The data was extracted from the 1974 Motor Trend US
magazine, and comprises fuel consumption and 10 aspects of automobile
design and performance for 32 automobiles (1973–74 models).
print(tukey_result)
Tukey multiple comparisons of means
95% family-wise confidence level
Fit: aov(formula = mpg ~ factor(gear), data = mtcars)
$`factor(gear)`
diff lwr upr p adj
4-3 8.426667 3.9234704 12.929863 0.0002088
5-3 5.273333 -0.7309284 11.277595 0.0937176
5-4 -3.153333 -9.3423846 3.035718 0.4295874
The output of the Tukey HSD (Honest Significant Difference) test
provides detailed comparisons between the means of different gear groups
(3, 4, and 5 gears) in the mtcars dataset. Here’s how to
interpret this output:
- Comparisons:
4-3: This compares cars with 4 gears to those with 3
gears.
5-3: This compares cars with 5 gears to those with 3
gears.
5-4: This compares cars with 5 gears to those with 4
gears.
- Difference in Means (diff):
- For
4-3: The mean mpg for cars with 4 gears is 8.426667
units higher than for cars with 3 gears.
- For
5-3: The mean mpg for cars with 5 gears is 5.273333
units higher than for cars with 3 gears.
- For
5-4: The mean mpg for cars with 5 gears is 3.153333
units lower than for cars with 4 gears.
- Lower and Upper Bounds (lwr, upr):
- These columns provide the lower and upper bounds of the 95%
confidence intervals for the mean differences. For instance, for the
4-3 comparison, the true mean difference is estimated to be
between 3.9234704 and 12.929863 units with 95% confidence.
- Adjusted P-value (p adj):
- For
4-3: The p-value is 0.0002088, which is less than
0.05, indicating that the difference in means between cars with 4 and 3
gears is statistically significant.
- For
5-3: The p-value is 0.0937176, which is greater
than 0.05, suggesting that the difference in means between cars with 5
and 3 gears is not statistically significant at the 5% level.
- For
5-4: The p-value is 0.4295874, also greater than
0.05, indicating no statistically significant difference in means
between cars with 5 and 4 gears.
Conclusion:
- There is a statistically significant difference in miles per gallon
between cars with 4 gears and those with 3 gears, with 4-gear cars
having higher mpg on average.
- The differences in mpg between cars with 5 gears compared to those
with 3 gears, and between cars with 5 gears compared to those with 4
gears, are not statistically significant at the 5% level.
This analysis provides a deeper understanding of how the number of
gears in a car affects its fuel efficiency (mpg), with a specific focus
on pairwise group comparisons.
Using ANOVA to compare two regression models is a method for
assessing whether there is a significant difference in the fit of the
models. This approach is often used when you have nested models – one
model is a simpler version of the other (i.e., it has fewer
predictors).
Why Use ANOVA for Comparing Regression Models?
Test for Improvement: It tests whether adding
more predictors (variables) to a model significantly improves the
model’s ability to explain the variability in the response
variable.
Model Selection: Helps in deciding between a
simpler model with fewer variables and a more complex one with more
variables.
When to Use ANOVA for Comparing Regression Models?
Nested Models: Applicable when you have two
nested models - one is a special case of the other. For example, Model 1
might include predictors X1, X2, and X3, while Model 2 includes X1 and
X2 only.
Same Response Variable: Both models must be
trying to predict the same response variable.
Linear Models: Typically used for comparing
linear regression models.
R Code Example
Suppose you have a dataset with a response variable Y
and three predictors X1, X2, X3.
You want to compare a model that only includes X1 and
X2 with a model that includes all three predictors.
# Fit the first model (simpler model)
model1 <- lm(Y ~ X1 + X2, data = your_data)
# Fit the second model (more complex model)
model2 <- lm(Y ~ X1 + X2 + X3, data = your_data)
# Compare models using ANOVA
anova_result <- anova(model1, model2)
# Print the results
print(anova_result)
In this R code, lm() is used to fit linear models, and
anova() is used to compare them. The output will tell you
whether adding X3 to the model significantly improves the
fit of the model.
Important Considerations
Model Interpretability: Even if the more complex
model is statistically better, consider whether the added complexity is
justified in terms of interpretability and practical
application.
Overfitting: Adding more predictors can lead to
overfitting, especially with small datasets. Ensure that the model
complexity is appropriate for the size and nature of your data.
Assumptions: As with any statistical method,
ensure that the assumptions underlying linear regression (such as
linearity, homoscedasticity, independence, and normality of residuals)
are reasonably met.
Overfitting is a common problem in statistical modeling and machine
learning, and it occurs when a model is too complex and starts to
capture the noise in the data rather than just the true underlying
patterns. To explain it simply:
Modeling the Details and Noise: Imagine you’re
trying to draw a line through a set of points on a graph. If you use a
straight line, it might not pass exactly through all the points, but it
gives a good general trend. This is like a simple model. Now, if you
start adding curves to your line so it passes through every single point
perfectly, you’re not just capturing the overall trend anymore, but also
the random variations and noise. This curvy line is like an overfitted
model.
Memorizing vs. Learning: Consider a student who
memorizes facts for an exam without understanding the concepts. They
might do well on that specific test (the data they trained on), but fail
to apply the knowledge to new questions or a different exam (new, unseen
data). Overfitting is similar: the model performs really well on the
training data but fails to generalize to new, unseen data.
Lack of Flexibility: Overfitting is like having
a tool that works perfectly for one specific task but is useless for
anything slightly different. A good model, like a versatile tool, should
perform well across a range of situations, not just the one it was
specifically designed for.
Complexity: A more complex model isn’t always a
better model. If it has too many parameters or is too tailored to the
training data, it can lose its ability to be effective with new data.
It’s like a chef who only knows a very complicated recipe but struggles
to cook a simple dish.
In summary, overfitting is creating a model that’s too tailored to
the specific details and noise of the training data, losing its ability
to perform well on new, unseen data. It’s about finding the right
balance between simplicity and complexity in your model.
LS0tDQp0aXRsZTogImFub3ZhIGlzIGZvciBkaWZmcmVuY2UgaW4gbWVhbiINCm91dHB1dDogaHRtbF9ub3RlYm9vaw0KLS0tDQpUaGUgcHJpbWFyeSBkaWZmZXJlbmNlIGJldHdlZW4gYW4gQU5PVkEgKEFuYWx5c2lzIG9mIFZhcmlhbmNlKSBhbmQgYSB0LXRlc3QgbGllcyBpbiB0aGUgbnVtYmVyIG9mIGdyb3VwcyBvciBjYXRlZ29yaWVzIGJlaW5nIGNvbXBhcmVkIGZvciB0aGVpciBtZWFucy4NCg0KMS4gKip0LXRlc3QqKjoNCiAgIC0gKipQdXJwb3NlKio6IEEgdC10ZXN0IGlzIHVzZWQgdG8gY29tcGFyZSB0aGUgbWVhbnMgb2YgdHdvIGdyb3VwcyB0byBzZWUgaWYgdGhleSBhcmUgc2lnbmlmaWNhbnRseSBkaWZmZXJlbnQgZnJvbSBlYWNoIG90aGVyLg0KICAgLSAqKlR5cGVzKio6DQogICAgIC0gKipJbmRlcGVuZGVudCB0LXRlc3QgKHR3by1zYW1wbGUgdC10ZXN0KSoqOiBDb21wYXJlcyB0aGUgbWVhbnMgb2YgdHdvIGluZGVwZW5kZW50IGdyb3VwcyAoZS5nLiwgbWVuIHZzLiB3b21lbiwgdHJlYXRtZW50IHZzLiBjb250cm9sKS4NCiAgICAgLSAqKlBhaXJlZCB0LXRlc3QqKjogQ29tcGFyZXMgbWVhbnMgZnJvbSB0aGUgc2FtZSBncm91cCBhdCBkaWZmZXJlbnQgdGltZXMgKGJlZm9yZSBhbmQgYWZ0ZXIgYSB0cmVhdG1lbnQsIGZvciBleGFtcGxlKS4NCiAgIC0gKipBc3N1bXB0aW9ucyoqOiBOb3JtYWwgZGlzdHJpYnV0aW9uIG9mIHRoZSBkYXRhLCBob21vZ2VuZWl0eSBvZiB2YXJpYW5jZXMgKGZvciBpbmRlcGVuZGVudCB0LXRlc3RzKSwgYW5kIGluZGVwZW5kZW50IG9ic2VydmF0aW9ucy4NCiAgIC0gKipMaW1pdGF0aW9uKio6IE9ubHkgc3VpdGFibGUgZm9yIGNvbXBhcmluZyB0d28gZ3JvdXBzIG9yIGNvbmRpdGlvbnMuDQoNCjIuICoqQU5PVkEqKjoNCiAgIC0gKipQdXJwb3NlKio6IEFOT1ZBIGlzIHVzZWQgd2hlbiB5b3Ugd2FudCB0byBjb21wYXJlIHRoZSBtZWFucyBvZiB0aHJlZSBvciBtb3JlIGdyb3Vwcy4gSXQgdGVzdHMgdGhlIG92ZXJhbGwgc2lnbmlmaWNhbmNlIG9mIHRoZSBkaWZmZXJlbmNlcyBhbW9uZyBncm91cCBtZWFucy4NCiAgIC0gKipUeXBlcyoqOg0KICAgICAtICoqT25lLXdheSBBTk9WQSoqOiBDb21wYXJlcyB0aGUgbWVhbnMgb2YgdGhyZWUgb3IgbW9yZSBpbmRlcGVuZGVudCBncm91cHMgYmFzZWQgb24gb25lIGluZGVwZW5kZW50IHZhcmlhYmxlIChlLmcuLCBjb21wYXJpbmcgdGhlIHRlc3Qgc2NvcmVzIG9mIHN0dWRlbnRzIGZyb20gZGlmZmVyZW50IHNjaG9vbHMpLg0KICAgICAtICoqVHdvLXdheSBBTk9WQSoqIChvciBoaWdoZXIpOiBDYW4gaGFuZGxlIHR3byBvciBtb3JlIGluZGVwZW5kZW50IHZhcmlhYmxlcyAoZmFjdG9ycykgYW5kIHRoZWlyIGludGVyYWN0aW9ucyAoZS5nLiwgY29tcGFyaW5nIHRlc3Qgc2NvcmVzIGJ5IHNjaG9vbCBhbmQgYnkgZ2VuZGVyKS4NCiAgIC0gKipBc3N1bXB0aW9ucyoqOiBTaW1pbGFyIHRvIHRoZSB0LXRlc3QsIGluY2x1ZGluZyB0aGUgYXNzdW1wdGlvbiBvZiBub3JtYWxpdHksIGhvbW9nZW5laXR5IG9mIHZhcmlhbmNlcywgYW5kIGluZGVwZW5kZW50IG9ic2VydmF0aW9ucy4NCiAgIC0gKipMaW1pdGF0aW9uKio6IFdoaWxlIGl0IGNhbiB0ZWxsIHlvdSB0aGF0IHRoZXJlIGlzIGEgc2lnbmlmaWNhbnQgZGlmZmVyZW5jZSBhbW9uZyBncm91cHMsIGl0IGRvZXNuJ3Qgc3BlY2lmeSB3aGljaCBzcGVjaWZpYyBncm91cHMgZGlmZmVyLiBQb3N0LWhvYyB0ZXN0cyBhcmUgb2Z0ZW4gbmVlZGVkIGZvciB0aGlzLg0KDQojIyMgS2V5IERpZmZlcmVuY2VzOg0KDQotICoqTnVtYmVyIG9mIEdyb3VwcyoqOiB0LXRlc3QgaXMgZm9yIGNvbXBhcmluZyB0d28gZ3JvdXBzLCB3aGlsZSBBTk9WQSBpcyBmb3IgdGhyZWUgb3IgbW9yZSBncm91cHMuDQotICoqVHlwZSBvZiBDb21wYXJpc29uKio6DQogIC0gdC10ZXN0OiBEaXJlY3QgY29tcGFyaXNvbiBiZXR3ZWVuIHR3byBncm91cHMuDQogIC0gQU5PVkE6IFRlc3RzIGZvciBvdmVyYWxsIHNpZ25pZmljYW5jZSBhY3Jvc3MgbXVsdGlwbGUgZ3JvdXBzIGJ1dCByZXF1aXJlcyBwb3N0LWhvYyB0ZXN0cyBmb3Igc3BlY2lmaWMgZ3JvdXAgY29tcGFyaXNvbnMuDQotICoqVXNhZ2UgQ29udGV4dCoqOiB0LXRlc3RzIGFyZSBzaW1wbGVyIGFuZCBtb3JlIHN0cmFpZ2h0Zm9yd2FyZCB3aGVuIG9ubHkgdHdvIGdyb3VwcyBhcmUgaW52b2x2ZWQuIEFOT1ZBIGlzIG5lY2Vzc2FyeSB3aGVuIGRlYWxpbmcgd2l0aCBtb3JlIHRoYW4gdHdvIGdyb3VwcyB0byBhdm9pZCBhbiBpbmZsYXRlZCBUeXBlIEkgZXJyb3IgcmF0ZSB0aGF0IHdvdWxkIG9jY3VyIHdpdGggbXVsdGlwbGUgdC10ZXN0cy4NCg0KQm90aCB0ZXN0cyBhcmUgY3J1Y2lhbCB0b29scyBpbiBzdGF0aXN0aWNhbCBhbmFseXNpcyBmb3IgZGV0ZXJtaW5pbmcgd2hldGhlciBvYnNlcnZlZCBkaWZmZXJlbmNlcyBpbiBkYXRhIGFyZSBzaWduaWZpY2FudCBvciBjb3VsZCBoYXZlIG9jY3VycmVkIGJ5IGNoYW5jZS4NCg0KQU5PVkEsIG9yIEFuYWx5c2lzIG9mIFZhcmlhbmNlLCBpcyBhIHN0YXRpc3RpY2FsIG1ldGhvZCB1c2VkIHRvIGFuYWx5emUgdGhlICpkaWZmZXJlbmNlcyBhbW9uZyBncm91cCBtZWFucyBpbiBhIHNhbXBsZS4qIFRoZSBBTk9WQSB0ZXN0IGlzIHBhcnRpY3VsYXJseSB1c2VmdWwgd2hlbiB5b3Ugd2FudCB0byBjb21wYXJlIHRoZSBtZWFucyAqb2YgdGhyZWUgb3IgbW9yZSBncm91cHMuKiBJdCBoZWxwcyB0byBkZXRlcm1pbmUgaWYgdGhlcmUgYXJlIGFueSBzdGF0aXN0aWNhbGx5IHNpZ25pZmljYW50IGRpZmZlcmVuY2VzIGJldHdlZW4gdGhlIG1lYW5zIG9mIGluZGVwZW5kZW50IChvciBzb21ldGltZXMgcmVsYXRlZCkgZ3JvdXBzLg0KDQpIZXJlJ3MgYSBiYXNpYyBvdXRsaW5lIG9mIHdoZW4gYW5kIGhvdyB0byB1c2UgYW4gQU5PVkEgdGVzdDoNCg0KV2hlbiB0byBVc2UgQU5PVkE6DQoNCldoZW4geW91IGFyZSBjb21wYXJpbmcgdGhlIG1lYW5zIG9mIHRocmVlIG9yIG1vcmUgaW5kZXBlbmRlbnQgZ3JvdXBzLg0KV2hlbiB0aGUgZGF0YSBpcyBub3JtYWxseSBkaXN0cmlidXRlZCAodGhvdWdoIEFOT1ZBIGlzIHJvYnVzdCB0byBzbGlnaHQgZGV2aWF0aW9ucyBmcm9tIHRoaXMgYXNzdW1wdGlvbikuDQpXaGVuIHRoZSB2YXJpYW5jZXMgb2YgcG9wdWxhdGlvbnMgYXJlIGVxdWFsIChob21vZ2VuZWl0eSBvZiB2YXJpYW5jZSkuDQpXaGVuIHRoZSBvYnNlcnZhdGlvbnMgYXJlIGluZGVwZW5kZW50IG9mIGVhY2ggb3RoZXIuDQpIb3cgdG8gUGVyZm9ybSBBTk9WQSBpbiBSOg0KDQpVc2UgYSBkYXRhc2V0OiBGb3IgdGhpcyBleGFtcGxlLCBsZXQncyB1c2UgUidzIGJ1aWx0LWluIG10Y2FycyBkYXRhc2V0Lg0KRm9ybXVsYXRlIGEgaHlwb3RoZXNpczogTnVsbCBoeXBvdGhlc2lzIChIMCkgc3RhdGVzIHRoYXQgdGhlcmUgYXJlIG5vIGRpZmZlcmVuY2VzIGFtb25nIGdyb3VwIG1lYW5zLiBUaGUgYWx0ZXJuYXRpdmUgaHlwb3RoZXNpcyAoSDEpIHN0YXRlcyB0aGF0IGF0IGxlYXN0IG9uZSBncm91cCBtZWFuIGlzIGRpZmZlcmVudC4NCkNvbmR1Y3QgdGhlIEFOT1ZBIHRlc3QgdXNpbmcgUiBmdW5jdGlvbnMuDQpMZXQncyBnbyB0aHJvdWdoIGFuIFIgY29kZSBleGFtcGxlLiBXZSdsbCB1c2UgdGhlIG10Y2FycyBkYXRhc2V0IGFuZCBjb21wYXJlIHRoZSBtZWFucyBvZiBtaWxlcyBwZXIgZ2FsbG9uIChtcGcpIGFjcm9zcyBkaWZmZXJlbnQgbnVtYmVycyBvZiBnZWFycyAoZ2VhcikuDQoNCj9tdGNhcnMgOlRoZSBkYXRhIHdhcyBleHRyYWN0ZWQgZnJvbSB0aGUgMTk3NCBNb3RvciBUcmVuZCBVUyBtYWdhemluZSwgYW5kIGNvbXByaXNlcyBmdWVsIGNvbnN1bXB0aW9uIGFuZCAxMCBhc3BlY3RzIA0Kb2YgYXV0b21vYmlsZSBkZXNpZ24gYW5kIHBlcmZvcm1hbmNlIGZvciAzMiBhdXRvbW9iaWxlcyAoMTk3M+KAkzc0IG1vZGVscykuDQoNCmBgYHtyfQ0KZGF0YSgibXRjYXJzIikNCg0KIyBwZXJmb3JtIGFub3ZhDQphbm92X3Jlc3VsdCA8LSBhb3YobXBnIH4gZmFjdG9yKGdlYXIpLCBkYXRhID0gbXRjYXJzKQ0KDQpzdW1tYXJ5KGFub3ZfcmVzdWx0KQ0KDQojIHBlcmZvcm0gVHVrZXkNCg0KdHVrZXlfcmVzdWx0IDwtIFR1a2V5SFNEKGFub3ZfcmVzdWx0KQ0KDQpwcmludCh0dWtleV9yZXN1bHQpDQpgYGANClRoZSBvdXRwdXQgb2YgdGhlIFR1a2V5IEhTRCAoSG9uZXN0IFNpZ25pZmljYW50IERpZmZlcmVuY2UpIHRlc3QgcHJvdmlkZXMgZGV0YWlsZWQgY29tcGFyaXNvbnMgYmV0d2VlbiB0aGUgbWVhbnMgb2YgZGlmZmVyZW50IGdlYXIgZ3JvdXBzICgzLCA0LCBhbmQgNSBnZWFycykgaW4gdGhlIGBtdGNhcnNgIGRhdGFzZXQuIEhlcmUncyBob3cgdG8gaW50ZXJwcmV0IHRoaXMgb3V0cHV0Og0KDQoxLiAqKkNvbXBhcmlzb25zKio6DQogICAtIGA0LTNgOiBUaGlzIGNvbXBhcmVzIGNhcnMgd2l0aCA0IGdlYXJzIHRvIHRob3NlIHdpdGggMyBnZWFycy4NCiAgIC0gYDUtM2A6IFRoaXMgY29tcGFyZXMgY2FycyB3aXRoIDUgZ2VhcnMgdG8gdGhvc2Ugd2l0aCAzIGdlYXJzLg0KICAgLSBgNS00YDogVGhpcyBjb21wYXJlcyBjYXJzIHdpdGggNSBnZWFycyB0byB0aG9zZSB3aXRoIDQgZ2VhcnMuDQoNCjIuICoqRGlmZmVyZW5jZSBpbiBNZWFucyAoZGlmZikqKjoNCiAgIC0gRm9yIGA0LTNgOiBUaGUgbWVhbiBtcGcgZm9yIGNhcnMgd2l0aCA0IGdlYXJzIGlzIDguNDI2NjY3IHVuaXRzIGhpZ2hlciB0aGFuIGZvciBjYXJzIHdpdGggMyBnZWFycy4NCiAgIC0gRm9yIGA1LTNgOiBUaGUgbWVhbiBtcGcgZm9yIGNhcnMgd2l0aCA1IGdlYXJzIGlzIDUuMjczMzMzIHVuaXRzIGhpZ2hlciB0aGFuIGZvciBjYXJzIHdpdGggMyBnZWFycy4NCiAgIC0gRm9yIGA1LTRgOiBUaGUgbWVhbiBtcGcgZm9yIGNhcnMgd2l0aCA1IGdlYXJzIGlzIDMuMTUzMzMzIHVuaXRzIGxvd2VyIHRoYW4gZm9yIGNhcnMgd2l0aCA0IGdlYXJzLg0KDQozLiAqKkxvd2VyIGFuZCBVcHBlciBCb3VuZHMgKGx3ciwgdXByKSoqOg0KICAgLSBUaGVzZSBjb2x1bW5zIHByb3ZpZGUgdGhlIGxvd2VyIGFuZCB1cHBlciBib3VuZHMgb2YgdGhlIDk1JSBjb25maWRlbmNlIGludGVydmFscyBmb3IgdGhlIG1lYW4gZGlmZmVyZW5jZXMuIEZvciBpbnN0YW5jZSwgZm9yIHRoZSBgNC0zYCBjb21wYXJpc29uLCB0aGUgdHJ1ZSBtZWFuIGRpZmZlcmVuY2UgaXMgZXN0aW1hdGVkIHRvIGJlIGJldHdlZW4gMy45MjM0NzA0IGFuZCAxMi45Mjk4NjMgdW5pdHMgd2l0aCA5NSUgY29uZmlkZW5jZS4NCg0KNC4gKipBZGp1c3RlZCBQLXZhbHVlIChwIGFkaikqKjoNCiAgIC0gRm9yIGA0LTNgOiBUaGUgcC12YWx1ZSBpcyAwLjAwMDIwODgsIHdoaWNoIGlzIGxlc3MgdGhhbiAwLjA1LCBpbmRpY2F0aW5nIHRoYXQgdGhlIGRpZmZlcmVuY2UgaW4gbWVhbnMgYmV0d2VlbiBjYXJzIHdpdGggNCBhbmQgMyBnZWFycyBpcyBzdGF0aXN0aWNhbGx5IHNpZ25pZmljYW50Lg0KICAgLSBGb3IgYDUtM2A6IFRoZSBwLXZhbHVlIGlzIDAuMDkzNzE3Niwgd2hpY2ggaXMgZ3JlYXRlciB0aGFuIDAuMDUsIHN1Z2dlc3RpbmcgdGhhdCB0aGUgZGlmZmVyZW5jZSBpbiBtZWFucyBiZXR3ZWVuIGNhcnMgd2l0aCA1IGFuZCAzIGdlYXJzIGlzIG5vdCBzdGF0aXN0aWNhbGx5IHNpZ25pZmljYW50IGF0IHRoZSA1JSBsZXZlbC4NCiAgIC0gRm9yIGA1LTRgOiBUaGUgcC12YWx1ZSBpcyAwLjQyOTU4NzQsIGFsc28gZ3JlYXRlciB0aGFuIDAuMDUsIGluZGljYXRpbmcgbm8gc3RhdGlzdGljYWxseSBzaWduaWZpY2FudCBkaWZmZXJlbmNlIGluIG1lYW5zIGJldHdlZW4gY2FycyB3aXRoIDUgYW5kIDQgZ2VhcnMuDQoNCiMjIyBDb25jbHVzaW9uOg0KDQotIFRoZXJlIGlzIGEgc3RhdGlzdGljYWxseSBzaWduaWZpY2FudCBkaWZmZXJlbmNlIGluIG1pbGVzIHBlciBnYWxsb24gYmV0d2VlbiBjYXJzIHdpdGggNCBnZWFycyBhbmQgdGhvc2Ugd2l0aCAzIGdlYXJzLCB3aXRoIDQtZ2VhciBjYXJzIGhhdmluZyBoaWdoZXIgbXBnIG9uIGF2ZXJhZ2UuDQotIFRoZSBkaWZmZXJlbmNlcyBpbiBtcGcgYmV0d2VlbiBjYXJzIHdpdGggNSBnZWFycyBjb21wYXJlZCB0byB0aG9zZSB3aXRoIDMgZ2VhcnMsIGFuZCBiZXR3ZWVuIGNhcnMgd2l0aCA1IGdlYXJzIGNvbXBhcmVkIHRvIHRob3NlIHdpdGggNCBnZWFycywgYXJlIG5vdCBzdGF0aXN0aWNhbGx5IHNpZ25pZmljYW50IGF0IHRoZSA1JSBsZXZlbC4NCg0KVGhpcyBhbmFseXNpcyBwcm92aWRlcyBhIGRlZXBlciB1bmRlcnN0YW5kaW5nIG9mIGhvdyB0aGUgbnVtYmVyIG9mIGdlYXJzIGluIGEgY2FyIGFmZmVjdHMgaXRzIGZ1ZWwgZWZmaWNpZW5jeSAobXBnKSwgd2l0aCBhIHNwZWNpZmljIGZvY3VzIG9uIHBhaXJ3aXNlIGdyb3VwIGNvbXBhcmlzb25zLg0KDQoNClVzaW5nIEFOT1ZBIHRvIGNvbXBhcmUgdHdvIHJlZ3Jlc3Npb24gbW9kZWxzIGlzIGEgbWV0aG9kIGZvciBhc3Nlc3Npbmcgd2hldGhlciB0aGVyZSBpcyBhIHNpZ25pZmljYW50IGRpZmZlcmVuY2UgaW4gdGhlIGZpdCBvZiB0aGUgbW9kZWxzLiBUaGlzIGFwcHJvYWNoIGlzIG9mdGVuIHVzZWQgd2hlbiB5b3UgaGF2ZSBuZXN0ZWQgbW9kZWxzIOKAkyBvbmUgbW9kZWwgaXMgYSBzaW1wbGVyIHZlcnNpb24gb2YgdGhlIG90aGVyIChpLmUuLCBpdCBoYXMgZmV3ZXIgcHJlZGljdG9ycykuIA0KDQojIyMgV2h5IFVzZSBBTk9WQSBmb3IgQ29tcGFyaW5nIFJlZ3Jlc3Npb24gTW9kZWxzPw0KDQoxLiAqKlRlc3QgZm9yIEltcHJvdmVtZW50Kio6IEl0IHRlc3RzIHdoZXRoZXIgYWRkaW5nIG1vcmUgcHJlZGljdG9ycyAodmFyaWFibGVzKSB0byBhIG1vZGVsIHNpZ25pZmljYW50bHkgaW1wcm92ZXMgdGhlIG1vZGVsJ3MgYWJpbGl0eSB0byBleHBsYWluIHRoZSB2YXJpYWJpbGl0eSBpbiB0aGUgcmVzcG9uc2UgdmFyaWFibGUuDQoNCjIuICoqTW9kZWwgU2VsZWN0aW9uKio6IEhlbHBzIGluIGRlY2lkaW5nIGJldHdlZW4gYSBzaW1wbGVyIG1vZGVsIHdpdGggZmV3ZXIgdmFyaWFibGVzIGFuZCBhIG1vcmUgY29tcGxleCBvbmUgd2l0aCBtb3JlIHZhcmlhYmxlcy4NCg0KIyMjIFdoZW4gdG8gVXNlIEFOT1ZBIGZvciBDb21wYXJpbmcgUmVncmVzc2lvbiBNb2RlbHM/DQoNCjEuICoqTmVzdGVkIE1vZGVscyoqOiBBcHBsaWNhYmxlIHdoZW4geW91IGhhdmUgdHdvIG5lc3RlZCBtb2RlbHMgLSBvbmUgaXMgYSBzcGVjaWFsIGNhc2Ugb2YgdGhlIG90aGVyLiBGb3IgZXhhbXBsZSwgTW9kZWwgMSBtaWdodCBpbmNsdWRlIHByZWRpY3RvcnMgWDEsIFgyLCBhbmQgWDMsIHdoaWxlIE1vZGVsIDIgaW5jbHVkZXMgWDEgYW5kIFgyIG9ubHkuDQoNCjIuICoqU2FtZSBSZXNwb25zZSBWYXJpYWJsZSoqOiBCb3RoIG1vZGVscyBtdXN0IGJlIHRyeWluZyB0byBwcmVkaWN0IHRoZSBzYW1lIHJlc3BvbnNlIHZhcmlhYmxlLg0KDQozLiAqKkxpbmVhciBNb2RlbHMqKjogVHlwaWNhbGx5IHVzZWQgZm9yIGNvbXBhcmluZyBsaW5lYXIgcmVncmVzc2lvbiBtb2RlbHMuDQoNCiMjIyBIb3cgdG8gUGVyZm9ybSB0aGUgQ29tcGFyaXNvbj8NCg0KMS4gKipGaXQgQm90aCBNb2RlbHMqKjogRml0IHRoZSBzaW1wbGVyIG1vZGVsIGFuZCB0aGUgbW9yZSBjb21wbGV4IG1vZGVsIHRvIHlvdXIgZGF0YS4NCg0KMi4gKipDb25kdWN0IEFOT1ZBIFRlc3QqKjogVXNlIGFuIEFOT1ZBIHRlc3QgdG8gY29tcGFyZSB0aGUgbW9kZWxzLiBJbiBSLCB0aGlzIGNhbiBiZSBkb25lIHVzaW5nIHRoZSBgYW5vdmEoKWAgZnVuY3Rpb24uDQoNCjMuICoqSW50ZXJwcmV0IHRoZSBSZXN1bHRzKio6IElmIHRoZSBwLXZhbHVlIGZyb20gdGhlIEFOT1ZBIHRlc3QgaXMgbG93ICh0eXBpY2FsbHkgPDAuMDUpLCBpdCBzdWdnZXN0cyB0aGF0IHRoZSBtb3JlIGNvbXBsZXggbW9kZWwgcHJvdmlkZXMgYSBzaWduaWZpY2FudGx5IGJldHRlciBmaXQgdG8gdGhlIGRhdGEuDQoNCiMjIyBSIENvZGUgRXhhbXBsZQ0KDQpTdXBwb3NlIHlvdSBoYXZlIGEgZGF0YXNldCB3aXRoIGEgcmVzcG9uc2UgdmFyaWFibGUgYFlgIGFuZCB0aHJlZSBwcmVkaWN0b3JzIGBYMWAsIGBYMmAsIGBYM2AuIFlvdSB3YW50IHRvIGNvbXBhcmUgYSBtb2RlbCB0aGF0IG9ubHkgaW5jbHVkZXMgYFgxYCBhbmQgYFgyYCB3aXRoIGEgbW9kZWwgdGhhdCBpbmNsdWRlcyBhbGwgdGhyZWUgcHJlZGljdG9ycy4NCg0KYGBgUg0KIyBGaXQgdGhlIGZpcnN0IG1vZGVsIChzaW1wbGVyIG1vZGVsKQ0KbW9kZWwxIDwtIGxtKFkgfiBYMSArIFgyLCBkYXRhID0geW91cl9kYXRhKQ0KDQojIEZpdCB0aGUgc2Vjb25kIG1vZGVsIChtb3JlIGNvbXBsZXggbW9kZWwpDQptb2RlbDIgPC0gbG0oWSB+IFgxICsgWDIgKyBYMywgZGF0YSA9IHlvdXJfZGF0YSkNCg0KIyBDb21wYXJlIG1vZGVscyB1c2luZyBBTk9WQQ0KYW5vdmFfcmVzdWx0IDwtIGFub3ZhKG1vZGVsMSwgbW9kZWwyKQ0KDQojIFByaW50IHRoZSByZXN1bHRzDQpwcmludChhbm92YV9yZXN1bHQpDQpgYGANCg0KSW4gdGhpcyBSIGNvZGUsIGBsbSgpYCBpcyB1c2VkIHRvIGZpdCBsaW5lYXIgbW9kZWxzLCBhbmQgYGFub3ZhKClgIGlzIHVzZWQgdG8gY29tcGFyZSB0aGVtLiBUaGUgb3V0cHV0IHdpbGwgdGVsbCB5b3Ugd2hldGhlciBhZGRpbmcgYFgzYCB0byB0aGUgbW9kZWwgc2lnbmlmaWNhbnRseSBpbXByb3ZlcyB0aGUgZml0IG9mIHRoZSBtb2RlbC4NCg0KIyMjIEltcG9ydGFudCBDb25zaWRlcmF0aW9ucw0KDQotICoqTW9kZWwgSW50ZXJwcmV0YWJpbGl0eSoqOiBFdmVuIGlmIHRoZSBtb3JlIGNvbXBsZXggbW9kZWwgaXMgc3RhdGlzdGljYWxseSBiZXR0ZXIsIGNvbnNpZGVyIHdoZXRoZXIgdGhlIGFkZGVkIGNvbXBsZXhpdHkgaXMganVzdGlmaWVkIGluIHRlcm1zIG9mIGludGVycHJldGFiaWxpdHkgYW5kIHByYWN0aWNhbCBhcHBsaWNhdGlvbi4NCg0KLSAqKk92ZXJmaXR0aW5nKio6IEFkZGluZyBtb3JlIHByZWRpY3RvcnMgY2FuIGxlYWQgdG8gb3ZlcmZpdHRpbmcsIGVzcGVjaWFsbHkgd2l0aCBzbWFsbCBkYXRhc2V0cy4gRW5zdXJlIHRoYXQgdGhlIG1vZGVsIGNvbXBsZXhpdHkgaXMgYXBwcm9wcmlhdGUgZm9yIHRoZSBzaXplIGFuZCBuYXR1cmUgb2YgeW91ciBkYXRhLg0KDQotICoqQXNzdW1wdGlvbnMqKjogQXMgd2l0aCBhbnkgc3RhdGlzdGljYWwgbWV0aG9kLCBlbnN1cmUgdGhhdCB0aGUgYXNzdW1wdGlvbnMgdW5kZXJseWluZyBsaW5lYXIgcmVncmVzc2lvbiAoc3VjaCBhcyBsaW5lYXJpdHksIGhvbW9zY2VkYXN0aWNpdHksIGluZGVwZW5kZW5jZSwgYW5kIG5vcm1hbGl0eSBvZiByZXNpZHVhbHMpIGFyZSByZWFzb25hYmx5IG1ldC4NCg0KDQpPdmVyZml0dGluZyBpcyBhIGNvbW1vbiBwcm9ibGVtIGluIHN0YXRpc3RpY2FsIG1vZGVsaW5nIGFuZCBtYWNoaW5lIGxlYXJuaW5nLCBhbmQgaXQgb2NjdXJzIHdoZW4gYSBtb2RlbCBpcyB0b28gY29tcGxleCBhbmQgc3RhcnRzIHRvIGNhcHR1cmUgdGhlIG5vaXNlIGluIHRoZSBkYXRhIHJhdGhlciB0aGFuIGp1c3QgdGhlIHRydWUgdW5kZXJseWluZyBwYXR0ZXJucy4gVG8gZXhwbGFpbiBpdCBzaW1wbHk6DQoNCjEuICoqTW9kZWxpbmcgdGhlIERldGFpbHMgYW5kIE5vaXNlKio6IEltYWdpbmUgeW91J3JlIHRyeWluZyB0byBkcmF3IGEgbGluZSB0aHJvdWdoIGEgc2V0IG9mIHBvaW50cyBvbiBhIGdyYXBoLiBJZiB5b3UgdXNlIGEgc3RyYWlnaHQgbGluZSwgaXQgbWlnaHQgbm90IHBhc3MgZXhhY3RseSB0aHJvdWdoIGFsbCB0aGUgcG9pbnRzLCBidXQgaXQgZ2l2ZXMgYSBnb29kIGdlbmVyYWwgdHJlbmQuIFRoaXMgaXMgbGlrZSBhIHNpbXBsZSBtb2RlbC4gTm93LCBpZiB5b3Ugc3RhcnQgYWRkaW5nIGN1cnZlcyB0byB5b3VyIGxpbmUgc28gaXQgcGFzc2VzIHRocm91Z2ggZXZlcnkgc2luZ2xlIHBvaW50IHBlcmZlY3RseSwgeW91J3JlIG5vdCBqdXN0IGNhcHR1cmluZyB0aGUgb3ZlcmFsbCB0cmVuZCBhbnltb3JlLCBidXQgYWxzbyB0aGUgcmFuZG9tIHZhcmlhdGlvbnMgYW5kIG5vaXNlLiBUaGlzIGN1cnZ5IGxpbmUgaXMgbGlrZSBhbiBvdmVyZml0dGVkIG1vZGVsLg0KDQoyLiAqKk1lbW9yaXppbmcgdnMuIExlYXJuaW5nKio6IENvbnNpZGVyIGEgc3R1ZGVudCB3aG8gbWVtb3JpemVzIGZhY3RzIGZvciBhbiBleGFtIHdpdGhvdXQgdW5kZXJzdGFuZGluZyB0aGUgY29uY2VwdHMuIFRoZXkgbWlnaHQgZG8gd2VsbCBvbiB0aGF0IHNwZWNpZmljIHRlc3QgKHRoZSBkYXRhIHRoZXkgdHJhaW5lZCBvbiksIGJ1dCBmYWlsIHRvIGFwcGx5IHRoZSBrbm93bGVkZ2UgdG8gbmV3IHF1ZXN0aW9ucyBvciBhIGRpZmZlcmVudCBleGFtIChuZXcsIHVuc2VlbiBkYXRhKS4gT3ZlcmZpdHRpbmcgaXMgc2ltaWxhcjogdGhlIG1vZGVsIHBlcmZvcm1zIHJlYWxseSB3ZWxsIG9uIHRoZSB0cmFpbmluZyBkYXRhIGJ1dCBmYWlscyB0byBnZW5lcmFsaXplIHRvIG5ldywgdW5zZWVuIGRhdGEuDQoNCjMuICoqTGFjayBvZiBGbGV4aWJpbGl0eSoqOiBPdmVyZml0dGluZyBpcyBsaWtlIGhhdmluZyBhIHRvb2wgdGhhdCB3b3JrcyBwZXJmZWN0bHkgZm9yIG9uZSBzcGVjaWZpYyB0YXNrIGJ1dCBpcyB1c2VsZXNzIGZvciBhbnl0aGluZyBzbGlnaHRseSBkaWZmZXJlbnQuIEEgZ29vZCBtb2RlbCwgbGlrZSBhIHZlcnNhdGlsZSB0b29sLCBzaG91bGQgcGVyZm9ybSB3ZWxsIGFjcm9zcyBhIHJhbmdlIG9mIHNpdHVhdGlvbnMsIG5vdCBqdXN0IHRoZSBvbmUgaXQgd2FzIHNwZWNpZmljYWxseSBkZXNpZ25lZCBmb3IuDQoNCjQuICoqQ29tcGxleGl0eSoqOiBBIG1vcmUgY29tcGxleCBtb2RlbCBpc24ndCBhbHdheXMgYSBiZXR0ZXIgbW9kZWwuIElmIGl0IGhhcyB0b28gbWFueSBwYXJhbWV0ZXJzIG9yIGlzIHRvbyB0YWlsb3JlZCB0byB0aGUgdHJhaW5pbmcgZGF0YSwgaXQgY2FuIGxvc2UgaXRzIGFiaWxpdHkgdG8gYmUgZWZmZWN0aXZlIHdpdGggbmV3IGRhdGEuIEl0J3MgbGlrZSBhIGNoZWYgd2hvIG9ubHkga25vd3MgYSB2ZXJ5IGNvbXBsaWNhdGVkIHJlY2lwZSBidXQgc3RydWdnbGVzIHRvIGNvb2sgYSBzaW1wbGUgZGlzaC4NCg0KSW4gc3VtbWFyeSwgb3ZlcmZpdHRpbmcgaXMgY3JlYXRpbmcgYSBtb2RlbCB0aGF0J3MgdG9vIHRhaWxvcmVkIHRvIHRoZSBzcGVjaWZpYyBkZXRhaWxzIGFuZCBub2lzZSBvZiB0aGUgdHJhaW5pbmcgZGF0YSwgbG9zaW5nIGl0cyBhYmlsaXR5IHRvIHBlcmZvcm0gd2VsbCBvbiBuZXcsIHVuc2VlbiBkYXRhLiBJdCdzIGFib3V0IGZpbmRpbmcgdGhlIHJpZ2h0IGJhbGFuY2UgYmV0d2VlbiBzaW1wbGljaXR5IGFuZCBjb21wbGV4aXR5IGluIHlvdXIgbW9kZWwu