Caroline Patenaude
Bibliothécaire - Bibliothèque des lettres et sciences humaines

Script Colab | Script R



1. Analyses statistiques

  • On retrouve une multitude de modules dédiés aux méthodes statistiques (comme stats, MASS, FactoMineR, plm, glm).
  • La même méthode peut se trouver avec variantes dans plusieurs modules.
  • Les exemples ci-dessous proviennent principalement du module stats (module par défaut) où l’on retrouve de nombreuses fonctions pour différents types d’analyse.


1.1. Notation formule et objet modèle

  • Souvent utilisé dans les modèles d’analyse (régressions…) et les graphiques.
  • Peut s’interpréter comme en “fonction de…”: variable dépendante (effet) en fonction (~) de la var indépendante (cause).
  • Toutes les fonctions n’acceptent pas la notation formule, mais est utilisée pour la plupart des modèles d’analyse.
  • On stocke l’analyse dans un objet qui contiendra les résultats qui, selon l’analyse, inclueront un ensemble d’éléments d’information auxquels on pourra accéder de deux façons:

En passant notre objet-modèle à différentes fonctions génériques (selon le type de test):

En utilisant la fonction names(NomObjet) et en sélectionnant individuellement le nom de l’élément avec l’opérateur $:


À noter: par défaut les résultats sont présentés selon la notation scientifique. Pour la désactiver utiliser l’instruction: options(scipen = 999). Pour la réactiver: options(scipen = 0)


1.2. Les modalités de référence

  • Dans R, il n’est pas nécessaire de recoder ses variables en “dummy”, les analyses s’en chargent par défaut lorsqu’on utilise des variables qualitatives.
  • Mais attention à la modalité de référence des facteurs définie par défaut: la première dans la liste des niveaux.
## [1] "Non" "Oui"


2. Intervalle de confiance

## 
##  1-sample proportions test with continuity correction
## 
## data:  table(bd$sport), null probability 0.5
## X-squared = 152.9, df = 1, p-value < 0.00000000000000022
## alternative hypothesis: true p is not equal to 0.5
## 95 percent confidence interval:
##  0.3404821 0.3830553
## sample estimates:
##      p 
## 0.3615
## 
##  1-sample proportions test with continuity correction
## 
## data:  table(relevel(bd$sport, "Oui")), null probability 0.5
## X-squared = 152.9, df = 1, p-value < 0.00000000000000022
## alternative hypothesis: true p is not equal to 0.5
## 95 percent confidence interval:
##  0.3404821 0.3830553
## sample estimates:
##      p 
## 0.3615
## 
##  One Sample t-test
## 
## data:  bd$age
## t = 127.12, df = 1999, p-value < 0.00000000000000022
## alternative hypothesis: true mean is not equal to 0
## 99 percent confidence interval:
##  47.18027 49.13373
## sample estimates:
## mean of x 
##    48.157


3. Test du Khi-carré

## 
##  Pearson's Chi-squared test with Yates' continuity correction
## 
## data:  bd$sport and bd$sexe
## X-squared = 16.574, df = 1, p-value = 0.00004679
## [1] "statistic" "parameter" "p.value"   "method"    "data.name" "observed" 
## [7] "expected"  "residuals" "stdres"
##         bd$sexe
## bd$sport    Homme    Femme
##      Oui 324.9885 398.0115
##      Non 574.0115 702.9885
##      
##       Homme Femme
##   Oui  2.44 -2.21
##   Non -1.84  1.66


4. Test de fisher

## 
##  Fisher's Exact Test for Count Data
## 
## data:  bd$sport and bd$sexe
## p-value = 0.00004629
## alternative hypothesis: true odds ratio is not equal to 1
## 95 percent confidence interval:
##  1.217630 1.772444
## sample estimates:
## odds ratio 
##   1.468833


5. Différence de moyennes entre deux groupes (Test T)

Vérifier si les moyennes d’une variable quantitative de deux groupes sont statistiquement différentes

## bd$sport: Oui
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   18.00   29.00   39.00   40.93   51.50   89.00 
## ------------------------------------------------------------ 
## bd$sport: Non
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   18.00   40.00   52.00   52.25   64.00   97.00
## bd$sport: Oui
## [1] 231.8337
## ------------------------------------------------------------ 
## bd$sport: Non
## [1] 272.0692
## bd$sport: Oui
## 
##  Shapiro-Wilk normality test
## 
## data:  dd[x, ]
## W = 0.96203, p-value = 0.0000000000009734
## 
## ------------------------------------------------------------ 
## bd$sport: Non
## 
##  Shapiro-Wilk normality test
## 
## data:  dd[x, ]
## W = 0.98844, p-value = 0.00000001654
## 
##  F test to compare two variances
## 
## data:  age by sport
## F = 0.85211, num df = 722, denom df = 1276, p-value = 0.01621
## alternative hypothesis: true ratio of variances is not equal to 1
## 95 percent confidence interval:
##  0.7497388 0.9707395
## sample estimates:
## ratio of variances 
##          0.8521131
## Levene's Test for Homogeneity of Variance (center = median)
##         Df F value   Pr(>F)   
## group    1  7.5237 0.006144 **
##       1998                    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
##  Welch Two Sample t-test
## 
## data:  age by sport
## t = -15.503, df = 1600.4, p-value < 0.00000000000000022
## alternative hypothesis: true difference in means is not equal to 0
## 95 percent confidence interval:
##  -12.759002  -9.893117
## sample estimates:
## mean in group Oui mean in group Non 
##          40.92531          52.25137
## 
##  Two Sample t-test
## 
## data:  age by sport
## t = -15.164, df = 1998, p-value < 0.00000000000000022
## alternative hypothesis: true difference in means is not equal to 0
## 95 percent confidence interval:
##  -12.790849  -9.861269
## sample estimates:
## mean in group Oui mean in group Non 
##          40.92531          52.25137


6. Test Wilcoxon/Mann-Whitney (test non-paramétrique parmi d’autres)

## 
##  Wilcoxon rank sum test with continuity correction
## 
## data:  age by sport
## W = 282694, p-value < 0.00000000000000022
## alternative hypothesis: true location shift is not equal to 0


7. Différence de moyenne pour plus de deux groupes (ANOVA)

Évaluer la relation entre une variable quantitative et une variable qualitative avec plus de deux modalités

