Introduction

Les modèles de régression linéaire par les Moindres Carrés Ordinaires (MCO) sont des modèles d’estimation de relations entre une variable endogène \(Y_t\) (ou variable expliquée), et une ou plusieurs variables dites exogènes \(X_{n,t}\) (ou variables explicatives). C’est l’un des (voire, le) modèles les plus simples en économétrie, mais qui peut être très efficace s’il est bien mené et que les données s’y prêtent.

Notamment, une des hypothèses qui est posée par le modèle de regression linéaire par les MCO est l’exogénéité des variables explicatives. Autrement dit, on teste l’impact de \(X_t\) sur \(Y_t\) sous l’hypothèse que \(Y_t\) n’influence pas \(X_t\). Cela implique l’absence de causalité inverse et/ou de simultanéité entre \(X_t\) et \(Y_t\). En général, si on pense qu’il y a cette causalité inverse ou ce biais de simultanéité, on préfère opter pour d’autres types de modèles (modèles VAR notamment) même si des spécifications alternatives de modèle peuvent parfois régler le problème (modèles ARDL).

Une autre hypothèse est qu’il n’y a pas de biais de variable omise : le modèle explique suffisamment \(Y_t\) pour que les résidus, qui représente la dynamique de \(Y_t\) si elle n’était impactée par rien d’autre que par ses propres chocs, soient non-autocorrélés et suivent une loi Normale centrée réduite de variance constante. Autrement dit, la dynamique des résidus représentent la dynamique de \(Y_t\) a son état stationnaire.

Enfin, le biais de variable omise pourrait inciter à inclure la totalité des variables disponibles dans le monde. Cependant, cela peut créer un biais important : le bad control. Par exemple, si on veut estimer l’impact de \(X_{1,t}\) et de \(X_{2,t}\) sur \(Y_t\) mais qu’en même temps, \(X_1\) impacte \(X_2\), alors l’estimation du coefficient associé à \(X_2\) va être biaisé par ce lien. Il faut donc respecter le principe de parsimonie : en faire suffisamment, mais ne pas en faire trop.

Modèle de Régression Linéaire Univarié

\[\begin{equation} Y_t = a_0 + \beta X_t + \varepsilon_t \end{equation}\]

Modèle de Régression Linéaire Multivarié

\[\begin{equation} Y_t = a_0 + \beta_1 X_{1,t}+ \beta_2 X_{2,t} + \beta_3 X_{3,t} + \varepsilon_t \end{equation}\]

Modèle de Régression Non-Linéaire Univarié

\[\begin{equation} Y_t = a_0 + \beta_1 X_{1,t}+ \beta_2 X_{2,t} + \beta_3 X_{2,t}^2 + \varepsilon_t \end{equation}\]

Courbe de Phillips

On va étudier ici la validité de la courbe de Phillips pour la France. La courbe de Phillipps illustre la relation inverse entre taux de chômage et taux d’inflation démontrée empiriquement par l’économiste néo-zélandais William Phillips en 1958. Le concept a ensuite été repris par Samuelson et Solow dans le développement des modèles néo-keynésiens.

Afin de justifier cette relation sur le plan théorique, l’explication la plus populaire se fonde sur les pouvoirs de négociation des salariés. Lorsque le taux de chômage est haut, les salariés sont “facilement” remplaçables dans les entreprises. Ils ne peuvent donc pas négocier de hausse de salaires car les entreprises les remplaçeraient par d’autres au chômage. Si les salaires n’augmentent pas, les prix pratiqués par les entreprises n’ont pas de raison d’augmenter (parce que les coûts n’augmentent pas d’une part, et parce que la demande n’augmente pas d’autre part), donc l’inflation n’augmente pas. A contrario, lorsque le taux de chômage est faible, les salariés ont un pouvoir de négociation important. Ils vont donc demander des hausses de salaire, ce qui va se répercuter sur les prix.

Il y aurait donc un arbitrage à effectuer. En effet, les Banques Centrales ont pour mission de stabiliser l’inflation à un niveau faible. La validité de la courbe de Phillips implique donc que cette inflation faible entraîne mécaniquement un chômage structurel permanent et l’impossibilité du Plein-Emploi. Mais dans le même temps, les Etats (et les pouvoirs élus) ont un intérêt d’atteindre le Plein-Emploi (pour être réélus), donc à mener des politiques monétaire accomodantes qui entraînent une hausse de l’inflation sur le long-terme. Les sociétés doivent donc choisir, entre l’inflation et le chômage.

\[\begin{equation} \pi_t = a_0 + \beta U_t + \varepsilon_t \end{equation}\]

\(U_t\) est le taux de chômage (en %) de la France entre 1960 et 2020, \(\pi_t\) est l’inflation sur la même période en France, mesurée comme la différence de logarithme, et \(\varepsilon_t\) représentent les résidus.

Données

donnees <- read_excel("C:/Users/fkraus/Desktop/data_schularick.xlsx") %>%
  filter(country == "France") %>%
  select(year, unemp, cpi) %>%
  mutate(inflation = (log(cpi) - lag(log(cpi)))*100)%>%
  na.omit()%>%
  filter(year >= 1950)
  
donnees
ggplot(donnees, aes(x=year, y=inflation))+
  geom_line(lwd=1)+
  geom_line(aes(y=unemp), col="red", lwd=1)+
  theme_bw()

On voit que dans l’ensemble sur la période, inflation et chômage tendent à avoir une dynamique opposée : l’inflation est haute lorsque le chômage est bas, et inversement.

Relation Inflation-Chômage

Le meilleur moyen de visualiser la relation entre deux variables (en tout cas, pour les modèles univariés) est de tracerle nuage de point entre les deux variables :

ggplot(donnees, aes(x=unemp, y=inflation))+
  geom_point()+
  geom_smooth(method="lm")+
  theme_bw()

Il semble y avoir une relation négative et significative entre le taux d’inflation et le taux de chômage. On peut le vérifier avec la régression directement :

