Nous chargeons la base de données dans la variable cpes :

# Charger des données dans la variable cpes
cpes <- read.csv("./cpes_quanti/bdd_alimentation.csv")

Introduction : utilité de la statistique descriptive bivariée

On considère conjointement deux variables X et Y pour

Lien entre deux variables quantitatives

Nous allons étudier deux outils qui peuvent être employés pour décrire le lien entre deux variables quantitatives.

Le nuage de points

Premier exemple : lien entre le nombre de repas pris seuls et le nombre de repas pris dans son logement personnel.

repas.seul <- cpes$repas.qui.seul.midi + cpes$repas.qui.seul.soir
repas.logt <- cpes$repas.ou.logement.midi + cpes$repas.ou.logement.soir
plot(repas.seul, repas.logt,
     xlab = "Nombre de repas pris seuls",
     ylab = "Nombre de repas pris chez soi",
     main = "Lien entre le nombre de repas pris seuls et chez soi")

Questions :

  • Remarquez-vous un lien entre ces deux variables ?
  • Pourquoi certains points sont-ils plus “foncés” que d’autres ? En quoi pourrait-on améliorer ce graphique ?
  • Comment obtient-on les légendes de ce graphique ?

Deuxième exemple : lien entre montant des courses par personne et des ressources financières totales.

# On commence par sélectionner un sous-ensemble de notre échantillon,
# ceux qui ont fait des courses pour au moins une personne.
cpes.courses <- cpes[cpes$courses.pers >= 1, ]
# On peut ensuite ajouter une nouvelle variable à notre base de données : le montant des courses pour une personne
cpes.courses$courses.prixprop <- cpes.courses$courses.prix/cpes.courses$courses.pers
# On trace le nuage de points
plot(cpes.courses$ressources.total, cpes.courses$courses.prixprop,
     pch = 19, col = rgb(1, 0, 0, 0.3), # Faire des points transparents à 30%
     frame.plot = F, # Supprimer la boîte en haut et à droite
     xlab = "Montant des ressources totales (€)",
     ylab = "Montant des courses par personne (€)",
     main = "Lien entre ressources financières et montant des courses")

Questions :

  • Remarquez-vous un lien entre ces deux variables ?
  • Ce lien vous paraît-il plus fort ou plus évident que le précédent ?

Le \(r\) de Pearson

Le coefficient \(r\) de Pearson permet de mesurer le degré de corrélation linéaire entre deux variables quantitatives \(X\) et \(Y\). Il est compris entre \([-1 ; 1]\) :

  • Le signe indique une corrélation positive ou négative
  • 0 signifie une absence de corrélation
  • Plus la valeur absolue est proche de 1, plus le degré de corrélation linéaire est élevé

Prudence ! Le \(r\) de Pearson mesure seulement la force de la corrélation linéaire entre deux variables. D’autres relations, non-linéaires, peuvent exister.

Calcul du \(r\) pour l’exemple 1 :

# L'argument "use" permet de ne pas se préoccuper des NA
cor(repas.seul, repas.logt, use = "complete.obs")
[1] 0.4300067

Interprétez ce coefficient.

Calcul du \(r\) pour l’exemple 2 :

# L'argument "use" permet de ne pas se préoccuper des NA
cor(cpes.courses$ressources.total, cpes.courses$courses.prixprop, use = "complete.obs")
[1] 0.1249346

Interprétez ce coefficient et comparez-le au précédent. Que pouvez-vous en déduire ?

Lien entre deux variables qualitatives

La table de contingence

Aussi appelé “tableau croisé”.

Si les statisticiens préfèrent, en toute rigueur, parler de « table de contingence », les sociologues utilisent plus facilement l’expression de « tableau croisé », plus imagée, pour désigner cet outil qui à lui seul incarne, en même temps qu’il la symbolise, toute une façon de faire de la sociologie.

Pierre Mercklé - Les 100 mots de la sociologie

