Übung 1
Eine Kaffeekette betreibt eine Filiale in Basel und eine Filiale in
Bern. Die Berner Kolleginnen erzählen, dass sie mehr Caffè Latte
(mittlere Grösse) in Bern als in Basel für das gleiche Geld erhalten.
Sie können das nicht glauben und wollen der Sache auf den Grund gehen.
Ihre Frage lautet: Unterscheiden sich die Kaffeemengen an den
Standorten Basel und Bern?
Als erstes sammeln Sie Daten: Sie kaufen an beiden Standorten 20
Becher Caffè Latte mittlerer Grösse. Sie messen jeweils die Mengen in
ml.
Laden Sie die Datei caffe.csv
hier
herunter.
Der Datensatz umfasst zwei Variablen:
Ort |
Ort der Datenerhebung: Bern, Basel |
Menge |
Kaffeemenge in ml |
Aufgabe
- Laden Sie den Datensatz herunter und importieren Sie ihn in
R
.
- Formulieren Sie die Null- und die Alternativhypothese.
- Beschreiben Sie die Daten deskriptiv. Erstellen Sie ein Boxplot für
den Vergleich der Kaffeemengen in Bern und Basel.
- Wählen Sie den richtigen Hypothesentest aus.
- Berechnen Sie das 95%-Konfidenzintervall für die Differenz der
Kaffeemenge zwischen Bern und Basel.
- Formulieren Sie ihr Resultat in ein bis zwei Sätzen.
Lösung
- Laden Sie den Datensatz herunter und importieren Sie ihn
R
.
library(rio)
caffe <- import("../data/caffe.csv")
caffe
## Ort Menge
## 1 Basel 305.0273
## 2 Basel 311.4508
## 3 Basel 303.7935
## 4 Basel 303.1087
## 5 Basel 306.6558
## 6 Basel 285.0107
## 7 Basel 299.3285
## 8 Basel 314.2387
## 9 Basel 302.2344
## 10 Basel 281.8530
## 11 Basel 299.9207
## 12 Basel 317.6032
## 13 Basel 303.3306
## 14 Basel 304.4187
## 15 Basel 304.4873
## 16 Basel 297.1018
## 17 Basel 292.4915
## 18 Basel 301.4013
## 19 Basel 302.3160
## 20 Basel 302.5607
## 21 Bern 312.6990
## 22 Bern 330.4950
## 23 Bern 349.8080
## 24 Bern 308.7820
## 25 Bern 329.2743
## 26 Bern 325.0282
## 27 Bern 306.2820
## 28 Bern 343.6620
## 29 Bern 344.7321
## 30 Bern 277.5935
## 31 Bern 279.7771
## 32 Bern 318.5638
## 33 Bern 279.1173
## 34 Bern 324.4203
## 35 Bern 292.6793
## 36 Bern 294.0034
## 37 Bern 276.2918
## 38 Bern 318.4481
## 39 Bern 308.1934
## 40 Bern 314.1120
- Formulieren Sie ihre Hypothese.
- \(H_0\) : Die Kaffeemengen von Bern
und Basel unterscheiden sich nicht. \(\mu_{Basel} = \mu_{Bern}\).
- \(H_A\) : Die Kaffeemengen von Bern
und Basel unterscheiden sich. \(\mu_{Basel}
\neq \mu_{Bern}\).
Erläuterung: Die Fragestellung ist zweiseitig
formuliert.
- Beschreiben Sie die Daten deskriptiv und erstellen Sie ein Boxplot
für den Vergleich der Kaffeemengen in Bern und Basel.
# Teildatensätze (Subsets) erstellen
bern <- subset(caffe, Ort == "Bern")
basel <- subset(caffe, Ort == "Basel")
# Kennzahlen berechnen
summary(bern)
## Ort Menge
## Length:20 Min. :276.3
## Class :character 1st Qu.:293.7
## Mode :character Median :313.4
## Mean :311.7
## 3rd Qu.:326.1
## Max. :349.8
## Ort Menge
## Length:20 Min. :281.9
## Class :character 1st Qu.:299.8
## Mode :character Median :302.8
## Mean :301.9
## 3rd Qu.:304.6
## Max. :317.6
# Boxplot erstellen
boxplot(caffe$Menge ~ caffe$Ort)

Die durchschnittliche Kaffeemenge in Bern beträgt 311.7 ml und in
Basel 301.9 ml. Im Boxplot ist zu sehen, dass die Variationsbreite in
Bern grösser ist, als in Basel.
- Wählen Sie den richtigen t-Test aus. Erstellen Sie auch eine Grafik
für den Vergleich der 95%-Vertrauensintervalle.
- Der Stichprobenumfang pro Gruppe ist n = 20.
- Wir prüfen auf Normalverteilung der Daten in beiden Gruppen mit
einem QQ-Plot:
# QQ-Plot für Bern
qqnorm(bern$Menge)
qqline(bern$Menge)

# QQ-Plot für Basel
qqnorm(basel$Menge)
qqline(basel$Menge)

- Interpretation der QQ-Plots: Die zentralen Bereiche der Daten liegen
weitgehend auf einer Linie. Wir dürfen schliessen, dass die Daten aus
einer normalverteilten Population stammen.
- Die Daten sind unabhängig.
- Testwahl: Da n < 30, wählen wir ein nichtparametrisches
Verfahren, den Mann-Whitney-U-Test (Wilcoxon Rangsummen-Test).
Zum Vergleich führen wir aber auch einen Zweistichproben-t-Test für
unabhängige Daten durch.
wilcox.test(caffe$Menge ~ caffe$Ort, alternative = "two.sided", paired = FALSE)
##
## Wilcoxon rank sum exact test
##
## data: caffe$Menge by caffe$Ort
## W = 128, p-value = 0.0524
## alternative hypothesis: true location shift is not equal to 0
Interpretation des Wilcoxon Rangsummentests: Die Teststatistik
W interpretieren wir nicht! Die Wahrscheinlichkeit, für
unsere Teststatistik oder noch eine extremere Teststatistik unter der
Nullhypothese beträgt 5.24% (p = 0.0524)
t.test(caffe$Menge ~ caffe$Ort, alternative = "two.sided", paired = FALSE)
##
## Welch Two Sample t-test
##
## data: caffe$Menge by caffe$Ort
## t = -1.7984, df = 24.103, p-value = 0.08465
## alternative hypothesis: true difference in means between group Basel and group Bern is not equal to 0
## 95 percent confidence interval:
## -21.004502 1.441587
## sample estimates:
## mean in group Basel mean in group Bern
## 301.9167 311.6981
Interpretation des Zweistichproben-t-Tests: Die Teststatistik
t = -1.7984 ist weniger extrem als die “magische
Grenze” um -/+ 2 und wir können bereits jetzt annehmen, dass wir keinen
signifikanten Unterschied zwischen den Kaffeemengen in Basel und in Bern
haben. Die Anzahl der Freiheitsgrade df = 24.103 wollen
wir beim Welch-Test, einer Variante des Zweistichproben-t-Tests für
unabhängige Daten, nicht interpretieren. Die Wahrscheinlichkeit für
unserer Teststatistik t oder einen noch extremeren Wert
für t unter der Nullhypothese beträgt 8.465% (p
= 0.08465).
- Berechnen Sie das 95%-Konfidenzintervall für die Differenz der
Kaffeemenge zwischen Bern und Basel.
- Sie finden das 95%-Konfidenzintervall für die Differenz der
durchschnittlichen Kaffeemengen im Output des t-Tests unter 95
percent confidence interval:. Das 95%-Konfidenzintervall für die
durchschnittliche Differenz der Kaffeemengen zwischen Bern und Basel
liegt somit zwischen [-21.005, 1.442] ml. Unter der Nullhypothese liegt
die durchschnittliche Differenz bei Null. Null ist in diesem
Konfidenzintervall enthalten und somit ein plausibler Wert. Das
95%-Konfidenzintervall bestätigt die Ergebnisse der
Hypothesentests.
- Formulieren Sie ihr Resultat in ein bis zwei Sätzen.
- Die durchschnittlichen Kaffeemengen in Bern (311.7 ml) und in
Basel (301.9 ml) unterscheiden sich nicht signifikant voneinander,
Mann-Whitney-U-Test W = 128, p = 0.0524. Die durchschnittliche Differenz
der Kaffeemengen (Basel minus Bern) beträgt -9.8 [CI95: -21.005, 1.442]
ml.
Übung 3
Ein Gefängnisaufenthalt ist mit psychischem Stress verbunden. Eine
Möglichkeit, diesen Stress abzubauen ist sportliche Betätigung. Ein
Studie hat den Stresslevel von 26 Gefängnissinsassen bei Ein- und
Austritt mittels Fragebogen untersucht (je höher der Stresslevel desto
grösser der Stress). Ein Teil der Gefangenen erhielt ein sportliches
Training.
Laden Sie die Datei prisonStress.csv
hier
herunter.
Der Datensatz umfasst 5 Variablen
Subject |
anonyme ID |
Group |
Gruppe sport oder control |
PSSbefore |
Stresslevel (Assessment-Score) bei Eintritt |
PSSafter |
Stresslevel (Assessment-Score) bei Austritt |
Diff |
Paarweise Differenzen (PSSafter - PSSbefore) |
Aufgabe
- Laden Sie den Datensatz in
R
und kategorisieren Sie die
Variablen.
- Frage: Haben beide Gruppen bei Eintritt den gleichen
Stresslevel?
- Frage: Haben beide Gruppen bei Austritt den gleichen
Stresslevel?
- Frage: Besteht ein Unterschied im Stresslevel zwischen Ein- und
Austritt in der Kontrollgruppe?
- Frage: Besteht ein Unterschied im Stresslevel zwischen Ein- und
Austritt in der Sportgruppe?
- Frage: Hat Sport einen Effekt auf den Stresslevel im Vergleich zu
einer Kontrollgruppe, die keinen Sport macht?
Führen Sie für alle Fragen sowohl einen nichtparametrischen
(Wilcoxon) als auch einen parametrischen (t-Test) Test durch.
Lösung 1
prison <- import("../data/prisonStress.csv")
str(prison)
## 'data.frame': 26 obs. of 5 variables:
## $ Subject : chr "A1" "A3" "A4" "A5" ...
## $ Group : chr "Sport" "Sport" "Sport" "Sport" ...
## $ PSSbefore: int 25 17 12 21 29 28 21 18 20 29 ...
## $ PSSafter : int 13 15 13 22 25 24 19 19 24 21 ...
## $ Diff : int -12 -2 1 1 -4 -4 -2 1 4 -8 ...
# Die Variable Group ist nominal und wird als factor kategorisiert
prison$Group <- factor(prison$Group)
str(prison)
## 'data.frame': 26 obs. of 5 variables:
## $ Subject : chr "A1" "A3" "A4" "A5" ...
## $ Group : Factor w/ 2 levels "Control","Sport": 2 2 2 2 2 2 2 2 2 2 ...
## $ PSSbefore: int 25 17 12 21 29 28 21 18 20 29 ...
## $ PSSafter : int 13 15 13 22 25 24 19 19 24 21 ...
## $ Diff : int -12 -2 1 1 -4 -4 -2 1 4 -8 ...
Lösung 2
Fragestellung: Haben die Gruppen Sport und Control
bei Eintritt den gleichen Stresslevel?
Hypothesen
- \(H_0\) Es besteht kein Unterschied
im Stresslevel der Gruppen Sport und Kontrolle bei Eintritt, \(\mu_{con,before} =
\mu_{sport,before}\)
- \(H_A\) Es besteht ein Unterschied
im Stresslevel der Gruppen Sport und Kontrolle bei Eintritt, \(\mu_{con,before} \neq
\mu_{sport,before}\)
# Deskriptive Statistik nach Subsets
sport <- subset(prison, Group == "Sport")
control <- subset(prison, Group == "Control")
summary(sport$PSSbefore)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 12.00 19.00 23.00 23.93 27.50 44.00
summary(control$PSSbefore)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 0.00 9.00 15.00 16.36 26.00 30.00
boxplot(prison$PSSbefore ~ prison$Group)

- Das Signifikanzniveau legen wir bei \(\alpha = 0.05\) fest.
- Die Daten sind unabhängig (wir vergleichen zwei unterschiedliche
Gruppen).
- Die Prüfgrösse ist die Differenz der Mittelwerte der beiden Gruppen
\(\mu_{con,before} -
\mu_{sport,before}\)
- Der Stichprobenumfang pro Gruppe ist n < 30, was für den
Man-Whitney-U-Test spricht.
- Die Verteilung der Prüfgrösse anhand der Box im Boxplot ergibt eine
leicht rechtssteile Verteilung in der Kontrollgruppe und etwa
Normalverteilung in der Sportgruppe. Die QQ-Plots sind wenig
aussagekräftig. Die Streuung der Daten ist unterschiedlich.
# QQ-Plot für Sportgruppe
qqnorm(sport$PSSbefore)
qqline(sport$PSSbefore, col = "blue")

