Pakete importieren
library(haven)
library(car)
library(PerformanceAnalytics)
library(psych)
library(knitr)
library(broom)
library(lmtest)
library(lm.beta)
library(readxl)
Daten einlesen
#Multiple_Regression <- read_excel("Multiple_Regression.xlsx")
#View(Multiple_Regression)
attach(Multiple_Regression)
1) Hypothese
Nullhypothese (H₀):
Alle Regressionskoeffizienten sind gleich null: \[
H_0: \beta_1 = \beta_2 = \beta_3 = 0
\] Die unabhängigen Variablen haben gemeinsam keinen Einfluss
auf die Besucherzahl.
Alternativhypothese (H₁):
Mindestens ein Regressionskoeffizient ist ungleich null: \[
H_1: \text{Mindestens ein } \beta_j \neq 0
\] Mindestens eine der unabhängigen Variablen beeinflusst die
Besucherzahl.
2) Grundlegende Konzepte: Was ist multiple Regression?
Die multiple Regression ist ein statistisches Verfahren, mit dem
untersucht wird, wie mehrere unabhängige Variablen gemeinsam die
Ausprägung einer abhängigen Variablen vorhersagen oder erklären können.
Während die einfache lineare Regression nur einen Einflussfaktor
betrachtet, analysiert die multiple Regression den Einfluss mehrerer
Faktoren gleichzeitig. So kann man zum Beispiel erforschen, wie
Mitgliedsbeitrag, Werbeausgaben und Produktqualität zusammen die
Verkaufszahlen beeinflussen. Dabei zeigt das Verfahren nicht nur, wie
stark jede einzelne Variable die abhängige Variable beeinflusst, sondern
auch, wie gut das Gesamtmodell die tatsächlichen Werte vorhersagt. Die
multiple Regression wird häufig in Sozialwissenschaften, Wirtschaft und
Medizin genutzt, um komplexe Zusammenhänge zwischen verschiedenen
Einflussgrößen und einem Ergebnis zu analysieren und fundierte
Entscheidungen auf Basis der ermittelten Zusammenhänge zu treffen.
3) Prüfen der Voraussetzungen
Die abhängige Variable ist intervallskaliert, die unabhängigen
Variablen sind intervallskaliert oder als Dummy-Variablen
codiert.
Unabhängige Variablen (UV):
- Mitgliedsbeitrag (€)
- Werbeausgaben (€)
- Fanartikelverkauf
Abhängige Variable (AV):
Linearität des Zusammenhangs:
Es wird ein linearer Zusammenhang zwischen der abhängigen und den
unabhängigen Variablen modelliert
(siehe Scatterplot und Pearson-Korrelation)
Homoskedastizität:
Für jeden Wert der unabhängigen Variablen hat der Fehlerwert dieselbe
Varianz
(siehe Homoskedastizität)
Unabhängigkeit des Fehlerwerts:
Die Fehlerwerte hängen nicht voneinander ab
(siehe Scatterplot und Pearson-Korrelation)
Normalverteilung des Fehlerwerts:
Die Fehlerwerte sind näherungsweise normalverteilt
(siehe Histogramm)
Keine Multikollinearität:
Die unabhängigen Variablen korrelieren nicht zu stark miteinander
(siehe Multikollinearität)
4) Boxplot
par(mfrow=c(1,4))
boxplot(Fanartikelverkauf, main="Boxplot Fanartikelverkauf")
boxplot(Besucherzahlen, main="Boxplot Besucher")
boxplot(Werbeausgaben, main="Boxplot Werbeausgaben")
boxplot(Mitgliedsbeitrag, main="Boxplot Mitgliedsbeitrag")

Keine Ausreißer zu erkennen.
5) Deskriptive Statistik
psych::describe(Multiple_Regression)
Die Tabelle gibt einen Überblick über die deskriptiven Statistiken
von fünf Variablen aus dem Datensatz. Für die abhängige Variable
Besucher lag der Mittelwert bei M = 1877.89, mit einer
Standardabweichung von SD = 350.52 (n = 36). Die Besucherzahlen
variierten dabei zwischen 1172 und 2604. Der Mitgliedsbeitrag
(Mitgliedsbeitrag) zeigte einen Mittelwert von M = 110.38 (SD = 1.61, n
= 36), mit Werten von 107 bis 113. Für das Werbebudget (Werbeausgaben)
wurde ein Mittelwert von M = 1274.44 (SD = 481.50, n = 36) bei einer
Spannweite von 460 bis 2000 beobachtet. Die Variable Fanartikelverkauf
hatte einen Mittelwert von M = 905.28 (SD = 159.47, n = 36), mit Werten
zwischen 600 und 1250. Die ID-Variable dient lediglich der
Identifikation der einzelnen Fälle und ist für die inhaltliche Analyse
nicht relevant.
6) Scatterplot und Pearson
Ein lineares Modell geht davon aus, dass der Zusammenhang zwischen
der abhängigen Variable und jeder unabhängigen Variable linear ist – und
zwar unter der Kontrolle aller weiteren unabhängigen Variablen. Bei
multipler Regression bedeutet das: Die Beziehung zwischen einer
unabhängigen Variable und der Zielgröße sollte auch dann linear sein,
wenn man die Effekte der anderen Einflussgrößen berücksichtigt.
Diese Bedingung lässt sich jedoch nicht allein mit einem einfachen
Streudiagramm zwischen abhängiger und einer unabhängigen Variable
prüfen. Im Gegensatz zur einfachen Regression können weitere
Einflussfaktoren das Verhältnis verfälschen, sodass die tatsächliche
Beziehung komplexer ist. Ein einfaches Streudiagramm bietet daher nur
einen groben ersten Anhaltspunkt, ob eine lineare Beziehung vorliegen
könnte, und wird häufig als erster, orientierender Schritt genutzt. Für
eine genaue Überprüfung sind weiterführende grafische Methoden
erforderlich.
library(car)
scatterplotMatrix(~Mitgliedsbeitrag+Fanartikelverkauf+Werbeausgaben + Besucherzahlen,
regLine=TRUE, smooth=FALSE,
diagonal=list(method="density"), by.groups=TRUE,
data=Multiple_Regression)

library(PerformanceAnalytics)
chart.Correlation(Multiple_Regression[1:4],
histogram=TRUE,
method = "pearson",
pch=19)

Die Streudiagramm-Matrix liefert einen ersten Eindruck davon, wie die
abhängige Variable mit den einzelnen unabhängigen Variablen
zusammenhängt. Dabei wird sichtbar, dass zwischen den unabhängigen
Variablen und der Zielgröße zumindest auf den ersten Blick jeweils eine
lineare Beziehung denkbar ist: Die Besucherzahl nimmt mit höheren
Fanartikelverkäufen und einem größeren Werbebudget offenbar zu. Der
Zusammenhang mit dem TicketMitgliedsbeitrag erscheint dagegen weniger
ausgeprägt.
Um die Annahme der Linearität genauer zu überprüfen, empfiehlt es
sich, für jede unabhängige Variable ein spezielles Streudiagramm zu
erstellen, das sogenannte Component-plus-residual-Plot. Damit lässt sich
erkennen, ob die Beziehung tatsächlich linear ist oder ob möglicherweise
eine andere Form des Zusammenhangs vorliegt. Alternativ können auch
partielle Regressionsdiagramme verwendet werden, die für jede Variable
die Beziehung zum Rest des Modells darstellen.
# modell
modell <- lm(Besucherzahlen ~ Mitgliedsbeitrag + Werbeausgaben + Fanartikelverkauf, data = Multiple_Regression)
# Component-plus-residual-Plot für Fanartikelverkauf
crPlots(modell, terms = ~ Fanartikelverkauf)

Das partielle Regressionsdiagramm für Fanartikelverkauf zeigt auf der
Y-Achse das Residuum, das entsteht, wenn die Variable Besucher auf alle
unabhängigen Variablen außer Fanartikelverkauf regressiert wird. Auf der
X-Achse ist das Residuum dargestellt, das übrig bleibt, wenn
Fanartikelverkauf auf alle anderen unabhängigen Variablen regressiert
wird. Das bedeutet: Es wird jeweils der Teil betrachtet, der durch die
anderen unabhängigen Variablen nicht erklärt werden kann. Diese beiden
Residuen werden gegeneinander aufgetragen.
Zeigen die partiellen Regressionsdiagramme für alle unabhängigen
Variablen eine lineare Beziehung, kann davon ausgegangen werden, dass
die Linearitätsvoraussetzung erfüllt ist. In Abbildung 4 ist dies für
Fanartikelverkauf der Fall. Auch bei den anderen unabhängigen Variablen
zeigt sich diese Linearität, was aus Gründen der Übersichtlichkeit hier
jedoch nicht weiter dargestellt wird.
7) Homoskedastizität
Homoskedastizität bedeutet, dass die Fehler für jeden Wert der
unabhängigen Variablen eine konstante Varianz aufweisen. Das wird meist
anhand eines Streudiagramms überprüft, in dem die Residuen gegen die
vorhergesagten Werte aufgetragen werden. Die Voraussetzung ist erfüllt,
wenn sich die Fehlerwerte über den gesamten Wertebereich der Vorhersagen
zufällig und ohne erkennbares Muster verteilen und ihre Streuung in etwa
gleich bleibt.
Falls die Streuung der Fehler nicht konstant ist, spricht man von
Heteroskedastizität. In solchen Fällen erkennt man häufig ein bestimmtes
Muster im Streudiagramm, beispielsweise eine trichterförmige oder
trompetenartige Ausprägung.
regression1 <- lm(Besucherzahlen ~ Mitgliedsbeitrag+Fanartikelverkauf+Werbeausgaben )
zpred <- scale(fitted(regression1), center = T, scale = T)
sres <-rstandard(regression1)
plot (x=zpred, y=sres, main = "Streudiagramm der Residuen",
xlab ="Regression: Standardisierter geschätzter Wert",
ylab = "Regression: Standardisiertes Residuum",
col = "darkblue")
abline (a=0, b=0)