## Exerce une profession               Chomeur       Etudiant, eleve 
##              1.821681              2.874809              1.329787 
##              Retraite   Retire des affaires              Au foyer 
##              2.850255              2.624675              2.822222 
##         Autre inactif 
##              3.265060
## Call:
##    aov(formula = heures.tv ~ occup, data = bd)
## 
## Terms:
##                    occup Residuals
## Sum of Squares   616.355  5672.029
## Deg. of Freedom        6      1988
## 
## Residual standard error: 1.689122
## Estimated effects may be unbalanced
## 5 observations deleted due to missingness
##               Df Sum Sq Mean Sq F value              Pr(>F)    
## occup          6    616  102.73   36.01 <0.0000000000000002 ***
## Residuals   1988   5672    2.85                                
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 5 observations deleted due to missingness
## 
## Call:
## lm(formula = heures.tv ~ occup, data = bd)
## 
## Coefficients:
##              (Intercept)              occupChomeur      occupEtudiant, eleve  
##                   1.8217                    1.0531                   -0.4919  
##            occupRetraite  occupRetire des affaires             occupAu foyer  
##                   1.0286                    0.8030                    1.0005  
##       occupAutre inactif  
##                   1.4434
## 
## Call:
## lm(formula = heures.tv ~ occup, data = bd)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -3.2651 -0.8748  0.1497  1.1497  8.7349 
## 
## Coefficients:
##                          Estimate Std. Error t value             Pr(>|t|)    
## (Intercept)                1.8217     0.0522  34.897 < 0.0000000000000002 ***
## occupChomeur               1.0531     0.1565   6.728    0.000000000022489 ***
## occupEtudiant, eleve      -0.4919     0.1819  -2.705               0.0069 ** 
## occupRetraite              1.0286     0.1000  10.284 < 0.0000000000000002 ***
## occupRetire des affaires   0.8030     0.1994   4.026    0.000058832091852 ***
## occupAu foyer              1.0005     0.1393   7.182    0.000000000000969 ***
## occupAutre inactif         1.4434     0.1926   7.494    0.000000000000100 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 1.689 on 1988 degrees of freedom
##   (5 observations deleted due to missingness)
## Multiple R-squared:  0.09801,    Adjusted R-squared:  0.09529 
## F-statistic:    36 on 6 and 1988 DF,  p-value: < 0.00000000000000022
## Analysis of Variance Table
## 
## Response: heures.tv
##             Df Sum Sq Mean Sq F value                Pr(>F)    
## occup        6  616.4 102.726  36.005 < 0.00000000000000022 ***
## Residuals 1988 5672.0   2.853                                  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1


8. Corrélations

## [1] 0.1776249
## 
##  Pearson's product-moment correlation
## 
## data:  bd$age and bd$heures.tv
## t = 8.0578, df = 1993, p-value = 0.000000000000001324
## alternative hypothesis: true correlation is not equal to 0
## 95 percent confidence interval:
##  0.1347898 0.2197974
## sample estimates:
##       cor 
## 0.1776249


9. Régression linéaire

Prédire la valeur d’une variable dépendante continue sur la base des valeurs de variables indépendantes

## 
## Call:
## lm(formula = heures.tv ~ occup + nivetud + sexe, data = bd)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -3.5428 -1.0945 -0.0752  0.8701  8.5809 
## 
## Coefficients:
##                                                                        Estimate
## (Intercept)                                                             2.17632
## occupChomeur                                                            0.98936
## occupEtudiant, eleve                                                   -1.19169
## occupRetraite                                                           0.78918
## occupRetire des affaires                                                0.38809
## occupAu foyer                                                           0.83212
## occupAutre inactif                                                      1.07830
## nivetudA arrete ses etudes, avant la derniere annee d'etudes primaires  0.36670
## nivetudDerniere annee d'etudes primaires                                0.24299
## nivetud1er cycle                                                       -0.07118
## nivetud2eme cycle                                                      -0.43234
## nivetudEnseignement technique ou professionnel court                   -0.10108
## nivetudEnseignement technique ou professionnel long                    -0.24726
## nivetudEnseignement superieur y compris technique superieur            -0.77476
## sexeFemme                                                              -0.07855
##                                                                        Std. Error
## (Intercept)                                                               0.28078
## occupChomeur                                                              0.15680
## occupEtudiant, eleve                                                      0.96901
## occupRetraite                                                             0.10724
## occupRetire des affaires                                                  0.20703
## occupAu foyer                                                             0.14750
## occupAutre inactif                                                        0.19833
## nivetudA arrete ses etudes, avant la derniere annee d'etudes primaires    0.32344
## nivetudDerniere annee d'etudes primaires                                  0.28367
## nivetud1er cycle                                                          0.29391
## nivetud2eme cycle                                                         0.29839
## nivetudEnseignement technique ou professionnel court                      0.28322
## nivetudEnseignement technique ou professionnel long                       0.31042
## nivetudEnseignement superieur y compris technique superieur               0.28492
## sexeFemme                                                                 0.08173
##                                                                        t value
## (Intercept)                                                              7.751
## occupChomeur                                                             6.310
## occupEtudiant, eleve                                                    -1.230
## occupRetraite                                                            7.359
## occupRetire des affaires                                                 1.875
## occupAu foyer                                                            5.642
## occupAutre inactif                                                       5.437
## nivetudA arrete ses etudes, avant la derniere annee d'etudes primaires   1.134
## nivetudDerniere annee d'etudes primaires                                 0.857
## nivetud1er cycle                                                        -0.242
## nivetud2eme cycle                                                       -1.449
## nivetudEnseignement technique ou professionnel court                    -0.357
## nivetudEnseignement technique ou professionnel long                     -0.797
## nivetudEnseignement superieur y compris technique superieur             -2.719
## sexeFemme                                                               -0.961
##                                                                                  Pr(>|t|)
## (Intercept)                                                            0.0000000000000149
## occupChomeur                                                           0.0000000003479586
## occupEtudiant, eleve                                                               0.2189
## occupRetraite                                                          0.0000000000002755
## occupRetire des affaires                                                           0.0610
## occupAu foyer                                                          0.0000000194364641
## occupAutre inactif                                                     0.0000000613298073
## nivetudA arrete ses etudes, avant la derniere annee d'etudes primaires             0.2571
## nivetudDerniere annee d'etudes primaires                                           0.3918
## nivetud1er cycle                                                                   0.8087
## nivetud2eme cycle                                                                  0.1475
## nivetudEnseignement technique ou professionnel court                               0.7212
## nivetudEnseignement technique ou professionnel long                                0.4258
## nivetudEnseignement superieur y compris technique superieur                        0.0066
## sexeFemme                                                                          0.3367
##                                                                           
## (Intercept)                                                            ***
## occupChomeur                                                           ***
## occupEtudiant, eleve                                                      
## occupRetraite                                                          ***
## occupRetire des affaires                                               .  
## occupAu foyer                                                          ***
## occupAutre inactif                                                     ***
## nivetudA arrete ses etudes, avant la derniere annee d'etudes primaires    
## nivetudDerniere annee d'etudes primaires                                  
## nivetud1er cycle                                                          
## nivetud2eme cycle                                                         
## nivetudEnseignement technique ou professionnel court                      
## nivetudEnseignement technique ou professionnel long                       
## nivetudEnseignement superieur y compris technique superieur            ** 
## sexeFemme                                                                 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 1.673 on 1868 degrees of freedom
##   (117 observations deleted due to missingness)
## Multiple R-squared:  0.1303, Adjusted R-squared:  0.1237 
## F-statistic: 19.98 on 14 and 1868 DF,  p-value: < 0.00000000000000022
##                                                            (Intercept) 
##                                                             2.17631672 
##                                                           occupChomeur 
##                                                             0.98936350 
##                                                   occupEtudiant, eleve 
##                                                            -1.19169450 
##                                                          occupRetraite 
##                                                             0.78918380 
##                                               occupRetire des affaires 
##                                                             0.38809384 
##                                                          occupAu foyer 
##                                                             0.83212236 
##                                                     occupAutre inactif 
##                                                             1.07829812 
## nivetudA arrete ses etudes, avant la derniere annee d'etudes primaires 
##                                                             0.36669644 
##                               nivetudDerniere annee d'etudes primaires 
##                                                             0.24298900 
##                                                       nivetud1er cycle 
##                                                            -0.07118351 
##                                                      nivetud2eme cycle 
##                                                            -0.43234458 
##                   nivetudEnseignement technique ou professionnel court 
##                                                            -0.10107621 
##                    nivetudEnseignement technique ou professionnel long 
##                                                            -0.24725960 
##            nivetudEnseignement superieur y compris technique superieur 
##                                                            -0.77475537 
##                                                              sexeFemme 
##                                                            -0.07854815
##                                                                             2.5 %
## (Intercept)                                                             1.6256451
## occupChomeur                                                            0.6818472
## occupEtudiant, eleve                                                   -3.0921436
## occupRetraite                                                           0.5788704
## occupRetire des affaires                                               -0.0179321
## occupAu foyer                                                           0.5428401
## occupAutre inactif                                                      0.6893294
## nivetudA arrete ses etudes, avant la derniere annee d'etudes primaires -0.2676530
## nivetudDerniere annee d'etudes primaires                               -0.3133502
## nivetud1er cycle                                                       -0.6476130
## nivetud2eme cycle                                                      -1.0175659
## nivetudEnseignement technique ou professionnel court                   -0.6565276
## nivetudEnseignement technique ou professionnel long                    -0.8560686
## nivetudEnseignement superieur y compris technique superieur            -1.3335554
## sexeFemme                                                              -0.2388450
##                                                                             97.5 %
## (Intercept)                                                             2.72698833
## occupChomeur                                                            1.29687983
## occupEtudiant, eleve                                                    0.70875456
## occupRetraite                                                           0.99949726
## occupRetire des affaires                                                0.79411978
## occupAu foyer                                                           1.12140462
## occupAutre inactif                                                      1.46726680
## nivetudA arrete ses etudes, avant la derniere annee d'etudes primaires  1.00104588
## nivetudDerniere annee d'etudes primaires                                0.79932817
## nivetud1er cycle                                                        0.50524595
## nivetud2eme cycle                                                       0.15287678
## nivetudEnseignement technique ou professionnel court                    0.45437523
## nivetudEnseignement technique ou professionnel long                     0.36154943
## nivetudEnseignement superieur y compris technique superieur            -0.21595530
## sexeFemme                                                               0.08174873
## Analysis of Variance Table
## 
## Response: heures.tv
##             Df Sum Sq Mean Sq F value                Pr(>F)    
## occup        6  558.1  93.016 33.2303 < 0.00000000000000022 ***
## nivetud      7  222.5  31.780 11.3533   0.00000000000003633 ***
## sexe         1    2.6   2.585  0.9236                0.3367    
## Residuals 1868 5228.8   2.799                                  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##        1        3        4        5        6        7 
## 1.323013 2.419306 1.401561 3.129941 1.996692 3.172880
##            1            3            4            5            6            7 
## -1.323013191 -2.419305719  0.598438657 -0.129941371  0.003307646 -0.272879932


