Data
This time we are going to use a typical credit scoring data with
predefined “default” variables and personal demografic and income data.
Please take a look closer at headers and descriptions of each
variable.
Scatterplots
First let’s visualize our quantitative relationships using
scatterplots.

Normalizing the skewed distribution of incomes using log &
Plot

Estimated Density Plotes
To see more closely if there any differences between those two
distributions adding their estimated density plots



Plots Together:

Giving Density Curves to Scatterplots

## `geom_smooth()` using formula = 'y ~ x'

Correlation coefficients - P.L correlation:
## [1] -0.02677729
Percentage of the explained variability:
## [1] 0.07170234
Difference between that one and the S-P coefficient:
## [1] 0.6018467
How can we interpret the obtained partial correlation coefficient?
What is the difference between that one and the semi-partial
coefficient:
## [1] 0.6018467
Rank correlation
For 2 different scales - like for example this pair of variables:
income vs. education levels - we cannot use Pearson’s coefficient. The
only possibility is to rank also incomes… and lose some more detailed
information about them.
First, let’s see boxplots of income by education levels.

Kendal’s coefficient of rank correlation:
#(robust for ties))
## [1] -0.01224209
Point-biserial correlation

Comparing QVar and DVar
## [1] -0.07096966
Eta Coefficient:
## [1] 0.708378
Correlation matrix

Correlation matrix with scatterplots
## Warning: `aes_string()` was deprecated in ggplot2 3.0.0.
## ℹ Please use tidy evaluation idioms with `aes()`.
## ℹ See also `vignette("ggplot2-in-packages")` for more information.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.
## [[1]]

##
## [[2]]

##
## [[3]]

##
## [[4]]

##
## [[5]]

##
## [[6]]

##
## [[7]]

## Warning in warn_if_args_exist(list(...)): Extra arguments: "aes_string" are
## being ignored. If these are meant to be aesthetics, submit them using the
## 'mapping' variable within ggpairs with ggplot2::aes or ggplot2::aes_string.

Exercise 1. Contingency analysis.
## Believe
## Gender Yes No
## Female 435 375
## Male 147 134

## Call: cohen.kappa1(x = x, w = w, n.obs = n.obs, alpha = alpha, levels = levels,
## w.exp = w.exp)
##
## Cohen Kappa and Weighted Kappa correlation coefficients and confidence boundaries
## lower estimate upper
## unweighted kappa -0.043 0.011 0.065
## weighted kappa -0.043 0.011 0.065
##
## Number of subjects = 1091
##
## Pearson's Chi-squared test with Yates' continuity correction
##
## data: dane
## X-squared = 0.11103, df = 1, p-value = 0.739
## Believe
## Gender Yes No
## Female 0.3987168 0.3437214
## Male 0.1347388 0.1228231
## [1] 0.01218871


Exercise 2. Contingency analysis for the ‘Titanic’ data.
Dropping rows:
# Function to Drop NA
titanic <- titanic %>% drop_na()
titanic$Status <- as.factor(titanic$Status)
titanic$Gender <- as.factor(titanic$Gender)
# Create Contingency Table and Perform Chi-Square Test
contingency_table <- table(titanic$Gender, titanic$Status)
chi_square_test <- chisq.test(contingency_table)
## Warning in chisq.test(contingency_table): Chi-squared approximation may be
## incorrect
Creating Contingency Table
Phi(contingency_table)
## [1] 0.5257638
ContCoef(contingency_table)
## [1] 0.4653638
CramerV(contingency_table)
## [1] 0.5257638
TschuprowT(contingency_table)
## [1] 0.4421129
Ploting mosaicplot:
mosaicplot(contingency_table)