# QQ-Plot für Controlgruppe
qqnorm(control$PSSbefore)
qqline(control$PSSbefore, col = "blue")

- Die Prüfung der Testbedingungen legt nichtparametrische Verfahren
zur statistischen Analyse nahe.
- Vertrauensintervalle für die Prüfgrösse und Teststatistik
bestimmen
wilcox.test(PSSbefore ~ Group, data = prison, alternative = "two.sided")
## Warning in wilcox.test.default(x = DATA[[1L]], y = DATA[[2L]], ...): kann bei
## Bindungen keinen exakten p-Wert Berechnen
##
## Wilcoxon rank sum test with continuity correction
##
## data: PSSbefore by Group
## W = 52.5, p-value = 0.1249
## alternative hypothesis: true location shift is not equal to 0
Interpretation des Wilcoxon Rangsummentests (= Mann-Whitney-U-Test):
Die Warnung können Sie ignorieren ;). Die Teststatistik
W interpretieren wir nicht. Die Wahrscheinlichkeit für
den Wert der Teststatistik oder einen noch extremeren Wert beträgt 12.5%
(p = 0.1249).
t.test(PSSbefore ~ Group, data = prison, alternative = "two.sided")
##
## Welch Two Sample t-test
##
## data: PSSbefore by Group
## t = -2.0064, df = 16.863, p-value = 0.06112
## alternative hypothesis: true difference in means between group Control and group Sport is not equal to 0
## 95 percent confidence interval:
## -15.5344325 0.3950385
## sample estimates:
## mean in group Control mean in group Sport
## 16.36364 23.93333
Interpretation des Zweistichproben-t-Tests: Die Teststatistik beträgt
t = -2.0064. Dieser Wert liegt in der Nähe der
“magischen Grenze” von -2. Allerdings liegen hier kleine
Stichprobenumfänge vor, wodurch die Kurve der t-Verteilung an den Enden
sehr flach verläuft und der kritische Wert für die 2.5% Grenze weiter
als -2.0 liegt. Anzahl Freiheitsgrade df interpretieren
wir beim Welch-Test nicht. Die Wahrscheinlichkeit für den Wert der
Teststatistik t oder einen noch extremeren Wert unter der Nullhypothese
beträgt 6.1% (p = 0.06112). Die Sportgruppe hat bei
Eintritt im Durchschnitt einen etwas höheren Stresslevel (23.9) als die
Controlgruppe (16.4). Die durchschnittliche Differenz des Stresslevels
zwischen den beiden Gruppen (Control minus Sport) beträgt -7.560
[95%-CI: -15.534, 0.395]. Dieses 95%-Konfidenzintervall schliesst 0 ein
und unterstützt die Ergebnisse aus den Hypothesentests. Für die
Formulierung des Resultats verwenden wir nur die Angaben zum
95%-Konfidenzintervall, da wir uns für den Mann-Whitney-U-Test als
korrekten Test entschieden haben!
- Resultat, Schlussfolgerung
Der Stresslevel bei Eintritt ins Gefängnis ist in der
Kontrollgruppe (n = 11) im Durchschnitt um -7.560 [-15.534, 0.395]
Punkte tiefer als in der Sportgruppe (n = 15). Es liegt jedoch keine
Evidenz dafür vor, dass sich die beiden Gruppen im Stresslevel bei
Eintritt ins Gefängnis signifikant unterscheiden, Man-Whitney-U = 52.5,
p = 0.1249.
Lösung 3
Fragestellung: Haben beide Gruppen bei Austritt den gleichen
Stresslevel? Das ist die ähnliche Fragestellung wie Frage 2. Versuchen
Sie diese Aufgabe möglichst ohne Hilfsmittel zu bearbeiten.
Hypothesen
- \(H_0\) Es besteht kein Unterschied
im Stresslevel der Gruppen Sport und Kontrolle bei Austritt, \(\mu_{con,after} = \mu_{sport,after}\)
- \(H_A\) Es besteht ein Unterschied
im Stresslevel der Gruppen Sport und Kontrolle bei Austritt, \(\mu_{con,after} \neq
\mu_{sport,after}\)
Das Signifikanzniveau legen wir bei \(\alpha = .05\) fest.
Die Daten sind unabhängig.
Die Prüfgrösse ist \(\mu_{con,after} -
\mu_{sport,after}\).
Der Stichprobenumfang pro Gruppe ist n < 30, was für
Man-Whitney-U-Test spricht.
# Die Subsets sport und control haben wir schon unter Lösung 1 gemacht
summary(sport$PSSafter)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 8 14 21 20 24 33
summary(control$PSSafter)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 9.00 20.50 26.00 23.73 28.50 33.00
boxplot(prison$PSSafter ~ prison$Group)

- Die Verteilung der Prüfgrösse anhand der Box im Boxplot ergibt eine
leicht rechtssteile Verteilung in beiden Gruppen. Die QQ-Plots sind
wenig aussagekräftig. Die Streuung der Daten ist ähnlich.
# QQ-Plot für Sportgruppe
qqnorm(sport$PSSafter)
qqline(sport$PSSafter, col = "blue")

# QQ-Plot für Controlgruppe
qqnorm(control$PSSafter)
qqline(control$PSSafter, col = "blue")

- Die Prüfung der Testbedingungen (n < 30, rechtssteile
Verteilungen) legt nichtparametrische Verfahren zur statistischen
Analyse nahe.
- Vertrauensintervalle für die Prüfgrösse und Teststatistik
bestimmen
wilcox.test(PSSafter ~ Group, data = prison, alternative = "two.sided")
## Warning in wilcox.test.default(x = DATA[[1L]], y = DATA[[2L]], ...): kann bei
## Bindungen keinen exakten p-Wert Berechnen
##
## Wilcoxon rank sum test with continuity correction
##
## data: PSSafter by Group
## W = 108.5, p-value = 0.185
## alternative hypothesis: true location shift is not equal to 0
t.test(PSSafter ~ Group, data = prison, alternative = "two.sided")
##
## Welch Two Sample t-test
##
## data: PSSafter by Group
## t = 1.3361, df = 21.325, p-value = 0.1956
## alternative hypothesis: true difference in means between group Control and group Sport is not equal to 0
## 95 percent confidence interval:
## -2.068912 9.523458
## sample estimates:
## mean in group Control mean in group Sport
## 23.72727 20.00000
- Schlussfolgerung
Der Stresslevel bei Austritt aus dem Gefängnis ist in der
Kontrollgruppe (n = 11) im Durchschnitt um 3.727 [95%-CI: -2.069, 9.523]
Punkte höher als in der Sportgruppe (n = 15). Es liegt keine Evidenz
dafür vor, dass sich die beiden Gruppen im Stresslevel bei Austritt aus
dem Gefängnis signifikant unterscheiden, Man-Whitney-U-Test W = 108.5, p
= 0.185.
Lösung 4
Fragestellung: Besteht ein Unterschied im Stresslevel zwischen Ein-
und Austritt in der Kontrollgruppe?
Hypothesen
- \(H_0\) Es besteht kein Unterschied
im Stresslevel in der Kontrollgruppe zwischen Ein- und Austritt, \(\mu_{con,diff}=0}\) (Mittelwert der
paarweisen Differenzen!)
- \(H_A\) Es besteht ein Unterschied
im Stresslevel in der Kontrollgruppe bei Eintritt, \(\mu_{con,diff} \neq 0\)$
Das Signifikanzniveau legen wir bei \(\alpha = .05\) fest.
Die Daten sind gepaart (2 Messungen pro Proband:in).
Die Prüfgrösse ist \(\mu_{con,diff}\). Die paarweisen
Differenzen sind in der Variablen prison$Diff
berechnet.
Wir arbeiten hier nur mit dem Subset control
.
Der Stichprobenumfang ist n = 11, was für den
Wilcoxon-Vorzeichenrang-Test spricht. Hinweis: Bei gepaarten Daten
darf ein parametrischer Test bereits bei einem Stichprobenumfang von n =
12 oder mehr durchgeführt werden.
# Das subset control wurde bereits in Lösung 1 erstellt
summary(control$Diff)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## -8.000 0.500 7.000 7.364 15.000 20.000

- Die Verteilung der Prüfgrösse
Diff
anhand von Boxplot
und QQ-Plot ist auf Grund der geringen Datenmenge wenig zuverlässig zu
interpretieren; es scheint aber nichts dagegen zu sprechen, dass die
Daten aus einer normalverteilten Population stammen.
## QQ-Plot für Diff in der Gruppe Control
qqnorm(control$Diff)
qqline(control$Diff, col = "blue")

- Die Prüfung der Testbedingungen (n < 12) legt nichtparametrische
Verfahren zur statistischen Analyse nahe. Wir führen aber auch den
t-Test für gepaarte Daten durch, um das 95%-Konfidenzintervall zu
berechnen.
- Vertrauensintervalle für die Prüfgrösse und Teststatistik
bestimmen
wilcox.test(control$PSSafter, control$PSSbefore,
paired = TRUE, alternative = "two.sided")
## Warning in wilcox.test.default(control$PSSafter, control$PSSbefore, paired =
## TRUE, : kann bei Bindungen keinen exakten p-Wert Berechnen
## Warning in wilcox.test.default(control$PSSafter, control$PSSbefore, paired =
## TRUE, : kann den exakten p-Wert bei Nullen nicht berechnen
##
## Wilcoxon signed rank test with continuity correction
##
## data: control$PSSafter and control$PSSbefore
## V = 47.5, p-value = 0.04657
## alternative hypothesis: true location shift is not equal to 0
t.test(control$PSSafter, control$PSSbefore,
paired = TRUE, alternative = "two.sided")
- Schlussfolgerung
Der Stresslevel bei Austritt aus dem Gefängnis ist in der
Kontrollgruppe (n = 11) im Durchschnitt um 7.634 [95%-CI: 1.161, 13.567]
Punkte höher als beim Eintritt. Es liegt Evidenz dafür vor, dass sich
der durchschnittliche Stresslevel in der Kontrollgruppe beim Aufenthalt
im Gefängnis signifikant erhöht hat, Wilcoxon Vorzeichenrang-Test V =
47.5, p = 0.047.
Lösung 5
Fragestellung: Besteht ein Unterschied im Stresslevel zwischen Ein-
und Austritt in der Sportgruppe? Das ist die ähnliche Fragestellung wie
Frage 4. Versuchen Sie diese Aufgabe möglichst ohne Hilfsmittel zu
bearbeiten.
Hypothesen
- \(H_0\) Es besteht kein Unterschied
im Stresslevel in der Sportgruppe zwischen Ein- und Austritt, \(\mu_{sport,diff}=0}\) (Mittelwert der
paarweisen Differenzen!)
- \(H_A\) Es besteht ein Unterschied
im Stresslevel in der Kontrollgruppe bei Eintritt, \(\mu_{sport,diff} \neq 0\)$
Das Signifikanzniveau legen wir bei \(\alpha = .05\) fest.
Die Daten sind gepaart (2 Messungen pro Proband)
Die Prüfgrösse ist \(\mu_{sport,diff}\)
Der Stichprobenumfang in der Sportgruppe ist n = 15. Bei
gepaarten Daten darf ein parametrischer Test bereits bei einem
Stichprobenumfang von n = 12 oder mehr durchgeführt werden.
# Das subset sport wurde bereits in Lösung 1 erstellt
summary(sport$Diff)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## -15.000 -7.000 -4.000 -3.933 1.000 4.000

- Die Verteilung der Prüfgrösse
Diff
anhand von Boxplot
und QQ-Plot ist auf Grund der geringen Datenmenge wenig zuverlässig zu
interpretieren; es scheint aber nichts dagegen zu sprechen, dass die
Daten aus einer normalverteilten Population stammen.
# QQ-Plot für Diff in der Sportgruppe
qqnorm(sport$Diff)
qqline(sport$Diff, col = "blue")

