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.

  1. 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.
  2. 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:

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:

  1. 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.
  2. 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.
  3. 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.
  4. 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:

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?

  1. 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.

  2. 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?

  1. 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.

  2. Same Response Variable: Both models must be trying to predict the same response variable.

  3. Linear Models: Typically used for comparing linear regression models.

How to Perform the Comparison?

  1. Fit Both Models: Fit the simpler model and the more complex model to your data.

  2. Conduct ANOVA Test: Use an ANOVA test to compare the models. In R, this can be done using the anova() function.

  3. Interpret the Results: If the p-value from the ANOVA test is low (typically <0.05), it suggests that the more complex model provides a significantly better fit to the data.

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

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:

  1. 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.

  2. 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.

  3. 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.

  4. 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