Contexto

La base de datos de USArrests contiene estadisticas de arrestos por cada 100,000 residentes por agresion, asesinato y violacion en cada uno de los 50 estados de EE.UU EN 1973.

Instalar paquetes y llamar librerías

#install.packages("cluster") # Para agrupamientos
library(cluster)
#install.packages("ggplot2") # Para graficar
library(ggplot2)
#install.packages("factoextra") # Visualizar Clusters
library(factoextra)
## Welcome! Want to learn more? See two factoextra-related books at https://goo.gl/ve3WBa
#install.packages("data.table") # Conjunto de datos grandes
library(data.table)
#install.packages("tidyverse")
library(tidyverse)
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ dplyr     1.1.4     ✔ readr     2.1.5
## ✔ forcats   1.0.0     ✔ stringr   1.5.1
## ✔ lubridate 1.9.4     ✔ tibble    3.2.1
## ✔ purrr     1.0.4     ✔ tidyr     1.3.1
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::between()     masks data.table::between()
## ✖ dplyr::filter()      masks stats::filter()
## ✖ dplyr::first()       masks data.table::first()
## ✖ lubridate::hour()    masks data.table::hour()
## ✖ lubridate::isoweek() masks data.table::isoweek()
## ✖ dplyr::lag()         masks stats::lag()
## ✖ dplyr::last()        masks data.table::last()
## ✖ lubridate::mday()    masks data.table::mday()
## ✖ lubridate::minute()  masks data.table::minute()
## ✖ lubridate::month()   masks data.table::month()
## ✖ lubridate::quarter() masks data.table::quarter()
## ✖ lubridate::second()  masks data.table::second()
## ✖ purrr::transpose()   masks data.table::transpose()
## ✖ lubridate::wday()    masks data.table::wday()
## ✖ lubridate::week()    masks data.table::week()
## ✖ lubridate::yday()    masks data.table::yday()
## ✖ lubridate::year()    masks data.table::year()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
# install.packages("ggplot2")# Graficos con mejor diseño
library(ggplot2)
# install.packages("lattice")# Crear graficos
library(lattice)
# install.packages("DataExplorer")# Analisis Descriptivo
library(DataExplorer)
#install.packages("kernlab")
library(kernlab)
## 
## Adjuntando el paquete: 'kernlab'
## 
## The following object is masked from 'package:purrr':
## 
##     cross
## 
## The following object is masked from 'package:ggplot2':
## 
##     alpha
#install.packages("rpart")
library(rpart)
#install.packages("randomForest")
library(randomForest)
## randomForest 4.7-1.2
## Type rfNews() to see new features/changes/bug fixes.
## 
## Adjuntando el paquete: 'randomForest'
## 
## The following object is masked from 'package:dplyr':
## 
##     combine
## 
## The following object is masked from 'package:ggplot2':
## 
##     margin
# install.packages("caret")# Algoritmos de aprendizaje automatico
library(caret)
## 
## Adjuntando el paquete: 'caret'
## 
## The following object is masked from 'package:purrr':
## 
##     lift

Importar la base de datos

df <- USArrests

Escalar la base de datos

datos_escalados <- scale(df)

Generar los segmentos

grupos <- 4
segmentos <- kmeans(datos_escalados, grupos)

Asignar grupos a los datos

asignacion <- cbind(df, cluster=
                      segmentos$cluster)

Graficar los clusters

fviz_cluster(segmentos, data=df)

Optimizar la cantidad de grupos

set.seed(123)
optimizacion <- clusGap(datos_escalados, FUN=kmeans, nstart=1,K.max = 10)
plot(optimizacion, xlab="Número de clusters k")

Comparar segmentos

promedio <- aggregate(asignacion, by=list(asignacion$cluster),FUN = mean)
promedio
##   Group.1   Murder   Assault UrbanPop     Rape cluster
## 1       1  5.65625 138.87500 73.87500 18.78125       1
## 2       2 10.81538 257.38462 76.00000 33.19231       2
## 3       3  3.60000  78.53846 52.07692 12.17692       3
## 4       4 13.93750 243.62500 53.75000 21.41250       4
table(asignacion$cluster)
## 
##  1  2  3  4 
## 16 13 13  8
nombres_clusters <- c("Estados Seguros", "Estados con alto crimen", "Estados peligrosos", "Estados con bajo crimen")