Table de contingence en effectifs

Exemple : étudier le lien entre genre et filière du CPES.

t <- table(cpes$genre, cpes$cpes.filiere)
t
       
        humanites sciences sesj
  femme        35       17   42
  homme        17        9    8

Avec les marges :

t.margins <- addmargins(t)
t.margins
       
        humanites sciences sesj Sum
  femme        35       17   42  94
  homme        17        9    8  34
  Sum          52       26   50 128

En changeant le nom des marges :

t.margins <- addmargins(t, FUN = list(list(Ensemble = sum)), quiet = T)
t.margins
          
           humanites sciences sesj Ensemble
  femme           35       17   42       94
  homme           17        9    8       34
  Ensemble        52       26   50      128

Interprétez. Quelles sont les limites d’un tableau contenant uniquement des effectifs ?

Pourcentages totaux

Solution “manuelle” ?

t/nrow(cpes)
       
        humanites  sciences      sesj
  femme 0.2734375 0.1328125 0.3281250
  homme 0.1328125 0.0703125 0.0625000

Évidemment, il existe une fonction plus élégante, fournie par le package questionr :

library("questionr")
prop(t)
       
        humanites sciences sesj  Total
  femme  27.3      13.3     32.8  73.4
  homme  13.3       7.0      6.2  26.6
  Total  40.6      20.3     39.1 100.0

Interprétez ce tableau. Quelles sont ses limites ?

Pourcentages en ligne

Fonction rprop, fournie par questionr, rend la tâche très simple :

lprop(t)
          
           humanites sciences sesj  Total
  femme     37.2      18.1     44.7 100.0
  homme     50.0      26.5     23.5 100.0
  Ensemble  40.6      20.3     39.1 100.0

Comment interpréter ce tableau ? Comment utiliser l’ensemble ? Ce tableau nous informe-t-il sur le lien entre ces deux variables ? Si oui, de quelle manière ?

Pourcentages en colonne

Encore une fois, une fonction très simple :

cprop(t)
       
        humanites sciences sesj  Ensemble
  femme  67.3      65.4     84.0  73.4   
  homme  32.7      34.6     16.0  26.6   
  Total 100.0     100.0    100.0 100.0   

Comment interpréter ce tableau ? Comment utiliser l’ensemble ? Ce tableau nous informe-t-il sur le lien entre ces deux variables ? Si oui, de quelle manière ?

Créer une table de contigence pour une question à choix multiples

Difficulté pour les questions à choix multiples,

# Étape 1 : regrouper les variables dichotomiques
courses <- cpes[, c("courses.bio", "courses.discount", "courses.epicerie", "courses.marche", "courses.supermarche", "courses.traiteur")]
# Étape 2 : créer le tableau des effectifs
t <- cross.multi.table(courses, cpes$cpes.filiere)
addmargins(t)
                    humanites sciences sesj Sum
courses.bio                 9        5    4  18
courses.discount           18        5   15  38
courses.epicerie            6        2    5  13
courses.marche              2        1    1   4
courses.supermarche        19       10   23  52
courses.traiteur            4        2    8  14
Sum                        58       25   56 139

On peut aussi calculer des pourcentages en colonne si l’on souhaite :

# Étape 3 : afficher le tableau avec des % en colonne
cprop(t)
                    humanites sciences sesj  Ensemble
courses.bio          15.5      20.0      7.1  12.9   
courses.discount     31.0      20.0     26.8  27.3   
courses.epicerie     10.3       8.0      8.9   9.4   
courses.marche        3.4       4.0      1.8   2.9   
courses.supermarche  32.8      40.0     41.1  37.4   
courses.traiteur      6.9       8.0     14.3  10.1   
Total               100.0     100.0    100.0 100.0   

Attention : est-ce normal d’obtenir 100% en total ? Déduisez l’individu statistique dans ce tableau.

Alternative graphique

Graphique en mosaïque :

