View the
latest recording of this lecture
We know that the importance of one predictor can depend on
whether or not we have adjusted for another. This is also true if the
predictors are factors.
This means that we need to look at multiple ANOVA tables in order
to perform all the possible tests (with particular patterns of
adjustment).
However, for orthogonal factorial designs it turns out that the
issue of adjustment is of no concern.
What is an Orthogonal Factorial Design?
The pattern of factor levels (i.e. the number of observations in
the different level groups of the different factors), when chosen by an
experimenter, is called the factorial design.
In essence, the pattern of factor levels (the factorial design if
this was chosen by an experimenter) is orthogonal if
the sum of squares attributable to one factor is the same whether or not
the other factor has been included in the model.
In terms of ANOVA tables, this means that SSA will be
the same whether A appears on the first or second line of the
ANOVA table.
A balanced and complete factorial design is orthogonal. We will
see what these two terms mean.
What is a balanced and complete factorial design?
A factorial design is complete if observations
are made at every possible combination of factor levels, or
treatment.
For example, if factor A has 3 levels, and factor
B has 4 levels, then a complete design requires that we observe
responses at each of the possible \(3\times4 =
12\) treatments.
A factorial design is balanced if the same
number of experimental units are observed at each treatment. In other
words, nij = r is the (constant) number of
replications, i.e. the number of observations in each
treatment.
Balance and completeness need to be achieved by design (they will
not usually be the case in an observational study or survey).
Consequences of an Orthogonal Factorial Design
In a two-way orthogonal design:
The P-values for each factor in the ANOVA table remain
precisely the same irrespective of the order in which the factors are
listed.
In considering the importance of factor B it does not
matter whether or not we have adjusted for A (and vice
versa).
The idea of orthogonality can be extended to three or more factor
models.
A Designed Experiment for Dairy Cattle
An experiment was performed to investigate butterfat content of milk
(the response variable, measured as a percentage). The factors are:
- Cow breed, with five levels: Ayrshire, Canadian, Guernsey,
Holstein-Fresian, Jersey.
- Cow age, with two levels: mature, and 2 years old.
Some cows
10 replicates (cows) observed at each treatment (i.e. combination
of breed and maturity).
The design is complete and balanced, so
therefore orthogonal.
Analysis of Dairy Cattle Data
Download cows.csv
## Cows <- read.csv(file = "cows.csv", header = TRUE)
head(Cows)
X Butterfat Breed Age
1 1 3.74 Ayrshire Mature
2 2 4.01 Ayrshire 2year
3 3 3.77 Ayrshire Mature
4 4 3.78 Ayrshire 2year
5 5 4.10 Ayrshire Mature
6 6 4.06 Ayrshire 2year
Cows.lm.1 <- lm(Butterfat ~ Breed + Age, data = Cows)
anova(Cows.lm.1)
Analysis of Variance Table
Response: Butterfat
Df Sum Sq Mean Sq F value Pr(>F)
Breed 4 34.321 8.5803 50.1150 <2e-16 ***
Age 1 0.274 0.2735 1.5976 0.2094
Residuals 94 16.094 0.1712
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Cows.lm.2 <- lm(Butterfat ~ Age + Breed, data = Cows)
anova(Cows.lm.2)
Analysis of Variance Table
Response: Butterfat
Df Sum Sq Mean Sq F value Pr(>F)
Age 1 0.274 0.2735 1.5976 0.2094
Breed 4 34.321 8.5803 50.1150 <2e-16 ***
Residuals 94 16.094 0.1712
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
The figures in the ANOVA tables for models Cows.lm.1
and
Cows.lm.2
are identical, despite the difference in order in
which the factors are considered. This occurs because of the orthogonal
design.
There is overwhelming evidence of a breed effect (P-value
smaller than \(2 \times 10^{-16}\)) on
mean butterfat content.
There is no evidence of an age effect.
Summary Table
summary(Cows.lm.1)$coefficients
Estimate Std. Error t value Pr(>|t|)
(Intercept) 4.0077 0.10135464 39.541356 2.234024e-60
BreedCanadian 0.3785 0.13084828 2.892663 4.746491e-03
BreedGuernsey 0.8900 0.13084828 6.801771 9.480645e-10
BreedHolstein-Fresian -0.3905 0.13084828 -2.984372 3.621196e-03
BreedJersey 1.2325 0.13084828 9.419306 3.155879e-15
AgeMature 0.1046 0.08275572 1.263961 2.093694e-01
summary(Cows.lm.2)$coefficients
Estimate Std. Error t value Pr(>|t|)
(Intercept) 4.0077 0.10135464 39.541356 2.234024e-60
AgeMature 0.1046 0.08275572 1.263961 2.093694e-01
BreedCanadian 0.3785 0.13084828 2.892663 4.746491e-03
BreedGuernsey 0.8900 0.13084828 6.801771 9.480645e-10
BreedHolstein-Fresian -0.3905 0.13084828 -2.984372 3.621196e-03
BreedJersey 1.2325 0.13084828 9.419306 3.155879e-15
Note that by default, level one of Age
(2 years old) and
level one of Breed
, Ayrshire, are set as the reference
levels for the treatment constraint.
The Jerseys seem to provide the highest butterfat concentration.
We should look at model diagnostics.
Rats – Not Another Task!
This task concerns a complete and balanced experiment into rat weight
gain.
Two factors:
- Protein: either beef or cereal;
- Amount: either low or high.
We have ten replicates at each treatment.
The rats again
The following ANOVA table (with certain elements obscure by
#
) was obtained using R.
Amount |
1 |
1299.6 |
# |
# |
0.026 |
Protein |
1 |
220.9 |
# |
# |
0.345 |
Residuals |
37 |
8933.0 |
# |
|
|
Calculate the obscured values.
What can you conclude (if anything) about the effect of
Protein
ignoring the effects of
Amount
?
LS0tDQp0aXRsZTogIkxlY3R1cmUgMjM6IE9ydGhvZ29uYWwgRmFjdG9yaWFsIE1vZGVscyINCnN1YnRpdGxlOiAxNjEuMjUxIFJlZ3Jlc3Npb24gTW9kZWxsaW5nDQphdXRob3I6ICJQcmVzZW50ZWQgYnkgSm9uYXRoYW4gR29kZnJleSA8YS5qLmdvZGZyZXlAbWFzc2V5LmFjLm56PiIgIA0KZGF0ZTogIldlZWsgOCBvZiBTZW1lc3RlciAyLCBgciBsdWJyaWRhdGU6OnllYXIobHVicmlkYXRlOjpub3coKSlgIg0Kb3V0cHV0Og0KICBodG1sX2RvY3VtZW50Og0KICAgIGNvZGVfZG93bmxvYWQ6IHRydWUNCiAgICB0aGVtZTogeWV0aQ0KICAgIGhpZ2hsaWdodDogdGFuZ28NCiAgaHRtbF9ub3RlYm9vazoNCiAgICBjb2RlX2Rvd25sb2FkOiB0cnVlDQogICAgdGhlbWU6IHlldGkNCiAgICBoaWdobGlnaHQ6IHRhbmdvDQogIGlvc2xpZGVzX3ByZXNlbnRhdGlvbjoNCiAgICB3aWRlc2NyZWVuOiB0cnVlDQogICAgc21hbGxlcjogdHJ1ZQ0KICB3b3JkX2RvY3VtZW50OiBkZWZhdWx0DQogIHNsaWR5X3ByZXNlbnRhdGlvbjogDQogICAgdGhlbWU6IHlldGkNCiAgICBoaWdobGlnaHQ6IHRhbmdvDQogIHBkZl9kb2N1bWVudDogZGVmYXVsdA0KLS0tDQoNCg0KDQoNCg0KW1ZpZXcgdGhlIGxhdGVzdCByZWNvcmRpbmcgb2YgdGhpcyBsZWN0dXJlXShodHRwczovL1ItUmVzb3VyY2VzLm1hc3NleS5hYy5uei92aWRlb3MvMjUxTDIzLm1wNCkNCjwhLS0tIERhdGEgaXMgb24NCmh0dHBzOi8vci1yZXNvdXJjZXMubWFzc2V5LmFjLm56L2RhdGEvMTYxMjUxLw0KLS0tPg0KDQpgYGB7ciBzZXR1cCwgcHVybD1GQUxTRSwgaW5jbHVkZT1GQUxTRX0NCmxpYnJhcnkoa25pdHIpDQpvcHRzX2NodW5rJHNldChkZXY9YygicG5nIiwgInBkZiIpKQ0Kb3B0c19jaHVuayRzZXQoZmlnLmhlaWdodD02LCBmaWcud2lkdGg9NywgZmlnLnBhdGg9IkZpZ3VyZXMvIiwgZmlnLmFsdD0idW5sYWJlbGxlZCIpDQpvcHRzX2NodW5rJHNldChjb21tZW50PSIiLCBmaWcuYWxpZ249ImNlbnRlciIsIHRpZHk9VFJVRSkNCm9wdGlvbnMoa25pdHIua2FibGUuTkEgPSAnJykNCmxpYnJhcnkodGlkeXZlcnNlKQ0KbGlicmFyeShicm9vbSkNCmBgYA0KDQoNCjwhLS0tIERvIG5vdCBlZGl0IGFueXRoaW5nIGFib3ZlIHRoaXMgbGluZS4gLS0tPg0KDQo8IS0tLSBHTE1zRGF0YSBwYWNrYWdlIGhhcyBidXR0ZXJmYXQgLS0tPg0KDQoNCi0gV2Uga25vdyB0aGF0IHRoZSBpbXBvcnRhbmNlIG9mIG9uZSBwcmVkaWN0b3IgY2FuIGRlcGVuZCBvbiB3aGV0aGVyIG9yDQogICAgbm90IHdlIGhhdmUgYWRqdXN0ZWQgZm9yIGFub3RoZXIuIFRoaXMgaXMgYWxzbyB0cnVlIGlmIHRoZSBwcmVkaWN0b3JzIGFyZSBmYWN0b3JzLg0KDQotIFRoaXMgbWVhbnMgdGhhdCB3ZSBuZWVkIHRvIGxvb2sgYXQgbXVsdGlwbGUgQU5PVkEgdGFibGVzIGluIG9yZGVyIHRvDQogICAgcGVyZm9ybSBhbGwgdGhlIHBvc3NpYmxlIHRlc3RzICh3aXRoIHBhcnRpY3VsYXIgcGF0dGVybnMgb2YNCiAgICBhZGp1c3RtZW50KS4NCg0KLSBIb3dldmVyLCBmb3Igb3J0aG9nb25hbCBmYWN0b3JpYWwgZGVzaWducyBpdCB0dXJucyBvdXQNCiAgICB0aGF0IHRoZSBpc3N1ZSBvZiBhZGp1c3RtZW50IGlzIG9mIG5vIGNvbmNlcm4uDQoNCiMjIFdoYXQgaXMgYW4gT3J0aG9nb25hbCBGYWN0b3JpYWwgRGVzaWduPw0KDQotIFRoZSBwYXR0ZXJuIG9mIGZhY3RvciBsZXZlbHMgKGkuZS4gdGhlIG51bWJlciBvZiBvYnNlcnZhdGlvbnMgaW4gdGhlIGRpZmZlcmVudCBsZXZlbCBncm91cHMgb2YgdGhlIGRpZmZlcmVudCBmYWN0b3JzKSwgd2hlbiBjaG9zZW4gYnkgYW4gZXhwZXJpbWVudGVyLCBpcyBjYWxsZWQgdGhlIGZhY3RvcmlhbCBkZXNpZ24uIA0KDQotIEluIGVzc2VuY2UsIHRoZSBwYXR0ZXJuIG9mIGZhY3RvciBsZXZlbHMgKHRoZSBmYWN0b3JpYWwNCiAgICBkZXNpZ24gaWYgdGhpcyB3YXMgY2hvc2VuIGJ5IGFuIGV4cGVyaW1lbnRlcikgaXMNCiAgICAqKm9ydGhvZ29uYWwqKiBpZiB0aGUgc3VtIG9mIHNxdWFyZXMgYXR0cmlidXRhYmxlIHRvIG9uZQ0KICAgIGZhY3RvciBpcyB0aGUgc2FtZSB3aGV0aGVyIG9yIG5vdCB0aGUgb3RoZXIgZmFjdG9yIGhhcyBiZWVuIGluY2x1ZGVkDQogICAgaW4gdGhlIG1vZGVsLg0KDQotIEluIHRlcm1zIG9mIEFOT1ZBIHRhYmxlcywgdGhpcyBtZWFucyB0aGF0ICpTU0EqIHdpbGwgYmUgdGhlIHNhbWUNCiAgICB3aGV0aGVyICpBKiBhcHBlYXJzIG9uIHRoZSBmaXJzdCBvciBzZWNvbmQgbGluZSBvZiB0aGUgQU5PVkEgICAgIHRhYmxlLg0KDQotIEEgYmFsYW5jZWQgYW5kIGNvbXBsZXRlIGZhY3RvcmlhbCBkZXNpZ24gaXMgb3J0aG9nb25hbC4gV2Ugd2lsbCBzZWUgd2hhdCB0aGVzZSB0d28gdGVybXMgbWVhbi4NCg0KIyMgV2hhdCBpcyBhIGJhbGFuY2VkIGFuZCBjb21wbGV0ZSBmYWN0b3JpYWwgZGVzaWduPw0KDQotIEEgZmFjdG9yaWFsIGRlc2lnbiBpcyAqKmNvbXBsZXRlKiogaWYgb2JzZXJ2YXRpb25zIGFyZSBtYWRlDQogICAgYXQgZXZlcnkgcG9zc2libGUgY29tYmluYXRpb24gb2YgZmFjdG9yIGxldmVscywgb3INCiAgICB0cmVhdG1lbnQuDQoNCi0gRm9yIGV4YW1wbGUsIGlmIGZhY3RvciAqQSogaGFzIDMgbGV2ZWxzLCBhbmQgZmFjdG9yICpCKiBoYXMgNA0KICAgIGxldmVscywgdGhlbiBhIGNvbXBsZXRlIGRlc2lnbiByZXF1aXJlcyB0aGF0IHdlIG9ic2VydmUgcmVzcG9uc2VzIGF0DQogICAgZWFjaCBvZiB0aGUgcG9zc2libGUgJDNcdGltZXM0ID0gMTIkIHRyZWF0bWVudHMuDQoNCi0gQSBmYWN0b3JpYWwgZGVzaWduIGlzICoqYmFsYW5jZWQqKiBpZiB0aGUgc2FtZSBudW1iZXIgb2YNCiAgICBleHBlcmltZW50YWwgdW5pdHMgYXJlIG9ic2VydmVkIGF0IGVhY2ggdHJlYXRtZW50LiBJbiBvdGhlciB3b3JkcywgKm5+aWp+ID0gciogaXMgdGhlIChjb25zdGFudCkgKipudW1iZXIgb2YgcmVwbGljYXRpb25zKiosDQogICAgaS5lLiB0aGUgbnVtYmVyIG9mIG9ic2VydmF0aW9ucyBpbiBlYWNoIHRyZWF0bWVudC4NCg0KLSBCYWxhbmNlIGFuZCBjb21wbGV0ZW5lc3MgbmVlZCB0byBiZSBhY2hpZXZlZCBieSBkZXNpZ24NCiAgICAodGhleSB3aWxsIG5vdCB1c3VhbGx5IGJlIHRoZSBjYXNlIGluIGFuIG9ic2VydmF0aW9uYWwgc3R1ZHkgb3Igc3VydmV5KS4NCg0KIyMgQ29uc2VxdWVuY2VzIG9mIGFuIE9ydGhvZ29uYWwgRmFjdG9yaWFsIERlc2lnbg0KDQpJbiBhIHR3by13YXkgb3J0aG9nb25hbCBkZXNpZ246DQoNCi0gVGhlICpQKi12YWx1ZXMgZm9yIGVhY2ggZmFjdG9yIGluIHRoZSBBTk9WQSB0YWJsZSByZW1haW4gcHJlY2lzZWx5IHRoZQ0KICAgIHNhbWUgaXJyZXNwZWN0aXZlIG9mIHRoZSBvcmRlciBpbiB3aGljaCB0aGUgZmFjdG9ycyBhcmUgbGlzdGVkLg0KDQotIEluIGNvbnNpZGVyaW5nIHRoZSBpbXBvcnRhbmNlIG9mIGZhY3RvciAqQiogaXQgZG9lcyBub3QgbWF0dGVyDQogICAgd2hldGhlciBvciBub3Qgd2UgaGF2ZSBhZGp1c3RlZCBmb3IgKkEqIChhbmQgdmljZSB2ZXJzYSkuDQoNClRoZSBpZGVhIG9mIG9ydGhvZ29uYWxpdHkgY2FuIGJlIGV4dGVuZGVkIHRvIHRocmVlIG9yIG1vcmUgZmFjdG9yDQptb2RlbHMuDQoNCiMjIEEgRGVzaWduZWQgRXhwZXJpbWVudCBmb3IgRGFpcnkgQ2F0dGxlDQoNCg0KDQpBbiBleHBlcmltZW50IHdhcyBwZXJmb3JtZWQgdG8gaW52ZXN0aWdhdGUgYnV0dGVyZmF0IGNvbnRlbnQgb2YgbWlsayAodGhlIHJlc3BvbnNlIHZhcmlhYmxlLCBtZWFzdXJlZCBhcyBhIHBlcmNlbnRhZ2UpLg0KVGhlIGZhY3RvcnMgYXJlOg0KDQotIENvdyBicmVlZCwgd2l0aCBmaXZlIGxldmVsczogQXlyc2hpcmUsIENhbmFkaWFuLCBHdWVybnNleSwgSG9sc3RlaW4tRnJlc2lhbiwgSmVyc2V5Lg0KLSBDb3cgYWdlLCB3aXRoIHR3byBsZXZlbHM6IG1hdHVyZSwgYW5kIDIgeWVhcnMgb2xkLg0KDQohW1NvbWUgY293c10oLi4vZ3JhcGhpY3MvY293cy5qcGcpDQoNCg0KDQoNCi0gMTAgcmVwbGljYXRlcyAoY293cykgb2JzZXJ2ZWQgYXQgZWFjaCB0cmVhdG1lbnQgKGkuZS4gY29tYmluYXRpb24gb2YNCiAgICBicmVlZCBhbmQgbWF0dXJpdHkpLg0KDQotIFRoZSBkZXNpZ24gaXMgY29tcGxldGUgKiphbmQqKiBiYWxhbmNlZCwNCiAgICBzbyB0aGVyZWZvcmUgb3J0aG9nb25hbC4NCg0KIyMjIEFuYWx5c2lzIG9mIERhaXJ5IENhdHRsZSBEYXRhDQoNCmByIHhmdW46OmVtYmVkX2ZpbGUoIi4uLy4uL2RhdGEvY293cy5jc3YiKWANCg0KYGBge3IgQ293cy5sbS4xLCBlY2hvPS0xLCBldmFsPS0yfQ0KQ293cyA8LSByZWFkLmNzdihmaWxlPSIuLi8uLi9kYXRhL2Nvd3MuY3N2IiwgaGVhZGVyPVRSVUUpDQpDb3dzIDwtIHJlYWQuY3N2KGZpbGU9ImNvd3MuY3N2IiwgaGVhZGVyPVRSVUUpDQpoZWFkKENvd3MpDQpDb3dzLmxtLjEgPC0gbG0oQnV0dGVyZmF0IH4gQnJlZWQgKyBBZ2UsIGRhdGE9Q293cykNCmFub3ZhKENvd3MubG0uMSkNCmBgYA0KDQpgYGB7ciBDb3dzLmxtLjJ9DQpDb3dzLmxtLjIgPC0gbG0oQnV0dGVyZmF0IH4gQWdlICsgQnJlZWQsIGRhdGE9Q293cykNCmFub3ZhKENvd3MubG0uMikNCmBgYA0KDQpUaGUgZmlndXJlcyBpbiB0aGUgQU5PVkEgdGFibGVzIGZvciBtb2RlbHMgYENvd3MubG0uMWAgYW5kIGBDb3dzLmxtLjJgIGFyZSBpZGVudGljYWwsDQogICAgZGVzcGl0ZSB0aGUgZGlmZmVyZW5jZSBpbiBvcmRlciBpbiB3aGljaCB0aGUgZmFjdG9ycyBhcmUgY29uc2lkZXJlZC4NCiAgICBUaGlzIG9jY3VycyBiZWNhdXNlIG9mIHRoZSBvcnRob2dvbmFsIGRlc2lnbi4NCg0KVGhlcmUgaXMgb3ZlcndoZWxtaW5nIGV2aWRlbmNlIG9mIGEgYnJlZWQgZWZmZWN0ICgqUCotdmFsdWUgc21hbGxlciB0aGFuDQogICAgJDIgXHRpbWVzIDEwXnstMTZ9JCkgb24gbWVhbiBidXR0ZXJmYXQgY29udGVudC4NCiAgICANClRoZXJlIGlzIG5vIGV2aWRlbmNlIG9mIGFuIGFnZSBlZmZlY3QuDQoNCiMjIyBTdW1tYXJ5IFRhYmxlDQoNCmBgYHtyIHN1bW1hcmllc0Nvd3N9DQpzdW1tYXJ5KENvd3MubG0uMSkkY29lZmZpY2llbnRzDQpzdW1tYXJ5KENvd3MubG0uMikkY29lZmZpY2llbnRzDQpgYGANCg0KTm90ZSB0aGF0IGJ5IGRlZmF1bHQsIGxldmVsIG9uZSBvZiBgQWdlYCAoMiB5ZWFycyBvbGQpIGFuZCBsZXZlbCBvbmUgb2YgYEJyZWVkYCwgQXlyc2hpcmUsDQogICAgYXJlIHNldCBhcyB0aGUgcmVmZXJlbmNlIGxldmVscyBmb3IgdGhlIHRyZWF0bWVudCBjb25zdHJhaW50Lg0KDQpUaGUgSmVyc2V5cyBzZWVtIHRvIHByb3ZpZGUgdGhlIGhpZ2hlc3QgYnV0dGVyZmF0IGNvbmNlbnRyYXRpb24uDQoNCldlIHNob3VsZCBsb29rIGF0IG1vZGVsIGRpYWdub3N0aWNzLg0KDQoNCiMjIFJhdHMg4oCTIE5vdCBBbm90aGVyIFRhc2shDQoNClRoaXMgdGFzayBjb25jZXJucyBhIGNvbXBsZXRlIGFuZCBiYWxhbmNlZCBleHBlcmltZW50IGludG8gcmF0IHdlaWdodCBnYWluLg0KDQpUd28gZmFjdG9yczoNCg0KMS4gUHJvdGVpbjogZWl0aGVyIGJlZWYgb3IgY2VyZWFsOw0KMi4gQW1vdW50OiBlaXRoZXIgbG93IG9yIGhpZ2guDQoNCldlIGhhdmUgdGVuIHJlcGxpY2F0ZXMgYXQgZWFjaCB0cmVhdG1lbnQuDQoNCiFbVGhlIHJhdHMgYWdhaW5dKC4uL2dyYXBoaWNzL3JhdHMuanBnKQ0KDQoNCg0KDQpUaGUgZm9sbG93aW5nIEFOT1ZBIHRhYmxlICh3aXRoIGNlcnRhaW4gZWxlbWVudHMgb2JzY3VyZSBieSBgI2ApIHdhcw0Kb2J0YWluZWQgdXNpbmcgUi4NCg0KYGBge3IgZWNobz1GQUxTRX0NClJhdERpZXQgPC0gcmVhZC5jc3YoZmlsZT0iLi4vLi4vZGF0YS9yYXRkaWV0LmNzdiIsIGhlYWRlcj1UUlVFKQ0KTXlUYWJsZSA9IGFzLmRhdGEuZnJhbWUoYW5vdmEobG0oR2FpbiB+QW1vdW50ICsgUHJvdGVpbiwgZGF0YT1SYXREaWV0KSkpDQpNeVRhYmxlWywiUHIoPkYpIl0gPSByb3VuZChNeVRhYmxlWywiUHIoPkYpIl0sIDQpDQpNeVRhYmxlWywzOjRdID0iIyINCk15VGFibGVbMyw0OjVdID0iIg0Ka25pdHI6OmthYmxlKE15VGFibGUpDQpgYGANCg0KMS4gIENhbGN1bGF0ZSB0aGUgb2JzY3VyZWQgdmFsdWVzLg0KDQoyLiAgV2hhdCBjYW4geW91IGNvbmNsdWRlIChpZiBhbnl0aGluZykgYWJvdXQgdGhlIGVmZmVjdCBvZiBgUHJvdGVpbmAgaWdub3JpbmcgdGhlDQogICAgZWZmZWN0cyBvZiBgQW1vdW50YD8NCg0KIyMgTWF0aGVtYXRpY2FsIGZvcm11bGF0aW9uIG9mIGZhY3RvcmlhbCBtb2RlbHMNCg0KQXMgd2UgbW92ZSB0b3dhcmRzIG1vcmUgY29tcGxleCBmYWN0b3JpYWwgbW9kZWxzLCB3aXRoIG1vcmUgdGhhbiB0d28NCmZhY3RvcnMgYW5kIGludGVyYWN0aW9ucywgd2UgbmVlZCB0byBzdGFydCB1c2luZyB0aGUgbWF0aGVtYXRpY2FsDQpmb3JtdWxhdGlvbiBvZiB0aGVzZSBtb2RlbHMgYXMgdGhleSBhcmUgbW9yZSBjb25jaXNlLg0KDQojIyMgT25lLXdheSBBTk9WQSBtb2RlbA0KDQpSZW1lbWJlciB0aGF0IHRoZSBvbmUtd2F5IG1vZGVsDQokJFlfaSA9IFxtdSArIFxhbHBoYV8yIHpfe2kyfSArIFxsZG90cyArIFxhbHBoYV9LIHpfe2lLfSArIFx2YXJlcHNpbG9uX2l+fn5+fihpPTEsMixcbGRvdHMsbikkJA0KDQpjYW4gYmUgd3JpdHRlbiBhcyAkJFxib2xkc3ltYm9se1lfe2lqfSA9IFxtdSArIFxhbHBoYV9pICsgXHZhcmVwc2lsb25fe2lqfX0kJA0Kd2hlcmUNCg0KLSAkWV97aWp9JCBpcyB0aGUgcmVzcG9uc2Ugb2YgdGhlICRqJHRoIHVuaXQgYXQgdGhlICRpJHRoIGxldmVsDQogICAgb2YgdGhlIGZhY3RvciAkKGk9MSxcbGRvdHMsSzt+aj0xLFxsZG90cyxuX2kpJDsNCg0KLSAkSyQgZGVub3RlcyB0aGUgbnVtYmVyIG9mIGxldmVscywgYW5kICRuX2kkIHRoZSBudW1iZXIgb2YNCiAgICBvYnNlcnZhdGlvbnMgYXQgbGV2ZWwgJGkkIG9mIHRoZSBmYWN0b3IuDQoNCi0gQXNzdW1lIHRyZWF0bWVudCBjb25zdHJhaW50ICRcYWxwaGFfMT0wJC4NCg0KLSAkXHZhcmVwc2lsb25fezExfSwgXHZhcmVwc2lsb25fezEyfSwgXGxkb3RzLCBcdmFyZXBzaWxvbl97S25fS30kIGFyZSByYW5kb20gZXJyb3JzDQogICAgc2F0aXNmeWluZyBhc3N1bXB0aW9ucyAqKipBMSoqKiB0byAqKipBNCoqKi4NCg0KIyMjIFR3by13YXkgKG1haW4gZWZmZWN0cykgQU5PVkEgbW9kZWwNCg0KQSB0d28td2F5IG1vZGVsIHdpdGggZmFjdG9ycyAqQSogYW5kICpCKiBpbiBtdWx0aXBsZSByZWdyZXNzaW9uIGZvcm0NCiQkWV9pID0gXG11ICsgXGFscGhhXzIgel97QWkyfSArIFxsZG90cyArIFxhbHBoYV9LIHpfe0FpS30gDQorIFxiZXRhXzIgel97QmkyfSArIFxsZG90cyArIFxiZXRhX0wgel97QmlMfSArIFx2YXJlcHNpbG9uX2l+fn5+fihpPTEsMixcbGRvdHMsbikkJA0KYmVjb21lczoNCiQkXGJvbGRzeW1ib2x7WV97aWprfSA9IFxtdSArIFxhbHBoYV9pICsgXGJldGFfaiArIFx2YXJlcHNpbG9uX3tpamt9fSQkDQoNCndoZXJlICRZX3tpamt9JCBpcyB0aGUgcmVzcG9uc2UgZm9yIHRoZSAkayR0aCB1bml0IGF0IGxldmVsICRpJCBvZg0KICAgIGZhY3RvciAqQSogYW5kIGxldmVsICRqJCBvZiBmYWN0b3IgKkIqICgkaT0xLFxsZG90cyxLO35qPTEsXGxkb3RzLEw7fms9MSxcbGRvdHMsbl97aWp9JCkuDQoNCi0gJFxhbHBoYV8xLCBcbGRvdHMsIFxhbHBoYV9LJCBhbmQgJFxiZXRhXzEsIFxsZG90cywgXGJldGFfTCQgYXJlDQogICAgcGFyYW1ldGVycyBkZXNjcmliaW5nIHRoZSDigJhtYWluIGVmZmVjdHPigJkgb2YgKkEqIGFuZCAqQioNCiAgICByZXNwZWN0aXZlbHkuDQoNCi0gQXNzdW1lIHRyZWF0bWVudCBjb25zdHJhaW50cywgJFxhbHBoYV8xID0gMCQgYW5kICRcYmV0YV8xID0gMCQuDQoNCi0gJFx2YXJlcHNpbG9uX3sxMTF9LCBcdmFyZXBzaWxvbl97MTEyfSwgXGxkb3RzLCBcdmFyZXBzaWxvbl97S0xuX3tLTH19JCwgYXJlIGVycm9yDQogICAgdGVybXMgc2F0aXNmeWluZyBhc3N1bXB0aW9ucyAqKipBMeKAk0E0KioqLg0K