Berechnung der Teststatistik
Der Kruskal-Wallis-Test basiert auf der Idee der Rangierung der Daten. Das heisst, es wird nicht mit den Messwerten selbst gerechnet, sondern diese werden durch Ränge ersetzt, mit welchen der eigentliche Test durchgeführt wird. Damit beruht die Berechnung des Tests ausschliesslich auf der Ordnung der Daten (grösser als, kleiner als). Die absoluten Abstände zwischen den Werten werden nicht berücksichtigt.
Hierbei werden die Messwerte mit Rängen versehen. Als erstes werden die einzelnen Messwerte ihrer Gröse nach aufgereiht. Dies geschieht unabhängig von der Gruppenzugehörigkeit (Spalte “Gruppe”). Danach werden die Messwerte rangiert und getrennt für jede Gruppe benannt.
Diese Ränge sind in Abbildung in den Spalten “Ränge ‘0-30’” bis 56+’" enthalten. Kommt ein Messwert mehrfach vor (engl. “ties”), so werden sogenannte “verbundene Ränge” gebildet.
Wenn Rang 1 und 2 beide die gleichen Messwerte aufweisen, wird aus diesen beiden der Mittelwert gebildet ((1 + 2)/2 = 1.5) und die Ränge 1 und 2 werden neu beide mit dem Rang 1.5 versehen. Dies ist im vorliegenden Beispiel für die Ränge 12 und 13 (mittlerer Rang: (12+13)/2 = 12.5), sowie 14 bis 16 der Fall (mittlerer Rang: (14+15+16)/3 = 15).
Schliesslich werden aus diesen ermittelten Rängen sogenannte Rangsummen gebildet (“Summen”). Hierfür werden lediglich die Ränge der jeweiligen Gruppe aufsummiert. Dies ergibt eine Rangsumme von 237.5 für die Gruppe 0-30 (n = 10), 124 für die Gruppe “31-55” (n = 8) und 73.5 für die Gruppe “56+” (n = 11). Zur Berechnung der Teststatistik H werden diese Rangsummen verwendet:
Ohne Korrektur
\[
\begin{align}
H &= \frac{12}{N(N+1)}\sum^{k}_{i=1}\frac{R^2_i}{n_i}-3(N+1)
\end{align}
\]
\[
\begin{align}
H &= \frac{12}{29(29+1)}*(\frac{237.5^2}{10}+\frac{124^2}{8}+\frac{73.5^2}{11})-3(29+1) = 21.08
\end{align}
\]
mit:
\(R_i =\) Rangsummen für jede Gruppe
\(N =\) Gesamtstichprobengröße
\(n_i =\) Größe der einzelnen Gruppe
\(k =\) Anzahl der Gruppen
Freiheitsgrade
\[df = k -1 \]
\[df = 3 -1 = 2\]
mit: * \(k =\) Anzahl der Gruppen
Mit Korrektur
Bei verbundenen Rängen muss die Teststatistik korrigiert werden. (Wird von der Methode kruskal.test() ibn R automatisch gemacht.)
\[
\begin{align}
H_{korr} &= \frac{H}{1-\frac{\sum^{m}_{j=1}(t^3_j-t_j)}{N^3-N}} \\
\end{align}
\]
Da beim Beispiel verbundene Ränge vorliegen, muss die Korrekturformel angewendet werden.
Es liegen dreimal verbundene Ränge vor (daher m = 4): Ränge 1 & 2 (daher t1 = 2) sowie 13 & 28 (daher t2 = 2), 16 & 2 (daher t3 = 2) und 22 & 2 &18 (daher t3 = 3)
Dies ergibt:
\[
\begin{align}
H_{korr} &= \frac{21.08}{1-\frac{(2^3-2)+(2^3-2)+(2^3-2)+(3^3-3)}{29^3-29}} =21.1
\end{align}
\]
round(21.08/(1-((2^3-2)+(2^3-2)+(2^3-2)+(3^3-3))/(29^3-29)),2)
[1] 21.12
mit:
Der emprischer Wert
Der emprische Wert liegt bei \(|21.1|\).
Der kritisch Wert
Der berechnete Wert muss nun auf Signifikanz geprüft werden. Die Teststatistik vergleicht den kritischen Wert der durch die Freiheitsgrade bestimmten Chi-Quadrat-Verteilung mit dem errechneten Wert. Dieser kritische Wert kann Tabellen entnommen werden.
qchisq(0.975,df=2)
[1] 7.377759
Der kritische Wert liegt bei 7.37
Vergleich
\[|−21.1| > 7.37 →\text {Es liegt ein sig. Unterschied vor.}\]
Für das vorliegende Beispiel betrüge der kritische Wert 7.37 bei df = 2 und α = .05. Ist der Betrag der Teststatistik höher als der kritische Wert, so ist der Unterschied signifikant. Dies wäre für das Beispiel der Fall (21.122 > 7.37). Es könnte daher davon ausgegangen werden, dass sich die zentralen Tendenzen unterscheiden (Chi-Quadrat(2) = 21.122, p < .05).
Hypothese
H0: Es gibt keinen Unterschied zwischen Altersgruppe(0-30/31-55/56+) und der Sportlichkeit gemessen auf dem Laufband in Minuten.
H1: Es gibt einen Unterschied zwischen Altersgruppe(0-30/31-55/56+) und der Sportlichkeit gemessen auf dem Laufband in Minuten.
Voraussetzungen für den Kruskal-Wallis-Test
Die abhängige Variable ist mindestens ordinalskaliert -> ist gegeben
Es liegt eine unabhängige Variable vor, mittels der die zu vergleichenden Gruppen gebildet werden. -> Die Altergruppen sind unabhängig.
Deskriptive Statistiken
Diese “library(dplyr)” muss verwendet werden.
wallis %>%
group_by(Altersgruppe) %>%
summarize(Anzahl = n(), Median = median(Sportlichkeit)) %>%
mutate_if(is.numeric, round, 2)
`summarise()` ungrouping output (override with `.groups` argument)
Die Mediane der Gruppen unterscheiden sich. Die Gruppe “0-30” scheint am sportlichsten zu sein mit einem Wert von 13.5 min (N=10). Die Gruppe “31-55” schaffen 9.2 Min.(N=8) auf dem Laufbahn und am wenigsten sportlich ist die Gruppe der “56+” mit einem Median von 3 (N=11).
Boxplots
boxplot(wallis$Sportlichkeit ~ wallis$Altersgruppe, main = "Boxplots Altersgruppen-Sportlichkeit ", ylab = "Sportlichkeit gemessen auf dem Laufbahn in Minuten", xlab= "Altergruppe" , col = c("lightgreen", "deepskyblue","tomato"))