mosaicplot(genre ~ cpes.filiere, data = cpes,
           main = "Relation entre genre et filière du CPES")

Lien entre une variable quantitative et une variable qualitative

Graphique : boîte à moustaches multiples

Premier exemple : lien entre temps passé à cuisiner et le genre.

boxplot(cuisine.temps ~ genre, data = cpes)

Interprétez.

Exemple 2 : temps de cuisine et baccalauréat de la mère.

boxplot(cuisine.temps ~ mere.bac, data = cpes)

Interprétez.

Tableau

Tableau qui croise la variable catégorielle avec la moyenne de la variable quantitative dans chacun des groupes.

Exemple 1 :

aggregate(cpes$cuisine.temps, list(Genre=cpes$genre), mean, na.rm = TRUE)

Exemple 2 :

aggregate(cpes$cuisine.temps, list(MereBac=cpes$mere.bac), mean, na.rm = TRUE)

Comment interpréter ces deux tableaux ?

LS0tCnRpdGxlOiAiU3RhdGlzdGlxdWUgZGVzY3JpcHRpdmUgYml2YXJpw6llIgpzdWJ0aXRsZTogIkNQRVMgMiAtIFRlY2huaXF1ZXMgcXVhbnRpdGF0aXZlcyIKZGF0ZTogIkTDqWNlbWJyZSAyMDE2IgphdXRob3I6ICJHYWJyaWVsIEFsY2FyYXMiCm91dHB1dDogCiAgaHRtbF9ub3RlYm9vazogCiAgICB0b2M6IHllcwotLS0KCk5vdXMgY2hhcmdlb25zIGxhIGJhc2UgZGUgZG9ubsOpZXMgZGFucyBsYSB2YXJpYWJsZSBgY3Blc2AgOiAKCmBgYHtyLCBlY2hvPVRSVUV9CiMgQ2hhcmdlciBkZXMgZG9ubsOpZXMgZGFucyBsYSB2YXJpYWJsZSBjcGVzCmNwZXMgPC0gcmVhZC5jc3YoIi4vY3Blc19xdWFudGkvYmRkX2FsaW1lbnRhdGlvbi5jc3YiKQpgYGAKCiMgSW50cm9kdWN0aW9uIDogdXRpbGl0w6kgZGUgbGEgc3RhdGlzdGlxdWUgZGVzY3JpcHRpdmUgYml2YXJpw6llCgpPbiBjb25zaWTDqHJlICoqY29uam9pbnRlbWVudCBkZXV4IHZhcmlhYmxlcyBYIGV0IFkqKiBwb3VyCgorIGFuYWx5c2VyIGxlcyB2YWxldXJzIHByaXNlcyBwYXIgY2hhY3VuZSBkZXMgZGV1eCB2YXJpYWJsZXMKKyDDqXR1ZGllciBsZSBsaWVuIMOpdmVudHVlbCBlbnRyZSBsZXMgZGV1eCB2YXJpYWJsZXMgKGNvcnLDqWxhdGlvbikKKyBmb3JtdWxlciBkZXMgaHlwb3Row6hzZXMKCiMgTGllbiBlbnRyZSBkZXV4IHZhcmlhYmxlcyBxdWFudGl0YXRpdmVzCgpOb3VzIGFsbG9ucyDDqXR1ZGllciBkZXV4IG91dGlscyBxdWkgcGV1dmVudCDDqnRyZSBlbXBsb3nDqXMgcG91ciBkw6ljcmlyZSBsZSBsaWVuIGVudHJlIGRldXggdmFyaWFibGVzIHF1YW50aXRhdGl2ZXMuCgojIyBMZSBudWFnZSBkZSBwb2ludHMKClByZW1pZXIgZXhlbXBsZSA6IGxpZW4gZW50cmUgbGUgbm9tYnJlIGRlIHJlcGFzIHByaXMgc2V1bHMgZXQgbGUgbm9tYnJlIGRlIHJlcGFzIHByaXMgZGFucyBzb24gbG9nZW1lbnQgcGVyc29ubmVsLgoKYGBge3IsIGVjaG89VFJVRX0KcmVwYXMuc2V1bCA8LSBjcGVzJHJlcGFzLnF1aS5zZXVsLm1pZGkgKyBjcGVzJHJlcGFzLnF1aS5zZXVsLnNvaXIKcmVwYXMubG9ndCA8LSBjcGVzJHJlcGFzLm91LmxvZ2VtZW50Lm1pZGkgKyBjcGVzJHJlcGFzLm91LmxvZ2VtZW50LnNvaXIKCnBsb3QocmVwYXMuc2V1bCwgcmVwYXMubG9ndCwKICAgICB4bGFiID0gIk5vbWJyZSBkZSByZXBhcyBwcmlzIHNldWxzIiwKICAgICB5bGFiID0gIk5vbWJyZSBkZSByZXBhcyBwcmlzIGNoZXogc29pIiwKICAgICBtYWluID0gIkxpZW4gZW50cmUgbGUgbm9tYnJlIGRlIHJlcGFzIHByaXMgc2V1bHMgZXQgY2hleiBzb2kiKQpgYGAKClF1ZXN0aW9ucyA6CgorIFJlbWFycXVlei12b3VzIHVuIGxpZW4gZW50cmUgY2VzIGRldXggdmFyaWFibGVzID8KKyBQb3VycXVvaSBjZXJ0YWlucyBwb2ludHMgc29udC1pbHMgcGx1cyAiZm9uY8OpcyIgcXVlIGQnYXV0cmVzID8gRW4gcXVvaSBwb3VycmFpdC1vbiBhbcOpbGlvcmVyIGNlIGdyYXBoaXF1ZSA/CisgQ29tbWVudCBvYnRpZW50LW9uIGxlcyBsw6lnZW5kZXMgZGUgY2UgZ3JhcGhpcXVlID8KCkRldXhpw6htZSBleGVtcGxlIDogbGllbiBlbnRyZSBtb250YW50IGRlcyBjb3Vyc2VzIHBhciBwZXJzb25uZSBldCBkZXMgcmVzc291cmNlcyBmaW5hbmNpw6hyZXMgdG90YWxlcy4KCmBgYHtyLCBlY2hvPVRSVUV9CiMgT24gY29tbWVuY2UgcGFyIHPDqWxlY3Rpb25uZXIgdW4gc291cy1lbnNlbWJsZSBkZSBub3RyZSDDqWNoYW50aWxsb24sCiMgY2V1eCBxdWkgb250IGZhaXQgZGVzIGNvdXJzZXMgcG91ciBhdSBtb2lucyB1bmUgcGVyc29ubmUuCmNwZXMuY291cnNlcyA8LSBjcGVzW2NwZXMkY291cnNlcy5wZXJzID49IDEsIF0KCiMgT24gcGV1dCBlbnN1aXRlIGFqb3V0ZXIgdW5lIG5vdXZlbGxlIHZhcmlhYmxlIMOgIG5vdHJlIGJhc2UgZGUgZG9ubsOpZXMgOiBsZSBtb250YW50IGRlcyBjb3Vyc2VzIHBvdXIgdW5lIHBlcnNvbm5lCmNwZXMuY291cnNlcyRjb3Vyc2VzLnByaXhwcm9wIDwtIGNwZXMuY291cnNlcyRjb3Vyc2VzLnByaXgvY3Blcy5jb3Vyc2VzJGNvdXJzZXMucGVycwoKIyBPbiB0cmFjZSBsZSBudWFnZSBkZSBwb2ludHMKcGxvdChjcGVzLmNvdXJzZXMkcmVzc291cmNlcy50b3RhbCwgY3Blcy5jb3Vyc2VzJGNvdXJzZXMucHJpeHByb3AsCiAgICAgcGNoID0gMTksIGNvbCA9IHJnYigxLCAwLCAwLCAwLjMpLCAjIEZhaXJlIGRlcyBwb2ludHMgdHJhbnNwYXJlbnRzIMOgIDMwJQogICAgIGZyYW1lLnBsb3QgPSBGLCAjIFN1cHByaW1lciBsYSBib8OudGUgZW4gaGF1dCBldCDDoCBkcm9pdGUKICAgICB4bGFiID0gIk1vbnRhbnQgZGVzIHJlc3NvdXJjZXMgdG90YWxlcyAo4oKsKSIsCiAgICAgeWxhYiA9ICJNb250YW50IGRlcyBjb3Vyc2VzIHBhciBwZXJzb25uZSAo4oKsKSIsCiAgICAgbWFpbiA9ICJMaWVuIGVudHJlIHJlc3NvdXJjZXMgZmluYW5jacOocmVzIGV0IG1vbnRhbnQgZGVzIGNvdXJzZXMiKQpgYGAKClF1ZXN0aW9ucyA6CgorIFJlbWFycXVlei12b3VzIHVuIGxpZW4gZW50cmUgY2VzIGRldXggdmFyaWFibGVzID8KKyBDZSBsaWVuIHZvdXMgcGFyYcOudC1pbCBwbHVzIGZvcnQgb3UgcGx1cyDDqXZpZGVudCBxdWUgbGUgcHLDqWPDqWRlbnQgPwoKIyMgTGUgJHIkIGRlIFBlYXJzb24KCkxlIGNvZWZmaWNpZW50ICRyJCBkZSBQZWFyc29uIHBlcm1ldCBkZSBtZXN1cmVyIGxlIGRlZ3LDqSBkZSBjb3Jyw6lsYXRpb24gbGluw6lhaXJlIGVudHJlIGRldXggdmFyaWFibGVzIHF1YW50aXRhdGl2ZXMgJFgkIGV0ICRZJC4gSWwgZXN0IGNvbXByaXMgZW50cmUgJFstMSA7IDFdJCA6CgorIExlIHNpZ25lIGluZGlxdWUgdW5lIGNvcnLDqWxhdGlvbiBwb3NpdGl2ZSBvdSBuw6lnYXRpdmUKKyAwIHNpZ25pZmllIHVuZSBhYnNlbmNlIGRlIGNvcnLDqWxhdGlvbgorIFBsdXMgbGEgdmFsZXVyIGFic29sdWUgZXN0IHByb2NoZSBkZSAxLCBwbHVzIGxlIGRlZ3LDqSBkZSBjb3Jyw6lsYXRpb24gbGluw6lhaXJlIGVzdCDDqWxldsOpCgoqKlBydWRlbmNlICEqKiBMZSAkciQgZGUgUGVhcnNvbiBtZXN1cmUgc2V1bGVtZW50IGxhIGZvcmNlIGRlIGxhICpjb3Jyw6lsYXRpb24gbGluw6lhaXJlKiBlbnRyZSBkZXV4IHZhcmlhYmxlcy4gRCdhdXRyZXMgcmVsYXRpb25zLCBub24tbGluw6lhaXJlcywgcGV1dmVudCBleGlzdGVyLgoKQ2FsY3VsIGR1ICRyJCBwb3VyIGwnZXhlbXBsZSAxIDoKCmBgYHtyfQojIEwnYXJndW1lbnQgInVzZSIgcGVybWV0IGRlIG5lIHBhcyBzZSBwcsOpb2NjdXBlciBkZXMgTkEKY29yKHJlcGFzLnNldWwsIHJlcGFzLmxvZ3QsIHVzZSA9ICJjb21wbGV0ZS5vYnMiKQpgYGAKCkludGVycHLDqXRleiBjZSBjb2VmZmljaWVudC4KCkNhbGN1bCBkdSAkciQgcG91ciBsJ2V4ZW1wbGUgMiA6CgpgYGB7cn0KIyBMJ2FyZ3VtZW50ICJ1c2UiIHBlcm1ldCBkZSBuZSBwYXMgc2UgcHLDqW9jY3VwZXIgZGVzIE5BCmNvcihjcGVzLmNvdXJzZXMkcmVzc291cmNlcy50b3RhbCwgY3Blcy5jb3Vyc2VzJGNvdXJzZXMucHJpeHByb3AsIHVzZSA9ICJjb21wbGV0ZS5vYnMiKQpgYGAKCkludGVycHLDqXRleiBjZSBjb2VmZmljaWVudCBldCBjb21wYXJlei1sZSBhdSBwcsOpY8OpZGVudC4gUXVlIHBvdXZlei12b3VzIGVuIGTDqWR1aXJlID8KCiMgTGllbiBlbnRyZSBkZXV4IHZhcmlhYmxlcyBxdWFsaXRhdGl2ZXMKCiMjIExhIHRhYmxlIGRlIGNvbnRpbmdlbmNlCgpBdXNzaSBhcHBlbMOpICJ0YWJsZWF1IGNyb2lzw6kiLgoKPiBTaSBsZXMgc3RhdGlzdGljaWVucyBwcsOpZsOocmVudCwgZW4gdG91dGUgcmlndWV1ciwgcGFybGVyIGRlIMKrwqB0YWJsZSBkZSBjb250aW5nZW5jZSDCuywgbGVzIHNvY2lvbG9ndWVzIHV0aWxpc2VudCBwbHVzIGZhY2lsZW1lbnQgbOKAmWV4cHJlc3Npb24gZGUgwqsgdGFibGVhdSBjcm9pc8OpIMK7LCBwbHVzIGltYWfDqWUsIHBvdXIgZMOpc2lnbmVyIGNldCBvdXRpbCBxdWkgw6AgbHVpIHNldWwgaW5jYXJuZSwgZW4gbcOqbWUgdGVtcHMgcXXigJlpbCBsYSBzeW1ib2xpc2UsIHRvdXRlIHVuZSBmYcOnb24gZGUgZmFpcmUgZGUgbGEgc29jaW9sb2dpZS4KClBpZXJyZSBNZXJja2zDqSAtIExlcyAxMDAgbW90cyBkZSBsYSBzb2Npb2xvZ2llCgojIyMgVGFibGUgZGUgY29udGluZ2VuY2UgZW4gZWZmZWN0aWZzCgpFeGVtcGxlIDogw6l0dWRpZXIgbGUgbGllbiBlbnRyZSBnZW5yZSBldCBmaWxpw6hyZSBkdSBDUEVTLgoKYGBge3J9CnQgPC0gdGFibGUoY3BlcyRnZW5yZSwgY3BlcyRjcGVzLmZpbGllcmUpCnQKYGBgCgpBdmVjIGxlcyBtYXJnZXMgOgoKYGBge3J9CnQubWFyZ2lucyA8LSBhZGRtYXJnaW5zKHQpCnQubWFyZ2lucwpgYGAKCkVuIGNoYW5nZWFudCBsZSBub20gZGVzIG1hcmdlcyA6CgpgYGB7cn0KdC5tYXJnaW5zIDwtIGFkZG1hcmdpbnModCwgRlVOID0gbGlzdChsaXN0KEVuc2VtYmxlID0gc3VtKSksIHF1aWV0ID0gVCkKdC5tYXJnaW5zCmBgYAoKSW50ZXJwcsOpdGV6LiBRdWVsbGVzIHNvbnQgbGVzIGxpbWl0ZXMgZCd1biB0YWJsZWF1IGNvbnRlbmFudCB1bmlxdWVtZW50IGRlcyBlZmZlY3RpZnMgPwoKIyMjIFBvdXJjZW50YWdlcyB0b3RhdXgKClNvbHV0aW9uICJtYW51ZWxsZSIgPwoKYGBge3J9CnQvbnJvdyhjcGVzKQpgYGAKCsOJdmlkZW1tZW50LCBpbCBleGlzdGUgdW5lIGZvbmN0aW9uIHBsdXMgw6lsw6lnYW50ZSwgZm91cm5pZSBwYXIgbGUgcGFja2FnZSBgcXVlc3Rpb25yYCA6CgpgYGB7cn0KbGlicmFyeSgicXVlc3Rpb25yIikKcHJvcCh0KQpgYGAKCkludGVycHLDqXRleiBjZSB0YWJsZWF1LiBRdWVsbGVzIHNvbnQgc2VzIGxpbWl0ZXMgPwoKIyMjIFBvdXJjZW50YWdlcyBlbiBsaWduZQoKRm9uY3Rpb24gYHJwcm9wYCwgZm91cm5pZSBwYXIgYHF1ZXN0aW9ucmAsIHJlbmQgbGEgdMOiY2hlIHRyw6hzIHNpbXBsZSA6CgpgYGB7cn0KcnByb3AodCkKYGBgCgpDb21tZW50IGludGVycHLDqXRlciBjZSB0YWJsZWF1ID8gQ29tbWVudCB1dGlsaXNlciBsJ2Vuc2VtYmxlID8gQ2UgdGFibGVhdSBub3VzIGluZm9ybWUtdC1pbCBzdXIgbGUgbGllbiBlbnRyZSBjZXMgZGV1eCB2YXJpYWJsZXMgPyBTaSBvdWksIGRlIHF1ZWxsZSBtYW5pw6hyZSA/CgojIyMgUG91cmNlbnRhZ2VzIGVuIGNvbG9ubmUKCkVuY29yZSB1bmUgZm9pcywgdW5lIGZvbmN0aW9uIHRyw6hzIHNpbXBsZSA6CgpgYGB7cn0KY3Byb3AodCkKYGBgCgpDb21tZW50IGludGVycHLDqXRlciBjZSB0YWJsZWF1ID8gQ29tbWVudCB1dGlsaXNlciBsJ2Vuc2VtYmxlID8gQ2UgdGFibGVhdSBub3VzIGluZm9ybWUtdC1pbCBzdXIgbGUgbGllbiBlbnRyZSBjZXMgZGV1eCB2YXJpYWJsZXMgPyBTaSBvdWksIGRlIHF1ZWxsZSBtYW5pw6hyZSA/CgojIyMgQ3LDqWVyIHVuZSB0YWJsZSBkZSBjb250aWdlbmNlIHBvdXIgdW5lIHF1ZXN0aW9uIMOgIGNob2l4IG11bHRpcGxlcwoKRGlmZmljdWx0w6kgcG91ciBsZXMgcXVlc3Rpb25zIMOgIGNob2l4IG11bHRpcGxlcywgCgpgYGB7cn0KIyDDiXRhcGUgMSA6IHJlZ3JvdXBlciBsZXMgdmFyaWFibGVzIGRpY2hvdG9taXF1ZXMKY291cnNlcyA8LSBjcGVzWywgYygiY291cnNlcy5iaW8iLCAiY291cnNlcy5kaXNjb3VudCIsICJjb3Vyc2VzLmVwaWNlcmllIiwgImNvdXJzZXMubWFyY2hlIiwgImNvdXJzZXMuc3VwZXJtYXJjaGUiLCAiY291cnNlcy50cmFpdGV1ciIpXQoKIyDDiXRhcGUgMiA6IGNyw6llciBsZSB0YWJsZWF1IGRlcyBlZmZlY3RpZnMKdCA8LSBjcm9zcy5tdWx0aS50YWJsZShjb3Vyc2VzLCBjcGVzJGNwZXMuZmlsaWVyZSkKCmFkZG1hcmdpbnModCkKYGBgCgpPbiBwZXV0IGF1c3NpIGNhbGN1bGVyIGRlcyBwb3VyY2VudGFnZXMgZW4gY29sb25uZSBzaSBsJ29uIHNvdWhhaXRlIDogCgpgYGB7cn0KIyDDiXRhcGUgMyA6IGFmZmljaGVyIGxlIHRhYmxlYXUgYXZlYyBkZXMgJSBlbiBjb2xvbm5lCmNwcm9wKHQpCmBgYAoKKipBdHRlbnRpb24qKiA6IGVzdC1jZSBub3JtYWwgZCdvYnRlbmlyIDEwMCUgZW4gdG90YWwgPyBEw6lkdWlzZXogbCdpbmRpdmlkdSBzdGF0aXN0aXF1ZSBkYW5zIGNlIHRhYmxlYXUuCgojIyBBbHRlcm5hdGl2ZSBncmFwaGlxdWUKCkdyYXBoaXF1ZSBlbiBtb3Nhw69xdWUgOgoKYGBge3J9Cm1vc2FpY3Bsb3QoZ2VucmUgfiBjcGVzLmZpbGllcmUsIGRhdGEgPSBjcGVzLAogICAgICAgICAgIG1haW4gPSAiUmVsYXRpb24gZW50cmUgZ2VucmUgZXQgZmlsacOocmUgZHUgQ1BFUyIpCmBgYAoKIyBMaWVuIGVudHJlIHVuZSB2YXJpYWJsZSBxdWFudGl0YXRpdmUgZXQgdW5lIHZhcmlhYmxlIHF1YWxpdGF0aXZlCgojIyBHcmFwaGlxdWUgOiBib8OudGUgw6AgbW91c3RhY2hlcyBtdWx0aXBsZXMKClByZW1pZXIgZXhlbXBsZSA6IGxpZW4gZW50cmUgdGVtcHMgcGFzc8OpIMOgIGN1aXNpbmVyIGV0IGxlIGdlbnJlLgoKYGBge3J9CmJveHBsb3QoY3Vpc2luZS50ZW1wcyB+IGdlbnJlLCBkYXRhID0gY3BlcykKYGBgCgpJbnRlcnByw6l0ZXouCgpFeGVtcGxlIDIgOiB0ZW1wcyBkZSBjdWlzaW5lIGV0IGJhY2NhbGF1csOpYXQgZGUgbGEgbcOocmUuCgpgYGB7cn0KYm94cGxvdChjdWlzaW5lLnRlbXBzIH4gbWVyZS5iYWMsIGRhdGEgPSBjcGVzKQpgYGAKCkludGVycHLDqXRlei4KCiMjIFRhYmxlYXUKClRhYmxlYXUgcXVpIGNyb2lzZSBsYSB2YXJpYWJsZSBjYXTDqWdvcmllbGxlIGF2ZWMgbGEgbW95ZW5uZSBkZSBsYSB2YXJpYWJsZSBxdWFudGl0YXRpdmUgZGFucyBjaGFjdW4gZGVzIGdyb3VwZXMuCgpFeGVtcGxlIDEgOgoKYGBge3J9CmFnZ3JlZ2F0ZShjcGVzJGN1aXNpbmUudGVtcHMsIGxpc3QoR2VucmU9Y3BlcyRnZW5yZSksIG1lYW4sIG5hLnJtID0gVFJVRSkKYGBgCgpFeGVtcGxlIDIgOgoKYGBge3J9CmFnZ3JlZ2F0ZShjcGVzJGN1aXNpbmUudGVtcHMsIGxpc3QoTWVyZUJhYz1jcGVzJG1lcmUuYmFjKSwgbWVhbiwgbmEucm0gPSBUUlVFKQpgYGAKCkNvbW1lbnQgaW50ZXJwcsOpdGVyIGNlcyBkZXV4IHRhYmxlYXV4ID8=