10. Régression logistique binaire

Prédire une variable dépendante dichotomique sur la base des valeurs de variables indépendantes

## 
## Call:
## glm(formula = sport ~ sexe + nivetud + qualif, family = binomial(logit), 
##     data = bd)
## 
## Deviance Residuals: 
##     Min       1Q   Median       3Q      Max  
## -2.2994  -1.0993   0.5248   0.9188   1.4948  
## 
## Coefficients:
##                                                                        Estimate
## (Intercept)                                                             15.5105
## sexeFemme                                                                0.3809
## nivetudA arrete ses etudes, avant la derniere annee d'etudes primaires -13.4420
## nivetudDerniere annee d'etudes primaires                               -13.4444
## nivetud1er cycle                                                       -14.1625
## nivetud2eme cycle                                                      -14.9886
## nivetudEnseignement technique ou professionnel court                   -14.7132
## nivetudEnseignement technique ou professionnel long                    -15.1152
## nivetudEnseignement superieur y compris technique superieur            -15.6145
## qualifOuvrier qualifie                                                  -0.1532
## qualifTechnicien                                                        -0.6169
## qualifProfession intermediaire                                          -0.5741
## qualifCadre                                                             -0.4636
## qualifEmploye                                                           -0.4086
## qualifAutre                                                              0.1229
##                                                                        Std. Error
## (Intercept)                                                              277.2085
## sexeFemme                                                                  0.1298
## nivetudA arrete ses etudes, avant la derniere annee d'etudes primaires   277.2088
## nivetudDerniere annee d'etudes primaires                                 277.2085
## nivetud1er cycle                                                         277.2085
## nivetud2eme cycle                                                        277.2085
## nivetudEnseignement technique ou professionnel court                     277.2085
## nivetudEnseignement technique ou professionnel long                      277.2085
## nivetudEnseignement superieur y compris technique superieur              277.2085
## qualifOuvrier qualifie                                                     0.2463
## qualifTechnicien                                                           0.3101
## qualifProfession intermediaire                                             0.2697
## qualifCadre                                                                0.2651
## qualifEmploye                                                              0.2286
## qualifAutre                                                                0.3916
##                                                                        z value
## (Intercept)                                                              0.056
## sexeFemme                                                                2.935
## nivetudA arrete ses etudes, avant la derniere annee d'etudes primaires  -0.048
## nivetudDerniere annee d'etudes primaires                                -0.048
## nivetud1er cycle                                                        -0.051
## nivetud2eme cycle                                                       -0.054
## nivetudEnseignement technique ou professionnel court                    -0.053
## nivetudEnseignement technique ou professionnel long                     -0.055
## nivetudEnseignement superieur y compris technique superieur             -0.056
## qualifOuvrier qualifie                                                  -0.622
## qualifTechnicien                                                        -1.990
## qualifProfession intermediaire                                          -2.128
## qualifCadre                                                             -1.749
## qualifEmploye                                                           -1.787
## qualifAutre                                                              0.314
##                                                                        Pr(>|z|)
## (Intercept)                                                             0.95538
## sexeFemme                                                               0.00334
## nivetudA arrete ses etudes, avant la derniere annee d'etudes primaires  0.96133
## nivetudDerniere annee d'etudes primaires                                0.96132
## nivetud1er cycle                                                        0.95925
## nivetud2eme cycle                                                       0.95688
## nivetudEnseignement technique ou professionnel court                    0.95767
## nivetudEnseignement technique ou professionnel long                     0.95652
## nivetudEnseignement superieur y compris technique superieur             0.95508
## qualifOuvrier qualifie                                                  0.53390
## qualifTechnicien                                                        0.04663
## qualifProfession intermediaire                                          0.03331
## qualifCadre                                                             0.08030
## qualifEmploye                                                           0.07393
## qualifAutre                                                             0.75369
##                                                                          
## (Intercept)                                                              
## sexeFemme                                                              **
## nivetudA arrete ses etudes, avant la derniere annee d'etudes primaires   
## nivetudDerniere annee d'etudes primaires                                 
## nivetud1er cycle                                                         
## nivetud2eme cycle                                                        
## nivetudEnseignement technique ou professionnel court                     
## nivetudEnseignement technique ou professionnel long                      
## nivetudEnseignement superieur y compris technique superieur              
## qualifOuvrier qualifie                                                   
## qualifTechnicien                                                       * 
## qualifProfession intermediaire                                         * 
## qualifCadre                                                            . 
## qualifEmploye                                                          . 
## qualifAutre                                                              
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 2107.1  on 1627  degrees of freedom
## Residual deviance: 1857.0  on 1613  degrees of freedom
##   (372 observations deleted due to missingness)
## AIC: 1887
## 
## Number of Fisher Scoring iterations: 14
## (Intercept) 
##    15.51047
##                                                            (Intercept) 
##                                                  5446419.8378982935101 
##                                                              sexeFemme 
##                                                        1.4636734332397 
## nivetudA arrete ses etudes, avant la derniere annee d'etudes primaires 
##                                                        0.0000014527840 
##                               nivetudDerniere annee d'etudes primaires 
##                                                        0.0000014493674 
##                                                       nivetud1er cycle 
##                                                        0.0000007068312 
##                                                      nivetud2eme cycle 
##                                                        0.0000003094143 
##                   nivetudEnseignement technique ou professionnel court 
##                                                        0.0000004075176 
##                    nivetudEnseignement technique ou professionnel long 
##                                                        0.0000002726146 
##            nivetudEnseignement superieur y compris technique superieur 
##                                                        0.0000001654703 
##                                                 qualifOuvrier qualifie 
##                                                        0.8579696688054 
##                                                       qualifTechnicien 
##                                                        0.5395994094327 
##                                         qualifProfession intermediaire 
##                                                        0.5632193440074 
##                                                            qualifCadre 
##                                                        0.6290228726288 
##                                                          qualifEmploye 
##                                                        0.6645837426705 
##                                                            qualifAutre 
##                                                        1.1307466368239