Die Mediane der Gruppen unterscheiden sich. Es gibt augenscheinlich keine Ausreisser.
ALTERNATIV
library(ggplot2)
ggplot(wallis, aes(x=Altersgruppe, y=Sportlichkeit, color=Altersgruppe)) +
geom_violin() +
geom_boxplot(width=0.2) +
labs(x= "Altersgruppe",y = "Sportlichkeit", title="Boxplots zwischen Altersgruppen" )

Ergebnisse der Kruskal-Wallis-Test
test <- kruskal.test(Sportlichkeit ~ Altersgruppe, data=wallis)
test
Kruskal-Wallis rank sum test
data: Sportlichkeit by Altersgruppe
Kruskal-Wallis chi-squared = 21.122, df = 2, p-value = 2.59e-05
Die Tabelle zeigt Unterschiede. Für das Beispiel wird eine Signifikanz von .000 ausgegeben. Also kann davon ausgegangen werden, dass es Unterschiede bezüglich der zentralen Tendenzen der Gruppen gibt (Chi-Quadrat(2) = 21.22,p = .000). Allerdings lässt sich aufgrund dieses Tests nicht bestimmen, welche der drei Gruppen sich signifikant voneinander unterscheiden. Es ist denkbar, dass sich lediglich ein Paar signifikant unterscheidet und zwischen den übrigen keine signifikanten Unterschiede vorliegen. Daher wird ein Post-hoc-Test durchgeführt.
PostHoc <- aov(Sportlichkeit ~ Altersgruppe, data=wallis)
TukeyHSD(PostHoc)
Tukey multiple comparisons of means
95% family-wise confidence level
Fit: aov(formula = Sportlichkeit ~ Altersgruppe, data = wallis)
$Altersgruppe
diff lwr upr p adj
31-55-0-30 -5.000000 -8.225499 -1.774501 0.0019217
56+-0-30 -9.731818 -12.702930 -6.760707 0.0000000
56+-31-55 -4.731818 -7.891484 -1.572153 0.0026789
Der Post-Hoc-Test ergibt, dass sich alle vergleichenden Gruppen signifikant unterscheiden (p < 0.05).
Es gibt einem signifikanten Unterschied zwischen den drei getesteten Gruppen, das heisst, dass jede Altersgruppe einen deutlichen Unterschied in der Sportlichkeit aufweist.
Es können drei unabhängige Gruppen gebildet werden. Eine Generalisierung ist möglich.
Berechnung der Effektstärke
\[r = \Biggl| \frac{z}{\sqrt{n}}\Biggl|\]
mit:
Zstat<-qnorm(test$p.value/2) #ungerichtet
sprintf("Z-Wert für den H-Test : %.2f", Zstat)
[1] "Z-Wert für den H-Test : -4.21"
daten <- nrow(wallis)
sprintf("Anzahl der Daten: %.f", daten)
[1] "Anzahl der Daten: 29"
eff <- abs(Zstat/sqrt(daten))
sprintf("Effektstärke: %.2f", eff)
[1] "Effektstärke: 0.78"
Zur Beurteilung der Groesse des Effektes dient die Einteilung von Cohen (1992):
\[
\begin{align}
\text{Schwacher Effekt: } 0.10 &< ||r|| < 0.30 \\
\text{Schwacher bis mittlerer Effekt: } 0.30 &= ||r|| \\
\text{Mittlerer Effekt: } 0.30 &< ||r|| < 0.50 \\
\text{Mittlerer bis starker Effekt: }0.50 &= ||r|| \\
\text{Starker Effekt: } 0.50 &< ||r||
\end{align}
\]
Damit entspricht eine Effektstärke von 0.78 einem starken Effekt.
ALTERNATIVE
\[w = \left|\sqrt\frac{\mathcal{X}^2}{n}\right|\] mit:
anzahl <- nrow(wallis)
chi <- test$statistic
w<- sqrt(chi /anzahl)
sprintf("Effektstärke: %.2f",w)
[1] "Effektstärke: 0.85"
\[
\begin{align}
\text{Schwacher Effekt: } 0.10 &< w \le 0.30 \\
\text{Mittlerer Effekt: } 0.30 &< w \le 0.50 \\
\text{Starker Effekt: } 0.50 &< w
\end{align}
\]
Damit entspricht eine Effektstärke von 0.85 einem starken Effekt.
Eine Aussage
Der Kruskal-Wallis-Test bestätigt, dass die Sportlichkeit sich durch die Altersgruppe unterscheidet (Chi-Quadrat(2) = 21.22, p = .000).
Der anschliessend durchgeführte Post-hoc-Test (Tukey) zeigt, dass alle Gruppen “0-30” (Median = 13.5, n = 10)und “31-55” (Median = 9.2, n = 8), sowie “56+” (Median = 3.0, n = 9) signifikant unterscheiden (p < .05).
Die Effektstärke (w = .85) zeigt ein starken Effekt, sodass tatsächlich die Altersgruppe einen grossen Effekt auf die Ausdauer, gemessen in Minuten auf dem Laufband, hat.
H0 wird ablehnen.
LS0tDQpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sNCi0tLQ0KDQoNCiMgQmVyZWNobnVuZyBkZXIgVGVzdHN0YXRpc3RpayANCg0KRGVyIEtydXNrYWwtV2FsbGlzLVRlc3QgYmFzaWVydCBhdWYgZGVyIElkZWUgZGVyIFJhbmdpZXJ1bmcgZGVyIERhdGVuLiBEYXMgaGVpc3N0LCBlcyB3aXJkIG5pY2h0IG1pdCBkZW4gTWVzc3dlcnRlbiBzZWxic3QgZ2VyZWNobmV0LCBzb25kZXJuIGRpZXNlIHdlcmRlbiBkdXJjaCBSw6RuZ2UgZXJzZXR6dCwgbWl0IHdlbGNoZW4gZGVyIGVpZ2VudGxpY2hlIFRlc3QgZHVyY2hnZWbDvGhydCB3aXJkLiBEYW1pdCBiZXJ1aHQgZGllIEJlcmVjaG51bmcgZGVzIFRlc3RzIGF1c3NjaGxpZXNzbGljaCBhdWYgZGVyIE9yZG51bmcgZGVyIERhdGVuIChncsO2c3NlciBhbHMsIGtsZWluZXIgYWxzKS4gRGllIGFic29sdXRlbiBBYnN0w6RuZGUgendpc2NoZW4gZGVuIFdlcnRlbiB3ZXJkZW4gbmljaHQgYmVyw7xja3NpY2h0aWd0Lg0KDQpIaWVyYmVpIHdlcmRlbiBkaWUgTWVzc3dlcnRlIG1pdCBSw6RuZ2VuIHZlcnNlaGVuLiBBbHMgZXJzdGVzIHdlcmRlbiBkaWUgZWluemVsbmVuIE1lc3N3ZXJ0ZSBpaHJlciBHcsO2c2UgDQpuYWNoIGF1ZmdlcmVpaHQuIERpZXMgZ2VzY2hpZWh0IHVuYWJow6RuZ2lnIHZvbiBkZXIgR3J1cHBlbnp1Z2Vow7ZyaWdrZWl0IChTcGFsdGUgIkdydXBwZSIpLiBEYW5hY2ggd2VyZGVuIGRpZSBNZXNzd2VydGUgcmFuZ2llcnQgdW5kIGdldHJlbm50IGbDvHIgamVkZSBHcnVwcGUgYmVuYW5udC4NCg0KRGllc2UgUsOkbmdlIHNpbmQgaW4gQWJiaWxkdW5nIGluIGRlbiBTcGFsdGVuICJSw6RuZ2UgJzAtMzAnIiBiaXMgNTYrJyIgZW50aGFsdGVuLiBLb21tdCBlaW4gTWVzc3dlcnQgbWVocmZhY2ggdm9yIChlbmdsLiAidGllcyIpLCBzbyB3ZXJkZW4gc29nZW5hbm50ZSAidmVyYnVuZGVuZSBSw6RuZ2UiIGdlYmlsZGV0Lg0KDQoNCldlbm4gUmFuZyAxIHVuZCAyIGJlaWRlIGRpZSBnbGVpY2hlbiBNZXNzd2VydGUgYXVmd2Vpc2VuLCB3aXJkIGF1cyBkaWVzZW4gYmVpZGVuIGRlciBNaXR0ZWx3ZXJ0IGdlYmlsZGV0ICgoMSArIDIpLzIgPSAxLjUpIHVuZCBkaWUgUsOkbmdlIDEgdW5kIDIgd2VyZGVuIG5ldSBiZWlkZSBtaXQgZGVtIFJhbmcgMS41IHZlcnNlaGVuLiBEaWVzIGlzdCBpbSB2b3JsaWVnZW5kZW4gQmVpc3BpZWwgZsO8ciBkaWUgUsOkbmdlIDEyIHVuZCAxMyAobWl0dGxlcmVyIFJhbmc6ICgxMisxMykvMiA9IDEyLjUpLCBzb3dpZSAxNCBiaXMgMTYgZGVyIEZhbGwgKG1pdHRsZXJlciBSYW5nOiAoMTQrMTUrMTYpLzMgPSAxNSkuDQoNClNjaGxpZXNzbGljaCB3ZXJkZW4gYXVzIGRpZXNlbiBlcm1pdHRlbHRlbiBSw6RuZ2VuIHNvZ2VuYW5udGUgUmFuZ3N1bW1lbiBnZWJpbGRldCAoIlN1bW1lbiIpLiBIaWVyZsO8ciB3ZXJkZW4gbGVkaWdsaWNoIGRpZSBSw6RuZ2UgZGVyIGpld2VpbGlnZW4gR3J1cHBlIGF1ZnN1bW1pZXJ0LiBEaWVzIGVyZ2lidCBlaW5lIFJhbmdzdW1tZSB2b24gMjM3LjUgZsO8ciBkaWUgR3J1cHBlIDAtMzAgKG4gPSAxMCksIDEyNCBmw7xyIGRpZSBHcnVwcGUgIjMxLTU1IiAobiA9IDgpIHVuZCA3My41IGbDvHIgZGllIEdydXBwZSAiNTYrIiAobiA9IDExKS4gWnVyIEJlcmVjaG51bmcgZGVyIFRlc3RzdGF0aXN0aWsgSCB3ZXJkZW4gZGllc2UgUmFuZ3N1bW1lbiB2ZXJ3ZW5kZXQ6IA0KDQoNCiMjIyBPaG5lIEtvcnJla3R1cg0KDQokJA0KXGJlZ2lue2FsaWdufQ0KSCAmPSBcZnJhY3sxMn17TihOKzEpfVxzdW1ee2t9X3tpPTF9XGZyYWN7Ul4yX2l9e25faX0tMyhOKzEpIA0KXGVuZHthbGlnbn0NCiQkDQoNCg0KDQokJA0KXGJlZ2lue2FsaWdufQ0KSCAmPSBcZnJhY3sxMn17MjkoMjkrMSl9KihcZnJhY3syMzcuNV4yfXsxMH0rXGZyYWN7MTI0XjJ9ezh9K1xmcmFjezczLjVeMn17MTF9KS0zKDI5KzEpID0gMjEuMDggDQpcZW5ke2FsaWdufQ0KJCQgDQoNCm1pdDoNCg0KKiAkUl9pID0kIFJhbmdzdW1tZW4gZsO8ciBqZWRlIEdydXBwZQ0KDQoqICROID0kIEdlc2FtdHN0aWNocHJvYmVuZ3LDtsOfZQ0KDQoqICRuX2kgPSQgR3LDtsOfZSBkZXIgZWluemVsbmVuIEdydXBwZQ0KDQoqICRrID0kIEFuemFobCBkZXIgR3J1cHBlbg0KDQoNCg0KDQojIyMgRnJlaWhlaXRzZ3JhZGUgDQoNCiQkZGYgPSBrIC0xICQkDQoNCiQkZGYgPSAzIC0xID0gMiQkDQoNCm1pdDoNCiogJGsgPSQgQW56YWhsIGRlciBHcnVwcGVuDQoNCg0KDQojIyMgTWl0IEtvcnJla3R1cg0KQmVpIHZlcmJ1bmRlbmVuIFLDpG5nZW4gbXVzcyBkaWUgVGVzdHN0YXRpc3RpayBrb3JyaWdpZXJ0IHdlcmRlbi4gKihXaXJkIHZvbiBkZXIgTWV0aG9kZSBrcnVza2FsLnRlc3QoKSBpYm4gUiAgYXV0b21hdGlzY2ggZ2VtYWNodC4pKg0KDQoNCiQkDQpcYmVnaW57YWxpZ259DQpIX3trb3JyfSAmPSBcZnJhY3tIfXsxLVxmcmFje1xzdW1ee219X3tqPTF9KHReM19qLXRfail9e05eMy1OfX0gXFwNClxlbmR7YWxpZ259DQokJA0KDQoNCkRhIGJlaW0gQmVpc3BpZWwgdmVyYnVuZGVuZSBSw6RuZ2Ugdm9ybGllZ2VuLCBtdXNzIGRpZSBLb3JyZWt0dXJmb3JtZWwgYW5nZXdlbmRldCB3ZXJkZW4uIDxicj4NCkVzIGxpZWdlbiBkcmVpbWFsIHZlcmJ1bmRlbmUgUsOkbmdlIHZvciAoZGFoZXIgbSA9IDQpOg0KUsOkbmdlIDEgJiAyIChkYWhlciB0MSA9IDIpIHNvd2llIDEzICYgMjggKGRhaGVyIHQyID0gMiksIDE2ICYgMiAoZGFoZXIgdDMgPSAyKSB1bmQgMjIgJiAyICYxOCAoZGFoZXIgdDMgPSAzKQ0KPGJyPkRpZXMgZXJnaWJ0OiANCg0KDQoNCiQkDQpcYmVnaW57YWxpZ259DQpIX3trb3JyfSAmPSBcZnJhY3syMS4wOH17MS1cZnJhY3soMl4zLTIpKygyXjMtMikrKDJeMy0yKSsoM14zLTMpfXsyOV4zLTI5fX0gPTIxLjENClxlbmR7YWxpZ259DQokJA0KDQoNCg0KYGBge3J9DQpyb3VuZCgyMS4wOC8oMS0oKDJeMy0yKSsoMl4zLTIpKygyXjMtMikrKDNeMy0zKSkvKDI5XjMtMjkpKSwyKQ0KYGBgDQoNCg0KbWl0Og0KDQoqICRtID0kIEFuemFobCB2ZXJidW5kZW5lIFLDpG5nZQ0KDQoqICR0X2ogPSQgQW56YWhsIFJvaGRhdGVud2VydGUsIGRpZSBpbSAkaiQtdGVuIFJhbmdwbGF0eiBzdGVoZW4NCg0KDQoNCg0KYGBge3IgaW5jbHVkZT1GQUxTRSwgcmVzdWx0cz0naGlkZSd9DQpsaWJyYXJ5KGRwbHlyKQ0KYGBgDQo8YnI+DQo8YnI+DQoNCiMjIyBEZXIgZW1wcmlzY2hlciBXZXJ0DQoNCkRlciBlbXByaXNjaGUgV2VydCBsaWVndCBiZWkgJHwyMS4xfCQuDQo8YnI+DQo8YnI+DQoNCiMjIyBEZXIga3JpdGlzY2ggV2VydA0KDQpEZXIgYmVyZWNobmV0ZSBXZXJ0IG11c3MgbnVuIGF1ZiBTaWduaWZpa2FueiBnZXByw7xmdCB3ZXJkZW4uIERpZSBUZXN0c3RhdGlzdGlrIHZlcmdsZWljaHQgZGVuIGtyaXRpc2NoZW4gV2VydCBkZXIgZHVyY2ggZGllIEZyZWloZWl0c2dyYWRlIGJlc3RpbW10ZW4gQ2hpLVF1YWRyYXQtVmVydGVpbHVuZyBtaXQgZGVtIGVycmVjaG5ldGVuIFdlcnQuIERpZXNlciBrcml0aXNjaGUgV2VydCBrYW5uIFRhYmVsbGVuIGVudG5vbW1lbiB3ZXJkZW4uDQoNCmBgYHtyfQ0KcWNoaXNxKDAuOTc1LGRmPTIpDQpgYGANCg0KDQpEZXIga3JpdGlzY2hlIFdlcnQgbGllZ3QgYmVpIDUuOTkNCg0KDQoNCjxicj4NCjxicj4NCg0KIyMjIFZlcmdsZWljaA0KDQokJHziiJIyMS4xfCA+IDUuOTkg4oaSXHRleHQge0VzIGxpZWd0IGVpbiBzaWcuIFVudGVyc2NoaWVkIHZvci59JCQNCg0KDQoNCkbDvHIgZGFzIHZvcmxpZWdlbmRlIEJlaXNwaWVsIGJldHLDvGdlIGRlciBrcml0aXNjaGUgV2VydCA1Ljk5IGJlaSBkZiA9IDIgdW5kIM6xID0gLjA1LiBJc3QgZGVyIEJldHJhZyBkZXIgVGVzdHN0YXRpc3RpayBow7ZoZXIgYWxzIGRlciBrcml0aXNjaGUgV2VydCwgc28gaXN0IGRlciBVbnRlcnNjaGllZCBzaWduaWZpa2FudC4gRGllcyB3w6RyZSBmw7xyIGRhcyBCZWlzcGllbCBkZXIgRmFsbCAoMjEuMTIyID4gNS45OSkuIEVzIGvDtm5udGUgZGFoZXIgZGF2b24gYXVzZ2VnYW5nZW4gd2VyZGVuLCBkYXNzIHNpY2ggZGllIHplbnRyYWxlbiBUZW5kZW56ZW4gdW50ZXJzY2hlaWRlbiAoQ2hpLVF1YWRyYXQoMikgPSAyMS4xMjIsIHAgPCAuMDUpLiANCg0KDQo8YnI+DQo8YnI+DQoNCiMgIEtydXNrYWwtV2FsbGlzLVRlc3QgaW4gUiANCjxicj4NCg0KIyBIeXBvdGhlc2UgDQpIMDogRXMgZ2lidCBrZWluZW4gVW50ZXJzY2hpZWQgendpc2NoZW4gQWx0ZXJzZ3J1cHBlKDAtMzAvMzEtNTUvNTYrKSB1bmQgZGVyIFNwb3J0bGljaGtlaXQgZ2VtZXNzZW4gYXVmIGRlbSBMYXVmYmFuZCBpbiBNaW51dGVuLiANCg0KDQpIMTogRXMgZ2lidCBlaW5lbiBVbnRlcnNjaGllZCB6d2lzY2hlbiBBbHRlcnNncnVwcGUoMC0zMC8zMS01NS81NispIHVuZCBkZXIgU3BvcnRsaWNoa2VpdCBnZW1lc3NlbiBhdWYgZGVtIExhdWZiYW5kIGluIE1pbnV0ZW4uDQoNCg0KIyBWb3JhdXNzZXR6dW5nZW4gZsO8ciBkZW4gS3J1c2thbC1XYWxsaXMtVGVzdA0KDQpEaWUgYWJow6RuZ2lnZSBWYXJpYWJsZSBpc3QgbWluZGVzdGVucyBvcmRpbmFsc2thbGllcnQgLT4gaXN0IGdlZ2ViZW4NCg0KRXMgbGllZ3QgZWluZSB1bmFiaMOkbmdpZ2UgVmFyaWFibGUgdm9yLCBtaXR0ZWxzIGRlciBkaWUgenUgdmVyZ2xlaWNoZW5kZW4gR3J1cHBlbiBnZWJpbGRldCB3ZXJkZW4uIC0+IERpZSBBbHRlcmdydXBwZW4gc2luZCB1bmFiaMOkbmdpZy4NCg0KDQoNCiMgRGVza3JpcHRpdmUgU3RhdGlzdGlrZW4NCg0KRGllc2UgImxpYnJhcnkoZHBseXIpIiBtdXNzIHZlcndlbmRldCB3ZXJkZW4uDQpgYGB7cn0NCndhbGxpcyAlPiUNCmdyb3VwX2J5KEFsdGVyc2dydXBwZSkgJT4lDQogIHN1bW1hcml6ZShBbnphaGwgPSBuKCksICBNZWRpYW4gPSBtZWRpYW4oU3BvcnRsaWNoa2VpdCkpICU+JQ0KICBtdXRhdGVfaWYoaXMubnVtZXJpYywgcm91bmQsIDIpDQpgYGANCg0KRGllIE1lZGlhbmUgZGVyIEdydXBwZW4gdW50ZXJzY2hlaWRlbiBzaWNoLiBEaWUgR3J1cHBlICIwLTMwIiBzY2hlaW50IGFtIHNwb3J0bGljaHN0ZW4genUgc2VpbiBtaXQgZWluZW0gV2VydCB2b24gMTMuNSBtaW4gKE49MTApLiBEaWUgR3J1cHBlICIzMS01NSIgc2NoYWZmZW4gOS4yIE1pbi4oTj04KSBhdWYgZGVtIExhdWZiYWhuIHVuZCBhbSB3ZW5pZ3N0ZW4gc3BvcnRsaWNoIGlzdCBkaWUgR3J1cHBlIGRlciAiNTYrIiBtaXQgZWluZW0gTWVkaWFuIHZvbiAzIChOPTExKS4NCg0KDQoNCg0KIyMgQm94cGxvdHMNCg0KDQpgYGB7cn0NCmJveHBsb3Qod2FsbGlzJFNwb3J0bGljaGtlaXQgfiB3YWxsaXMkQWx0ZXJzZ3J1cHBlLCBtYWluID0gIkJveHBsb3RzIEFsdGVyc2dydXBwZW4tU3BvcnRsaWNoa2VpdCAgIiwgeWxhYiA9ICJTcG9ydGxpY2hrZWl0IGdlbWVzc2VuIGF1ZiBkZW0gTGF1ZmJhaG4gaW4gTWludXRlbiIsIHhsYWI9ICJBbHRlcmdydXBwZSIgLCBjb2wgPSBjKCJsaWdodGdyZWVuIiwgImRlZXBza3libHVlIiwidG9tYXRvIikpDQoNCmBgYA0KDQpEaWUgTWVkaWFuZSBkZXIgR3J1cHBlbiB1bnRlcnNjaGVpZGVuIHNpY2guIEVzIGdpYnQgYXVnZW5zY2hlaW5saWNoIGtlaW5lIEF1c3JlaXNzZXIuDQoNCg0KIyBBTFRFUk5BVElWDQoNCg0KYGBge3J9DQpsaWJyYXJ5KGdncGxvdDIpDQpnZ3Bsb3Qod2FsbGlzLCBhZXMoeD1BbHRlcnNncnVwcGUsIHk9U3BvcnRsaWNoa2VpdCwgY29sb3I9QWx0ZXJzZ3J1cHBlKSkgKyANCmdlb21fdmlvbGluKCkgKyANCmdlb21fYm94cGxvdCh3aWR0aD0wLjIpICsNCmxhYnMoeD0gIkFsdGVyc2dydXBwZSIseSA9ICJTcG9ydGxpY2hrZWl0IiwgdGl0bGU9IkJveHBsb3RzIHp3aXNjaGVuIEFsdGVyc2dydXBwZW4iICkNCmBgYA0KDQoNCiMgRXJnZWJuaXNzZSBkZXIgS3J1c2thbC1XYWxsaXMtVGVzdA0KDQoNCmBgYHtyfQ0KdGVzdCA8LSBrcnVza2FsLnRlc3QoU3BvcnRsaWNoa2VpdCB+IEFsdGVyc2dydXBwZSwgZGF0YT13YWxsaXMpDQp0ZXN0DQpgYGANCg0KRGllIFRhYmVsbGUgemVpZ3QgVW50ZXJzY2hpZWRlLiBGw7xyIGRhcyBCZWlzcGllbCB3aXJkIGVpbmUgU2lnbmlmaWthbnogdm9uIC4wMDAgYXVzZ2VnZWJlbi4gQWxzbyBrYW5uIGRhdm9uIGF1c2dlZ2FuZ2VuIHdlcmRlbiwgZGFzcyBlcyBVbnRlcnNjaGllZGUgYmV6w7xnbGljaCBkZXIgemVudHJhbGVuIFRlbmRlbnplbiBkZXIgR3J1cHBlbiBnaWJ0IChDaGktUXVhZHJhdCgyKSA9IDIxLjIyLHAgPSAuMDAwKS4gQWxsZXJkaW5ncyBsw6Rzc3Qgc2ljaCBhdWZncnVuZCBkaWVzZXMgVGVzdHMgbmljaHQgYmVzdGltbWVuLCB3ZWxjaGUgZGVyIGRyZWkgR3J1cHBlbiBzaWNoIHNpZ25pZmlrYW50IHZvbmVpbmFuZGVyIHVudGVyc2NoZWlkZW4uIEVzIGlzdCBkZW5rYmFyLCBkYXNzIHNpY2ggbGVkaWdsaWNoIGVpbiBQYWFyIHNpZ25pZmlrYW50IHVudGVyc2NoZWlkZXQgdW5kIHp3aXNjaGVuIGRlbiDDvGJyaWdlbiBrZWluZSBzaWduaWZpa2FudGVuIFVudGVyc2NoaWVkZSB2b3JsaWVnZW4uIERhaGVyIHdpcmQgZWluIFBvc3QtaG9jLVRlc3QgZHVyY2hnZWbDvGhydC4NCg0KDQpgYGB7cn0NCg0KUG9zdEhvYyA8LSBhb3YoU3BvcnRsaWNoa2VpdCB+IEFsdGVyc2dydXBwZSwgZGF0YT13YWxsaXMpDQpUdWtleUhTRChQb3N0SG9jKQ0KDQpgYGANCg0KDQpEZXIgUG9zdC1Ib2MtVGVzdCBlcmdpYnQsIGRhc3Mgc2ljaCBhbGxlIHZlcmdsZWljaGVuZGVuIEdydXBwZW4gc2lnbmlmaWthbnQgdW50ZXJzY2hlaWRlbiAocCA8IDAuMDUpLiANCg0KRXMgZ2lidCBlaW5lbSBzaWduaWZpa2FudGVuIFVudGVyc2NoaWVkIHp3aXNjaGVuIGRlbiBkcmVpIGdldGVzdGV0ZW4gR3J1cHBlbiwgZGFzIGhlaXNzdCwgZGFzcyBqZWRlIEFsdGVyc2dydXBwZSBlaW5lbiBkZXV0bGljaGVuIFVudGVyc2NoaWVkIGluIGRlciBTcG9ydGxpY2hrZWl0IGF1ZndlaXN0Lg0KDQpFcyBrw7ZubmVuIGRyZWkgdW5hYmjDpG5naWdlIEdydXBwZW4gZ2ViaWxkZXQgd2VyZGVuLiBFaW5lIEdlbmVyYWxpc2llcnVuZyBpc3QgbcO2Z2xpY2guDQoNCg0KIyBCZXJlY2hudW5nIGRlciBFZmZla3RzdMOkcmtlDQoNCiQkciA9IFxCaWdnbHwgXGZyYWN7en17XHNxcnR7bn19XEJpZ2dsfCQkDQoNCm1pdDoNCg0KKiAkeiA9JCB6LXRyYW5zZm9ybWllcnRlcyAkcCQgZGVzIENoaS1RdWFkcmF0LVRlc3RzIG5hY2ggS3J1c2thbC1XYWxsaXMuDQoNCiogJG4gPSQgR3LDtsOfZSBkZXIgR2VzYW10c3RpY2hwcm9iZQ0KDQoNCg0KDQoNCmBgYHtyfQ0KWnN0YXQ8LXFub3JtKHRlc3QkcC52YWx1ZS8yKSAjdW5nZXJpY2h0ZXQgDQoNCnNwcmludGYoIlotV2VydCBmw7xyIGRlbiBILVRlc3QgOiAlLjJmIiwgWnN0YXQpDQoNCmRhdGVuIDwtIG5yb3cod2FsbGlzKQ0Kc3ByaW50ZigiQW56YWhsIGRlciBEYXRlbjogJS5mIiwgZGF0ZW4pDQoNCg0KZWZmIDwtIGFicyhac3RhdC9zcXJ0KGRhdGVuKSkNCnNwcmludGYoIkVmZmVrdHN0w6Rya2U6ICUuMmYiLCBlZmYpDQoNCmBgYA0KDQoNClp1ciBCZXVydGVpbHVuZyBkZXIgR3JvZXNzZSBkZXMgRWZmZWt0ZXMgZGllbnQgZGllIEVpbnRlaWx1bmcgdm9uIENvaGVuICgxOTkyKToNCg0KJCQNClxiZWdpbnthbGlnbn0NClx0ZXh0e1NjaHdhY2hlciBFZmZla3Q6IH0gMC4xMCAmPCB8fHJ8fCA8IDAuMzAgICAgICAgICAgICAgXFwNClx0ZXh0e1NjaHdhY2hlciBiaXMgbWl0dGxlcmVyIEVmZmVrdDogfSAwLjMwICY9IHx8cnx8ICAgICAgXFwNClx0ZXh0e01pdHRsZXJlciBFZmZla3Q6IH0gMC4zMCAmPCB8fHJ8fCA8IDAuNTAgICAgICAgICAgICAgXFwNClx0ZXh0e01pdHRsZXJlciBiaXMgc3RhcmtlciBFZmZla3Q6IH0wLjUwICY9IHx8cnx8ICAgICAgICAgXFwNClx0ZXh0e1N0YXJrZXIgRWZmZWt0OiB9IDAuNTAgJjwgfHxyfHwgICAgICAgIA0KXGVuZHthbGlnbn0NCiQkDQoNCkRhbWl0IGVudHNwcmljaHQgZWluZSBFZmZla3RzdMOkcmtlIHZvbiAwLjc4IGVpbmVtIHN0YXJrZW4gRWZmZWt0Lg0KDQojIEFMVEVSTkFUSVZFDQoNCg0KJCR3ID0gXGxlZnR8XHNxcnRcZnJhY3tcbWF0aGNhbHtYfV4yfXtufVxyaWdodHwkJA0KbWl0Og0KDQoqICRcY2hpXjIgPSRDaGktUXVhZHJhdC1XZXJ0IG5hY2ggS3J1c2thbC1XYWxsaXMuDQoNCiogJG4gPSQgR3LDtsOfZSBkZXIgR2VzYW10c3RpY2hwcm9iZQ0KDQoNCg0KYGBge3J9DQphbnphaGwgPC0gbnJvdyh3YWxsaXMpDQpjaGkgPC0gdGVzdCRzdGF0aXN0aWMNCg0KdzwtIHNxcnQoY2hpIC9hbnphaGwpDQogc3ByaW50ZigiRWZmZWt0c3TDpHJrZTogJS4yZiIsdykNCg0KYGBgDQoNCiQkDQpcYmVnaW57YWxpZ259DQpcdGV4dHtTY2h3YWNoZXIgRWZmZWt0OiB9IDAuMTAgJjwgdyBcbGUgMC4zMCAgICAgICAgICAgICBcXA0KXHRleHR7TWl0dGxlcmVyIEVmZmVrdDogfSAwLjMwICY8IHcgXGxlIDAuNTAgICAgICAgICAgICAgXFwNClx0ZXh0e1N0YXJrZXIgRWZmZWt0OiB9IDAuNTAgJjwgdyAgICAgICAgDQpcZW5ke2FsaWdufQ0KJCQNCg0KDQpEYW1pdCBlbnRzcHJpY2h0IGVpbmUgRWZmZWt0c3TDpHJrZSB2b24gMC44NSBlaW5lbSBzdGFya2VuIEVmZmVrdC4NCg0KDQojIEVpbmUgQXVzc2FnZQ0KDQpEZXIgS3J1c2thbC1XYWxsaXMtVGVzdCBiZXN0w6R0aWd0LCBkYXNzIGRpZSBTcG9ydGxpY2hrZWl0IHNpY2ggZHVyY2ggZGllIEFsdGVyc2dydXBwZSB1bnRlcnNjaGVpZGV0IChDaGktUXVhZHJhdCgyKSA9IDIxLjIyLCBwID0gLjAwMCkuIA0KDQpEZXIgYW5zY2hsaWVzc2VuZCBkdXJjaGdlZsO8aHJ0ZSBQb3N0LWhvYy1UZXN0IChUdWtleSkgemVpZ3QsIGRhc3MgYWxsZSBHcnVwcGVuICIwLTMwIiAoTWVkaWFuID0gMTMuNSwgbiA9IDEwKXVuZCAiMzEtNTUiIChNZWRpYW4gPSA5LjIsIG4gPSA4KSwgc293aWUgIjU2KyIgKE1lZGlhbiA9IDMuMCwgbiA9IDkpIHNpZ25pZmlrYW50IHVudGVyc2NoZWlkZW4gKHAgPCAuMDUpLiANCg0KRGllIEVmZmVrdHN0w6Rya2UgKHcgPSAuODUpIHplaWd0IGVpbiBzdGFya2VuIEVmZmVrdCwgc29kYXNzIHRhdHPDpGNobGljaCBkaWUgQWx0ZXJzZ3J1cHBlIGVpbmVuIGdyb3NzZW4gRWZmZWt0IGF1ZiBkaWUgQXVzZGF1ZXIsIGdlbWVzc2VuIGluIE1pbnV0ZW4gYXVmIGRlbSBMYXVmYmFuZCwgaGF0Lg0KDQpIMCB3aXJkIGFibGVobmVuLg==