asignacion <- asignacion %>%
  mutate(Nombre_de_clusters = case_when(
    cluster == 1 ~ nombres_clusters[1],
    cluster == 2 ~ nombres_clusters[2],
    cluster == 3 ~ nombres_clusters[3],
    cluster == 4 ~ nombres_clusters[4]
  ))
asignacion <- asignacion %>% select(-cluster)
print(asignacion)
##                Murder Assault UrbanPop Rape      Nombre_de_clusters
## Alabama          13.2     236       58 21.2 Estados con bajo crimen
## Alaska           10.0     263       48 44.5 Estados con alto crimen
## Arizona           8.1     294       80 31.0 Estados con alto crimen
## Arkansas          8.8     190       50 19.5 Estados con bajo crimen
## California        9.0     276       91 40.6 Estados con alto crimen
## Colorado          7.9     204       78 38.7 Estados con alto crimen
## Connecticut       3.3     110       77 11.1         Estados Seguros
## Delaware          5.9     238       72 15.8         Estados Seguros
## Florida          15.4     335       80 31.9 Estados con alto crimen
## Georgia          17.4     211       60 25.8 Estados con bajo crimen
## Hawaii            5.3      46       83 20.2         Estados Seguros
## Idaho             2.6     120       54 14.2      Estados peligrosos
## Illinois         10.4     249       83 24.0 Estados con alto crimen
## Indiana           7.2     113       65 21.0         Estados Seguros
## Iowa              2.2      56       57 11.3      Estados peligrosos
## Kansas            6.0     115       66 18.0         Estados Seguros
## Kentucky          9.7     109       52 16.3      Estados peligrosos
## Louisiana        15.4     249       66 22.2 Estados con bajo crimen
## Maine             2.1      83       51  7.8      Estados peligrosos
## Maryland         11.3     300       67 27.8 Estados con alto crimen
## Massachusetts     4.4     149       85 16.3         Estados Seguros
## Michigan         12.1     255       74 35.1 Estados con alto crimen
## Minnesota         2.7      72       66 14.9      Estados peligrosos
## Mississippi      16.1     259       44 17.1 Estados con bajo crimen
## Missouri          9.0     178       70 28.2 Estados con alto crimen
## Montana           6.0     109       53 16.4      Estados peligrosos
## Nebraska          4.3     102       62 16.5      Estados peligrosos
## Nevada           12.2     252       81 46.0 Estados con alto crimen
## New Hampshire     2.1      57       56  9.5      Estados peligrosos
## New Jersey        7.4     159       89 18.8         Estados Seguros
## New Mexico       11.4     285       70 32.1 Estados con alto crimen
## New York         11.1     254       86 26.1 Estados con alto crimen
## North Carolina   13.0     337       45 16.1 Estados con bajo crimen
## North Dakota      0.8      45       44  7.3      Estados peligrosos
## Ohio              7.3     120       75 21.4         Estados Seguros
## Oklahoma          6.6     151       68 20.0         Estados Seguros
## Oregon            4.9     159       67 29.3         Estados Seguros
## Pennsylvania      6.3     106       72 14.9         Estados Seguros
## Rhode Island      3.4     174       87  8.3         Estados Seguros
## South Carolina   14.4     279       48 22.5 Estados con bajo crimen
## South Dakota      3.8      86       45 12.8      Estados peligrosos
## Tennessee        13.2     188       59 26.9 Estados con bajo crimen
## Texas            12.7     201       80 25.5 Estados con alto crimen
## Utah              3.2     120       80 22.9         Estados Seguros
## Vermont           2.2      48       32 11.2      Estados peligrosos
## Virginia          8.5     156       63 20.7         Estados Seguros
## Washington        4.0     145       73 26.2         Estados Seguros
## West Virginia     5.7      81       39  9.3      Estados peligrosos
## Wisconsin         2.6      53       66 10.8      Estados peligrosos
## Wyoming           6.8     161       60 15.6         Estados Seguros

Partir los datos 80-20

set.seed(123)
renglones_entrenamiento <- createDataPartition(asignacion$Nombre_de_clusters, p=0.8, list=FALSE)
entrenamiento <- asignacion[renglones_entrenamiento, ]
prueba <- asignacion[-renglones_entrenamiento, ]

Modelo. Árbol de decisión

entrenamiento$Nombre_de_clusters <- as.factor(entrenamiento$Nombre_de_clusters)
prueba$Nombre_de_clusters <- as.factor(prueba$Nombre_de_clusters)