Neben der visuellen Beurteilung gibt es auch verschiedene
statistische Tests, mit denen Homoskedastizität geprüft werden kann, zum
Beispiel den Breusch-Pagan-Test, den Cook-Weisberg-Test oder den
White-Test. Wird bei diesen Tests die Nullhypothese nicht verworfen,
spricht das für Homoskedastizität. Das Ergebnis gilt als
unproblematisch, wenn der p-Wert größer als 0,05 ist. Wird dieser Wert
nicht unterschritten, kann davon ausgegangen werden, dass die Annahme
der Homoskedastizität erfüllt ist.
8) Unabhängigkeit des Fehlerwerts
Für die multiple Regression ist es wichtig, dass die Fehler
verschiedener Beobachtungen unabhängig voneinander sind. Das bedeutet,
dass die Fehlerwerte nicht miteinander in Verbindung stehen dürfen und
keine systematischen Muster aufweisen, wie zum Beispiel zeitliche oder
räumliche Abfolgen. Werden Abhängigkeiten festgestellt, kann dies
beispielsweise an mehrfachen Messungen innerhalb derselben Gruppe oder
an wiederkehrenden Zeitpunkten liegen.
Treten solche Abhängigkeiten auf, kann die Annahme der Unabhängigkeit
verletzt sein, was sich meist durch auffällige Muster in den Residuen
äußert. Bei unabhängigen Fehlern sind dagegen keine Regelmäßigkeiten
erkennbar. Ist dies der Fall, kann davon ausgegangen werden, dass die
Voraussetzung erfüllt ist.
Neben der visuellen Beurteilung gibt es auch statistische Tests zur
Überprüfung der Unabhängigkeit der Fehler, wie etwa den
Durbin-Watson-Test. Ein Wert nahe 2 deutet darauf hin, dass keine
Autokorrelation vorliegt, während Werte nahe 0 oder 4 auf eine starke
Abhängigkeit der Fehlerwerte hindeuten.
9) Normalverteilung des Fehlerwerts
Eine weitere Voraussetzung ist, dass die Fehlerwerte annähernd
normalverteilt sind. Dies lässt sich oft gut anhand eines Histogramms
der standardisierten Residuen beurteilen. Im Idealfall zeigt das
Histogramm eine glockenförmige Verteilung. Weichen die Fehler stark von
der Normalverteilung ab, zum Beispiel indem sie zweigipflig (bimodal)
verteilt sind, kann dies problematisch für die Interpretation der
Regressionsanalyse sein. Kleinere Abweichungen werden häufig als
unkritisch betrachtet.
# regression1 <- lm(Besucherzahlen ~ Mitgliedsbeitrag+Fanartikelverkauf+Werbeausgaben )
#
# zpred <- scale(fitted(regression1), center = T, scale = T)
# sres <-rstandard(regression1)
hist (sres, freq = T, breaks = 10, main ="Verteilung des Fehlerwerts", xlab= "Regression: Standardisiertes Residuum", ylab="Häufigkeiten", xlim = c(-3,3),ylim = c(0,12), col = "lightblue" )