regression <- feols(inflation ~ unemp, data=donnees)
etable(regression)
                         regression
Dependent Var.:           inflation
                                   
Constant          7.104*** (0.8730)
unemp           -0.4323*** (0.1157)
_______________ ___________________
S.E. type                       IID
Observations                     71
R2                          0.16818
Adj. R2                     0.15613
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

On voit effectivement l’impact négatif et significatif de l’inflation sur le taux de chômage. D’après les coefficients, une augmentation du taux de chômage d’une unité (un point de pourcentage en l’occurence), le taux d’inflation tend à diminuer de 0.43 unités (donc 0.43 points de pourcentages). Autrement dit, nos résultats montrent bien qu’il y a un arbitrage entre inflation et chômage.

En revanche, il se peut que cette relation soit biaisée : on n’a pas vérifié la stationnarité des variables inclues dans le modèle !

Vérification de la stationnarité

Inflation

summary(ur.df(donnees$inflation))

############################################### 
# Augmented Dickey-Fuller Test Unit Root Test # 
############################################### 

Test regression none 


Call:
lm(formula = z.diff ~ z.lag.1 - 1 + z.diff.lag)

Residuals:
     Min       1Q   Median       3Q      Max 
-11.4646  -0.1584   0.3398   1.2137   9.6494 

Coefficients:
           Estimate Std. Error t value Pr(>|t|)   
z.lag.1    -0.15403    0.05198  -2.964  0.00421 **
z.diff.lag  0.04228    0.11262   0.375  0.70854   
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 2.448 on 67 degrees of freedom
Multiple R-squared:  0.1163,    Adjusted R-squared:  0.08993 
F-statistic: 4.409 on 2 and 67 DF,  p-value: 0.01589


Value of test-statistic is: -2.9635 

Critical values for test statistics: 
     1pct  5pct 10pct
tau1 -2.6 -1.95 -1.61