modelo <- train(Nombre_de_clusters ~ ., data = entrenamiento,
                 method = "nnet", # Cambiar 
                 preProcess=c("scale","center"),
                 trControl = trainControl(method="cv", number = 10),
                 trace = FALSE         #Cambiar hiperparametros
                 )

resultado_Entrenamiento <- predict(modelo,entrenamiento)
resultado_prueba <- predict(modelo, prueba)

# Matriz de Confusión del Resultado del Entrenamiento 
mcre <- confusionMatrix(resultado_Entrenamiento, entrenamiento$Nombre_de_clusters)
mcre
## Confusion Matrix and Statistics
## 
##                          Reference
## Prediction                Estados con alto crimen Estados con bajo crimen
##   Estados con alto crimen                      11                       0
##   Estados con bajo crimen                       0                       7
##   Estados peligrosos                            0                       0
##   Estados Seguros                               0                       0
##                          Reference
## Prediction                Estados peligrosos Estados Seguros
##   Estados con alto crimen                  0               0
##   Estados con bajo crimen                  0               0
##   Estados peligrosos                      11               0
##   Estados Seguros                          0              13
## 
## Overall Statistics
##                                      
##                Accuracy : 1          
##                  95% CI : (0.9159, 1)
##     No Information Rate : 0.3095     
##     P-Value [Acc > NIR] : < 2.2e-16  
##                                      
##                   Kappa : 1          
##                                      
##  Mcnemar's Test P-Value : NA         
## 
## Statistics by Class:
## 
##                      Class: Estados con alto crimen
## Sensitivity                                  1.0000
## Specificity                                  1.0000
## Pos Pred Value                               1.0000
## Neg Pred Value                               1.0000
## Prevalence                                   0.2619
## Detection Rate                               0.2619
## Detection Prevalence                         0.2619
## Balanced Accuracy                            1.0000
##                      Class: Estados con bajo crimen Class: Estados peligrosos
## Sensitivity                                  1.0000                    1.0000
## Specificity                                  1.0000                    1.0000
## Pos Pred Value                               1.0000                    1.0000
## Neg Pred Value                               1.0000                    1.0000
## Prevalence                                   0.1667                    0.2619
## Detection Rate                               0.1667                    0.2619
## Detection Prevalence                         0.1667                    0.2619
## Balanced Accuracy                            1.0000                    1.0000
##                      Class: Estados Seguros
## Sensitivity                          1.0000
## Specificity                          1.0000
## Pos Pred Value                       1.0000
## Neg Pred Value                       1.0000
## Prevalence                           0.3095
## Detection Rate                       0.3095
## Detection Prevalence                 0.3095
## Balanced Accuracy                    1.0000
mcrp <- confusionMatrix(resultado_prueba, prueba$Nombre_de_clusters)
mcrp
## Confusion Matrix and Statistics
## 
##                          Reference
## Prediction                Estados con alto crimen Estados con bajo crimen
##   Estados con alto crimen                       2                       0
##   Estados con bajo crimen                       0                       0
##   Estados peligrosos                            0                       0
##   Estados Seguros                               0                       1
##                          Reference
## Prediction                Estados peligrosos Estados Seguros
##   Estados con alto crimen                  0               0
##   Estados con bajo crimen                  0               0
##   Estados peligrosos                       2               0
##   Estados Seguros                          0               3
## 
## Overall Statistics
##                                           
##                Accuracy : 0.875           
##                  95% CI : (0.4735, 0.9968)
##     No Information Rate : 0.375           
##     P-Value [Acc > NIR] : 0.005605        
##                                           
##                   Kappa : 0.8182          
##                                           
##  Mcnemar's Test P-Value : NA              
## 
## Statistics by Class:
## 
##                      Class: Estados con alto crimen
## Sensitivity                                    1.00
## Specificity                                    1.00
## Pos Pred Value                                 1.00
## Neg Pred Value                                 1.00
## Prevalence                                     0.25
## Detection Rate                                 0.25
## Detection Prevalence                           0.25
## Balanced Accuracy                              1.00
##                      Class: Estados con bajo crimen Class: Estados peligrosos
## Sensitivity                                   0.000                      1.00
## Specificity                                   1.000                      1.00
## Pos Pred Value                                  NaN                      1.00
## Neg Pred Value                                0.875                      1.00
## Prevalence                                    0.125                      0.25
## Detection Rate                                0.000                      0.25
## Detection Prevalence                          0.000                      0.25
## Balanced Accuracy                             0.500                      1.00
##                      Class: Estados Seguros
## Sensitivity                           1.000
## Specificity                           0.800
## Pos Pred Value                        0.750
## Neg Pred Value                        1.000
## Prevalence                            0.375
## Detection Rate                        0.375
## Detection Prevalence                  0.500
## Balanced Accuracy                     0.900
LS0tDQp0aXRsZTogIlVTQXJyZXN0cyINCmF1dGhvcjogIkFkcmnDoW4gR2FyemEgLSBBMDEyODU0MTIiDQpkYXRlOiAiMjAyNS0wMi0yMSINCm91dHB1dDogDQogIGh0bWxfZG9jdW1lbnQ6DQogICAgdG9jOiBUUlVFDQogICAgdG9jX2Zsb2F0OiBUUlVFDQogICAgY29kZV9kb3dubG9hZDogVFJVRQ0KICAgIHRoZW1lOiBqb3VybmFsDQotLS0NCg0KIVtdKEM6XFxVc2Vyc1xcQm9vdENhbXBcXERvd25sb2Fkc1xcaW1hZ2VzICg0KS5qcGVnKQ0KDQojIDxzcGFuIHN0eWxlPSJjb2xvcjpibHVlOyI+Q29udGV4dG88L3NwYW4+DQpMYSBiYXNlIGRlIGRhdG9zIGRlICoqVVNBcnJlc3RzKiogY29udGllbmUgZXN0YWRpc3RpY2FzIGRlIGFycmVzdG9zIHBvciBjYWRhIDEwMCwwMDAgcmVzaWRlbnRlcyBwb3IgYWdyZXNpb24sIGFzZXNpbmF0byB5IHZpb2xhY2lvbiBlbiBjYWRhIHVubyBkZSBsb3MgNTAgZXN0YWRvcyBkZSBFRS5VVSBFTiAxOTczLiANCg0KIyA8c3BhbiBzdHlsZT0iY29sb3I6Ymx1ZTsiPkluc3RhbGFyIHBhcXVldGVzIHkgbGxhbWFyIGxpYnJlcsOtYXM8L3NwYW4+DQpgYGB7cn0NCiNpbnN0YWxsLnBhY2thZ2VzKCJjbHVzdGVyIikgIyBQYXJhIGFncnVwYW1pZW50b3MNCmxpYnJhcnkoY2x1c3RlcikNCiNpbnN0YWxsLnBhY2thZ2VzKCJnZ3Bsb3QyIikgIyBQYXJhIGdyYWZpY2FyDQpsaWJyYXJ5KGdncGxvdDIpDQojaW5zdGFsbC5wYWNrYWdlcygiZmFjdG9leHRyYSIpICMgVmlzdWFsaXphciBDbHVzdGVycw0KbGlicmFyeShmYWN0b2V4dHJhKQ0KI2luc3RhbGwucGFja2FnZXMoImRhdGEudGFibGUiKSAjIENvbmp1bnRvIGRlIGRhdG9zIGdyYW5kZXMNCmxpYnJhcnkoZGF0YS50YWJsZSkNCiNpbnN0YWxsLnBhY2thZ2VzKCJ0aWR5dmVyc2UiKQ0KbGlicmFyeSh0aWR5dmVyc2UpDQojIGluc3RhbGwucGFja2FnZXMoImdncGxvdDIiKSMgR3JhZmljb3MgY29uIG1lam9yIGRpc2XDsW8NCmxpYnJhcnkoZ2dwbG90MikNCiMgaW5zdGFsbC5wYWNrYWdlcygibGF0dGljZSIpIyBDcmVhciBncmFmaWNvcw0KbGlicmFyeShsYXR0aWNlKQ0KIyBpbnN0YWxsLnBhY2thZ2VzKCJEYXRhRXhwbG9yZXIiKSMgQW5hbGlzaXMgRGVzY3JpcHRpdm8NCmxpYnJhcnkoRGF0YUV4cGxvcmVyKQ0KI2luc3RhbGwucGFja2FnZXMoImtlcm5sYWIiKQ0KbGlicmFyeShrZXJubGFiKQ0KI2luc3RhbGwucGFja2FnZXMoInJwYXJ0IikNCmxpYnJhcnkocnBhcnQpDQojaW5zdGFsbC5wYWNrYWdlcygicmFuZG9tRm9yZXN0IikNCmxpYnJhcnkocmFuZG9tRm9yZXN0KQ0KIyBpbnN0YWxsLnBhY2thZ2VzKCJjYXJldCIpIyBBbGdvcml0bW9zIGRlIGFwcmVuZGl6YWplIGF1dG9tYXRpY28NCmxpYnJhcnkoY2FyZXQpDQpgYGANCg0KIyA8c3BhbiBzdHlsZT0iY29sb3I6Ymx1ZTsiPkltcG9ydGFyIGxhIGJhc2UgZGUgZGF0b3M8L3NwYW4+DQpgYGB7cn0NCmRmIDwtIFVTQXJyZXN0cw0KYGBgDQoNCiMgPHNwYW4gc3R5bGU9ImNvbG9yOmJsdWU7Ij5Fc2NhbGFyIGxhIGJhc2UgZGUgZGF0b3M8L3NwYW4+DQpgYGB7cn0NCmRhdG9zX2VzY2FsYWRvcyA8LSBzY2FsZShkZikNCmBgYA0KDQojIDxzcGFuIHN0eWxlPSJjb2xvcjpibHVlOyI+R2VuZXJhciBsb3Mgc2VnbWVudG9zPC9zcGFuPg0KYGBge3J9DQpncnVwb3MgPC0gNA0Kc2VnbWVudG9zIDwtIGttZWFucyhkYXRvc19lc2NhbGFkb3MsIGdydXBvcykNCmBgYA0KDQojIDxzcGFuIHN0eWxlPSJjb2xvcjpibHVlOyI+QXNpZ25hciBncnVwb3MgYSBsb3MgZGF0b3M8L3NwYW4+DQpgYGB7cn0NCmFzaWduYWNpb24gPC0gY2JpbmQoZGYsIGNsdXN0ZXI9DQogICAgICAgICAgICAgICAgICAgICAgc2VnbWVudG9zJGNsdXN0ZXIpDQpgYGANCg0KIyA8c3BhbiBzdHlsZT0iY29sb3I6Ymx1ZTsiPkdyYWZpY2FyIGxvcyBjbHVzdGVyczwvc3Bhbj4NCmBgYHtyfQ0KZnZpel9jbHVzdGVyKHNlZ21lbnRvcywgZGF0YT1kZikNCmBgYA0KDQojIDxzcGFuIHN0eWxlPSJjb2xvcjpibHVlOyI+T3B0aW1pemFyIGxhIGNhbnRpZGFkIGRlIGdydXBvczwvc3Bhbj4NCmBgYHtyfQ0Kc2V0LnNlZWQoMTIzKQ0Kb3B0aW1pemFjaW9uIDwtIGNsdXNHYXAoZGF0b3NfZXNjYWxhZG9zLCBGVU49a21lYW5zLCBuc3RhcnQ9MSxLLm1heCA9IDEwKQ0KcGxvdChvcHRpbWl6YWNpb24sIHhsYWI9Ik7Dum1lcm8gZGUgY2x1c3RlcnMgayIpDQpgYGANCg0KIyA8c3BhbiBzdHlsZT0iY29sb3I6Ymx1ZTsiPkNvbXBhcmFyIHNlZ21lbnRvczwvc3Bhbj4NCmBgYHtyfQ0KcHJvbWVkaW8gPC0gYWdncmVnYXRlKGFzaWduYWNpb24sIGJ5PWxpc3QoYXNpZ25hY2lvbiRjbHVzdGVyKSxGVU4gPSBtZWFuKQ0KcHJvbWVkaW8NCnRhYmxlKGFzaWduYWNpb24kY2x1c3RlcikNCg0Kbm9tYnJlc19jbHVzdGVycyA8LSBjKCJFc3RhZG9zIFNlZ3Vyb3MiLCAiRXN0YWRvcyBjb24gYWx0byBjcmltZW4iLCAiRXN0YWRvcyBwZWxpZ3Jvc29zIiwgIkVzdGFkb3MgY29uIGJham8gY3JpbWVuIikNCg0KYXNpZ25hY2lvbiA8LSBhc2lnbmFjaW9uICU+JQ0KICBtdXRhdGUoTm9tYnJlX2RlX2NsdXN0ZXJzID0gY2FzZV93aGVuKA0KICAgIGNsdXN0ZXIgPT0gMSB+IG5vbWJyZXNfY2x1c3RlcnNbMV0sDQogICAgY2x1c3RlciA9PSAyIH4gbm9tYnJlc19jbHVzdGVyc1syXSwNCiAgICBjbHVzdGVyID09IDMgfiBub21icmVzX2NsdXN0ZXJzWzNdLA0KICAgIGNsdXN0ZXIgPT0gNCB+IG5vbWJyZXNfY2x1c3RlcnNbNF0NCiAgKSkNCmFzaWduYWNpb24gPC0gYXNpZ25hY2lvbiAlPiUgc2VsZWN0KC1jbHVzdGVyKQ0KcHJpbnQoYXNpZ25hY2lvbikNCmBgYA0KDQojIDxzcGFuIHN0eWxlPSJjb2xvcjpibHVlOyI+UGFydGlyIGxvcyBkYXRvcyA4MC0yMDwvc3Bhbj4NCmBgYHtyfQ0Kc2V0LnNlZWQoMTIzKQ0KcmVuZ2xvbmVzX2VudHJlbmFtaWVudG8gPC0gY3JlYXRlRGF0YVBhcnRpdGlvbihhc2lnbmFjaW9uJE5vbWJyZV9kZV9jbHVzdGVycywgcD0wLjgsIGxpc3Q9RkFMU0UpDQplbnRyZW5hbWllbnRvIDwtIGFzaWduYWNpb25bcmVuZ2xvbmVzX2VudHJlbmFtaWVudG8sIF0NCnBydWViYSA8LSBhc2lnbmFjaW9uWy1yZW5nbG9uZXNfZW50cmVuYW1pZW50bywgXQ0KYGBgDQoNCiMgPHNwYW4gc3R5bGU9ImNvbG9yOmJsdWU7Ij5Nb2RlbG8uIMOBcmJvbCBkZSBkZWNpc2nDs248L3NwYW4+DQpgYGB7cn0NCg0KZW50cmVuYW1pZW50byROb21icmVfZGVfY2x1c3RlcnMgPC0gYXMuZmFjdG9yKGVudHJlbmFtaWVudG8kTm9tYnJlX2RlX2NsdXN0ZXJzKQ0KcHJ1ZWJhJE5vbWJyZV9kZV9jbHVzdGVycyA8LSBhcy5mYWN0b3IocHJ1ZWJhJE5vbWJyZV9kZV9jbHVzdGVycykNCg0KbW9kZWxvIDwtIHRyYWluKE5vbWJyZV9kZV9jbHVzdGVycyB+IC4sIGRhdGEgPSBlbnRyZW5hbWllbnRvLA0KICAgICAgICAgICAgICAgICBtZXRob2QgPSAibm5ldCIsICMgQ2FtYmlhciANCiAgICAgICAgICAgICAgICAgcHJlUHJvY2Vzcz1jKCJzY2FsZSIsImNlbnRlciIpLA0KICAgICAgICAgICAgICAgICB0ckNvbnRyb2wgPSB0cmFpbkNvbnRyb2wobWV0aG9kPSJjdiIsIG51bWJlciA9IDEwKSwNCiAgICAgICAgICAgICAgICAgdHJhY2UgPSBGQUxTRSAgICAgICAgICNDYW1iaWFyIGhpcGVycGFyYW1ldHJvcw0KICAgICAgICAgICAgICAgICApDQoNCnJlc3VsdGFkb19FbnRyZW5hbWllbnRvIDwtIHByZWRpY3QobW9kZWxvLGVudHJlbmFtaWVudG8pDQpyZXN1bHRhZG9fcHJ1ZWJhIDwtIHByZWRpY3QobW9kZWxvLCBwcnVlYmEpDQoNCiMgTWF0cml6IGRlIENvbmZ1c2nDs24gZGVsIFJlc3VsdGFkbyBkZWwgRW50cmVuYW1pZW50byANCm1jcmUgPC0gY29uZnVzaW9uTWF0cml4KHJlc3VsdGFkb19FbnRyZW5hbWllbnRvLCBlbnRyZW5hbWllbnRvJE5vbWJyZV9kZV9jbHVzdGVycykNCm1jcmUNCg0KbWNycCA8LSBjb25mdXNpb25NYXRyaXgocmVzdWx0YWRvX3BydWViYSwgcHJ1ZWJhJE5vbWJyZV9kZV9jbHVzdGVycykNCm1jcnANCmBgYA==