10) Keine Multikollinearität
Für die multiple Regression ist es wesentlich, dass die unabhängigen
Variablen nicht in einem starken linearen Zusammenhang zueinander
stehen. Das bedeutet, keine unabhängige Variable darf sich durch eine
Linearkombination der anderen vollständig erklären lassen. In der Praxis
sind kleine Korrelationen normal, doch eine zu große Multikollinearität
führt dazu, dass die Schätzung der Regressionskoeffizienten unsicher
wird. Dann kann es passieren, dass eigentlich wichtige Einflussgrößen
statistisch unauffällig erscheinen.
Zur Überprüfung von Multikollinearität werden zwei Kennzahlen
genutzt: Toleranzwert und
Varianzinflationsfaktor (VIF). Beide Größen geben
Auskunft darüber, wie sehr eine unabhängige Variable von den übrigen
abhängt. Sie stehen in einem Kehrwertverhältnis zueinander.
Toleranzwert:
\[
T_j = 1 - R_j^2
\]
Hierbei ist \(R_j^2\) das
Bestimmtheitsmaß, das angibt, wie gut sich die Variable \(x_j\) durch die anderen unabhängigen
Variablen erklären lässt.
Varianzinflationsfaktor (VIF):
\[
\text{VIF}_j = \frac{1}{T_j}
\] ### Faustregel zur Beurteilung:
- Toleranzwert: sollte nicht kleiner als
0,10 sein
- VIF: sollte nicht größer als 10
sein
# regression1 <- lm(Besucherzahlen ~ Mitgliedsbeitrag+Fanartikelverkauf+Werbeausgaben )
# VIF berechnen
vif_values <- vif(regression1)
# Toleranz berechnen (1/VIF)
toleranz <- 1 / vif_values
# Zusammenfassen als DataFrame
ergebnisse <- data.frame(
Variable = names(vif_values),
VIF = round(vif_values, 3),
Toleranz = round(toleranz, 3)
)
print(ergebnisse)
Werden diese Grenzwerte nicht eingehalten, liegt eine problematische
Multikollinearität vor. In diesem Fall sollte das Regressionsmodell
überarbeitet werden – zum Beispiel, indem betroffene Prädiktoren
entfernt oder umgewandelt werden. Perfekte Multikollinearität, also eine
vollständig lineare Beziehung, wird automatisch erkannt. Bei moderater
Multikollinearität ist eine eigenständige Kontrolle und Anpassung
notwendig. Sind alle Voraussetzungen akzeptabel erfüllt, kann das Modell
weiter interpretiert werden.
11) Signifikanz des Regressionsmodells
Um zu bestimmen, ob das Regressionsmodell insgesamt statistisch
bedeutsam ist, wird ein F-Test verwendet. Dieser Test prüft, ob die
unabhängigen Variablen gemeinsam dazu beitragen, die abhängige Variable
besser vorherzusagen, als es der Zufall könnte. Anders gesagt, bewertet
der F-Test, ob das gesamte Modell einen signifikanten Erklärungswert für
die abhängige Variable besitzt.
\[Besucherzahlen=\beta_0+\beta_1\cdot
Mitgliedsbeitrag+\beta_2\cdot Werbeausgaben+\beta_3\cdot
Verkauf+\epsilon_i\]
Wenn das Ergebnis des F-Tests signifikant ausfällt (typischerweise p
< 0,05), zeigt das, dass das Modell insgesamt einen relevanten
Beitrag zur Vorhersage leistet. In diesem Fall kann die Analyse
weitergeführt werden, beispielsweise indem die einzelnen Einflussgrößen
betrachtet werden. Ist das Modell insgesamt nicht signifikant, wäre eine
weitere Analyse nicht sinnvoll.
12) Signifikanz der Regressionskoeffizienten und die
Regressionsgrade
Hier wird die Multiple Regression durchgeführt. Achten Sie auf die
Rundung.
# modell
regression1 <- lm(Besucherzahlen ~ Mitgliedsbeitrag+Fanartikelverkauf+Werbeausgaben )
# Koeffizienten holen
koefs <- tidy(regression1)
# VIF und Toleranz berechnen
vif_vals <- vif(regression1)
toleranz <- 1 / vif_vals
# Intercept
VIF_full <- c(NA, round(vif_vals, 3)) # Intercept hat keinen VIF
Toleranz_full <- c(NA, round(toleranz, 3)) # Intercept hat keine Toleranz
# Alles in eine Tabelle
ergebnisse <- data.frame(
Variable = koefs$term,
Regressionskoeffizient = round(koefs$estimate, 3),
Standardfehler = round(koefs$std.error, 3),
t_Wert = round(koefs$statistic, 3),
p_Wert = round(koefs$p.value, 3),
Toleranz = Toleranz_full,
VIF = VIF_full
)
print(ergebnisse)
Im nächsten Schritt wird untersucht, ob die einzelnen Einflussgrößen
(Regressionskoeffizienten) tatsächlich einen bedeutsamen Zusammenhang
mit der Zielgröße haben. Dafür wird zu jedem einzelnen Koeffizienten ein
t-Test durchgeführt. Das Ergebnis zeigt, ob die jeweilige Variable einen
messbaren Einfluss auf die Besucherzahl ausübt.
Die Ergebnisse der t-Tests zeigen, dass die Regressionskoeffizienten
für Mitgliedsbeitrag (t = -2,612, p = 0,014), Werbeausgaben (t = 9,657,
p < 0,001), Fanartikelverkauf (t = 5,759, p < 0,001) sowie für die
Konstante (Y-Achsenabschnitt; t = 2,797, p = 0,009) jeweils statistisch
signifikant sind. Ein signifikanter Y-Achsenabschnitt bedeutet, dass die
Regressionsgerade den Ursprung nicht schneidet. Die signifikanten
Koeffizienten der unabhängigen Variablen zeigen, dass diese Faktoren
einen relevanten Einfluss auf die Besucherzahl haben.
Daraus ergibt sich folgende Regressionsgleichung:
Besucherzahlen = 5091,21 – 43,23 · Mitgliedsbeitrag + 0,54 ·
Werbeausgaben + 0,97 · Fanartikelverkauf
Die Gleichung macht deutlich, dass der Mitgliedsbeitrag einen
negativen Effekt hat: Erhöht sich der Mitgliedsbeitrag um eine Einheit
(z. B. in Euro), sinkt die Besucherzahl im Mittel um 43,23 Personen,
sofern die anderen Variablen konstant bleiben. Die positiven
Koeffizienten für Werbeausgaben und Fanartikelverkauf bedeuten, dass mit
jeder zusätzlichen Einheit im Werbebudget oder Fanartikelverkauf steigt
die Besucherzahl jeweils um 0,54 bzw. 0,97 Personen steigt, wenn alle
anderen Einflussgrößen gleich bleiben.
13) Modellgüte
Das Bestimmtheitsmaß R² ist eine Kennzahl, die
beschreibt, wie gut eine Regressionsanalyse die beobachteten Daten
wiedergibt. Es zeigt an, welcher Anteil der Gesamtschwankung der
abhängigen Variable durch die gewählten Einflussgrößen erklärt werden
kann. Ein R²-Wert von 0 bedeutet, dass das Modell keine Vorhersagekraft
besitzt; ein Wert von 1 steht für eine perfekte Erklärung der Daten.
Werte näher an 1 deuten also darauf hin, dass das Modell sehr gut
geeignet ist, die beobachteten Zusammenhänge abzubilden.
Bei der multiplen Regression ist zu beachten, dass R² allein oft zu
optimistisch ausfällt, weil es bei jeder zusätzlichen unabhängigen
Variable automatisch steigt – selbst wenn diese keinen wirklichen
Mehrwert bietet. Aus diesem Grund wird häufig das angepasste
(korrigierte) R² berichtet. Dieses korrigiert den Wert nach
unten, falls unnötig viele Einflussgrößen berücksichtigt werden, und ist
dadurch ein zuverlässigeres Maß für die Modellgüte.
# Modellgüte berechnen
summary_model <- summary(regression1)
R <- sqrt(summary_model$r.squared)
R2 <- summary_model$r.squared
adjR2 <- summary_model$adj.r.squared
SE <- summary_model$sigma
# Durbin-Watson-Test
dw <- lmtest::dwtest(regression1)$statistic
# Alles in ein DataFrame
modelguete <- data.frame(
R = round(R, 3),
R_Quadrat = round(R2, 3),
Korrigiertes_R_Quadrat = round(adjR2, 3),
Standardfehler_des_Schätzers = round(SE, 3),
Durbin_Watson_Statistik = round(dw, 3)
)
print(modelguete)
Ein korrigiertes R² von 0,80 besagt zum Beispiel, dass 80 % der
Streuung in den Daten durch die gewählten unabhängigen Variablen erklärt
werden können.
14) Berechnung der Effektstärke
Um zu beurteilen, wie bedeutsam das Ergebnis einer Regression ist,
berechnet man oft eine Effektstärke. Auch wenn ein hoher Anteil der
Streuung in der Zielgröße erklärt wird, stellt sich die Frage, wie groß
dieser Effekt im Vergleich zu typischen Standards einzuschätzen ist.
Es existieren verschiedene Maße für die Effektstärke. Zu den
gebräuchlichsten zählt das nach Cohen benannte Maß \(f^2\), das insbesondere für
Regressionsanalysen geeignet ist. Damit lässt sich abschätzen, ob der
gefundene Zusammenhang schwach, mittel oder stark ist.
Die Effektstärke \(f^2\) kann aus
dem Bestimmtheitsmaß \(R^2\) berechnet
werden:
\[
f^2 = \frac{R^2}{1 - R^2}
\]
wobei:
- \(f^2\) die Effektstärke nach Cohen
ist
- \(R^2\) das Bestimmtheitsmaß der
Regression ist
Beispiel:
Angenommen, \(R^2 = 0,80\), ergibt
sich:
\[
f^2 = \frac{0,80}{1 - 0,80} = \frac{0,80}{0,20} = 4,0
\]
Zur Einordnung schlägt Cohen (1992) folgende Schwellenwerte vor:
\[
\begin{align}
\text{Schwacher Effekt:} \quad & 0.10 < ||f|| < 0.25 \\
\text{Schwacher bis mittlerer Effekt:} \quad & 0.25 = ||f|| \\
\text{Mittlerer Effekt:} \quad & 0.25 < ||f|| < 0.40 \\
\text{Mittlerer bis starker Effekt:} \quad & 0.40 = ||f|| \\
\text{Starker Effekt:} \quad & 0.40 < ||f||
\end{align}
\]
reg <- summary(regression1)
f<- reg$adj.r.squared/ (1-reg$adj.r.squared)
sprintf("Die Effektstärke liegt bei: %.2f", f)
[1] "Die Effektstärke liegt bei: 4.00"
Ein Wert von \(f^2 = 4,0\) steht
damit für einen sehr starken Effekt.
15) Eine Aussage
Eine multiple Regressionsanalyse ergab, dass sowohl die Zahl der
verkauften Fanartikel, der Mitgliedsbeitrag als auch die Werbeausgaben
einen Einfluss auf die Besucherzahl bei Vereinsveranstaltungen haben,
F(3,32) = 47,65, p < .001, n = 36. Erhöht sich der Mitgliedsbeitrag
um einen Euro, sinkt die Besucherzahl im Durchschnitt um 43,23 Personen.
Werden die Werbeausgaben um einen Euro gesteigert, steigt die
Besucherzahl um etwa 0,54 Personen. Jeder zusätzlich verkaufte
Fanartikel führt durchschnittlich zu 0,97 weiteren Besuchern. Insgesamt
erklären diese drei Faktoren 80 % der Streuung in den Besucherzahlen –
ein Wert, der gemäß Cohen (1992) auf einen starken Effekt hinweist.
LS0tCnRpdGxlOiAiRGllIG11bHRpcGxlIFJlZ3Jlc3Npb24iCm91dHB1dDogaHRtbF9ub3RlYm9vawotLS0KIyMgUGFrZXRlIGltcG9ydGllcmVuCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIHBhZ2VkLnByaW50PUZBTFNFfQpsaWJyYXJ5KGhhdmVuKQpsaWJyYXJ5KGNhcikKbGlicmFyeShQZXJmb3JtYW5jZUFuYWx5dGljcykKbGlicmFyeShwc3ljaCkKbGlicmFyeShrbml0cikKbGlicmFyeShicm9vbSkKbGlicmFyeShsbXRlc3QpCmxpYnJhcnkobG0uYmV0YSkKbGlicmFyeShyZWFkeGwpCmBgYAojIyBEYXRlbiBlaW5sZXNlbgpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBwYWdlZC5wcmludD1GQUxTRX0KCiNNdWx0aXBsZV9SZWdyZXNzaW9uIDwtIHJlYWRfZXhjZWwoIk11bHRpcGxlX1JlZ3Jlc3Npb24ueGxzeCIpCiNWaWV3KE11bHRpcGxlX1JlZ3Jlc3Npb24pCmF0dGFjaChNdWx0aXBsZV9SZWdyZXNzaW9uKQoKYGBgCgojIDEpIEh5cG90aGVzZSAKCioqTnVsbGh5cG90aGVzZSAoSOKCgCk6KioKCkFsbGUgUmVncmVzc2lvbnNrb2VmZml6aWVudGVuIHNpbmQgZ2xlaWNoIG51bGw6ClxbCkhfMDogXGJldGFfMSA9IFxiZXRhXzIgPSBcYmV0YV8zID0gMApcXQoqRGllIHVuYWJow6RuZ2lnZW4gVmFyaWFibGVuIGhhYmVuIGdlbWVpbnNhbSBrZWluZW4gRWluZmx1c3MgYXVmIGRpZSBCZXN1Y2hlcnphaGwuKgoKKipBbHRlcm5hdGl2aHlwb3RoZXNlIChI4oKBKToqKgoKTWluZGVzdGVucyBlaW4gUmVncmVzc2lvbnNrb2VmZml6aWVudCBpc3QgdW5nbGVpY2ggbnVsbDoKXFsKSF8xOiBcdGV4dHtNaW5kZXN0ZW5zIGVpbiB9IFxiZXRhX2ogXG5lcSAwClxdCipNaW5kZXN0ZW5zIGVpbmUgZGVyIHVuYWJow6RuZ2lnZW4gVmFyaWFibGVuIGJlZWluZmx1c3N0IGRpZSBCZXN1Y2hlcnphaGwuKgoKCgojIDIpCUdydW5kbGVnZW5kZSBLb256ZXB0ZTogV2FzIGlzdCBtdWx0aXBsZSBSZWdyZXNzaW9uPwoKRGllIG11bHRpcGxlIFJlZ3Jlc3Npb24gaXN0IGVpbiBzdGF0aXN0aXNjaGVzIFZlcmZhaHJlbiwgbWl0IGRlbSB1bnRlcnN1Y2h0IHdpcmQsIHdpZSBtZWhyZXJlIHVuYWJow6RuZ2lnZSBWYXJpYWJsZW4gZ2VtZWluc2FtIGRpZSBBdXNwcsOkZ3VuZyBlaW5lciBhYmjDpG5naWdlbiBWYXJpYWJsZW4gdm9yaGVyc2FnZW4gb2RlciBlcmtsw6RyZW4ga8O2bm5lbi4gV8OkaHJlbmQgZGllIGVpbmZhY2hlIGxpbmVhcmUgUmVncmVzc2lvbiBudXIgZWluZW4gRWluZmx1c3NmYWt0b3IgYmV0cmFjaHRldCwgYW5hbHlzaWVydCBkaWUgbXVsdGlwbGUgUmVncmVzc2lvbiBkZW4gRWluZmx1c3MgbWVocmVyZXIgRmFrdG9yZW4gZ2xlaWNoemVpdGlnLiBTbyBrYW5uIG1hbiB6dW0gQmVpc3BpZWwgZXJmb3JzY2hlbiwgd2llIE1pdGdsaWVkc2JlaXRyYWcsIFdlcmJlYXVzZ2FiZW4gdW5kIFByb2R1a3RxdWFsaXTDpHQgenVzYW1tZW4gZGllIFZlcmthdWZzemFobGVuIGJlZWluZmx1c3Nlbi4gRGFiZWkgemVpZ3QgZGFzIFZlcmZhaHJlbiBuaWNodCBudXIsIHdpZSBzdGFyayBqZWRlIGVpbnplbG5lIFZhcmlhYmxlIGRpZSBhYmjDpG5naWdlIFZhcmlhYmxlIGJlZWluZmx1c3N0LCBzb25kZXJuIGF1Y2gsIHdpZSBndXQgZGFzIEdlc2FtdG1vZGVsbCBkaWUgdGF0c8OkY2hsaWNoZW4gV2VydGUgdm9yaGVyc2FndC4gRGllIG11bHRpcGxlIFJlZ3Jlc3Npb24gd2lyZCBow6R1ZmlnIGluIFNvemlhbHdpc3NlbnNjaGFmdGVuLCBXaXJ0c2NoYWZ0IHVuZCBNZWRpemluIGdlbnV0enQsIHVtIGtvbXBsZXhlIFp1c2FtbWVuaMOkbmdlIHp3aXNjaGVuIHZlcnNjaGllZGVuZW4gRWluZmx1c3NncsO2w59lbiB1bmQgZWluZW0gRXJnZWJuaXMgenUgYW5hbHlzaWVyZW4gdW5kIGZ1bmRpZXJ0ZSBFbnRzY2hlaWR1bmdlbiBhdWYgQmFzaXMgZGVyIGVybWl0dGVsdGVuIFp1c2FtbWVuaMOkbmdlIHp1IHRyZWZmZW4uCgoKIyAzKQlQcsO8ZmVuIGRlciBWb3JhdXNzZXR6dW5nZW4KCi0gRGllIGFiaMOkbmdpZ2UgVmFyaWFibGUgaXN0IGludGVydmFsbHNrYWxpZXJ0LCBkaWUgdW5hYmjDpG5naWdlbiBWYXJpYWJsZW4gc2luZCBpbnRlcnZhbGxza2FsaWVydCBvZGVyIGFscyBEdW1teS1WYXJpYWJsZW4gY29kaWVydC4KCi0gKipVbmFiaMOkbmdpZ2UgVmFyaWFibGVuIChVVik6KiogIAogIC0gTWl0Z2xpZWRzYmVpdHJhZyAo4oKsKSAgCiAgLSBXZXJiZWF1c2dhYmVuICjigqwpICAKICAtIEZhbmFydGlrZWx2ZXJrYXVmCgotICoqQWJow6RuZ2lnZSBWYXJpYWJsZSAoQVYpOioqICAKICAtIEJlc3VjaGVyIChBbnphaGwpCgotICoqTGluZWFyaXTDpHQgZGVzIFp1c2FtbWVuaGFuZ3M6KiogIAogIEVzIHdpcmQgZWluIGxpbmVhcmVyIFp1c2FtbWVuaGFuZyB6d2lzY2hlbiBkZXIgYWJow6RuZ2lnZW4gdW5kIGRlbiB1bmFiaMOkbmdpZ2VuIFZhcmlhYmxlbiBtb2RlbGxpZXJ0ICAKICBfKHNpZWhlIFNjYXR0ZXJwbG90IHVuZCBQZWFyc29uLUtvcnJlbGF0aW9uKV8KCi0gKipIb21vc2tlZGFzdGl6aXTDpHQ6KiogIAogIEbDvHIgamVkZW4gV2VydCBkZXIgdW5hYmjDpG5naWdlbiBWYXJpYWJsZW4gaGF0IGRlciBGZWhsZXJ3ZXJ0IGRpZXNlbGJlIFZhcmlhbnogIAogIF8oc2llaGUgSG9tb3NrZWRhc3Rpeml0w6R0KV8KCi0gKipVbmFiaMOkbmdpZ2tlaXQgZGVzIEZlaGxlcndlcnRzOioqICAKICBEaWUgRmVobGVyd2VydGUgaMOkbmdlbiBuaWNodCB2b25laW5hbmRlciBhYiAgCiAgXyhzaWVoZSBTY2F0dGVycGxvdCB1bmQgUGVhcnNvbi1Lb3JyZWxhdGlvbilfCgotICoqTm9ybWFsdmVydGVpbHVuZyBkZXMgRmVobGVyd2VydHM6KiogIAogIERpZSBGZWhsZXJ3ZXJ0ZSBzaW5kIG7DpGhlcnVuZ3N3ZWlzZSBub3JtYWx2ZXJ0ZWlsdCAgCiAgXyhzaWVoZSBIaXN0b2dyYW1tKV8KCi0gKipLZWluZSBNdWx0aWtvbGxpbmVhcml0w6R0OioqICAKICBEaWUgdW5hYmjDpG5naWdlbiBWYXJpYWJsZW4ga29ycmVsaWVyZW4gbmljaHQgenUgc3RhcmsgbWl0ZWluYW5kZXIgIAogIF8oc2llaGUgTXVsdGlrb2xsaW5lYXJpdMOkdClfCgoKIyA0KSBCb3hwbG90IAoKYGBge3J9CnBhcihtZnJvdz1jKDEsNCkpCmJveHBsb3QoRmFuYXJ0aWtlbHZlcmthdWYsIG1haW49IkJveHBsb3QgRmFuYXJ0aWtlbHZlcmthdWYiKQpib3hwbG90KEJlc3VjaGVyemFobGVuLCBtYWluPSJCb3hwbG90IEJlc3VjaGVyIikKYm94cGxvdChXZXJiZWF1c2dhYmVuLCBtYWluPSJCb3hwbG90IFdlcmJlYXVzZ2FiZW4iKQpib3hwbG90KE1pdGdsaWVkc2JlaXRyYWcsIG1haW49IkJveHBsb3QgTWl0Z2xpZWRzYmVpdHJhZyIpCmBgYAoKS2VpbmUgQXVzcmVpw59lciB6dSBlcmtlbm5lbi4KCiMgNSkgRGVza3JpcHRpdmUgU3RhdGlzdGlrCgpgYGB7cn0KcHN5Y2g6OmRlc2NyaWJlKE11bHRpcGxlX1JlZ3Jlc3Npb24pCmBgYAoKRGllIFRhYmVsbGUgZ2lidCBlaW5lbiDDnGJlcmJsaWNrIMO8YmVyIGRpZSBkZXNrcmlwdGl2ZW4gU3RhdGlzdGlrZW4gdm9uIGbDvG5mIFZhcmlhYmxlbiBhdXMgZGVtIERhdGVuc2F0ei4gRsO8ciBkaWUgYWJow6RuZ2lnZSBWYXJpYWJsZSBCZXN1Y2hlciBsYWcgZGVyIE1pdHRlbHdlcnQgYmVpIE0gPSAxODc3Ljg5LCBtaXQgZWluZXIgU3RhbmRhcmRhYndlaWNodW5nIHZvbiBTRCA9IDM1MC41MiAobiA9IDM2KS4gRGllIEJlc3VjaGVyemFobGVuIHZhcmlpZXJ0ZW4gZGFiZWkgendpc2NoZW4gMTE3MiB1bmQgMjYwNC4gRGVyIE1pdGdsaWVkc2JlaXRyYWcgKE1pdGdsaWVkc2JlaXRyYWcpIHplaWd0ZSBlaW5lbiBNaXR0ZWx3ZXJ0IHZvbiBNID0gMTEwLjM4IChTRCA9IDEuNjEsIG4gPSAzNiksIG1pdCBXZXJ0ZW4gdm9uIDEwNyBiaXMgMTEzLiBGw7xyIGRhcyBXZXJiZWJ1ZGdldCAoV2VyYmVhdXNnYWJlbikgd3VyZGUgZWluIE1pdHRlbHdlcnQgdm9uIE0gPSAxMjc0LjQ0IChTRCA9IDQ4MS41MCwgbiA9IDM2KSBiZWkgZWluZXIgU3Bhbm53ZWl0ZSB2b24gNDYwIGJpcyAyMDAwIGJlb2JhY2h0ZXQuIERpZSBWYXJpYWJsZSBGYW5hcnRpa2VsdmVya2F1ZiBoYXR0ZSBlaW5lbiBNaXR0ZWx3ZXJ0IHZvbiBNID0gOTA1LjI4IChTRCA9IDE1OS40NywgbiA9IDM2KSwgbWl0IFdlcnRlbiB6d2lzY2hlbiA2MDAgdW5kIDEyNTAuIERpZSBJRC1WYXJpYWJsZSBkaWVudCBsZWRpZ2xpY2ggZGVyIElkZW50aWZpa2F0aW9uIGRlciBlaW56ZWxuZW4gRsOkbGxlIHVuZCBpc3QgZsO8ciBkaWUgaW5oYWx0bGljaGUgQW5hbHlzZSBuaWNodCByZWxldmFudC4KCgojIDYpIFNjYXR0ZXJwbG90IHVuZCBQZWFyc29uCkVpbiBsaW5lYXJlcyBNb2RlbGwgZ2VodCBkYXZvbiBhdXMsIGRhc3MgZGVyIFp1c2FtbWVuaGFuZyB6d2lzY2hlbiBkZXIgYWJow6RuZ2lnZW4gVmFyaWFibGUgdW5kIGplZGVyIHVuYWJow6RuZ2lnZW4gVmFyaWFibGUgbGluZWFyIGlzdCDigJMgdW5kIHp3YXIgdW50ZXIgZGVyIEtvbnRyb2xsZSBhbGxlciB3ZWl0ZXJlbiB1bmFiaMOkbmdpZ2VuIFZhcmlhYmxlbi4gQmVpIG11bHRpcGxlciBSZWdyZXNzaW9uIGJlZGV1dGV0IGRhczogRGllIEJlemllaHVuZyB6d2lzY2hlbiBlaW5lciB1bmFiaMOkbmdpZ2VuIFZhcmlhYmxlIHVuZCBkZXIgWmllbGdyw7bDn2Ugc29sbHRlIGF1Y2ggZGFubiBsaW5lYXIgc2Vpbiwgd2VubiBtYW4gZGllIEVmZmVrdGUgZGVyIGFuZGVyZW4gRWluZmx1c3NncsO2w59lbiBiZXLDvGNrc2ljaHRpZ3QuCgpEaWVzZSBCZWRpbmd1bmcgbMOkc3N0IHNpY2ggamVkb2NoIG5pY2h0IGFsbGVpbiBtaXQgZWluZW0gZWluZmFjaGVuIFN0cmV1ZGlhZ3JhbW0gendpc2NoZW4gYWJow6RuZ2lnZXIgdW5kIGVpbmVyIHVuYWJow6RuZ2lnZW4gVmFyaWFibGUgcHLDvGZlbi4gSW0gR2VnZW5zYXR6IHp1ciBlaW5mYWNoZW4gUmVncmVzc2lvbiBrw7ZubmVuIHdlaXRlcmUgRWluZmx1c3NmYWt0b3JlbiBkYXMgVmVyaMOkbHRuaXMgdmVyZsOkbHNjaGVuLCBzb2Rhc3MgZGllIHRhdHPDpGNobGljaGUgQmV6aWVodW5nIGtvbXBsZXhlciBpc3QuIEVpbiBlaW5mYWNoZXMgU3RyZXVkaWFncmFtbSBiaWV0ZXQgZGFoZXIgbnVyIGVpbmVuIGdyb2JlbiBlcnN0ZW4gQW5oYWx0c3B1bmt0LCBvYiBlaW5lIGxpbmVhcmUgQmV6aWVodW5nIHZvcmxpZWdlbiBrw7ZubnRlLCB1bmQgd2lyZCBow6R1ZmlnIGFscyBlcnN0ZXIsIG9yaWVudGllcmVuZGVyIFNjaHJpdHQgZ2VudXR6dC4gRsO8ciBlaW5lIGdlbmF1ZSDDnGJlcnByw7xmdW5nIHNpbmQgd2VpdGVyZsO8aHJlbmRlIGdyYWZpc2NoZSBNZXRob2RlbiBlcmZvcmRlcmxpY2guCgoKYGBge3J9CmxpYnJhcnkoY2FyKQoKc2NhdHRlcnBsb3RNYXRyaXgofk1pdGdsaWVkc2JlaXRyYWcrRmFuYXJ0aWtlbHZlcmthdWYrV2VyYmVhdXNnYWJlbiArIEJlc3VjaGVyemFobGVuLCAKICAgICAgICAgICAgICAgICAgICAgICByZWdMaW5lPVRSVUUsIHNtb290aD1GQUxTRSwgCiAgZGlhZ29uYWw9bGlzdChtZXRob2Q9ImRlbnNpdHkiKSwgYnkuZ3JvdXBzPVRSVUUsIAogIGRhdGE9TXVsdGlwbGVfUmVncmVzc2lvbikKYGBgCgoKCmBgYHtyfQpsaWJyYXJ5KFBlcmZvcm1hbmNlQW5hbHl0aWNzKQpjaGFydC5Db3JyZWxhdGlvbihNdWx0aXBsZV9SZWdyZXNzaW9uWzE6NF0sCmhpc3RvZ3JhbT1UUlVFLAptZXRob2QgPSAicGVhcnNvbiIsCnBjaD0xOSkKYGBgCgpEaWUgU3RyZXVkaWFncmFtbS1NYXRyaXggbGllZmVydCBlaW5lbiBlcnN0ZW4gRWluZHJ1Y2sgZGF2b24sIHdpZSBkaWUgYWJow6RuZ2lnZSBWYXJpYWJsZSBtaXQgZGVuIGVpbnplbG5lbiB1bmFiaMOkbmdpZ2VuIFZhcmlhYmxlbiB6dXNhbW1lbmjDpG5ndC4gRGFiZWkgd2lyZCBzaWNodGJhciwgZGFzcyB6d2lzY2hlbiBkZW4gdW5hYmjDpG5naWdlbiBWYXJpYWJsZW4gdW5kIGRlciBaaWVsZ3LDtsOfZSB6dW1pbmRlc3QgYXVmIGRlbiBlcnN0ZW4gQmxpY2sgamV3ZWlscyBlaW5lIGxpbmVhcmUgQmV6aWVodW5nIGRlbmtiYXIgaXN0OiBEaWUgQmVzdWNoZXJ6YWhsIG5pbW10IG1pdCBow7ZoZXJlbiBGYW5hcnRpa2VsdmVya8OkdWZlbiB1bmQgZWluZW0gZ3LDtsOfZXJlbiBXZXJiZWJ1ZGdldCBvZmZlbmJhciB6dS4gRGVyIFp1c2FtbWVuaGFuZyBtaXQgZGVtIFRpY2tldE1pdGdsaWVkc2JlaXRyYWcgZXJzY2hlaW50IGRhZ2VnZW4gd2VuaWdlciBhdXNnZXByw6RndC4KClVtIGRpZSBBbm5haG1lIGRlciBMaW5lYXJpdMOkdCBnZW5hdWVyIHp1IMO8YmVycHLDvGZlbiwgZW1wZmllaGx0IGVzIHNpY2gsIGbDvHIgamVkZSB1bmFiaMOkbmdpZ2UgVmFyaWFibGUgZWluIHNwZXppZWxsZXMgU3RyZXVkaWFncmFtbSB6dSBlcnN0ZWxsZW4sIGRhcyBzb2dlbmFubnRlIENvbXBvbmVudC1wbHVzLXJlc2lkdWFsLVBsb3QuIERhbWl0IGzDpHNzdCBzaWNoIGVya2VubmVuLCBvYiBkaWUgQmV6aWVodW5nIHRhdHPDpGNobGljaCBsaW5lYXIgaXN0IG9kZXIgb2IgbcO2Z2xpY2hlcndlaXNlIGVpbmUgYW5kZXJlIEZvcm0gZGVzIFp1c2FtbWVuaGFuZ3Mgdm9ybGllZ3QuIEFsdGVybmF0aXYga8O2bm5lbiBhdWNoIHBhcnRpZWxsZSBSZWdyZXNzaW9uc2RpYWdyYW1tZSB2ZXJ3ZW5kZXQgd2VyZGVuLCBkaWUgZsO8ciBqZWRlIFZhcmlhYmxlIGRpZSBCZXppZWh1bmcgenVtIFJlc3QgZGVzIE1vZGVsbHMgZGFyc3RlbGxlbi4KCgpgYGB7cn0KIyBtb2RlbGwgCm1vZGVsbCA8LSBsbShCZXN1Y2hlcnphaGxlbiB+IE1pdGdsaWVkc2JlaXRyYWcgKyBXZXJiZWF1c2dhYmVuICsgRmFuYXJ0aWtlbHZlcmthdWYsIGRhdGEgPSBNdWx0aXBsZV9SZWdyZXNzaW9uKQoKIyBDb21wb25lbnQtcGx1cy1yZXNpZHVhbC1QbG90IGbDvHIgRmFuYXJ0aWtlbHZlcmthdWYKY3JQbG90cyhtb2RlbGwsIHRlcm1zID0gfiBGYW5hcnRpa2VsdmVya2F1ZikKYGBgCgpEYXMgcGFydGllbGxlIFJlZ3Jlc3Npb25zZGlhZ3JhbW0gZsO8ciBGYW5hcnRpa2VsdmVya2F1ZiB6ZWlndCBhdWYgZGVyIFktQWNoc2UgZGFzIFJlc2lkdXVtLCBkYXMgZW50c3RlaHQsIHdlbm4gZGllIFZhcmlhYmxlIEJlc3VjaGVyIGF1ZiBhbGxlIHVuYWJow6RuZ2lnZW4gVmFyaWFibGVuIGF1w59lciBGYW5hcnRpa2VsdmVya2F1ZiByZWdyZXNzaWVydCB3aXJkLiBBdWYgZGVyIFgtQWNoc2UgaXN0IGRhcyBSZXNpZHV1bSBkYXJnZXN0ZWxsdCwgZGFzIMO8YnJpZyBibGVpYnQsIHdlbm4gRmFuYXJ0aWtlbHZlcmthdWYgYXVmIGFsbGUgYW5kZXJlbiB1bmFiaMOkbmdpZ2VuIFZhcmlhYmxlbiByZWdyZXNzaWVydCB3aXJkLiBEYXMgYmVkZXV0ZXQ6IEVzIHdpcmQgamV3ZWlscyBkZXIgVGVpbCBiZXRyYWNodGV0LCBkZXIgZHVyY2ggZGllIGFuZGVyZW4gdW5hYmjDpG5naWdlbiBWYXJpYWJsZW4gbmljaHQgZXJrbMOkcnQgd2VyZGVuIGthbm4uIERpZXNlIGJlaWRlbiBSZXNpZHVlbiB3ZXJkZW4gZ2VnZW5laW5hbmRlciBhdWZnZXRyYWdlbi4KClplaWdlbiBkaWUgcGFydGllbGxlbiBSZWdyZXNzaW9uc2RpYWdyYW1tZSBmw7xyIGFsbGUgdW5hYmjDpG5naWdlbiBWYXJpYWJsZW4gZWluZSBsaW5lYXJlIEJlemllaHVuZywga2FubiBkYXZvbiBhdXNnZWdhbmdlbiB3ZXJkZW4sIGRhc3MgZGllIExpbmVhcml0w6R0c3ZvcmF1c3NldHp1bmcgZXJmw7xsbHQgaXN0LiBJbiBBYmJpbGR1bmcgNCBpc3QgZGllcyBmw7xyIEZhbmFydGlrZWx2ZXJrYXVmIGRlciBGYWxsLiBBdWNoIGJlaSBkZW4gYW5kZXJlbiB1bmFiaMOkbmdpZ2VuIFZhcmlhYmxlbiB6ZWlndCBzaWNoIGRpZXNlIExpbmVhcml0w6R0LCB3YXMgYXVzIEdyw7xuZGVuIGRlciDDnGJlcnNpY2h0bGljaGtlaXQgaGllciBqZWRvY2ggbmljaHQgd2VpdGVyIGRhcmdlc3RlbGx0IHdpcmQuCgojIDcpIEhvbW9za2VkYXN0aXppdMOkdAoKSG9tb3NrZWRhc3Rpeml0w6R0IGJlZGV1dGV0LCBkYXNzIGRpZSBGZWhsZXIgZsO8ciBqZWRlbiBXZXJ0IGRlciB1bmFiaMOkbmdpZ2VuIFZhcmlhYmxlbiBlaW5lIGtvbnN0YW50ZSBWYXJpYW56IGF1ZndlaXNlbi4gRGFzIHdpcmQgbWVpc3QgYW5oYW5kIGVpbmVzIFN0cmV1ZGlhZ3JhbW1zIMO8YmVycHLDvGZ0LCBpbiBkZW0gZGllIFJlc2lkdWVuIGdlZ2VuIGRpZSB2b3JoZXJnZXNhZ3RlbiBXZXJ0ZSBhdWZnZXRyYWdlbiB3ZXJkZW4uIERpZSBWb3JhdXNzZXR6dW5nIGlzdCBlcmbDvGxsdCwgd2VubiBzaWNoIGRpZSBGZWhsZXJ3ZXJ0ZSDDvGJlciBkZW4gZ2VzYW10ZW4gV2VydGViZXJlaWNoIGRlciBWb3JoZXJzYWdlbiB6dWbDpGxsaWcgdW5kIG9obmUgZXJrZW5uYmFyZXMgTXVzdGVyIHZlcnRlaWxlbiB1bmQgaWhyZSBTdHJldXVuZyBpbiBldHdhIGdsZWljaCBibGVpYnQuCgpGYWxscyBkaWUgU3RyZXV1bmcgZGVyIEZlaGxlciBuaWNodCBrb25zdGFudCBpc3QsIHNwcmljaHQgbWFuIHZvbiBIZXRlcm9za2VkYXN0aXppdMOkdC4gSW4gc29sY2hlbiBGw6RsbGVuIGVya2VubnQgbWFuIGjDpHVmaWcgZWluIGJlc3RpbW10ZXMgTXVzdGVyIGltIFN0cmV1ZGlhZ3JhbW0sIGJlaXNwaWVsc3dlaXNlIGVpbmUgdHJpY2h0ZXJmw7ZybWlnZSBvZGVyIHRyb21wZXRlbmFydGlnZSBBdXNwcsOkZ3VuZy4KCmBgYHtyfQoKcmVncmVzc2lvbjEgPC0gIGxtKEJlc3VjaGVyemFobGVuIH4gTWl0Z2xpZWRzYmVpdHJhZytGYW5hcnRpa2VsdmVya2F1ZitXZXJiZWF1c2dhYmVuICkKCnpwcmVkIDwtIHNjYWxlKGZpdHRlZChyZWdyZXNzaW9uMSksIGNlbnRlciA9IFQsIHNjYWxlID0gVCkKc3JlcyA8LXJzdGFuZGFyZChyZWdyZXNzaW9uMSkKCnBsb3QgKHg9enByZWQsIHk9c3JlcywgbWFpbiA9ICJTdHJldWRpYWdyYW1tIGRlciBSZXNpZHVlbiIsIAogICAgICB4bGFiID0iUmVncmVzc2lvbjogU3RhbmRhcmRpc2llcnRlciBnZXNjaMOkdHp0ZXIgV2VydCIsIAogICAgICB5bGFiID0gIlJlZ3Jlc3Npb246IFN0YW5kYXJkaXNpZXJ0ZXMgUmVzaWR1dW0iLAogICAgICBjb2wgPSAiZGFya2JsdWUiKQoKYWJsaW5lIChhPTAsIGI9MCkKCmBgYAoKCk5lYmVuIGRlciB2aXN1ZWxsZW4gQmV1cnRlaWx1bmcgZ2lidCBlcyBhdWNoIHZlcnNjaGllZGVuZSBzdGF0aXN0aXNjaGUgVGVzdHMsIG1pdCBkZW5lbiBIb21vc2tlZGFzdGl6aXTDpHQgZ2VwcsO8ZnQgd2VyZGVuIGthbm4sIHp1bSBCZWlzcGllbCBkZW4gQnJldXNjaC1QYWdhbi1UZXN0LCBkZW4gQ29vay1XZWlzYmVyZy1UZXN0IG9kZXIgZGVuIFdoaXRlLVRlc3QuIFdpcmQgYmVpIGRpZXNlbiBUZXN0cyBkaWUgTnVsbGh5cG90aGVzZSBuaWNodCB2ZXJ3b3JmZW4sIHNwcmljaHQgZGFzIGbDvHIgSG9tb3NrZWRhc3Rpeml0w6R0LiBEYXMgRXJnZWJuaXMgZ2lsdCBhbHMgdW5wcm9ibGVtYXRpc2NoLCB3ZW5uIGRlciBwLVdlcnQgZ3LDtsOfZXIgYWxzIDAsMDUgaXN0LiBXaXJkIGRpZXNlciBXZXJ0IG5pY2h0IHVudGVyc2Nocml0dGVuLCBrYW5uIGRhdm9uIGF1c2dlZ2FuZ2VuIHdlcmRlbiwgZGFzcyBkaWUgQW5uYWhtZSBkZXIgSG9tb3NrZWRhc3Rpeml0w6R0IGVyZsO8bGx0IGlzdC4KCgojIDgpIFVuYWJow6RuZ2lna2VpdCBkZXMgRmVobGVyd2VydHMKCkbDvHIgZGllIG11bHRpcGxlIFJlZ3Jlc3Npb24gaXN0IGVzIHdpY2h0aWcsIGRhc3MgZGllIEZlaGxlciB2ZXJzY2hpZWRlbmVyIEJlb2JhY2h0dW5nZW4gdW5hYmjDpG5naWcgdm9uZWluYW5kZXIgc2luZC4gRGFzIGJlZGV1dGV0LCBkYXNzIGRpZSBGZWhsZXJ3ZXJ0ZSBuaWNodCBtaXRlaW5hbmRlciBpbiBWZXJiaW5kdW5nIHN0ZWhlbiBkw7xyZmVuIHVuZCBrZWluZSBzeXN0ZW1hdGlzY2hlbiBNdXN0ZXIgYXVmd2Vpc2VuLCB3aWUgenVtIEJlaXNwaWVsIHplaXRsaWNoZSBvZGVyIHLDpHVtbGljaGUgQWJmb2xnZW4uIFdlcmRlbiBBYmjDpG5naWdrZWl0ZW4gZmVzdGdlc3RlbGx0LCBrYW5uIGRpZXMgYmVpc3BpZWxzd2Vpc2UgYW4gbWVocmZhY2hlbiBNZXNzdW5nZW4gaW5uZXJoYWxiIGRlcnNlbGJlbiBHcnVwcGUgb2RlciBhbiB3aWVkZXJrZWhyZW5kZW4gWmVpdHB1bmt0ZW4gbGllZ2VuLgoKVHJldGVuIHNvbGNoZSBBYmjDpG5naWdrZWl0ZW4gYXVmLCBrYW5uIGRpZSBBbm5haG1lIGRlciBVbmFiaMOkbmdpZ2tlaXQgdmVybGV0enQgc2Vpbiwgd2FzIHNpY2ggbWVpc3QgZHVyY2ggYXVmZsOkbGxpZ2UgTXVzdGVyIGluIGRlbiBSZXNpZHVlbiDDpHXDn2VydC4gQmVpIHVuYWJow6RuZ2lnZW4gRmVobGVybiBzaW5kIGRhZ2VnZW4ga2VpbmUgUmVnZWxtw6TDn2lna2VpdGVuIGVya2VubmJhci4gSXN0IGRpZXMgZGVyIEZhbGwsIGthbm4gZGF2b24gYXVzZ2VnYW5nZW4gd2VyZGVuLCBkYXNzIGRpZSBWb3JhdXNzZXR6dW5nIGVyZsO8bGx0IGlzdC4KCk5lYmVuIGRlciB2aXN1ZWxsZW4gQmV1cnRlaWx1bmcgZ2lidCBlcyBhdWNoIHN0YXRpc3Rpc2NoZSBUZXN0cyB6dXIgw5xiZXJwcsO8ZnVuZyBkZXIgVW5hYmjDpG5naWdrZWl0IGRlciBGZWhsZXIsIHdpZSBldHdhIGRlbiBEdXJiaW4tV2F0c29uLVRlc3QuIEVpbiBXZXJ0IG5haGUgMiBkZXV0ZXQgZGFyYXVmIGhpbiwgZGFzcyBrZWluZSBBdXRva29ycmVsYXRpb24gdm9ybGllZ3QsIHfDpGhyZW5kIFdlcnRlIG5haGUgMCBvZGVyIDQgYXVmIGVpbmUgc3RhcmtlIEFiaMOkbmdpZ2tlaXQgZGVyIEZlaGxlcndlcnRlIGhpbmRldXRlbi4KCgojIDkpIE5vcm1hbHZlcnRlaWx1bmcgZGVzIEZlaGxlcndlcnRzCgpFaW5lIHdlaXRlcmUgVm9yYXVzc2V0enVuZyBpc3QsIGRhc3MgZGllIEZlaGxlcndlcnRlIGFubsOkaGVybmQgbm9ybWFsdmVydGVpbHQgc2luZC4gRGllcyBsw6Rzc3Qgc2ljaCBvZnQgZ3V0IGFuaGFuZCBlaW5lcyBIaXN0b2dyYW1tcyBkZXIgc3RhbmRhcmRpc2llcnRlbiBSZXNpZHVlbiBiZXVydGVpbGVuLiBJbSBJZGVhbGZhbGwgemVpZ3QgZGFzIEhpc3RvZ3JhbW0gZWluZSBnbG9ja2VuZsO2cm1pZ2UgVmVydGVpbHVuZy4gV2VpY2hlbiBkaWUgRmVobGVyIHN0YXJrIHZvbiBkZXIgTm9ybWFsdmVydGVpbHVuZyBhYiwgenVtIEJlaXNwaWVsIGluZGVtIHNpZSB6d2VpZ2lwZmxpZyAoYmltb2RhbCkgdmVydGVpbHQgc2luZCwga2FubiBkaWVzIHByb2JsZW1hdGlzY2ggZsO8ciBkaWUgSW50ZXJwcmV0YXRpb24gZGVyIFJlZ3Jlc3Npb25zYW5hbHlzZSBzZWluLiBLbGVpbmVyZSBBYndlaWNodW5nZW4gd2VyZGVuIGjDpHVmaWcgYWxzIHVua3JpdGlzY2ggYmV0cmFjaHRldC4KCgpgYGB7cn0KCiMgcmVncmVzc2lvbjEgPC0gIGxtKEJlc3VjaGVyemFobGVuIH4gTWl0Z2xpZWRzYmVpdHJhZytGYW5hcnRpa2VsdmVya2F1ZitXZXJiZWF1c2dhYmVuICkKIyAKIyB6cHJlZCA8LSBzY2FsZShmaXR0ZWQocmVncmVzc2lvbjEpLCBjZW50ZXIgPSBULCBzY2FsZSA9IFQpCiMgc3JlcyA8LXJzdGFuZGFyZChyZWdyZXNzaW9uMSkKCmhpc3QgKHNyZXMsIGZyZXEgPSBULCBicmVha3MgPSAxMCwgbWFpbiA9IlZlcnRlaWx1bmcgZGVzIEZlaGxlcndlcnRzIiwgeGxhYj0gIlJlZ3Jlc3Npb246IFN0YW5kYXJkaXNpZXJ0ZXMgUmVzaWR1dW0iLCB5bGFiPSJIw6R1Zmlna2VpdGVuIiwgeGxpbSA9IGMoLTMsMykseWxpbSA9IGMoMCwxMiksIGNvbCA9ICJsaWdodGJsdWUiICkKYGBgCgoKIyAxMCkgS2VpbmUgTXVsdGlrb2xsaW5lYXJpdMOkdAoKRsO8ciBkaWUgbXVsdGlwbGUgUmVncmVzc2lvbiBpc3QgZXMgd2VzZW50bGljaCwgZGFzcyBkaWUgdW5hYmjDpG5naWdlbiBWYXJpYWJsZW4gbmljaHQgaW4gZWluZW0gc3RhcmtlbiBsaW5lYXJlbiBadXNhbW1lbmhhbmcgenVlaW5hbmRlciBzdGVoZW4uIERhcyBiZWRldXRldCwga2VpbmUgdW5hYmjDpG5naWdlIFZhcmlhYmxlIGRhcmYgc2ljaCBkdXJjaCBlaW5lIExpbmVhcmtvbWJpbmF0aW9uIGRlciBhbmRlcmVuIHZvbGxzdMOkbmRpZyBlcmtsw6RyZW4gbGFzc2VuLiBJbiBkZXIgUHJheGlzIHNpbmQga2xlaW5lIEtvcnJlbGF0aW9uZW4gbm9ybWFsLCBkb2NoIGVpbmUgenUgZ3Jvw59lIE11bHRpa29sbGluZWFyaXTDpHQgZsO8aHJ0IGRhenUsIGRhc3MgZGllIFNjaMOkdHp1bmcgZGVyIFJlZ3Jlc3Npb25za29lZmZpemllbnRlbiB1bnNpY2hlciB3aXJkLiBEYW5uIGthbm4gZXMgcGFzc2llcmVuLCBkYXNzIGVpZ2VudGxpY2ggd2ljaHRpZ2UgRWluZmx1c3NncsO2w59lbiBzdGF0aXN0aXNjaCB1bmF1ZmbDpGxsaWcgZXJzY2hlaW5lbi4KClp1ciDDnGJlcnByw7xmdW5nIHZvbiBNdWx0aWtvbGxpbmVhcml0w6R0IHdlcmRlbiB6d2VpIEtlbm56YWhsZW4gZ2VudXR6dDogKipUb2xlcmFuendlcnQqKiB1bmQgKipWYXJpYW56aW5mbGF0aW9uc2Zha3RvciAoVklGKSoqLiBCZWlkZSBHcsO2w59lbiBnZWJlbiBBdXNrdW5mdCBkYXLDvGJlciwgd2llIHNlaHIgZWluZSB1bmFiaMOkbmdpZ2UgVmFyaWFibGUgdm9uIGRlbiDDvGJyaWdlbiBhYmjDpG5ndC4gU2llIHN0ZWhlbiBpbiBlaW5lbSBLZWhyd2VydHZlcmjDpGx0bmlzIHp1ZWluYW5kZXIuCgoqKlRvbGVyYW56d2VydDoqKgoKJCQKVF9qID0gMSAtIFJfal4yCiQkCgpIaWVyYmVpIGlzdCBcKCBSX2peMiBcKSBkYXMgQmVzdGltbXRoZWl0c21hw58sIGRhcyBhbmdpYnQsIHdpZSBndXQgc2ljaCBkaWUgVmFyaWFibGUgXCggeF9qIFwpIGR1cmNoIGRpZSBhbmRlcmVuIHVuYWJow6RuZ2lnZW4gVmFyaWFibGVuIGVya2zDpHJlbiBsw6Rzc3QuCgoqKlZhcmlhbnppbmZsYXRpb25zZmFrdG9yIChWSUYpOioqCgokJApcdGV4dHtWSUZ9X2ogPSBcZnJhY3sxfXtUX2p9CiQkCiMjIyBGYXVzdHJlZ2VsIHp1ciBCZXVydGVpbHVuZzoKCi0gKipUb2xlcmFuendlcnQ6Kiogc29sbHRlICoqbmljaHQga2xlaW5lciBhbHMgMCwxMCoqIHNlaW4gIAotICoqVklGOioqIHNvbGx0ZSAqKm5pY2h0IGdyw7bDn2VyIGFscyAxMCoqIHNlaW4KCgpgYGB7cn0KIyByZWdyZXNzaW9uMSA8LSAgbG0oQmVzdWNoZXJ6YWhsZW4gfiBNaXRnbGllZHNiZWl0cmFnK0ZhbmFydGlrZWx2ZXJrYXVmK1dlcmJlYXVzZ2FiZW4gKQojIFZJRiBiZXJlY2huZW4KdmlmX3ZhbHVlcyA8LSB2aWYocmVncmVzc2lvbjEpCgoKIyBUb2xlcmFueiBiZXJlY2huZW4gKDEvVklGKQp0b2xlcmFueiA8LSAxIC8gdmlmX3ZhbHVlcwoKCiMgWnVzYW1tZW5mYXNzZW4gYWxzIERhdGFGcmFtZQplcmdlYm5pc3NlIDwtIGRhdGEuZnJhbWUoCiAgVmFyaWFibGUgPSBuYW1lcyh2aWZfdmFsdWVzKSwKICBWSUYgPSByb3VuZCh2aWZfdmFsdWVzLCAzKSwKICBUb2xlcmFueiA9IHJvdW5kKHRvbGVyYW56LCAzKQopCnByaW50KGVyZ2Vibmlzc2UpCmBgYAoKCldlcmRlbiBkaWVzZSBHcmVuendlcnRlIG5pY2h0IGVpbmdlaGFsdGVuLCBsaWVndCBlaW5lIHByb2JsZW1hdGlzY2hlIE11bHRpa29sbGluZWFyaXTDpHQgdm9yLiBJbiBkaWVzZW0gRmFsbCBzb2xsdGUgZGFzIFJlZ3Jlc3Npb25zbW9kZWxsIMO8YmVyYXJiZWl0ZXQgd2VyZGVuIOKAkyB6dW0gQmVpc3BpZWwsIGluZGVtIGJldHJvZmZlbmUgUHLDpGRpa3RvcmVuIGVudGZlcm50IG9kZXIgdW1nZXdhbmRlbHQgd2VyZGVuLiBQZXJmZWt0ZSBNdWx0aWtvbGxpbmVhcml0w6R0LCBhbHNvIGVpbmUgdm9sbHN0w6RuZGlnIGxpbmVhcmUgQmV6aWVodW5nLCB3aXJkIGF1dG9tYXRpc2NoIGVya2FubnQuIEJlaSBtb2RlcmF0ZXIgTXVsdGlrb2xsaW5lYXJpdMOkdCBpc3QgZWluZSBlaWdlbnN0w6RuZGlnZSBLb250cm9sbGUgdW5kIEFucGFzc3VuZyBub3R3ZW5kaWcuIFNpbmQgYWxsZSBWb3JhdXNzZXR6dW5nZW4gYWt6ZXB0YWJlbCBlcmbDvGxsdCwga2FubiBkYXMgTW9kZWxsIHdlaXRlciBpbnRlcnByZXRpZXJ0IHdlcmRlbi4KCgoKIyAxMSkgU2lnbmlmaWthbnogZGVzIFJlZ3Jlc3Npb25zbW9kZWxscwoKVW0genUgYmVzdGltbWVuLCBvYiBkYXMgUmVncmVzc2lvbnNtb2RlbGwgaW5zZ2VzYW10IHN0YXRpc3Rpc2NoIGJlZGV1dHNhbSBpc3QsIHdpcmQgZWluIEYtVGVzdCB2ZXJ3ZW5kZXQuIERpZXNlciBUZXN0IHByw7xmdCwgb2IgZGllIHVuYWJow6RuZ2lnZW4gVmFyaWFibGVuIGdlbWVpbnNhbSBkYXp1IGJlaXRyYWdlbiwgZGllIGFiaMOkbmdpZ2UgVmFyaWFibGUgYmVzc2VyIHZvcmhlcnp1c2FnZW4sIGFscyBlcyBkZXIgWnVmYWxsIGvDtm5udGUuIEFuZGVycyBnZXNhZ3QsIGJld2VydGV0IGRlciBGLVRlc3QsIG9iIGRhcyBnZXNhbXRlIE1vZGVsbCBlaW5lbiBzaWduaWZpa2FudGVuIEVya2zDpHJ1bmdzd2VydCBmw7xyIGRpZSBhYmjDpG5naWdlIFZhcmlhYmxlIGJlc2l0enQuCgokJEJlc3VjaGVyemFobGVuPVxiZXRhXzArXGJldGFfMVxjZG90IE1pdGdsaWVkc2JlaXRyYWcrXGJldGFfMlxjZG90IFdlcmJlYXVzZ2FiZW4rXGJldGFfM1xjZG90IFZlcmthdWYrXGVwc2lsb25faSQkCgoKV2VubiBkYXMgRXJnZWJuaXMgZGVzIEYtVGVzdHMgc2lnbmlmaWthbnQgYXVzZsOkbGx0ICh0eXBpc2NoZXJ3ZWlzZSBwIDwgMCwwNSksIHplaWd0IGRhcywgZGFzcyBkYXMgTW9kZWxsIGluc2dlc2FtdCBlaW5lbiByZWxldmFudGVuIEJlaXRyYWcgenVyIFZvcmhlcnNhZ2UgbGVpc3RldC4gSW4gZGllc2VtIEZhbGwga2FubiBkaWUgQW5hbHlzZSB3ZWl0ZXJnZWbDvGhydCB3ZXJkZW4sIGJlaXNwaWVsc3dlaXNlIGluZGVtIGRpZSBlaW56ZWxuZW4gRWluZmx1c3NncsO2w59lbiBiZXRyYWNodGV0IHdlcmRlbi4gSXN0IGRhcyBNb2RlbGwgaW5zZ2VzYW10IG5pY2h0IHNpZ25pZmlrYW50LCB3w6RyZSBlaW5lIHdlaXRlcmUgQW5hbHlzZSBuaWNodCBzaW5udm9sbC4KCgoKIyAxMikJU2lnbmlmaWthbnogZGVyIFJlZ3Jlc3Npb25za29lZmZpemllbnRlbiB1bmQgZGllIFJlZ3Jlc3Npb25zZ3JhZGUKCkhpZXIgd2lyZCBkaWUgTXVsdGlwbGUgUmVncmVzc2lvbiBkdXJjaGdlZsO8aHJ0LiBBY2h0ZW4gU2llIGF1ZiBkaWUgUnVuZHVuZy4gCgpgYGB7cn0KIyBtb2RlbGwKcmVncmVzc2lvbjEgPC0gIGxtKEJlc3VjaGVyemFobGVuIH4gTWl0Z2xpZWRzYmVpdHJhZytGYW5hcnRpa2VsdmVya2F1ZitXZXJiZWF1c2dhYmVuICkKCgojIEtvZWZmaXppZW50ZW4gaG9sZW4Ka29lZnMgPC0gdGlkeShyZWdyZXNzaW9uMSkKCiMgVklGIHVuZCBUb2xlcmFueiBiZXJlY2huZW4gCnZpZl92YWxzIDwtIHZpZihyZWdyZXNzaW9uMSkKdG9sZXJhbnogPC0gMSAvIHZpZl92YWxzCgojIEludGVyY2VwdApWSUZfZnVsbCA8LSBjKE5BLCByb3VuZCh2aWZfdmFscywgMykpICAgICAgICAjIEludGVyY2VwdCBoYXQga2VpbmVuIFZJRgpUb2xlcmFuel9mdWxsIDwtIGMoTkEsIHJvdW5kKHRvbGVyYW56LCAzKSkgICAjIEludGVyY2VwdCBoYXQga2VpbmUgVG9sZXJhbnoKCiMgQWxsZXMgaW4gZWluZSBUYWJlbGxlCmVyZ2Vibmlzc2UgPC0gZGF0YS5mcmFtZSgKICBWYXJpYWJsZSA9IGtvZWZzJHRlcm0sCiAgUmVncmVzc2lvbnNrb2VmZml6aWVudCA9IHJvdW5kKGtvZWZzJGVzdGltYXRlLCAzKSwKICBTdGFuZGFyZGZlaGxlciA9IHJvdW5kKGtvZWZzJHN0ZC5lcnJvciwgMyksCiAgdF9XZXJ0ID0gcm91bmQoa29lZnMkc3RhdGlzdGljLCAzKSwKICBwX1dlcnQgPSByb3VuZChrb2VmcyRwLnZhbHVlLCAzKSwKICBUb2xlcmFueiA9IFRvbGVyYW56X2Z1bGwsCiAgVklGID0gVklGX2Z1bGwKKQoKcHJpbnQoZXJnZWJuaXNzZSkKYGBgCkltIG7DpGNoc3RlbiBTY2hyaXR0IHdpcmQgdW50ZXJzdWNodCwgb2IgZGllIGVpbnplbG5lbiBFaW5mbHVzc2dyw7bDn2VuIChSZWdyZXNzaW9uc2tvZWZmaXppZW50ZW4pIHRhdHPDpGNobGljaCBlaW5lbiBiZWRldXRzYW1lbiBadXNhbW1lbmhhbmcgbWl0IGRlciBaaWVsZ3LDtsOfZSBoYWJlbi4gRGFmw7xyIHdpcmQgenUgamVkZW0gZWluemVsbmVuIEtvZWZmaXppZW50ZW4gZWluIHQtVGVzdCBkdXJjaGdlZsO8aHJ0LiBEYXMgRXJnZWJuaXMgemVpZ3QsIG9iIGRpZSBqZXdlaWxpZ2UgVmFyaWFibGUgZWluZW4gbWVzc2JhcmVuIEVpbmZsdXNzIGF1ZiBkaWUgQmVzdWNoZXJ6YWhsIGF1c8O8YnQuCgpEaWUgRXJnZWJuaXNzZSBkZXIgdC1UZXN0cyB6ZWlnZW4sIGRhc3MgZGllIFJlZ3Jlc3Npb25za29lZmZpemllbnRlbiBmw7xyIE1pdGdsaWVkc2JlaXRyYWcgKHQgPSAtMiw2MTIsIHAgPSAwLDAxNCksIFdlcmJlYXVzZ2FiZW4gKHQgPSA5LDY1NywgcCA8IDAsMDAxKSwgRmFuYXJ0aWtlbHZlcmthdWYgKHQgPSA1LDc1OSwgcCA8IDAsMDAxKSBzb3dpZSBmw7xyIGRpZSBLb25zdGFudGUgKFktQWNoc2VuYWJzY2huaXR0OyB0ID0gMiw3OTcsIHAgPSAwLDAwOSkgamV3ZWlscyBzdGF0aXN0aXNjaCBzaWduaWZpa2FudCBzaW5kLiBFaW4gc2lnbmlmaWthbnRlciBZLUFjaHNlbmFic2Nobml0dCBiZWRldXRldCwgZGFzcyBkaWUgUmVncmVzc2lvbnNnZXJhZGUgZGVuIFVyc3BydW5nIG5pY2h0IHNjaG5laWRldC4gRGllIHNpZ25pZmlrYW50ZW4gS29lZmZpemllbnRlbiBkZXIgdW5hYmjDpG5naWdlbiBWYXJpYWJsZW4gemVpZ2VuLCBkYXNzIGRpZXNlIEZha3RvcmVuIGVpbmVuIHJlbGV2YW50ZW4gRWluZmx1c3MgYXVmIGRpZSBCZXN1Y2hlcnphaGwgaGFiZW4uCgpEYXJhdXMgZXJnaWJ0IHNpY2ggZm9sZ2VuZGUgUmVncmVzc2lvbnNnbGVpY2h1bmc6CgoqKkJlc3VjaGVyemFobGVuID0gNTA5MSwyMSDigJMgNDMsMjMgwrcgTWl0Z2xpZWRzYmVpdHJhZyArIDAsNTQgwrcgV2VyYmVhdXNnYWJlbiArIDAsOTcgwrcgRmFuYXJ0aWtlbHZlcmthdWYqKgoKCkRpZSBHbGVpY2h1bmcgbWFjaHQgZGV1dGxpY2gsIGRhc3MgZGVyIE1pdGdsaWVkc2JlaXRyYWcgZWluZW4gbmVnYXRpdmVuIEVmZmVrdCBoYXQ6IEVyaMO2aHQgc2ljaCBkZXIgTWl0Z2xpZWRzYmVpdHJhZyB1bSBlaW5lIEVpbmhlaXQgKHou4oCvQi4gaW4gRXVybyksIHNpbmt0IGRpZSBCZXN1Y2hlcnphaGwgaW0gTWl0dGVsIHVtIDQzLDIzIFBlcnNvbmVuLCBzb2Zlcm4gZGllIGFuZGVyZW4gVmFyaWFibGVuIGtvbnN0YW50IGJsZWliZW4uIERpZSBwb3NpdGl2ZW4gS29lZmZpemllbnRlbiBmw7xyIFdlcmJlYXVzZ2FiZW4gdW5kIEZhbmFydGlrZWx2ZXJrYXVmIGJlZGV1dGVuLCBkYXNzIG1pdCBqZWRlciB6dXPDpHR6bGljaGVuIEVpbmhlaXQgaW0gV2VyYmVidWRnZXQgb2RlciBGYW5hcnRpa2VsdmVya2F1ZiBzdGVpZ3QgZGllIEJlc3VjaGVyemFobCBqZXdlaWxzIHVtIDAsNTQgYnp3LiAwLDk3IFBlcnNvbmVuIHN0ZWlndCwgd2VubiBhbGxlIGFuZGVyZW4gRWluZmx1c3NncsO2w59lbiBnbGVpY2ggYmxlaWJlbi4KCgojIDEzKSBNb2RlbGxnw7x0ZQpEYXMgQmVzdGltbXRoZWl0c21hw58gKipSwrIqKiBpc3QgZWluZSBLZW5uemFobCwgZGllIGJlc2NocmVpYnQsIHdpZSBndXQgZWluZSBSZWdyZXNzaW9uc2FuYWx5c2UgZGllIGJlb2JhY2h0ZXRlbiBEYXRlbiB3aWVkZXJnaWJ0LiBFcyB6ZWlndCBhbiwgd2VsY2hlciBBbnRlaWwgZGVyIEdlc2FtdHNjaHdhbmt1bmcgZGVyIGFiaMOkbmdpZ2VuIFZhcmlhYmxlIGR1cmNoIGRpZSBnZXfDpGhsdGVuIEVpbmZsdXNzZ3LDtsOfZW4gZXJrbMOkcnQgd2VyZGVuIGthbm4uIEVpbiBSwrItV2VydCB2b24gMCBiZWRldXRldCwgZGFzcyBkYXMgTW9kZWxsIGtlaW5lIFZvcmhlcnNhZ2VrcmFmdCBiZXNpdHp0OyBlaW4gV2VydCB2b24gMSBzdGVodCBmw7xyIGVpbmUgcGVyZmVrdGUgRXJrbMOkcnVuZyBkZXIgRGF0ZW4uIFdlcnRlIG7DpGhlciBhbiAxIGRldXRlbiBhbHNvIGRhcmF1ZiBoaW4sIGRhc3MgZGFzIE1vZGVsbCBzZWhyIGd1dCBnZWVpZ25ldCBpc3QsIGRpZSBiZW9iYWNodGV0ZW4gWnVzYW1tZW5ow6RuZ2UgYWJ6dWJpbGRlbi4KCgpCZWkgZGVyIG11bHRpcGxlbiBSZWdyZXNzaW9uIGlzdCB6dSBiZWFjaHRlbiwgZGFzcyBSwrIgYWxsZWluIG9mdCB6dSBvcHRpbWlzdGlzY2ggYXVzZsOkbGx0LCB3ZWlsIGVzIGJlaSBqZWRlciB6dXPDpHR6bGljaGVuIHVuYWJow6RuZ2lnZW4gVmFyaWFibGUgYXV0b21hdGlzY2ggc3RlaWd0IOKAkyBzZWxic3Qgd2VubiBkaWVzZSBrZWluZW4gd2lya2xpY2hlbiBNZWhyd2VydCBiaWV0ZXQuIEF1cyBkaWVzZW0gR3J1bmQgd2lyZCBow6R1ZmlnIGRhcyAqKmFuZ2VwYXNzdGUgKGtvcnJpZ2llcnRlKSBSwrIqKiBiZXJpY2h0ZXQuIERpZXNlcyBrb3JyaWdpZXJ0IGRlbiBXZXJ0IG5hY2ggdW50ZW4sIGZhbGxzIHVubsO2dGlnIHZpZWxlIEVpbmZsdXNzZ3LDtsOfZW4gYmVyw7xja3NpY2h0aWd0IHdlcmRlbiwgdW5kIGlzdCBkYWR1cmNoIGVpbiB6dXZlcmzDpHNzaWdlcmVzIE1hw58gZsO8ciBkaWUgTW9kZWxsZ8O8dGUuCmBgYHtyfQojIE1vZGVsbGfDvHRlIGJlcmVjaG5lbgpzdW1tYXJ5X21vZGVsIDwtIHN1bW1hcnkocmVncmVzc2lvbjEpCgpSIDwtIHNxcnQoc3VtbWFyeV9tb2RlbCRyLnNxdWFyZWQpClIyIDwtIHN1bW1hcnlfbW9kZWwkci5zcXVhcmVkCmFkalIyIDwtIHN1bW1hcnlfbW9kZWwkYWRqLnIuc3F1YXJlZApTRSA8LSBzdW1tYXJ5X21vZGVsJHNpZ21hCgojIER1cmJpbi1XYXRzb24tVGVzdApkdyA8LSBsbXRlc3Q6OmR3dGVzdChyZWdyZXNzaW9uMSkkc3RhdGlzdGljCgojIEFsbGVzIGluIGVpbiBEYXRhRnJhbWUgCm1vZGVsZ3VldGUgPC0gZGF0YS5mcmFtZSgKICBSID0gcm91bmQoUiwgMyksCiAgUl9RdWFkcmF0ID0gcm91bmQoUjIsIDMpLAogIEtvcnJpZ2llcnRlc19SX1F1YWRyYXQgPSByb3VuZChhZGpSMiwgMyksCiAgU3RhbmRhcmRmZWhsZXJfZGVzX1NjaMOkdHplcnMgPSByb3VuZChTRSwgMyksCiAgRHVyYmluX1dhdHNvbl9TdGF0aXN0aWsgPSByb3VuZChkdywgMykKKQoKcHJpbnQobW9kZWxndWV0ZSkKYGBgCgpFaW4ga29ycmlnaWVydGVzIFLCsiB2b24gMCw4MCBiZXNhZ3QgenVtIEJlaXNwaWVsLCBkYXNzIDgw4oCvJSBkZXIgU3RyZXV1bmcgaW4gZGVuIERhdGVuIGR1cmNoIGRpZSBnZXfDpGhsdGVuIHVuYWJow6RuZ2lnZW4gVmFyaWFibGVuIGVya2zDpHJ0IHdlcmRlbiBrw7ZubmVuLgoKCiMgMTQpCUJlcmVjaG51bmcgZGVyIEVmZmVrdHN0w6Rya2UKClVtIHp1IGJldXJ0ZWlsZW4sIHdpZSBiZWRldXRzYW0gZGFzIEVyZ2VibmlzIGVpbmVyIFJlZ3Jlc3Npb24gaXN0LCBiZXJlY2huZXQgbWFuIG9mdCBlaW5lIEVmZmVrdHN0w6Rya2UuIEF1Y2ggd2VubiBlaW4gaG9oZXIgQW50ZWlsIGRlciBTdHJldXVuZyBpbiBkZXIgWmllbGdyw7bDn2UgZXJrbMOkcnQgd2lyZCwgc3RlbGx0IHNpY2ggZGllIEZyYWdlLCB3aWUgZ3Jvw58gZGllc2VyIEVmZmVrdCBpbSBWZXJnbGVpY2ggenUgdHlwaXNjaGVuIFN0YW5kYXJkcyBlaW56dXNjaMOkdHplbiBpc3QuCgpFcyBleGlzdGllcmVuIHZlcnNjaGllZGVuZSBNYcOfZSBmw7xyIGRpZSBFZmZla3RzdMOkcmtlLiBadSBkZW4gZ2VicsOkdWNobGljaHN0ZW4gesOkaGx0IGRhcyBuYWNoIENvaGVuIGJlbmFubnRlIE1hw58gXCggZl4yIFwpLCBkYXMgaW5zYmVzb25kZXJlIGbDvHIgUmVncmVzc2lvbnNhbmFseXNlbiBnZWVpZ25ldCBpc3QuIERhbWl0IGzDpHNzdCBzaWNoIGFic2Now6R0emVuLCBvYiBkZXIgZ2VmdW5kZW5lIFp1c2FtbWVuaGFuZyBzY2h3YWNoLCBtaXR0ZWwgb2RlciBzdGFyayBpc3QuCgpEaWUgRWZmZWt0c3TDpHJrZSBcKCBmXjIgXCkga2FubiBhdXMgZGVtIEJlc3RpbW10aGVpdHNtYcOfIFwoIFJeMiBcKSBiZXJlY2huZXQgd2VyZGVuOgoKJCQKZl4yID0gXGZyYWN7Ul4yfXsxIC0gUl4yfQokJAoKd29iZWk6CgotIFwoIGZeMiBcKSBkaWUgRWZmZWt0c3TDpHJrZSBuYWNoIENvaGVuIGlzdAotIFwoIFJeMiBcKSBkYXMgQmVzdGltbXRoZWl0c21hw58gZGVyIFJlZ3Jlc3Npb24gaXN0CgpCZWlzcGllbDogIApBbmdlbm9tbWVuLCBcKCBSXjIgPSAwLDgwIFwpLCBlcmdpYnQgc2ljaDoKCiQkCmZeMiA9IFxmcmFjezAsODB9ezEgLSAwLDgwfSA9IFxmcmFjezAsODB9ezAsMjB9ID0gNCwwCiQkCgpadXIgRWlub3JkbnVuZyBzY2hsw6RndCBDb2hlbiAoMTk5MikgZm9sZ2VuZGUgU2Nod2VsbGVud2VydGUgdm9yOgoKXFsKXGJlZ2lue2FsaWdufQpcdGV4dHtTY2h3YWNoZXIgRWZmZWt0On0gXHF1YWQgJiAwLjEwIDwgfHxmfHwgPCAwLjI1IFxcClx0ZXh0e1NjaHdhY2hlciBiaXMgbWl0dGxlcmVyIEVmZmVrdDp9IFxxdWFkICYgMC4yNSA9IHx8Znx8IFxcClx0ZXh0e01pdHRsZXJlciBFZmZla3Q6fSBccXVhZCAmIDAuMjUgPCB8fGZ8fCA8IDAuNDAgXFwKXHRleHR7TWl0dGxlcmVyIGJpcyBzdGFya2VyIEVmZmVrdDp9IFxxdWFkICYgMC40MCA9IHx8Znx8IFxcClx0ZXh0e1N0YXJrZXIgRWZmZWt0On0gXHF1YWQgJiAwLjQwIDwgfHxmfHwKXGVuZHthbGlnbn0KXF0KYGBge3J9CnJlZyA8LSBzdW1tYXJ5KHJlZ3Jlc3Npb24xKQoKZjwtIHJlZyRhZGouci5zcXVhcmVkLyAoMS1yZWckYWRqLnIuc3F1YXJlZCkKc3ByaW50ZigiRGllIEVmZmVrdHN0w6Rya2UgbGllZ3QgYmVpOiAlLjJmIiwgZikKYGBgCgoKRWluIFdlcnQgdm9uIFwoIGZeMiA9IDQsMCBcKSBzdGVodCBkYW1pdCBmw7xyIGVpbmVuIHNlaHIgc3RhcmtlbiBFZmZla3QuCgoKIyAxNSkgRWluZSBBdXNzYWdlCkVpbmUgbXVsdGlwbGUgUmVncmVzc2lvbnNhbmFseXNlIGVyZ2FiLCBkYXNzIHNvd29obCBkaWUgWmFobCBkZXIgdmVya2F1ZnRlbiBGYW5hcnRpa2VsLCBkZXIgTWl0Z2xpZWRzYmVpdHJhZyBhbHMgYXVjaCBkaWUgV2VyYmVhdXNnYWJlbiBlaW5lbiBFaW5mbHVzcyBhdWYgZGllIEJlc3VjaGVyemFobCBiZWkgVmVyZWluc3ZlcmFuc3RhbHR1bmdlbiBoYWJlbiwgRigzLDMyKSA9IDQ3LDY1LCBwIDwgLjAwMSwgbiA9IDM2LiBFcmjDtmh0IHNpY2ggZGVyIE1pdGdsaWVkc2JlaXRyYWcgdW0gZWluZW4gRXVybywgc2lua3QgZGllIEJlc3VjaGVyemFobCBpbSBEdXJjaHNjaG5pdHQgdW0gNDMsMjMgUGVyc29uZW4uIFdlcmRlbiBkaWUgV2VyYmVhdXNnYWJlbiB1bSBlaW5lbiBFdXJvIGdlc3RlaWdlcnQsIHN0ZWlndCBkaWUgQmVzdWNoZXJ6YWhsIHVtIGV0d2EgMCw1NCBQZXJzb25lbi4gSmVkZXIgenVzw6R0emxpY2ggdmVya2F1ZnRlIEZhbmFydGlrZWwgZsO8aHJ0IGR1cmNoc2Nobml0dGxpY2ggenUgMCw5NyB3ZWl0ZXJlbiBCZXN1Y2hlcm4uIEluc2dlc2FtdCBlcmtsw6RyZW4gZGllc2UgZHJlaSBGYWt0b3JlbiA4MCAlIGRlciBTdHJldXVuZyBpbiBkZW4gQmVzdWNoZXJ6YWhsZW4g4oCTIGVpbiBXZXJ0LCBkZXIgZ2Vtw6TDnyBDb2hlbiAoMTk5MikgYXVmIGVpbmVuIHN0YXJrZW4gRWZmZWt0IGhpbndlaXN0Lgo=