Motivation
In diesem Beispiel möchten wir uns die Funktionsweise von Instrumentalvariablen genauer anschauen. Zu Beginn werden wir noch einmal kurz Instrumentalvariablen in der Theorie beleuchten und diese mit einem DAG darstellen. Anschließend möchten wir uns einen Datensatz simulieren, bei dem wir der Frage nachgehen, ob Bildung das Einkommen kausal beeinflusst. Dabei simulieren wir die Bildung so, dass diese von der Nähe zur nächsten Universität, als auch den eigenen Fähigkeiten abhängt.
Theorie
Folgende Fragestellung, welche wir in diesem Semester bereits mehrfach beleuchtet haben, wollen wir hier noch einmal aufgreifen:
Gibt es einen kausalen Zusammenhang zwischen Bildung und (späterem) Einkommen?
Bei dieser Frage stehen wir vor einem Problem, da die Bildung von mehreren Faktoren abhängt, die auch das Einkommen beeinflussen. Einige dieser Faktoren hatten Sie bereits in der Veranstaltung kennen gelernt (und auch selbst genannt): Familieneinkommen, Bildung der Eltern, eigene Fähigkeiten, Netzwerk …
Um uns die Wirkungsweise der Instrumentalvariablenregression näher anzuschauen wollen wir eine vereinfachte Simulationsstudie durchführen. In dieser Simulation konzentrieren wir uns auf den Zusammenhang zwischen der Bildung und dem Einkommen, sowie einer (unbeobachtbaren) Hintergrundvariablen, nennen wir sie “Fähigkeiten”, welche wir in unserem simulierten Datensatz beobachten können. Durch unsere Simulation können wir ergründen ob wir den (simulierten) kausalen Effekt der Bildung auf das Einkommen mit unterschiedlichen Regressionsspezifikationen erhalten können.
Wir sehen den Zusammenhang zwischen der Bildung und den (unbeobachtbaren) Fähigkeiten, sowie zwischen Einkommen und (unbeobachtbaren) Fähigkeiten in folgendem DAG:
\[\color{#0074D9}{\text{Einkommen}_i} = \beta_0 + \beta_1 \color{darkorange}{\text{Bildung}_i} + \beta_2 \color{red}{\text{Fähigkeiten}_i} + \varepsilon_i\]
Die (unbeobachtbaren) Fähigkeiten sind eine Confounder, auf welchen wir kontrollieren müssten. Kontrollieren wir nicht auf die (unbeobachtbaren) Fähigkeiten, so würden wir die backdoor im DAG nicht schließen und der Einfluss der Fähigkeiten wandert in den Fehlerterm:
Der Fehlerterm besteht dann aus:
\(\color{red}{\eta_i} = \beta_2 \color{red}{\text{Fähigkeiten}_i} + \varepsilon_i\)
und damit ist die Bildung mit dem Fehlerterm \(\color{red}{\eta_i}\) korreliert:
\[\color{#0074D9}{\text{Einkommen}_i} = \beta_0 + \beta_1 \color{darkorange}{\text{Bildung}_i} + \color{red}{\eta_i}\] Folglich wäre die Bildungsentscheidung in unserer Schätzung endogen und wir würden durch eine “naive” Schätzung des Einkommens auf die Bildung (ohne auf die Fähigkeiten zu kontrollieren) einen verzerrten Effekt der Bildung auf das Einkommen erhalten. Da die Fähigkeiten einer Person sowohl seine Bildungsentscheidung als auch sein späteres Einkommen positiv beeinflussen, wäre der Koeffizient \(\beta_1\) in der naiven Schätzung systematisch nach oben verzerrt. D.h. der Koeffizient \(\beta_1\), welchen wir in der naiven Schätzung heraus bekommen würden, wäre größer als der wahre Wert.
Daten simulieren
Um das Prinzip der Instrumentalvariablenschätzung zu veranschaulichen wollen wir eine kleine Simulationsstudie betrachten, bei der wir den “wahren” Wert der Variable kennen und wissen, ob ein Schätzer in der Regression verzerrt ist, oder den korrekten Wert wiedergibt.
Durch Simulationsstudien können wir Probleme oder Unklarheiten untersuchen und bekommen dadurch eine Intuition vom Datengenerierungsprozess ich echten empirischen Datensätzen.
Wir simulieren uns einen Datensatz aus 50000 Personen, die wir untersuchen möchten (dies definieren wir in der zweiten Zeile). Danach generieren wir uns einen Datensatz der folgende Variablen enthält:
faehigkeiten
= Fähigkeiten.
- Diese Variable ist standardnormalverteilt zwischen 0 und 1.
- Annahme: Die Fähigkeiten sind in der Bevölkerung normalverteilt
naehe
= Entfernung zur Uni.
- Diese Variable ist gleichverteilt.
- Kann als “Dummy-Variable” interpretiert werden und ist 1 für Personen, welche Nahe an einer Uni wohnen und 0 für diejenigen die weiter weg wohnen
error_eink
= Fehlerterm der Ergebnisvariablen
- Schließlich ist unsere Schätzung immer etwas ungenau im realen Leben
bildung
= Bildung.
- Im Durchschnitt haben alle Personen bei uns eine Bildung von 13 Jahren
- Weiterhin ist die Bildung abhängig von der Distanz zur Uni und den eigenen Fähigkeiten
eink
= wöchentliches Einkommen
- Das Basiseinkommen ist 100€ und es gibt eine Komponente für die Bildung und die Fähigkeiten (+ den oben angesprochenen Fehlerterm)
- Je mehr Bildung eine Person hat, desto mehr Einkommen hat Sie ( für jedes Jahr mehr Bildung gibt es 40€ mehr Wocheneinkommen )
- Je größer die Fähigkeiten einer Person sind, desto mehr Einkommen bekommt diese ( für jede Einheit an Fähigkeiten mehr gibt es 70€ mehr Wocheneinkommen )
Der Vorteil dieser Simultionsstudie gegenüber empirischen Datensätzen: Wir kennen den Effekt der Bildung auf das Einkommen! In unserer Simulationsstudie liegt er bei 40€!
Diese Kenntnis können wir nutzen um die Verzerrung des Koeffizienten \(\beta_1\) näher zu betrachten. Wie verändert sich der Koeffizient \(\beta_1\) ohne und mit der Kontrolle auf die Hintergrundvariable “Fähigkeiten”:
ols_bias <- lm(eink ~ bildung, data = distance)
ols_correct <- lm(eink ~ bildung + faehigkeiten, data = distance)
stargazer(ols_bias, ols_correct,
type = "html",
header=FALSE,
column.labels = c("OLS Bias", "OLS Kontrolle"),
dep.var.labels = "Wocheneinkommen")
|
|
Dependent variable:
|
|
|
|
Wocheneinkommen
|
|
OLS Bias
|
OLS Kontrolle
|
|
(1)
|
(2)
|
|
bildung
|
74.720***
|
39.646***
|
|
(0.222)
|
(3.881)
|
|
|
|
faehigkeiten
|
|
70.371***
|
|
|
(7.774)
|
|
|
|
Constant
|
-358.240***
|
104.744**
|
|
(2.969)
|
(51.232)
|
|
|
|
|
Observations
|
50,000
|
50,000
|
R2
|
0.693
|
0.694
|
Adjusted R2
|
0.693
|
0.694
|
Residual Std. Error
|
100.233 (df = 49998)
|
100.152 (df = 49997)
|
F Statistic
|
113,013.700*** (df = 1; 49998)
|
56,639.320*** (df = 2; 49997)
|
|
Note:
|
p<0.1; p<0.05; p<0.01
|
Wie von uns erwartet überschätzen wir den Effekt der Bildung auf das Einkommen massiv, wenn wir nicht auf die Fähigkeiten kontrollieren. In der naiven Schätzung in der ersten Spalte würden wir davon ausgehen, dass ein Jahr mehr Bildung mit 74.72€ mehr Einkommen pro Woche assoziiert ist. Wobei der wahre Effekt bei 40€ pro Woche liegt. Die korrekte Effektgröße erhalten wir in unserer zweiten Schätzung, wenn wir auf die Fähigkeiten kontrollieren! Hierbei liegt der wahre Wert (wie wir diesen simuliert haben) im 95% Konfidenzintervall des Schätzers von bildung
(Konfidenzintervall [32.04, 47.25]). Man beachte das sowohl der Koeffizient \(\beta_1\) von bildung
der naiven Schätzung aus der ersten Spalte, wie auch der zweiten Spalte hoch signifikant sind. Insbesondere der Standardfehler in der ersten Regression ist deutlich kleiner als in der zweiten Regression (0.222 vs. 3.881), obwohl nur die zweite Regression ein korrektes Ergebnis liefert. Der Koeffizient der ersten Schätzung ist stark nach oben verzerrt, d.h. auch wenn ein Koeffizient statistisch signifikant ist, so heißt dies nicht automatisch, dass dieser auch korrekt ist. Dafür muss erst das Modell richtig spezifiziert sein!
Instrumentalvariablen
Da wir in einem realen Datensatz die Fähigkeiten nicht beobachten können bleibt uns dieser direkte Weg mit der Kontrolle auf die Fähigkeiten leider verschlossen. Allerdings sollten wir nicht verzagen. Hier hilft uns die so genannte Instrumentalvariablenschätzung weiter. Bei der Instrumentalvariablenschätzung nutzen wir die Variation einer exogenen Variablen, welche unsere endogene Variable beeinflusst. Konkret nutzen wir in unserem Fall den Teil der Bildung, welcher durch die exogene Variable Nähe erklärt werden kann, um mittels dieses exogenen Teils der Bildung dessen kausalen Effekt auf das Einkommen zu bestimmen. Doch was genau bedeutet dies?
Wir wollen uns das Prinzip der Instrumentalvariablenschätzung anhand eines DAG anschauen:
Hintergrund: X
sollte exogen sein um kausal interpretiert werden zu können
Ziel der Instrumentalvariable: Exogene Variation von X
finden, welche dann kausal interpretiert werden kann
Wir können uns dies vorstellen als Gegenteil davon auf eine Variable zu kontrollieren:
- Wir erklären
X
und Y
mit der Variablen Z
, aber anstatt uns auf den Teil zu konzentrieren, welcher nicht durch Z
erklärt werden kann, nehmen wir nur den Anteil der durch Z
erklärt wird!
- Anstatt zu sagen “du bist auf einer backdoor, ich schließe dich” sagen wir “du hast keine backdoor! Ich will, dass mein
X
genau so sein soll wie du! Ich nehme nur den Part von X
, welcher von dir erklärt wird!”
- Dadurch nutzen wir nur noch die exogene Variation in
X
, welche durch Z
erklärt wird
Folge: Wir nutzen nicht mehr die komplette Information unseres Datensatzes, sondern nur noch einen Teil, d.h. wir benötigen mehr Beobachtungen um Effekte messen zu können. Diese ungenauere Schätzung des Effekts drückt sich in der Regression als größerer Standardfehler des Schätzers aus!
Was sind gute Instrumentalvariablen?
Um abschätzen zu können, ob wir eine Variable als Instrumentalvariable nutzen können müssen wir drei Eigenschaften prüfen:
Relevanz:
- Die Instrumentalvariable muss mit der/den endogenen Variable/n korreliert sein.
Ausschließlichkeit:
- Die Instrumentalvariable beeinflusst die exogene Variable nicht direkt, sondern ausschließlich über die endogene Variable
Exogenität:
- Die Instrumentalvariable ist nicht mit den ausgelassenen Variablen (omitted variables) korreliert
Relevanz
Wir können die Relevanz unserer Instrumentalvariablen testen. Dies machen wir für unseren simulierten Datensatz, indem wir die Variable Bildung ( bildung
) auf die Instrumentalvariable ( naehe
) regressieren. Die Instrumentalvariable sollte einen Einfluss auf die Bildung haben und Personen die näher an der Universität wohnen sollten mehr Bildung in Anspruch nehmen. Sollte dies nicht der Fall sein, so wäre unsere Instrumentalvariable nicht relevant und wir sollten uns eine andere Instrumentalvariable suchen.
first_stage_basic <- lm(bildung ~ naehe, data = distance)
summary(first_stage_basic)
##
## Call:
## lm(formula = bildung ~ naehe, data = distance)
##
## Residuals:
## Min 1Q Median 3Q Max
## -9.0409 -1.3573 -0.0147 1.3581 9.4839
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 13.01219 0.01803 721.5 <2e-16 ***
## naehe 0.38714 0.03121 12.4 <2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 2.014 on 49998 degrees of freedom
## Multiple R-squared: 0.003068, Adjusted R-squared: 0.003048
## F-statistic: 153.8 on 1 and 49998 DF, p-value: < 2.2e-16
In unserem Fall ist die Instrumentalvariable naehe
hoch signifikant. Die F-Statistik, welche angibt ob die getesteten Variablen zusammen einen Effekt auf die Bildung haben liegt bei 153.8. Als Faustregel können wir uns hier merken, dass diese F-Statistik größer als 10 sein sollte (allerdings ist dies nur eine Faustregel und sollte nicht das Maß aller Dinge sein). Falls die F-Statistik kleiner ist als 10, so wird in der Literatur oft von einem schwachen Instrument gesprochen. Solche schwachen Instrumentalvariablen führen zu einer Verzerrung unseres Schätzers in der Instrumentalvariablenregression. Durch die Verwendung von schwachen Instrumenten erhalten wir wieder einen Bias in unserer Regression, welcher in Richtung des OLS Bias geht. Je stärker unser Instrument ist, desto weniger groß ist der Bias in der Instrumentalvariablenregression. Weiterhin sind Instrumentalvariablenregressionen weniger effizient als OLS Regressionen, da wir einen kleineren Teil der Variation in den Daten für unsere Schätzung nutzen (nur den Part, welcher durch das Instrument erklärt werden kann), dies resultiert in einem größeren Standardfehler des Schätzers, verglichen mit der OLS Regression. D.h. durch schwache Instrumentalvariablen erhalten wir einen Bias in unserer Regression, welcher in Richtung OLS-Bias geht + erhalten größere Konfidenzintervalle durch die Instrumentalvariablenschätzung … wenn wir so wollen nehmen wir die negativen Aspekte beider Welten durch schwache Instrumente mit, weshalb wir diese nach Möglichkeit vermeiden sollten.
In der späteren Analyse der Instrumentalvariablenregression haben wir zusätzlich die Verwendung eines schwachen Instruments simuliert um die gerade beschriebenen Effekte zu zeigen.
Ausschließlichkeit
Leider könne wir die Ausschließlichkeit von naehe
nicht prüfen, sondern müssen diese ökonomisch begründen. Wir sollten erläutern, warum die Entfernung zur Universität das Einkommen ausschließlich über die Bildung und nicht über einen anderen Weg beeinflussen kann. Sobald wir einen Zusammenhang zwischen der Nähe zur Universität und dem Einkommen hätten, wäre unser Instrument auch endogen und wir könnten es nicht verwenden (bzw. nur bedingt). In unserer Simulationsstudie ist dies kein Problem da wir die Variable naehe
so simuliert haben, dass diese das Einkommen ausschließlich über die Bildung beeinflusst.
Exogenität
Exogenität bedeutet, dass die Instrumentalvariable nicht mit der (unbeobachtbaren) ausgelassenen Variable korreliert ist. Es gibt auch für die Exogenität keinen statistischen Test der uns sagt, ob unsere Instrumentalvariable(n) exogen sind, da wir keine Möglichkeit haben für andere ausgelassenen Variablen zu kontrollieren (dies war ja gerade der Grund, warum wir die Instrumentalvariable verwenden!). Wenn wir Informationen zu den ausgelassenen Variablen hätten, dann könnten wir auf diese kontrollieren und bräuchten die Instrumentalvariable gar nicht (siehe DAG oben).
Der Vorteil in unserer Simulationsstudie: Wir haben die (eigentlich unbeobachtbare) Variable “Fähigkeiten” und können nun tatsächlich schauen, wie hoch die Korrelation zwischen der Instrumentalvariable naehe
und der faehigkeiten
ist. Eine Möglichkeit die uns in der Realität leider verwehrt bleibt:
round(cor(distance$naehe, distance$faehigkeiten),2)
## [1] 0
In unserer Simulation ist die Exogenitätsannahme erfüllt (schließlich haben wir die Variablen entsprechend simuliert). In der Realität könnte es Verbindungen zwischen der Nähe des Wohnorts zu einer Uni und den Fähigkeiten einer Person geben. Fallen ihnen hierzu Beispiele ein?
Two-stage least squares
Two-stage least squares (2SLS) per Hand
Ok, wir wollen also mittels der Instrumentalvariablen naehe
unsere eigentliche Variable bildung
beschreiben und dadurch den exogenen Teil von bildung
herausfinden. Mit diesem exogenen Teil von bildung
, welcher nun nicht mehr von faehigkeiten
abhängt, können wir dann den kausalen Effekt der Bildung auf das Einkommen bestimmen. D.h. die Bildung, die nicht durch die Fähigkeiten bestimmt wird. Hört sich nach einem einfachen Prozess mit mehreren Schritten an, den wir hier durchführen können!
Genau das wollen wir nun tun:
- Wir regressieren die Bildung (
bildung
) auf die Instrumentalvariable ( naehe
). Dies nennen wir first_stage und sollte uns bekannt vorkommen, schließlich haben wir das bereits gemacht um die Relevanz des Instruments zu bestimmen:
first_stage <- lm(bildung ~ naehe, data = distance)
- Als nächstes extrahieren wir die Variation von
bildung
, welche von naehe
erklärt werden kann. Dafür nutzen wir die Ergebnisse aus unserer first_stage Regression und schauen uns an, welche Werte wir für bildung
vorhergesagt hätten, gegeben der jeweiligen naehe
zur Uni. Konkret nutzen wir die gefitteten Werte unserer first_stage Regression ( .fitted
) und fügen diese unserem Datensatz hinzu (eine einfache Methode bietet die Funktion augment_columns()
aus dem Paket broom
).
distance <- augment_columns(first_stage, distance) %>%
select(eink, bildung, faehigkeiten, naehe, error_eink, `.fitted`)
head(distance)
## # A tibble: 6 x 6
## eink bildung faehigkeiten naehe error_eink .fitted
## <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 526. 12.9 -0.122 0.303 80.1 13.1
## 2 719. 14.3 0.552 0.563 -6.73 13.2
## 3 626. 13.8 0.349 0.242 50.4 13.1
## 4 443. 13.9 0.360 0.408 238. 13.2
## 5 806. 14.9 0.898 0.169 -48.4 13.1
## 6 300. 9.20 -1.92 0.118 33.6 13.1
Uns interessieren insbesondere die gefitteten Werte ( .fitted
), da dies die Variation in bildung
widerspiegelt, die exogen ist und damit ohne den Einfluss der Fähigkeiten.
- Nun können wir die Spalte
.fitted
nutzen um den kausalen Effekt der Bildung auf das Einkommen zu schätzen (in einer zweiten Regression):
second_stage <- lm(eink ~ `.fitted`, data = distance)
summary(second_stage)
##
## Call:
## lm(formula = eink ~ .fitted, data = distance)
##
## Residuals:
## Min 1Q Median 3Q Max
## -756.98 -122.03 -0.35 121.66 798.90
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 120.376 95.670 1.258 0.208
## .fitted 38.477 7.244 5.312 1.09e-07 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 180.9 on 49998 degrees of freedom
## Multiple R-squared: 0.0005639, Adjusted R-squared: 0.000544
## F-statistic: 28.21 on 1 and 49998 DF, p-value: 1.092e-07
Die Ergebnisse dieser Regression sollten nun den tatsächlichen Effekt der Bildung auf das Einkommen widerspiegeln, da wir durch unsere Instrumentalvariable den endogenen Part der Bildung (beeinflusst von den Fähigkeiten) entfernt haben. Und tatsächlich der Effekt der Bildung auf das Einkommen entspricht 38,77€ für ein Jahr mehr Bildung (simuliert hatten wir 40€)!
Two-stage least squares (2SLS) in R
Die händische Berechnung der einzelnen Regressionen ist hilfreich um sich klar zu werden, was genau die so genannte “Two-stage least squares” macht um eine Instrumentalvariablenregression durchzuführen:
Es gibt zwei “stages”, d.h. zwei Regressionen, die nacheinander durchgeführt werden.
In der ersten “stage” erklären wir unsere endogene Variable durch das Instrument und in der zweiten “stage” nutzen wir die gefitteten/vorhergesagten Werte der ersten Regression um unsere eigentliche Fragestellung zu beantworten. Jedoch gibt es einige Nachteile, wenn wir eine solche 2SLS per Hand durchführen:
- Die Standardfehler sind nicht korrekt
- Das R² (und weitere Diagnostiken) der zweiten “stage” werden nicht korrekt geschätzt.
Dies liegt daran das wir nicht die gemessene bildung
in der zweiten “stage” verwenden, sondern die geschätzen Werte .fitted
aus der ersten “stage”. Daher müssen wir die Ergebnisse aus der zweiten “stage” anpassen. Dies wollen wir jedoch nicht auch von Hand machen, sondern nutzen hierzu das Paket AER
mit der Funktion ivreg()
, welche diese Anpassungen für uns vornimmt.
Dies wollen wir nun tun und die Ergebnisse unserer unterschiedlicher Regressionen gegenüberstellen.
ols_iv <- ivreg(eink ~ bildung | naehe , data = distance)
stargazer(ols_bias, ols_correct, second_stage, ols_iv,
type = "html",
header=FALSE,
column.labels = c("OLS Bias", "OLS Kontrolle", "2SLS per Hand", "2SLS starkes Instrument"),
dep.var.labels = "Wocheneinkommen")
|
|
Dependent variable:
|
|
|
|
Wocheneinkommen
|
|
OLS
|
instrumental
|
|
|
variable
|
|
OLS Bias
|
OLS Kontrolle
|
2SLS per Hand
|
2SLS starkes Instrument
|
|
(1)
|
(2)
|
(3)
|
(4)
|
|
bildung
|
74.720***
|
39.646***
|
|
38.477***
|
|
(0.222)
|
(3.881)
|
|
(4.967)
|
|
|
|
|
|
faehigkeiten
|
|
70.371***
|
|
|
|
|
(7.774)
|
|
|
|
|
|
|
|
.fitted
|
|
|
38.477***
|
|
|
|
|
(7.244)
|
|
|
|
|
|
|
Constant
|
-358.240***
|
104.744**
|
120.376
|
120.376*
|
|
(2.969)
|
(51.232)
|
(95.670)
|
(65.594)
|
|
|
|
|
|
|
Observations
|
50,000
|
50,000
|
50,000
|
50,000
|
R2
|
0.693
|
0.694
|
0.001
|
0.530
|
Adjusted R2
|
0.693
|
0.694
|
0.001
|
0.530
|
Residual Std. Error
|
100.233 (df = 49998)
|
100.152 (df = 49997)
|
180.935 (df = 49998)
|
124.054 (df = 49998)
|
F Statistic
|
113,013.700*** (df = 1; 49998)
|
56,639.320*** (df = 2; 49997)
|
28.212*** (df = 1; 49998)
|
|
|
Note:
|
p<0.1; p<0.05; p<0.01
|
In der ersten Spalte haben wir das naive Modell, welches den Effekt der Bildung auf das Einkommen überschätzt. In der zweiten Spalte sehen wir das Modell, wie wir es gerne schätzen möchten, mit der (in realen Datensätzen unbeobachtbaren) Variablen Fähigkeiten ( faehigkeiten
). In dieser zweiten Spalte erhalten wir den korrekten Koeffizienten für bildung
! In der dritten Spalte berechnen wir die 2SLS von Hand. Hier erhalten wir auch den korrekten Koeffizienten für bildung
(in diesem Modell .fitted
genannt), wie auch in der automatisch von R berechneten 2SLS in der 4. Spalte. Wir konnten mit der Instrumentalvariable die exogene Variation von bildung
erfolgreich extrahieren und erhalten den kausalen Effekt von einem Jahr mehr Bildung auf das Wocheneinkommen, welcher in unserer Regression bei 38,477€ liegt. Ziemlich gut geschätzt würde ich sagen, schließlich haben wir den wahren Effekt auf 40€ simuliert!
Im Vergleich der 3. und 4. Spalte sehen wir den vorhin erwähnten Unterschied in den Standardfehlern und dem R², welche durch das AER
Paket mit der Funktion ivreg()
automatisch korrigiert wird.
Schwache Instrumente
Nun erhalten wir mit unserem Instrument den kausalen Effekt der Bildung auf das Einkommen. Das ist toll! Doch unser Instrument war mit einer F-Statistik von 153.8 in der first-stage sehr relevant für die exogene Variation in bildung
. Angenommen wir haben nur ein schwaches Instrument zur Verfügung, können wir dennoch valide Ergebnisse schätzen, oder erhalten wir durch den Bias in der Instrumentalvariablenregression stark verzerrte Ergebnisse?
#Zuerst generieren wir uns ein schwaches Instrumnte (0.001 * distance)
distance <- distance %>%
mutate(bildung_weak = 13 + 0.001*naehe + 2*faehigkeiten, # Distance als schwaches Instrument für Bildung
eink_weak = 100 + 40*bildung_weak + 70*faehigkeiten - error_eink)
#Um anschließend die IV Regression mit diesem Instrument durchlaufen zu lassen
ols_iv_weak <- ivreg(eink_weak ~ bildung_weak | naehe , data = distance)
#Wir speichern den Weak-Instruments Test aus der first-stage ab und fügen diese Spalte unserer Regression in stargazer hinzu (für starkes und schwaches Instrument)
ols_iv_test <- summary(ols_iv, diagnostics = T)$diagnostics[1,3] #starkes Instrument
ols_iv_weak_test <- summary(ols_iv_weak, diagnostics = T)$diagnostics[1,3] #schwaches Instrument
stargazer(ols_bias, ols_correct, second_stage, ols_iv, ols_iv_weak,
type = "html",
header=FALSE,
column.labels = c("OLS Bias", "OLS Kontrolle", "2SLS per Hand", "2SLS starkes Instrument", "2SLS schwaches Instrument"),
dep.var.labels = "Wocheneinkommen",
add.lines = list(c("Weak Instruments Test", " ", " ", " ", round(ols_iv_test,2), round(ols_iv_weak_test,2) )))
|
|
Dependent variable:
|
|
|
|
Wocheneinkommen
|
eink_weak
|
|
OLS
|
instrumental
|
instrumental
|
|
|
variable
|
variable
|
|
OLS Bias
|
OLS Kontrolle
|
2SLS per Hand
|
2SLS starkes Instrument
|
2SLS schwaches Instrument
|
|
(1)
|
(2)
|
(3)
|
(4)
|
(5)
|
|
bildung
|
74.720***
|
39.646***
|
|
38.477***
|
|
|
(0.222)
|
(3.881)
|
|
(4.967)
|
|
|
|
|
|
|
|
faehigkeiten
|
|
70.371***
|
|
|
|
|
|
(7.774)
|
|
|
|
|
|
|
|
|
|
.fitted
|
|
|
38.477***
|
|
|
|
|
|
(7.244)
|
|
|
|
|
|
|
|
|
bildung_weak
|
|
|
|
|
89.720
|
|
|
|
|
|
(136.683)
|
|
|
|
|
|
|
Constant
|
-358.240***
|
104.744**
|
120.376
|
120.376*
|
-546.396
|
|
(2.969)
|
(51.232)
|
(95.670)
|
(65.594)
|
(1,777.740)
|
|
|
|
|
|
|
|
Weak Instruments Test
|
|
|
|
153.84
|
0.14
|
Observations
|
50,000
|
50,000
|
50,000
|
50,000
|
50,000
|
R2
|
0.693
|
0.694
|
0.001
|
0.530
|
0.666
|
Adjusted R2
|
0.693
|
0.694
|
0.001
|
0.530
|
0.666
|
Residual Std. Error
|
100.233 (df = 49998)
|
100.152 (df = 49997)
|
180.935 (df = 49998)
|
124.054 (df = 49998)
|
104.542 (df = 49998)
|
F Statistic
|
113,013.700*** (df = 1; 49998)
|
56,639.320*** (df = 2; 49997)
|
28.212*** (df = 1; 49998)
|
|
|
|
Note:
|
p<0.1; p<0.05; p<0.01
|
Wir sehen was wir bereits weiter oben im Text erwähnt hatten:
- Der Bias des IV Schätzers ist deutlich sichtbar und sehr groß. D.h. durch ein schwaches Instrument driften wir sehr weit weg vom eigentlichen kausalen Effekt
- Die Standardfehler in der IV Regression mit einem schwachen Instrument sind sehr groß
LS0tCnRpdGxlOiAiU2ltdWxhdGlvbnNzdHVkaWUgenVyIEluc3RydW1lbnRhbHZhcmlhYmxlbnNjaMOkdHp1bmciCm91dHB1dDogCiAgaHRtbF9kb2N1bWVudDoKICAgIHRoZW1lOiBjb3NtbwogICAgY29kZV9kb3dubG9hZDogdHJ1ZQogICAgY29kZV9mb2xkaW5nOiBoaWRlCiAgICB0b2M6IHRydWUKICAgIHRvY19mbG9hdDogdHJ1ZQotLS0KCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQpsaWJyYXJ5KHRpZHl2ZXJzZSkKbGlicmFyeShicm9vbSkKbGlicmFyeShnZ2RhZykKbGlicmFyeShrYWJsZUV4dHJhKQpsaWJyYXJ5KHNjYWxlcykKbGlicmFyeShtb2RlbHN1bW1hcnkpCmxpYnJhcnkoc3RhcmdhemVyKQpsaWJyYXJ5KEFFUikKa25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBUUlVFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nID0gRkFMU0UpCmBgYAoKIyBNb3RpdmF0aW9uCgpJbiBkaWVzZW0gQmVpc3BpZWwgbcO2Y2h0ZW4gd2lyIHVucyBkaWUgRnVua3Rpb25zd2Vpc2Ugdm9uIEluc3RydW1lbnRhbHZhcmlhYmxlbiBnZW5hdWVyIGFuc2NoYXVlbi4gWnUgQmVnaW5uIHdlcmRlbiB3aXIgbm9jaCBlaW5tYWwga3VyeiBJbnN0cnVtZW50YWx2YXJpYWJsZW4gaW4gZGVyIFRoZW9yaWUgYmVsZXVjaHRlbiB1bmQgZGllc2UgbWl0IGVpbmVtIERBRyBkYXJzdGVsbGVuLiBBbnNjaGxpZcOfZW5kIG3DtmNodGVuIHdpciB1bnMgZWluZW4gRGF0ZW5zYXR6IHNpbXVsaWVyZW4sIGJlaSBkZW0gd2lyIGRlciBGcmFnZSBuYWNoZ2VoZW4sIG9iIEJpbGR1bmcgZGFzIEVpbmtvbW1lbiBfa2F1c2FsXyBiZWVpbmZsdXNzdC4gRGFiZWkgc2ltdWxpZXJlbiB3aXIgZGllIEJpbGR1bmcgc28sIGRhc3MgZGllc2Ugdm9uIGRlciBOw6RoZSB6dXIgbsOkY2hzdGVuIFVuaXZlcnNpdMOkdCwgYWxzIGF1Y2ggZGVuIGVpZ2VuZW4gRsOkaGlna2VpdGVuIGFiaMOkbmd0LiAKCiMgVGhlb3JpZQoKRm9sZ2VuZGUgRnJhZ2VzdGVsbHVuZywgd2VsY2hlIHdpciBpbiBkaWVzZW0gU2VtZXN0ZXIgYmVyZWl0cyBtZWhyZmFjaCBiZWxldWNodGV0IGhhYmVuLCB3b2xsZW4gd2lyIGhpZXIgbm9jaCBlaW5tYWwgYXVmZ3JlaWZlbjogCgpHaWJ0IGVzIGVpbmVuIF9rYXVzYWxlbl8gWnVzYW1tZW5oYW5nIHp3aXNjaGVuIEJpbGR1bmcgdW5kIChzcMOkdGVyZW0pIEVpbmtvbW1lbj8gCgpCZWkgZGllc2VyIEZyYWdlIHN0ZWhlbiB3aXIgdm9yIGVpbmVtIFByb2JsZW0sIGRhIGRpZSBCaWxkdW5nIHZvbiBtZWhyZXJlbiBGYWt0b3JlbiBhYmjDpG5ndCwgZGllIGF1Y2ggZGFzIEVpbmtvbW1lbiBiZWVpbmZsdXNzZW4uIEVpbmlnZSBkaWVzZXIgRmFrdG9yZW4gaGF0dGVuIFNpZSBiZXJlaXRzIGluIGRlciBWZXJhbnN0YWx0dW5nIGtlbm5lbiBnZWxlcm50ICh1bmQgYXVjaCBzZWxic3QgZ2VuYW5udCk6IEZhbWlsaWVuZWlua29tbWVuLCBCaWxkdW5nIGRlciBFbHRlcm4sIGVpZ2VuZSBGw6RoaWdrZWl0ZW4sIE5ldHp3ZXJrIC4uLgoKVW0gdW5zIGRpZSBXaXJrdW5nc3dlaXNlIGRlciBJbnN0cnVtZW50YWx2YXJpYWJsZW5yZWdyZXNzaW9uIG7DpGhlciBhbnp1c2NoYXVlbiB3b2xsZW4gd2lyIGVpbmUgdmVyZWluZmFjaHRlIFNpbXVsYXRpb25zc3R1ZGllIGR1cmNoZsO8aHJlbi4gSW4gZGllc2VyIFNpbXVsYXRpb24ga29uemVudHJpZXJlbiB3aXIgdW5zIGF1ZiBkZW4gWnVzYW1tZW5oYW5nIHp3aXNjaGVuIGRlciBCaWxkdW5nIHVuZCBkZW0gRWlua29tbWVuLCBzb3dpZSBlaW5lciAodW5iZW9iYWNodGJhcmVuKSBIaW50ZXJncnVuZHZhcmlhYmxlbiwgbmVubmVuIHdpciBzaWUgIkbDpGhpZ2tlaXRlbiIsIHdlbGNoZSB3aXIgaW4gdW5zZXJlbSBzaW11bGllcnRlbiBEYXRlbnNhdHogYmVvYmFjaHRlbiBrw7ZubmVuLiBEdXJjaCB1bnNlcmUgU2ltdWxhdGlvbiBrw7ZubmVuIHdpciBlcmdyw7xuZGVuIG9iIHdpciBkZW4gKHNpbXVsaWVydGVuKSBrYXVzYWxlbiBFZmZla3QgZGVyIEJpbGR1bmcgYXVmIGRhcyBFaW5rb21tZW4gbWl0IHVudGVyc2NoaWVkbGljaGVuIFJlZ3Jlc3Npb25zc3BlemlmaWthdGlvbmVuIGVyaGFsdGVuIGvDtm5uZW4uCgpXaXIgc2VoZW4gZGVuIFp1c2FtbWVuaGFuZyB6d2lzY2hlbiBkZXIgQmlsZHVuZyB1bmQgZGVuICh1bmJlb2JhY2h0YmFyZW4pIEbDpGhpZ2tlaXRlbiwgc293aWUgendpc2NoZW4gRWlua29tbWVuIHVuZCAodW5iZW9iYWNodGJhcmVuKSBGw6RoaWdrZWl0ZW4gaW4gZm9sZ2VuZGVtIERBRzoKCiQkXGNvbG9yeyMwMDc0RDl9e1x0ZXh0e0VpbmtvbW1lbn1faX0gPSBcYmV0YV8wICsgXGJldGFfMSBcY29sb3J7ZGFya29yYW5nZX17XHRleHR7QmlsZHVuZ31faX0gKyBcYmV0YV8yIFxjb2xvcntyZWR9e1x0ZXh0e0bDpGhpZ2tlaXRlbn1faX0gKyBcdmFyZXBzaWxvbl9pJCQKCmBgYHtyIGRhZ19lbmRvZ2VuX2l2MiwgZWNobz1GQUxTRSwgZmlnLndpZHRoPTcsIGZpZy5oZWlnaHQ9Mywgb3V0LndpZHRoPSIxMDAlIn0KZGFnaWZ5KAogIEVpbmsgfiBCICsgSCwKICBCIH4gSCwKICBjb29yZHMgPSBsaXN0KHggPSBjKEIgPSAxLCBFaW5rID0gMywgSCA9IDIpLAogICAgICAgICAgICAgICAgeSA9IGMoQiA9IDEsIEVpbmsgPSAxLCBIID0gMikpLAogIGV4cG9zdXJlID0gIkIiLAogIG91dGNvbWUgPSAiRWluayIsCiAgbGF0ZW50ID0gIkgiLAogIGxhYmVscyA9IGMoIkIiID0gIkJpbGR1bmciLCAiRWluayIgPSAiRWlua29tbWVuIiwKICAgICAgICAgICAgICJIIiA9ICJGw6RoaWdrZWl0ZW4iKQopICU+JSAKICB0aWR5X2RhZ2l0dHkoKSAlPiUgCiAgbm9kZV9zdGF0dXMoKSAlPiUgCiAgZ2dwbG90KGFlcyh4ID0geCwgeSA9IHksIHhlbmQgPSB4ZW5kLCB5ZW5kID0geWVuZCkpICsKICBnZW9tX2RhZ19lZGdlcyhhZXMoZWRnZV9saW5ldHlwZSA9IGlmZWxzZSggeCA9PSB4WzJdICYgeSA9PSB5WzJdLCAiZGFzaGVkIiwgInNvbGlkIikpLCBzaG93LmxlZ2VuZCA9IEZBTFNFKSArCiAgZ2VvbV9kYWdfcG9pbnQoYWVzKGNvbG9yID0gc3RhdHVzKSwgc2l6ZSA9IDE1KSArCiAgZ2VvbV9kYWdfdGV4dChjb2xvciA9ICJ3aGl0ZSIsIHNpemUgPSA1KSArCiAgZ2VvbV9kYWdfbGFiZWxfcmVwZWwoYWVzKGxhYmVsID0gbGFiZWwpLCBudWRnZV95ID0gYygwLjI1LCAtMC4yNSwgMC4yNSkpICsKICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gYygiZGFya29yYW5nZSIsICJyZWQiLCAiIzAwNzREOSIpKSArCiAgZ3VpZGVzKGNvbG9yID0gRkFMU0UpICsKICB0aGVtZV9kYWcoKQpgYGAKCkRpZSAodW5iZW9iYWNodGJhcmVuKSBGw6RoaWdrZWl0ZW4gc2luZCBlaW5lIF9Db25mb3VuZGVyXywgYXVmIHdlbGNoZW4gd2lyIGtvbnRyb2xsaWVyZW4gbcO8c3N0ZW4uIEtvbnRyb2xsaWVyZW4gd2lyIG5pY2h0IGF1ZiBkaWUgKHVuYmVvYmFjaHRiYXJlbikgRsOkaGlna2VpdGVuLCBzbyB3w7xyZGVuIHdpciBkaWUgX2JhY2tkb29yXyBpbSBEQUcgbmljaHQgc2NobGllw59lbiB1bmQgZGVyIEVpbmZsdXNzIGRlciAqKkbDpGhpZ2tlaXRlbiB3YW5kZXJ0IGluIGRlbiBGZWhsZXJ0ZXJtKio6CgpEZXIgRmVobGVydGVybSBiZXN0ZWh0IGRhbm4gYXVzOgoKJFxjb2xvcntyZWR9e1xldGFfaX0gPSBcYmV0YV8yIFxjb2xvcntyZWR9e1x0ZXh0e0bDpGhpZ2tlaXRlbn1faX0gKyBcdmFyZXBzaWxvbl9pJCAKCnVuZCBkYW1pdCBpc3QgZGllIEJpbGR1bmcgbWl0IGRlbSBGZWhsZXJ0ZXJtICRcY29sb3J7cmVkfXtcZXRhX2l9JCBrb3JyZWxpZXJ0OgoKJCRcY29sb3J7IzAwNzREOX17XHRleHR7RWlua29tbWVufV9pfSA9IFxiZXRhXzAgKyBcYmV0YV8xIFxjb2xvcntkYXJrb3JhbmdlfXtcdGV4dHtCaWxkdW5nfV9pfSArIFxjb2xvcntyZWR9e1xldGFfaX0kJApGb2xnbGljaCB3w6RyZSBkaWUgQmlsZHVuZ3NlbnRzY2hlaWR1bmcgaW4gdW5zZXJlciBTY2jDpHR6dW5nIGVuZG9nZW4gdW5kIHdpciB3w7xyZGVuIGR1cmNoIGVpbmUgIm5haXZlIiBTY2jDpHR6dW5nIGRlcyBFaW5rb21tZW5zIGF1ZiBkaWUgQmlsZHVuZyAob2huZSBhdWYgZGllIEbDpGhpZ2tlaXRlbiB6dSBrb250cm9sbGllcmVuKSBlaW5lbiB2ZXJ6ZXJydGVuIEVmZmVrdCBkZXIgQmlsZHVuZyBhdWYgZGFzIEVpbmtvbW1lbiBlcmhhbHRlbi4gRGEgZGllIEbDpGhpZ2tlaXRlbiBlaW5lciBQZXJzb24gc293b2hsIHNlaW5lIEJpbGR1bmdzZW50c2NoZWlkdW5nIGFscyBhdWNoIHNlaW4gc3DDpHRlcmVzIEVpbmtvbW1lbiBwb3NpdGl2IGJlZWluZmx1c3Nlbiwgd8OkcmUgZGVyIEtvZWZmaXppZW50ICRcYmV0YV8xJCBpbiBkZXIgbmFpdmVuIFNjaMOkdHp1bmcgc3lzdGVtYXRpc2NoIG5hY2ggb2JlbiB2ZXJ6ZXJydC4gRC5oLiBkZXIgS29lZmZpemllbnQgJFxiZXRhXzEkLCB3ZWxjaGVuIHdpciBpbiBkZXIgbmFpdmVuIFNjaMOkdHp1bmcgaGVyYXVzIGJla29tbWVuIHfDvHJkZW4sIHfDpHJlIGdyw7bDn2VyIGFscyBkZXIgd2FocmUgV2VydC4KCiMgRGF0ZW4gc2ltdWxpZXJlbgoKVW0gZGFzIFByaW56aXAgZGVyIEluc3RydW1lbnRhbHZhcmlhYmxlbnNjaMOkdHp1bmcgenUgdmVyYW5zY2hhdWxpY2hlbiB3b2xsZW4gd2lyIGVpbmUga2xlaW5lIFNpbXVsYXRpb25zc3R1ZGllIGJldHJhY2h0ZW4sIGJlaSBkZXIgd2lyIGRlbiAid2FocmVuIiBXZXJ0IGRlciBWYXJpYWJsZSBrZW5uZW4gdW5kIHdpc3Nlbiwgb2IgZWluIFNjaMOkdHplciBpbiBkZXIgUmVncmVzc2lvbiB2ZXJ6ZXJydCBpc3QsIG9kZXIgZGVuIGtvcnJla3RlbiBXZXJ0IHdpZWRlcmdpYnQuCgpEdXJjaCBTaW11bGF0aW9uc3N0dWRpZW4ga8O2bm5lbiB3aXIgUHJvYmxlbWUgb2RlciBVbmtsYXJoZWl0ZW4gdW50ZXJzdWNoZW4gdW5kIGJla29tbWVuIGRhZHVyY2ggZWluZSBJbnR1aXRpb24gdm9tIERhdGVuZ2VuZXJpZXJ1bmdzcHJvemVzcyBpY2ggZWNodGVuIGVtcGlyaXNjaGVuIERhdGVuc8OkdHplbi4KCmBgYHtyIHBhY2thZ2VzLWRhdGEsIGluY2x1ZGU9RkFMU0V9CnNldC5zZWVkKDIwMjEpCm5yb3dzIDwtIDUwMDAwCmRpc3RhbmNlIDwtIHRpYmJsZSgKICBmYWVoaWdrZWl0ZW4gPSBybm9ybShucm93cywgMCwgMSksICAjIEbDpGhpZ2tlaXQKICBuYWVoZSA9IHJ1bmlmKG5yb3dzLCAwLCAxKSwgICMgRW50ZmVybnVuZyB6dXIgVW5pIChJbnN0cnVtZW50YWx2YXJpYWJsZSkKICBlcnJvcl9laW5rID0gcm5vcm0obnJvd3MsIDAsIDEwMCkgICMgRmVobGVydGVybQopICU+JSAKICBtdXRhdGUoYmlsZHVuZyA9IDEzICsgMC40Km5hZWhlICsgMipmYWVoaWdrZWl0ZW4sICAjIEJpbGR1bmcgKEVya2zDpHJlbmRlIFZhcmlhYmxlKQogICAgICAgICBlaW5rID0gMTAwICsgNDAqYmlsZHVuZyArIDcwKmZhZWhpZ2tlaXRlbiAtIGVycm9yX2VpbmspICMgRWlua29tbWVuIChFcmdlYm5pc3ZhcmlhYmxlKQpgYGAKCldpciBzaW11bGllcmVuIHVucyBlaW5lbiBEYXRlbnNhdHogYXVzIDUwMDAwIFBlcnNvbmVuLCBkaWUgd2lyIHVudGVyc3VjaGVuIG3DtmNodGVuIChkaWVzIGRlZmluaWVyZW4gd2lyIGluIGRlciB6d2VpdGVuIFplaWxlKS4KRGFuYWNoIGdlbmVyaWVyZW4gd2lyIHVucyBlaW5lbiBEYXRlbnNhdHogZGVyIGZvbGdlbmRlIFZhcmlhYmxlbiBlbnRow6RsdDoKCi0gYGZhZWhpZ2tlaXRlbmAgPSBGw6RoaWdrZWl0ZW4uIAogICAgLSBEaWVzZSBWYXJpYWJsZSBpc3Qgc3RhbmRhcmRub3JtYWx2ZXJ0ZWlsdCB6d2lzY2hlbiAwIHVuZCAxLiAKICAgIC0gQW5uYWhtZTogRGllIEbDpGhpZ2tlaXRlbiBzaW5kIGluIGRlciBCZXbDtmxrZXJ1bmcgbm9ybWFsdmVydGVpbHQKLSBgbmFlaGVgID0gRW50ZmVybnVuZyB6dXIgVW5pLiAKICAgIC0gRGllc2UgVmFyaWFibGUgaXN0IGdsZWljaHZlcnRlaWx0LiAKICAgIC0gS2FubiBhbHMgIkR1bW15LVZhcmlhYmxlIiBpbnRlcnByZXRpZXJ0IHdlcmRlbiB1bmQgaXN0IDEgZsO8ciBQZXJzb25lbiwgd2VsY2hlIE5haGUgYW4gZWluZXIgVW5pIHdvaG5lbiB1bmQgMCBmw7xyIGRpZWplbmlnZW4gZGllIHdlaXRlciB3ZWcgd29obmVuCi0gYGVycm9yX2VpbmtgID0gRmVobGVydGVybSBkZXIgRXJnZWJuaXN2YXJpYWJsZW4KICAgIC0gU2NobGllw59saWNoIGlzdCB1bnNlcmUgU2Now6R0enVuZyBpbW1lciBldHdhcyB1bmdlbmF1IGltIHJlYWxlbiBMZWJlbgotIGBiaWxkdW5nYCA9IEJpbGR1bmcuIAogICAgLSBJbSBEdXJjaHNjaG5pdHQgaGFiZW4gYWxsZSBQZXJzb25lbiBiZWkgdW5zIGVpbmUgQmlsZHVuZyB2b24gMTMgSmFocmVuCiAgICAtIFdlaXRlcmhpbiBpc3QgZGllIEJpbGR1bmcgYWJow6RuZ2lnIHZvbiBkZXIgRGlzdGFueiB6dXIgVW5pIHVuZCBkZW4gZWlnZW5lbiBGw6RoaWdrZWl0ZW4KLSBgZWlua2AgPSB3w7ZjaGVudGxpY2hlcyBFaW5rb21tZW4KICAgIC0gRGFzIEJhc2lzZWlua29tbWVuIGlzdCAxMDDigqwgdW5kIGVzIGdpYnQgZWluZSBLb21wb25lbnRlIGbDvHIgZGllIEJpbGR1bmcgdW5kIGRpZSBGw6RoaWdrZWl0ZW4gKCsgZGVuIG9iZW4gYW5nZXNwcm9jaGVuZW4gRmVobGVydGVybSkKICAgIC0gSmUgbWVociBCaWxkdW5nIGVpbmUgUGVyc29uIGhhdCwgZGVzdG8gbWVociBFaW5rb21tZW4gaGF0IFNpZSAoIGbDvHIgamVkZXMgSmFociBtZWhyIEJpbGR1bmcgZ2lidCBlcyA0MOKCrCBtZWhyIFdvY2hlbmVpbmtvbW1lbiApCiAgICAtIEplIGdyw7bDn2VyIGRpZSBGw6RoaWdrZWl0ZW4gZWluZXIgUGVyc29uIHNpbmQsIGRlc3RvIG1laHIgRWlua29tbWVuIGJla29tbXQgZGllc2UgKCBmw7xyIGplZGUgRWluaGVpdCBhbiBGw6RoaWdrZWl0ZW4gbWVociBnaWJ0IGVzIDcw4oKsIG1laHIgV29jaGVuZWlua29tbWVuICkKCkRlciBWb3J0ZWlsIGRpZXNlciBTaW11bHRpb25zc3R1ZGllIGdlZ2Vuw7xiZXIgZW1waXJpc2NoZW4gRGF0ZW5zw6R0emVuOiBXaXIga2VubmVuIGRlbiBFZmZla3QgZGVyIEJpbGR1bmcgYXVmIGRhcyBFaW5rb21tZW4hIEluIHVuc2VyZXIgU2ltdWxhdGlvbnNzdHVkaWUgbGllZ3QgZXIgYmVpIDQw4oKsIQoKRGllc2UgS2VubnRuaXMga8O2bm5lbiB3aXIgbnV0emVuIHVtIGRpZSBWZXJ6ZXJydW5nIGRlcyBLb2VmZml6aWVudGVuICRcYmV0YV8xJCBuw6RoZXIgenUgYmV0cmFjaHRlbi4gV2llIHZlcsOkbmRlcnQgc2ljaCBkZXIgS29lZmZpemllbnQgJFxiZXRhXzEkIG9obmUgdW5kIG1pdCBkZXIgS29udHJvbGxlIGF1ZiBkaWUgSGludGVyZ3J1bmR2YXJpYWJsZSAiRsOkaGlna2VpdGVuIjoKCmBgYHtyLCByZXN1bHRzID0gJ2FzaXMnfQpvbHNfYmlhcyA8LSBsbShlaW5rIH4gYmlsZHVuZywgZGF0YSA9IGRpc3RhbmNlKQpvbHNfY29ycmVjdCA8LSBsbShlaW5rIH4gYmlsZHVuZyArIGZhZWhpZ2tlaXRlbiwgZGF0YSA9IGRpc3RhbmNlKQoKc3RhcmdhemVyKG9sc19iaWFzLCBvbHNfY29ycmVjdCwgCiAgICAgICAgICB0eXBlID0gImh0bWwiLCAKICAgICAgICAgIGhlYWRlcj1GQUxTRSwgCiAgICAgICAgICBjb2x1bW4ubGFiZWxzID0gYygiT0xTIEJpYXMiLCAiT0xTIEtvbnRyb2xsZSIpLAogICAgICAgICAgZGVwLnZhci5sYWJlbHMgICA9ICJXb2NoZW5laW5rb21tZW4iKQpgYGAKCgpXaWUgdm9uIHVucyBlcndhcnRldCDDvGJlcnNjaMOkdHplbiB3aXIgZGVuIEVmZmVrdCBkZXIgQmlsZHVuZyBhdWYgZGFzIEVpbmtvbW1lbiBtYXNzaXYsIHdlbm4gd2lyIG5pY2h0IGF1ZiBkaWUgRsOkaGlna2VpdGVuIGtvbnRyb2xsaWVyZW4uIEluIGRlciBuYWl2ZW4gU2Now6R0enVuZyBpbiBkZXIgZXJzdGVuIFNwYWx0ZSB3w7xyZGVuIHdpciBkYXZvbiBhdXNnZWhlbiwgZGFzcyBlaW4gSmFociBtZWhyIEJpbGR1bmcgbWl0IDc0Ljcy4oKsIG1laHIgRWlua29tbWVuIHBybyBXb2NoZSBhc3NvemlpZXJ0IGlzdC4gV29iZWkgZGVyIHdhaHJlIEVmZmVrdCBiZWkgNDDigqwgcHJvIFdvY2hlIGxpZWd0LiBEaWUga29ycmVrdGUgRWZmZWt0Z3LDtsOfZSBlcmhhbHRlbiB3aXIgaW4gdW5zZXJlciB6d2VpdGVuIFNjaMOkdHp1bmcsIHdlbm4gd2lyIGF1ZiBkaWUgRsOkaGlna2VpdGVuIGtvbnRyb2xsaWVyZW4hCkhpZXJiZWkgbGllZ3QgZGVyIHdhaHJlIFdlcnQgKHdpZSB3aXIgZGllc2VuIHNpbXVsaWVydCBoYWJlbikgaW0gOTUlIEtvbmZpZGVuemludGVydmFsbCBkZXMgU2Now6R0emVycyB2b24gYGJpbGR1bmdgIChLb25maWRlbnppbnRlcnZhbGwgWzMyLjA0LCA0Ny4yNV0pLiAKTWFuIGJlYWNodGUgZGFzIHNvd29obCBkZXIgS29lZmZpemllbnQgJFxiZXRhXzEkIHZvbiBgYmlsZHVuZ2AgZGVyIG5haXZlbiBTY2jDpHR6dW5nIGF1cyBkZXIgZXJzdGVuIFNwYWx0ZSwgd2llIGF1Y2ggZGVyIHp3ZWl0ZW4gU3BhbHRlIGhvY2ggc2lnbmlmaWthbnQgc2luZC4gSW5zYmVzb25kZXJlIGRlciBTdGFuZGFyZGZlaGxlciBpbiBkZXIgZXJzdGVuIFJlZ3Jlc3Npb24gaXN0IGRldXRsaWNoIGtsZWluZXIgYWxzIGluIGRlciB6d2VpdGVuIFJlZ3Jlc3Npb24gKDAuMjIyIHZzLiAzLjg4MSksIG9id29obCBudXIgZGllIHp3ZWl0ZSBSZWdyZXNzaW9uIGVpbiBrb3JyZWt0ZXMgRXJnZWJuaXMgbGllZmVydC4gRGVyIEtvZWZmaXppZW50IGRlciBlcnN0ZW4gU2Now6R0enVuZyBpc3Qgc3RhcmsgbmFjaCBvYmVuIHZlcnplcnJ0LCBkLmguIGF1Y2ggd2VubiBlaW4gS29lZmZpemllbnQgc3RhdGlzdGlzY2ggc2lnbmlmaWthbnQgaXN0LCBzbyBoZWnDn3QgZGllcyBuaWNodCBhdXRvbWF0aXNjaCwgZGFzcyBkaWVzZXIgYXVjaCBrb3JyZWt0IGlzdC4gRGFmw7xyIG11c3MgZXJzdCBkYXMgTW9kZWxsIHJpY2h0aWcgc3BlemlmaXppZXJ0IHNlaW4hCgojIEluc3RydW1lbnRhbHZhcmlhYmxlbgoKRGEgd2lyIGluIGVpbmVtIHJlYWxlbiBEYXRlbnNhdHogZGllIEbDpGhpZ2tlaXRlbiBuaWNodCBiZW9iYWNodGVuIGvDtm5uZW4gYmxlaWJ0IHVucyBkaWVzZXIgZGlyZWt0ZSBXZWcgbWl0IGRlciBLb250cm9sbGUgYXVmIGRpZSBGw6RoaWdrZWl0ZW4gbGVpZGVyIHZlcnNjaGxvc3Nlbi4gQWxsZXJkaW5ncyBzb2xsdGVuIHdpciBuaWNodCB2ZXJ6YWdlbi4gSGllciBoaWxmdCB1bnMgZGllIHNvIGdlbmFubnRlIEluc3RydW1lbnRhbHZhcmlhYmxlbnNjaMOkdHp1bmcgd2VpdGVyLiBCZWkgZGVyIEluc3RydW1lbnRhbHZhcmlhYmxlbnNjaMOkdHp1bmcgbnV0emVuIHdpciBkaWUgVmFyaWF0aW9uIGVpbmVyIGV4b2dlbmVuIFZhcmlhYmxlbiwgd2VsY2hlIHVuc2VyZSBlbmRvZ2VuZSBWYXJpYWJsZSBiZWVpbmZsdXNzdC4gS29ua3JldCBudXR6ZW4gd2lyIGluIHVuc2VyZW0gRmFsbCBkZW4gVGVpbCBkZXIgX0JpbGR1bmdfLCB3ZWxjaGVyIGR1cmNoIGRpZSBleG9nZW5lIFZhcmlhYmxlIF9Ow6RoZV8gZXJrbMOkcnQgd2VyZGVuIGthbm4sIHVtIG1pdHRlbHMgZGllc2VzIGV4b2dlbmVuIFRlaWxzIGRlciBCaWxkdW5nIGRlc3NlbiBfa2F1c2FsZW5fIEVmZmVrdCBhdWYgZGFzIEVpbmtvbW1lbiB6dSBiZXN0aW1tZW4uIERvY2ggd2FzIGdlbmF1IGJlZGV1dGV0IGRpZXM/IAoKV2lyIHdvbGxlbiB1bnMgZGFzIFByaW56aXAgZGVyIEluc3RydW1lbnRhbHZhcmlhYmxlbnNjaMOkdHp1bmcgYW5oYW5kIGVpbmVzIERBRyBhbnNjaGF1ZW46CgpgYGB7ciBkYWdfaXZfZXhwbGFpbiwgZWNobz1GQUxTRSwgZmlnLndpZHRoPTcsIGZpZy5oZWlnaHQ9Mywgb3V0LndpZHRoPSIxMDAlIn0KZGFnaWZ5KAogIFkgfiBYICsgSCwKICBYIH4gSCwKICBYIH4gWiwKICBjb29yZHMgPSBsaXN0KHggPSBjKFggPSAxLCBZID0gMywgSCA9IDIsIFogPSAwKSwKICAgICAgICAgICAgICAgIHkgPSBjKFggPSAxLCBZID0gMSwgSCA9IDIsIFogPSAxKSksCiAgZXhwb3N1cmUgPSAiWCIsCiAgb3V0Y29tZSA9ICJZIiwKICBsYXRlbnQgPSAiSCIsCiAgbGFiZWxzID0gYygiWCIgPSAiSW50ZXJ2ZW50aW9uIiwgIlkiID0gIkVyZ2VibmlzIiwKICAgICAgICAgICAgICJIIiA9ICIoVW5iZW9iYWNodGJhcmUpIENvbmZvdW5kZXIiLCAiWiIgPSAiSW5zdHJ1bWVudCIpCikgJT4lIAogIHRpZHlfZGFnaXR0eSgpICU+JSAKICBub2RlX3N0YXR1cygpICU+JSAKICBnZ3Bsb3QoYWVzKHggPSB4LCB5ID0geSwgeGVuZCA9IHhlbmQsIHllbmQgPSB5ZW5kKSkgKwogIGdlb21fZGFnX2VkZ2VzKGFlcyhlZGdlX2xpbmV0eXBlID0gaWZlbHNlKCB4ID09IHhbMl0gJiB5ID09IHlbMl0sICJkYXNoZWQiLCAic29saWQiKSksIHNob3cubGVnZW5kID0gRkFMU0UpICsKICBnZW9tX2RhZ19wb2ludChhZXMoY29sb3IgPSBzdGF0dXMpLCBzaXplID0gMTUpICsKICBnZW9tX2RhZ190ZXh0KGNvbG9yID0gIndoaXRlIiwgc2l6ZSA9IDUpICsKICBnZW9tX2RhZ19sYWJlbF9yZXBlbChhZXMobGFiZWwgPSBsYWJlbCksIG51ZGdlX3kgPSBjKC0wLjI1LCAwLjI1LCAwLjI1LCAwLjI1KSkgKwogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjKCJkYXJrb3JhbmdlIiwgImRhcmtyZWQiLCAiIzAwNzREOSIpLCBuYS52YWx1ZSA9ICJibGFjayIpICsKICBndWlkZXMoY29sb3IgPSBGQUxTRSkgKwogIHRoZW1lX2RhZygpCmBgYAoKKipIaW50ZXJncnVuZDoqKiBgWGAgc29sbHRlIGV4b2dlbiBzZWluIHVtIF9rYXVzYWxfIGludGVycHJldGllcnQgd2VyZGVuIHp1IGvDtm5uZW4KCioqWmllbCBkZXIgSW5zdHJ1bWVudGFsdmFyaWFibGU6KiogRXhvZ2VuZSBWYXJpYXRpb24gdm9uIGBYYCBmaW5kZW4sIHdlbGNoZSBkYW5uIF9rYXVzYWxfIGludGVycHJldGllcnQgd2VyZGVuIGthbm4KCldpciBrw7ZubmVuIHVucyBkaWVzIHZvcnN0ZWxsZW4gYWxzIEdlZ2VudGVpbCBkYXZvbiBhdWYgZWluZSBWYXJpYWJsZSB6dSBrb250cm9sbGllcmVuOgoKLSBXaXIgZXJrbMOkcmVuIGBYYCB1bmQgYFlgIG1pdCBkZXIgVmFyaWFibGVuIGBaYCwgYWJlciBhbnN0YXR0IHVucyBhdWYgZGVuIFRlaWwgenUga29uemVudHJpZXJlbiwgd2VsY2hlciBuaWNodCBkdXJjaCBgWmAgZXJrbMOkcnQgd2VyZGVuIGthbm4sIG5laG1lbiB3aXIgKipudXIgZGVuIEFudGVpbCBkZXIgZHVyY2ggYFpgIGVya2zDpHJ0IHdpcmQqKiEKLSBBbnN0YXR0IHp1IHNhZ2VuICJkdSBiaXN0IGF1ZiBlaW5lciBfYmFja2Rvb3JfLCBpY2ggc2NobGllw59lIGRpY2giIHNhZ2VuIHdpciAiZHUgaGFzdCBrZWluZSBfYmFja2Rvb3JfISBJY2ggd2lsbCwgZGFzcyBtZWluIGBYYCBnZW5hdSBzbyBzZWluIHNvbGwgd2llIGR1ISBJY2ggbmVobWUgbnVyIGRlbiBQYXJ0IHZvbiBgWGAsIHdlbGNoZXIgdm9uIGRpciBlcmtsw6RydCB3aXJkISIKLSBEYWR1cmNoIG51dHplbiB3aXIgbnVyIG5vY2ggZGllIGV4b2dlbmUgVmFyaWF0aW9uIGluIGBYYCwgd2VsY2hlIGR1cmNoIGBaYCBlcmtsw6RydCB3aXJkCgoqKkZvbGdlOioqCldpciBudXR6ZW4gbmljaHQgbWVociBkaWUga29tcGxldHRlIEluZm9ybWF0aW9uIHVuc2VyZXMgRGF0ZW5zYXR6ZXMsIHNvbmRlcm4gbnVyIG5vY2ggZWluZW4gVGVpbCwgZC5oLiB3aXIgYmVuw7Z0aWdlbiBtZWhyIEJlb2JhY2h0dW5nZW4gdW0gRWZmZWt0ZSBtZXNzZW4genUga8O2bm5lbi4gRGllc2UgdW5nZW5hdWVyZSBTY2jDpHR6dW5nIGRlcyBFZmZla3RzIGRyw7xja3Qgc2ljaCBpbiBkZXIgUmVncmVzc2lvbiBhbHMgZ3LDtsOfZXJlciBTdGFuZGFyZGZlaGxlciBkZXMgU2Now6R0emVycyBhdXMhCgojIyBXYXMgc2luZCBndXRlIEluc3RydW1lbnRhbHZhcmlhYmxlbj8KClVtIGFic2Now6R0emVuIHp1IGvDtm5uZW4sIG9iIHdpciBlaW5lIFZhcmlhYmxlIGFscyBJbnN0cnVtZW50YWx2YXJpYWJsZSBudXR6ZW4ga8O2bm5lbiBtw7xzc2VuIHdpciBkcmVpIEVpZ2Vuc2NoYWZ0ZW4gcHLDvGZlbjoKCioqUmVsZXZhbnoqKjoKCi0gRGllIEluc3RydW1lbnRhbHZhcmlhYmxlIG11c3MgbWl0IGRlci9kZW4gZW5kb2dlbmVuIFZhcmlhYmxlL24ga29ycmVsaWVydCBzZWluLgoKKipBdXNzY2hsaWXDn2xpY2hrZWl0Kio6CgotIERpZSBJbnN0cnVtZW50YWx2YXJpYWJsZSBiZWVpbmZsdXNzdCBkaWUgZXhvZ2VuZSBWYXJpYWJsZSBuaWNodCBkaXJla3QsIHNvbmRlcm4gKiphdXNzY2hsaWXDn2xpY2gqKiDDvGJlciBkaWUgZW5kb2dlbmUgVmFyaWFibGUKCioqRXhvZ2VuaXTDpHQqKjoKCi0gRGllIEluc3RydW1lbnRhbHZhcmlhYmxlIGlzdCBuaWNodCBtaXQgZGVuIGF1c2dlbGFzc2VuZW4gVmFyaWFibGVuIChvbWl0dGVkIHZhcmlhYmxlcykga29ycmVsaWVydAoKCiMjIFJlbGV2YW56CgpXaXIga8O2bm5lbiBkaWUgUmVsZXZhbnogdW5zZXJlciBJbnN0cnVtZW50YWx2YXJpYWJsZW4gdGVzdGVuLiBEaWVzIG1hY2hlbiB3aXIgZsO8ciB1bnNlcmVuIHNpbXVsaWVydGVuIERhdGVuc2F0eiwgaW5kZW0gd2lyIGRpZSBWYXJpYWJsZSBCaWxkdW5nICggYGJpbGR1bmdgICkgYXVmIGRpZSBJbnN0cnVtZW50YWx2YXJpYWJsZSAoIGBuYWVoZWAgKSByZWdyZXNzaWVyZW4uIERpZSBJbnN0cnVtZW50YWx2YXJpYWJsZSBzb2xsdGUgZWluZW4gRWluZmx1c3MgYXVmIGRpZSBCaWxkdW5nIGhhYmVuIHVuZCBQZXJzb25lbiBkaWUgbsOkaGVyIGFuIGRlciBVbml2ZXJzaXTDpHQgd29obmVuIHNvbGx0ZW4gbWVociBCaWxkdW5nIGluIEFuc3BydWNoIG5laG1lbi4gU29sbHRlIGRpZXMgbmljaHQgZGVyIEZhbGwgc2Vpbiwgc28gd8OkcmUgdW5zZXJlIEluc3RydW1lbnRhbHZhcmlhYmxlIG5pY2h0IHJlbGV2YW50IHVuZCB3aXIgc29sbHRlbiB1bnMgZWluZSBhbmRlcmUgSW5zdHJ1bWVudGFsdmFyaWFibGUgc3VjaGVuLgoKYGBge3J9CmZpcnN0X3N0YWdlX2Jhc2ljIDwtIGxtKGJpbGR1bmcgfiBuYWVoZSwgZGF0YSA9IGRpc3RhbmNlKQoKc3VtbWFyeShmaXJzdF9zdGFnZV9iYXNpYykKYGBgCgpJbiB1bnNlcmVtIEZhbGwgaXN0IGRpZSBJbnN0cnVtZW50YWx2YXJpYWJsZSBgbmFlaGVgIGhvY2ggc2lnbmlmaWthbnQuIERpZSBGLVN0YXRpc3Rpaywgd2VsY2hlIGFuZ2lidCBvYiBkaWUgZ2V0ZXN0ZXRlbiBWYXJpYWJsZW4genVzYW1tZW4gZWluZW4gRWZmZWt0IGF1ZiBkaWUgX0JpbGR1bmdfIGhhYmVuIGxpZWd0IGJlaSAxNTMuOC4gQWxzIEZhdXN0cmVnZWwga8O2bm5lbiB3aXIgdW5zIGhpZXIgbWVya2VuLCBkYXNzIGRpZXNlIEYtU3RhdGlzdGlrIGdyw7bDn2VyIGFscyAxMCBzZWluIHNvbGx0ZSAoYWxsZXJkaW5ncyBpc3QgZGllcyBudXIgZWluZSBGYXVzdHJlZ2VsIHVuZCBzb2xsdGUgbmljaHQgZGFzIE1hw58gYWxsZXIgRGluZ2Ugc2VpbikuIEZhbGxzIGRpZSBGLVN0YXRpc3RpayBrbGVpbmVyIGlzdCBhbHMgMTAsIHNvIHdpcmQgaW4gZGVyIExpdGVyYXR1ciBvZnQgdm9uIGVpbmVtIF9zY2h3YWNoZW4gSW5zdHJ1bWVudF8gZ2VzcHJvY2hlbi4gU29sY2hlIF9zY2h3YWNoZW4gSW5zdHJ1bWVudGFsdmFyaWFibGVuXyBmw7xocmVuIHp1IGVpbmVyIFZlcnplcnJ1bmcgdW5zZXJlcyBTY2jDpHR6ZXJzIGluIGRlciBJbnN0cnVtZW50YWx2YXJpYWJsZW5yZWdyZXNzaW9uLiBEdXJjaCBkaWUgVmVyd2VuZHVuZyB2b24gX3NjaHdhY2hlbiBJbnN0cnVtZW50ZW5fIGVyaGFsdGVuIHdpciB3aWVkZXIgZWluZW4gQmlhcyBpbiB1bnNlcmVyIFJlZ3Jlc3Npb24sIHdlbGNoZXIgaW4gUmljaHR1bmcgZGVzIE9MUyBCaWFzIGdlaHQuIEplIHN0w6Rya2VyIHVuc2VyIEluc3RydW1lbnQgaXN0LCBkZXN0byB3ZW5pZ2VyIGdyb8OfIGlzdCBkZXIgQmlhcyBpbiBkZXIgSW5zdHJ1bWVudGFsdmFyaWFibGVucmVncmVzc2lvbi4gV2VpdGVyaGluIHNpbmQgSW5zdHJ1bWVudGFsdmFyaWFibGVucmVncmVzc2lvbmVuIHdlbmlnZXIgZWZmaXppZW50IGFscyBPTFMgUmVncmVzc2lvbmVuLCBkYSB3aXIgZWluZW4ga2xlaW5lcmVuIFRlaWwgZGVyIFZhcmlhdGlvbiBpbiBkZW4gRGF0ZW4gZsO8ciB1bnNlcmUgU2Now6R0enVuZyBudXR6ZW4gKG51ciBkZW4gUGFydCwgd2VsY2hlciBkdXJjaCBkYXMgSW5zdHJ1bWVudCBlcmtsw6RydCB3ZXJkZW4ga2FubiksIGRpZXMgcmVzdWx0aWVydCBpbiBlaW5lbSBncsO2w59lcmVuIFN0YW5kYXJkZmVobGVyIGRlcyBTY2jDpHR6ZXJzLCB2ZXJnbGljaGVuIG1pdCBkZXIgT0xTIFJlZ3Jlc3Npb24uIEQuaC4gZHVyY2ggc2Nod2FjaGUgSW5zdHJ1bWVudGFsdmFyaWFibGVuIGVyaGFsdGVuIHdpciBlaW5lbiBCaWFzIGluIHVuc2VyZXIgUmVncmVzc2lvbiwgd2VsY2hlciBpbiBSaWNodHVuZyBPTFMtQmlhcyBnZWh0ICsgZXJoYWx0ZW4gZ3LDtsOfZXJlIEtvbmZpZGVuemludGVydmFsbGUgZHVyY2ggZGllIEluc3RydW1lbnRhbHZhcmlhYmxlbnNjaMOkdHp1bmcgLi4uIHdlbm4gd2lyIHNvIHdvbGxlbiBuZWhtZW4gd2lyIGRpZSBuZWdhdGl2ZW4gQXNwZWt0ZSBiZWlkZXIgV2VsdGVuIGR1cmNoIHNjaHdhY2hlIEluc3RydW1lbnRlIG1pdCwgd2VzaGFsYiB3aXIgZGllc2UgbmFjaCBNw7ZnbGljaGtlaXQgdmVybWVpZGVuIHNvbGx0ZW4uCgpJbiBkZXIgc3DDpHRlcmVuIEFuYWx5c2UgZGVyIEluc3RydW1lbnRhbHZhcmlhYmxlbnJlZ3Jlc3Npb24gaGFiZW4gd2lyIHp1c8OkdHpsaWNoIGRpZSBWZXJ3ZW5kdW5nIGVpbmVzIHNjaHdhY2hlbiBJbnN0cnVtZW50cyBzaW11bGllcnQgdW0gZGllIGdlcmFkZSBiZXNjaHJpZWJlbmVuIEVmZmVrdGUgenUgemVpZ2VuLgoKIyMgQXVzc2NobGllw59saWNoa2VpdAoKTGVpZGVyIGvDtm5uZSB3aXIgZGllIEF1c3NjaGxpZcOfbGljaGtlaXQgdm9uIGBuYWVoZWAgbmljaHQgcHLDvGZlbiwgc29uZGVybiBtw7xzc2VuIGRpZXNlIMO2a29ub21pc2NoIGJlZ3LDvG5kZW4uIFdpciBzb2xsdGVuIGVybMOkdXRlcm4sIF93YXJ1bV8gZGllIEVudGZlcm51bmcgenVyIFVuaXZlcnNpdMOkdCBkYXMgRWlua29tbWVuIF9hdXNzY2hsaWXDn2xpY2hfIMO8YmVyIGRpZSBCaWxkdW5nIHVuZCBuaWNodCDDvGJlciBlaW5lbiBhbmRlcmVuIFdlZyBiZWVpbmZsdXNzZW4ga2Fubi4gU29iYWxkIHdpciBlaW5lbiBadXNhbW1lbmhhbmcgendpc2NoZW4gZGVyIE7DpGhlIHp1ciBVbml2ZXJzaXTDpHQgdW5kIGRlbSBFaW5rb21tZW4gaMOkdHRlbiwgd8OkcmUgdW5zZXIgSW5zdHJ1bWVudCBhdWNoIGVuZG9nZW4gdW5kIHdpciBrw7ZubnRlbiBlcyBuaWNodCB2ZXJ3ZW5kZW4gKGJ6dy4gbnVyIGJlZGluZ3QpLiBJbiB1bnNlcmVyIFNpbXVsYXRpb25zc3R1ZGllIGlzdCBkaWVzIGtlaW4gUHJvYmxlbSBkYSB3aXIgZGllIFZhcmlhYmxlIGBuYWVoZWAgc28gc2ltdWxpZXJ0IGhhYmVuLCBkYXNzIGRpZXNlIGRhcyBFaW5rb21tZW4gX2F1c3NjaGxpZcOfbGljaF8gw7xiZXIgZGllIEJpbGR1bmcgYmVlaW5mbHVzc3QuCgojIyBFeG9nZW5pdMOkdAoKRXhvZ2VuaXTDpHQgYmVkZXV0ZXQsIGRhc3MgZGllIEluc3RydW1lbnRhbHZhcmlhYmxlIG5pY2h0IG1pdCBkZXIgKHVuYmVvYmFjaHRiYXJlbikgYXVzZ2VsYXNzZW5lbiBWYXJpYWJsZSBrb3JyZWxpZXJ0IGlzdC4gRXMgZ2lidCBhdWNoIGbDvHIgZGllIEV4b2dlbml0w6R0IGtlaW5lbiBzdGF0aXN0aXNjaGVuIFRlc3QgZGVyIHVucyBzYWd0LCBvYiB1bnNlcmUgSW5zdHJ1bWVudGFsdmFyaWFibGUobikgZXhvZ2VuIHNpbmQsIGRhIHdpciBrZWluZSBNw7ZnbGljaGtlaXQgaGFiZW4gZsO8ciBhbmRlcmUgYXVzZ2VsYXNzZW5lbiBWYXJpYWJsZW4genUga29udHJvbGxpZXJlbiAoZGllcyB3YXIgamEgZ2VyYWRlIGRlciBHcnVuZCwgd2FydW0gd2lyIGRpZSBJbnN0cnVtZW50YWx2YXJpYWJsZSB2ZXJ3ZW5kZW4hKS4gV2VubiB3aXIgSW5mb3JtYXRpb25lbiB6dSBkZW4gYXVzZ2VsYXNzZW5lbiBWYXJpYWJsZW4gaMOkdHRlbiwgZGFubiBrw7ZubnRlbiB3aXIgYXVmIGRpZXNlIGtvbnRyb2xsaWVyZW4gdW5kIGJyw6R1Y2h0ZW4gZGllIEluc3RydW1lbnRhbHZhcmlhYmxlIGdhciBuaWNodCAoc2llaGUgREFHIG9iZW4pLiAKCkRlciBWb3J0ZWlsIGluIHVuc2VyZXIgU2ltdWxhdGlvbnNzdHVkaWU6IFdpciBoYWJlbiBkaWUgKGVpZ2VudGxpY2ggdW5iZW9iYWNodGJhcmUpIFZhcmlhYmxlICJGw6RoaWdrZWl0ZW4iIHVuZCBrw7ZubmVuIG51biB0YXRzw6RjaGxpY2ggc2NoYXVlbiwgd2llIGhvY2ggZGllIEtvcnJlbGF0aW9uIHp3aXNjaGVuIGRlciBJbnN0cnVtZW50YWx2YXJpYWJsZSBgbmFlaGVgIHVuZCBkZXIgYGZhZWhpZ2tlaXRlbmAgaXN0LiBFaW5lIE3DtmdsaWNoa2VpdCBkaWUgdW5zIGluIGRlciBSZWFsaXTDpHQgbGVpZGVyIHZlcndlaHJ0IGJsZWlidDoKCmBgYHtyfQpyb3VuZChjb3IoZGlzdGFuY2UkbmFlaGUsIGRpc3RhbmNlJGZhZWhpZ2tlaXRlbiksMikKYGBgCgpJbiB1bnNlcmVyIFNpbXVsYXRpb24gaXN0IGRpZSBFeG9nZW5pdMOkdHNhbm5haG1lIGVyZsO8bGx0IChzY2hsaWXDn2xpY2ggaGFiZW4gd2lyIGRpZSBWYXJpYWJsZW4gZW50c3ByZWNoZW5kIHNpbXVsaWVydCkuIEluIGRlciBSZWFsaXTDpHQga8O2bm50ZSBlcyBWZXJiaW5kdW5nZW4gendpc2NoZW4gZGVyIE7DpGhlIGRlcyBXb2hub3J0cyB6dSBlaW5lciBVbmkgdW5kIGRlbiBGw6RoaWdrZWl0ZW4gZWluZXIgUGVyc29uIGdlYmVuLiBGYWxsZW4gaWhuZW4gaGllcnp1IEJlaXNwaWVsZSBlaW4/CgojIFR3by1zdGFnZSBsZWFzdCBzcXVhcmVzCgojIyBUd28tc3RhZ2UgbGVhc3Qgc3F1YXJlcyAoMlNMUykgcGVyIEhhbmQKCk9rLCB3aXIgd29sbGVuIGFsc28gbWl0dGVscyBkZXIgSW5zdHJ1bWVudGFsdmFyaWFibGVuIGBuYWVoZWAgdW5zZXJlIGVpZ2VudGxpY2hlIFZhcmlhYmxlIGBiaWxkdW5nYCBiZXNjaHJlaWJlbiB1bmQgZGFkdXJjaCBkZW4gZXhvZ2VuZW4gVGVpbCB2b24gYGJpbGR1bmdgIGhlcmF1c2ZpbmRlbi4gTWl0IGRpZXNlbSBleG9nZW5lbiBUZWlsIHZvbiBgYmlsZHVuZ2AsIHdlbGNoZXIgbnVuIG5pY2h0IG1laHIgdm9uIGBmYWVoaWdrZWl0ZW5gIGFiaMOkbmd0LCBrw7ZubmVuIHdpciBkYW5uIGRlbiBfa2F1c2FsZW5fIEVmZmVrdCBkZXIgQmlsZHVuZyBhdWYgZGFzIEVpbmtvbW1lbiBiZXN0aW1tZW4uIEQuaC4gZGllIEJpbGR1bmcsIGRpZSBuaWNodCBkdXJjaCBkaWUgRsOkaGlna2VpdGVuIGJlc3RpbW10IHdpcmQuCkjDtnJ0IHNpY2ggbmFjaCBlaW5lbSBlaW5mYWNoZW4gUHJvemVzcyBtaXQgbWVocmVyZW4gU2Nocml0dGVuIGFuLCBkZW4gd2lyIGhpZXIgZHVyY2hmw7xocmVuIGvDtm5uZW4hCgpHZW5hdSBkYXMgd29sbGVuIHdpciBudW4gdHVuOgoKMS4gV2lyIHJlZ3Jlc3NpZXJlbiBkaWUgQmlsZHVuZyAoIGBiaWxkdW5nYCApIGF1ZiBkaWUgSW5zdHJ1bWVudGFsdmFyaWFibGUgKCBgbmFlaGVgICkuIERpZXMgbmVubmVuIHdpciAqZmlyc3Rfc3RhZ2UqIHVuZCBzb2xsdGUgdW5zIGJla2FubnQgdm9ya29tbWVuLCBzY2hsaWXDn2xpY2ggaGFiZW4gd2lyIGRhcyBiZXJlaXRzIGdlbWFjaHQgdW0gZGllIFJlbGV2YW56IGRlcyBJbnN0cnVtZW50cyB6dSBiZXN0aW1tZW46CgpgYGB7cn0KZmlyc3Rfc3RhZ2UgPC0gbG0oYmlsZHVuZyB+IG5hZWhlLCBkYXRhID0gZGlzdGFuY2UpCmBgYAoKMi4gQWxzIG7DpGNoc3RlcyBleHRyYWhpZXJlbiB3aXIgZGllIFZhcmlhdGlvbiB2b24gYGJpbGR1bmdgLCB3ZWxjaGUgdm9uIGBuYWVoZWAgZXJrbMOkcnQgd2VyZGVuIGthbm4uIERhZsO8ciBudXR6ZW4gd2lyIGRpZSBFcmdlYm5pc3NlIGF1cyB1bnNlcmVyICpmaXJzdF9zdGFnZSogUmVncmVzc2lvbiB1bmQgc2NoYXVlbiB1bnMgYW4sIHdlbGNoZSBXZXJ0ZSB3aXIgZsO8ciBgYmlsZHVuZ2Agdm9yaGVyZ2VzYWd0IGjDpHR0ZW4sIGdlZ2ViZW4gZGVyIGpld2VpbGlnZW4gYG5hZWhlYCB6dXIgVW5pLiBLb25rcmV0IG51dHplbiB3aXIgZGllIGdlZml0dGV0ZW4gV2VydGUgdW5zZXJlciAqZmlyc3Rfc3RhZ2UqIFJlZ3Jlc3Npb24gKCBgLmZpdHRlZGAgKSB1bmQgZsO8Z2VuIGRpZXNlIHVuc2VyZW0gRGF0ZW5zYXR6IGhpbnp1IChlaW5lIGVpbmZhY2hlIE1ldGhvZGUgYmlldGV0IGRpZSBGdW5rdGlvbiBgYXVnbWVudF9jb2x1bW5zKClgIGF1cyBkZW0gUGFrZXQgYGJyb29tYCkuCgpgYGB7cn0KZGlzdGFuY2UgPC0gYXVnbWVudF9jb2x1bW5zKGZpcnN0X3N0YWdlLCBkaXN0YW5jZSkgJT4lCiAgc2VsZWN0KGVpbmssIGJpbGR1bmcsIGZhZWhpZ2tlaXRlbiwgbmFlaGUsIGVycm9yX2VpbmssIGAuZml0dGVkYCkKCmhlYWQoZGlzdGFuY2UpCmBgYAoKVW5zIGludGVyZXNzaWVyZW4gaW5zYmVzb25kZXJlIGRpZSBnZWZpdHRldGVuIFdlcnRlICggYC5maXR0ZWRgICksIGRhIGRpZXMgZGllIFZhcmlhdGlvbiBpbiBgYmlsZHVuZ2Agd2lkZXJzcGllZ2VsdCwgZGllIGV4b2dlbiBpc3QgdW5kIGRhbWl0IG9obmUgZGVuIEVpbmZsdXNzIGRlciBGw6RoaWdrZWl0ZW4uCgozLiBOdW4ga8O2bm5lbiB3aXIgZGllIFNwYWx0ZSBgLmZpdHRlZGAgbnV0emVuIHVtIGRlbiBfa2F1c2FsZW5fIEVmZmVrdCBkZXIgQmlsZHVuZyBhdWYgZGFzIEVpbmtvbW1lbiB6dSBzY2jDpHR6ZW4gKGluIGVpbmVyIHp3ZWl0ZW4gUmVncmVzc2lvbik6CgpgYGB7cn0Kc2Vjb25kX3N0YWdlIDwtIGxtKGVpbmsgfiBgLmZpdHRlZGAsIGRhdGEgPSBkaXN0YW5jZSkKCnN1bW1hcnkoc2Vjb25kX3N0YWdlKQpgYGAKCkRpZSBFcmdlYm5pc3NlIGRpZXNlciBSZWdyZXNzaW9uIHNvbGx0ZW4gbnVuIGRlbiB0YXRzw6RjaGxpY2hlbiBFZmZla3QgZGVyIEJpbGR1bmcgYXVmIGRhcyBFaW5rb21tZW4gd2lkZXJzcGllZ2VsbiwgZGEgd2lyIGR1cmNoIHVuc2VyZSBJbnN0cnVtZW50YWx2YXJpYWJsZSBkZW4gZW5kb2dlbmVuIFBhcnQgZGVyIEJpbGR1bmcgKGJlZWluZmx1c3N0IHZvbiBkZW4gRsOkaGlna2VpdGVuKSBlbnRmZXJudCBoYWJlbi4gVW5kIHRhdHPDpGNobGljaCBkZXIgRWZmZWt0IGRlciBCaWxkdW5nIGF1ZiBkYXMgRWlua29tbWVuIGVudHNwcmljaHQgMzgsNzfigqwgZsO8ciBlaW4gSmFociBtZWhyIEJpbGR1bmcgKHNpbXVsaWVydCBoYXR0ZW4gd2lyIDQw4oKsKSEKCiMjIFR3by1zdGFnZSBsZWFzdCBzcXVhcmVzICgyU0xTKSBpbiBSCgpEaWUgaMOkbmRpc2NoZSBCZXJlY2hudW5nIGRlciBlaW56ZWxuZW4gUmVncmVzc2lvbmVuIGlzdCBoaWxmcmVpY2ggdW0gc2ljaCBrbGFyIHp1IHdlcmRlbiwgd2FzIGdlbmF1IGRpZSBzbyBnZW5hbm50ZSAiVHdvLXN0YWdlIGxlYXN0IHNxdWFyZXMiIG1hY2h0IHVtIGVpbmUgSW5zdHJ1bWVudGFsdmFyaWFibGVucmVncmVzc2lvbiBkdXJjaHp1ZsO8aHJlbjoKCkVzIGdpYnQgendlaSAic3RhZ2VzIiwgZC5oLiB6d2VpIFJlZ3Jlc3Npb25lbiwgZGllIG5hY2hlaW5hbmRlciBkdXJjaGdlZsO8aHJ0IHdlcmRlbi4gCgpJbiBkZXIgZXJzdGVuICJzdGFnZSIgZXJrbMOkcmVuIHdpciB1bnNlcmUgZW5kb2dlbmUgVmFyaWFibGUgZHVyY2ggZGFzIEluc3RydW1lbnQgdW5kIGluIGRlciB6d2VpdGVuICJzdGFnZSIgbnV0emVuIHdpciBkaWUgZ2VmaXR0ZXRlbi92b3JoZXJnZXNhZ3RlbiBXZXJ0ZSBkZXIgZXJzdGVuIFJlZ3Jlc3Npb24gdW0gdW5zZXJlIGVpZ2VudGxpY2hlIEZyYWdlc3RlbGx1bmcgenUgYmVhbnR3b3J0ZW4uIEplZG9jaCBnaWJ0IGVzIGVpbmlnZSBOYWNodGVpbGUsIHdlbm4gd2lyIGVpbmUgc29sY2hlIDJTTFMgcGVyIEhhbmQgZHVyY2hmw7xocmVuOgoKLSBEaWUgU3RhbmRhcmRmZWhsZXIgc2luZCBuaWNodCBrb3JyZWt0Ci0gRGFzIFLCsiAodW5kIHdlaXRlcmUgRGlhZ25vc3Rpa2VuKSBkZXIgendlaXRlbiAic3RhZ2UiIHdlcmRlbiBuaWNodCBrb3JyZWt0IGdlc2Now6R0enQuCgpEaWVzIGxpZWd0IGRhcmFuIGRhcyB3aXIgbmljaHQgZGllIF9nZW1lc3NlbmVfIGBiaWxkdW5nYCBpbiBkZXIgendlaXRlbiAic3RhZ2UiIHZlcndlbmRlbiwgc29uZGVybiBkaWUgZ2VzY2jDpHR6ZW4gV2VydGUgYC5maXR0ZWRgIGF1cyBkZXIgZXJzdGVuICJzdGFnZSIuIERhaGVyIG3DvHNzZW4gd2lyIGRpZSBFcmdlYm5pc3NlIGF1cyBkZXIgendlaXRlbiAic3RhZ2UiIGFucGFzc2VuLiBEaWVzIHdvbGxlbiB3aXIgamVkb2NoIG5pY2h0IGF1Y2ggdm9uIEhhbmQgbWFjaGVuLCBzb25kZXJuIG51dHplbiBoaWVyenUgZGFzIFBha2V0IGBBRVJgIG1pdCBkZXIgRnVua3Rpb24gYGl2cmVnKClgLCB3ZWxjaGUgZGllc2UgQW5wYXNzdW5nZW4gZsO8ciB1bnMgdm9ybmltbXQuCgpEaWVzIHdvbGxlbiB3aXIgbnVuIHR1biB1bmQgZGllIEVyZ2Vibmlzc2UgdW5zZXJlciB1bnRlcnNjaGllZGxpY2hlciBSZWdyZXNzaW9uZW4gZ2VnZW7DvGJlcnN0ZWxsZW4uCgpgYGB7ciwgcmVzdWx0cyA9ICdhc2lzJ30Kb2xzX2l2IDwtIGl2cmVnKGVpbmsgfiBiaWxkdW5nIHwgbmFlaGUgLCBkYXRhID0gZGlzdGFuY2UpCgpzdGFyZ2F6ZXIob2xzX2JpYXMsIG9sc19jb3JyZWN0LCBzZWNvbmRfc3RhZ2UsIG9sc19pdiwKICAgICAgICAgIHR5cGUgPSAiaHRtbCIsIAogICAgICAgICAgaGVhZGVyPUZBTFNFLCAKICAgICAgICAgIGNvbHVtbi5sYWJlbHMgPSBjKCJPTFMgQmlhcyIsICJPTFMgS29udHJvbGxlIiwgIjJTTFMgcGVyIEhhbmQiLCAiMlNMUyBzdGFya2VzIEluc3RydW1lbnQiKSwKICAgICAgICAgIGRlcC52YXIubGFiZWxzICAgPSAiV29jaGVuZWlua29tbWVuIikKYGBgCgpJbiBkZXIgZXJzdGVuIFNwYWx0ZSBoYWJlbiB3aXIgZGFzIG5haXZlIE1vZGVsbCwgd2VsY2hlcyBkZW4gRWZmZWt0IGRlciBCaWxkdW5nIGF1ZiBkYXMgRWlua29tbWVuIMO8YmVyc2Now6R0enQuIEluIGRlciB6d2VpdGVuIFNwYWx0ZSBzZWhlbiB3aXIgZGFzIE1vZGVsbCwgd2llIHdpciBlcyBnZXJuZSBzY2jDpHR6ZW4gbcO2Y2h0ZW4sIG1pdCBkZXIgKGluIHJlYWxlbiBEYXRlbnPDpHR6ZW4gdW5iZW9iYWNodGJhcmVuKSBWYXJpYWJsZW4gRsOkaGlna2VpdGVuICggYGZhZWhpZ2tlaXRlbmAgKS4gSW4gZGllc2VyIHp3ZWl0ZW4gU3BhbHRlIGVyaGFsdGVuIHdpciBkZW4ga29ycmVrdGVuIEtvZWZmaXppZW50ZW4gZsO8ciBgYmlsZHVuZ2AhCkluIGRlciBkcml0dGVuIFNwYWx0ZSBiZXJlY2huZW4gd2lyIGRpZSAyU0xTIHZvbiBIYW5kLiBIaWVyIGVyaGFsdGVuIHdpciBhdWNoIGRlbiBrb3JyZWt0ZW4gS29lZmZpemllbnRlbiBmw7xyIGBiaWxkdW5nYCAoaW4gZGllc2VtIE1vZGVsbCBgLmZpdHRlZGAgZ2VuYW5udCksIHdpZSBhdWNoIGluIGRlciBhdXRvbWF0aXNjaCB2b24gUiBiZXJlY2huZXRlbiAyU0xTIGluIGRlciA0LiBTcGFsdGUuIFdpciBrb25udGVuIG1pdCBkZXIgSW5zdHJ1bWVudGFsdmFyaWFibGUgZGllIGV4b2dlbmUgVmFyaWF0aW9uIHZvbiBgYmlsZHVuZ2AgZXJmb2xncmVpY2ggZXh0cmFoaWVyZW4gdW5kIGVyaGFsdGVuIGRlbiBfa2F1c2FsZW5fIEVmZmVrdCB2b24gZWluZW0gSmFociBtZWhyIEJpbGR1bmcgYXVmIGRhcyBXb2NoZW5laW5rb21tZW4sIHdlbGNoZXIgaW4gdW5zZXJlciBSZWdyZXNzaW9uIGJlaSAzOCw0NzfigqwgbGllZ3QuIFppZW1saWNoIGd1dCBnZXNjaMOkdHp0IHfDvHJkZSBpY2ggc2FnZW4sIHNjaGxpZcOfbGljaCBoYWJlbiB3aXIgZGVuIHdhaHJlbiBFZmZla3QgYXVmIDQw4oKsIHNpbXVsaWVydCEKCkltIFZlcmdsZWljaCBkZXIgMy4gdW5kIDQuIFNwYWx0ZSBzZWhlbiB3aXIgZGVuIHZvcmhpbiBlcnfDpGhudGVuIFVudGVyc2NoaWVkIGluIGRlbiBTdGFuZGFyZGZlaGxlcm4gdW5kIGRlbSBSwrIsIHdlbGNoZSBkdXJjaCBkYXMgYEFFUmAgUGFrZXQgbWl0IGRlciBGdW5rdGlvbiBgaXZyZWcoKWAgYXV0b21hdGlzY2gga29ycmlnaWVydCB3aXJkLgoKIyBTY2h3YWNoZSBJbnN0cnVtZW50ZQoKTnVuIGVyaGFsdGVuIHdpciBtaXQgdW5zZXJlbSBJbnN0cnVtZW50IGRlbiBfa2F1c2FsZW5fIEVmZmVrdCBkZXIgQmlsZHVuZyBhdWYgZGFzIEVpbmtvbW1lbi4gRGFzIGlzdCB0b2xsIQpEb2NoIHVuc2VyIEluc3RydW1lbnQgd2FyIG1pdCBlaW5lciBGLVN0YXRpc3RpayB2b24gMTUzLjggaW4gZGVyIF9maXJzdC1zdGFnZV8gc2VociByZWxldmFudCBmw7xyIGRpZSBleG9nZW5lIFZhcmlhdGlvbiBpbiBgYmlsZHVuZ2AuIEFuZ2Vub21tZW4gd2lyIGhhYmVuIG51ciBlaW4gc2Nod2FjaGVzIEluc3RydW1lbnQgenVyIFZlcmbDvGd1bmcsIGvDtm5uZW4gd2lyIGRlbm5vY2ggdmFsaWRlIEVyZ2Vibmlzc2Ugc2Now6R0emVuLCBvZGVyIGVyaGFsdGVuIHdpciBkdXJjaCBkZW4gQmlhcyBpbiBkZXIgSW5zdHJ1bWVudGFsdmFyaWFibGVucmVncmVzc2lvbiBzdGFyayB2ZXJ6ZXJydGUgRXJnZWJuaXNzZT8KCmBgYHtyLCByZXN1bHRzID0gJ2FzaXMnfQojWnVlcnN0IGdlbmVyaWVyZW4gd2lyIHVucyBlaW4gc2Nod2FjaGVzIEluc3RydW1udGUgKDAuMDAxICogZGlzdGFuY2UpCmRpc3RhbmNlIDwtIGRpc3RhbmNlICU+JQogIG11dGF0ZShiaWxkdW5nX3dlYWsgPSAxMyArIDAuMDAxKm5hZWhlICsgMipmYWVoaWdrZWl0ZW4sICAjIERpc3RhbmNlIGFscyBzY2h3YWNoZXMgSW5zdHJ1bWVudCBmw7xyIEJpbGR1bmcKICAgICAgICAgZWlua193ZWFrID0gMTAwICsgNDAqYmlsZHVuZ193ZWFrICsgNzAqZmFlaGlna2VpdGVuIC0gZXJyb3JfZWluaykKCiNVbSBhbnNjaGxpZcOfZW5kIGRpZSBJViBSZWdyZXNzaW9uIG1pdCBkaWVzZW0gSW5zdHJ1bWVudCBkdXJjaGxhdWZlbiB6dSBsYXNzZW4Kb2xzX2l2X3dlYWsgPC0gaXZyZWcoZWlua193ZWFrIH4gYmlsZHVuZ193ZWFrIHwgbmFlaGUgLCBkYXRhID0gZGlzdGFuY2UpCgojV2lyIHNwZWljaGVybiBkZW4gV2Vhay1JbnN0cnVtZW50cyBUZXN0IGF1cyBkZXIgZmlyc3Qtc3RhZ2UgYWIgdW5kIGbDvGdlbiBkaWVzZSBTcGFsdGUgdW5zZXJlciBSZWdyZXNzaW9uIGluIHN0YXJnYXplciBoaW56dSAoZsO8ciBzdGFya2VzIHVuZCBzY2h3YWNoZXMgSW5zdHJ1bWVudCkKb2xzX2l2X3Rlc3QgPC0gc3VtbWFyeShvbHNfaXYsIGRpYWdub3N0aWNzID0gVCkkZGlhZ25vc3RpY3NbMSwzXSAjc3RhcmtlcyBJbnN0cnVtZW50Cm9sc19pdl93ZWFrX3Rlc3QgPC0gc3VtbWFyeShvbHNfaXZfd2VhaywgZGlhZ25vc3RpY3MgPSBUKSRkaWFnbm9zdGljc1sxLDNdICNzY2h3YWNoZXMgSW5zdHJ1bWVudAoKc3RhcmdhemVyKG9sc19iaWFzLCBvbHNfY29ycmVjdCwgc2Vjb25kX3N0YWdlLCBvbHNfaXYsIG9sc19pdl93ZWFrLCAKICAgICAgICAgIHR5cGUgPSAiaHRtbCIsIAogICAgICAgICAgaGVhZGVyPUZBTFNFLCAKICAgICAgICAgIGNvbHVtbi5sYWJlbHMgPSBjKCJPTFMgQmlhcyIsICJPTFMgS29udHJvbGxlIiwgIjJTTFMgcGVyIEhhbmQiLCAiMlNMUyBzdGFya2VzIEluc3RydW1lbnQiLCAiMlNMUyBzY2h3YWNoZXMgSW5zdHJ1bWVudCIpLAogICAgICAgICAgZGVwLnZhci5sYWJlbHMgICA9ICJXb2NoZW5laW5rb21tZW4iLAogICAgICAgICAgYWRkLmxpbmVzID0gbGlzdChjKCJXZWFrIEluc3RydW1lbnRzIFRlc3QiLCAiICIsICIgIiwgIiAiLCAgcm91bmQob2xzX2l2X3Rlc3QsMiksIHJvdW5kKG9sc19pdl93ZWFrX3Rlc3QsMikgKSkpCmBgYAoKV2lyIHNlaGVuIHdhcyB3aXIgYmVyZWl0cyB3ZWl0ZXIgb2JlbiBpbSBUZXh0IGVyd8OkaG50IGhhdHRlbjoKCjEuIERlciBCaWFzIGRlcyBJViBTY2jDpHR6ZXJzIGlzdCBkZXV0bGljaCBzaWNodGJhciB1bmQgc2VociBncm/Dny4gRC5oLiBkdXJjaCBlaW4gc2Nod2FjaGVzIEluc3RydW1lbnQgZHJpZnRlbiB3aXIgc2VociB3ZWl0IHdlZyB2b20gZWlnZW50bGljaGVuIGthdXNhbGVuIEVmZmVrdAoyLiBEaWUgU3RhbmRhcmRmZWhsZXIgaW4gZGVyIElWIFJlZ3Jlc3Npb24gbWl0IGVpbmVtIHNjaHdhY2hlbiBJbnN0cnVtZW50IHNpbmQgc2VociBncm/Dnw==