11. Visualiser les résultats d’un modèle



LS0tDQp0aXRsZTogIkNhcHN1bGUgNzogVGVzdHMgc3RhdGlzdGlxdWVzIg0Kb3V0cHV0OiANCiAgaHRtbF9kb2N1bWVudDogDQogICAgdGhlbWU6IGNlcnVsZWFuDQogICAgaGlnaGxpZ2h0OiBoYWRkb2NrDQogICAgdG9jOiB0cnVlDQogICAgdG9jX2Zsb2F0OiANCiAgICAgIGNvbGxhcHNlZDogdHJ1ZQ0KICAgICAgU21vb3RoX3Njcm9sbDogdHJ1ZQ0KICAgIHRvY19kZXB0aDogMg0KICAgIGNvZGVfZG93bmxvYWQ6IHRydWUNCmNzczogaGlkZS5jc3MNCi0tLQ0KDQpDYXJvbGluZSBQYXRlbmF1ZGUgPGJyPiANCipbQmlibGlvdGjDqWNhaXJlIC0gQmlibGlvdGjDqHF1ZSBkZXMgbGV0dHJlcyBldCBzY2llbmNlcyBodW1haW5lc10oaHR0cHM6Ly9iaWIudW1vbnRyZWFsLmNhL2d1aWRlcy9kb25uZWVzLXN0YXRpc3RpcXVlcy1nZW9zcGF0aWFsZXMvZG9ubmVlcy1zdGF0aXN0aXF1ZXMpKiANCjxicj4gDQoNCltTY3JpcHQgQ29sYWJdKGh0dHBzOi8vZ2l0aHViLmNvbS9Db3Vycy1FRFVsaWIvRkFTLUlTRFMvYmxvYi9tYWluL21vZHVsZS00LzRfMl90ZXN0c19zdGF0aXN0aXF1ZXMuaXB5bmIpIHwgW1NjcmlwdCBSXShodHRwczovL2dpdGh1Yi5jb20vQ291cnMtRURVbGliL0ZBUy1JU0RTL2Jsb2IvbWFpbi9tb2R1bGUtNC80LjItdGVzdHMtc3RhdGlzdGlxdWVzLlIpIA0KDQo8YnI+DQoNCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQ0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBUUlVFKQ0KYGBgDQoNCjxzY3JpcHQgc3JjPSJoaWRlT3V0cHV0LmpzIj48L3NjcmlwdD4NCg0KYGBge3J9DQojIENoYXJnZW1lbnQgZGVzIG1vZHVsZXMgbsOpY2Vzc2FpcmVzDQpsaWJyYXJ5KGNhcikNCmxpYnJhcnkocXVlc3Rpb25yKQ0KbGlicmFyeShlZmZlY3RzKQ0KDQojIEFqb3V0ZXIgbGEgZm9uY3Rpb24gZGUgdMOpbMOpY2hhcmdlbWVudCBzaSBuw6ljZXNzYWlyZToNCiMgaW5zdGFsbC5wYWNrYWdlcygiY2FyIiwgZGVwZW5kZW5jaWVzPVRSVUUpDQojIGluc3RhbGwucGFja2FnZXMoInF1ZXN0aW9uciIsIGRlcGVuZGVuY2llcz1UUlVFKQ0KIyBpbnN0YWxsLnBhY2thZ2VzKCJlZmZlY3RzIiwgZGVwZW5kZW5jaWVzPVRSVUUpDQoNCiMgVMOpbMOpY2hhcmdlbWVudCBkZSBsYSBiYXNlIGRlIGRvbm7DqWVzIGhkdjIwMDMgZHUgbW9kdWxlIHF1ZXN0aW9ucg0KIyAoRXh0cmFpdCBkZSBsJ2VucXXDqnRlICJIaXN0b2lyZSBkZSB2aWUiIGRlIGwnSW5zZWUgLSBodHRwczovL3d3dy5pbnNlZS5mci9mci9zdGF0aXN0aXF1ZXMvMjUzMjI0NCkNCmRhdGEoaGR2MjAwMykNCg0KIyBDb3BpZSBkZSBsYSBiYXNlIGRlIGRvbm7DqWVzIGRhbnMgdW4gb2JqZXQgKGRhdGF0YWJsZSkgbm9tbcOpIGJkDQpiZCA8LSBoZHYyMDAzDQpgYGANCg0KPGJyPg0KDQojIDEuIEFuYWx5c2VzIHN0YXRpc3RpcXVlcw0KDQoqIE9uIHJldHJvdXZlIHVuZSBtdWx0aXR1ZGUgZGUgbW9kdWxlcyBkw6lkacOpcyBhdXggbcOpdGhvZGVzIHN0YXRpc3RpcXVlcyAoY29tbWUgc3RhdHMsIE1BU1MsIEZhY3RvTWluZVIsIHBsbSwgZ2xtKS4gDQoqIExhIG3Dqm1lIG3DqXRob2RlIHBldXQgc2UgdHJvdXZlciBhdmVjIHZhcmlhbnRlcyBkYW5zIHBsdXNpZXVycyBtb2R1bGVzLiANCiogTGVzIGV4ZW1wbGVzIGNpLWRlc3NvdXMgcHJvdmllbm5lbnQgcHJpbmNpcGFsZW1lbnQgZHUgbW9kdWxlIHN0YXRzIChtb2R1bGUgcGFyIGTDqWZhdXQpIG/DuSBsJ29uIHJldHJvdXZlIGRlIG5vbWJyZXVzZXMgZm9uY3Rpb25zIHBvdXIgZGlmZsOpcmVudHMgdHlwZXMgZCdhbmFseXNlLg0KDQo8YnI+DQoNCiMjIDEuMS4gTm90YXRpb24gZm9ybXVsZSBldCBvYmpldCBtb2TDqGxlDQoNCmBgYHtyLCBldmFsPUZBTFNFfQ0KbW9kIDwtIG5vbS50ZXN0KFZEIH4gVkkpDQpgYGANCg0KKiBTb3V2ZW50IHV0aWxpc8OpIGRhbnMgbGVzIG1vZMOobGVzIGQnYW5hbHlzZSAocsOpZ3Jlc3Npb25zLi4uKSBldCBsZXMgZ3JhcGhpcXVlcy4NCiogUGV1dCBzJ2ludGVycHLDqXRlciBjb21tZSBlbiAiZm9uY3Rpb24gZGUuLi4iOiB2YXJpYWJsZSBkw6lwZW5kYW50ZSAoZWZmZXQpIGVuIGZvbmN0aW9uICh+KSBkZSBsYSB2YXIgaW5kw6lwZW5kYW50ZSAoY2F1c2UpLg0KKiBUb3V0ZXMgbGVzIGZvbmN0aW9ucyBuJ2FjY2VwdGVudCBwYXMgbGEgbm90YXRpb24gZm9ybXVsZSwgbWFpcyBlc3QgdXRpbGlzw6llIHBvdXIgbGEgcGx1cGFydCBkZXMgbW9kw6hsZXMgZCdhbmFseXNlLg0KKiBPbiBzdG9ja2UgbCdhbmFseXNlIGRhbnMgdW4gb2JqZXQgcXVpIGNvbnRpZW5kcmEgbGVzIHLDqXN1bHRhdHMgcXVpLCBzZWxvbiBsJ2FuYWx5c2UsIGluY2x1ZXJvbnQgdW4gZW5zZW1ibGUgZCfDqWzDqW1lbnRzIGQnaW5mb3JtYXRpb24gYXV4cXVlbHMgb24gcG91cnJhIGFjY8OpZGVyIGRlIGRldXggZmHDp29uczoNCg0KRW4gcGFzc2FudCBub3RyZSBvYmpldC1tb2TDqGxlIMOgIGRpZmbDqXJlbnRlcyBmb25jdGlvbnMgZ8OpbsOpcmlxdWVzIChzZWxvbiBsZSB0eXBlIGRlIHRlc3QpOg0KDQpgYGB7ciwgZXZhbD1GQUxTRX0NCm1vZCA8LSBsbSh5IH4geCwgZGF0YT1Ob21PYmpldCkgIyBDcsOpZXIgc29uIG9iamV0IG1vZMOobGUNCm1vZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyByw6lzdW3DqSBkZXMgcsOpc3VsdGF0cw0Kc3VtbWFyeShtb2QpICAgICAgICAgICAgICAgICAgICAjIGVuc2VtYmxlIGRlcyByw6lzdWx0YXRzIGTDqXRhaWxsw6lzDQpjb2VmKG1vZCkgICAgICAgICAgICAgICAgICAgICAgICMgY29lZmZpY2llbnRzIGV0IGVycmV1cnMgc3RhbmRhcmRzDQpyZXNpZHVhbHMobW9kKSAgICAgICAgICAgICAgICAgICMgcsOpc2lkdXMNCmNvbmZpbnQobW9kKSAgICAgICAgICAgICAgICAgICAgIyBpbnRlcnZhbGxlcyBkZSBjb25maWFuY2UNCmZpdHRlZChtb2QpICAgICAgICAgICAgICAgICAgICAgIyB2YWxldXJzIGFqdXN0w6llcw0KYW5vdmEobW9kKSAgICAgICAgICAgICAgICAgICAgICAjIGFwcGxpcXVlciBhbmFseXNlIGRlIHZhcmlhbmNlIHN1ciBtb2TDqGxlDQpwcmVkaWN0KG1vZCkgICAgICAgICAgICAgICAgICAgICMgY2FsY3VsZXIgZGVzIHZhbGV1cnMgcHLDqWRpdGVzIMOgIHBhcnRpciBkJ3VuIG1vZMOobGUNCnBsb3QobW9kKSAgICAgICAgICAgICAgICAgICAgICAgIyBldCBub21icmV1c2VzIGF1dHJlcyBmb25jdGlvbnMgZ3JhcGhpcXVlcyAgDQpgYGANCg0KRW4gdXRpbGlzYW50IGxhIGZvbmN0aW9uIG5hbWVzKE5vbU9iamV0KSBldCBlbiBzw6lsZWN0aW9ubmFudCBpbmRpdmlkdWVsbGVtZW50IGxlIG5vbSBkZSBsJ8OpbMOpbWVudCBhdmVjIGwnb3DDqXJhdGV1ciAkOg0KIA0KYGBge3IsIGV2YWw9RkFMU0V9DQptb2QgPC0gbG0oeSB+IHgpICMgQ3LDqWVyIHNvbiBvYmpldCBtb2TDqGxlDQpuYW1lcyhtb2QpICAgICAgICMgVm9pciBsZXMgw6lsw6ltZW50cyBkdSByw6lzdWx0YXQNCm1vZCRjb2VmZmljaWVudHMgIyBTw6lsZWN0aW9ubmVyIGwnw6lsw6ltZW50IGluZGl2aWR1ZWwNCmBgYA0KIA0KPGJyPg0KIA0KICoqw4Agbm90ZXI6IHBhciBkw6lmYXV0IGxlcyByw6lzdWx0YXRzIHNvbnQgcHLDqXNlbnTDqXMgc2Vsb24gbGEgbm90YXRpb24gc2NpZW50aWZpcXVlLiBQb3VyIGxhIGTDqXNhY3RpdmVyIHV0aWxpc2VyIGwnaW5zdHJ1Y3Rpb246IG9wdGlvbnMoc2NpcGVuID0gOTk5KS4gUG91ciBsYSByw6lhY3RpdmVyOiBvcHRpb25zKHNjaXBlbiA9IDApKioNCiANCjxicj4NCg0KIyMgMS4yLiBMZXMgbW9kYWxpdMOpcyBkZSByw6lmw6lyZW5jZQ0KLSBEYW5zIFIsIGlsIG4nZXN0IHBhcyBuw6ljZXNzYWlyZSBkZSByZWNvZGVyIHNlcyB2YXJpYWJsZXMgZW4gImR1bW15IiwgbGVzIGFuYWx5c2VzIHMnZW4gY2hhcmdlbnQgcGFyIGTDqWZhdXQgbG9yc3F1J29uIHV0aWxpc2UgZGVzIHZhcmlhYmxlcyBxdWFsaXRhdGl2ZXMuDQotIE1haXMgYXR0ZW50aW9uIMOgIGxhIG1vZGFsaXTDqSBkZSByw6lmw6lyZW5jZSBkZXMgZmFjdGV1cnMgZMOpZmluaWUgcGFyIGTDqWZhdXQ6IGxhIHByZW1pw6hyZSBkYW5zIGxhIGxpc3RlIGRlcyBuaXZlYXV4Lg0KDQo8ZGl2IGNsYXNzPSJmb2xkIG8iPg0KYGBge3J9DQojIFBvdXIgdm9pciBsYSBtb2RhbGl0w6kgZGUgcsOpZsOpcmVuY2UgLSBwcmVtacOocmUgbGlzdMOpZQ0KbGV2ZWxzKGJkJHNwb3J0KQ0KYGBgDQoNCmBgYHtyfQ0KIyBQb3VyIG1vZGlmaWVyIGxhIGNhdMOpZ29yaWUgZGUgcsOpZsOpcmVuY2UNCmJkJHNwb3J0IDwtIHJlbGV2ZWwoYmQkc3BvcnQsIHJlZiA9ICJPdWkiKQ0KYGBgDQoNCjxicj4NCg0KIyMgMi4gSW50ZXJ2YWxsZSBkZSBjb25maWFuY2UNCg0KYGBge3J9DQojIEludGVydmFsbGUgZGUgY29uZmlhbmNlIGTigJl1bmUgcHJvcG9ydGlvbg0KDQojIGZvbmN0aW9uIHByb3AudGVzdA0KIyBDYWxjdWwgbCdpbnRlcnZhbGxlIHBvdXIgbGEgcHJlbWnDqHJlIGNhdMOpZ29yaWUgZHUgdGFibGVhdQ0KcHJvcC50ZXN0KHRhYmxlKGJkJHNwb3J0KSkNCmBgYA0KDQpgYGB7cn0NCm9wdGlvbnMoc2NpcGVuID0gOTk5KSAjIGTDqXNhY3RpdmVyIGxhIG5vdGF0aW9uIHNjaWVudGlmaXF1ZQ0KDQojIE1vZGlmaWVyIGxhIGNhdMOpZ29yaWUgZGUgcsOpZsOpcmVuY2UgYXZlYyBsYSBmb25jdGlvbiByZWxldmVsIGRpcmVjdGVtZW50IGRhbnMgbGEgZm9uY3Rpb24gdGFibGUoKQ0KcHJvcC50ZXN0KHRhYmxlKHJlbGV2ZWwoYmQkc3BvcnQsICJPdWkiKSkpDQpgYGANCg0KDQpgYGB7cn0NCiMgSW50ZXJ2YWxsZSBkZSBjb25maWFuY2UgZCd1bmUgbW95ZW5uZQ0KDQojIEZvbmN0aW9uIHQudGVzdA0KIyBDaGFuZ2VyIGxlIG5pdmVhdSBkZSBjb25maWFuY2UgYXZlYyBsJ2FyZ3VtZW50IChiZCRhZ2UsIGNvbmYubGV2ZWw9LngpDQp0LnRlc3QoYmQkYWdlLCBjb25mLmxldmVsPS45OSkNCmBgYA0KDQo8YnI+DQoNCiMjIDMuICBUZXN0IGR1IEtoaS1jYXJyw6kNCg0KYGBge3J9DQojIFBhc3NlIGxlcyB2YXJpYWJsZXMgY29tbWUgYXJndW1lbnQgw6AgbGEgZm9uY3Rpb24gY2hpc3EudGVzdCgpIChNb2R1bGUgcXVlc3Rpb25yKQ0KDQptb2QuY2hpIDwtIGNoaXNxLnRlc3QoYmQkc3BvcnQsIGJkJHNleGUpIA0KDQojIEFwcGxpcXVlIGNvcnJlY3Rpb24gcGFyIGTDqWZhdXQsIHNpbm9uIGFqb3V0ZXIgYXJndW1lbnQ6ICxjb3JyZWN0PUZBTFNFDQpgYGANCg0KYGBge3J9DQptb2QuY2hpDQpgYGANCg0KYGBge3J9DQojIEZvbmN0aW9uIG5hbWVzKCkgcG91ciB2b2lyIGxlcyDDqWzDqW1lbnRzIGQnaW5mb3JtYXRpb24gZGUgbm9zIHLDqXN1bHRhdHMNCm5hbWVzKG1vZC5jaGkpDQpgYGANCg0KYGBge3J9DQojIFZvaXIgbGVzIHZhbGV1cnMgYXR0ZW5kdWVzDQptb2QuY2hpJGV4cGVjdGVkDQpgYGANCg0KYGBge3J9DQojIEZvbmN0aW9uIGNoaXNxLnJlc2lkdWFscygpIGR1IG1vZHVsZSBxdWVzdGlvbnIgcG91ciBsZXMgcsOpc2lkdXMNCnRhYiA8LSB0YWJsZShiZCRzcG9ydCwgYmQkc2V4ZSkNCmNoaXNxLnJlc2lkdWFscyh0YWIpIA0KYGBgDQoNCg0KPGJyPg0KDQojIyA0LiBUZXN0IGRlIGZpc2hlcg0KDQpgYGB7cn0NCmZpc2hlci50ZXN0KGJkJHNwb3J0LCBiZCRzZXhlKQ0KYGBgDQoNCjxicj4NCg0KIyMgNS4gRGlmZsOpcmVuY2UgZGUgbW95ZW5uZXMgZW50cmUgZGV1eCBncm91cGVzIChUZXN0IFQpDQoNCipWw6lyaWZpZXIgc2kgbGVzIG1veWVubmVzIGQndW5lIHZhcmlhYmxlIHF1YW50aXRhdGl2ZSBkZSBkZXV4IGdyb3VwZXMgc29udCBzdGF0aXN0aXF1ZW1lbnQgZGlmZsOpcmVudGVzKg0KDQpgYGB7cn0NCiMgRXhwbG9yZXIgbGVzIHN0YXRpc3RpcXVlcyBkZXNjcmlwdGl2ZXMgc2Vsb24gbGVzIGdyb3VwZXMgYXZlYyBsYSBmb25jdGlvbiBieSgpDQoNCmJ5KGJkJGFnZSwgYmQkc3BvcnQsIEZVTj1zdW1tYXJ5KQ0KYnkoYmQkYWdlLCBiZCRzcG9ydCwgRlVOPXZhcikNCmBgYA0KDQpgYGB7cn0NCiMgTm9ybWFsaXTDqSBkZXMgZGlzdHJpYnV0aW9ucyAtIFRlc3QgZGUgU2hhcGlyby1XaWxrDQoNCiMjIEF2ZWMgbGEgZm9uY3Rpb24gYnkNCmJ5KGJkJGFnZSwgYmQkc3BvcnQsIEZVTj1zaGFwaXJvLnRlc3QpDQpgYGANCg0KYGBge3J9DQojIMOJZ2FsaXTDqSBkZXMgdmFyaWFuY2VzIC0gdGVzdCBGDQoNCnZhci50ZXN0KGFnZSB+IHNwb3J0LCBkYXRhID0gYmQpDQpgYGANCg0KDQpgYGB7cn0NCiMgVGVzdCBkZSBMZXZlbmUgKG1vZHVsZSBjYXIpDQoNCmxldmVuZVRlc3QoYmQkYWdlLCBiZCRzcG9ydCkgIyBBY2NlcHRlIGF1c3NpIG5vdGF0aW9uIGZvcm11bGUNCmBgYA0KDQoNCmBgYHtyfQ0KIyBUZXN0IFQgDQoNCnQudGVzdChhZ2UgfiBzcG9ydCwgZGF0YSA9IGJkKQ0KDQojIFBhciBkw6lmYXV0LCBsYSBmb25jdGlvbiB0LnRlc3QgZXN0IHVuIHRlc3QgZGUgV2Vsc2ggcXVpIG5lIHN1cHBvc2UgcGFzIMOpZ2FsaXTDqSBkZXMgdmFyaWFuY2VzDQpgYGANCg0KDQpgYGB7cn0NCiMgUG91ciB1biB0ZXN0IHQgY2xhc3NpcXVlLCBham91dGVyIGwnYXJndW1lbnQgdmFyLmVxdWFsID0gVFJVRQ0KDQp0LnRlc3QoYWdlIH4gc3BvcnQsIGRhdGE9YmQsIHZhci5lcXVhbD0gVFJVRSkNCg0KIyBQb3VyIHVuIHRlc3QgZCfDqWNoYW50aWxsb25zIGFwcGFyacOpcyAobWVzdXJlcyByw6lww6l0w6llcyksIGFqb3V0ZXIgYXJndW1lbnQgcGFpcmVkPVRSVUUgKHNhbnMgbm90YXRpb24gZm9ybXVsZSkNCmBgYA0KDQo8YnI+DQoNCiMjIDYuIFRlc3QgV2lsY294b24vTWFubi1XaGl0bmV5ICh0ZXN0IG5vbi1wYXJhbcOpdHJpcXVlIHBhcm1pIGQnYXV0cmVzKQ0KDQpgYGB7cn0NCndpbGNveC50ZXN0KGFnZSB+IHNwb3J0LCBkYXRhID0gYmQpDQpgYGANCg0KPGJyPg0KDQojIyA3LiBEaWZmw6lyZW5jZSBkZSBtb3llbm5lIHBvdXIgcGx1cyBkZSBkZXV4IGdyb3VwZXMgKEFOT1ZBKQ0KDQoqw4l2YWx1ZXIgbGEgcmVsYXRpb24gZW50cmUgdW5lIHZhcmlhYmxlIHF1YW50aXRhdGl2ZSBldCB1bmUgdmFyaWFibGUgcXVhbGl0YXRpdmUgYXZlYyBwbHVzIGRlIGRldXggbW9kYWxpdMOpcyoNCg0KYGBge3J9DQojIEV4cGxvcmVyIGxlcyBzdGF0aXN0aXF1ZXMgZGVzY3JpcHRpdmVzIGF2ZWMgbGEgZm9uY3Rpb24gdGFwcGx5KCkNCiMgVsOpcmlmaWVyIHNpIGxlcyBtb3llbm5lcyBzZW1ibGVudCBkaWZmw6lyZW50ZXMgZW50cmUgbGVzIGdyb3VwZXMNCnRhcHBseShiZCRoZXVyZXMudHYsIGJkJG9jY3VwLCBtZWFuLCBuYS5ybT1UKQ0KYGBgDQoNCg0KYGBge3J9DQojIEZvbmN0aW9uIGFvdg0KDQptb2QuYW92IDwtIGFvdihoZXVyZXMudHYgfiBvY2N1cCwgZGF0YT1iZCkNCg0KIyBDcsOpw6kgdW4gb2JqZXQgY29udGVuYW50IGxlIG1vZMOobGUNCiMgUG91ciB2b2lyIGVmZmV0IGNvbWJpbsOpIGVudHJlIGZhY3RldXJzIG1vZC5hb3YgPC0gYW92KGhldXJlcy50diB+IG9jY3VwKnNleGUsIGJkKQ0KYGBgDQoNCg0KYGBge3J9DQptb2QuYW92ICAgIyBWb2lyIHVuIHLDqXN1bcOpIGR1IG1vZMOobGUNCmBgYA0KDQoNCmBgYHtyfQ0KIyBBcHBsaXF1ZSBsYSBmb25jdGlvbiBzdW1tYXJ5IMOgIGwnb2JqZXQgbW9kw6hsZSBwb3VyIHZvaXIgcsOpc3VsdGF0cyBkw6l0YWlsbMOpcw0KDQpzdW1tYXJ5KG1vZC5hb3YpDQpgYGANCg0KDQpgYGB7cn0NCiMgRm9uY3Rpb24gbG0gDQoNCm1vZC5sbSA8LSBsbShoZXVyZXMudHYgfiBvY2N1cCwgYmQpDQoNCiMgUGV1dCDDqWdhbGVtZW50IHV0aWxpc2VyIGZvbmN0aW9uIGRlIHLDqWdyZXNzaW9uIGxpbsOpYWlyZSBwb3VyIGFuYWx5c2UgZGUgdmFyaWFuY2UNCiMgUGVybWV0IGRlIHZvaXIgbGVzIGNvbnRyYXN0ZXMgZW50cmUgbGVzIGRpZmbDqXJlbnRzIGdyb3VwZXMNCiMgTGEgbW9kYWxpdMOpIGRlIHLDqWbDqXJlbmNlIGVzdCAiRXhlcmNlIHVuZSBwcm9mZXNzaW9uIiAobGV2ZWxzKGJkJG9jY3VwKSkNCiMgUG91ciBjaGFuZ2VyIG1vZGFsaXTDqSBkZSByw6lmw6lyZW5jZSwgdXRpbGlzZXIgbGEgY29tbWFuZGUgcmVsZXZlbDogbW9kLmxtIDwtIGxtKGRpZmYgfiByZWxldmVsKG9jY3VwLCByZWY9IkV0dWRpYW50LCBlbGV2ZSIpLCBkYXRhPWJkKQ0KIyBQb3Nzw6hkZSBhdXNzaSB1biBhcmd1bWVudCBzdWJzZXQ9IHBlcm1ldHRhbnQgZGUgc8OpbGVjdGlvbm5lciBkZXMgbW9kYWxpdMOpcy4gUGFyIGV4ZW1wbGU6IA0KIyBtb2QyLmxtIDwtIGxtKGhldXJlcy50diB+IG9jY3VwLCBiZCwgc3Vic2V0ID0gb2NjdXAgJWluJSBjKCJFeGVyY2UgdW5lIHByb2Zlc3Npb24iLCAiQ2hvbWV1ciIsICJFdHVkaWFudCwgZWxldmUiKSkNCmBgYA0KDQpgYGB7cn0NCiMgUsOpc3Vtw6kgZGUgY29lZmZpY2llbnRzDQptb2QubG0gDQpgYGANCg0KDQpgYGB7cn0NCiMgQXBwbGlxdWUgbGEgZm9uY3Rpb24gc3VtbWFyeSDDoCBsJ29iamV0IG1vZMOobGU6DQojIENvZWZmaWNpZW50cyArIFRlc3RzIGFzc29jacOpcyAoVGVzdCB0LCBkZWdyw6kgZGUgc2lnbmlmaWNhdGl2aXTDqSkNCnN1bW1hcnkobW9kLmxtKQ0KYGBgDQoNCg0KYGBge3J9DQphbm92YShtb2QubG0pDQoNCiMgUGV1dCBhdXNzaSBvYnRlbmlyIGRlcyByw6lzdWx0YXRzIGQnYW5hbHlzZSBkZSB2YXJpYW5jZSAoc29tbWUgZGVzIGNhcnLDqXMsIGRlZ3LDqSBkZSBsaWJlcnTDqSwgIHZhbGV1ciBkZSBGLi4uKSBlbiBhcHBsaXF1YW50IGFub3ZhIMOgIGwnb2JqZXQgbW9kw6hsZQ0KIyDDgCBub3RlcjogTGVzIGZvbmN0aW9ucyBhb3YoKSBldCBhbm92YSgpIHJldG91cm5lIGxhIHNvbW1lIGRlcyBjYXJyw6lzIGRlIHR5cGUgSQ0KYGBgDQoNCjxicj4NCg0KIyMgOC4gQ29ycsOpbGF0aW9ucw0KDQpgYGB7cn0NCiMgRm9uY3Rpb24gY29yKCkNCg0KY29yKGJkJGFnZSwgYmQkaGV1cmVzLnR2LCB1c2U9InBhaXJ3aXNlIikNCg0KIyBNYXRyaWNlIGRlIGNvcnLDqWxhdGlvbnMgcG91ciBkZXV4IHZhcmlhYmxlcyBxdWFudGkgb3UgcGx1cw0KIyBwYWlyd2lzZTogbid1dGlsaXNlciBxdWUgbGVzIHBhaXJlcyBkJ29ic2VydmF0aW9ucyBjb21wbMOodGVzDQojIHBvdXIgU3BlYXJtYW4sIHJham91dGVyIGFyZ3VtZW50IG1ldGhvZCA9ICJzcGVhcm1hbiINCiMgaW5zdHJ1Y3Rpb24gc3VpdmFudGUgc2kgcGx1cyBkZSBkZXV4IHZhcmlhYmxlczogY29yKGJkWyxjKCJhZ2UiLCAiaGV1cmVzLnR2IiwgImZyZXJlcy5zb2V1cnMiKV0sIHVzZT0ncGFpcndpc2UnKQ0KYGBgDQoNCmBgYHtyfQ0KIyBGb25jdGlvbiBjb3IudGVzdCgpDQoNCmNvci50ZXN0KGJkJGFnZSwgYmQkaGV1cmVzLnR2KQ0KDQojIE91IG5vdGF0aW9uIGZvcm11bGUgY29yLnRlc3QoIH4gYWdlICsgaGV1cmVzLnR2LCBiZCkNCmBgYA0KDQo8YnI+DQoNCiMjIDkuIFLDqWdyZXNzaW9uIGxpbsOpYWlyZQ0KKlByw6lkaXJlIGxhIHZhbGV1ciBkJ3VuZSB2YXJpYWJsZSBkw6lwZW5kYW50ZSBjb250aW51ZSBzdXIgbGEgYmFzZSBkZXMgdmFsZXVycyBkZSB2YXJpYWJsZXMgaW5kw6lwZW5kYW50ZXMqDQoNCmBgYHtyfQ0KIyBGb25jdGlvbiBsbSgpDQoNCiMgUXVlbGxlcyB2YXJpYWJsZXMgcHLDqWRpc2VudCBsZXMgaGV1cmVzIGRlIHTDqWzDqSDDqWNvdXTDqWVzDQoNCm1vZDEubG0gPC0gbG0oaGV1cmVzLnR2IH4gb2NjdXAgKyBuaXZldHVkICsgc2V4ZSwgZGF0YT1iZCkgDQoNCiMgT24gc3RvY2tlIGxlIHLDqXN1bHRhdCBkYW5zIHVuIG9iamV0IG1vZMOobGUgcG91ciBwb3V2b2lyIGxlIG1hbmlwdWxlciBhdmVjIGQnYXV0cmVzIGZvbmN0aW9ucw0KIyBQb3VyIGxpbWl0ZXIgw6AgdW4gc291cy1ncm91cGU6IGFyZ3VtZW50ICIsIHN1YnNldD1hZ2U+NTAiDQpgYGANCg0KDQpgYGB7cn0NCiMgUGFzc2Ugbm90cmUgb2JqZXQgbW9kw6hsZSDDoCBsYSBmb25jdGlvbiBzdW1tYXJ5IHBvdXIgdm9pciANCiMgbGUgdGFibGVhdSBkZXMgY29lZmZpY2llbnRzIGV0IGxldXIgdGVzdCBkZSBzaWduaWZpY2F0aXZpdMOpDQpzdW1tYXJ5KG1vZDEubG0pDQpgYGANCg0KDQpgYGB7cn0NCiMgTGEgZm9uY3Rpb24gY29lZiBwcsOpc2VudGUgbGVzIGNvZWZmaWNpZW50cyBkdSBtb2TDqGxlIGRlIHLDqWdyZXNzaW9uIGV0IHBldXQgcydhcHBsaXF1ZXIgaW5kaXZpZHVlbGxlbWVudCANCmNvZWYobW9kMS5sbSkNCmBgYA0KDQoNCmBgYHtyfQ0KIyBsYSBmb25jdGlvbiBjb25maW50IHByw6lzZW50ZSBsZXMgaW50ZXJ2YWxsZXMgZGUgY29uZmlhbmNlICg5NSUgcGFyIGTDqWZhdXQpDQpjb25maW50KG1vZDEubG0pDQpgYGANCg0KDQpgYGB7cn0NCiMgUG91ciBsZSB0YWJsZWF1IEFOT1ZBIGFwcGxpcXXDqSBhdSBtb2TDqGxlIGRlIHLDqWdyZXNzaW9uDQphbm92YShtb2QxLmxtKQ0KYGBgDQoNCg0KYGBge3J9DQojIExhIGZvbmN0aW9uIGZpdHRlZCBmb3Vybml0IGxlcyB2YWxldXJzIGFqdXN0w6llcw0KaGVhZChmaXR0ZWQobW9kMS5sbSkpDQpgYGANCg0KYGBge3J9DQojIExhIGZvbmN0aW9uIHJlc2lkKCkgZm91bml0IGxlcyByw6lzaWR1cyBkZSBsYSByw6lncmVzc2lvbg0KaGVhZChyZXNpZChtb2QxLmxtKSkNCmBgYA0KDQo8YnI+DQoNCiMjIDEwLiBSw6lncmVzc2lvbiBsb2dpc3RpcXVlIGJpbmFpcmUNCg0KKlByw6lkaXJlIHVuZSB2YXJpYWJsZSBkw6lwZW5kYW50ZSBkaWNob3RvbWlxdWUgc3VyIGxhIGJhc2UgZGVzIHZhbGV1cnMgZGUgdmFyaWFibGVzIGluZMOpcGVuZGFudGVzKg0KDQpgYGB7cn0NCiMgRm9uY3Rpb24gZ2xtDQptb2QucmVnIDwtIGdsbShzcG9ydCB+IHNleGUgKyBuaXZldHVkICsgcXVhbGlmLCBiZCwgZmFtaWx5ID0gYmlub21pYWwobG9naXQpKQ0KDQojIExhIGZvbmN0aW9uIGdsbSBwZXJtZXQgZGUgY2FsY3VsZXIgcGx1c2lldXJzIG1vZMOobGVzIHN0YXRpc3RpcXVlcyBkb25jIGlsIGZhdXQgaW5kaXF1ZXIgw6AgZ2xtIGF2ZWMgbOKAmWFyZ3VtZW50IGZhbWlseT1iaW5vbWlhbChsb2dpdCkgDQpgYGANCg0KDQpgYGB7cn0NCiMgQXBwbGlxdWUgZm9uY3Rpb24gc3VtbWFyeSBhdSBtb2TDqGxlIHBvdXIgdm9pciByw6lzdWx0YXRzbGVzIHZhbGV1cnMgZGVzIGNvZWZmaWNpZW50cw0Kc3VtbWFyeShtb2QucmVnKQ0KYGBgDQoNCg0KYGBge3J9DQojIExhIGZvbmN0aW9uIGNvZWYgcGVybWV0IGF1c3NpIGQnb2J0ZW5pciBsZXMgY29lZmZpY2llbnRzIGluZGl2aWR1ZWxsZW1lbnQNCmNvZWYobW9kLnJlZylbMV0NCmBgYA0KDQoNCmBgYHtyfQ0KIyBMYSBmb25jdGlvbiBleHAgcG91ciBsZXMgb2RkcyByYXRpbyBldCBsZXVycyBpbnRlcnZhbGxlcyBkZSBjb25maWFuY2UNCmV4cChjb2VmKG1vZC5yZWcpKQ0KDQojIEF1c3NpIGxhIGZvbmN0aW9uIG9kZHMucmF0aW8obW9kLnJlZykgZHUgbW9kdWxlIHF1ZXN0aW9ucg0KYGBgDQoNCjxicj4NCg0KIyMgMTEuIFZpc3VhbGlzZXIgbGVzIHLDqXN1bHRhdHMgZCd1biBtb2TDqGxlDQoNCmBgYHtyfQ0KIyBSw6lzdWx0YXQgZGUgbCdBTk9WQQ0KcGxvdChhbGxFZmZlY3RzKG1vZC5hb3YpKQ0KYGBgDQoNCg0KYGBge3J9DQojIFLDqXN1bHRhdCBkZSBsYSByw6lncmVzc2lvbiBsaW7DqWFpcmUgLSBlZmZldCBkZSB0b3VzIGxlcyBwcsOpZGljdGV1cnMNCg0KcGxvdChhbGxFZmZlY3RzKG1vZDEubG0pKQ0KYGBgDQoNCg0KYGBge3J9DQojIFLDqXN1bHRhdCBkZSBsYSByw6lncmVzc2lvbiBsaW7DqWFpcmUgLSBlZmZldCBkJ3VuIHNldWwgcHLDqWRpY3RldXINCg0KcGxvdChFZmZlY3QoIm9jY3VwIiwgbW9kPW1vZDEubG0pKQ0KYGBgDQoNCjxicj4NCg0KKioqDQoNCjwvZGl2Pg0K