- Die Prüfung der Testbedingungen legt ein parametrisches Verfahren
zur statistischen Analyse nahe.
- Vertrauensintervalle für die Prüfgrösse und Teststatistik
bestimmen
t.test(sport$PSSafter, sport$PSSbefore,
paired = TRUE, alternative = "two.sided")
Paired t-test
data: sport\(PSSafter and
sport\)PSSbefore t = -2.6842, df = 14, p-value = 0.0178
alternative hypothesis: true mean difference is not equal to 0 95
percent confidence interval: -7.0762338 -0.7904329 sample estimates:
mean difference -3.933333
- Schlussfolgerung
Der Stresslevel bei Austritt aus dem Gefängnis ist in der
Sportgruppe (n = 15) im Durchschnitt um -3.933 [95%-CI: -7.076, -0.790]
Punkte tiefer als beim Eintritt. Es liegt Evidenz dafür vor, dass sich
der Stresslevel beim Aufenthalt im Gefängnis in der Sportgruppe
signifikant senkt, t = -2.684, df = 14, p = 0.0178.
Hinweis: Bei den Übungen 4 und 5 können Sie die
Tests auch als Einstichproben-Test für die die paarweisen Differenzen
Diff
und den Nullwert 0 durchführen. Das Ergebnis ist
identisch.
t.test(sport$Diff, mu = 0, alternative = "two.sided")
##
## One Sample t-test
##
## data: sport$Diff
## t = -2.6842, df = 14, p-value = 0.0178
## alternative hypothesis: true mean is not equal to 0
## 95 percent confidence interval:
## -7.0762338 -0.7904329
## sample estimates:
## mean of x
## -3.933333
Lösung 6
Fragestellung: Hat Sport einen Effekt auf den Stresslevel im
Vergleich zu einer Kontrollgruppe, die keinen Sport macht?
Hypothesen
- \(H_0\) Sport hat keinen Effekt,
\(\mu_{diff,sport} =
\mu_{diff,con}\)
- \(H_A\) Sport hat einen Effekt,
\(\mu_{diff,sport} \neq
\mu_{diff,con}\)
Das Signifikanzniveau legen wir bei \(\alpha = .05\) fest.
Die Daten sind unabhängig.
Die Prüfgrösse ist \(\mu_{diff,sport} =
\mu_{diff,con}\)
Der Stichprobenumfang pro Gruppe ist n < 30, was für
Man-Whitney-U-Test spricht. In diesem Fall ist es nicht mehr nötig
QQ-Plots zu erstellen, wir machen es übungshalber trotzdem ;).
Min. 1st Qu. Median Mean 3rd Qu. Max. -8.000 0.500 7.000 7.364 15.000
20.000
Min. 1st Qu. Median Mean 3rd Qu. Max. -15.000 -7.000 -4.000 -3.933
1.000 4.000
boxplot(prison$Diff ~ prison$Group)

- Die Verteilung der Daten in beiden Gruppen anhand von Boxplot und
QQ-Plot ist auf Grund der geringen Datenmenge wenig zuverlässig zu
interpretieren; es scheint aber nichts dagegen zu sprechen, dass die
Daten aus einer normalverteilten Population stammen.
## QQ-Plot für Diff in der Controlgruppe
qqnorm(control$Diff)
qqline(control$Diff, col = "blue")

## QQ-Plot für Diff in der Controlgruppe
qqnorm(sport$Diff)
qqline(sport$Diff, col = "blue")

