Data
data("sleep75")
sleepData <- sleep75
sleepData[is.na(sleepData)] <- 0
Basic Plots
We will create some basic plots to show the distribution and
relationships between variables
For this plot we can read, that the sleep time including naps doesn’t
correlate with how much that person is getting paid.

From this plot we can read, that number of hours that someone is
working isn’t correlated to how much they are sleeping. Only in extreme
cases we can observe, that if someone is working much more per week,
then he is sleeping much less. It doesn’t work in other way, because
people that aren’t working at all vary a lot in time they sleep.

For this boxplot we can observe that black people were earning less
money on average than white people

From this plot we can learn the distribution of hourly wage and we
can see that most of them are between 0k and 10k

From this plot we can observe how many are there construction workers
and cleric workers and if they are union members or not. We can see that
most of the workers are not members of the union, and there are about 4
times more construction workers than cleric workers

We can see that people who are not married have a greater spread in
the hours of sleep per week, and single cases sleep even less than 20
hours. On the other hand, married people usually sleep more, and a much
higher percentage of married than not married people sleep slightly less
than 60 hours a week.

Correlation coefficients - Pearson’s linear correlation
The correlation coefficient between log hourly wage and sleep is
-0.067. Since the correlation coefficient is close to zero, it suggests
a weak linear relationship between the two variables. The negative sign
indicates a negative correlation, meaning that as log hourly wage
increases, sleep tends to decrease slightly. However, the correlation is
weak, indicating that the relationship between the two variables is not
strong.
## [1] -0.05782671
Rank correlation
Linear regression model
The intercept is -3.76664, indicating the expected average hourly
wage when all other predictor variables are zero. For each additional
year of education, the hourly wage is expected to increase by 0.39862
units. For each additional year of age, the hourly wage is expected to
increase by 0.06090 units. Males have, on average, a higher hourly wage
by 2.61621 units compared to females. All predictor variables
(education, age, and gender) are highly significant (p < 0.001),
indicating their impact on the hourly wage. The residual standard error
is 3.278, representing the average amount of error in the predicted
hourly wage. The multiple R-squared value is 0.2213, indicating that
approximately 22.13% of the variance in the hourly wage can be explained
by the predictors in the model. The F-statistic is 50.01 with a very low
p-value, indicating that the model as a whole is highly significant.
##
## Call:
## lm(formula = sleepData$hrwage ~ sleepData$educ + sleepData$age +
## sleepData$male, data = sleepData)
##
## Residuals:
## Min 1Q Median 3Q Max
## -6.1912 -2.2867 -0.1266 1.6524 29.7388
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -1.16071 0.95348 -1.217 0.2239
## sleepData$educ 0.24322 0.05251 4.632 4.32e-06 ***
## sleepData$age 0.02333 0.01289 1.810 0.0707 .
## sleepData$male 1.72391 0.28441 6.061 2.20e-09 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 3.739 on 702 degrees of freedom
## Multiple R-squared: 0.08059, Adjusted R-squared: 0.07666
## F-statistic: 20.51 on 3 and 702 DF, p-value: 9.492e-13
The intercept is 3285.21, which represents the expected average sleep
duration when all other predictors are zero. For each unit increase in
the smsa variable, sleep duration is expected to decrease by 51.63
units. However, this effect is not statistically significant (p =
0.1435). A one-unit increase in the inlf variable is associated with a
decrease in sleep duration by 36.10 units, but this effect is also not
statistically significant (p = 0.3534). A one-unit increase in construc
is associated with an increase in sleep duration by 133.05 units.
However, this effect is not statistically significant (p = 0.2393).
Similarly, a one-unit increase in clerical is associated with an
increase in sleep duration by 78.44 units, but this effect is not
statistically significant (p = 0.1202). A one-unit increase in black is
associated with a decrease in sleep duration by 72.55 units, although
this effect is not statistically significant (p = 0.3485). A one-unit
increase in south is associated with an increase in sleep duration by
77.49 units, and this effect approaches statistical significance (p =
0.0833). The overall model has limited explanatory power, as indicated
by the low R-squared values. Only about 1.57% of the variability in
sleep duration can be explained by the predictors included in the model.
The F-statistic of 1.86 with a p-value of 0.08517 suggests that the
model’s overall fit is not statistically significant.
##
## Call:
## lm(formula = sleepData$sleep ~ sleepData$smsa + sleepData$inlf +
## sleepData$construc + sleepData$clerical + sleepData$black +
## sleepData$south, data = sleepData)
##
## Residuals:
## Min 1Q Median 3Q Max
## -2548.51 -252.62 5.52 262.26 1367.46
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 3285.21 38.40 85.560 <2e-16 ***
## sleepData$smsa -51.63 35.26 -1.464 0.1435
## sleepData$inlf -36.10 38.87 -0.929 0.3534
## sleepData$construc 133.05 112.97 1.178 0.2393
## sleepData$clerical 78.44 50.41 1.556 0.1202
## sleepData$black -72.55 77.33 -0.938 0.3485
## sleepData$south 77.49 44.68 1.734 0.0833 .
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 442.8 on 699 degrees of freedom
## Multiple R-squared: 0.01572, Adjusted R-squared: 0.007269
## F-statistic: 1.86 on 6 and 699 DF, p-value: 0.08517
Nonlinear regression model
## [1] 1402.67
Most of responses are accumulated in a quite close area to the
prediction line. We can observe few outliers. To sum up prediction model
is more less accurate.
##
## Call:
## lm(formula = totwrk ~ sleep + I(sleep^2), data = sleep1)
##
## Residuals:
## Min 1Q Median 3Q Max
## -2272.1 -561.0 82.7 568.3 3181.2
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 3.756e+03 9.071e+02 4.141 4.03e-05 ***
## sleep -1.809e-01 5.746e-01 -0.315 0.753
## I(sleep^2) -9.565e-05 9.143e-05 -1.046 0.296
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 882.4 on 526 degrees of freedom
## Multiple R-squared: 0.1361, Adjusted R-squared: 0.1328
## F-statistic: 41.43 on 2 and 526 DF, p-value: < 2.2e-16
In the first (left top corner) plot we can obsere accummulation of
results between 1500 and 2250, and residuals hestitate from -2000 up to
1500. Some outlyers are being observed. In the second plot (right to the
first) we can see that predictions are strongly related to the results.
In the third plot( left-bottom) whole resultsare accumulated in one area
similairly to the first plot The last plot presents data completely
different than the prediction was settled, whole results are accumulated
on the left side of the plot between -3.0 and 2.0 Residuals.
par(mfrow = c(2,2))
plot(model3)