Ploting bar plot:
barplot(contingency_table)
### According to the data, we can see it was better to be a woman.
LS0tDQp0aXRsZTogIkRlc2NyaXB0aXZlIFN0YXRpc3RpY3MiDQpzdWJ0aXRsZTogJ0JpdmFyaWF0ZSBBbmFseXNpcyAtIFJlcG9ydF80OiBSJw0KZGF0ZTogImByIFN5cy5EYXRlKClgIg0KYXV0aG9yOiAiTWFyaXVzeiBHb2RsZXdza2ksIElnbmFjeSBIaXJzeiwgSGFzYW4gQmFyxLHFnyBHw7ZrIg0Kb3V0cHV0OiANCiAgaHRtbF9kb2N1bWVudDoNCiAgICB0aGVtZTogY2VydWxlYW4NCiAgICBoaWdobGlnaHQ6IHRleHRtYXRlDQogICAgZm9udHNpemU6IDEwcHQNCiAgICB0b2M6IHllcw0KICAgIGNvZGVfZG93bmxvYWQ6IHllcw0KICAgIHRvY19mbG9hdDoNCiAgICAgIGNvbGxhcHNlZDogbm8NCiAgICBkZl9wcmludDogZGVmYXVsdA0KICAgIHRvY19kZXB0aDogNQ0KLS0tDQoNCmBgYHtyIHNldHVwLAltZXNzYWdlID0gRkFMU0UsCXdhcm5pbmcgPSBGQUxTRSwJaW5jbHVkZSA9IEZBTFNFfQ0KbGlicmFyeShkcGx5cikNCmxpYnJhcnkodGlkeXZlcnNlKQ0KbGlicmFyeShIU0FVUjMpDQpsaWJyYXJ5KGhhdmVuKQ0KbGlicmFyeShnZ3Bsb3QyKQ0KbGlicmFyeShncmlkRXh0cmEpDQpsaWJyYXJ5KHBwY29yKSAjIHRoaXMgcGFja2FnZSBjb21wdXRlcyBwYXJ0aWFsIGFuZCBzZW1pcGFydGlhbCBjb3JyZWxhdGlvbnMuDQpsaWJyYXJ5KGx0bSkgIyB0aGlzIHBhY2thZ2UgY29tcHV0ZXMgcG9pbnQtYmlzZXJpYWwgY29ycmVsYXRpb25zLg0KbGlicmFyeShkZXZ0b29scykgDQojaW5zdGFsbF9naXRodWIoIm1hcmtoZWNrbWFubi9yeW91cmVhZHkiKSAjIHBsZWFzZSBpbnN0YWxsIHBhY2thZ2UgInJ5b3VyZWFkeSIgZnJvbSBnaXRodWIhICh0aGVuICMgaXQpDQpsaWJyYXJ5KHJ5b3VyZWFkeSkgIyB0aGlzIHBhY2thZ2UgY29tcHV0ZXMgbm9ubGluZWFyICJldGEiIGNvcnJlbGF0aW9ucy4NCmxpYnJhcnkoR0dhbGx5KSAjIHRoaXMgcGFja2FnZSBjb21wdXRlcyBjb3JyZWxhdGlvbiBtYXRyaXguDQpsaWJyYXJ5KHBzeWNoKSAjIHRoaXMgcGFja2FnZSBjb21wdXRlcyBxdWFsaXRhdGl2ZSBjb3JyZWxhdGlvbnMuDQpsaWJyYXJ5KERlc2NUb29scykgIyB0aGlzIHBhY2thZ2UgY29tcHV0ZXMgcXVhbGl0YXRpdmUgY29ycmVsYXRpb25zLg0KYGBgDQoNCg0KDQojIyBEYXRhDQoNClRoaXMgdGltZSB3ZSBhcmUgZ29pbmcgdG8gdXNlIGEgdHlwaWNhbCBjcmVkaXQgc2NvcmluZyBkYXRhIHdpdGggcHJlZGVmaW5lZCAiZGVmYXVsdCIgdmFyaWFibGVzIGFuZCBwZXJzb25hbCBkZW1vZ3JhZmljIGFuZCBpbmNvbWUgZGF0YS4gUGxlYXNlIHRha2UgYSBsb29rIGNsb3NlciBhdCBoZWFkZXJzIGFuZCBkZXNjcmlwdGlvbnMgb2YgZWFjaCB2YXJpYWJsZS4NCg0KYGBge3IgbG9hZC1kYXRhLCB3YXJuaW5nPVRSVUUsIGluY2x1ZGU9RkFMU0V9DQpkb3dubG9hZC5maWxlKCJodHRwczovL2dpdGh1Yi5jb20va2ZsaXNpa293c2tpL2RzL2Jsb2IvbWFzdGVyL2JhbmtfZGVmYXVsdHMuc2F2P3Jhdz10cnVlIiwgZGVzdGZpbGUgPSJiYW5rX2RlZmF1bHRzLnNhdiIsbW9kZT0id2IiKQ0KYmFua19kZWZhdWx0cyA8LSByZWFkX3NhdigiYmFua19kZWZhdWx0cy5zYXYiKQ0KYmFuazwtbmEub21pdChiYW5rX2RlZmF1bHRzKQ0KYmFuayRkZWY8LWFzLmZhY3RvcihiYW5rJGRlZmF1bHQpDQpiYW5rJGVkdWM8LWFzLmZhY3RvcihiYW5rJGVkKQ0KYGBgDQoNCiMjIFNjYXR0ZXJwbG90cw0KDQpGaXJzdCBsZXQncyB2aXN1YWxpemUgb3VyIHF1YW50aXRhdGl2ZSByZWxhdGlvbnNoaXBzIHVzaW5nIHNjYXR0ZXJwbG90cy4gDQoNCmBgYHtyIGVjaG89RkFMU0UsIHdhcm5pbmc9VFJVRX0NCg0KcGxvdCh4ID0gYmFuayRpbmNvbWUsIHkgPSBiYW5rJGRlYnRpbmMsIG1haW4gPSAiSW5jb21lIHZzLiBEZWJ0IiwgeGxhYiA9ICJJbmNvbWUiLCB5bGFiID0gIkRlYnQiKQ0KDQpgYGANCg0KIyMgTm9ybWFsaXppbmcgdGhlIHNrZXdlZCBkaXN0cmlidXRpb24gb2YgaW5jb21lcyB1c2luZyBsb2cgJiBQbG90DQoNCmBgYHtyIGVjaG89RkFMU0UsIHdhcm5pbmc9VFJVRX0NCiMgQmFzaWMgc2NhdHRlciBwbG90IHdpdGggdGhlIGxvZyBvZiBpbmNvbWUNCmJhbmskbG9nX2luY29tZSA8LSBsb2coYmFuayRpbmNvbWUpDQpiYW5rJGxvZ19kZWJ0aW5jIDwtIGxvZyhiYW5rJGRlYnRpbmMpDQoNCnBsb3QoeCA9IGJhbmskbG9nX2luY29tZSwgeSA9IGJhbmskbG9nX2RlYnRpbmMsIG1haW4gPSAiTG9nYXJpdGhtaWMgSW5jb21lIHZzLiBMb2dhcml0aG1pYyBEZWJ0IEluY29tZSIsIHhsYWIgPSAiTG9nYXJpdGhtaWMgSW5jb21lIiwgeWxhYiA9ICJMb2dhcml0aG1pYyBEZWJ0IEluY29tZSIpDQpgYGANCg0KIyMgQ3JlYXRpbmcgYSBzY2F0dGVyIHBsb3Qgd2l0aCB0aGUgbG9nYXJpdGhtaWNhbGx5IHRyYW5zZm9ybWVkIGRhdGENCg0KYGBge3IgZWNobz1GQUxTRSwgd2FybmluZz1UUlVFfQ0KYmFuayRsb2dfaW5jb21lIDwtIGxvZyhiYW5rJGluY29tZSkNCmJhbmskbG9nX2RlYnRpbmMgPC0gbG9nKGJhbmskZGVidGluYykNCg0KcGxvdCh4ID0gYmFuayRsb2dfaW5jb21lLCB5ID0gYmFuayRsb2dfZGVidGluYywgbWFpbiA9ICJMb2dhcml0aG1pYyBJbmNvbWUgdnMuIExvZ2FyaXRobWljIERlYnQgSW5jb21lIiwgeGxhYiA9ICJMb2dhcml0aG1pYyBJbmNvbWUiLCB5bGFiID0gIkxvZ2FyaXRobWljIERlYnQgSW5jb21lIikNCg0KbG1fbW9kZWwgPC0gbG0obG9nX2RlYnRpbmMgfiBsb2dfaW5jb21lLCBkYXRhID0gYmFuaykNCmFibGluZShsbV9tb2RlbCwgY29sID0gInJlZCIpDQoNCmBgYA0KDQojIyBTY2F0dGVycGxvdHMgYnkgZ3JvdXBzDQoNCmBgYHtyIGVjaG89RkFMU0UsIHdhcm5pbmc9VFJVRX0NCg0KDQojIEdyb3VwaW5nIHRoZSBkYXRhIGJ5IGVkdWNhdGlvbiBsZXZlbA0KZ3JvdXBlZF9kYXRhIDwtIHNwbGl0KGJhbmssIGJhbmskZWR1YykNCg0KIyBDcmVhdGluZyBzZXBhcmF0ZSBzY2F0dGVycGxvdHMgZm9yIGVhY2ggZWR1Y2F0aW9uIGxldmVsDQpmb3IgKGkgaW4gMTpsZW5ndGgoZ3JvdXBlZF9kYXRhKSkgew0KICBwbG90KHggPSBncm91cGVkX2RhdGFbW2ldXSRsb2dfaW5jb21lLCB5ID0gZ3JvdXBlZF9kYXRhW1tpXV0kbG9nX2RlYnRpbmMsIA0KICAgICAgIG1haW4gPSBwYXN0ZSgiTG9nYXJpdGhtaWMgSW5jb21lIHZzLiBMb2dhcml0aG1pYyBEZWJ0IEluY29tZSAoRWR1Y2F0aW9uIExldmVsOiIsIG5hbWVzKGdyb3VwZWRfZGF0YSlbaV0sICIpIiksIA0KICAgICAgIHhsYWIgPSAiTG9nYXJpdGhtaWMgSW5jb21lIiwgeWxhYiA9ICJMb2dhcml0aG1pYyBEZWJ0IEluY29tZSIpDQogIGxtX21vZGVsIDwtIGxtKGxvZ19kZWJ0aW5jIH4gbG9nX2luY29tZSwgZGF0YSA9IGdyb3VwZWRfZGF0YVtbaV1dKQ0KICBhYmxpbmUobG1fbW9kZWwsIGNvbCA9ICJyZWQiKQ0KfQ0KDQpgYGANCg0KIyMgRXN0aW1hdGVkIERlbnNpdHkgUGxvdGVzDQpUbyBzZWUgbW9yZSBjbG9zZWx5IGlmIHRoZXJlIGFueSBkaWZmZXJlbmNlcyBiZXR3ZWVuIHRob3NlIHR3byBkaXN0cmlidXRpb25zIGFkZGluZyB0aGVpciBlc3RpbWF0ZWQgZGVuc2l0eSBwbG90cw0KDQpgYGB7ciBlY2hvPUZBTFNFLCB3YXJuaW5nPVRSVUV9DQojIHNjYXR0ZXIgcGxvdCBvZiB4IGFuZCB5IHZhcmlhYmxlcw0KIyBjb2xvdXIgYnkgZ3JvdXBzDQoNCg0KcGxvdCh4ID0gYmFuayRpbmNvbWUsIHkgPSBiYW5rJGRlYnRpbmMsIGNvbCA9IGJhbmskZWR1YywgDQogICAgIG1haW4gPSAiSW5jb21lIHZzLiBEZWJ0IEluY29tZSIsIA0KICAgICB4bGFiID0gIkluY29tZSIsIHlsYWIgPSAiRGVidCBJbmNvbWUiKQ0KDQoNCiMgTWFyZ2luYWwgZGVuc2l0eSBwbG90IG9mIGFnZSAodG9wIHBhbmVsKQ0KZGVuc2l0eV9hZ2UgPC0gZGVuc2l0eShiYW5rJGFnZSkNCnBsb3QoZGVuc2l0eV9hZ2UsIG1haW4gPSAiRGVuc2l0eSBQbG90IG9mIEFnZSIsIHhsYWIgPSAiQWdlIikNCg0KDQojIE1hcmdpbmFsIGRlbnNpdHkgcGxvdCBvZiB5IChyaWdodCBwYW5lbCkNCg0KZGVuc2l0eV95IDwtIGRlbnNpdHkoYmFua19kZWZhdWx0cyRhZ2UpDQpwbG90KGRlbnNpdHlfeSwgbWFpbiA9ICJEZW5zaXR5IFBsb3Qgb2YgWSIsIHhsYWIgPSAiWSIpDQoNCmBgYA0KDQojIyBQbG90cyBUb2dldGhlcjoNCg0KYGBge3IgZWNobz1GQUxTRSwgd2FybmluZz1UUlVFfQ0KDQojIFNldCB1cCB0aGUgbGF5b3V0DQpwYXIobWZyb3cgPSBjKDIsIDIpKSAgIyAyIHJvd3MsIDIgY29sdW1ucw0KDQojIFNjYXR0ZXIgcGxvdA0KcGxvdCh4ID0gYmFuayRpbmNvbWUsIHkgPSBiYW5rJGRlYnRpbmMsIGNvbCA9IGJhbmskZWR1YywgDQogICAgIG1haW4gPSAiSW5jb21lIHZzLiBEZWJ0IEluY29tZSIsIA0KICAgICB4bGFiID0gIkluY29tZSIsIHlsYWIgPSAiRGVidCBJbmNvbWUiKQ0KDQojIE1hcmdpbmFsIGRlbnNpdHkgcGxvdCBvZiBhZ2UgKHRvcCBwYW5lbCkNCmRlbnNpdHlfYWdlIDwtIGRlbnNpdHkoYmFuayRhZ2UpDQpwbG90KGRlbnNpdHlfYWdlLCBtYWluID0gIkRlbnNpdHkgUGxvdCBvZiBBZ2UiLCB4bGFiID0gIkFnZSIpDQoNCiMgQ3JlYXRlIHNwYWNlIGZvciB0aGUgdGhpcmQgcGxvdA0KcGxvdC5uZXcoKQ0KDQojIE1hcmdpbmFsIGRlbnNpdHkgcGxvdCBvZiB5IChyaWdodCBwYW5lbCkNCmRlbnNpdHlfeSA8LSBkZW5zaXR5KGJhbmtfZGVmYXVsdHMkYWdlKQ0KcGxvdChkZW5zaXR5X3ksIG1haW4gPSAiRGVuc2l0eSBQbG90IG9mIFkiLCB4bGFiID0gIlkiKQ0KDQoNCmBgYA0KDQojIyBHaXZpbmcgRGVuc2l0eSBDdXJ2ZXMgdG8gU2NhdHRlcnBsb3RzDQoNCmBgYHtyIGVjaG89RkFMU0UsIHdhcm5pbmc9VFJVRX0NCg0KI0knbSBub3Qgc3VyZSEhDQoNCiMgU2NhdHRlciBwbG90DQpwbG90KHggPSBiYW5rJGluY29tZSwgeSA9IGJhbmskZGVidGluYywgY29sID0gYmFuayRlZHVjLCANCiAgICAgbWFpbiA9ICJJbmNvbWUgdnMuIERlYnQgSW5jb21lIiwgDQogICAgIHhsYWIgPSAiSW5jb21lIiwgeWxhYiA9ICJEZWJ0IEluY29tZSIpDQoNCiMgQWRkIGRlbnNpdHkgcGxvdCBmb3IgaW5jb21lDQpsaW5lcyhkZW5zaXR5KGJhbmskaW5jb21lKSwgY29sID0gImJsdWUiKQ0KDQojIEFkZCBkZW5zaXR5IHBsb3QgZm9yIGRlYnRpbmMNCmxpbmVzKGRlbnNpdHkoYmFuayRkZWJ0aW5jKSwgY29sID0gInJlZCIpDQoNCiNBbHNvOg0KZ2dwbG90KGJhbmssIGFlcyh4ID0gaW5jb21lLCB5ID0gZGVidGluYywgY29sb3IgPSBmYWN0b3IoZWR1YykpKSArDQogIGdlb21fcG9pbnQoKSArDQogIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIsIHNlID0gRkFMU0UpICsgICMgQWRkIGxpbmVhciB0cmVuZCBsaW5lDQogIGxhYnModGl0bGUgPSAiSW5jb21lIHZzLiBEZWJ0IEluY29tZSIsDQogICAgICAgeCA9ICJJbmNvbWUiLCB5ID0gIkRlYnQgSW5jb21lIikgKw0KICBzY2FsZV9jb2xvcl9kaXNjcmV0ZShuYW1lID0gIkVkdWNhdGlvbiIpICsgICMgUmVuYW1lIGxlZ2VuZA0KICB0aGVtZV9taW5pbWFsKCkNCg0KYGBgDQoNCiMjIENvcnJlbGF0aW9uIGNvZWZmaWNpZW50cyAtIFAuTCBjb3JyZWxhdGlvbjoNCg0KDQpgYGB7ciBlY2hvPUZBTFNFLCB3YXJuaW5nPVRSVUV9DQoNCiMgQ2FsY3VsYXRlIFBlYXJzb24ncyBjb3JyZWxhdGlvbiBjb2VmZmljaWVudA0KY29ycmVsYXRpb24gPC0gY29yKHggPSBiYW5rJGluY29tZSwgeSA9IGJhbmskZGVidGluYywgbWV0aG9kID0gInBlYXJzb24iKQ0KDQojIFByaW50IHRoZSBjb3JyZWxhdGlvbiBjb2VmZmljaWVudA0KcHJpbnQoY29ycmVsYXRpb24pDQoNCg0KYGBgDQoNCiMjIFBlcmNlbnRhZ2Ugb2YgdGhlIGV4cGxhaW5lZCB2YXJpYWJpbGl0eToNCg0KYGBge3IgZWNobz1GQUxTRSwgd2FybmluZz1UUlVFfQ0KDQojIENhbGN1bGF0ZSBQZWFyc29uJ3MgY29ycmVsYXRpb24gY29lZmZpY2llbnQNCmNvcnJlbGF0aW9uIDwtIGNvcih4ID0gYmFuayRpbmNvbWUsIHkgPSBiYW5rJGRlYnRpbmMsIG1ldGhvZCA9ICJwZWFyc29uIikNCg0KIyBDYWxjdWxhdGUgdGhlIHBlcmNlbnRhZ2Ugb2YgZXhwbGFpbmVkIHZhcmlhYmlsaXR5DQpleHBsYWluZWRfdmFyaWFiaWxpdHkgPC0gY29ycmVsYXRpb25eMiAqIDEwMA0KDQojIHByaW50KGNvcnJlbGF0aW9uKQ0KDQojIFByaW50IHRoZSBwZXJjZW50YWdlIG9mIGV4cGxhaW5lZCB2YXJpYWJpbGl0eQ0KcHJpbnQoZXhwbGFpbmVkX3ZhcmlhYmlsaXR5KQ0KYGBgDQoNCiMjIERpZmZlcmVuY2UgYmV0d2VlbiB0aGF0IG9uZSBhbmQgdGhlIFMtUCBjb2VmZmljaWVudDoNCg0KYGBge3IgZWNobz1GQUxTRSwgd2FybmluZz1GQUxTRX0NCg0KIyBFbnN1cmUgdGhlcmUgYXJlIG5vIG1pc3NpbmcgdmFsdWVzIGluIHRoZSB2YXJpYWJsZXMNCmNvbXBsZXRlX2Nhc2VzIDwtIGNvbXBsZXRlLmNhc2VzKGJhbmskbG9nX2luY29tZSwgYmFuayRhZ2UsIGJhbmskZW1wbG95KQ0KbG9nX2luY29tZSA8LSBiYW5rJGxvZ19pbmNvbWVbY29tcGxldGVfY2FzZXNdDQphZ2UgPC0gYmFuayRhZ2VbY29tcGxldGVfY2FzZXNdDQp0ZW51cmUgPC0gYmFuayRlbXBsb3lbY29tcGxldGVfY2FzZXNdDQoNCiMgQ29tcHV0ZSBwYXJ0aWFsIGNvcnJlbGF0aW9uDQpwYXJ0aWFsX2NvcnIgPC0gcGNvci50ZXN0KGxvZ19pbmNvbWUsIGFnZSwgeSA9IHRlbnVyZSwgbWV0aG9kID0gInBlYXJzb24iKQ0KDQojIFByaW50IHRoZSBwYXJ0aWFsIGNvcnJlbGF0aW9uIGNvZWZmaWNpZW50DQpwcmludChwYXJ0aWFsX2NvcnIkZXN0aW1hdGUpDQoNCmBgYA0KDQpIb3cgY2FuIHdlIGludGVycHJldCB0aGUgb2J0YWluZWQgcGFydGlhbCBjb3JyZWxhdGlvbiBjb2VmZmljaWVudD8gV2hhdCBpcyB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoYXQgb25lIGFuZCB0aGUgc2VtaS1wYXJ0aWFsIGNvZWZmaWNpZW50Og0KDQpgYGB7ciBlY2hvPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KIyBDb21wdXRlIHNlbWktcGFydGlhbCBjb3JyZWxhdGlvbg0Kc2VtaV9wYXJ0aWFsX2NvcnIgPC0gcGNvci50ZXN0KGxvZ19pbmNvbWUsIGFnZSwgeCA9IHRlbnVyZSwgbWV0aG9kID0gInBlYXJzb24iKQ0KDQojIFByaW50IHRoZSBzZW1pLXBhcnRpYWwgY29ycmVsYXRpb24gY29lZmZpY2llbnQNCnByaW50KHNlbWlfcGFydGlhbF9jb3JyJGVzdGltYXRlKQ0KYGBgDQoNCiMjIFJhbmsgY29ycmVsYXRpb24gDQoNCkZvciAyIGRpZmZlcmVudCBzY2FsZXMgLSBsaWtlIGZvciBleGFtcGxlIHRoaXMgcGFpciBvZiB2YXJpYWJsZXM6IGluY29tZSB2cy4gZWR1Y2F0aW9uIGxldmVscyAtIHdlIGNhbm5vdCB1c2UgUGVhcnNvbidzIGNvZWZmaWNpZW50LiBUaGUgb25seSBwb3NzaWJpbGl0eSBpcyB0byByYW5rIGFsc28gaW5jb21lcy4uLiBhbmQgbG9zZSBzb21lIG1vcmUgZGV0YWlsZWQgaW5mb3JtYXRpb24gYWJvdXQgdGhlbS4gDQoNCkZpcnN0LCBsZXQncyBzZWUgYm94cGxvdHMgb2YgaW5jb21lIGJ5IGVkdWNhdGlvbiBsZXZlbHMuDQoNCmBgYHtyIGVjaG89RkFMU0UsIHdhcm5pbmc9VFJVRX0NCg0KYm94cGxvdChpbmNvbWUgfiBlZCwgZGF0YSA9IGJhbmssIA0KICAgICAgICBtYWluID0gIkluY29tZSBieSBFZHVjYXRpb24gTGV2ZWxzIiwNCiAgICAgICAgeGxhYiA9ICJFZHVjYXRpb24gTGV2ZWwiLCB5bGFiID0gIkluY29tZSIsDQogICAgICAgIGNvbCA9ICJsaWdodGJsdWUiKQ0KYGBgDQoNCiMjIEtlbmRhbCdzIGNvZWZmaWNpZW50IG9mIHJhbmsgY29ycmVsYXRpb246DQojKHJvYnVzdCBmb3IgdGllcykpDQpgYGB7ciBlY2hvPUZBTFNFLCB3YXJuaW5nPVRSVUV9DQojIENhbGN1bGF0ZSBLZW5kYWxsJ3MgY29lZmZpY2llbnQgb2YgcmFuayBjb3JyZWxhdGlvbg0Ka2VuZGFsbF9jb3JyIDwtIGNvcih4ID0gYmFuayRpbmNvbWUsIHk9YmFuayRkZWJ0aW5jLCBtZXRob2QgPSAia2VuZGFsbCIpDQoNCiMgUHJpbnQgdGhlIEtlbmRhbGwncyBjb2VmZmljaWVudCBvZiByYW5rIGNvcnJlbGF0aW9uDQpwcmludChrZW5kYWxsX2NvcnIpDQoNCmBgYA0KDQoNCiMjIFBvaW50LWJpc2VyaWFsIGNvcnJlbGF0aW9uDQoNCmBgYHtyIGVjaG89RkFMU0UsIHdhcm5pbmc9VFJVRX0NCg0KIyBEZWZpbmUgcmlza19zdGF0dXMgYmFzZWQgb24gZGVidGluYyB0aHJlc2hvbGRzDQpiYW5rJHJpc2tfc3RhdHVzIDwtIGlmZWxzZShiYW5rJGRlYnRpbmMgPD0gMTUsICdMb3cnLCAnSGlnaCcpDQoNCiMgQ3JlYXRlIHRoZSBib3hwbG90DQpsaWJyYXJ5KGdncGxvdDIpDQpnZ3Bsb3QoYmFuaywgYWVzKHg9cmlza19zdGF0dXMsIHk9aW5jb21lLCBmaWxsPXJpc2tfc3RhdHVzKSkgKw0KICBnZW9tX2JveHBsb3QoKSArDQogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcz1jKCJsaWdodGJsdWUiLCAibGlnaHRncmVlbiIpKSArICAjIEN1c3RvbSBjb2xvciBwYWxldHRlDQogIGxhYnModGl0bGU9J0luY29tZSBieSBSaXNrIFN0YXR1cycsIHg9J1Jpc2sgU3RhdHVzJywgeT0nSW5jb21lJykgKw0KICB0aGVtZV9taW5pbWFsKCkgKw0KICB0aGVtZShsZWdlbmQucG9zaXRpb249Im5vbmUiKSAgIyBSZW1vdmUgbGVnZW5kDQoNCiMgU2hvdyB0aGUgcGxvdA0KYGBgDQoNCiMjIENvbXBhcmluZyBRVmFyIGFuZCBEVmFyDQoNCmBgYHtyIGVjaG89RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQoNCiMgQ2FsY3VsYXRlIHRoZSBwb2ludC1iaXNlcmlhbCBjb3JyZWxhdGlvbiBjb2VmZmljaWVudA0KcG9pbnRfYmlzZXJpYWxfY29yciA8LSBjb3IoYmFuayRpbmNvbWUsIGJhbmskZGVmYXVsdCkNCg0KIyBQcmludCB0aGUgcG9pbnQtYmlzZXJpYWwgY29ycmVsYXRpb24gY29lZmZpY2llbnQNCnByaW50KHBvaW50X2Jpc2VyaWFsX2NvcnIpDQoNCmBgYA0KDQoNCiMjIEV0YSBDb2VmZmljaWVudDogDQoNCg0KYGBge3IgZWNobz1GQUxTRSwgd2FybmluZz1GQUxTRX0NCg0KIyBDYWxjdWxhdGUgUGVhcnNvbidzIGxpbmVhciBjb3JyZWxhdGlvbiBjb2VmZmljaWVudA0KcGVhcnNvbl9jb3JyIDwtIGNvcih4ID0gYmFuayRjcmVkZGVidCwgeT0gYmFuayRvdGhkZWJ0LCBtZXRob2QgPSAicGVhcnNvbiIpDQoNCiMgQ2FsY3VsYXRlIEtlbmRhbGwncyByYW5rIGNvcnJlbGF0aW9uIGNvZWZmaWNpZW50DQprZW5kYWxsX2NvcnIgPC0gY29yKHg9YmFuayRjcmVkZGVidCwgeT1iYW5rJG90aGRlYnQsIG1ldGhvZCA9ICJrZW5kYWxsIikNCg0KIyBDYWxjdWxhdGUgdGhlIGV0YSBjb2VmZmljaWVudA0KZXRhX2NvZWZmaWNpZW50IDwtIHNxcnQoMSAtIChrZW5kYWxsX2NvcnJeMiAvIHBlYXJzb25fY29ycl4yKSkNCg0KIyBQcmludCB0aGUgZXRhIGNvZWZmaWNpZW50DQpwcmludChldGFfY29lZmZpY2llbnQpDQoNCg0KYGBgDQoNCiMjIENvcnJlbGF0aW9uIG1hdHJpeA0KDQpgYGB7ciBlY2hvPUZBTFNFLCB3YXJuaW5nPVRSVUV9DQojIEVuc3VyaW5nIGFsbCB2YXJpYWJsZXMgYXJlIG51bWVyaWMNCm51bWVyaWNfY29sdW1ucyA8LSBiYW5rWywgc2FwcGx5KGJhbmssIGlzLm51bWVyaWMpXQ0KDQojIENhbGN1bGF0ZSB0aGUgY29ycmVsYXRpb24gbWF0cml4IGZvciBxdWFudGl0YXRpdmUgdmFyaWFibGVzDQpjb3JyZWxhdGlvbl9tYXRyaXggPC0gY29yKG51bWVyaWNfY29sdW1ucykNCg0KIyBQbG90IHRoZSBjb3JyZWxhdGlvbiBtYXRyaXgNCmdnY29ycihjb3JyZWxhdGlvbl9tYXRyaXgpDQpgYGANCiAgDQoNCiMjIENvcnJlbGF0aW9uIG1hdHJpeCB3aXRoIHNjYXR0ZXJwbG90cyANCg0KYGBge3IgZWNobz1GQUxTRSwgd2FybmluZz1UUlVFfQ0KDQojIE1ha2Ugc3VyZSB0aGUgJ2RlZmF1bHRfc3RhdHVzJyB2YXJpYWJsZSBleGlzdHMgYW5kIGlzIGEgZmFjdG9yDQpiYW5rJGRlZmF1bHQgPC0gYXMuZmFjdG9yKGJhbmskZGVmYXVsdCkNCg0KIyBQbG90IGRpc3RyaWJ1dGlvbnMgYnkgZ3JvdXANCnZhcmlhYmxlcyA8LSBjKCJhZ2UiLCAibG9nX2luY29tZSIsICJlbXBsb3kiLCAiYWRkcmVzcyIsICJkZWJ0aW5jIiwgImNyZWRkZWJ0IiwgIm90aGRlYnQiKQ0KDQoNCg0KcGxvdF9kaXN0cmlidXRpb24gPC0gZnVuY3Rpb24odmFyKSB7DQogIGdncGxvdChiYW5rLCBhZXNfc3RyaW5nKHggPSB2YXIsIGZpbGwgPSBiYW5rJGRlZmF1bHQpKSArDQogICAgZ2VvbV9kZW5zaXR5KGFscGhhID0gMC41KSArDQogICAgbGFicyh0aXRsZSA9IHBhc3RlKCJEaXN0cmlidXRpb24gb2YiLCB2YXIsICJieSBEZWZhdWx0IFN0YXR1cyIpKSArDQogICAgdGhlbWVfbWluaW1hbCgpDQp9DQoNCg0KZGlzdHJpYnV0aW9uX3Bsb3RzIDwtIGxhcHBseSh2YXJpYWJsZXMsIHBsb3RfZGlzdHJpYnV0aW9uKQ0KZGlzdHJpYnV0aW9uX3Bsb3RzDQoNCg0KIyBDcmVhdGUgdGhlIGdncGFpcnMgcGxvdA0KZ2dwYWlycyhiYW5rLCANCiAgICAgICAgY29sdW1ucyA9IDE6NywgDQogICAgICAgIG1hcHBpbmcgPSBhZXMoY29sb3IgPSBkZWZhdWx0KSwgDQogICAgICAgIHVwcGVyID0gbGlzdChjb250aW51b3VzID0gd3JhcCgic21vb3RoIiwgbWV0aG9kID0gImxtIikpLCANCiAgICAgICAgbG93ZXIgPSBsaXN0KGNvbnRpbnVvdXMgPSAicG9pbnRzIiksIA0KICAgICAgICBhZXNfc3RyaW5nID0gbGlzdChjb250aW51b3VzID0gImRlbnNpdHkiKSkgKyANCiAgICAgICAgdGhlbWVfbWluaW1hbCgpICsNCiAgICAgICAgbGFicyh0aXRsZSA9ICJTY2F0dGVycGxvdCBNYXRyaXggd2l0aCBDb3JyZWxhdGlvbiBhbmQgVHJlbmRzIGJ5IERlZmF1bHQgU3RhdHVzIikNCg0KYGBgDQoNCg0KIyMgRXhlcmNpc2UgMS4gQ29udGluZ2VuY3kgYW5hbHlzaXMuDQoNCg0KDQpgYGB7ciBlY2hvPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KeD1jKDQzNSwxNDcsMzc1LDEzNCkNCmRpbSh4KT1jKDIsMikNCmRhbmU8LWFzLnRhYmxlKHgpDQpkaW1uYW1lcyhkYW5lKT1saXN0KEdlbmRlcj1jKCdGZW1hbGUnLCdNYWxlJyksQmVsaWV2ZT1jKCdZZXMnLCdObycpKQ0KZGFuZQ0KZm91cmZvbGRwbG90KGRhbmUpDQpgYGANCg0KDQoNCmBgYHtyIGVjaG89RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQp5ZXM8LWMoNDM1LDE0NykNCm5vPC1jKDM3NSwxMzQpDQpjb2hlbi5rYXBwYShjYmluZCh5ZXMsbm8pKQ0KY2hpc3EudGVzdChkYW5lKQ0KcHJvcC50YWJsZShkYW5lKQ0KYGBgDQoNCg0KYGBge3IgZWNobz1GQUxTRSwgd2FybmluZz1GQUxTRX0NClBoaShkYW5lKQ0KIz9Db250Q29lZg0KI0NvbnRDb2VmKGRhbmUpDQojQ3JhbWVyVihkYW5lKQ0KI1RzY2h1cHJvd1QoZGFuZSkNCm1vc2FpY3Bsb3QoZGFuZSkNCmJhcnBsb3QoZGFuZSkNCmBgYA0KDQoNCiMjIEV4ZXJjaXNlIDIuIENvbnRpbmdlbmN5IGFuYWx5c2lzIGZvciB0aGUgJ1RpdGFuaWMnIGRhdGEuDQoNCg0KYGBge3IgbG9hZC1kYXRhMiwgd2FybmluZz1UUlVFLCBpbmNsdWRlPUZBTFNFfQ0KZG93bmxvYWQuZmlsZSgiaHR0cHM6Ly9naXRodWIuY29tL2tmbGlzaWtvd3NraS9kcy9ibG9iL21hc3Rlci90aXRhbmljLmNzdj9yYXc9dHJ1ZSIsIGRlc3RmaWxlID0idGl0YW5pYy5jc3YiLG1vZGU9IndiIikNCnRpdGFuaWMgPC0gcmVhZC5jc3YoInRpdGFuaWMuY3N2Iixyb3cubmFtZXM9MSxzZXA9IjsiKQ0KYGBgDQoNCkRyb3BwaW5nIHJvd3M6DQpgYGB7cn0NCiMgRnVuY3Rpb24gdG8gRHJvcCBOQQ0KdGl0YW5pYyA8LSB0aXRhbmljICU+JSBkcm9wX25hKCkNCg0KdGl0YW5pYyRTdGF0dXMgPC0gYXMuZmFjdG9yKHRpdGFuaWMkU3RhdHVzKQ0KdGl0YW5pYyRHZW5kZXIgPC0gYXMuZmFjdG9yKHRpdGFuaWMkR2VuZGVyKQ0KDQojIENyZWF0ZSBDb250aW5nZW5jeSBUYWJsZSBhbmQgUGVyZm9ybSBDaGktU3F1YXJlIFRlc3QNCmNvbnRpbmdlbmN5X3RhYmxlIDwtIHRhYmxlKHRpdGFuaWMkR2VuZGVyLCB0aXRhbmljJFN0YXR1cykNCmNoaV9zcXVhcmVfdGVzdCA8LSBjaGlzcS50ZXN0KGNvbnRpbmdlbmN5X3RhYmxlKQ0KDQpgYGANCg0KQ3JlYXRpbmcgQ29udGluZ2VuY3kgVGFibGUNCmBgYHtyfQ0KUGhpKGNvbnRpbmdlbmN5X3RhYmxlKQ0KYGBgDQoNCmBgYHtyfQ0KQ29udENvZWYoY29udGluZ2VuY3lfdGFibGUpDQpgYGANCg0KYGBge3J9DQpDcmFtZXJWKGNvbnRpbmdlbmN5X3RhYmxlKQ0KYGBgDQoNCmBgYHtyfQ0KVHNjaHVwcm93VChjb250aW5nZW5jeV90YWJsZSkNCmBgYA0KDQpQbG90aW5nIG1vc2FpY3Bsb3Q6DQpgYGB7cn0NCm1vc2FpY3Bsb3QoY29udGluZ2VuY3lfdGFibGUpDQpgYGANCg0KUGxvdGluZyBiYXIgcGxvdDoNCmBgYHtyfQ0KYmFycGxvdChjb250aW5nZW5jeV90YWJsZSkNCmBgYA0KIyMjIEFjY29yZGluZyB0byB0aGUgZGF0YSwgd2UgY2FuIHNlZSBpdCB3YXMgYmV0dGVyIHRvIGJlIGEgd29tYW4u