Hypothese
H1: Es gibt einen Zusammmenhang zwischen der Studierbereitschaft vor dem Auslandsjahr und der Studierbereitschaft nach dem Auslandsjahr.
H0: Es gibt keinen Zusammmenhang zwischen der Studierbereitschaft vor dem Auslandsjahr und der Studierbereitschaft nach dem Auslandsjahr.
Alternativ
H0: Beide Variablen sind in der Grundgesamtheit unabhängig voneinander.
H1: Beide Variablen sind in der Grundgesamtheit abhängig voneinander
Vorausetzungen
Die Variablen sind kategorial (nominal- oder ordinalskaliert)
Datensatzgröße
Die Stichprobe ist > 50.
Ist dies nicht der Fall, so wird bei einer Stichprobe kleiner als 20 der exakte Test nach Fisher verwendet
bei einer Stichprobengröße zwischen 20 und 50 die Korrektur nach Yates.
Die erwarteten Zellhäufigkeiten sind > 5. Ist dies nicht der Fall, so wird der exakte Test nach Fisher verwendet.
Die Freiheitsgrade des Chi-Quadrat-Tests sind größer als 1. Ist dies nicht der Fall, so wird die Korrektur nach Yates verwendet.
Balkendiagramm
counts<- table(Vorher= chi$vorher, Nachher = chi$nachher)
barplot(counts, main="Balkendiagramm zur Studierbereitschaft",
col=c("deepskyblue","tomato"),
ylab="Anzahl Personen",xlab = "Studierbereitschaft",
beside=F,
sub = "Nachher",
#names.arg =c("VorH-NachH","VorN-NachH","VorH-NachN", "VorN-NachN"),
legend = rownames(counts),
args.legend = list(x = "topright", title="vorher"))