Correlation plot
From this correlation plot we can see that there is a strong
correlation where there are red and blue squares. leis1, leis2 and leis3
are strongly related to totwtk and worknrm, and for example totwrk to
worknrm. Blue means that the two variables under consideration vary in
the same direction, i.e., if a variable increases the other one
increases and if one decreases the other one decreases as well. Red
means that is, if a variable increases the other decreases and vice
versa
## corrplot 0.92 loaded

LS0tCnRpdGxlOiAiQWRkaXRpb25hbCBhc3NpZ25tZW50LCBTbGVlcCBhbmQgdGhlIGFsbG9jYXRpb24gb2YgdGltZSIKZGF0ZTogImByIFN5cy5EYXRlKClgIgphdXRob3I6ICJKYW4gUGFzdHVjaGEgMTkzNjYyLCBLYW1pbCBIYWpkdWsgMTkzMzc1LCBNYWNpZWogU3phcnBhayAxOTM1NzgiCm91dHB1dDoKICBodG1sX2RvY3VtZW50OiAKICAgIHRoZW1lOiBjZXJ1bGVhbgogICAgaGlnaGxpZ2h0OiB0ZXh0bWF0ZQogICAgZm9udHNpemU6IDEwcHQKICAgIHRvYzogeWVzCiAgICBjb2RlX2Rvd25sb2FkOiB5ZXMKICAgIHRvY19mbG9hdDoKICAgICAgY29sbGFwc2VkOiBubwogICAgZGZfcHJpbnQ6IGRlZmF1bHQKICAgIHRvY19kZXB0aDogNQplZGl0b3Jfb3B0aW9uczogCiAgbWFya2Rvd246IAogICAgd3JhcDogNzIKLS0tCgpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRX0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBUUlVFKQpsaWJyYXJ5KHRpZHlyKQpsaWJyYXJ5KHdvb2xkcmlkZ2UpCmxpYnJhcnkoZ2dwbG90MikKbGlicmFyeShwbG90bHkpCmBgYAoKIyMgRGF0YQoKYGBge3IgbG9hZC1kYXRhfQpkYXRhKCJzbGVlcDc1IikKc2xlZXBEYXRhIDwtIHNsZWVwNzUKc2xlZXBEYXRhW2lzLm5hKHNsZWVwRGF0YSldIDwtIDAKYGBgCgojIyBCYXNpYyBQbG90cwoKV2Ugd2lsbCBjcmVhdGUgc29tZSBiYXNpYyBwbG90cyB0byBzaG93IHRoZSBkaXN0cmlidXRpb24gYW5kIHJlbGF0aW9uc2hpcHMgYmV0d2VlbiB2YXJpYWJsZXMKCkZvciB0aGlzIHBsb3Qgd2UgY2FuIHJlYWQsIHRoYXQgdGhlIHNsZWVwIHRpbWUgaW5jbHVkaW5nIG5hcHMgZG9lc24ndCBjb3JyZWxhdGUgd2l0aCBob3cgbXVjaCB0aGF0IHBlcnNvbiBpcyBnZXR0aW5nIHBhaWQuCmBgYHtyIGVjaG89RkFMU0V9CmdncGxvdChkYXRhPXNsZWVwRGF0YSwgYWVzKHNsZWVwRGF0YSRzbHBuYXBzIC8gNjAgLHNsZWVwRGF0YSRocndhZ2UpKSArCiAgZ2VvbV9wb2ludCgpICsKICBsYWJzKHRpdGxlID0gIldhZ2UgYmFzZWQgb24gd2Vla2x5IHNsZWVwIHRpbWUiLCB4ID0gIldlZWtseSBzbGVlcCB0aW1lIGluIGhvdXJzIGluY2x1ZGluZyBuYXBzIiwgeSA9ICJIb3VybHkgd2FnZSIpCmBgYAoKRnJvbSB0aGlzIHBsb3Qgd2UgY2FuIHJlYWQsIHRoYXQgbnVtYmVyIG9mIGhvdXJzIHRoYXQgc29tZW9uZSBpcyB3b3JraW5nIGlzbid0IGNvcnJlbGF0ZWQgdG8gaG93IG11Y2ggdGhleSBhcmUgc2xlZXBpbmcuIE9ubHkgaW4gZXh0cmVtZSBjYXNlcyB3ZSBjYW4gb2JzZXJ2ZSwgdGhhdCBpZiBzb21lb25lIGlzIHdvcmtpbmcgbXVjaCBtb3JlIHBlciB3ZWVrLCB0aGVuIGhlIGlzIHNsZWVwaW5nIG11Y2ggbGVzcy4gSXQgZG9lc24ndCB3b3JrIGluIG90aGVyIHdheSwgYmVjYXVzZSBwZW9wbGUgdGhhdCBhcmVuJ3Qgd29ya2luZyBhdCBhbGwgdmFyeSBhIGxvdCBpbiB0aW1lIHRoZXkgc2xlZXAuCmBgYCB7ciBlY2hvPUZBTFNFfQpnZ3Bsb3QoZGF0YT1zbGVlcERhdGEsIGFlcyhzbGVlcERhdGEkdG90d3JrIC8gNjAsc2xlZXBEYXRhJHNscG5hcHMgLyA2MCkpICsKICBnZW9tX3BvaW50KCkgKwogIGxhYnModGl0bGUgPSAiU2xlZXAgdGltZSBiYXNlZCBvbiBob3VycyB3b3JrZWQgaW4gd2VlayIsIHggPSAiSG91cnMgd29ya2VkIGluIHdlZWsiLCB5ID0gIlNsZWVwIHRpbWUgaW5jbHVkaW5nIG5hcHMiKQpgYGAKCkZvciB0aGlzIGJveHBsb3Qgd2UgY2FuIG9ic2VydmUgdGhhdCBibGFjayBwZW9wbGUgd2VyZSBlYXJuaW5nIGxlc3MgbW9uZXkgb24gYXZlcmFnZSB0aGFuIHdoaXRlIHBlb3BsZQpgYGAge3IgZWNobyA9IEZBTFNFfQpib3hwbG90KHNsZWVwRGF0YSRlYXJuczc0fnNsZWVwRGF0YSRibGFjaywgbWFpbiA9ICJNZWFuIHRvdGFsIGVhcm5pbmdzIGluIDE5NzQiLAp4bGFiID0gIlRvdGFsIGVhcm5pbmdzIGluIFVTRCIsCnlsYWIgPSAiSXMgYmxhY2siLApjb2wgPSAib3JhbmdlIiwKYm9yZGVyID0gImJyb3duIiwKaG9yaXpvbnRhbCA9IFRSVUUpCmBgYAoKRnJvbSB0aGlzIHBsb3Qgd2UgY2FuIGxlYXJuIHRoZSBkaXN0cmlidXRpb24gb2YgaG91cmx5IHdhZ2UgYW5kIHdlIGNhbiBzZWUgdGhhdCBtb3N0IG9mIHRoZW0gYXJlIGJldHdlZW4gMGsgYW5kIDEwawpgYGAge3IgZWNobyA9IEZBTFNFfQpnZ3Bsb3QoZGF0YSA9IHNsZWVwRGF0YSwgYWVzKHggPSBocndhZ2UpKSArCiAgZ2VvbV9oaXN0b2dyYW0oYmlud2lkdGggPSAxLCBmaWxsID0gImxpZ2h0Ymx1ZSIsIGNvbG9yID0gImJsYWNrIikgKwogIGxhYnModGl0bGUgPSAiRGlzdHJpYnV0aW9uIG9mIEhvdXJseSBXYWdlIiwKICAgICAgIHggPSAiSG91cmx5IFdhZ2UiLAogICAgICAgeSA9ICJGcmVxdWVuY3kiKQpgYGAKCkZyb20gdGhpcyBwbG90IHdlIGNhbiBvYnNlcnZlIGhvdyBtYW55IGFyZSB0aGVyZSBjb25zdHJ1Y3Rpb24gd29ya2VycyBhbmQgY2xlcmljIHdvcmtlcnMgYW5kIGlmIHRoZXkgYXJlIHVuaW9uIG1lbWJlcnMgb3Igbm90LiBXZSBjYW4gc2VlIHRoYXQgbW9zdCBvZiB0aGUgd29ya2VycyBhcmUgbm90IG1lbWJlcnMgb2YgdGhlIHVuaW9uLCBhbmQgdGhlcmUgYXJlIGFib3V0IDQgdGltZXMgbW9yZSBjb25zdHJ1Y3Rpb24gd29ya2VycyB0aGFuIGNsZXJpYyB3b3JrZXJzCmBgYCB7ciBlY2hvID0gRkFMU0V9CiMgU3RhY2tlZCBiYXIgcGxvdCBvZiB1bmlvbiBtZW1iZXJzaGlwIGJ5IGluZHVzdHJ5IChjbGVyaWNhbCB2cy4gY29uc3RydWN0aW9uKSBhbmQgZ2VuZGVyCmdncGxvdChkYXRhID0gc2xlZXBEYXRhLCBhZXMoeCA9IGZhY3RvcihjbGVyaWNhbCksIGZpbGwgPSBmYWN0b3IodW5pb24pKSkgKwogIGdlb21fYmFyKCkgKwogIGxhYnModGl0bGUgPSAiVW5pb24gTWVtYmVyc2hpcCBieSBJbmR1c3RyeSBhbmQgR2VuZGVyIiwKICAgICAgIHggPSAiSW5kdXN0cnkiLAogICAgICAgeSA9ICJDb3VudCIpICsKICBzY2FsZV94X2Rpc2NyZXRlKGxhYmVscyA9IGMoIkNvbnN0cnVjdGlvbiB3b3JrZXIiLCAiQ2xlcmljYWwgd29ya2VyIikpICsKICBzY2FsZV9maWxsX2Rpc2NyZXRlKGxhYmVscyA9IGMoIk5vdCBhIFVuaW9uIE1lbWJlciIsICJVbmlvbiBNZW1iZXIiKSkKCmBgYAoKV2UgY2FuIHNlZSB0aGF0IHBlb3BsZSB3aG8gYXJlIG5vdCBtYXJyaWVkIGhhdmUgYSBncmVhdGVyIHNwcmVhZCBpbiB0aGUgaG91cnMgb2Ygc2xlZXAgcGVyIHdlZWssIGFuZCBzaW5nbGUgY2FzZXMgc2xlZXAgZXZlbiBsZXNzIHRoYW4gMjAgaG91cnMuIE9uIHRoZSBvdGhlciBoYW5kLCBtYXJyaWVkIHBlb3BsZSB1c3VhbGx5IHNsZWVwIG1vcmUsIGFuZCBhIG11Y2ggaGlnaGVyIHBlcmNlbnRhZ2Ugb2YgbWFycmllZCB0aGFuIG5vdCBtYXJyaWVkIHBlb3BsZSBzbGVlcCBzbGlnaHRseSBsZXNzIHRoYW4gNjAgaG91cnMgYSB3ZWVrLgpgYGAge3IgZWNobyA9IEZBTFNFfQpnZ3Bsb3QoZGF0YSA9IHNsZWVwRGF0YSwgYWVzKHggPSBmYWN0b3IobWFyciksIHkgPSBzbGVlcCAvIDYwKSkgKwogIGdlb21fdmlvbGluKCkgKwogIGxhYnModGl0bGUgPSAiVmlvbGluIFBsb3Qgb2YgU2xlZXAgRHVyYXRpb24gYnkgTWFyaXRhbCBTdGF0dXMiLAogICAgICAgeCA9ICJNYXJpdGFsIFN0YXR1cyIsCiAgICAgICB5ID0gIlNsZWVwIER1cmF0aW9uIChob3VycykiKSArCiAgc2NhbGVfeF9kaXNjcmV0ZShsYWJlbHMgPSBjKCJOb3QgTWFycmllZCIsICJNYXJyaWVkIikpCmBgYAoKIyMgQ29ycmVsYXRpb24gY29lZmZpY2llbnRzIC0gUGVhcnNvbidzIGxpbmVhciBjb3JyZWxhdGlvbgoKVGhlIGNvcnJlbGF0aW9uIGNvZWZmaWNpZW50IGJldHdlZW4gbG9nIGhvdXJseSB3YWdlIGFuZCBzbGVlcCBpcyAtMC4wNjcuIFNpbmNlIHRoZSBjb3JyZWxhdGlvbiBjb2VmZmljaWVudCBpcyBjbG9zZSB0byB6ZXJvLCBpdCBzdWdnZXN0cyBhIHdlYWsgbGluZWFyIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHRoZSB0d28gdmFyaWFibGVzLiBUaGUgbmVnYXRpdmUgc2lnbiBpbmRpY2F0ZXMgYSBuZWdhdGl2ZSBjb3JyZWxhdGlvbiwgbWVhbmluZyB0aGF0IGFzIGxvZyBob3VybHkgd2FnZSBpbmNyZWFzZXMsIHNsZWVwIHRlbmRzIHRvIGRlY3JlYXNlIHNsaWdodGx5LiBIb3dldmVyLCB0aGUgY29ycmVsYXRpb24gaXMgd2VhaywgaW5kaWNhdGluZyB0aGF0IHRoZSByZWxhdGlvbnNoaXAgYmV0d2VlbiB0aGUgdHdvIHZhcmlhYmxlcyBpcyBub3Qgc3Ryb25nLgpgYGAge3IgZWNobyA9IEZBTFNFfQpjb3Ioc2xlZXBEYXRhJGxocndhZ2UsIHNsZWVwRGF0YSRzbGVlcCwgbWV0aG9kPSJwZWFyc29uIikKYGBgCgoKCiMjIFJhbmsgY29ycmVsYXRpb24KCgojIExpbmVhciByZWdyZXNzaW9uIG1vZGVsClRoZSBpbnRlcmNlcHQgaXMgLTMuNzY2NjQsIGluZGljYXRpbmcgdGhlIGV4cGVjdGVkIGF2ZXJhZ2UgaG91cmx5IHdhZ2Ugd2hlbiBhbGwgb3RoZXIgcHJlZGljdG9yIHZhcmlhYmxlcyBhcmUgemVyby4gRm9yIGVhY2ggYWRkaXRpb25hbCB5ZWFyIG9mIGVkdWNhdGlvbiwgdGhlIGhvdXJseSB3YWdlIGlzIGV4cGVjdGVkIHRvIGluY3JlYXNlIGJ5IDAuMzk4NjIgdW5pdHMuIEZvciBlYWNoIGFkZGl0aW9uYWwgeWVhciBvZiBhZ2UsIHRoZSBob3VybHkgd2FnZSBpcyBleHBlY3RlZCB0byBpbmNyZWFzZSBieSAwLjA2MDkwIHVuaXRzLiBNYWxlcyBoYXZlLCBvbiBhdmVyYWdlLCBhIGhpZ2hlciBob3VybHkgd2FnZSBieSAyLjYxNjIxIHVuaXRzIGNvbXBhcmVkIHRvIGZlbWFsZXMuIEFsbCBwcmVkaWN0b3IgdmFyaWFibGVzIChlZHVjYXRpb24sIGFnZSwgYW5kIGdlbmRlcikgYXJlIGhpZ2hseSBzaWduaWZpY2FudCAocCA8IDAuMDAxKSwgaW5kaWNhdGluZyB0aGVpciBpbXBhY3Qgb24gdGhlIGhvdXJseSB3YWdlLiBUaGUgcmVzaWR1YWwgc3RhbmRhcmQgZXJyb3IgaXMgMy4yNzgsIHJlcHJlc2VudGluZyB0aGUgYXZlcmFnZSBhbW91bnQgb2YgZXJyb3IgaW4gdGhlIHByZWRpY3RlZCBob3VybHkgd2FnZS4gVGhlIG11bHRpcGxlIFItc3F1YXJlZCB2YWx1ZSBpcyAwLjIyMTMsIGluZGljYXRpbmcgdGhhdCBhcHByb3hpbWF0ZWx5IDIyLjEzJSBvZiB0aGUgdmFyaWFuY2UgaW4gdGhlIGhvdXJseSB3YWdlIGNhbiBiZSBleHBsYWluZWQgYnkgdGhlIHByZWRpY3RvcnMgaW4gdGhlIG1vZGVsLiBUaGUgRi1zdGF0aXN0aWMgaXMgNTAuMDEgd2l0aCBhIHZlcnkgbG93IHAtdmFsdWUsIGluZGljYXRpbmcgdGhhdCB0aGUgbW9kZWwgYXMgYSB3aG9sZSBpcyBoaWdobHkgc2lnbmlmaWNhbnQuCmBgYCB7ciBlY2hvID0gRkFMU0V9Cm1vZGVsMSA8LSBsbShzbGVlcERhdGEkaHJ3YWdlIH4gc2xlZXBEYXRhJGVkdWMgKyBzbGVlcERhdGEkYWdlICsgc2xlZXBEYXRhJG1hbGUsIGRhdGEgPSBzbGVlcERhdGEpCnN1bW1hcnkobW9kZWwxKQpgYGAKVGhlIGludGVyY2VwdCBpcyAzMjg1LjIxLCB3aGljaCByZXByZXNlbnRzIHRoZSBleHBlY3RlZCBhdmVyYWdlIHNsZWVwIGR1cmF0aW9uIHdoZW4gYWxsIG90aGVyIHByZWRpY3RvcnMgYXJlIHplcm8uIEZvciBlYWNoIHVuaXQgaW5jcmVhc2UgaW4gdGhlIHNtc2EgdmFyaWFibGUsIHNsZWVwIGR1cmF0aW9uIGlzIGV4cGVjdGVkIHRvIGRlY3JlYXNlIGJ5IDUxLjYzIHVuaXRzLiBIb3dldmVyLCB0aGlzIGVmZmVjdCBpcyBub3Qgc3RhdGlzdGljYWxseSBzaWduaWZpY2FudCAocCA9IDAuMTQzNSkuIEEgb25lLXVuaXQgaW5jcmVhc2UgaW4gdGhlIGlubGYgdmFyaWFibGUgaXMgYXNzb2NpYXRlZCB3aXRoIGEgZGVjcmVhc2UgaW4gc2xlZXAgZHVyYXRpb24gYnkgMzYuMTAgdW5pdHMsIGJ1dCB0aGlzIGVmZmVjdCBpcyBhbHNvIG5vdCBzdGF0aXN0aWNhbGx5IHNpZ25pZmljYW50IChwID0gMC4zNTM0KS4gQSBvbmUtdW5pdCBpbmNyZWFzZSBpbiBjb25zdHJ1YyBpcyBhc3NvY2lhdGVkIHdpdGggYW4gaW5jcmVhc2UgaW4gc2xlZXAgZHVyYXRpb24gYnkgMTMzLjA1IHVuaXRzLiBIb3dldmVyLCB0aGlzIGVmZmVjdCBpcyBub3Qgc3RhdGlzdGljYWxseSBzaWduaWZpY2FudCAocCA9IDAuMjM5MykuIFNpbWlsYXJseSwgYSBvbmUtdW5pdCBpbmNyZWFzZSBpbiBjbGVyaWNhbCBpcyBhc3NvY2lhdGVkIHdpdGggYW4gaW5jcmVhc2UgaW4gc2xlZXAgZHVyYXRpb24gYnkgNzguNDQgdW5pdHMsIGJ1dCB0aGlzIGVmZmVjdCBpcyBub3Qgc3RhdGlzdGljYWxseSBzaWduaWZpY2FudCAocCA9IDAuMTIwMikuIEEgb25lLXVuaXQgaW5jcmVhc2UgaW4gYmxhY2sgaXMgYXNzb2NpYXRlZCB3aXRoIGEgZGVjcmVhc2UgaW4gc2xlZXAgZHVyYXRpb24gYnkgNzIuNTUgdW5pdHMsIGFsdGhvdWdoIHRoaXMgZWZmZWN0IGlzIG5vdCBzdGF0aXN0aWNhbGx5IHNpZ25pZmljYW50IChwID0gMC4zNDg1KS4gQSBvbmUtdW5pdCBpbmNyZWFzZSBpbiBzb3V0aCBpcyBhc3NvY2lhdGVkIHdpdGggYW4gaW5jcmVhc2UgaW4gc2xlZXAgZHVyYXRpb24gYnkgNzcuNDkgdW5pdHMsIGFuZCB0aGlzIGVmZmVjdCBhcHByb2FjaGVzIHN0YXRpc3RpY2FsIHNpZ25pZmljYW5jZSAocCA9IDAuMDgzMykuIFRoZSBvdmVyYWxsIG1vZGVsIGhhcyBsaW1pdGVkIGV4cGxhbmF0b3J5IHBvd2VyLCBhcyBpbmRpY2F0ZWQgYnkgdGhlIGxvdyBSLXNxdWFyZWQgdmFsdWVzLiBPbmx5IGFib3V0IDEuNTclIG9mIHRoZSB2YXJpYWJpbGl0eSBpbiBzbGVlcCBkdXJhdGlvbiBjYW4gYmUgZXhwbGFpbmVkIGJ5IHRoZSBwcmVkaWN0b3JzIGluY2x1ZGVkIGluIHRoZSBtb2RlbC4gVGhlIEYtc3RhdGlzdGljIG9mIDEuODYgd2l0aCBhIHAtdmFsdWUgb2YgMC4wODUxNyBzdWdnZXN0cyB0aGF0IHRoZSBtb2RlbCdzIG92ZXJhbGwgZml0IGlzIG5vdCBzdGF0aXN0aWNhbGx5IHNpZ25pZmljYW50LgpgYGAge3IgZWNobyA9IEZBTFNFfQptb2RlbDIgPC0gbG0oc2xlZXBEYXRhJHNsZWVwIH4gc2xlZXBEYXRhJHNtc2EgKyBzbGVlcERhdGEkaW5sZiArIHNsZWVwRGF0YSRjb25zdHJ1YyArIHNsZWVwRGF0YSRjbGVyaWNhbCArIHNsZWVwRGF0YSRibGFjayArIHNsZWVwRGF0YSRzb3V0aCwgZGF0YSA9IHNsZWVwRGF0YSkKc3VtbWFyeShtb2RlbDIpCmBgYAojIE5vbmxpbmVhciByZWdyZXNzaW9uIG1vZGVsCgpgYGAge3IgZWNobyA9IEZBTFNFfQpzbXBfc2l6ZTwtZmxvb3IoMC43NSpucm93KHNsZWVwRGF0YSkpCnNsZWVwX2luZDwtc2FtcGxlKHNlcV9sZW4obnJvdyhzbGVlcERhdGEpKSwgc2l6ZT1zbXBfc2l6ZSkKc2xlZXAxPC1zbGVlcERhdGFbc2xlZXBfaW5kLCBdCnNsZWVwVGVzdDwtc2xlZXBEYXRhWy1zbGVlcF9pbmQsIF0KbW9kZWwzPC1sbSh0b3R3cmt+c2xlZXAsZGF0YT1zbGVlcDEpICNvbmx5IGZvciB0cmFpbmluZyBkYXRhc2V0CmBgYAoKYGBgIHtyIGVjaG8gPSBGQUxTRX0KbGlicmFyeShNZXRyaWNzKQpldmFsdWF0ZTwtcHJlZGljdChtb2RlbDMsIG5ld2RhdGE9c2xlZXBUZXN0KQpybXNlKGV2YWx1YXRlLHNsZWVwVGVzdCRzbGVlcCkKYGBgCk1vc3Qgb2YgcmVzcG9uc2VzIGFyZSBhY2N1bXVsYXRlZCBpbiBhIHF1aXRlIGNsb3NlIGFyZWEgdG8gdGhlIHByZWRpY3Rpb24gbGluZS4gV2UgY2FuIG9ic2VydmUgZmV3IG91dGxpZXJzLiBUbyBzdW0gdXAgcHJlZGljdGlvbiBtb2RlbCBpcyBtb3JlIGxlc3MgYWNjdXJhdGUuCmBgYCB7ciBlY2hvID0gRkFMU0V9Cm1vZGVsND1sbSh0b3R3cmt+c2xlZXArSShzbGVlcF4yKSxkYXRhPXNsZWVwMSkKICAgIHN1bW1hcnkobW9kZWw0KQogICAgc2xlZXBpbmcgPC0gZGF0YS5mcmFtZShzbGVlcCA9ICgxOjUwMDApLCB0b3R3cmsgPSBwcmVkaWN0KG1vZGVsNCwgZGF0YS5mcmFtZShzbGVlcCA9ICgxOjUwMDApKSkpCiAgICBwbG90X2x5KCkgJT4lIAogICAgICBhZGRfdHJhY2UoeD1+c2xlZXAsIHk9fnRvdHdyaywgdHlwZT0ic2NhdHRlciIsIG1vZGU9ImxpbmVzIiwgZGF0YSA9IHNsZWVwaW5nLCBuYW1lID0gIlByZWRpY3RlZCBWYWx1ZSIpICU+JQogICAgICBhZGRfdHJhY2UoeD1+c2xlZXAsIHk9fnRvdHdyaywgdHlwZT0ic2NhdHRlciIsIG1vZGU9Im1hcmtlcnMiLCBkYXRhID0gc2xlZXBUZXN0LCBuYW1lID0gIkFjdHVhbCBWYWx1ZSIpCmBgYApJbiB0aGUgZmlyc3QgKGxlZnQgdG9wIGNvcm5lcikgcGxvdCB3ZSBjYW4gb2JzZXJlIGFjY3VtbXVsYXRpb24gb2YgcmVzdWx0cyBiZXR3ZWVuIDE1MDAgYW5kIDIyNTAsIAphbmQgcmVzaWR1YWxzIGhlc3RpdGF0ZSBmcm9tIC0yMDAwIHVwIHRvIDE1MDAuIFNvbWUgb3V0bHllcnMgYXJlIGJlaW5nIG9ic2VydmVkLgpJbiB0aGUgc2Vjb25kIHBsb3QgKHJpZ2h0IHRvIHRoZSBmaXJzdCkgd2UgY2FuIHNlZSB0aGF0IHByZWRpY3Rpb25zIGFyZSBzdHJvbmdseSByZWxhdGVkIHRvIHRoZSByZXN1bHRzLgpJbiB0aGUgdGhpcmQgcGxvdCggbGVmdC1ib3R0b20pIHdob2xlIHJlc3VsdHNhcmUgYWNjdW11bGF0ZWQgaW4gb25lIGFyZWEgc2ltaWxhaXJseSB0byB0aGUgZmlyc3QgcGxvdCAKVGhlIGxhc3QgcGxvdCBwcmVzZW50cyBkYXRhIGNvbXBsZXRlbHkgZGlmZmVyZW50IHRoYW4gdGhlIHByZWRpY3Rpb24gd2FzIHNldHRsZWQsIHdob2xlIHJlc3VsdHMgYXJlIGFjY3VtdWxhdGVkIG9uIHRoZSBsZWZ0IHNpZGUgb2YgdGhlIHBsb3QgYmV0d2VlbiAtMy4wIGFuZCAyLjAgUmVzaWR1YWxzLgpgYGAge3IgZWNobyA9IFRSVUV9CnBhcihtZnJvdyA9IGMoMiwyKSkKcGxvdChtb2RlbDMpCmBgYAoKIyBDb3JyZWxhdGlvbiBwbG90CkZyb20gdGhpcyBjb3JyZWxhdGlvbiBwbG90IHdlIGNhbiBzZWUgdGhhdCB0aGVyZSBpcyBhIHN0cm9uZyBjb3JyZWxhdGlvbiB3aGVyZSB0aGVyZSBhcmUgcmVkIGFuZCBibHVlIHNxdWFyZXMuIGxlaXMxLCBsZWlzMiBhbmQgbGVpczMgYXJlIHN0cm9uZ2x5IHJlbGF0ZWQgdG8gdG90d3RrIGFuZCB3b3JrbnJtLCBhbmQgZm9yIGV4YW1wbGUgdG90d3JrIHRvIHdvcmtucm0uIEJsdWUgbWVhbnMgdGhhdCB0aGUgdHdvIHZhcmlhYmxlcyB1bmRlciBjb25zaWRlcmF0aW9uIHZhcnkgaW4gdGhlIHNhbWUgZGlyZWN0aW9uLCBpLmUuLCBpZiBhIHZhcmlhYmxlIGluY3JlYXNlcyB0aGUgb3RoZXIgb25lIGluY3JlYXNlcyBhbmQgaWYgb25lIGRlY3JlYXNlcyB0aGUgb3RoZXIgb25lIGRlY3JlYXNlcyBhcyB3ZWxsLiBSZWQgbWVhbnMgdGhhdCBpcywgaWYgYSB2YXJpYWJsZSBpbmNyZWFzZXMgdGhlIG90aGVyIGRlY3JlYXNlcyBhbmQgdmljZSB2ZXJzYQpgYGAge3IgZWNobyA9IEZBTFNFfQpsaWJyYXJ5KGNvcnJwbG90KQpjb3JycGxvdChjb3Ioc2xlZXBEYXRhKSwgbWV0aG9kID0gImNvbG9yIiwgb3JkZXI9ImFscGhhYmV0IiwgdHlwZT0idXBwZXIiLCBkaWFnPUZBTFNFKQpgYGA=