La série d’inflation en niveau n’est pas stationnaire (la t-stat n’est pas inférieure à la valeur critique à 5%. Il faut donc explorer le type de non-stationnarité

summary(ur.df(donnees$inflation, type="trend"))

############################################### 
# Augmented Dickey-Fuller Test Unit Root Test # 
############################################### 

Test regression trend 


Call:
lm(formula = z.diff ~ z.lag.1 + 1 + tt + z.diff.lag)

Residuals:
     Min       1Q   Median       3Q      Max 
-10.7968  -0.8037  -0.1813   0.8070   8.3911 

Coefficients:
            Estimate Std. Error t value Pr(>|t|)    
(Intercept)  2.24104    0.90244   2.483 0.015606 *  
z.lag.1     -0.36310    0.08906  -4.077 0.000127 ***
tt          -0.02489    0.01651  -1.508 0.136378    
z.diff.lag   0.15430    0.11484   1.344 0.183745    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 2.343 on 65 degrees of freedom
Multiple R-squared:  0.2087,    Adjusted R-squared:  0.1722 
F-statistic: 5.714 on 3 and 65 DF,  p-value: 0.001557


Value of test-statistic is: -4.0771 5.897 8.5434 

Critical values for test statistics: 
      1pct  5pct 10pct
tau3 -4.04 -3.45 -3.15
phi2  6.50  4.88  4.16
phi3  8.73  6.49  5.47

La trend est significative, et le coefficient d’autocorrélation est également significatif. L’inflation suit donc un processus DS, qu’il faut passer en différence pour stationnariser

donnees <- donnees %>%
  mutate(dinflation = inflation - lag(inflation))%>%
  na.omit()

summary(ur.df(donnees$dinflation))

############################################### 
# Augmented Dickey-Fuller Test Unit Root Test # 
############################################### 

Test regression none 


Call:
lm(formula = z.diff ~ z.lag.1 - 1 + z.diff.lag)

Residuals:
     Min       1Q   Median       3Q      Max 
-11.8436  -0.6425  -0.1740   0.5989   9.4231 

Coefficients:
           Estimate Std. Error t value Pr(>|t|)    
z.lag.1     -1.2165     0.1642  -7.410 3.01e-10 ***
z.diff.lag   0.2411     0.1126   2.141    0.036 *  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 2.49 on 66 degrees of freedom
Multiple R-squared:  0.5265,    Adjusted R-squared:  0.5121 
F-statistic: 36.69 on 2 and 66 DF,  p-value: 1.931e-11


Value of test-statistic is: -7.4096 

Critical values for test statistics: 
     1pct  5pct 10pct
tau1 -2.6 -1.95 -1.61

La série d’inflation en différence est stationnaire en différence première, elle est intégrée d’ordre 1: \(I(1)\)

Chômage

summary(ur.df(donnees$unemp, type="none"))

############################################### 
# Augmented Dickey-Fuller Test Unit Root Test # 
############################################### 

Test regression none 


Call:
lm(formula = z.diff ~ z.lag.1 - 1 + z.diff.lag)

Residuals:
     Min       1Q   Median       3Q      Max 
-1.73911 -0.31311  0.03339  0.32811  1.85398 

Coefficients:
            Estimate Std. Error t value Pr(>|t|)  
z.lag.1    0.0003894  0.0098586   0.039   0.9686  
z.diff.lag 0.3098390  0.1185854   2.613   0.0111 *
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.6146 on 66 degrees of freedom
Multiple R-squared:  0.09587,   Adjusted R-squared:  0.06848 
F-statistic: 3.499 on 2 and 66 DF,  p-value: 0.03594


Value of test-statistic is: 0.0395 

Critical values for test statistics: 
     1pct  5pct 10pct
tau1 -2.6 -1.95 -1.61

La série de chômage n’est pas stationnaire en niveau. On regarde donc le type de non-stationnarité

summary(ur.df(donnees$unemp, type="trend"))

############################################### 
# Augmented Dickey-Fuller Test Unit Root Test # 
############################################### 

Test regression trend 


Call:
lm(formula = z.diff ~ z.lag.1 + 1 + tt + z.diff.lag)

Residuals:
     Min       1Q   Median       3Q      Max 
-1.62799 -0.38689 -0.09593  0.28019  1.75622 

Coefficients:
             Estimate Std. Error t value Pr(>|t|)  
(Intercept)  0.214037   0.159619   1.341   0.1847  
z.lag.1     -0.037551   0.035179  -1.067   0.2898  
tt           0.002646   0.006719   0.394   0.6950  
z.diff.lag   0.312849   0.121616   2.572   0.0124 *
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.6123 on 64 degrees of freedom
Multiple R-squared:  0.1134,    Adjusted R-squared:  0.07182 
F-statistic: 2.728 on 3 and 64 DF,  p-value: 0.05122


Value of test-statistic is: -1.0674 0.8323 0.9375 

Critical values for test statistics: 
      1pct  5pct 10pct
tau3 -4.04 -3.45 -3.15
phi2  6.50  4.88  4.16
phi3  8.73  6.49  5.47

la trend n’est pas significative. On teste donc avec le drift

summary(ur.df(donnees$unemp, type="drift"))

############################################### 
# Augmented Dickey-Fuller Test Unit Root Test # 
############################################### 

Test regression drift 


Call:
lm(formula = z.diff ~ z.lag.1 + 1 + z.diff.lag)

Residuals:
     Min       1Q   Median       3Q      Max 
-1.65504 -0.37445 -0.08824  0.29124  1.80355 

Coefficients:
            Estimate Std. Error t value Pr(>|t|)  
(Intercept)  0.23291    0.15126   1.540   0.1285  
z.lag.1     -0.02613    0.01980  -1.320   0.1914  
z.diff.lag   0.30168    0.11749   2.568   0.0125 *
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.6083 on 65 degrees of freedom
Multiple R-squared:  0.1112,    Adjusted R-squared:  0.08389 
F-statistic: 4.067 on 2 and 65 DF,  p-value: 0.02166


Value of test-statistic is: -1.3201 1.1863 

Critical values for test statistics: 
      1pct  5pct 10pct
tau2 -3.51 -2.89 -2.58
phi1  6.70  4.71  3.86

La constante est significative, et la série n’est pas stationnaire. On en conclut donc que la série de chômage est un DS, qu’il faut passer en différence première pour stationnariser.

donnees <- donnees %>%
  mutate(dunemp = unemp - lag(unemp))%>%
  na.omit()

summary(ur.df(donnees$dunemp))

############################################### 
# Augmented Dickey-Fuller Test Unit Root Test # 
############################################### 

Test regression none 


Call:
lm(formula = z.diff ~ z.lag.1 - 1 + z.diff.lag)

Residuals:
     Min       1Q   Median       3Q      Max 
-1.70353 -0.31249  0.02489  0.32736  1.89772 

Coefficients:
           Estimate Std. Error t value Pr(>|t|)    
z.lag.1    -0.64331    0.14524  -4.429 3.71e-05 ***
z.diff.lag -0.06672    0.12349  -0.540    0.591    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.6147 on 65 degrees of freedom
Multiple R-squared:  0.3485,    Adjusted R-squared:  0.3285 
F-statistic: 17.39 on 2 and 65 DF,  p-value: 8.943e-07


Value of test-statistic is: -4.4292 

Critical values for test statistics: 
     1pct  5pct 10pct
tau1 -2.6 -1.95 -1.61

la série de chômage en différence est stationnaire en différence première, donc intégrée d’ordre 1 : \(I(1)\).

Régression linéaire univariée

Maintenant, on sait que les deux séries sont stationnaires lorsqu’elles sont passées en différence première. On peut donc mener la régression avec les séries stationnaires :

regression_stationnaire <- feols( dinflation ~ dunemp, data=donnees)
etable(regression_stationnaire)
                regression_sta..
Dependent Var.:       dinflation
                                
Constant        -0.1538 (0.3101)
dunemp          -0.7342 (0.4905)
_______________ ________________
S.E. type                    IID
Observations                  69
R2                       0.03236
Adj. R2                  0.01791
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

On voit ici que le coefficient associé au chômage n’est pas significatif à 5%. Autrement dit, la courbe de Phillips n’est pas valide. Il n’y a donc pas d’arbitrage entre inflation et chômage.

En revanche, un problème apparaît ici : on a fait une régression avec deux variables qui sont intégrées du même ordre : \[\begin{align*} & dinflation \sim I(1) \\ & dunemp \sim I(1) \end{align*}\] Et la co-intégration (intégration du même ordre) peut biaiser le coefficient, il convient alors d’utiliser un modèle qui corrige cette co-intégration : le Modèle à Correction d’Erreurs (voir séance 7 sur la Cointégration et les Modèles à Correction d’Erreurs).

LS0tDQp0aXRsZTogIlIgTm90ZWJvb2sgOiBSw6lncmVzc2lvbiBMaW7DqWFpcmUgIg0Kb3V0cHV0OiBodG1sX25vdGVib29rDQpodG1sX25vdGVib29rOiANCiAgICB0b2M6IHRydWUgIyBwb3VyIGFmZmljaGVyIHVuZSB0YWJsZSBkZXMgbWF0acOocmVzIGF1IGTDqWJ1dCBkdSBkb2N1bWVudCAoVGFibGUgb2YgQ29udGVudCkNCiAgICB0b2NfZGVwdGg6IDQgIyBsZSBuaXZlYXUgZCdhZmZpY2hhZ2UgZGVzIHRpdHJlcywgc291cy10aXRyZXMsIHNlY3Rpb24uLi4gDQogICAgdG9jX2Zsb2F0OiBmYWxzZQ0KZWRpdG9yX29wdGlvbnM6IA0KICBtYXJrZG93bjogDQogICAgd3JhcDogNzINCi0tLQ0KDQpgYGB7ciwgd2FybmluZz1GQUxTRSwgaW5jbHVkZT1GQUxTRX0NCnNldHdkKGRpciA9ICJDOi9Vc2Vycy9ma3JhdXMvRGVza3RvcC9URC8yMDI1LTIwMjYvRUNPTk9NRVRSSUUvc8OpYW5jZTMiKQ0KcmVxdWlyZSh0aWR5dmVyc2UpDQpyZXF1aXJlKHJlYWR4bCkNCnJlcXVpcmUoZml4ZXN0KQ0KcmVxdWlyZSh1cmNhKQ0KYGBgDQoNCiMgSW50cm9kdWN0aW9uDQoNCkxlcyBtb2TDqGxlcyBkZSByw6lncmVzc2lvbiBsaW7DqWFpcmUgcGFyIGxlcyBNb2luZHJlcyBDYXJyw6lzIE9yZGluYWlyZXMNCihNQ08pIHNvbnQgZGVzIG1vZMOobGVzIGQnZXN0aW1hdGlvbiBkZSByZWxhdGlvbnMgZW50cmUgdW5lIHZhcmlhYmxlDQoqKmVuZG9nw6huZSoqICRZX3QkIChvdSB2YXJpYWJsZSBleHBsaXF1w6llKSwgZXQgdW5lIG91IHBsdXNpZXVycw0KdmFyaWFibGVzIGRpdGVzICoqZXhvZ8OobmVzKiogJFhfe24sdH0kIChvdSB2YXJpYWJsZXMgZXhwbGljYXRpdmVzKS4NCkMnZXN0IGwndW4gZGVzICh2b2lyZSwgbGUpIG1vZMOobGVzIGxlcyBwbHVzIHNpbXBsZXMgZW4gw6ljb25vbcOpdHJpZSwgbWFpcw0KcXVpIHBldXQgw6p0cmUgdHLDqHMgZWZmaWNhY2UgcydpbCBlc3QgYmllbiBtZW7DqSBldCBxdWUgbGVzIGRvbm7DqWVzIHMneQ0KcHLDqnRlbnQuDQoNCk5vdGFtbWVudCwgdW5lIGRlcyBoeXBvdGjDqHNlcyBxdWkgZXN0IHBvc8OpZSBwYXIgbGUgbW9kw6hsZSBkZSByZWdyZXNzaW9uDQpsaW7DqWFpcmUgcGFyIGxlcyBNQ08gZXN0IGwnKipleG9nw6luw6lpdMOpIGRlcyB2YXJpYWJsZXMgZXhwbGljYXRpdmVzLioqDQpBdXRyZW1lbnQgZGl0LCBvbiB0ZXN0ZSBsJ2ltcGFjdCBkZSAkWF90JCBzdXIgJFlfdCQgKipzb3VzIGwnaHlwb3Row6hzZQ0KcXVlKiogJFlfdCQgbidpbmZsdWVuY2UgcGFzICRYX3QkLiBDZWxhIGltcGxpcXVlIGwnYWJzZW5jZSBkZSBjYXVzYWxpdMOpDQppbnZlcnNlIGV0L291IGRlIHNpbXVsdGFuw6lpdMOpIGVudHJlICRYX3QkIGV0ICRZX3QkLiBFbiBnw6luw6lyYWwsIHNpIG9uDQpwZW5zZSBxdSdpbCB5IGEgY2V0dGUgY2F1c2FsaXTDqSBpbnZlcnNlIG91IGNlIGJpYWlzIGRlIHNpbXVsdGFuw6lpdMOpLCBvbg0KcHLDqWbDqHJlIG9wdGVyIHBvdXIgZCdhdXRyZXMgdHlwZXMgZGUgbW9kw6hsZXMgKG1vZMOobGVzIFZBUiBub3RhbW1lbnQpDQptw6ptZSBzaSBkZXMgc3DDqWNpZmljYXRpb25zIGFsdGVybmF0aXZlcyBkZSBtb2TDqGxlIHBldXZlbnQgcGFyZm9pcyByw6lnbGVyDQpsZSBwcm9ibMOobWUgKG1vZMOobGVzIEFSREwpLg0KDQpVbmUgYXV0cmUgaHlwb3Row6hzZSBlc3QgcXUnaWwgbid5IGEgcGFzIGRlICoqYmlhaXMgZGUgdmFyaWFibGUgb21pc2UqKiA6IGxlDQptb2TDqGxlIGV4cGxpcXVlIHN1ZmZpc2FtbWVudCAkWV90JCBwb3VyIHF1ZSBsZXMgcsOpc2lkdXMsIHF1aQ0KcmVwcsOpc2VudGUgbGEgZHluYW1pcXVlIGRlICRZX3QkICpzaSBlbGxlIG4nw6l0YWl0IGltcGFjdMOpZSBwYXIgcmllbg0KZCdhdXRyZSBxdWUgcGFyIHNlcyBwcm9wcmVzIGNob2NzKiwgc29pZW50IG5vbi1hdXRvY29ycsOpbMOpcyBldCBzdWl2ZW50DQp1bmUgbG9pIE5vcm1hbGUgY2VudHLDqWUgcsOpZHVpdGUgZGUgdmFyaWFuY2UgY29uc3RhbnRlLiBBdXRyZW1lbnQgZGl0LCBsYQ0KZHluYW1pcXVlIGRlcyByw6lzaWR1cyByZXByw6lzZW50ZW50IGxhIGR5bmFtaXF1ZSBkZSAkWV90JCBhIHNvbiAqKsOpdGF0DQpzdGF0aW9ubmFpcmUqKi4NCg0KRW5maW4sIGxlIGJpYWlzIGRlIHZhcmlhYmxlIG9taXNlIHBvdXJyYWl0IGluY2l0ZXIgw6AgaW5jbHVyZSBsYSB0b3RhbGl0w6kNCmRlcyB2YXJpYWJsZXMgZGlzcG9uaWJsZXMgZGFucyBsZSBtb25kZS4gQ2VwZW5kYW50LCBjZWxhIHBldXQgY3LDqWVyIHVuDQpiaWFpcyBpbXBvcnRhbnQgOiBsZSAqKmJhZCBjb250cm9sKiouIFBhciBleGVtcGxlLCBzaSBvbiB2ZXV0IGVzdGltZXINCmwnaW1wYWN0IGRlICRYX3sxLHR9JCBldCBkZSAkWF97Mix0fSQgc3VyICRZX3QkIG1haXMgcXUnZW4gbcOqbWUgdGVtcHMsDQokWF8xJCBpbXBhY3RlICRYXzIkLCBhbG9ycyBsJ2VzdGltYXRpb24gZHUgY29lZmZpY2llbnQgYXNzb2Npw6kgw6AgJFhfMiQNCnZhIMOqdHJlIGJpYWlzw6kgcGFyIGNlIGxpZW4uIElsIGZhdXQgZG9uYyByZXNwZWN0ZXIgbGUgKipwcmluY2lwZSBkZQ0KcGFyc2ltb25pZSoqIDogZW4gZmFpcmUgc3VmZmlzYW1tZW50LCBtYWlzIG5lIHBhcyBlbiBmYWlyZSB0cm9wLg0KDQojIyMgTW9kw6hsZSBkZSBSw6lncmVzc2lvbiBMaW7DqWFpcmUgKipVbml2YXJpw6kqKg0KDQpgYGB7PXRleH0NClxiZWdpbntlcXVhdGlvbn0NCllfdCA9IGFfMCArIFxiZXRhIFhfdCArIFx2YXJlcHNpbG9uX3QNClxlbmR7ZXF1YXRpb259DQpgYGANCiMjIyBNb2TDqGxlIGRlIFLDqWdyZXNzaW9uIExpbsOpYWlyZSAqKk11bHRpdmFyacOpKioNCg0KYGBgez10ZXh9DQpcYmVnaW57ZXF1YXRpb259DQpZX3QgPSBhXzAgKyBcYmV0YV8xIFhfezEsdH0rIFxiZXRhXzIgWF97Mix0fSArIFxiZXRhXzMgWF97Myx0fSArIFx2YXJlcHNpbG9uX3QNClxlbmR7ZXF1YXRpb259DQpgYGANCiMjIyBNb2TDqGxlIGRlIFLDqWdyZXNzaW9uICoqTm9uLUxpbsOpYWlyZSoqIFVuaXZhcmnDqQ0KDQpgYGB7PXRleH0NClxiZWdpbntlcXVhdGlvbn0NCllfdCA9IGFfMCArIFxiZXRhXzEgWF97MSx0fSsgXGJldGFfMiBYX3syLHR9ICsgXGJldGFfMyBYX3syLHR9XjIgKyBcdmFyZXBzaWxvbl90DQpcZW5ke2VxdWF0aW9ufQ0KYGBgDQojIENvdXJiZSBkZSBQaGlsbGlwcw0KDQpPbiB2YSDDqXR1ZGllciBpY2kgbGEgdmFsaWRpdMOpIGRlIGxhICoqY291cmJlIGRlIFBoaWxsaXBzKiogcG91ciBsYQ0KRnJhbmNlLiBMYSBjb3VyYmUgZGUgUGhpbGxpcHBzIGlsbHVzdHJlIGxhICoqcmVsYXRpb24gaW52ZXJzZSBlbnRyZSB0YXV4DQpkZSBjaMO0bWFnZSBldCB0YXV4IGQnaW5mbGF0aW9uKiogZMOpbW9udHLDqWUgKiplbXBpcmlxdWVtZW50KiogcGFyDQpsJ8OpY29ub21pc3RlIG7DqW8tesOpbGFuZGFpcyAqKldpbGxpYW0gUGhpbGxpcHMqKiBlbiAxOTU4LiBMZSBjb25jZXB0IGENCmVuc3VpdGUgw6l0w6kgcmVwcmlzIHBhciAqKlNhbXVlbHNvbioqIGV0ICoqU29sb3cqKiBkYW5zIGxlIGTDqXZlbG9wcGVtZW50DQpkZXMgbW9kw6hsZXMgbsOpby1rZXluw6lzaWVucy4NCg0KQWZpbiBkZSBqdXN0aWZpZXIgY2V0dGUgcmVsYXRpb24gc3VyIGxlIHBsYW4gKip0aMOpb3JpcXVlKiosDQpsJ2V4cGxpY2F0aW9uIGxhIHBsdXMgcG9wdWxhaXJlIHNlIGZvbmRlIHN1ciBsZXMgcG91dm9pcnMgZGUgbsOpZ29jaWF0aW9uDQpkZXMgc2FsYXJpw6lzLiAqKkxvcnNxdWUgbGUgdGF1eCBkZSBjaMO0bWFnZSBlc3QgaGF1dCwgbGVzIHNhbGFyacOpcyBzb250DQoiZmFjaWxlbWVudCIgcmVtcGxhw6dhYmxlcyBkYW5zIGxlcyBlbnRyZXByaXNlcyoqLiBJbHMgbmUgcGV1dmVudCBkb25jDQoqKnBhcyBuw6lnb2NpZXIgZGUgaGF1c3NlIGRlIHNhbGFpcmVzKiogY2FyIGxlcyBlbnRyZXByaXNlcyBsZXMNCnJlbXBsYcOnZXJhaWVudCBwYXIgZCdhdXRyZXMgYXUgY2jDtG1hZ2UuICoqU2kgbGVzIHNhbGFpcmVzIG4nYXVnbWVudGVudA0KcGFzKiosIGxlcyBwcml4IHByYXRpcXXDqXMgcGFyIGxlcyBlbnRyZXByaXNlcyBuJ29udCBwYXMgZGUgcmFpc29uDQpkJ2F1Z21lbnRlciAocGFyY2UgcXVlIGxlcyBjb8O7dHMgbidhdWdtZW50ZW50IHBhcyBkJ3VuZSBwYXJ0LCBldCBwYXJjZQ0KcXVlIGxhIGRlbWFuZGUgbidhdWdtZW50ZSBwYXMgZCdhdXRyZSBwYXJ0KSwgZG9uYyBsJyoqaW5mbGF0aW9uDQpuJ2F1Z21lbnRlIHBhcy4qKiBBIGNvbnRyYXJpbywgbG9yc3F1ZSBsZSB0YXV4IGRlIGNow7RtYWdlIGVzdCBmYWlibGUsDQpsZXMgc2FsYXJpw6lzIG9udCB1biBwb3V2b2lyIGRlIG7DqWdvY2lhdGlvbiBpbXBvcnRhbnQuIElscyB2b250IGRvbmMNCmRlbWFuZGVyIGRlcyBoYXVzc2VzIGRlIHNhbGFpcmUsIGNlIHF1aSB2YSBzZSByw6lwZXJjdXRlciBzdXIgbGVzIHByaXguDQoNCklsIHkgYXVyYWl0IGRvbmMgdW4gYXJiaXRyYWdlIMOgIGVmZmVjdHVlci4gRW4gZWZmZXQsIGxlcyBCYW5xdWVzDQpDZW50cmFsZXMgb250IHBvdXIgbWlzc2lvbiBkZSBzdGFiaWxpc2VyIGwnaW5mbGF0aW9uIMOgIHVuIG5pdmVhdSBmYWlibGUuDQoqKkxhIHZhbGlkaXTDqSBkZSBsYSBjb3VyYmUgZGUgUGhpbGxpcHMgaW1wbGlxdWUgZG9uYyBxdWUgY2V0dGUgaW5mbGF0aW9uDQpmYWlibGUgZW50cmHDrm5lIG3DqWNhbmlxdWVtZW50IHVuIGNow7RtYWdlIHN0cnVjdHVyZWwgcGVybWFuZW50IGV0DQpsJ2ltcG9zc2liaWxpdMOpIGR1IFBsZWluLUVtcGxvaSoqLiBNYWlzIGRhbnMgbGUgbcOqbWUgdGVtcHMsIGxlcyBFdGF0cw0KKGV0IGxlcyBwb3V2b2lycyDDqWx1cykgb250IHVuIGludMOpcsOqdCBkJ2F0dGVpbmRyZSBsZSBQbGVpbi1FbXBsb2kgKHBvdXINCsOqdHJlIHLDqcOpbHVzKSwgZG9uYyDDoCBtZW5lciBkZXMgcG9saXRpcXVlcyBtb27DqXRhaXJlIGFjY29tb2RhbnRlcyBxdWkNCmVudHJhw65uZW50IHVuZSBoYXVzc2UgZGUgbCdpbmZsYXRpb24gc3VyIGxlIGxvbmctdGVybWUuIExlcyBzb2Npw6l0w6lzDQpkb2l2ZW50IGRvbmMgY2hvaXNpciwgZW50cmUgbCdpbmZsYXRpb24gZXQgbGUgY2jDtG1hZ2UuDQoNCmBgYHs9dGV4fQ0KXGJlZ2lue2VxdWF0aW9ufQ0KIFxwaV90ID0gYV8wICsgXGJldGEgIFVfdCArIFx2YXJlcHNpbG9uX3QNClxlbmR7ZXF1YXRpb259DQpgYGANCm/DuSAkVV90JCBlc3QgbGUgdGF1eCBkZSBjaMO0bWFnZSAoZW4gJSkgZGUgbGEgRnJhbmNlIGVudHJlIDE5NjAgZXQgMjAyMCwNCiRccGlfdCQgZXN0IGwnaW5mbGF0aW9uIHN1ciBsYSBtw6ptZSBww6lyaW9kZSBlbiBGcmFuY2UsIG1lc3Vyw6llIGNvbW1lIGxhDQpkaWZmw6lyZW5jZSBkZSBsb2dhcml0aG1lLCBldCAkXHZhcmVwc2lsb25fdCQgcmVwcsOpc2VudGVudCBsZXMgcsOpc2lkdXMuDQoNCiMjIERvbm7DqWVzDQoNCmBgYHtyfQ0KZG9ubmVlcyA8LSByZWFkX2V4Y2VsKCJDOi9Vc2Vycy9ma3JhdXMvRGVza3RvcC9kYXRhX3NjaHVsYXJpY2sueGxzeCIpICU+JQ0KICBmaWx0ZXIoY291bnRyeSA9PSAiRnJhbmNlIikgJT4lDQogIHNlbGVjdCh5ZWFyLCB1bmVtcCwgY3BpKSAlPiUNCiAgbXV0YXRlKGluZmxhdGlvbiA9IChsb2coY3BpKSAtIGxhZyhsb2coY3BpKSkpKjEwMCklPiUNCiAgbmEub21pdCgpJT4lDQogIGZpbHRlcih5ZWFyID49IDE5NTApDQogIA0KZG9ubmVlcw0KYGBgDQoNCmBgYHtyfQ0KZ2dwbG90KGRvbm5lZXMsIGFlcyh4PXllYXIsIHk9aW5mbGF0aW9uKSkrDQogIGdlb21fbGluZShsd2Q9MSkrDQogIGdlb21fbGluZShhZXMoeT11bmVtcCksIGNvbD0icmVkIiwgbHdkPTEpKw0KICB0aGVtZV9idygpDQpgYGANCg0KT24gdm9pdCBxdWUgZGFucyBsJ2Vuc2VtYmxlIHN1ciBsYSBww6lyaW9kZSwgaW5mbGF0aW9uIGV0IGNow7RtYWdlIHRlbmRlbnQNCsOgIGF2b2lyIHVuZSBkeW5hbWlxdWUgb3Bwb3PDqWUgOiBsJ2luZmxhdGlvbiBlc3QgaGF1dGUgbG9yc3F1ZSBsZSBjaMO0bWFnZQ0KZXN0IGJhcywgZXQgaW52ZXJzZW1lbnQuDQoNCiMjIFJlbGF0aW9uIEluZmxhdGlvbi1DaMO0bWFnZQ0KDQpMZSBtZWlsbGV1ciBtb3llbiBkZSB2aXN1YWxpc2VyIGxhIHJlbGF0aW9uIGVudHJlIGRldXggdmFyaWFibGVzIChlbg0KdG91dCBjYXMsIHBvdXIgbGVzIG1vZMOobGVzIHVuaXZhcmnDqXMpIGVzdCBkZSB0cmFjZXJsZSBudWFnZSBkZSBwb2ludA0KZW50cmUgbGVzIGRldXggdmFyaWFibGVzIDoNCg0KYGBge3J9DQpnZ3Bsb3QoZG9ubmVlcywgYWVzKHg9dW5lbXAsIHk9aW5mbGF0aW9uKSkrDQogIGdlb21fcG9pbnQoKSsNCiAgZ2VvbV9zbW9vdGgobWV0aG9kPSJsbSIpKw0KICB0aGVtZV9idygpDQpgYGANCg0KSWwgc2VtYmxlIHkgYXZvaXIgdW5lIHJlbGF0aW9uIG7DqWdhdGl2ZSBldCBzaWduaWZpY2F0aXZlIGVudHJlIGxlIHRhdXgNCmQnaW5mbGF0aW9uIGV0IGxlIHRhdXggZGUgY2jDtG1hZ2UuIE9uIHBldXQgbGUgdsOpcmlmaWVyIGF2ZWMgbGENCnLDqWdyZXNzaW9uIGRpcmVjdGVtZW50IDoNCg0KYGBge3J9DQpyZWdyZXNzaW9uIDwtIGZlb2xzKGluZmxhdGlvbiB+IHVuZW1wLCBkYXRhPWRvbm5lZXMpDQpldGFibGUocmVncmVzc2lvbikNCmBgYA0KDQpPbiB2b2l0IGVmZmVjdGl2ZW1lbnQgbCdpbXBhY3QgbsOpZ2F0aWYgZXQgc2lnbmlmaWNhdGlmIGRlIGwnaW5mbGF0aW9uDQpzdXIgbGUgdGF1eCBkZSBjaMO0bWFnZS4gRCdhcHLDqHMgbGVzIGNvZWZmaWNpZW50cywgdW5lIGF1Z21lbnRhdGlvbiBkdQ0KdGF1eCBkZSBjaMO0bWFnZSBkJ3VuZSB1bml0w6kgKHVuIHBvaW50IGRlIHBvdXJjZW50YWdlIGVuIGwnb2NjdXJlbmNlKSwgbGUNCnRhdXggZCdpbmZsYXRpb24gdGVuZCDDoCBkaW1pbnVlciBkZSAwLjQzIHVuaXTDqXMgKGRvbmMgMC40MyBwb2ludHMgZGUNCnBvdXJjZW50YWdlcykuIEF1dHJlbWVudCBkaXQsIG5vcyByw6lzdWx0YXRzIG1vbnRyZW50IGJpZW4gcXUnaWwgeSBhIHVuDQphcmJpdHJhZ2UgZW50cmUgaW5mbGF0aW9uIGV0IGNow7RtYWdlLg0KDQpFbiByZXZhbmNoZSwgaWwgc2UgcGV1dCBxdWUgY2V0dGUgcmVsYXRpb24gc29pdCBiaWFpc8OpZSA6IG9uIG4nYSBwYXMNCnbDqXJpZmnDqSBsYSBzdGF0aW9ubmFyaXTDqSBkZXMgdmFyaWFibGVzIGluY2x1ZXMgZGFucyBsZSBtb2TDqGxlICENCg0KIyBWw6lyaWZpY2F0aW9uIGRlIGxhIHN0YXRpb25uYXJpdMOpDQoNCiMjIEluZmxhdGlvbg0KDQpgYGB7cn0NCnN1bW1hcnkodXIuZGYoZG9ubmVlcyRpbmZsYXRpb24pKQ0KYGBgDQoNCkxhIHPDqXJpZSBkJ2luZmxhdGlvbiBlbiBuaXZlYXUgbidlc3QgcGFzIHN0YXRpb25uYWlyZSAobGEgdC1zdGF0IG4nZXN0DQpwYXMgaW5mw6lyaWV1cmUgw6AgbGEgdmFsZXVyIGNyaXRpcXVlIMOgIDUlLiBJbCBmYXV0IGRvbmMgZXhwbG9yZXIgbGUgdHlwZQ0KZGUgbm9uLXN0YXRpb25uYXJpdMOpDQoNCmBgYHtyfQ0Kc3VtbWFyeSh1ci5kZihkb25uZWVzJGluZmxhdGlvbiwgdHlwZT0idHJlbmQiKSkNCg0KYGBgDQoNCkxhIHRyZW5kIGVzdCBzaWduaWZpY2F0aXZlLCBldCBsZSBjb2VmZmljaWVudCBkJ2F1dG9jb3Jyw6lsYXRpb24gZXN0DQrDqWdhbGVtZW50IHNpZ25pZmljYXRpZi4gTCdpbmZsYXRpb24gc3VpdCBkb25jIHVuIHByb2Nlc3N1cyBEUywgcXUnaWwNCmZhdXQgcGFzc2VyIGVuIGRpZmbDqXJlbmNlIHBvdXIgc3RhdGlvbm5hcmlzZXINCg0KYGBge3J9DQpkb25uZWVzIDwtIGRvbm5lZXMgJT4lDQogIG11dGF0ZShkaW5mbGF0aW9uID0gaW5mbGF0aW9uIC0gbGFnKGluZmxhdGlvbikpJT4lDQogIG5hLm9taXQoKQ0KDQpzdW1tYXJ5KHVyLmRmKGRvbm5lZXMkZGluZmxhdGlvbikpDQpgYGANCg0KTGEgc8OpcmllIGQnaW5mbGF0aW9uIGVuIGRpZmbDqXJlbmNlIGVzdCBzdGF0aW9ubmFpcmUgZW4gZGlmZsOpcmVuY2UNCnByZW1pw6hyZSwgZWxsZSBlc3QgaW50w6lncsOpZSBkJ29yZHJlIDE6ICRJKDEpJA0KDQojIyBDaMO0bWFnZQ0KDQpgYGB7cn0NCnN1bW1hcnkodXIuZGYoZG9ubmVlcyR1bmVtcCwgdHlwZT0ibm9uZSIpKQ0KYGBgDQoNCkxhIHPDqXJpZSBkZSBjaMO0bWFnZSBuJ2VzdCBwYXMgc3RhdGlvbm5haXJlIGVuIG5pdmVhdS4gT24gcmVnYXJkZSBkb25jIGxlDQp0eXBlIGRlIG5vbi1zdGF0aW9ubmFyaXTDqQ0KDQpgYGB7cn0NCnN1bW1hcnkodXIuZGYoZG9ubmVlcyR1bmVtcCwgdHlwZT0idHJlbmQiKSkNCmBgYA0KDQpsYSB0cmVuZCBuJ2VzdCBwYXMgc2lnbmlmaWNhdGl2ZS4gT24gdGVzdGUgZG9uYyBhdmVjIGxlIGRyaWZ0DQoNCmBgYHtyfQ0Kc3VtbWFyeSh1ci5kZihkb25uZWVzJHVuZW1wLCB0eXBlPSJkcmlmdCIpKQ0KYGBgDQoNCkxhIGNvbnN0YW50ZSBlc3Qgc2lnbmlmaWNhdGl2ZSwgZXQgbGEgc8OpcmllIG4nZXN0IHBhcyBzdGF0aW9ubmFpcmUuIE9uDQplbiBjb25jbHV0IGRvbmMgcXVlIGxhIHPDqXJpZSBkZSBjaMO0bWFnZSBlc3QgdW4gRFMsIHF1J2lsIGZhdXQgcGFzc2VyIGVuDQpkaWZmw6lyZW5jZSBwcmVtacOocmUgcG91ciBzdGF0aW9ubmFyaXNlci4NCg0KYGBge3J9DQpkb25uZWVzIDwtIGRvbm5lZXMgJT4lDQogIG11dGF0ZShkdW5lbXAgPSB1bmVtcCAtIGxhZyh1bmVtcCkpJT4lDQogIG5hLm9taXQoKQ0KDQpzdW1tYXJ5KHVyLmRmKGRvbm5lZXMkZHVuZW1wKSkNCmBgYA0KDQpsYSBzw6lyaWUgZGUgY2jDtG1hZ2UgZW4gZGlmZsOpcmVuY2UgZXN0IHN0YXRpb25uYWlyZSBlbiBkaWZmw6lyZW5jZQ0KcHJlbWnDqHJlLCBkb25jIGludMOpZ3LDqWUgZCdvcmRyZSAxIDogJEkoMSkkLg0KDQojIFLDqWdyZXNzaW9uIGxpbsOpYWlyZSB1bml2YXJpw6llDQoNCk1haW50ZW5hbnQsIG9uIHNhaXQgcXVlIGxlcyBkZXV4IHPDqXJpZXMgc29udCBzdGF0aW9ubmFpcmVzIGxvcnNxdSdlbGxlcw0Kc29udCBwYXNzw6llcyBlbiBkaWZmw6lyZW5jZSBwcmVtacOocmUuIE9uIHBldXQgZG9uYyBtZW5lciBsYSByw6lncmVzc2lvbg0KYXZlYyBsZXMgc8OpcmllcyBzdGF0aW9ubmFpcmVzIDoNCg0KYGBge3J9DQpyZWdyZXNzaW9uX3N0YXRpb25uYWlyZSA8LSBmZW9scyggZGluZmxhdGlvbiB+IGR1bmVtcCwgZGF0YT1kb25uZWVzKQ0KZXRhYmxlKHJlZ3Jlc3Npb25fc3RhdGlvbm5haXJlKQ0KYGBgDQoNCk9uIHZvaXQgaWNpIHF1ZSBsZSBjb2VmZmljaWVudCBhc3NvY2nDqSBhdSBjaMO0bWFnZSBuJ2VzdCBwYXMgc2lnbmlmaWNhdGlmDQrDoCA1JS4gQXV0cmVtZW50IGRpdCwgbGEgY291cmJlIGRlIFBoaWxsaXBzIG4nZXN0IHBhcyB2YWxpZGUuIElsIG4neSBhDQpkb25jIHBhcyBkJ2FyYml0cmFnZSBlbnRyZSBpbmZsYXRpb24gZXQgY2jDtG1hZ2UuDQoNCkVuIHJldmFuY2hlLCB1biBwcm9ibMOobWUgYXBwYXJhw650IGljaSA6IG9uIGEgZmFpdCB1bmUgcsOpZ3Jlc3Npb24gYXZlYw0KZGV1eCB2YXJpYWJsZXMgcXVpIHNvbnQgaW50w6lncsOpZXMgZHUgbcOqbWUgb3JkcmUgOiBcYmVnaW57YWxpZ24qfQ0KJiBkaW5mbGF0aW9uIFxzaW0gSSgxKSBcXA0KJiBkdW5lbXAgXHNpbSBJKDEpDQpcZW5ke2FsaWduKn0gRXQgbGEgKipjby1pbnTDqWdyYXRpb24qKiAoaW50w6lncmF0aW9uIGR1IG3Dqm1lIG9yZHJlKSBwZXV0DQpiaWFpc2VyIGxlIGNvZWZmaWNpZW50LCBpbCBjb252aWVudCBhbG9ycyBkJ3V0aWxpc2VyIHVuIG1vZMOobGUgcXVpDQpjb3JyaWdlIGNldHRlIGNvLWludMOpZ3JhdGlvbiA6IGxlICoqTW9kw6hsZSDDoCBDb3JyZWN0aW9uIGQnRXJyZXVycyoqDQoodm9pciBzw6lhbmNlIDcgc3VyIGxhIENvaW50w6lncmF0aW9uIGV0IGxlcyBNb2TDqGxlcyDDoCBDb3JyZWN0aW9uDQpkJ0VycmV1cnMpLg0KDQo=