- Die Prüfung der Testbedingungen legt nichtparametrische Verfahren
zur statistischen Analyse nahe.
- Vertrauensintervalle für die Prüfgrösse und Teststatistik
bestimmen
wilcox.test(Diff ~ Group, data = prison, alternative = "two.sided")
## Warning in wilcox.test.default(x = DATA[[1L]], y = DATA[[2L]], ...): kann bei
## Bindungen keinen exakten p-Wert Berechnen
##
## Wilcoxon rank sum test with continuity correction
##
## data: Diff by Group
## W = 138, p-value = 0.004218
## alternative hypothesis: true location shift is not equal to 0
t.test(Diff ~ Group, data = prison, alternative = "two.sided")
##
## Welch Two Sample t-test
##
## data: Diff by Group
## t = 3.5908, df = 15.461, p-value = 0.002565
## alternative hypothesis: true difference in means between group Control and group Sport is not equal to 0
## 95 percent confidence interval:
## 4.608668 17.985272
## sample estimates:
## mean in group Control mean in group Sport
## 7.363636 -3.933333
- Schlussfolgerung
Untersucht wurde der Effekt von Sport auf den Stresslevel bei
Gefängnisinsassen, die in eine Sport- (n = 15) und eine Kontrollgruppe
(n = 11) eingeteilt wurden. In der Kontrollgruppe hat der Stresslevel um
7.364 Punkte zugenommen und in der Sportgruppe um durchschnittlich
-3.933 Punkte abgenommen. Im Durchschnitt vermindert sich der
Stresslevel in der Sportgruppe um 11.297 [4.608, 17.985] Punkte im
Vergleich zur Contorlgruppe. Die Daten liefern Evidenz dafür, dass sich
Sport günstig auf den Stresslevel im Gefängnis auswirkt,
Man-Whitney-U-Test W = 138, p = .0042.
LS0tDQp0aXRsZTogJ8OcYnVuZ2VuOiBNaXR0ZWx3ZXJ0c3ZlcmdsZWljaGUsIFRlaWwgMicNCmF1dGhvcjogIkx1a2FzIFN0YW1tbGVyIg0KZGF0ZTogImByIFN5cy5EYXRlKClgIg0Kb3V0cHV0Og0KICBodG1sX2RvY3VtZW50Og0KICAgIGZpZ19oZWlnaHQ6IDYNCiAgICBmaWdfd2lkdGg6IDYNCiAgICBoaWdobGlnaHQ6IHB5Z21lbnRzDQogICAgdGhlbWU6IHlldGkNCiAgICBjb2RlX2Rvd25sb2FkOiB0cnVlDQogICAgY29kZV9mb2xkaW5nOiBoaWRlDQogICAgdG9jOiB0cnVlDQogICAgdG9jX2Zsb2F0OiB0cnVlDQotLS0NCg0KYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0V9DQpybShsaXN0ID0gbHMoKSkNCg0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBUUlVFLCBtZXNzYWdlID0gRkFMU0UsIGZpZy5hbGlnbiA9ICJjZW50ZXIiKQ0KDQpsaWJyYXJ5KGtuaXRyKQ0KYGBgDQoNCg0KDQoNCiMgUHJheGlzdGlwcDogVm9yZ2VoZW4gYmVpIEh5cG90aGVzZW50ZXN0cyBmw7xyIHF1YW50aXRhdGl2ZSBEYXRlbg0KDQoxLiBIeXBvdGhlc2VuICRIXzAkIHVuZCAkSF9BJCBmb3JtdWxpZXJlbi4gU2luZCBkaWVzZSBlaW5zZWl0aWcgb2RlciB6d2Vpc2VpdGlnIGZvcm11bGllcnQ/ICANCjIuIFNpZ25pZmlrYW56bml2ZWF1IGZlc3RsZWdlbi4gRsO8ciBhbGxlIMOcYnVuZ2VuIHdpcmQgJFxhbHBoYSA8IDAuMDUkIGZlc3RnZWxlZ3QuDQozLiBTaW5kIGRpZSBEYXRlbiBnZXBhYXJ0IChwYWlyZWQpIG9kZXIgdW5hYmjDpG5naWcgKGluZGVwZW5kZW50KT8gDQo0LiBQcsO8Zmdyw7Zzc2UgYmVzdGltbWVuOiANCiAgICsgZsO8ciB1bmFiaMOkbmdpZ2UgRGF0ZW46ICRcbXVfMiAtIFxtdV8xJCAoRGlmZmVyZW56IGRlciBNaXR0ZWx3ZXJ0ZSkgICANCiAgICsgZsO8ciBnZXBhYXJ0ZSBEYXRlbjogJFxtdV97ZGlmZn0kIChNaXR0ZWx3ZXJ0IGRlciBwYWFyd2Vpc2VuIERpZmZlcmVuemVuKSANCiAgICsgd2VubiBTaWUgc2ljaCBmw7xyIG5pY2h0LXBhcmFtZXRyaXNjaGUgVGVzdHMgZW50c2NoZWlkZW4sIGVyc2V0emVuIHNpZSAkXG11JCBkdXJjaCAkTWQkIChNZWRpYW4pDQo1LiBTdGljaHByb2JlbnVtZmFuZyBwcsO8ZmVuICAgDQogICArICRuIDwgMzAkOiBuaWNocGFyYW1ldHJpc2NoZW4gVGVzdCAoV2lsY294b24pIHfDpGhsZW4gICAgDQogICArIHVudGVyc2NoaWVkbGljaGUgU3RpY2hwcm9iZW51bWbDpG5nZSBiZWkgdW5hYmjDpG5naWdlbiBEYXRlbjogbmljaHRwYXJhbWV0cmlzY2hlbiBUZXN0IChXaWxjb3hvbikgd8OkaGxlbiAgIA0KNi4gVmVydGVpbHVuZyBkZXIgUHLDvGZncsO2c3NlIHVudGVyc3VjaGVuICAgIA0KICAgKyBEYXRlbiBzaW5kIGFubsOkaGVybmQgbm9ybWFsdmVydGVpbHQ6IHQtVGVzdCB3w6RobGVuICAgIA0KICAgKyBEYXRlbiBzaW5kIG5pY2h0IG5vcm1hbHZlcnRlaWx0OiBuaWNodHBhcmFtZXRyaXNjaGVuIFRlc3QgKFdpbGNveG9uKSB3w6RobGVuICAgICANCiAgICsgVW50ZXJzY2hpZWRsaWNoZSBWYXJpYW56ZW4gYmVpIHVuYWJow6RuZ2lnZW4gRGF0ZW46IG5pY2h0cGFyYW1ldHJpc2NoZW4gVGVzdCAoV2lsY294b24pIHfDpGhsZW4uICAgIA0KNy4gVmVydHJhdWVuc2ludGVydmFsbGUgZsO8ciBkaWUgUHLDvGZncsO2c3NlIGJlcmVjaG5lbi4NCjguIEdld8OkaGx0ZW4gVGVzdCBkdXJjaGbDvGhyZW46IHQtIHVuZCBwLVdlcnQgYmVzdGltbWVuLiAgICANCjkuIFNjaGx1c3Nmb2xnZXJ1bmcgemllaGVuIHVuZCBkYXMgRXJnZWJuaXMgaW0gWnVzYW1tZW5oYW5nIG1pdCBkZXIgRm9yc2NodW5nc2ZyYWdlIGludGVycHJldGllcmVuLiAgICANCg0KPGJyPg0KDQojIMOcYnVuZyAxIHsudGFic2V0fQ0KDQpFaW5lIEthZmZlZWtldHRlIGJldHJlaWJ0IGVpbmUgRmlsaWFsZSBpbiBCYXNlbCB1bmQgZWluZSBGaWxpYWxlIGluIEJlcm4uIERpZSBCZXJuZXIgS29sbGVnaW5uZW4gZXJ6w6RobGVuLCBkYXNzIHNpZSBtZWhyIENhZmbDqCBMYXR0ZSAobWl0dGxlcmUgR3LDtnNzZSkgaW4gQmVybiBhbHMgaW4gQmFzZWwgZsO8ciBkYXMgZ2xlaWNoZSBHZWxkIGVyaGFsdGVuLiBTaWUga8O2bm5lbiBkYXMgbmljaHQgZ2xhdWJlbiB1bmQgd29sbGVuIGRlciBTYWNoZSBhdWYgZGVuIEdydW5kIGdlaGVuLiBJaHJlIEZyYWdlIGxhdXRldDogKlVudGVyc2NoZWlkZW4gc2ljaCBkaWUgS2FmZmVlbWVuZ2VuIGFuIGRlbiBTdGFuZG9ydGVuIEJhc2VsIHVuZCBCZXJuPyogICAgDQoNCkFscyBlcnN0ZXMgc2FtbWVsbiBTaWUgRGF0ZW46IFNpZSBrYXVmZW4gYW4gYmVpZGVuIFN0YW5kb3J0ZW4gMjAgQmVjaGVyIENhZmbDqCBMYXR0ZSBtaXR0bGVyZXIgR3LDtnNzZS4gU2llIG1lc3NlbiBqZXdlaWxzIGRpZSBNZW5nZW4gaW4gbWwuDQoNCkxhZGVuIFNpZSBkaWUgRGF0ZWkgYGNhZmZlLmNzdmAgIFtoaWVyXShodHRwczovL21vb2RsZS5iZmguY2gvbW9kL2ZvbGRlci92aWV3LnBocD9pZD0xNjkwNDMzKSBoZXJ1bnRlci4NCg0KDQpEZXIgRGF0ZW5zYXR6IHVtZmFzc3QgendlaSBWYXJpYWJsZW46ICAgICANCg0KVmFyaWFibGUgfCBCZXNjaHJlaWJ1bmcNCi0tLS0tLS0tIHwgLS0tLS0tLS0tLS0tDQpPcnQgfCBPcnQgZGVyIERhdGVuZXJoZWJ1bmc6IEJlcm4sIEJhc2VsICAgIA0KTWVuZ2UgfCBLYWZmZWVtZW5nZSBpbiBtbCAgDQoNCg0KIyMgQXVmZ2FiZSAgDQoNCjEuIExhZGVuIFNpZSBkZW4gRGF0ZW5zYXR6IGhlcnVudGVyIHVuZCBpbXBvcnRpZXJlbiBTaWUgaWhuIGluIGBSYC4gICANCjIuIEZvcm11bGllcmVuIFNpZSBkaWUgTnVsbC0gdW5kIGRpZSBBbHRlcm5hdGl2aHlwb3RoZXNlLiAgIA0KMy4gQmVzY2hyZWliZW4gU2llIGRpZSBEYXRlbiBkZXNrcmlwdGl2LiBFcnN0ZWxsZW4gU2llIGVpbiBCb3hwbG90IGbDvHIgZGVuIFZlcmdsZWljaCBkZXIgS2FmZmVlbWVuZ2VuIGluIEJlcm4gdW5kIEJhc2VsLiAgIA0KNC4gV8OkaGxlbiBTaWUgZGVuIHJpY2h0aWdlbiBIeXBvdGhlc2VudGVzdCBhdXMuICANCjUuIEJlcmVjaG5lbiBTaWUgZGFzIDk1JS1Lb25maWRlbnppbnRlcnZhbGwgZsO8ciBkaWUgRGlmZmVyZW56IGRlciBLYWZmZWVtZW5nZSB6d2lzY2hlbiBCZXJuIHVuZCBCYXNlbC4NCjYuIEZvcm11bGllcmVuIFNpZSBpaHIgUmVzdWx0YXQgaW4gZWluIGJpcyB6d2VpIFPDpHR6ZW4uICANCg0KPGJyIC8+DQo8YnIgLz4NCg0KIyMgTMO2c3VuZyAgDQoNCjEuIExhZGVuIFNpZSBkZW4gRGF0ZW5zYXR6IGhlcnVudGVyIHVuZCBpbXBvcnRpZXJlbiBTaWUgaWhuIGBSYC4gDQoNCmBgYHtyfQ0KbGlicmFyeShyaW8pDQpjYWZmZSA8LSBpbXBvcnQoIi4uL2RhdGEvY2FmZmUuY3N2IikNCmNhZmZlDQpgYGANCg0KDQoyLiBGb3JtdWxpZXJlbiBTaWUgaWhyZSBIeXBvdGhlc2UuICAgDQoNCiogJEhfMCQgOiBEaWUgS2FmZmVlbWVuZ2VuIHZvbiBCZXJuIHVuZCBCYXNlbCB1bnRlcnNjaGVpZGVuIHNpY2ggbmljaHQuICRcbXVfe0Jhc2VsfSA9IFxtdV97QmVybn0kLiAgICANCiogJEhfQSQgOiBEaWUgS2FmZmVlbWVuZ2VuIHZvbiBCZXJuIHVuZCBCYXNlbCB1bnRlcnNjaGVpZGVuIHNpY2guICRcbXVfe0Jhc2VsfSBcbmVxIFxtdV97QmVybn0kLiANCg0KKkVybMOkdXRlcnVuZzogRGllIEZyYWdlc3RlbGx1bmcgaXN0IHp3ZWlzZWl0aWcgZm9ybXVsaWVydC4qDQoNCjxicj4NCg0KMy4gQmVzY2hyZWliZW4gU2llIGRpZSBEYXRlbiBkZXNrcmlwdGl2IHVuZCBlcnN0ZWxsZW4gU2llIGVpbiBCb3hwbG90IGbDvHIgZGVuIFZlcmdsZWljaCBkZXIgS2FmZmVlbWVuZ2VuIGluIEJlcm4gdW5kIEJhc2VsLiAgIA0KDQpgYGB7cn0NCiMgVGVpbGRhdGVuc8OkdHplIChTdWJzZXRzKSBlcnN0ZWxsZW4NCmJlcm4gPC0gc3Vic2V0KGNhZmZlLCBPcnQgPT0gIkJlcm4iKQ0KYmFzZWwgPC0gc3Vic2V0KGNhZmZlLCBPcnQgPT0gIkJhc2VsIikNCg0KIyBLZW5uemFobGVuIGJlcmVjaG5lbg0Kc3VtbWFyeShiZXJuKQ0Kc3VtbWFyeShiYXNlbCkNCg0KIyBCb3hwbG90IGVyc3RlbGxlbg0KYm94cGxvdChjYWZmZSRNZW5nZSB+IGNhZmZlJE9ydCkNCmBgYA0KDQpEaWUgZHVyY2hzY2huaXR0bGljaGUgS2FmZmVlbWVuZ2UgaW4gQmVybiBiZXRyw6RndCAzMTEuNyBtbCB1bmQgaW4gQmFzZWwgMzAxLjkgbWwuIEltIEJveHBsb3QgaXN0IHp1IHNlaGVuLCBkYXNzIGRpZSBWYXJpYXRpb25zYnJlaXRlIGluIEJlcm4gZ3LDtnNzZXIgaXN0LCBhbHMgaW4gQmFzZWwuDQoNCjxiciAvPg0KDQo0LiBXw6RobGVuIFNpZSBkZW4gcmljaHRpZ2VuIHQtVGVzdCBhdXMuIEVyc3RlbGxlbiBTaWUgYXVjaCBlaW5lIEdyYWZpayBmw7xyIGRlbiBWZXJnbGVpY2ggZGVyIDk1JS1WZXJ0cmF1ZW5zaW50ZXJ2YWxsZS4gIA0KDQoqIERlciBTdGljaHByb2JlbnVtZmFuZyBwcm8gR3J1cHBlIGlzdCBuID0gMjAuICANCiogV2lyIHByw7xmZW4gYXVmIE5vcm1hbHZlcnRlaWx1bmcgZGVyIERhdGVuIGluIGJlaWRlbiBHcnVwcGVuIG1pdCBlaW5lbSBRUS1QbG90OiAgDQoNCmBgYHtyfQ0KIyBRUS1QbG90IGbDvHIgQmVybg0KcXFub3JtKGJlcm4kTWVuZ2UpDQpxcWxpbmUoYmVybiRNZW5nZSkNCg0KIyBRUS1QbG90IGbDvHIgQmFzZWwNCnFxbm9ybShiYXNlbCRNZW5nZSkNCnFxbGluZShiYXNlbCRNZW5nZSkNCmBgYA0KDQoqIEludGVycHJldGF0aW9uIGRlciBRUS1QbG90czogRGllIHplbnRyYWxlbiBCZXJlaWNoZSBkZXIgRGF0ZW4gbGllZ2VuIHdlaXRnZWhlbmQgYXVmIGVpbmVyIExpbmllLiBXaXIgZMO8cmZlbiBzY2hsaWVzc2VuLCBkYXNzIGRpZSBEYXRlbiBhdXMgZWluZXIgbm9ybWFsdmVydGVpbHRlbiBQb3B1bGF0aW9uIHN0YW1tZW4uICAgDQoqIERpZSBEYXRlbiBzaW5kIHVuYWJow6RuZ2lnLiAgDQoqIFRlc3R3YWhsOiBEYSBuIDwgMzAsIHfDpGhsZW4gd2lyIGVpbiBuaWNodHBhcmFtZXRyaXNjaGVzIFZlcmZhaHJlbiwgZGVuICpNYW5uLVdoaXRuZXktVS1UZXN0IChXaWxjb3hvbiBSYW5nc3VtbWVuLVRlc3QpKi4gWnVtIFZlcmdsZWljaCBmw7xocmVuIHdpciBhYmVyIGF1Y2ggZWluZW4gKlp3ZWlzdGljaHByb2Jlbi10LVRlc3QgZsO8ciB1bmFiaMOkbmdpZ2UgRGF0ZW4qIGR1cmNoLiAgDQoNCg0KDQpgYGB7cn0NCndpbGNveC50ZXN0KGNhZmZlJE1lbmdlIH4gY2FmZmUkT3J0LCBhbHRlcm5hdGl2ZSA9ICJ0d28uc2lkZWQiLCBwYWlyZWQgPSBGQUxTRSkNCmBgYA0KDQpJbnRlcnByZXRhdGlvbiBkZXMgV2lsY294b24gUmFuZ3N1bW1lbnRlc3RzOiBEaWUgVGVzdHN0YXRpc3RpayAqKlcqKiBpbnRlcnByZXRpZXJlbiB3aXIgbmljaHQhIERpZSBXYWhyc2NoZWlubGljaGtlaXQsIGbDvHIgdW5zZXJlIFRlc3RzdGF0aXN0aWsgb2RlciBub2NoIGVpbmUgZXh0cmVtZXJlIFRlc3RzdGF0aXN0aWsgdW50ZXIgZGVyIE51bGxoeXBvdGhlc2UgYmV0csOkZ3QgNS4yNCUgKCoqcCA9IDAuMDUyNCoqKSAgDQoNCmBgYHtyfQ0KdC50ZXN0KGNhZmZlJE1lbmdlIH4gY2FmZmUkT3J0LCBhbHRlcm5hdGl2ZSA9ICJ0d28uc2lkZWQiLCBwYWlyZWQgPSBGQUxTRSkNCmBgYA0KDQpJbnRlcnByZXRhdGlvbiBkZXMgWndlaXN0aWNocHJvYmVuLXQtVGVzdHM6IERpZSBUZXN0c3RhdGlzdGlrICoqdCA9IC0xLjc5ODQqKiBpc3Qgd2VuaWdlciBleHRyZW0gYWxzIGRpZSAibWFnaXNjaGUgR3JlbnplIiB1bSAtLysgMiB1bmQgd2lyIGvDtm5uZW4gYmVyZWl0cyBqZXR6dCBhbm5laG1lbiwgZGFzcyB3aXIga2VpbmVuIHNpZ25pZmlrYW50ZW4gVW50ZXJzY2hpZWQgendpc2NoZW4gZGVuIEthZmZlZW1lbmdlbiBpbiBCYXNlbCB1bmQgaW4gQmVybiBoYWJlbi4gRGllIEFuemFobCBkZXIgRnJlaWhlaXRzZ3JhZGUgKipkZiA9IDI0LjEwMyoqIHdvbGxlbiB3aXIgYmVpbSBXZWxjaC1UZXN0LCBlaW5lciBWYXJpYW50ZSBkZXMgWndlaXN0aWNocHJvYmVuLXQtVGVzdHMgZsO8ciB1bmFiaMOkbmdpZ2UgRGF0ZW4sIG5pY2h0IGludGVycHJldGllcmVuLiBEaWUgV2FocnNjaGVpbmxpY2hrZWl0IGbDvHIgdW5zZXJlciBUZXN0c3RhdGlzdGlrICoqdCoqIG9kZXIgZWluZW4gbm9jaCBleHRyZW1lcmVuIFdlcnQgZsO8ciAqKnQqKiB1bnRlciBkZXIgTnVsbGh5cG90aGVzZSBiZXRyw6RndCA4LjQ2NSUgKCoqcCA9IDAuMDg0NjUqKikuICANCg0KPGJyIC8+DQoNCjUuIEJlcmVjaG5lbiBTaWUgZGFzIDk1JS1Lb25maWRlbnppbnRlcnZhbGwgZsO8ciBkaWUgRGlmZmVyZW56IGRlciBLYWZmZWVtZW5nZSB6d2lzY2hlbiBCZXJuIHVuZCBCYXNlbC4NCg0KKiBTaWUgZmluZGVuIGRhcyA5NSUtS29uZmlkZW56aW50ZXJ2YWxsIGbDvHIgZGllIERpZmZlcmVueiBkZXIgZHVyY2hzY2huaXR0bGljaGVuIEthZmZlZW1lbmdlbiBpbSBPdXRwdXQgZGVzIHQtVGVzdHMgdW50ZXIgKjk1IHBlcmNlbnQgY29uZmlkZW5jZSBpbnRlcnZhbDoqLiBEYXMgOTUlLUtvbmZpZGVuemludGVydmFsbCBmw7xyIGRpZSBkdXJjaHNjaG5pdHRsaWNoZSBEaWZmZXJlbnogZGVyIEthZmZlZW1lbmdlbiB6d2lzY2hlbiBCZXJuIHVuZCBCYXNlbCBsaWVndCBzb21pdCB6d2lzY2hlbiBbLTIxLjAwNSwgMS40NDJdIG1sLiBVbnRlciBkZXIgTnVsbGh5cG90aGVzZSBsaWVndCBkaWUgZHVyY2hzY2huaXR0bGljaGUgRGlmZmVyZW56IGJlaSBOdWxsLiBOdWxsIGlzdCBpbiBkaWVzZW0gS29uZmlkZW56aW50ZXJ2YWxsIGVudGhhbHRlbiB1bmQgc29taXQgZWluIHBsYXVzaWJsZXIgV2VydC4gRGFzIDk1JS1Lb25maWRlbnppbnRlcnZhbGwgYmVzdMOkdGlndCBkaWUgRXJnZWJuaXNzZSBkZXIgSHlwb3RoZXNlbnRlc3RzLg0KDQoNCjYuIEZvcm11bGllcmVuIFNpZSBpaHIgUmVzdWx0YXQgaW4gZWluIGJpcyB6d2VpIFPDpHR6ZW4uICAgDQoNCiogKkRpZSBkdXJjaHNjaG5pdHRsaWNoZW4gS2FmZmVlbWVuZ2VuIGluIEJlcm4gKDMxMS43IG1sKSB1bmQgaW4gQmFzZWwgKDMwMS45IG1sKSB1bnRlcnNjaGVpZGVuIHNpY2ggbmljaHQgc2lnbmlmaWthbnQgdm9uZWluYW5kZXIsIE1hbm4tV2hpdG5leS1VLVRlc3QgVyA9IDEyOCwgcCA9IDAuMDUyNC4gRGllIGR1cmNoc2Nobml0dGxpY2hlIERpZmZlcmVueiBkZXIgS2FmZmVlbWVuZ2VuIChCYXNlbCBtaW51cyBCZXJuKSBiZXRyw6RndCAtOS44IFtDSTk1OiAtMjEuMDA1LCAxLjQ0Ml0gbWwuKiAgDQoNCjxiciAvPg0KDQojIMOcYnVuZyAyIHsudGFic2V0fSAgDQoNCldlbGNoZXMgRXJnZWJuaXMgZXJ3YXJ0ZW4gU2llLCB3ZW5uIGRpZSBGcmFnZXN0ZWxsdW5nIGJlaSDDnGJ1bmcgMSBsYXV0ZW4gd8O8cmRlOiAqSXN0IGRpZSBkdXJjaHNjaG5pdHRsaWNoZSBLYWZmZWVtZW5nZSBpbiBCYXNlbCBnZXJpbmdlciBhbHMgaW4gQmVybj8qICANCg0KIyMgQXVmZ2FiZQ0KDQoxLiBGb3JtdWxpZXJlbiBTaWUgZGllIE51bGwtIHVuZCBkaWUgQWx0ZXJuYXRpdmh5cG90aGVzZS4gIA0KMi4gRsO8aHJlbiBTaWUgZWluZW4gSHlwb3RoZXNlbnRlc3QgZHVyY2guIA0KMy4gRmFzc2VuIFNpZSBkYXMgRXJnZWJuaXMgenVzYW1tZW4uDQoNCiMjIEzDtnN1bmcNCg0KMS4gRm9ybXVsaWVyZW4gU2llIGRpZSBOdWxsLSB1bmQgZGllIEFsdGVybmF0aXZoeXBvdGhlc2UuICANCg0KKiAkSF8wJCA6IERpZSBLYWZmZWVtZW5nZW4gdm9uIEJlcm4gdW5kIEJhc2VsIHVudGVyc2NoZWlkZW4gc2ljaCBuaWNodC4gJFxtdV97QmFzZWx9ID0gXG11X3tCZXJufSQuICAgIA0KKiAkSF9BJCA6IERpZSBLYWZmZWVtZW5nZSBpbiBCYXNlbCBpc3Qga2xlaW5lciBhbHMgaW4gQmVybi4gJFxtdV97QmFzZWx9IDwgXG11X3tCZXJufSQuIA0KDQoqRXJsw6R1dGVydW5nOiBEaWUgRnJhZ2VzdGVsbHVuZyBpc3QgZWluc2VpdGlnIGZvcm11bGllcnQuKg0KDQoNCjIuIEbDvGhyZW4gU2llIGVpbmVuIEh5cG90aGVzZW50ZXN0IGR1cmNoLiANCg0KYGBge3J9DQp3aWxjb3gudGVzdChjYWZmZSRNZW5nZSB+IGNhZmZlJE9ydCwgYWx0ZXJuYXRpdmUgPSAibGVzcyIsIHBhaXJlZCA9IEZBTFNFKQ0KYGBgDQoNCmBgYHtyfQ0KdC50ZXN0KGNhZmZlJE1lbmdlIH4gY2FmZmUkT3J0LCBhbHRlcm5hdGl2ZSA9ICJsZXNzIiwgcGFpcmVkID0gRkFMU0UpDQpgYGANCg0KDQozLiBWZXJnbGVpY2hlbiBTaWUgZGVuIHJlc3VsdGllcmVuZGVuIHAtV2VydCBtaXQgZGVtIHAtV2VydCBhdXMgw5xidW5nIDEuICANCg0KfFRlc3R8ZWluc2VpdGlnfHp3ZWlzZWl0aWd8DQp8LS0tLXwtLS0tLS0tLS18LS0tLS0tLS0tLXwNCnxXaWxjb3h8MC4wMjYyfDAuMDUyNHwNCnx0LVRlc3R8MC4wNDIzfDAuMDg0N3wNCg0KV2VubiB3aXIgZWluc2VpdGlnIHRlc3RlbiwgaXN0IGRlciBwLVdlcnQgaGFsYiBzbyBncm9zcyB3aWUgYmVpbSB6d2Vpc2VpdGlnZW4gVGVzdGVuLg0KDQoNCiMgw5xidW5nIDMgey50YWJzZXR9DQoNCkVpbiBHZWbDpG5nbmlzYXVmZW50aGFsdCBpc3QgbWl0IHBzeWNoaXNjaGVtIFN0cmVzcyB2ZXJidW5kZW4uIEVpbmUgTcO2Z2xpY2hrZWl0LCBkaWVzZW4gU3RyZXNzIGFienViYXVlbiBpc3Qgc3BvcnRsaWNoZSBCZXTDpHRpZ3VuZy4gRWluIFN0dWRpZSBoYXQgZGVuIFN0cmVzc2xldmVsIHZvbiAyNiBHZWbDpG5nbmlzc2luc2Fzc2VuIGJlaSBFaW4tIHVuZCBBdXN0cml0dCBtaXR0ZWxzIEZyYWdlYm9nZW4gdW50ZXJzdWNodCAoamUgaMO2aGVyIGRlciBTdHJlc3NsZXZlbCBkZXN0byBncsO2c3NlciBkZXIgU3RyZXNzKS4gRWluIFRlaWwgZGVyIEdlZmFuZ2VuZW4gZXJoaWVsdCBlaW4gc3BvcnRsaWNoZXMgVHJhaW5pbmcuICAgDQoNCkxhZGVuIFNpZSBkaWUgRGF0ZWkgYHByaXNvblN0cmVzcy5jc3ZgIFtoaWVyXShodHRwczovL21vb2RsZS5iZmguY2gvbW9kL2ZvbGRlci92aWV3LnBocD9pZD0xNjkwNDMzKSBoZXJ1bnRlci4gICANCg0KRGVyIERhdGVuc2F0eiB1bWZhc3N0IDUgVmFyaWFibGVuICAgIA0KDQpWYXJpYWJsZSB8IEJlc2NocmVpYnVuZw0KLS0tLS0tLS0gfCAtLS0tLS0tLS0tLS0NClN1YmplY3QgfCBhbm9ueW1lIElEDQpHcm91cCB8IEdydXBwZSBzcG9ydCBvZGVyIGNvbnRyb2wNClBTU2JlZm9yZSB8IFN0cmVzc2xldmVsIChBc3Nlc3NtZW50LVNjb3JlKSBiZWkgRWludHJpdHQNClBTU2FmdGVyIHwgU3RyZXNzbGV2ZWwgKEFzc2Vzc21lbnQtU2NvcmUpIGJlaSBBdXN0cml0dA0KRGlmZiB8IFBhYXJ3ZWlzZSBEaWZmZXJlbnplbiAoUFNTYWZ0ZXIgLSBQU1NiZWZvcmUpDQoNCiMjIEF1ZmdhYmUNCg0KMS4gTGFkZW4gU2llIGRlbiBEYXRlbnNhdHogaW4gYFJgIHVuZCBrYXRlZ29yaXNpZXJlbiBTaWUgZGllIFZhcmlhYmxlbi4gICAgDQoyLiBGcmFnZTogSGFiZW4gYmVpZGUgR3J1cHBlbiBiZWkgRWludHJpdHQgZGVuIGdsZWljaGVuIFN0cmVzc2xldmVsPyAgICANCjMuIEZyYWdlOiBIYWJlbiBiZWlkZSBHcnVwcGVuIGJlaSBBdXN0cml0dCBkZW4gZ2xlaWNoZW4gU3RyZXNzbGV2ZWw/ICAgICAgICANCjQuIEZyYWdlOiBCZXN0ZWh0IGVpbiBVbnRlcnNjaGllZCBpbSBTdHJlc3NsZXZlbCB6d2lzY2hlbiBFaW4tIHVuZCBBdXN0cml0dCBpbiBkZXIgS29udHJvbGxncnVwcGU/ICAgICAgDQo1LiBGcmFnZTogQmVzdGVodCBlaW4gVW50ZXJzY2hpZWQgaW0gU3RyZXNzbGV2ZWwgendpc2NoZW4gRWluLSB1bmQgQXVzdHJpdHQgaW4gZGVyIFNwb3J0Z3J1cHBlPyAgICANCjYuIEZyYWdlOiBIYXQgU3BvcnQgZWluZW4gRWZmZWt0IGF1ZiBkZW4gU3RyZXNzbGV2ZWwgaW0gVmVyZ2xlaWNoIHp1IGVpbmVyIEtvbnRyb2xsZ3J1cHBlLCBkaWUga2VpbmVuIFNwb3J0IG1hY2h0PyAgDQoNCkbDvGhyZW4gU2llIGbDvHIgYWxsZSBGcmFnZW4gc293b2hsIGVpbmVuIG5pY2h0cGFyYW1ldHJpc2NoZW4gKFdpbGNveG9uKSBhbHMgYXVjaCBlaW5lbiBwYXJhbWV0cmlzY2hlbiAodC1UZXN0KSBUZXN0IGR1cmNoLiAgDQoNCiMjIEzDtnN1bmcgMQ0KDQpgYGB7cn0NCnByaXNvbiA8LSBpbXBvcnQoIi4uL2RhdGEvcHJpc29uU3RyZXNzLmNzdiIpDQpzdHIocHJpc29uKQ0KDQojIERpZSBWYXJpYWJsZSBHcm91cCBpc3Qgbm9taW5hbCB1bmQgd2lyZCBhbHMgZmFjdG9yIGthdGVnb3Jpc2llcnQNCnByaXNvbiRHcm91cCA8LSBmYWN0b3IocHJpc29uJEdyb3VwKQ0Kc3RyKHByaXNvbikNCmBgYA0KDQojIyBMw7ZzdW5nIDINCg0KRnJhZ2VzdGVsbHVuZzogSGFiZW4gZGllIEdydXBwZW4gKlNwb3J0KiB1bmQgKkNvbnRyb2wqIGJlaSBFaW50cml0dCBkZW4gZ2xlaWNoZW4gU3RyZXNzbGV2ZWw/ICANCg0KMS4gSHlwb3RoZXNlbiAgICANCg0KICAgKyAkSF8wJCBFcyBiZXN0ZWh0IGtlaW4gVW50ZXJzY2hpZWQgaW0gU3RyZXNzbGV2ZWwgZGVyIEdydXBwZW4gU3BvcnQgdW5kIEtvbnRyb2xsZSBiZWkgRWludHJpdHQsICRcbXVfe2NvbixiZWZvcmV9ID0gXG11X3tzcG9ydCxiZWZvcmV9JCAgDQogICArICRIX0EkIEVzIGJlc3RlaHQgZWluIFVudGVyc2NoaWVkIGltIFN0cmVzc2xldmVsIGRlciBHcnVwcGVuIFNwb3J0IHVuZCBLb250cm9sbGUgYmVpIEVpbnRyaXR0LCAkXG11X3tjb24sYmVmb3JlfSBcbmVxIFxtdV97c3BvcnQsYmVmb3JlfSQgICAgDQogIA0KDQpgYGB7cn0NCiMgRGVza3JpcHRpdmUgU3RhdGlzdGlrIG5hY2ggU3Vic2V0cw0Kc3BvcnQgPC0gc3Vic2V0KHByaXNvbiwgR3JvdXAgPT0gIlNwb3J0IikNCmNvbnRyb2wgPC0gc3Vic2V0KHByaXNvbiwgR3JvdXAgPT0gIkNvbnRyb2wiKQ0KDQpzdW1tYXJ5KHNwb3J0JFBTU2JlZm9yZSkNCnN1bW1hcnkoY29udHJvbCRQU1NiZWZvcmUpDQoNCmJveHBsb3QocHJpc29uJFBTU2JlZm9yZSB+IHByaXNvbiRHcm91cCkNCmBgYA0KDQoyLiBEYXMgU2lnbmlmaWthbnpuaXZlYXUgbGVnZW4gd2lyIGJlaSAkXGFscGhhID0gMC4wNSQgZmVzdC4gIA0KMy4gRGllIERhdGVuIHNpbmQgdW5hYmjDpG5naWcgKHdpciB2ZXJnbGVpY2hlbiB6d2VpIHVudGVyc2NoaWVkbGljaGUgR3J1cHBlbikuICANCjQuIERpZSBQcsO8Zmdyw7Zzc2UgaXN0IGRpZSBEaWZmZXJlbnogZGVyIE1pdHRlbHdlcnRlIGRlciBiZWlkZW4gR3J1cHBlbiAkXG11X3tjb24sYmVmb3JlfSAtIFxtdV97c3BvcnQsYmVmb3JlfSQgICANCjUuIERlciBTdGljaHByb2JlbnVtZmFuZyBwcm8gR3J1cHBlIGlzdCBuIDwgMzAsIHdhcyBmw7xyIGRlbiBNYW4tV2hpdG5leS1VLVRlc3Qgc3ByaWNodC4gICANCjYuIERpZSBWZXJ0ZWlsdW5nIGRlciBQcsO8Zmdyw7Zzc2UgYW5oYW5kIGRlciBCb3ggaW0gQm94cGxvdCBlcmdpYnQgZWluZSBsZWljaHQgcmVjaHRzc3RlaWxlIFZlcnRlaWx1bmcgaW4gZGVyIEtvbnRyb2xsZ3J1cHBlIHVuZCBldHdhIE5vcm1hbHZlcnRlaWx1bmcgaW4gZGVyIFNwb3J0Z3J1cHBlLiBEaWUgUVEtUGxvdHMgc2luZCB3ZW5pZyBhdXNzYWdla3LDpGZ0aWcuIERpZSBTdHJldXVuZyBkZXIgRGF0ZW4gaXN0IHVudGVyc2NoaWVkbGljaC4gICANCg0KYGBge3J9DQojIFFRLVBsb3QgZsO8ciBTcG9ydGdydXBwZQ0KcXFub3JtKHNwb3J0JFBTU2JlZm9yZSkNCnFxbGluZShzcG9ydCRQU1NiZWZvcmUsIGNvbCA9ICJibHVlIikNCg0KIyBRUS1QbG90IGbDvHIgQ29udHJvbGdydXBwZQ0KcXFub3JtKGNvbnRyb2wkUFNTYmVmb3JlKQ0KcXFsaW5lKGNvbnRyb2wkUFNTYmVmb3JlLCBjb2wgPSAiYmx1ZSIpDQoNCmBgYA0KDQoqIERpZSBQcsO8ZnVuZyBkZXIgVGVzdGJlZGluZ3VuZ2VuIGxlZ3QgbmljaHRwYXJhbWV0cmlzY2hlIFZlcmZhaHJlbiB6dXIgc3RhdGlzdGlzY2hlbiBBbmFseXNlIG5haGUuICAgDQoNCjcuIFZlcnRyYXVlbnNpbnRlcnZhbGxlIGbDvHIgZGllIFByw7xmZ3LDtnNzZSB1bmQgVGVzdHN0YXRpc3RpayBiZXN0aW1tZW4gICANCg0KYGBge3J9DQp3aWxjb3gudGVzdChQU1NiZWZvcmUgfiBHcm91cCwgZGF0YSA9IHByaXNvbiwgYWx0ZXJuYXRpdmUgPSAidHdvLnNpZGVkIikNCmBgYA0KDQpJbnRlcnByZXRhdGlvbiBkZXMgV2lsY294b24gUmFuZ3N1bW1lbnRlc3RzICg9IE1hbm4tV2hpdG5leS1VLVRlc3QpOiBEaWUgV2FybnVuZyBrw7ZubmVuIFNpZSBpZ25vcmllcmVuIDspLiBEaWUgVGVzdHN0YXRpc3RpayAqKlcqKiBpbnRlcnByZXRpZXJlbiB3aXIgbmljaHQuIERpZSBXYWhyc2NoZWlubGljaGtlaXQgZsO8ciBkZW4gV2VydCBkZXIgVGVzdHN0YXRpc3RpayBvZGVyIGVpbmVuIG5vY2ggZXh0cmVtZXJlbiBXZXJ0IGJldHLDpGd0IDEyLjUlICgqKnAgPSAwLjEyNDkqKikuICANCg0KYGBge3J9DQp0LnRlc3QoUFNTYmVmb3JlIH4gR3JvdXAsIGRhdGEgPSBwcmlzb24sIGFsdGVybmF0aXZlID0gInR3by5zaWRlZCIpDQpgYGANCkludGVycHJldGF0aW9uIGRlcyBad2Vpc3RpY2hwcm9iZW4tdC1UZXN0czogRGllIFRlc3RzdGF0aXN0aWsgYmV0csOkZ3QgKip0ID0gLTIuMDA2NCoqLiBEaWVzZXIgV2VydCBsaWVndCBpbiBkZXIgTsOkaGUgZGVyICJtYWdpc2NoZW4gR3JlbnplIiB2b24gLTIuIEFsbGVyZGluZ3MgbGllZ2VuIGhpZXIga2xlaW5lIFN0aWNocHJvYmVudW1mw6RuZ2Ugdm9yLCB3b2R1cmNoIGRpZSBLdXJ2ZSBkZXIgdC1WZXJ0ZWlsdW5nIGFuIGRlbiBFbmRlbiBzZWhyIGZsYWNoIHZlcmzDpHVmdCB1bmQgZGVyIGtyaXRpc2NoZSBXZXJ0IGbDvHIgZGllIDIuNSUgR3JlbnplIHdlaXRlciBhbHMgLTIuMCBsaWVndC4gQW56YWhsIEZyZWloZWl0c2dyYWRlICoqZGYqKiBpbnRlcnByZXRpZXJlbiB3aXIgYmVpbSBXZWxjaC1UZXN0IG5pY2h0LiBEaWUgV2FocnNjaGVpbmxpY2hrZWl0IGbDvHIgZGVuIFdlcnQgZGVyIFRlc3RzdGF0aXN0aWsgdCBvZGVyIGVpbmVuIG5vY2ggZXh0cmVtZXJlbiBXZXJ0IHVudGVyIGRlciBOdWxsaHlwb3RoZXNlIGJldHLDpGd0IDYuMSUgKCoqcCA9IDAuMDYxMTIqKikuIERpZSBTcG9ydGdydXBwZSBoYXQgYmVpIEVpbnRyaXR0IGltIER1cmNoc2Nobml0dCBlaW5lbiBldHdhcyBow7ZoZXJlbiBTdHJlc3NsZXZlbCAoMjMuOSkgYWxzIGRpZSBDb250cm9sZ3J1cHBlICgxNi40KS4gRGllIGR1cmNoc2Nobml0dGxpY2hlIERpZmZlcmVueiBkZXMgU3RyZXNzbGV2ZWxzIHp3aXNjaGVuIGRlbiBiZWlkZW4gR3J1cHBlbiAoQ29udHJvbCBtaW51cyBTcG9ydCkgYmV0csOkZ3QgLTcuNTYwIFs5NSUtQ0k6IC0xNS41MzQsIDAuMzk1XS4gRGllc2VzIDk1JS1Lb25maWRlbnppbnRlcnZhbGwgc2NobGllc3N0IDAgZWluIHVuZCB1bnRlcnN0w7x0enQgZGllIEVyZ2Vibmlzc2UgYXVzIGRlbiBIeXBvdGhlc2VudGVzdHMuICpGw7xyIGRpZSBGb3JtdWxpZXJ1bmcgZGVzIFJlc3VsdGF0cyB2ZXJ3ZW5kZW4gd2lyIG51ciBkaWUgQW5nYWJlbiB6dW0gOTUlLUtvbmZpZGVuemludGVydmFsbCwgZGEgd2lyIHVucyBmw7xyIGRlbiBNYW5uLVdoaXRuZXktVS1UZXN0IGFscyBrb3JyZWt0ZW4gVGVzdCBlbnRzY2hpZWRlbiBoYWJlbiEqDQoNCjxiciAvPg0KDQo4LiBSZXN1bHRhdCwgU2NobHVzc2ZvbGdlcnVuZyAgICANCg0KKkRlciBTdHJlc3NsZXZlbCBiZWkgRWludHJpdHQgaW5zIEdlZsOkbmduaXMgaXN0IGluIGRlciBLb250cm9sbGdydXBwZSAobiA9IDExKSBpbSBEdXJjaHNjaG5pdHQgdW0gLTcuNTYwIFstMTUuNTM0LCAwLjM5NV0gUHVua3RlIHRpZWZlciBhbHMgaW4gZGVyIFNwb3J0Z3J1cHBlIChuID0gMTUpLiBFcyBsaWVndCBqZWRvY2gga2VpbmUgRXZpZGVueiBkYWbDvHIgdm9yLCBkYXNzIHNpY2ggZGllIGJlaWRlbiBHcnVwcGVuIGltIFN0cmVzc2xldmVsIGJlaSBFaW50cml0dCBpbnMgR2Vmw6RuZ25pcyBzaWduaWZpa2FudCB1bnRlcnNjaGVpZGVuLCBNYW4tV2hpdG5leS1VID0gNTIuNSwgcCA9IDAuMTI0OS4gKiAgICANCg0KPGJyIC8+DQoNCiMjIEzDtnN1bmcgMyAgDQoNCkZyYWdlc3RlbGx1bmc6IEhhYmVuIGJlaWRlIEdydXBwZW4gYmVpIEF1c3RyaXR0IGRlbiBnbGVpY2hlbiBTdHJlc3NsZXZlbD8gRGFzIGlzdCBkaWUgw6RobmxpY2hlIEZyYWdlc3RlbGx1bmcgd2llIEZyYWdlIDIuIFZlcnN1Y2hlbiBTaWUgZGllc2UgQXVmZ2FiZSBtw7ZnbGljaHN0IG9obmUgSGlsZnNtaXR0ZWwgenUgYmVhcmJlaXRlbi4gICAgDQoNCjEuIEh5cG90aGVzZW4gICAgDQoNCiAgICsgJEhfMCQgRXMgYmVzdGVodCBrZWluIFVudGVyc2NoaWVkIGltIFN0cmVzc2xldmVsIGRlciBHcnVwcGVuIFNwb3J0IHVuZCBLb250cm9sbGUgYmVpIEF1c3RyaXR0LCAkXG11X3tjb24sYWZ0ZXJ9ID0gXG11X3tzcG9ydCxhZnRlcn0kICANCiAgICsgJEhfQSQgRXMgYmVzdGVodCBlaW4gVW50ZXJzY2hpZWQgaW0gU3RyZXNzbGV2ZWwgZGVyIEdydXBwZW4gU3BvcnQgdW5kIEtvbnRyb2xsZSBiZWkgQXVzdHJpdHQsICRcbXVfe2NvbixhZnRlcn0gXG5lcSBcbXVfe3Nwb3J0LGFmdGVyfSQgICAgIA0KMi4gRGFzIFNpZ25pZmlrYW56bml2ZWF1IGxlZ2VuIHdpciBiZWkgJFxhbHBoYSA9IC4wNSQgZmVzdC4gIA0KMy4gRGllIERhdGVuIHNpbmQgdW5hYmjDpG5naWcuICAgDQo0LiBEaWUgUHLDvGZncsO2c3NlIGlzdCAkXG11X3tjb24sYWZ0ZXJ9IC0gXG11X3tzcG9ydCxhZnRlcn0kLiAgDQo1LiBEZXIgU3RpY2hwcm9iZW51bWZhbmcgcHJvIEdydXBwZSBpc3QgbiA8IDMwLCB3YXMgZsO8ciBNYW4tV2hpdG5leS1VLVRlc3Qgc3ByaWNodC4gICAgICAgICAgICAgICAgICAgIA0KDQpgYGB7cn0NCiMgRGllIFN1YnNldHMgc3BvcnQgdW5kIGNvbnRyb2wgaGFiZW4gd2lyIHNjaG9uIHVudGVyIEzDtnN1bmcgMSBnZW1hY2h0DQpzdW1tYXJ5KHNwb3J0JFBTU2FmdGVyKQ0Kc3VtbWFyeShjb250cm9sJFBTU2FmdGVyKQ0KDQpib3hwbG90KHByaXNvbiRQU1NhZnRlciB+IHByaXNvbiRHcm91cCkNCmBgYA0KDQo8YnIgLz4NCg0KNi4gRGllIFZlcnRlaWx1bmcgZGVyIFByw7xmZ3LDtnNzZSBhbmhhbmQgZGVyIEJveCBpbSBCb3hwbG90IGVyZ2lidCBlaW5lIGxlaWNodCByZWNodHNzdGVpbGUgVmVydGVpbHVuZyBpbiBiZWlkZW4gR3J1cHBlbi4gRGllIFFRLVBsb3RzIHNpbmQgd2VuaWcgYXVzc2FnZWtyw6RmdGlnLiBEaWUgU3RyZXV1bmcgZGVyIERhdGVuIGlzdCDDpGhubGljaC4gICAgDQoNCmBgYHtyfQ0KIyBRUS1QbG90IGbDvHIgU3BvcnRncnVwcGUNCnFxbm9ybShzcG9ydCRQU1NhZnRlcikNCnFxbGluZShzcG9ydCRQU1NhZnRlciwgY29sID0gImJsdWUiKQ0KDQojIFFRLVBsb3QgZsO8ciBDb250cm9sZ3J1cHBlDQpxcW5vcm0oY29udHJvbCRQU1NhZnRlcikNCnFxbGluZShjb250cm9sJFBTU2FmdGVyLCBjb2wgPSAiYmx1ZSIpDQoNCmBgYA0KDQoqIERpZSBQcsO8ZnVuZyBkZXIgVGVzdGJlZGluZ3VuZ2VuIChuIDwgMzAsIHJlY2h0c3N0ZWlsZSBWZXJ0ZWlsdW5nZW4pIGxlZ3QgbmljaHRwYXJhbWV0cmlzY2hlIFZlcmZhaHJlbiB6dXIgc3RhdGlzdGlzY2hlbiBBbmFseXNlIG5haGUuICAgDQo8YnIgLz4NCg0KNy4gVmVydHJhdWVuc2ludGVydmFsbGUgZsO8ciBkaWUgUHLDvGZncsO2c3NlIHVuZCBUZXN0c3RhdGlzdGlrIGJlc3RpbW1lbiAgIA0KDQoNCmBgYHtyfQ0Kd2lsY294LnRlc3QoUFNTYWZ0ZXIgfiBHcm91cCwgZGF0YSA9IHByaXNvbiwgYWx0ZXJuYXRpdmUgPSAidHdvLnNpZGVkIikNCnQudGVzdChQU1NhZnRlciB+IEdyb3VwLCBkYXRhID0gcHJpc29uLCBhbHRlcm5hdGl2ZSA9ICJ0d28uc2lkZWQiKQ0KYGBgDQoNCjguIFNjaGx1c3Nmb2xnZXJ1bmcgICAgDQoNCipEZXIgU3RyZXNzbGV2ZWwgYmVpIEF1c3RyaXR0IGF1cyBkZW0gR2Vmw6RuZ25pcyBpc3QgaW4gZGVyIEtvbnRyb2xsZ3J1cHBlIChuID0gMTEpIGltIER1cmNoc2Nobml0dCB1bSAzLjcyNyBbOTUlLUNJOiAtMi4wNjksIDkuNTIzXSBQdW5rdGUgaMO2aGVyIGFscyBpbiBkZXIgU3BvcnRncnVwcGUgKG4gPSAxNSkuIEVzIGxpZWd0IGtlaW5lIEV2aWRlbnogZGFmw7xyIHZvciwgZGFzcyBzaWNoIGRpZSBiZWlkZW4gR3J1cHBlbiBpbSBTdHJlc3NsZXZlbCBiZWkgQXVzdHJpdHQgYXVzIGRlbSBHZWbDpG5nbmlzIHNpZ25pZmlrYW50IHVudGVyc2NoZWlkZW4sIE1hbi1XaGl0bmV5LVUtVGVzdCBXID0gMTA4LjUsIHAgPSAwLjE4NS4qICANCg0KPGJyIC8+DQoNCiMjIEzDtnN1bmcgNA0KDQpGcmFnZXN0ZWxsdW5nOiBCZXN0ZWh0IGVpbiBVbnRlcnNjaGllZCBpbSBTdHJlc3NsZXZlbCB6d2lzY2hlbiBFaW4tIHVuZCBBdXN0cml0dCBpbiBkZXIgS29udHJvbGxncnVwcGU/ICAgDQoNCjxiciAvPg0KDQoNCjEuIEh5cG90aGVzZW4gICAgDQoNCiAgICsgJEhfMCQgRXMgYmVzdGVodCBrZWluIFVudGVyc2NoaWVkIGltIFN0cmVzc2xldmVsIGluIGRlciBLb250cm9sbGdydXBwZSB6d2lzY2hlbiBFaW4tIHVuZCBBdXN0cml0dCwgJFxtdV97Y29uLGRpZmZ9PTB9JCAoTWl0dGVsd2VydCBkZXIgcGFhcndlaXNlbiBEaWZmZXJlbnplbiEpICAgDQogICArICRIX0EkIEVzIGJlc3RlaHQgZWluIFVudGVyc2NoaWVkIGltIFN0cmVzc2xldmVsIGluIGRlciBLb250cm9sbGdydXBwZSBiZWkgRWludHJpdHQsICRcbXVfe2NvbixkaWZmfSBcbmVxIDAkJCAgICANCg0KMi4gRGFzIFNpZ25pZmlrYW56bml2ZWF1IGxlZ2VuIHdpciBiZWkgJFxhbHBoYSA9IC4wNSQgZmVzdC4gICAgDQozLiBEaWUgRGF0ZW4gc2luZCBnZXBhYXJ0ICgyIE1lc3N1bmdlbiBwcm8gUHJvYmFuZDppbikuICAgICAgDQo0LiBEaWUgUHLDvGZncsO2c3NlIGlzdCAkXG11X3tjb24sZGlmZn0kLiBEaWUgcGFhcndlaXNlbiBEaWZmZXJlbnplbiBzaW5kIGluIGRlciBWYXJpYWJsZW4gYHByaXNvbiREaWZmYCBiZXJlY2huZXQuIFdpciBhcmJlaXRlbiBoaWVyIG51ciBtaXQgZGVtIFN1YnNldCBgY29udHJvbGAuICANCjUuIERlciBTdGljaHByb2JlbnVtZmFuZyBpc3QgbiA9IDExLCB3YXMgZsO8ciBkZW4gV2lsY294b24tVm9yemVpY2hlbnJhbmctVGVzdCBzcHJpY2h0LiAqSGlud2VpczogQmVpIGdlcGFhcnRlbiBEYXRlbiBkYXJmIGVpbiBwYXJhbWV0cmlzY2hlciBUZXN0IGJlcmVpdHMgYmVpIGVpbmVtIFN0aWNocHJvYmVudW1mYW5nIHZvbiBuID0gMTIgb2RlciBtZWhyIGR1cmNoZ2Vmw7xocnQgd2VyZGVuLiogICAgICANCg0KYGBge3J9DQojIERhcyBzdWJzZXQgY29udHJvbCB3dXJkZSBiZXJlaXRzIGluIEzDtnN1bmcgMSBlcnN0ZWxsdA0Kc3VtbWFyeShjb250cm9sJERpZmYpDQoNCmJveHBsb3QoY29udHJvbCREaWZmKQ0KYGBgDQoNCjxiciAvPg0KDQo2LiBEaWUgVmVydGVpbHVuZyBkZXIgUHLDvGZncsO2c3NlIGBEaWZmYCBhbmhhbmQgdm9uIEJveHBsb3QgdW5kIFFRLVBsb3QgaXN0IGF1ZiBHcnVuZCBkZXIgZ2VyaW5nZW4gRGF0ZW5tZW5nZSB3ZW5pZyB6dXZlcmzDpHNzaWcgenUgaW50ZXJwcmV0aWVyZW47IGVzIHNjaGVpbnQgYWJlciBuaWNodHMgZGFnZWdlbiB6dSBzcHJlY2hlbiwgZGFzcyBkaWUgRGF0ZW4gYXVzIGVpbmVyIG5vcm1hbHZlcnRlaWx0ZW4gUG9wdWxhdGlvbiBzdGFtbWVuLiAgIA0KDQpgYGB7ciwgcmVzdWx0cz0nYXNpcyd9DQojIyBRUS1QbG90IGbDvHIgRGlmZiBpbiBkZXIgR3J1cHBlIENvbnRyb2wNCnFxbm9ybShjb250cm9sJERpZmYpDQpxcWxpbmUoY29udHJvbCREaWZmLCBjb2wgPSAiYmx1ZSIpDQpgYGANCg0KKiBEaWUgUHLDvGZ1bmcgZGVyIFRlc3RiZWRpbmd1bmdlbiAobiA8IDEyKSBsZWd0IG5pY2h0cGFyYW1ldHJpc2NoZSBWZXJmYWhyZW4genVyIHN0YXRpc3Rpc2NoZW4gQW5hbHlzZSBuYWhlLiBXaXIgZsO8aHJlbiBhYmVyIGF1Y2ggZGVuIHQtVGVzdCBmw7xyIGdlcGFhcnRlIERhdGVuIGR1cmNoLCB1bSBkYXMgOTUlLUtvbmZpZGVuemludGVydmFsbCB6dSBiZXJlY2huZW4uICANCg0KPGJyIC8+DQoNCjcuIFZlcnRyYXVlbnNpbnRlcnZhbGxlIGbDvHIgZGllIFByw7xmZ3LDtnNzZSB1bmQgVGVzdHN0YXRpc3RpayBiZXN0aW1tZW4gICANCiAgDQogICANCmBgYHtyfQ0Kd2lsY294LnRlc3QoY29udHJvbCRQU1NhZnRlciwgY29udHJvbCRQU1NiZWZvcmUsIA0KICAgICAgICAgICAgcGFpcmVkID0gVFJVRSwgYWx0ZXJuYXRpdmUgPSAidHdvLnNpZGVkIikNCmBgYA0KDQoNCmBgYHtyLCBldmFsPUZBTFNFfQ0KdC50ZXN0KGNvbnRyb2wkUFNTYWZ0ZXIsIGNvbnRyb2wkUFNTYmVmb3JlLCANCiAgICAgICBwYWlyZWQgPSBUUlVFLCBhbHRlcm5hdGl2ZSA9ICJ0d28uc2lkZWQiKQ0KYGBgDQoNCjxiciAvPg0KDQo4LiBTY2hsdXNzZm9sZ2VydW5nICAgIA0KDQoqRGVyIFN0cmVzc2xldmVsIGJlaSBBdXN0cml0dCBhdXMgZGVtIEdlZsOkbmduaXMgaXN0IGluIGRlciBLb250cm9sbGdydXBwZSAobiA9IDExKSBpbSBEdXJjaHNjaG5pdHQgdW0gNy42MzQgWzk1JS1DSTogMS4xNjEsIDEzLjU2N10gUHVua3RlIGjDtmhlciBhbHMgYmVpbSBFaW50cml0dC4gRXMgbGllZ3QgRXZpZGVueiBkYWbDvHIgdm9yLCBkYXNzIHNpY2ggZGVyIGR1cmNoc2Nobml0dGxpY2hlIFN0cmVzc2xldmVsIGluIGRlciBLb250cm9sbGdydXBwZSBiZWltIEF1ZmVudGhhbHQgaW0gR2Vmw6RuZ25pcyBzaWduaWZpa2FudCBlcmjDtmh0IGhhdCwgV2lsY294b24gVm9yemVpY2hlbnJhbmctVGVzdCBWID0gNDcuNSwgcCA9IDAuMDQ3LiogIA0KDQo8YnIgLz4NCjxiciAvPg0KDQojIyBMw7ZzdW5nIDUNCg0KRnJhZ2VzdGVsbHVuZzogQmVzdGVodCBlaW4gVW50ZXJzY2hpZWQgaW0gU3RyZXNzbGV2ZWwgendpc2NoZW4gRWluLSB1bmQgQXVzdHJpdHQgaW4gZGVyIFNwb3J0Z3J1cHBlPyBEYXMgaXN0IGRpZSDDpGhubGljaGUgRnJhZ2VzdGVsbHVuZyB3aWUgRnJhZ2UgNC4gVmVyc3VjaGVuIFNpZSBkaWVzZSBBdWZnYWJlIG3DtmdsaWNoc3Qgb2huZSBIaWxmc21pdHRlbCB6dSBiZWFyYmVpdGVuLiAgDQoNCjxiciAvPg0KDQoxLiBIeXBvdGhlc2VuICAgDQoNCiAgICsgJEhfMCQgRXMgYmVzdGVodCBrZWluIFVudGVyc2NoaWVkIGltIFN0cmVzc2xldmVsIGluIGRlciBTcG9ydGdydXBwZSB6d2lzY2hlbiBFaW4tIHVuZCBBdXN0cml0dCwgJFxtdV97c3BvcnQsZGlmZn09MH0kIChNaXR0ZWx3ZXJ0IGRlciBwYWFyd2Vpc2VuIERpZmZlcmVuemVuISkNCiAgICsgJEhfQSQgRXMgYmVzdGVodCBlaW4gVW50ZXJzY2hpZWQgaW0gU3RyZXNzbGV2ZWwgaW4gZGVyIEtvbnRyb2xsZ3J1cHBlIGJlaSBFaW50cml0dCwgJFxtdV97c3BvcnQsZGlmZn0gXG5lcSAwJCQgICANCg0KMi4gRGFzIFNpZ25pZmlrYW56bml2ZWF1IGxlZ2VuIHdpciBiZWkgJFxhbHBoYSA9IC4wNSQgZmVzdC4gIA0KMy4gRGllIERhdGVuIHNpbmQgZ2VwYWFydCAoMiBNZXNzdW5nZW4gcHJvIFByb2JhbmQpICAgDQo0LiBEaWUgUHLDvGZncsO2c3NlIGlzdCAkXG11X3tzcG9ydCxkaWZmfSQgICAgDQo1LiBEZXIgU3RpY2hwcm9iZW51bWZhbmcgaW4gZGVyIFNwb3J0Z3J1cHBlIGlzdCBuID0gMTUuIEJlaSBnZXBhYXJ0ZW4gRGF0ZW4gZGFyZiBlaW4gcGFyYW1ldHJpc2NoZXIgVGVzdCBiZXJlaXRzIGJlaSBlaW5lbSBTdGljaHByb2JlbnVtZmFuZyB2b24gbiA9IDEyIG9kZXIgbWVociBkdXJjaGdlZsO8aHJ0IHdlcmRlbi4gIA0KDQpgYGB7cn0NCiMgRGFzIHN1YnNldCBzcG9ydCB3dXJkZSBiZXJlaXRzIGluIEzDtnN1bmcgMSBlcnN0ZWxsdA0Kc3VtbWFyeShzcG9ydCREaWZmKQ0KDQpib3hwbG90KHNwb3J0JERpZmYpDQpgYGANCg0KPGJyIC8+DQoNCjYuIERpZSBWZXJ0ZWlsdW5nIGRlciBQcsO8Zmdyw7Zzc2UgYERpZmZgIGFuaGFuZCB2b24gQm94cGxvdCB1bmQgUVEtUGxvdCBpc3QgYXVmIEdydW5kIGRlciBnZXJpbmdlbiBEYXRlbm1lbmdlIHdlbmlnIHp1dmVybMOkc3NpZyB6dSBpbnRlcnByZXRpZXJlbjsgZXMgc2NoZWludCBhYmVyIG5pY2h0cyBkYWdlZ2VuIHp1IHNwcmVjaGVuLCBkYXNzIGRpZSBEYXRlbiBhdXMgZWluZXIgbm9ybWFsdmVydGVpbHRlbiBQb3B1bGF0aW9uIHN0YW1tZW4uICAgDQoNCmBgYHtyLCByZXN1bHRzPSdhc2lzJ30NCiMgUVEtUGxvdCBmw7xyIERpZmYgaW4gZGVyIFNwb3J0Z3J1cHBlDQpxcW5vcm0oc3BvcnQkRGlmZikNCnFxbGluZShzcG9ydCREaWZmLCBjb2wgPSAiYmx1ZSIpDQpgYGANCg0KKiBEaWUgUHLDvGZ1bmcgZGVyIFRlc3RiZWRpbmd1bmdlbiBsZWd0IGVpbiBwYXJhbWV0cmlzY2hlcyBWZXJmYWhyZW4genVyIHN0YXRpc3Rpc2NoZW4gQW5hbHlzZSBuYWhlLiAgIA0KDQo8YnIgLz4NCg0KNy4gVmVydHJhdWVuc2ludGVydmFsbGUgZsO8ciBkaWUgUHLDvGZncsO2c3NlIHVuZCBUZXN0c3RhdGlzdGlrIGJlc3RpbW1lbiAgDQoNCiAgIA0KYGBge3IsIHJlc3VsdHM9J2FzaXMnfQ0KdC50ZXN0KHNwb3J0JFBTU2FmdGVyLCBzcG9ydCRQU1NiZWZvcmUsIA0KICAgICAgIHBhaXJlZCA9IFRSVUUsIGFsdGVybmF0aXZlID0gInR3by5zaWRlZCIpDQpgYGANCg0KPGJyIC8+DQoNCjguIFNjaGx1c3Nmb2xnZXJ1bmcgICAgDQoNCipEZXIgU3RyZXNzbGV2ZWwgYmVpIEF1c3RyaXR0IGF1cyBkZW0gR2Vmw6RuZ25pcyBpc3QgaW4gZGVyIFNwb3J0Z3J1cHBlIChuID0gMTUpIGltIER1cmNoc2Nobml0dCAgdW0gLTMuOTMzIFs5NSUtQ0k6IC03LjA3NiwgLTAuNzkwXSBQdW5rdGUgdGllZmVyIGFscyBiZWltIEVpbnRyaXR0LiBFcyBsaWVndCBFdmlkZW56IGRhZsO8ciB2b3IsIGRhc3Mgc2ljaCBkZXIgU3RyZXNzbGV2ZWwgYmVpbSBBdWZlbnRoYWx0IGltIEdlZsOkbmduaXMgaW4gZGVyIFNwb3J0Z3J1cHBlIHNpZ25pZmlrYW50IHNlbmt0LCB0ID0gLTIuNjg0LCBkZiA9IDE0LCBwID0gMC4wMTc4LiogIA0KDQoqKkhpbndlaXM6KiogQmVpIGRlbiDDnGJ1bmdlbiA0IHVuZCA1IGvDtm5uZW4gU2llIGRpZSBUZXN0cyBhdWNoIGFscyBFaW5zdGljaHByb2Jlbi1UZXN0IGbDvHIgZGllIGRpZSBwYWFyd2Vpc2VuIERpZmZlcmVuemVuIGBEaWZmYCB1bmQgZGVuIE51bGx3ZXJ0IDAgZHVyY2hmw7xocmVuLiBEYXMgRXJnZWJuaXMgaXN0IGlkZW50aXNjaC4NCg0KYGBge3J9DQp0LnRlc3Qoc3BvcnQkRGlmZiwgbXUgPSAwLCBhbHRlcm5hdGl2ZSA9ICJ0d28uc2lkZWQiKQ0KYGBgDQoNCjxiciAvPg0KPGJyIC8+DQoNCiMjIEzDtnN1bmcgNg0KDQpGcmFnZXN0ZWxsdW5nOiBIYXQgU3BvcnQgZWluZW4gRWZmZWt0IGF1ZiBkZW4gU3RyZXNzbGV2ZWwgaW0gVmVyZ2xlaWNoIHp1IGVpbmVyIEtvbnRyb2xsZ3J1cHBlLCBkaWUga2VpbmVuIFNwb3J0IG1hY2h0PyAgIA0KDQoxLiBIeXBvdGhlc2VuICAgIA0KDQogICArICRIXzAkIFNwb3J0IGhhdCBrZWluZW4gRWZmZWt0LCAkXG11X3tkaWZmLHNwb3J0fSA9IFxtdV97ZGlmZixjb259JCAgIA0KICAgKyAkSF9BJCBTcG9ydCBoYXQgZWluZW4gRWZmZWt0LCAkXG11X3tkaWZmLHNwb3J0fSBcbmVxIFxtdV97ZGlmZixjb259JCAgIA0KDQoyLiBEYXMgU2lnbmlmaWthbnpuaXZlYXUgbGVnZW4gd2lyIGJlaSAkXGFscGhhID0gLjA1JCBmZXN0LiAgICANCg0KMy4gRGllIERhdGVuIHNpbmQgdW5hYmjDpG5naWcuICAgDQoNCjQuIERpZSBQcsO8Zmdyw7Zzc2UgaXN0ICRcbXVfe2RpZmYsc3BvcnR9ID0gXG11X3tkaWZmLGNvbn0kICAgIA0KDQo1LiBEZXIgU3RpY2hwcm9iZW51bWZhbmcgcHJvIEdydXBwZSBpc3QgbiA8IDMwLCB3YXMgZsO8ciBNYW4tV2hpdG5leS1VLVRlc3Qgc3ByaWNodC4gSW4gZGllc2VtIEZhbGwgaXN0IGVzIG5pY2h0IG1laHIgbsO2dGlnIFFRLVBsb3RzIHp1IGVyc3RlbGxlbiwgd2lyIG1hY2hlbiBlcyDDvGJ1bmdzaGFsYmVyIHRyb3R6ZGVtIDspLiAgICAgICANCg0KYGBge3IsIHJlc3VsdHM9J2FzaXMnfQ0Kc3VtbWFyeShjb250cm9sJERpZmYpDQpzdW1tYXJ5KHNwb3J0JERpZmYpDQoNCmJveHBsb3QocHJpc29uJERpZmYgfiBwcmlzb24kR3JvdXApDQpgYGANCg0KPGJyIC8+DQoNCjYuIERpZSBWZXJ0ZWlsdW5nIGRlciBEYXRlbiBpbiBiZWlkZW4gR3J1cHBlbiBhbmhhbmQgdm9uIEJveHBsb3QgdW5kIFFRLVBsb3QgaXN0IGF1ZiBHcnVuZCBkZXIgZ2VyaW5nZW4gRGF0ZW5tZW5nZSB3ZW5pZyB6dXZlcmzDpHNzaWcgenUgaW50ZXJwcmV0aWVyZW47IGVzIHNjaGVpbnQgYWJlciBuaWNodHMgZGFnZWdlbiB6dSBzcHJlY2hlbiwgZGFzcyBkaWUgRGF0ZW4gYXVzIGVpbmVyIG5vcm1hbHZlcnRlaWx0ZW4gUG9wdWxhdGlvbiBzdGFtbWVuLiAgIA0KDQpgYGB7ciwgcmVzdWx0cz0nYXNpcyd9DQojIyBRUS1QbG90IGbDvHIgRGlmZiBpbiBkZXIgQ29udHJvbGdydXBwZQ0KcXFub3JtKGNvbnRyb2wkRGlmZikNCnFxbGluZShjb250cm9sJERpZmYsIGNvbCA9ICJibHVlIikNCg0KIyMgUVEtUGxvdCBmw7xyIERpZmYgaW4gZGVyIENvbnRyb2xncnVwcGUNCnFxbm9ybShzcG9ydCREaWZmKQ0KcXFsaW5lKHNwb3J0JERpZmYsIGNvbCA9ICJibHVlIikNCmBgYA0KDQoqIERpZSBQcsO8ZnVuZyBkZXIgVGVzdGJlZGluZ3VuZ2VuIGxlZ3QgbmljaHRwYXJhbWV0cmlzY2hlIFZlcmZhaHJlbiB6dXIgc3RhdGlzdGlzY2hlbiBBbmFseXNlIG5haGUuICAgDQoNCjxiciAvPg0KDQo3LiBWZXJ0cmF1ZW5zaW50ZXJ2YWxsZSBmw7xyIGRpZSBQcsO8Zmdyw7Zzc2UgdW5kIFRlc3RzdGF0aXN0aWsgYmVzdGltbWVuICAgDQogIA0KYGBge3J9DQp3aWxjb3gudGVzdChEaWZmIH4gR3JvdXAsIGRhdGEgPSBwcmlzb24sIGFsdGVybmF0aXZlID0gInR3by5zaWRlZCIpDQp0LnRlc3QoRGlmZiB+IEdyb3VwLCBkYXRhID0gcHJpc29uLCBhbHRlcm5hdGl2ZSA9ICJ0d28uc2lkZWQiKQ0KYGBgDQoNCjxiciAvPg0KDQo4LiBTY2hsdXNzZm9sZ2VydW5nICAgIA0KDQoqVW50ZXJzdWNodCB3dXJkZSBkZXIgRWZmZWt0IHZvbiBTcG9ydCBhdWYgZGVuIFN0cmVzc2xldmVsIGJlaSBHZWbDpG5nbmlzaW5zYXNzZW4sIGRpZSBpbiBlaW5lIFNwb3J0LSAobiA9IDE1KSB1bmQgZWluZSBLb250cm9sbGdydXBwZSAobiA9IDExKSBlaW5nZXRlaWx0IHd1cmRlbi4gSW4gZGVyIEtvbnRyb2xsZ3J1cHBlIGhhdCBkZXIgU3RyZXNzbGV2ZWwgdW0gNy4zNjQgUHVua3RlIHp1Z2Vub21tZW4gdW5kIGluIGRlciBTcG9ydGdydXBwZSB1bSBkdXJjaHNjaG5pdHRsaWNoIC0zLjkzMyBQdW5rdGUgYWJnZW5vbW1lbi4gSW0gRHVyY2hzY2huaXR0IHZlcm1pbmRlcnQgc2ljaCBkZXIgU3RyZXNzbGV2ZWwgaW4gZGVyIFNwb3J0Z3J1cHBlIHVtIDExLjI5NyBbNC42MDgsIDE3Ljk4NV0gUHVua3RlIGltIFZlcmdsZWljaCB6dXIgQ29udG9ybGdydXBwZS4gRGllIERhdGVuIGxpZWZlcm4gRXZpZGVueiBkYWbDvHIsIGRhc3Mgc2ljaCBTcG9ydCBnw7xuc3RpZyBhdWYgZGVuIFN0cmVzc2xldmVsIGltIEdlZsOkbmduaXMgYXVzd2lya3QsIE1hbi1XaGl0bmV5LVUtVGVzdCBXID0gMTM4LCBwID0gLjAwNDIuKiANCg0KPGJyIC8+DQo8YnIgLz4NCg0K