Sankey Diagram
Dieses Sankey Diagramme bietet sich an bei “vorher” - “nachher” - Darstellungen.
#install.packages("networkD3")
library(networkD3)
library(dplyr)
links <- data.frame(
source=c("hoch_v","hoch_v", "niedrig_v", "niedrig_v"),
target=c("hoch_n","niedrig_n","hoch_n","niedrig_n"),
value=c(6,9, 25, 5)
)
# From these flows we need to create a node data frame: it lists every entities involved in the flow
nodes <- data.frame(
name=c(as.character(links$source),
as.character(links$target)) %>% unique()
)
# With networkD3, connection must be provided using id, not using real name like in the links dataframe.. So we need to reformat it.
links$IDsource <- match(links$source, nodes$name)-1
links$IDtarget <- match(links$target, nodes$name)-1
# Make the Network
p <- sankeyNetwork(Links = links, Nodes = nodes,
Source = "IDsource",
Target = "IDtarget",
Value = "value",
NodeID = "name",
iterations = 0,
nodeWidth=40, fontSize=13,
sinksRight=TRUE)
p
Kreuztabelle und beobachteten Werte
counts<- table( Vorher=chi$vorher, Nachher = chi$nachher)
head(counts)
Nachher
Vorher hoch niedrig
hoch 6 9
niedrig 25 5
Die Tabelle wurde angelegt.
Erwarteten Werte
ch <- chisq.test(counts, correct = F)
round(ch$expected,2)
Nachher
Vorher hoch niedrig
hoch 10.33 4.67
niedrig 20.67 9.33
Die beobachteten und die erwarteten Werte wurden verglichen. Es zeigen sich für das Beispiel einen Unterschiede. Ob es jedoch signifikant sind, wird mittels Chi-Quadrat-Test geprüft.
Ergebnis zum \(\chi^2\) und Prüfung der Signifikanz
Berechnung der Freiheitsgrade
\[df= (k_1 -1)\cdot (k_2 -1)\] mit
\(k_1\) = die Faktorstufen der ersten Variable
\(k_2\) = die Faktorstufen der zweiten Variable
\[df= (2 -1)\cdot (2 -1) = 1\]
Fall 1 |
- |
- |
Fall 2 |
- |
+ |
Fall 3 |
+ |
- |
Fall 4 |
+ |
+ |
Fall 1
\[\chi^2 = \sum^I_{i=1}\sum^J_{j=1}\frac{(f_{ij}-f^{'}_{ij})^2}{f^{'}_{ij}} =\frac{(6-10.33)^2}{10.33}+ \frac{(25-20.67)^2}{20.67}+\frac{(9-4.67)^2}{4.67}+\frac{(5-9.33)^2}{9.33}=8.7\]
round(((6-10.33)^2/10.33)+((25-20.67)^2/20.67)+((9-4.67)^2/4.67)+((5-9.33)^2/9.33), 1)
[1] 8.7
keine Anpassung erforderlich
ch <- chisq.test(counts, correct = F) # correct = F ohne Anpassungen - die "normale" Formel
ch
Pearson's Chi-squared test
data: counts
X-squared = 8.7615, df = 1, p-value = 0.003077
Bericht:(Chi-Quadrat(1) = 8.7615, p = .003077)
Fall 2
Anpassung: Korrektur nach Yates
\[\chi^2 = \sum^I_{i=1}\sum^J_{j=1}\frac{(\Bigl| f_{ij}-f^{'}_{ij}\Bigl| -0.5)^2}{f^{'}_{ij}} = \\
\frac{(\Bigl| (6-10.33)\Bigl| -0.5)^2}{10.33} +\frac{(\Bigl| (25-20.67)\Bigl| -0.5)^2}{20.67} + \\
\frac{(\Bigl| ((9-4.67)\Bigl| -0.5)^2}{4.67} +\frac{(\Bigl| (5-9.33)\Bigl| -0.5)^2}{9.33} = 6.8\]
round(
(((abs(6-10.33))-0.5)^2/10.33)+
(((abs(25-20.67))-0.5)^2/20.67)+
(((abs(9-4.67))-0.5)^2/4.67)+
(((abs(5-9.33))-0.5)^2/9.33)
,2)
[1] 6.84
ch <- chisq.test(counts, correct = TRUE) # Die Anpassung nach Yates - correct = TRUE - Die Formel wird um -0.5 erweitert
ch
Pearson's Chi-squared test with Yates' continuity correction
data: counts
X-squared = 6.8563, df = 1, p-value = 0.008833
Bericht:(Chi-Quadrat(1) = 6.8563, p = .008833)
Fall 3
Anpassung: Fisher’s Exact Test
ch <- chisq.test(counts, correct = F)
ch
Pearson's Chi-squared test
data: counts
X-squared = 8.7615, df = 1, p-value = 0.003077
fisher.test(counts)
Fisher's Exact Test for Count Data
data: counts
p-value = 0.005673
alternative hypothesis: true odds ratio is not equal to 1
95 percent confidence interval:
0.02562454 0.66353638
sample estimates:
odds ratio
0.1409759
Bericht:(Chi-Quadrat(1) = 8.7615, p = .005673)
In dieser Übung ist es notwending nach Fisher und nach Yates zu korregieren. Daher wird folgender Code verwendet.
Fall 4
Anpassung: Fisher’s Exact Test & Anpassung nach Yates
3) bei einer Stichprobengröße zwischen 20 und 50 die Korrektur nach Yates.
*Die erwarteten Zellhäufigkeiten sind > 5. Ist dies nicht der Fall, so wird der exakte Test nach Fisher verwendet.**
Die Freiheitsgrade des Chi-Quadrat-Tests sind größer als 1. Ist dies nicht der Fall, so wird die Korrektur nach Yates verwendet.
ch <- chisq.test(counts, correct = TRUE)
ch
Pearson's Chi-squared test with Yates' continuity correction
data: counts
X-squared = 6.8563, df = 1, p-value = 0.008833
a <- fisher.test(counts)
a
Fisher's Exact Test for Count Data
data: counts
p-value = 0.005673
alternative hypothesis: true odds ratio is not equal to 1
95 percent confidence interval:
0.02562454 0.66353638
sample estimates:
odds ratio
0.1409759
Hinweise: Da in dieser Übungsaufgabe der exakte Test nach Fisher verwendet werden muss, wird nicht folgender p-value = 0.008833 zitiert, sondern Fisher mit einem p-value von 0.005673.
Der Test bestätigt, dass ein Zusammenhang zwischen Studierbereitschaft vor dem Auslandsjahr und die Studierbereitschaft nach dem Auslandsjahr besteht (Chi-Quadrat(1) = 6.8563, p = .005673).
Alternative Darstellung mit gmodels
library(gmodels)
Kreuztabelle2a <- CrossTable(x =chi$vorher, y = chi$nachher, digits = 1, format = "SPSS", chisq = TRUE)
Warning in chisq.test(t, correct = TRUE, ...) :
Chi-squared approximation may be incorrect
Warning in chisq.test(t, correct = FALSE, ...) :
Chi-squared approximation may be incorrect
Cell Contents
|-------------------------|
| Count |
| Chi-square contribution |
| Row Percent |
| Column Percent |
| Total Percent |
|-------------------------|
Total Observations in Table: 45
| chi$nachher
chi$vorher | hoch | niedrig | Row Total |
-------------|-----------|-----------|-----------|
hoch | 6 | 9 | 15 |
| 1.8 | 4.0 | |
| 40.0% | 60.0% | 33.3% |
| 19.4% | 64.3% | |
| 13.3% | 20.0% | |
-------------|-----------|-----------|-----------|
niedrig | 25 | 5 | 30 |
| 0.9 | 2.0 | |
| 83.3% | 16.7% | 66.7% |
| 80.6% | 35.7% | |
| 55.6% | 11.1% | |
-------------|-----------|-----------|-----------|
Column Total | 31 | 14 | 45 |
| 68.9% | 31.1% | |
-------------|-----------|-----------|-----------|
Statistics for All Table Factors
Pearson's Chi-squared test
------------------------------------------------------------
Chi^2 = 8.761521 d.f. = 1 p = 0.003076524
Pearson's Chi-squared test with Yates' continuity correction
------------------------------------------------------------
Chi^2 = 6.856279 d.f. = 1 p = 0.008833031
Minimum expected frequency: 4.666667
Cells with Expected Frequency < 5: 1 of 4 (25%)
Cramers V
\[
Cramers\phantom{.}V = \sqrt{\frac{\chi^2}{n\cdot min[k_1-1,k_2-1]}}
\]
** Die Zahl \(2\) steht für \(2\times2\) Design.**
\[\mbox{Cramers V} = \sqrt {\frac{\chi^2}{n \cdot (2-1)}}\]
\[\mbox{Cramers V} = \sqrt {\frac{6.86}{45 \cdot (2-1)}} = 0.39\]
anzahl <- nrow(chi)
sprintf("Der Datensatz hat %d Zeilen.",anzahl)
[1] "Der Datensatz hat 45 Zeilen."
sprintf("Das Chi-Quadrat liegt bei %.2f.",ch$statistic)
[1] "Das Chi-Quadrat liegt bei 6.86."
cramersV <- sqrt(( ch$statistic)/(anzahl*(2-1)))
sprintf("Die Effektstärke liegt bei %.2f.",cramersV)
[1] "Die Effektstärke liegt bei 0.39."
Cramer s V ist immer positiv -> keine Aussage über die Richtung des Zusammenhangs
\[
\begin{align}
\text{Schwacher Effekt: } 0.1 &< ||Cramers V|| \leq 0.3 \\
\text{Schwacher bis mittlerer Effekt: }0.3 &< ||Cramers V|| \leq 0.4 \\
\text{Mittlerer Effekt: } 0.4 &< ||Cramers V|| < 0.5 \\
\text{Mittlerer bis starker Effekt: }0.5 &= ||Cramers V|| \\
\text{Starker Effekt: } 0.5 &< ||Cramers V||
\end{align}\]
Es zeigt sich für unsere Auswertung, dass ein mittlerer Zusammenhang besteht.
Aussage
Die Studierbereitschaft vor dem Auslandsjahr und die Studierbereitschaft nach dem Auslandsjahr stehen in einem Zusammenhang (Chi-Quadrat(1) = 6.8563, p = .005673, n = 45). Der Zusammenhang ist mittelstark (Cramers V = .4). Damit kann die H0 verworfen werden.
Alternative
Es kann davon ausgegangen werden, dass sich die erwarteten und die beobachteten Häufigkeiten signifikant unterscheiden (Chi-Quadrat(1) = 6.8563, p = .005673, n = 45).Der Zusammenhang ist mittelstark (Cramers V = .4). Damit kann die H0 verworfen werden.
LS0tDQpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sNCi0tLQ0KDQoNCg0KIyBIeXBvdGhlc2UgDQoNCkgxOiBFcyBnaWJ0IGVpbmVuIFp1c2FtbW1lbmhhbmcgendpc2NoZW4gZGVyIFN0dWRpZXJiZXJlaXRzY2hhZnQgdm9yIGRlbSBBdXNsYW5kc2phaHIgdW5kIGRlciBTdHVkaWVyYmVyZWl0c2NoYWZ0IG5hY2ggZGVtIEF1c2xhbmRzamFoci4gPGJyPiANCg0KSDA6IEVzIGdpYnQga2VpbmVuIFp1c2FtbW1lbmhhbmcgendpc2NoZW4gZGVyIFN0dWRpZXJiZXJlaXRzY2hhZnQgdm9yIGRlbSBBdXNsYW5kc2phaHIgdW5kIGRlciBTdHVkaWVyYmVyZWl0c2NoYWZ0IG5hY2ggZGVtIEF1c2xhbmRzamFoci48YnI+DQoNCg0KIyMjIEFsdGVybmF0aXYgDQoNCg0KSDA6IEJlaWRlIFZhcmlhYmxlbiBzaW5kIGluIGRlciBHcnVuZGdlc2FtdGhlaXQgdW5hYmjDpG5naWcgdm9uZWluYW5kZXIuIA0KDQpIMTogQmVpZGUgVmFyaWFibGVuIHNpbmQgaW4gZGVyIEdydW5kZ2VzYW10aGVpdCBhYmjDpG5naWcgdm9uZWluYW5kZXINCg0KIyBWb3JhdXNldHp1bmdlbiANCg0KRGllIFZhcmlhYmxlbiBzaW5kIGthdGVnb3JpYWwgKG5vbWluYWwtIG9kZXIgb3JkaW5hbHNrYWxpZXJ0KQ0KDQoNCioqRGF0ZW5zYXR6Z3LDtsOfZSoqIDxicj4NCg0KICAxKSBEaWUgU3RpY2hwcm9iZSBpc3QgPiA1MC4NCg0KICAyKSBJc3QgZGllcyBuaWNodCBkZXIgRmFsbCwgc28gd2lyZCBiZWkgZWluZXIgU3RpY2hwcm9iZSBrbGVpbmVyIGFscyAyMCAqKmRlciBleGFrdGUgVGVzdCBuYWNoIEZpc2hlcioqIHZlcndlbmRldA0KDQogIDMpIGJlaSBlaW5lciBTdGljaHByb2Jlbmdyw7bDn2Ugendpc2NoZW4gMjAgdW5kIDUwIGRpZSAqKktvcnJla3R1ciBuYWNoIFlhdGVzKiouDQoNCg0KRGllIGVyd2FydGV0ZW4gWmVsbGjDpHVmaWdrZWl0ZW4gc2luZCA+IDUuIElzdCBkaWVzIG5pY2h0IGRlciBGYWxsLCBzbyB3aXJkICoqZGVyIGV4YWt0ZSBUZXN0IG5hY2ggRmlzaGVyKiogdmVyd2VuZGV0Lg0KDQpEaWUgRnJlaWhlaXRzZ3JhZGUgZGVzIENoaS1RdWFkcmF0LVRlc3RzIHNpbmQgZ3LDtsOfZXIgYWxzIDEuIElzdCBkaWVzIG5pY2h0IGRlciBGYWxsLCBzbyB3aXJkIGRpZSAqKktvcnJla3R1ciBuYWNoIFlhdGVzKiogdmVyd2VuZGV0Lg0KDQoNCiMgRGF0ZW5zYXR6DQoNCmBgYHtyfQ0KaGVhZChjaGksIDUpDQpgYGANCg0KDQojIEJhbGtlbmRpYWdyYW1tDQoNCg0KYGBge3J9DQpjb3VudHM8LSB0YWJsZShWb3JoZXI9IGNoaSR2b3JoZXIsIE5hY2hoZXIgPSBjaGkkbmFjaGhlcikNCg0KYmFycGxvdChjb3VudHMsIG1haW49IkJhbGtlbmRpYWdyYW1tIHp1ciBTdHVkaWVyYmVyZWl0c2NoYWZ0IiwNCmNvbD1jKCJkZWVwc2t5Ymx1ZSIsInRvbWF0byIpLA0KeWxhYj0iQW56YWhsIFBlcnNvbmVuIix4bGFiID0gIlN0dWRpZXJiZXJlaXRzY2hhZnQiLA0KYmVzaWRlPUYsDQoNCnN1YiA9ICJOYWNoaGVyIiwNCiNuYW1lcy5hcmcgPWMoIlZvckgtTmFjaEgiLCJWb3JOLU5hY2hIIiwiVm9ySC1OYWNoTiIsICJWb3JOLU5hY2hOIiksDQpsZWdlbmQgPSByb3duYW1lcyhjb3VudHMpLA0KYXJncy5sZWdlbmQgPSBsaXN0KHggPSAidG9wcmlnaHQiLCB0aXRsZT0idm9yaGVyIikpDQpgYGANCg0KIyMjIFNhbmtleSBEaWFncmFtDQoNCkRpZXNlcyBTYW5rZXkgRGlhZ3JhbW1lIGJpZXRldCBzaWNoIGFuIGJlaSAidm9yaGVyIiAtICJuYWNoaGVyIiAtIERhcnN0ZWxsdW5nZW4uDQoNCg0KDQpgYGB7cn0NCiNpbnN0YWxsLnBhY2thZ2VzKCJuZXR3b3JrRDMiKQ0KbGlicmFyeShuZXR3b3JrRDMpDQpsaWJyYXJ5KGRwbHlyKQ0KDQoNCmxpbmtzIDwtIGRhdGEuZnJhbWUoDQpzb3VyY2U9YygiaG9jaF92IiwiaG9jaF92IiwgIm5pZWRyaWdfdiIsICJuaWVkcmlnX3YiKSwgDQp0YXJnZXQ9YygiaG9jaF9uIiwibmllZHJpZ19uIiwiaG9jaF9uIiwibmllZHJpZ19uIiksIA0KdmFsdWU9Yyg2LDksIDI1LCA1KQ0KKQ0KDQoNCiMgRnJvbSB0aGVzZSBmbG93cyB3ZSBuZWVkIHRvIGNyZWF0ZSBhIG5vZGUgZGF0YSBmcmFtZTogaXQgbGlzdHMgZXZlcnkgZW50aXRpZXMgaW52b2x2ZWQgaW4gdGhlIGZsb3cNCm5vZGVzIDwtIGRhdGEuZnJhbWUoDQpuYW1lPWMoYXMuY2hhcmFjdGVyKGxpbmtzJHNvdXJjZSksIA0KYXMuY2hhcmFjdGVyKGxpbmtzJHRhcmdldCkpICU+JSB1bmlxdWUoKQ0KKQ0KDQojIFdpdGggbmV0d29ya0QzLCBjb25uZWN0aW9uIG11c3QgYmUgcHJvdmlkZWQgdXNpbmcgaWQsIG5vdCB1c2luZyByZWFsIG5hbWUgbGlrZSBpbiB0aGUgbGlua3MgZGF0YWZyYW1lLi4gU28gd2UgbmVlZCB0byByZWZvcm1hdCBpdC4NCmxpbmtzJElEc291cmNlIDwtIG1hdGNoKGxpbmtzJHNvdXJjZSwgbm9kZXMkbmFtZSktMSANCmxpbmtzJElEdGFyZ2V0IDwtIG1hdGNoKGxpbmtzJHRhcmdldCwgbm9kZXMkbmFtZSktMQ0KDQojIE1ha2UgdGhlIE5ldHdvcmsNCnAgPC0gc2Fua2V5TmV0d29yayhMaW5rcyA9IGxpbmtzLCBOb2RlcyA9IG5vZGVzLA0KU291cmNlID0gIklEc291cmNlIiwgDQpUYXJnZXQgPSAiSUR0YXJnZXQiLA0KVmFsdWUgPSAidmFsdWUiLCANCk5vZGVJRCA9ICJuYW1lIiwgDQppdGVyYXRpb25zID0gMCwNCm5vZGVXaWR0aD00MCwgZm9udFNpemU9MTMsIA0Kc2lua3NSaWdodD1UUlVFKQ0KcA0KYGBgDQoNCiMgS3JldXp0YWJlbGxlIHVuZCBiZW9iYWNodGV0ZW4gV2VydGUNCg0KYGBge3J9DQpjb3VudHM8LSB0YWJsZSggVm9yaGVyPWNoaSR2b3JoZXIsIE5hY2hoZXIgPSBjaGkkbmFjaGhlcikNCmhlYWQoY291bnRzKQ0KYGBgDQoNCkRpZSBUYWJlbGxlIHd1cmRlIGFuZ2VsZWd0Lg0KDQoNCiMgRXJ3YXJ0ZXRlbiBXZXJ0ZSANCg0KYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgcGFnZWQucHJpbnQ9RkFMU0V9DQpjaCA8LSBjaGlzcS50ZXN0KGNvdW50cywgY29ycmVjdCA9IEYpDQpyb3VuZChjaCRleHBlY3RlZCwyKQ0KDQpgYGANCg0KDQpEaWUgYmVvYmFjaHRldGVuIHVuZCBkaWUgZXJ3YXJ0ZXRlbiBXZXJ0ZSAgd3VyZGVuIHZlcmdsaWNoZW4uIEVzIHplaWdlbiBzaWNoIGbDvHIgZGFzIEJlaXNwaWVsIGVpbmVuIFVudGVyc2NoaWVkZS4NCk9iIGVzIGplZG9jaCBzaWduaWZpa2FudCBzaW5kLCB3aXJkIG1pdHRlbHMgQ2hpLVF1YWRyYXQtVGVzdCBnZXByw7xmdC4gDQoNCg0KIyBFcmdlYm5pcyB6dW0gJFxjaGleMiQgdW5kIFByw7xmdW5nIGRlciBTaWduaWZpa2Fueg0KDQoNCg0KIyMgQmVyZWNobnVuZyBkZXIgRnJlaWhlaXRzZ3JhZGUNCg0KDQokJGRmPSAoa18xIC0xKVxjZG90IChrXzIgLTEpJCQNCm1pdCANCg0KJGtfMSQgPSBkaWUgRmFrdG9yc3R1ZmVuIGRlciBlcnN0ZW4gVmFyaWFibGUgPGJyPg0KJGtfMiQgPSBkaWUgRmFrdG9yc3R1ZmVuIGRlciB6d2VpdGVuIFZhcmlhYmxlIDxicj4NCg0KDQoNCiQkZGY9ICgyIC0xKVxjZG90ICgyIC0xKSA9IDEkJA0KDQp8RmFsbCAgIHxGaXNoZXJ8WWF0ZXN8DQp8LS0tLS0tLXwtLS0tLS18LS0tLS18DQp8RmFsbCAxIHwtICAgICB8LSAgICB8DQp8RmFsbCAyIHwtICAgICB8KyAgICB8DQp8RmFsbCAzIHwrICAgICB8LSAgICB8DQp8RmFsbCA0IHwrICAgICB8KyAgICB8DQoNCiMjIyBGYWxsIDENCg0KJCRcY2hpXjIgPSBcc3VtXklfe2k9MX1cc3VtXkpfe2o9MX1cZnJhY3soZl97aWp9LWZeeyd9X3tpan0pXjJ9e2Zeeyd9X3tpan19ID1cZnJhY3soNi0xMC4zMyleMn17MTAuMzN9KyBcZnJhY3soMjUtMjAuNjcpXjJ9ezIwLjY3fStcZnJhY3soOS00LjY3KV4yfXs0LjY3fStcZnJhY3soNS05LjMzKV4yfXs5LjMzfT04LjckJA0KDQoNCmBgYHtyfQ0Kcm91bmQoKCg2LTEwLjMzKV4yLzEwLjMzKSsoKDI1LTIwLjY3KV4yLzIwLjY3KSsoKDktNC42NyleMi80LjY3KSsoKDUtOS4zMyleMi85LjMzKSwgMSkNCmBgYA0KDQoNCioqa2VpbmUgQW5wYXNzdW5nIGVyZm9yZGVybGljaCoqDQoNCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQoNCmNoIDwtIGNoaXNxLnRlc3QoY291bnRzLCBjb3JyZWN0ID0gRikgIyBjb3JyZWN0ID0gRiBvaG5lIEFucGFzc3VuZ2VuIC0gIGRpZSAibm9ybWFsZSIgRm9ybWVsDQpjaCANCg0KYGBgDQoqKkJlcmljaHQ6KiooQ2hpLVF1YWRyYXQoMSkgPSA4Ljc2MTUsIHAgPSAuMDAzMDc3KSANCiAgDQojIyMgRmFsbCAyIA0KDQoqKkFucGFzc3VuZzogS29ycmVrdHVyIG5hY2ggWWF0ZXMgKiogDQoNCiQkXGNoaV4yID0gXHN1bV5JX3tpPTF9XHN1bV5KX3tqPTF9XGZyYWN7KFxCaWdsfCBmX3tpan0tZl57J31fe2lqfVxCaWdsfCAtMC41KV4yfXtmXnsnfV97aWp9fSA9IFxcIA0KXGZyYWN7KFxCaWdsfCAoNi0xMC4zMylcQmlnbHwgLTAuNSleMn17MTAuMzN9ICtcZnJhY3soXEJpZ2x8ICgyNS0yMC42NylcQmlnbHwgLTAuNSleMn17MjAuNjd9ICsgXFwgDQpcZnJhY3soXEJpZ2x8ICgoOS00LjY3KVxCaWdsfCAtMC41KV4yfXs0LjY3fSArXGZyYWN7KFxCaWdsfCAoNS05LjMzKVxCaWdsfCAtMC41KV4yfXs5LjMzfSA9IDYuOCQkDQoNCg0KDQpgYGB7cn0NCnJvdW5kKA0KICAgICgoKGFicyg2LTEwLjMzKSktMC41KV4yLzEwLjMzKSsNCiAgICAoKChhYnMoMjUtMjAuNjcpKS0wLjUpXjIvMjAuNjcpKw0KICAgICgoKGFicyg5LTQuNjcpKS0wLjUpXjIvNC42NykrDQogICAgKCgoYWJzKDUtOS4zMykpLTAuNSleMi85LjMzKQ0KLDIpDQpgYGANCg0KDQpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KY2ggPC0gY2hpc3EudGVzdChjb3VudHMsIGNvcnJlY3QgPSBUUlVFKSAjIERpZSBBbnBhc3N1bmcgbmFjaCBZYXRlcyAtIGNvcnJlY3QgPSBUUlVFIC0gRGllIEZvcm1lbCB3aXJkIHVtIC0wLjUgZXJ3ZWl0ZXJ0DQpjaCANCg0KYGBgICANCioqQmVyaWNodDoqKihDaGktUXVhZHJhdCgxKSA9IDYuODU2MywgcCA9IC4wMDg4MzMpICAgDQoNCiAgDQoNCiMjIyBGYWxsIDMgIA0KDQoqKkFucGFzc3VuZzogRmlzaGVyJ3MgRXhhY3QgVGVzdCAgKiogDQoNCg0KYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCmNoIDwtIGNoaXNxLnRlc3QoY291bnRzLCBjb3JyZWN0ID0gRikNCmNoIA0KZmlzaGVyLnRlc3QoY291bnRzKQ0KDQpgYGAgIA0KKipCZXJpY2h0OioqKENoaS1RdWFkcmF0KDEpID0gOC43NjE1LCBwID0gLjAwNTY3MykgICANCg0KSW4gZGllc2VyIMOcYnVuZyBpc3QgZXMgbm90d2VuZGluZyBuYWNoIEZpc2hlciB1bmQgbmFjaCBZYXRlcyB6dSBrb3JyZWdpZXJlbi4gRGFoZXIgd2lyZCBmb2xnZW5kZXIgQ29kZSB2ZXJ3ZW5kZXQuIA0KDQoNCiMjIyBGYWxsIDQgIA0KDQoqKkFucGFzc3VuZzogRmlzaGVyJ3MgRXhhY3QgVGVzdCAgJiBBbnBhc3N1bmcgbmFjaCBZYXRlcyAqKiANCg0KKiozKSBiZWkgZWluZXIgU3RpY2hwcm9iZW5ncsO2w59lIHp3aXNjaGVuIDIwIHVuZCA1MCBkaWUgS29ycmVrdHVyIG5hY2ggWWF0ZXMuKioNCg0KKkRpZSBlcndhcnRldGVuIFplbGxow6R1Zmlna2VpdGVuIHNpbmQgPiA1LiBJc3QgZGllcyBuaWNodCBkZXIgRmFsbCwgc28gd2lyZCBkZXIgZXhha3RlIFRlc3QgbmFjaCBGaXNoZXIgdmVyd2VuZGV0LioqDQoNCioqRGllIEZyZWloZWl0c2dyYWRlIGRlcyBDaGktUXVhZHJhdC1UZXN0cyBzaW5kIGdyw7bDn2VyIGFscyAxLiBJc3QgZGllcyBuaWNodCBkZXIgRmFsbCwgc28gd2lyZCBkaWUgS29ycmVrdHVyIG5hY2ggWWF0ZXMgdmVyd2VuZGV0LioqDQoNCg0KDQpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBwYWdlZC5wcmludD1GQUxTRX0NCg0KY2ggPC0gY2hpc3EudGVzdChjb3VudHMsIGNvcnJlY3QgPSBUUlVFKQ0KY2gNCmEgPC0gZmlzaGVyLnRlc3QoY291bnRzKQ0KDQphDQpgYGANCg0KKipIaW53ZWlzZSoqOiBEYSBpbiBkaWVzZXIgw5xidW5nc2F1ZmdhYmUgZGVyIGV4YWt0ZSBUZXN0IG5hY2ggRmlzaGVyIHZlcndlbmRldCB3ZXJkZW4gbXVzcywgd2lyZCBuaWNodCBmb2xnZW5kZXIgKipwLXZhbHVlID0gMC4wMDg4MzMqKiB6aXRpZXJ0LCBzb25kZXJuIEZpc2hlciBtaXQgZWluZW0gcC12YWx1ZSB2b24gKiowLjAwNTY3MyoqLg0KDQpEZXIgVGVzdCBiZXN0w6R0aWd0LCBkYXNzIGVpbiBadXNhbW1lbmhhbmcgendpc2NoZW4gU3R1ZGllcmJlcmVpdHNjaGFmdCB2b3IgZGVtIEF1c2xhbmRzamFociB1bmQgZGllIFN0dWRpZXJiZXJlaXRzY2hhZnQgbmFjaCBkZW0gQXVzbGFuZHNqYWhyIGJlc3RlaHQgKENoaS1RdWFkcmF0KDEpID0gNi44NTYzLCBwID0gLjAwNTY3MykuDQoNCiMjIyBBbHRlcm5hdGl2ZSBEYXJzdGVsbHVuZyBtaXQgZ21vZGVscw0KDQpgYGB7cn0NCmxpYnJhcnkoZ21vZGVscykgDQoNCktyZXV6dGFiZWxsZTJhIDwtIENyb3NzVGFibGUoeCA9Y2hpJHZvcmhlciwgeSA9IGNoaSRuYWNoaGVyLCBkaWdpdHMgPSAxLCBmb3JtYXQgPSAiU1BTUyIsIGNoaXNxID0gVFJVRSkgDQpgYGANCg0KDQoNCiMgQ3JhbWVycyBWDQoNCiQkDQpDcmFtZXJzXHBoYW50b217Ln1WID0gXHNxcnR7XGZyYWN7XGNoaV4yfXtuXGNkb3QgbWluW2tfMS0xLGtfMi0xXX19DQokJA0KDQoqKiBEaWUgWmFobCAkMiQgc3RlaHQgZsO8ciAkMlx0aW1lczIkIERlc2lnbi4qKg0KDQokJFxtYm94e0NyYW1lcnMgVn0gPSBcc3FydCB7XGZyYWN7XGNoaV4yfXtuIFxjZG90ICgyLTEpfX0kJA0KDQoNCiQkXG1ib3h7Q3JhbWVycyBWfSA9IFxzcXJ0IHtcZnJhY3s2Ljg2fXs0NSBcY2RvdCAoMi0xKX19ID0gMC4zOSQkDQoNCmBgYHtyfQ0KYW56YWhsIDwtIG5yb3coY2hpKQ0KDQpzcHJpbnRmKCJEZXIgRGF0ZW5zYXR6IGhhdCAlZCBaZWlsZW4uIixhbnphaGwpDQoNCnNwcmludGYoIkRhcyBDaGktUXVhZHJhdCBsaWVndCBiZWkgJS4yZi4iLGNoJHN0YXRpc3RpYykNCg0KYGBgDQoNCg0KYGBge3J9DQpjcmFtZXJzViA8LSBzcXJ0KCggY2gkc3RhdGlzdGljKS8oYW56YWhsKigyLTEpKSkNCnNwcmludGYoIkRpZSBFZmZla3RzdMOkcmtlIGxpZWd0IGJlaSAlLjJmLiIsY3JhbWVyc1YpDQpgYGANCkNyYW1lciBzIFYgaXN0IGltbWVyIHBvc2l0aXYgLT4ga2VpbmUgQXVzc2FnZSDDvGJlciBkaWUgUmljaHR1bmcgZGVzIFp1c2FtbWVuaGFuZ3MNCg0KJCQNClxiZWdpbnthbGlnbn0NClx0ZXh0e1NjaHdhY2hlciBFZmZla3Q6IH0gMC4xICY8IHx8Q3JhbWVycyBWfHwgXGxlcSAgMC4zIFxcDQpcdGV4dHtTY2h3YWNoZXIgYmlzIG1pdHRsZXJlciBFZmZla3Q6IH0wLjMgJjwgfHxDcmFtZXJzIFZ8fCBcbGVxICAwLjQgXFwNClx0ZXh0e01pdHRsZXJlciBFZmZla3Q6IH0gMC40ICY8IHx8Q3JhbWVycyBWfHwgPCAwLjUgXFwNClx0ZXh0e01pdHRsZXJlciBiaXMgc3RhcmtlciBFZmZla3Q6IH0wLjUgJj0gfHxDcmFtZXJzIFZ8fCBcXA0KXHRleHR7U3RhcmtlciBFZmZla3Q6IH0gMC41ICY8IHx8Q3JhbWVycyBWfHwgDQpcZW5ke2FsaWdufSQkDQoNCkVzIHplaWd0IHNpY2ggZsO8ciB1bnNlcmUgQXVzd2VydHVuZywgZGFzcyBlaW4gbWl0dGxlcmVyIFp1c2FtbWVuaGFuZyBiZXN0ZWh0Lg0KDQoNCiMgQXVzc2FnZSANCg0KRGllIFN0dWRpZXJiZXJlaXRzY2hhZnQgdm9yIGRlbSBBdXNsYW5kc2phaHIgdW5kIGRpZSBTdHVkaWVyYmVyZWl0c2NoYWZ0IG5hY2ggZGVtIEF1c2xhbmRzamFociBzdGVoZW4gaW4gZWluZW0gWnVzYW1tZW5oYW5nIChDaGktUXVhZHJhdCgxKSA9IDYuODU2MywgcCA9IC4wMDU2NzMsIG4gPSA0NSkuIERlciBadXNhbW1lbmhhbmcgaXN0IG1pdHRlbHN0YXJrIChDcmFtZXJzIFYgPSAuNCkuIERhbWl0IGthbm4gZGllIEgwIHZlcndvcmZlbiB3ZXJkZW4uDQoNCg0KIyMjIEFsdGVybmF0aXZlDQoNCkVzIGthbm4gZGF2b24gYXVzZ2VnYW5nZW4gd2VyZGVuLCBkYXNzIHNpY2ggZGllIGVyd2FydGV0ZW4gdW5kIGRpZSBiZW9iYWNodGV0ZW4gSMOkdWZpZ2tlaXRlbiBzaWduaWZpa2FudCB1bnRlcnNjaGVpZGVuICAoQ2hpLVF1YWRyYXQoMSkgPSA2Ljg1NjMsIHAgPSAuMDA1NjczLCBuID0gNDUpLkRlciBadXNhbW1lbmhhbmcgaXN0IG1pdHRlbHN0YXJrIChDcmFtZXJzIFYgPSAuNCkuIERhbWl0IGthbm4gZGllIEgwIHZlcndvcmZlbiB3ZXJkZW4uDQoNCg0K