Librerias

library(dplyr)
library(plyr)
library(ggplot2)
library(naniar)
library(Hmisc)         
library(psych)
library(tidyverse)
library(janitor)
library(knitr)
library(pollster)

Importar Bases de datos

setwd("C:\\Users\\javaw\\OneDrive - Instituto Tecnologico y de Estudios Superiores de Monterrey\\7mo Semestre\\Reto")
dperf<-read.csv("Del Perf.csv")
dplan<-read.csv("DP_1.csv")
rh<-read.csv("RH.csv")
rh2<-read.csv("RH2.csv")

Entregable 2.1

Analiza las bases de datos y responde lo siguiente:

1) ¿Cuántas variables y cuantos registros tiene la base de datos?

La base de datos Delivery Performance tiene 7 variables y 2392 registros.

describe(dperf)
##                vars    n   mean    sd median trimmed    mad    min   max  range
## Cliente*          1 2392   2.75  1.09    2.5    2.81   1.48   1.00   4.0   3.00
## VUELTAS           2 2392   1.75  0.83    1.5    1.69   0.74   1.00   3.0   2.00
## FECHA*            3 2392 150.00 86.33  150.0  150.00 111.19   1.00 299.0 298.00
## Plan.Arrival      4 2392   6.21  7.42    0.0    5.27   0.00   0.00  20.0  20.00
## Real.Arrival      5 2392   4.30  6.77    0.0    2.88   0.00   0.00  23.5  23.50
## Real.Departure    6 2392   4.65  7.23    0.0    3.20   0.00   0.00  24.5  24.50
## Diference         7 2392   0.35  0.79    0.0    0.26   0.00 -14.35  20.0  34.35
##                 skew kurtosis   se
## Cliente*       -0.07    -1.44 0.02
## VUELTAS         0.49    -1.37 0.02
## FECHA*          0.00    -1.20 1.77
## Plan.Arrival    0.73    -0.96 0.15
## Real.Arrival    1.33     0.38 0.14
## Real.Departure  1.26     0.17 0.15
## Diference       2.62   230.35 0.02
dim(dperf)
## [1] 2392    7

La base de datos Recursos Humanos:Bajas tiene 25 variables y 238 registros.

describe(rh)
##                        vars   n   mean     sd median trimmed   mad    min  max
## ï..APELLIDOS*             1 238 114.72  66.04 113.50  114.54 83.77   1.00  230
## NOMBRE*                   2 238 110.46  63.55 110.50  110.47 80.80   1.00  221
## FECHA.DE.NACIMIENTO*      3 238 117.53  67.54 117.50  117.54 86.73   1.00  234
## GENERO*                   4 238   3.39   0.52   3.00    3.39  0.00   1.00    4
## RFC*                      5 238 117.84  67.88 117.50  117.81 86.73   1.00  235
## FECHA.DE.ALTA*            6 238  71.88  38.42  68.00   72.26 45.96   1.00  141
## MOTIVO.DE.BAJA*           7 238   2.83   1.04   2.00    2.76  0.00   1.00    5
## X                         8 213  79.71 224.98  19.00   31.18 19.27   0.00 1966
## BAJA*                     9 238  46.84  28.59  49.00   47.07 35.58   1.00   96
## PUESTO*                  10 238  12.31   6.49  10.00   10.92  0.00   1.00   32
## DEPARTAMENTO*            11 238  13.78  11.60  12.00   13.48 16.31   1.00   31
## NO.SEGURO.SOCIAL*        12 238 117.15  67.60 117.50  117.18 85.99   1.00  234
## SALARIO.DIARIO.IMSS      13 236 177.96  23.26 180.68  179.14  0.00 144.45  500
## FACTOR.CRED.INFONAVIT*   14 238  17.22   4.99  19.00   18.77  0.00   1.00   19
## NÂ..CREDITO.INFONAVIT*   15 238  18.16   5.18  20.00   19.77  0.00   1.00   20
## LUGAR.DE.NACIMIENTO*     16 238  53.92  25.89  53.00   55.95 33.36   1.00   97
## CURP*                    17 238 116.85  67.88 116.50  116.81 86.73   1.00  234
## CALLE*                   18 238 101.98  56.11 111.50  102.94 65.98   1.00  197
## NUMERO.INTERNO*          19 238  83.23  51.53  84.50   82.84 63.75   1.00  175
## COLONIA*                 20 238  58.43  27.09  73.00   60.30 25.20   1.00   99
## CODIGO.POSTAL*           21 238  15.00   4.07  14.00   15.10  0.00   1.00   26
## MUNICIPIO*               22 238   8.28   1.96   9.00    8.79  0.00   1.00   12
## ESTADO*                  23 238  26.49  10.79  23.00   26.15  4.45   1.00   50
## ESTADO.CIVIL*            24 238   7.19   3.28   7.00    7.37  4.45   1.00   12
## TARJETA....CUENTA*       25 238   1.99   0.18   2.00    2.00  0.00   1.00    3
##                          range  skew kurtosis    se
## ï..APELLIDOS*           229.00  0.02    -1.19  4.28
## NOMBRE*                 220.00  0.00    -1.20  4.12
## FECHA.DE.NACIMIENTO*    233.00  0.00    -1.21  4.38
## GENERO*                   3.00 -0.10    -0.02  0.03
## RFC*                    234.00  0.00    -1.21  4.40
## FECHA.DE.ALTA*          140.00 -0.02    -1.08  2.49
## MOTIVO.DE.BAJA*           4.00  0.49    -1.51  0.07
## X                      1966.00  5.65    35.86 15.42
## BAJA*                    95.00 -0.04    -1.24  1.85
## PUESTO*                  31.00  1.97     3.05  0.42
## DEPARTAMENTO*            30.00  0.10    -1.73  0.75
## NO.SEGURO.SOCIAL*       233.00 -0.01    -1.20  4.38
## SALARIO.DIARIO.IMSS     355.55 11.05   152.94  1.51
## FACTOR.CRED.INFONAVIT*   18.00 -2.65     5.38  0.32
## NÂ..CREDITO.INFONAVIT*   19.00 -2.68     5.60  0.34
## LUGAR.DE.NACIMIENTO*     96.00 -0.63    -0.56  1.68
## CURP*                   233.00  0.00    -1.22  4.40
## CALLE*                  196.00 -0.18    -1.19  3.64
## NUMERO.INTERNO*         174.00  0.03    -1.18  3.34
## COLONIA*                 98.00 -0.63    -0.88  1.76
## CODIGO.POSTAL*           25.00 -0.32     1.77  0.26
## MUNICIPIO*               11.00 -2.20     3.63  0.13
## ESTADO*                  49.00  0.43     0.30  0.70
## ESTADO.CIVIL*            11.00 -0.46    -1.14  0.21
## TARJETA....CUENTA*        2.00 -1.22    26.39  0.01
dim(rh)
## [1] 238  25

La base de datos Recursos Humanos:Colaboradores tiene 26 variables y 122 registros. Si bien las funciones dicen que tiene 27, la última está totalmente vacía por lo que hay que eliminarla más adelante.

describe(rh2)
##                        vars   n        mean           sd   median  trimmed
## ï..No..De.Empleado        1  92       56.88        40.06    48.50    53.68
## APELLIDOS*                2 122       51.30        33.32    49.50    50.88
## NOMBRE*                   3 122       51.33        33.13    51.50    51.14
## FECHA.DE.NACIMIENTO*      4 122       53.80        34.89    53.50    53.50
## GENERO*                   5 122        2.35         0.62     2.00     2.41
## RFC*                      6 122       53.80        34.89    53.50    53.50
## FECHA.DE.ALTA*            7 122       43.85        28.60    46.00    43.61
## Primer.mes*               8 122       43.47        28.49    45.50    43.14
## X4to.mes*                 9 122       43.66        28.37    43.00    43.35
## BAJA                     10  13        3.00         0.00     3.00     3.00
## PUESTO*                  11 122        8.86         8.07     5.00     7.51
## DEPARTAMENTO*            12 122        8.52         7.79     6.00     7.88
## NO.SEGURO.SOCIAL*        13 122       52.87        34.78    52.50    52.50
## SALARIO.DIARIO.IMSS      14 113 13461612.46 142678701.96   180.68   177.09
## FACTOR.CRED.INFONAVIT*   15 122        3.91         2.44     6.00     4.01
## NÂ..CREDITO.INFONAVIT*   16 122        3.91         2.44     6.00     4.01
## LUGAR.DE.NACIMIENTO*     17 122       14.34        13.52    11.00    13.22
## CURP*                    18 122       53.80        34.89    53.50    53.50
## CALLE*                   19 122       50.00        31.74    50.50    49.88
## NUMERO.INTERNO*          20 122       31.38        26.87    28.50    29.62
## COLONIA*                 21 122       37.52        21.63    43.50    38.04
## MUNICIPIO*               22 122        3.39         2.39     2.00     3.01
## ESTADO*                  23 122        5.11         1.53     6.00     5.48
## CODIGO.POSTAL            24 113    63364.74     11201.89 66646.00 66622.84
## ESTADO.CIVIL*            25 122        6.22         3.57     7.00     6.12
## TARJETA....CUENTA*       26 122        2.02         0.42     2.00     2.00
## X                        27   0         NaN           NA       NA      NaN
##                          mad      min        max      range  skew kurtosis
## ï..No..De.Empleado     40.77     1.00        148        147  0.60    -0.67
## APELLIDOS*             42.25     1.00        110        109  0.08    -1.24
## NOMBRE*                42.25     1.00        108        107  0.01    -1.28
## FECHA.DE.NACIMIENTO*   45.22     1.00        114        113  0.04    -1.27
## GENERO*                 0.74     1.00          3          2 -0.38    -0.70
## RFC*                   45.22     1.00        114        113  0.04    -1.27
## FECHA.DE.ALTA*         37.81     1.00         94         93  0.01    -1.27
## Primer.mes*            37.81     1.00         94         93  0.02    -1.25
## X4to.mes*              37.81     1.00         94         93  0.03    -1.23
## BAJA                    0.00     3.00          3          0   NaN      NaN
## PUESTO*                 1.48     1.00         30         29  1.44     0.67
## DEPARTAMENTO*           7.41     1.00         22         21  0.41    -1.49
## NO.SEGURO.SOCIAL*      45.22     1.00        113        112  0.05    -1.28
## SALARIO.DIARIO.IMSS     0.00   144.45 1516728571 1516728427 10.35   106.05
## FACTOR.CRED.INFONAVIT*  0.00     1.00          6          5 -0.33    -1.88
## NÂ..CREDITO.INFONAVIT*  0.00     1.00          6          5 -0.33    -1.88
## LUGAR.DE.NACIMIENTO*   14.83     1.00         42         41  0.40    -1.35
## CURP*                  45.22     1.00        114        113  0.04    -1.27
## CALLE*                 40.03     1.00        105        104 -0.01    -1.25
## NUMERO.INTERNO*        40.03     1.00         80         79  0.29    -1.36
## COLONIA*               21.50     1.00         74         73 -0.31    -1.17
## MUNICIPIO*              0.00     1.00         10          9  1.24     0.22
## ESTADO*                 0.00     1.00          6          5 -1.79     1.83
## CODIGO.POSTAL           4.45 25016.00      67493      42477 -3.06     7.42
## ESTADO.CIVIL*           4.45     1.00         12         11  0.18    -1.23
## TARJETA....CUENTA*      0.00     1.00          3          2  0.17     2.70
## X                         NA      Inf       -Inf       -Inf    NA       NA
##                                 se
## ï..No..De.Empleado            4.18
## APELLIDOS*                    3.02
## NOMBRE*                       3.00
## FECHA.DE.NACIMIENTO*          3.16
## GENERO*                       0.06
## RFC*                          3.16
## FECHA.DE.ALTA*                2.59
## Primer.mes*                   2.58
## X4to.mes*                     2.57
## BAJA                          0.00
## PUESTO*                       0.73
## DEPARTAMENTO*                 0.70
## NO.SEGURO.SOCIAL*             3.15
## SALARIO.DIARIO.IMSS    13422083.24
## FACTOR.CRED.INFONAVIT*        0.22
## NÂ..CREDITO.INFONAVIT*        0.22
## LUGAR.DE.NACIMIENTO*          1.22
## CURP*                         3.16
## CALLE*                        2.87
## NUMERO.INTERNO*               2.43
## COLONIA*                      1.96
## MUNICIPIO*                    0.22
## ESTADO*                       0.14
## CODIGO.POSTAL              1053.79
## ESTADO.CIVIL*                 0.32
## TARJETA....CUENTA*            0.04
## X                               NA
dim(rh2)
## [1] 122  27

La base de datos Delivery Plan tiene variables y registros.

#count(dplan, CLIENTE.PLANTA, sort = TRUE)
#count(dplan, PROYECTO, sort = TRUE)
#count(dplan, ID.ODOO, sort = TRUE)
#count(dplan, ITEM, sort = TRUE)

2) y 3) Clasifica cada variable en cualitativa, cuantitativa discreta o cuantitativa continua y escala

Delivery Performance

str(dperf)
## 'data.frame':    2392 obs. of  7 variables:
##  $ Cliente       : chr  "PRINTEL " "MAHLE" "MAHLE" "MAHLE" ...
##  $ VUELTAS       : int  1 1 2 3 1 1 2 3 1 1 ...
##  $ FECHA         : chr  "22/07/2021" "22/07/2021" "22/07/2021" "22/07/2021" ...
##  $ Plan.Arrival  : int  16 8 9 20 0 0 0 0 16 8 ...
##  $ Real.Arrival  : num  0 8 9 20 0 0 0 0 16.3 8 ...
##  $ Real.Departure: num  0 8.55 10 21.1 0 0 0 0 18.1 8.5 ...
##  $ Diference     : num  0 0.55 1 1.1 0 0 0 0 1.8 0.5 ...
Variable<-c("`Cliente`","`Vueltas`","`Fecha`","`Plan Arrival`", "`Real Arrival`", "`Real Departure`","`Difference `")

Type<-c("qualitative (nominal)", "quantiative (discrete)", "quantitative (continous)", "quantitative (discrete)","quantitative (continuos)","quantitative (continuos)","quantitative (continuos)")

table<-data.frame(Variable,Type)
knitr::kable(table)
Variable Type
Cliente qualitative (nominal)
Vueltas quantiative (discrete)
Fecha quantitative (continous)
Plan Arrival quantitative (discrete)
Real Arrival quantitative (continuos)
Real Departure quantitative (continuos)
Difference quantitative (continuos)

Recursos Humanos:Bajas

clean_names(rh)
summary(rh)
##  ï..APELLIDOS          NOMBRE          FECHA.DE.NACIMIENTO    GENERO         
##  Length:238         Length:238         Length:238          Length:238        
##  Class :character   Class :character   Class :character    Class :character  
##  Mode  :character   Mode  :character   Mode  :character    Mode  :character  
##                                                                              
##                                                                              
##                                                                              
##                                                                              
##      RFC            FECHA.DE.ALTA      MOTIVO.DE.BAJA           X          
##  Length:238         Length:238         Length:238         Min.   :   0.00  
##  Class :character   Class :character   Class :character   1st Qu.:   9.00  
##  Mode  :character   Mode  :character   Mode  :character   Median :  19.00  
##                                                           Mean   :  79.71  
##                                                           3rd Qu.:  49.00  
##                                                           Max.   :1966.00  
##                                                           NA's   :25       
##      BAJA              PUESTO          DEPARTAMENTO       NO.SEGURO.SOCIAL  
##  Length:238         Length:238         Length:238         Length:238        
##  Class :character   Class :character   Class :character   Class :character  
##  Mode  :character   Mode  :character   Mode  :character   Mode  :character  
##                                                                             
##                                                                             
##                                                                             
##                                                                             
##  SALARIO.DIARIO.IMSS FACTOR.CRED.INFONAVIT NÂ..CREDITO.INFONAVIT
##  Min.   :144.4       Length:238            Length:238           
##  1st Qu.:180.7       Class :character      Class :character     
##  Median :180.7       Mode  :character      Mode  :character     
##  Mean   :178.0                                                  
##  3rd Qu.:180.7                                                  
##  Max.   :500.0                                                  
##  NA's   :2                                                      
##  LUGAR.DE.NACIMIENTO     CURP              CALLE           NUMERO.INTERNO    
##  Length:238          Length:238         Length:238         Length:238        
##  Class :character    Class :character   Class :character   Class :character  
##  Mode  :character    Mode  :character   Mode  :character   Mode  :character  
##                                                                              
##                                                                              
##                                                                              
##                                                                              
##    COLONIA          CODIGO.POSTAL       MUNICIPIO            ESTADO         
##  Length:238         Length:238         Length:238         Length:238        
##  Class :character   Class :character   Class :character   Class :character  
##  Mode  :character   Mode  :character   Mode  :character   Mode  :character  
##                                                                             
##                                                                             
##                                                                             
##                                                                             
##  ESTADO.CIVIL       TARJETA....CUENTA 
##  Length:238         Length:238        
##  Class :character   Class :character  
##  Mode  :character   Mode  :character  
##                                       
##                                       
##                                       
## 

Al observar la base de datos, podemos notar que varias variables no poseen su clase correcta, sin embargo, no todas serán consideradas para realizar análisis por lo que dejaremos su corrección para el futuro.

Variablerh<-c("`ï..APELLIDOS`","`NOMBRE`","`FECHA.DE.NACIMIENTO`","`GENERO`", "`RFC`", "`FECHA.DE.ALTA`","`MOTIVO.DE.BAJA`","`X`","`BAJA`","`PUESTO`","`DEPARTAMENTO`","`NO.SEGURO.SOCIAL`","`SALARIO.DIARIO.IMSS`","`FACTOR.CRED.INFONAVIT`","`NÂ..CREDITO.INFONAVIT`","`LUGAR.DE.NACIMIENTO`","`CURP`","`CALLE`")

Typerh<-c("qualitative (nominal)", "qualitative (nominal)", "quantitative (continous)", "qualitative (nominal)","qualitative (nominal)","quantitative (continous)", "qualitative (nominal)", "quantitative (discrete)","qualitative (nominal)","qualitative (nominal)","qualitative (nominal)","quantitative (discrete)","quantitative (continuos)","quantitative (continuos)","quantitative (discrete)", "qualitative (nominal)", "qualitative (nominal)", "qualitative (nominal)")

tablerh<-data.frame(Variablerh,Typerh)
knitr::kable(tablerh)
Variablerh Typerh
ï..APELLIDOS qualitative (nominal)
NOMBRE qualitative (nominal)
FECHA.DE.NACIMIENTO quantitative (continous)
GENERO qualitative (nominal)
RFC qualitative (nominal)
FECHA.DE.ALTA quantitative (continous)
MOTIVO.DE.BAJA qualitative (nominal)
X quantitative (discrete)
BAJA qualitative (nominal)
PUESTO qualitative (nominal)
DEPARTAMENTO qualitative (nominal)
NO.SEGURO.SOCIAL quantitative (discrete)
SALARIO.DIARIO.IMSS quantitative (continuos)
FACTOR.CRED.INFONAVIT quantitative (continuos)
NÂ..CREDITO.INFONAVIT quantitative (discrete)
LUGAR.DE.NACIMIENTO qualitative (nominal)
CURP qualitative (nominal)
CALLE qualitative (nominal)

Recursos Humanos: Colaboradores

clean_names(rh2)
summary(rh2)
##  ï..No..De.Empleado  APELLIDOS            NOMBRE          FECHA.DE.NACIMIENTO
##  Min.   :  1.00     Length:122         Length:122         Length:122         
##  1st Qu.: 24.75     Class :character   Class :character   Class :character   
##  Median : 48.50     Mode  :character   Mode  :character   Mode  :character   
##  Mean   : 56.88                                                              
##  3rd Qu.: 82.00                                                              
##  Max.   :148.00                                                              
##  NA's   :30                                                                  
##     GENERO              RFC            FECHA.DE.ALTA       Primer.mes       
##  Length:122         Length:122         Length:122         Length:122        
##  Class :character   Class :character   Class :character   Class :character  
##  Mode  :character   Mode  :character   Mode  :character   Mode  :character  
##                                                                             
##                                                                             
##                                                                             
##                                                                             
##    X4to.mes              BAJA        PUESTO          DEPARTAMENTO      
##  Length:122         Min.   :3     Length:122         Length:122        
##  Class :character   1st Qu.:3     Class :character   Class :character  
##  Mode  :character   Median :3     Mode  :character   Mode  :character  
##                     Mean   :3                                          
##                     3rd Qu.:3                                          
##                     Max.   :3                                          
##                     NA's   :109                                        
##  NO.SEGURO.SOCIAL   SALARIO.DIARIO.IMSS FACTOR.CRED.INFONAVIT
##  Length:122         Min.   :1.440e+02   Length:122           
##  Class :character   1st Qu.:1.770e+02   Class :character     
##  Mode  :character   Median :1.810e+02   Mode  :character     
##                     Mean   :1.346e+07                        
##                     3rd Qu.:1.810e+02                        
##                     Max.   :1.517e+09                        
##                     NA's   :9                                
##  NÂ..CREDITO.INFONAVIT LUGAR.DE.NACIMIENTO     CURP          
##  Length:122            Length:122          Length:122        
##  Class :character      Class :character    Class :character  
##  Mode  :character      Mode  :character    Mode  :character  
##                                                              
##                                                              
##                                                              
##                                                              
##     CALLE           NUMERO.INTERNO       COLONIA           MUNICIPIO        
##  Length:122         Length:122         Length:122         Length:122        
##  Class :character   Class :character   Class :character   Class :character  
##  Mode  :character   Mode  :character   Mode  :character   Mode  :character  
##                                                                             
##                                                                             
##                                                                             
##                                                                             
##     ESTADO          CODIGO.POSTAL   ESTADO.CIVIL       TARJETA....CUENTA 
##  Length:122         Min.   :25016   Length:122         Length:122        
##  Class :character   1st Qu.:66640   Class :character   Class :character  
##  Mode  :character   Median :66646   Mode  :character   Mode  :character  
##                     Mean   :63365                                        
##                     3rd Qu.:66649                                        
##                     Max.   :67493                                        
##                     NA's   :9                                            
##     X          
##  Mode:logical  
##  NA's:122      
##                
##                
##                
##                
## 
Variablerhc<-c("`ï..No..De.Empleado`","`APELLIDOS`","`NOMBRE`","`FECHA.DE.NACIMIENTO`", "`GENERO`","`RFC`","`FECHA.DE.ALTA`","`Primer.mes`","`X4to.mes`","`BAJA`","`PUESTO`","`DEPARTAMENTO`","`NO.SEGURO.SOCIAL`","`SALARIO.DIARIO.IMSS`","`FACTOR.CRED.INFONAVIT`","`NÂ..CREDITO.INFONAVIT`","`LUGAR.DE.NACIMIENTO`","`CURP`","`CALLE`")

Typerhc<-c("qualitative (nominal)", "qualitative (nominal)","qualitative (nominal)", "quantitative (continous)","qualitative (nominal)","qualitative (nominal)","quantitative (continous)","quantitative (continous)","quantitative (continous)","quantiative (discrete)","qualitative (nominal)","qualitative (nominal)","quantitative (discrete)","quantitative (continuos)","quantitative (continuos)","quantitative (discrete)", "qualitative (nominal)", "qualitative (nominal)", "qualitative (nominal)")

tablerhc<-data.frame(Variablerhc,Typerhc)
knitr::kable(tablerhc)
Variablerhc Typerhc
ï..No..De.Empleado qualitative (nominal)
APELLIDOS qualitative (nominal)
NOMBRE qualitative (nominal)
FECHA.DE.NACIMIENTO quantitative (continous)
GENERO qualitative (nominal)
RFC qualitative (nominal)
FECHA.DE.ALTA quantitative (continous)
Primer.mes quantitative (continous)
X4to.mes quantitative (continous)
BAJA quantiative (discrete)
PUESTO qualitative (nominal)
DEPARTAMENTO qualitative (nominal)
NO.SEGURO.SOCIAL quantitative (discrete)
SALARIO.DIARIO.IMSS quantitative (continuos)
FACTOR.CRED.INFONAVIT quantitative (continuos)
NÂ..CREDITO.INFONAVIT quantitative (discrete)
LUGAR.DE.NACIMIENTO qualitative (nominal)
CURP qualitative (nominal)
CALLE qualitative (nominal)

Delivery Plan

summary(dplan)
##  ï..CLIENTE.PLANTA    PROYECTO           ID.ODOO              ITEM          
##  Length:231         Length:231         Length:231         Length:231        
##  Class :character   Class :character   Class :character   Class :character  
##  Mode  :character   Mode  :character   Mode  :character   Mode  :character  
##                                                                             
##                                                                             
##                                                                             
##      JUNIO             JULIO             AGOSTO          SEPTIEMBRE  
##  Min.   :   0.00   Min.   :    0.0   Min.   :   0.00   Min.   :   0  
##  1st Qu.:   0.00   1st Qu.:    0.0   1st Qu.:   0.00   1st Qu.:   0  
##  Median :   0.00   Median :    0.0   Median :   0.00   Median :   0  
##  Mean   :  29.06   Mean   :  135.9   Mean   :  77.45   Mean   :  81  
##  3rd Qu.:   0.00   3rd Qu.:    0.0   3rd Qu.:   0.00   3rd Qu.:   0  
##  Max.   :1280.00   Max.   :13120.0   Max.   :3200.00   Max.   :3200  
##     OCTUBRE         NOVIEMBRE         DICIEMBRE          ene.22       
##  Min.   :   0.0   Min.   :   0.00   Min.   :   0.0   Min.   :   0.00  
##  1st Qu.:   0.0   1st Qu.:   0.00   1st Qu.:   0.0   1st Qu.:   0.00  
##  Median :   0.0   Median :   0.00   Median :   0.0   Median :   0.00  
##  Mean   :  62.0   Mean   :  89.69   Mean   : 100.4   Mean   :  82.37  
##  3rd Qu.:  11.5   3rd Qu.:   4.00   3rd Qu.:   1.5   3rd Qu.:  26.50  
##  Max.   :3200.0   Max.   :6400.00   Max.   :6400.0   Max.   :3200.00  
##      feb.22           mar.22           abr.22            may.22       
##  Min.   :   0.0   Min.   :   0.0   Min.   :    0.0   Min.   :    0.0  
##  1st Qu.:   0.0   1st Qu.:   0.0   1st Qu.:    0.0   1st Qu.:    0.0  
##  Median :   0.0   Median :   0.0   Median :    0.0   Median :    0.0  
##  Mean   : 103.5   Mean   : 153.9   Mean   :  186.5   Mean   :  187.6  
##  3rd Qu.:   0.0   3rd Qu.:  20.0   3rd Qu.:   24.0   3rd Qu.:   22.0  
##  Max.   :9600.0   Max.   :9600.0   Max.   :16354.0   Max.   :17665.0  
##      jun.22            jul.22            ago.22            sep.22       
##  Min.   :    0.0   Min.   :    0.0   Min.   :    0.0   Min.   :    0.0  
##  1st Qu.:    0.0   1st Qu.:    0.0   1st Qu.:    0.0   1st Qu.:    0.0  
##  Median :    0.0   Median :    0.0   Median :    0.0   Median :    0.0  
##  Mean   :  171.2   Mean   :  316.9   Mean   :  131.5   Mean   :  272.3  
##  3rd Qu.:    1.0   3rd Qu.:   15.5   3rd Qu.:    0.0   3rd Qu.:    0.0  
##  Max.   :11050.0   Max.   :25900.0   Max.   :13200.0   Max.   :29379.0  
##    OCTUBRE.22          nov.22            dic.22            ene.23        
##  Min.   :    0.0   Min.   :  0.000   Min.   :  0.000   Min.   :  0.0000  
##  1st Qu.:    0.0   1st Qu.:  0.000   1st Qu.:  0.000   1st Qu.:  0.0000  
##  Median :    0.0   Median :  0.000   Median :  0.000   Median :  0.0000  
##  Mean   :  120.9   Mean   :  2.113   Mean   :  1.225   Mean   :  0.5974  
##  3rd Qu.:    0.0   3rd Qu.:  0.000   3rd Qu.:  0.000   3rd Qu.:  0.0000  
##  Max.   :16421.0   Max.   :324.000   Max.   :276.000   Max.   :138.0000  
##      feb.23      mar.23   TOTAL.MESES    
##  Min.   :0   Min.   :0   Min.   :     0  
##  1st Qu.:0   1st Qu.:0   1st Qu.:    16  
##  Median :0   Median :0   Median :   115  
##  Mean   :0   Mean   :0   Mean   :  2306  
##  3rd Qu.:0   3rd Qu.:0   3rd Qu.:   724  
##  Max.   :0   Max.   :0   Max.   :136754
Variable<-c("PROYECTO","ID.ODOO", "ITEM", "CLIENTE.PLANTA","ENERO.22", "FEBRERO.22","MARZO.22","ABRIL.22","MAYO.22","JUNIO.22","JULIO.22","AGOSTO.22","SEPTIEMBRE.22","OCTUBRE.22","NOVIEMBRE.22","DICIEMBRE.22", "ENERO.23", "FEBRERO.23", "MARZO.23")

Tipo<-c("Cualitative", "Cualitative", "Cualitative", "Cualitative", "quantiative (discrete)", "quantiative (discrete)", "quantitative (discrete)", "quantitative (discrete)", "quantitative (discrete)", "quantitative (discrete)", "quantitative (discrete)", "quantitative (discrete)","quantitative (discrete)","quantitative (discrete)","quantitative (discrete)","quantitative (discrete)","quantitative (discrete)","quantitative (discrete)","quantitative (discrete)")

table<-data.frame(Variable,Tipo)
knitr::kable(table)
Variable Tipo
PROYECTO Cualitative
ID.ODOO Cualitative
ITEM Cualitative
CLIENTE.PLANTA Cualitative
ENERO.22 quantiative (discrete)
FEBRERO.22 quantiative (discrete)
MARZO.22 quantitative (discrete)
ABRIL.22 quantitative (discrete)
MAYO.22 quantitative (discrete)
JUNIO.22 quantitative (discrete)
JULIO.22 quantitative (discrete)
AGOSTO.22 quantitative (discrete)
SEPTIEMBRE.22 quantitative (discrete)
OCTUBRE.22 quantitative (discrete)
NOVIEMBRE.22 quantitative (discrete)
DICIEMBRE.22 quantitative (discrete)
ENERO.23 quantitative (discrete)
FEBRERO.23 quantitative (discrete)
MARZO.23 quantitative (discrete)
Variable<-c("PROYECTO","ID.ODOO", "ITEM", "CLIENTE.PLANTA","ENERO.22", "FEBRERO.22","MARZO.22","ABRIL.22","MAYO.22","JUNIO.22","JULIO.22","AGOSTO.22","SEPTIEMBRE.22","OCTUBRE.22","NOVIEMBRE.22","DICIEMBRE.22", "ENERO.23", "FEBRERO.23", "MARZO.23")

Escala<-c("nominal", "nominal", "nominal", "nominal", "razon", "razon", "razon", "razon", "razon", "razon", "razon", "razon","razon","razon","razon","razon","razon","razon","razon")

table<-data.frame(Variable,Escala)
knitr::kable(table)
Variable Escala
PROYECTO nominal
ID.ODOO nominal
ITEM nominal
CLIENTE.PLANTA nominal
ENERO.22 razon
FEBRERO.22 razon
MARZO.22 razon
ABRIL.22 razon
MAYO.22 razon
JUNIO.22 razon
JULIO.22 razon
AGOSTO.22 razon
SEPTIEMBRE.22 razon
OCTUBRE.22 razon
NOVIEMBRE.22 razon
DICIEMBRE.22 razon
ENERO.23 razon
FEBRERO.23 razon
MARZO.23 razon

4) Aplica al menos 2 técnicas de limpieza de bases de datos y explícalas brevemente, ¿por qué realizaste esas técnicas?

Salarios equivocados

En la base de datos Recursos Humanos: Colaboradores encontramos un salario diario exhorbitante. Por lo que hay que limpiar este error. Además de convertir la variable de character a numeric.

rh2$SALARIO.DIARIO.IMSS<-format(rh2$SALARIO.DIARIO.IMSS, scientific = FALSE)
rh2$SALARIO.DIARIO.IMSS<-as.numeric(rh2$SALARIO.DIARIO.IMSS)
## Warning: NAs introducidos por coerción
unique(rh2$SALARIO.DIARIO.IMSS) %>% format(rh2$SALARIO.DIARIO.IMSS, scientific = FALSE)
##  [1] "176.72"        "337.05"        "4413757.00"    "260.01"       
##  [5] "240.75"        "152.86"        "175.79"        "144.45"       
##  [9] "279.61"        "151.67"        "208.65"        "240.71"       
## [13] "1516728571.00" "151.61"        "180.68"        "181.68"       
## [17] "184.68"        "185.68"        "NA"

Para limpiarlo, primero identificamos el registro con este error.

rh2[rh2$SALARIO.DIARIO.IMSS == 1516728571.00, ]
##      ï..No..De.Empleado          APELLIDOS        NOMBRE FECHA.DE.NACIMIENTO
## 26                   27 AGUILERA RODRIGUEZ JAIME ERNESTO          21/02/1969
## NA                   NA               <NA>          <NA>                <NA>
## NA.1                 NA               <NA>          <NA>                <NA>
## NA.2                 NA               <NA>          <NA>                <NA>
## NA.3                 NA               <NA>          <NA>                <NA>
## NA.4                 NA               <NA>          <NA>                <NA>
## NA.5                 NA               <NA>          <NA>                <NA>
## NA.6                 NA               <NA>          <NA>                <NA>
## NA.7                 NA               <NA>          <NA>                <NA>
## NA.8                 NA               <NA>          <NA>                <NA>
##         GENERO           RFC FECHA.DE.ALTA Primer.mes   X4to.mes BAJA
## 26   MASCULINO AURJ6902215X8    08/08/2020 07/09/2020 06/12/2020   NA
## NA        <NA>          <NA>          <NA>       <NA>       <NA>   NA
## NA.1      <NA>          <NA>          <NA>       <NA>       <NA>   NA
## NA.2      <NA>          <NA>          <NA>       <NA>       <NA>   NA
## NA.3      <NA>          <NA>          <NA>       <NA>       <NA>   NA
## NA.4      <NA>          <NA>          <NA>       <NA>       <NA>   NA
## NA.5      <NA>          <NA>          <NA>       <NA>       <NA>   NA
## NA.6      <NA>          <NA>          <NA>       <NA>       <NA>   NA
## NA.7      <NA>          <NA>          <NA>       <NA>       <NA>   NA
## NA.8      <NA>          <NA>          <NA>       <NA>       <NA>   NA
##                PUESTO       DEPARTAMENTO NO.SEGURO.SOCIAL SALARIO.DIARIO.IMSS
## 26   AYUDANTE GENERAL Producción Retorn      43896946522          1516728571
## NA               <NA>               <NA>             <NA>                  NA
## NA.1             <NA>               <NA>             <NA>                  NA
## NA.2             <NA>               <NA>             <NA>                  NA
## NA.3             <NA>               <NA>             <NA>                  NA
## NA.4             <NA>               <NA>             <NA>                  NA
## NA.5             <NA>               <NA>             <NA>                  NA
## NA.6             <NA>               <NA>             <NA>                  NA
## NA.7             <NA>               <NA>             <NA>                  NA
## NA.8             <NA>               <NA>             <NA>                  NA
##      FACTOR.CRED.INFONAVIT NÂ..CREDITO.INFONAVIT LUGAR.DE.NACIMIENTO
## 26                                                                  
## NA                    <NA>                  <NA>                <NA>
## NA.1                  <NA>                  <NA>                <NA>
## NA.2                  <NA>                  <NA>                <NA>
## NA.3                  <NA>                  <NA>                <NA>
## NA.4                  <NA>                  <NA>                <NA>
## NA.5                  <NA>                  <NA>                <NA>
## NA.6                  <NA>                  <NA>                <NA>
## NA.7                  <NA>                  <NA>                <NA>
## NA.8                  <NA>                  <NA>                <NA>
##                    CURP          CALLE NUMERO.INTERNO                COLONIA
## 26   AURJ690221HNLGDM07 PUERTO CABELLO           655A LOS PUERTOS 2° SECTOR
## NA                 <NA>           <NA>           <NA>                   <NA>
## NA.1               <NA>           <NA>           <NA>                   <NA>
## NA.2               <NA>           <NA>           <NA>                   <NA>
## NA.3               <NA>           <NA>           <NA>                   <NA>
## NA.4               <NA>           <NA>           <NA>                   <NA>
## NA.5               <NA>           <NA>           <NA>                   <NA>
## NA.6               <NA>           <NA>           <NA>                   <NA>
## NA.7               <NA>           <NA>           <NA>                   <NA>
## NA.8               <NA>           <NA>           <NA>                   <NA>
##      MUNICIPIO      ESTADO CODIGO.POSTAL ESTADO.CIVIL TARJETA....CUENTA  X
## 26      JUAREZ Nuevo León         67267       Casado           BANORTE NA
## NA        <NA>        <NA>            NA         <NA>              <NA> NA
## NA.1      <NA>        <NA>            NA         <NA>              <NA> NA
## NA.2      <NA>        <NA>            NA         <NA>              <NA> NA
## NA.3      <NA>        <NA>            NA         <NA>              <NA> NA
## NA.4      <NA>        <NA>            NA         <NA>              <NA> NA
## NA.5      <NA>        <NA>            NA         <NA>              <NA> NA
## NA.6      <NA>        <NA>            NA         <NA>              <NA> NA
## NA.7      <NA>        <NA>            NA         <NA>              <NA> NA
## NA.8      <NA>        <NA>            NA         <NA>              <NA> NA

Podemos observar que su puesto es Ayudante general y que está en el departamento de Producción Retorno. Al observar registros con el mismo puesto y departamento, podemos observar que tres colaboradores tienen un salario de 151.61, y el salario equivocado es de 1516728571.00, por lo que podríamos asumir ha sido un error de dedo y el salario correcto es 151.61, por lo que optamos por remplazarlo por este valor.

filter(rh2, DEPARTAMENTO == "Producción Retorn")
##    ï..No..De.Empleado           APELLIDOS          NOMBRE FECHA.DE.NACIMIENTO
## 1                   8         TOVAR PEREZ      PEDRO ISAI          10/12/1996
## 2                  11    GUERRERO TENORIO         VICENTE          06/05/1964
## 3                  27  AGUILERA RODRIGUEZ   JAIME ERNESTO          21/02/1969
## 4                  38     HERNANDEZ FELIX        BRISEIDA          28/12/1996
## 5                  42      CHAPAN MARCIAL       ERNESTINA          11/11/1969
## 6                  50     GARCIA GONZALEZ     LUIS DANIEL          25/10/2001
## 7                  63 HERNANDEZ HERNANDEZ    LUIS GERARDO          11/06/2003
## 8                  72    ZAMARRON PUENTES JESSICA LOURDES          18/02/1983
## 9                  NA    DELGADO JERONIMO          RAFAEL          21/01/2002
## 10                 NA          CRUZ RAMOS JOSUE FRANCISCO          22/09/1988
##       GENERO           RFC FECHA.DE.ALTA Primer.mes   X4to.mes BAJA
## 1  MASCULINO TOPP961210989    23/08/2016 22/09/2016 21/12/2016   NA
## 2  MASCULINO GUTV9405066TA    26/08/2017 25/09/2017 24/12/2017   NA
## 3  MASCULINO AURJ6902215X8    08/08/2020 07/09/2020 06/12/2020   NA
## 4   FEMENINO HEFB961228G86    25/03/2021 24/04/2021 23/07/2021   NA
## 5   FEMENINO CAME691111HCA    27/05/2021 26/06/2021 24/09/2021   NA
## 6  MASCULINO GAGL011025IG2    27/11/2021 27/12/2021 27/03/2022   NA
## 7  MASCULINO HEHL030611453    23/02/2022 25/03/2022 23/06/2022   NA
## 8   FEMENINO ZAPJ830218LZ9    03/05/2022 02/06/2022 31/08/2022   NA
## 9  MASCULINO DEJR020121FM6    03/08/2022 03/09/2022 03/12/2022   NA
## 10 MASCULINO CURJ880922KM4    03/08/2022 03/09/2022 03/12/2022   NA
##              PUESTO       DEPARTAMENTO NO.SEGURO.SOCIAL SALARIO.DIARIO.IMSS
## 1  AYUDANTE GENERAL Producción Retorn      43129645503        2.407500e+02
## 2  AYUDANTE GENERAL Producción Retorn      43129495305        1.757900e+02
## 3  AYUDANTE GENERAL Producción Retorn      43896946522        1.516729e+09
## 4       AY. GENERAL Producción Retorn      32169692806        1.516100e+02
## 5       AY. GENERAL Producción Retorn     0 2166991287        1.516100e+02
## 6  AYUDANTE GENERAL Producción Retorn      44190106417        1.516100e+02
## 7  AYUDANTE GENERAL Producción Retorn      54170325234        1.806800e+02
## 8  AYUDANTE GENERAL Producción Retorn      43998316194        1.806800e+02
## 9  AYUDANTE GENERAL Producción Retorn      10180275660        1.806800e+02
## 10 AYUDANTE GENERAL Producción Retorn     02 228859076        1.806800e+02
##    FACTOR.CRED.INFONAVIT NÂ..CREDITO.INFONAVIT
## 1                                             
## 2                                             
## 3                                             
## 4                                             
## 5                                             
## 6                    N/A                   N/A
## 7                    N/A                   N/A
## 8                    N/A                   N/A
## 9                    N/A                   N/A
## 10                   N/A                   N/A
##                     LUGAR.DE.NACIMIENTO               CURP           CALLE
## 1                                       TOPP961210HNLVRD07   RIO ACAPONETA
## 2                                       GUTV940506HVZRNC04    AGUSTIN LARA
## 3                                       AURJ690221HNLGDM07  PUERTO CABELLO
## 4                                       HEFB961228MSPRLR08 ANTONIO AGUILAR
## 5                                       CAME691111MVZHRR02  VISTAS DEL RIO
## 6       MIGUEL HIDALGO CIUDAD DE MEXICO GAGL011025HDFRNSA5           PINOS
## 7                 MONTERREY, NUEVO LEON HEHL030611HNLRRSA3       RIO TISZA
## 8                 MONTERREY, NUEVO LEON ZAPJ830218MNLMNS04        HUNGAROS
## 9  SAN NICOLAS DE LOS GARZA, NUEVO LEON DEJR020121HNLLRFA3     RIO PASTAZA
## 10              HONDURAS, SANTA BARBARA CURJ880922HNERMS05    RIO AMAZONAS
##    NUMERO.INTERNO                 COLONIA      MUNICIPIO         ESTADO
## 1                 PUEBLO NUEVO 5TO SECTOR        APODACA    Nuevo León
## 2                                CANTORAL      PESQUERIA    Nuevo León
## 3            655A  LOS PUERTOS 2° SECTOR         JUAREZ    Nuevo León
## 4             564              CANTORAL 3        APODACA       COAHUILA
## 5             134          VISTAS DEL RIO         JUAREZ     NUEVO LEON
## 6             618          CAÑADA BLANCA CAÑADA BLANCA GUADALUPE N.L.
## 7             818            PUEBLO NUEVO        APODACA     NUEVO LEON
## 8             130        ROBERTO ESPINOZA        APODACA     NUEVO LEON
## 9             800            PUEBLO NUEVO        APODACA     NUEVO LEON
## 10            146            PUEBLO NUEVO        APODACA     NUEVO LEON
##    CODIGO.POSTAL ESTADO.CIVIL TARJETA....CUENTA  X
## 1          66649       Casado           BANORTE NA
## 2          66673      Soltero           BANORTE NA
## 3          67267       Casado           BANORTE NA
## 4          66673      SOLTERA         SANTANDER NA
## 5          67267      SOLTERA         SANTANDER NA
## 6          67114      SOLTERO           BANORTE NA
## 7          66646      SOLTERO           BANORTE NA
## 8          66648  UNION LIBRE           BANORTE NA
## 9          66646      SOLTERO           BANORTE NA
## 10         66646      SOLTERO           BANORTE NA
rh2$SALARIO.DIARIO.IMSS[rh2$NOMBRE == "JAIME ERNESTO"] <- 151.61
unique(rh2$SALARIO.DIARIO.IMSS)
##  [1]     176.72     337.05 4413757.00     260.01     240.75     152.86
##  [7]     175.79     144.45     279.61     151.67     208.65     240.71
## [13]     151.61     180.68     181.68     184.68     185.68         NA

El segundo salario equivocado es de 4413757.00. Repetimos el mismo procedimiento. Primero identificamos el registro.

rh2[rh2$SALARIO.DIARIO.IMSS == 4413757.00, ]
##      ï..No..De.Empleado   APELLIDOS  NOMBRE FECHA.DE.NACIMIENTO   GENERO
## 5                     5 LOPEZ RAMOS YOLANDA          06/09/1965 FEMENINO
## NA                   NA        <NA>    <NA>                <NA>     <NA>
## NA.1                 NA        <NA>    <NA>                <NA>     <NA>
## NA.2                 NA        <NA>    <NA>                <NA>     <NA>
## NA.3                 NA        <NA>    <NA>                <NA>     <NA>
## NA.4                 NA        <NA>    <NA>                <NA>     <NA>
## NA.5                 NA        <NA>    <NA>                <NA>     <NA>
## NA.6                 NA        <NA>    <NA>                <NA>     <NA>
## NA.7                 NA        <NA>    <NA>                <NA>     <NA>
## NA.8                 NA        <NA>    <NA>                <NA>     <NA>
##                RFC FECHA.DE.ALTA Primer.mes   X4to.mes BAJA      PUESTO
## 5    LORY650906DBA    05/05/2014 04/06/2014 02/09/2014   NA SUPERVISORA
## NA            <NA>          <NA>       <NA>       <NA>   NA        <NA>
## NA.1          <NA>          <NA>       <NA>       <NA>   NA        <NA>
## NA.2          <NA>          <NA>       <NA>       <NA>   NA        <NA>
## NA.3          <NA>          <NA>       <NA>       <NA>   NA        <NA>
## NA.4          <NA>          <NA>       <NA>       <NA>   NA        <NA>
## NA.5          <NA>          <NA>       <NA>       <NA>   NA        <NA>
## NA.6          <NA>          <NA>       <NA>       <NA>   NA        <NA>
## NA.7          <NA>          <NA>       <NA>       <NA>   NA        <NA>
## NA.8          <NA>          <NA>       <NA>       <NA>   NA        <NA>
##      DEPARTAMENTO NO.SEGURO.SOCIAL SALARIO.DIARIO.IMSS FACTOR.CRED.INFONAVIT
## 5         Costura      43836531525             4413757                      
## NA           <NA>             <NA>                  NA                  <NA>
## NA.1         <NA>             <NA>                  NA                  <NA>
## NA.2         <NA>             <NA>                  NA                  <NA>
## NA.3         <NA>             <NA>                  NA                  <NA>
## NA.4         <NA>             <NA>                  NA                  <NA>
## NA.5         <NA>             <NA>                  NA                  <NA>
## NA.6         <NA>             <NA>                  NA                  <NA>
## NA.7         <NA>             <NA>                  NA                  <NA>
## NA.8         <NA>             <NA>                  NA                  <NA>
##      NÂ..CREDITO.INFONAVIT LUGAR.DE.NACIMIENTO               CURP    CALLE
## 5                                              LORY650906MNLPML08 BETANZOS
## NA                    <NA>                <NA>               <NA>     <NA>
## NA.1                  <NA>                <NA>               <NA>     <NA>
## NA.2                  <NA>                <NA>               <NA>     <NA>
## NA.3                  <NA>                <NA>               <NA>     <NA>
## NA.4                  <NA>                <NA>               <NA>     <NA>
## NA.5                  <NA>                <NA>               <NA>     <NA>
## NA.6                  <NA>                <NA>               <NA>     <NA>
## NA.7                  <NA>                <NA>               <NA>     <NA>
## NA.8                  <NA>                <NA>               <NA>     <NA>
##      NUMERO.INTERNO           COLONIA MUNICIPIO      ESTADO CODIGO.POSTAL
## 5                   RINCON DE GALICIA   APODACA Nuevo León         66620
## NA             <NA>              <NA>      <NA>        <NA>            NA
## NA.1           <NA>              <NA>      <NA>        <NA>            NA
## NA.2           <NA>              <NA>      <NA>        <NA>            NA
## NA.3           <NA>              <NA>      <NA>        <NA>            NA
## NA.4           <NA>              <NA>      <NA>        <NA>            NA
## NA.5           <NA>              <NA>      <NA>        <NA>            NA
## NA.6           <NA>              <NA>      <NA>        <NA>            NA
## NA.7           <NA>              <NA>      <NA>        <NA>            NA
## NA.8           <NA>              <NA>      <NA>        <NA>            NA
##      ESTADO.CIVIL TARJETA....CUENTA  X
## 5         Soltero           BANORTE NA
## NA           <NA>              <NA> NA
## NA.1         <NA>              <NA> NA
## NA.2         <NA>              <NA> NA
## NA.3         <NA>              <NA> NA
## NA.4         <NA>              <NA> NA
## NA.5         <NA>              <NA> NA
## NA.6         <NA>              <NA> NA
## NA.7         <NA>              <NA> NA
## NA.8         <NA>              <NA> NA

Ahora hay que identificar puestos similares en el mismo departamento.

filter(rh2, DEPARTAMENTO == "Costura")
##   ï..No..De.Empleado          APELLIDOS        NOMBRE FECHA.DE.NACIMIENTO
## 1                  5        LOPEZ RAMOS       YOLANDA          06/09/1965
## 2                  7   PERALTA MARTINEZ       ARACELY          01/07/1967
## 3                 26  GARCIA CARRIZALES MA DEL CARMEN          03/02/1978
## 4                 30    MENDOZA NAVARRO      ADELAIDA          16/12/1979
## 5                 31       BARRON RAMOS BLANCA OLIVIA          29/06/1969
## 6                 43     VAZQUEZ CEPEDA  JOSE ALFREDO          28/08/1963
## 7                 51 NATIVIDAD MARTINEZ      MARCIANA          04/01/1967
##      GENERO           RFC FECHA.DE.ALTA Primer.mes   X4to.mes BAJA      PUESTO
## 1  FEMENINO LORY650906DBA    05/05/2014 04/06/2014 02/09/2014   NA SUPERVISORA
## 2  FEMENINO PEMA6707017U2    06/08/2015 05/09/2015 04/12/2015   NA   COSTURERA
## 3  FEMENINO GACM780203JT9    07/04/2020 07/05/2020 05/08/2020   NA   COSTURERA
## 4  FEMENINO MENA791216NF0    26/08/2020 25/09/2020 24/12/2020   NA   COSTURERA
## 5  FEMENINO BARB690629HF9    28/08/2020 27/09/2020 26/12/2020   NA   COSTURERA
## 6 MASCULINO VACA630828F84    12/08/2021 11/09/2021 10/12/2021   NA   COSTURERA
## 7  FEMENINO NAMM670104G81    06/12/2021 05/01/2022 05/04/2022   NA   COSTURERA
##   DEPARTAMENTO NO.SEGURO.SOCIAL SALARIO.DIARIO.IMSS FACTOR.CRED.INFONAVIT
## 1      Costura      43836531525          4413757.00                      
## 2      Costura       3876700802              260.01                      
## 3      Costura      43007814338              240.71                      
## 4      Costura      47967919706              176.72                      
## 5      Costura      43076902675              176.72                      
## 6      Costura      43806306155              176.72                   N/A
## 7      Costura     0 2186770489              176.72                   N/A
##   NÂ..CREDITO.INFONAVIT                 LUGAR.DE.NACIMIENTO               CURP
## 1                                                           LORY650906MNLPML08
## 2                                                           PEMA670701MNLRRR02
## 3                                                           GACC780203MTSRRR03
## 4                                                           MENA791216MNLNVD00
## 5                                                           BARB690629MNLRML15
## 6                   N/A TERMINAL DE PROVIDENCIA - ZACATECAS VXCA630828HZSZPL02
## 7                   N/A                            VERACRUZ NAMM670104MVZTRR00
##           CALLE NUMERO.INTERNO             COLONIA MUNICIPIO      ESTADO
## 1      BETANZOS                  RINCON DE GALICIA   APODACA Nuevo León
## 2 ALAMO TEMBLON                  ALAMOS DEL PARQUE   APODACA Nuevo León
## 3     RIO LEMPA                       PUEBLO NUEVO   APODACA Nuevo León
## 4        BLANCA            306        LOS CANDILES   APODACA Nuevo León
## 5      RIO SENA            107        PUEBLO NUEVO   APODACA Nuevo León
## 6   SECRETARIOS            825 LA ALIANZA SECTOR C MONTERREY  NUEVO LEON
## 7         TAJIN            509             LA JOYA GUADALUPE  NUEVO LEON
##   CODIGO.POSTAL ESTADO.CIVIL TARJETA....CUENTA  X
## 1         66620      Soltero           BANORTE NA
## 2         66633       Casado           BANORTE NA
## 3         66646  Union Libre           BANORTE NA
## 4         66647       CASADA           BANORTE NA
## 5         66646       Casado           BANORTE NA
## 6         64103   DIVORCIADO         SANTANDER NA
## 7         67160       CASADA           BANORTE NA

En este caso, es el único registro con ese puesto en el departamento, por lo tanto identificaremos puestos similares pero en diversos departamentos.

filter(rh2, PUESTO == "SUPERVISORA")
##   ï..No..De.Empleado       APELLIDOS  NOMBRE FECHA.DE.NACIMIENTO   GENERO
## 1                  4 CAZARES MORALES   MARIA          01/05/1990 FEMENINO
## 2                  5     LOPEZ RAMOS YOLANDA          06/09/1965 FEMENINO
##             RFC FECHA.DE.ALTA Primer.mes   X4to.mes BAJA      PUESTO
## 1 CAMM9005019S8    30/01/2013 01/03/2013 30/05/2013   NA SUPERVISORA
## 2 LORY650906DBA    05/05/2014 04/06/2014 02/09/2014   NA SUPERVISORA
##            DEPARTAMENTO NO.SEGURO.SOCIAL SALARIO.DIARIO.IMSS
## 1 Produccion Cartón MC      43089001317              337.05
## 2               Costura      43836531525          4413757.00
##   FACTOR.CRED.INFONAVIT NÂ..CREDITO.INFONAVIT LUGAR.DE.NACIMIENTO
## 1                                                                
## 2                                                                
##                 CURP         CALLE NUMERO.INTERNO           COLONIA MUNICIPIO
## 1 CAMM900501MVZZRR00 RIO ACAPONETA                     PUEBLO NUEVO   APODACA
## 2 LORY650906MNLPML08      BETANZOS                RINCON DE GALICIA   APODACA
##        ESTADO CODIGO.POSTAL ESTADO.CIVIL TARJETA....CUENTA  X
## 1 Nuevo León         66649       Casado           BANORTE NA
## 2 Nuevo León         66620      Soltero           BANORTE NA

Hemos identificado solo un registro más con el mismo puesto, por lo que optaremos por asignar el mismo salario al registro con el salario elevado.

rh2$SALARIO.DIARIO.IMSS[rh2$NOMBRE == "YOLANDA"] <- 337.05  
unique(rh2$SALARIO.DIARIO.IMSS)
##  [1] 176.72 337.05 260.01 240.75 152.86 175.79 144.45 279.61 151.67 208.65
## [11] 240.71 151.61 180.68 181.68 184.68 185.68     NA
Tipos de variables equivocados

Al observar los tipos de variables de Delivery Performance podemos notar que la fecha está como character y debería estar como fecha. Por lo tanto, hay que modificarla.

dperf2<-dperf
dperf2$FECHA<-as.Date(dperf2$FECHA, format ="%d/%m/%Y")
str(dperf2)
## 'data.frame':    2392 obs. of  7 variables:
##  $ Cliente       : chr  "PRINTEL " "MAHLE" "MAHLE" "MAHLE" ...
##  $ VUELTAS       : int  1 1 2 3 1 1 2 3 1 1 ...
##  $ FECHA         : Date, format: "2021-07-22" "2021-07-22" ...
##  $ Plan.Arrival  : int  16 8 9 20 0 0 0 0 16 8 ...
##  $ Real.Arrival  : num  0 8 9 20 0 0 0 0 16.3 8 ...
##  $ Real.Departure: num  0 8.55 10 21.1 0 0 0 0 18.1 8.5 ...
##  $ Diference     : num  0 0.55 1 1.1 0 0 0 0 1.8 0.5 ...

Así mismo, en ambas bases de datos de Recursos Humanos hemos identificado el mismo error.

rh2_2<-rh2
rh2_2$FECHA.DE.ALTA<-as.Date(rh2_2$FECHA.DE.ALTA, format ="%d/%m/%Y")
rh2_2$FECHA.DE.NACIMIENTO<-as.Date(rh2_2$FECHA.DE.NACIMIENTO, format ="%d/%m/%Y")
rh2_2$Primer.mes<-as.Date(rh2_2$Primer.mes, format ="%d/%m/%Y")
rh2_2$X4to.mes<-as.Date(rh2_2$X4to.mes, format ="%d/%m/%Y")
str(rh2_2$FECHA.DE.ALTA)
##  Date[1:122], format: "2010-07-01" "2011-07-01" "2011-11-22" "2013-01-30" "2014-05-05" ...
str(rh2_2$FECHA.DE.NACIMIENTO)
##  Date[1:122], format: "1955-09-10" "1979-05-14" "1949-11-21" "1990-05-01" "1965-09-06" ...
str(rh2_2$Primer.mes)
##  Date[1:122], format: "2010-07-31" "2011-07-31" NA "2013-03-01" "2014-06-04" "2014-08-02" ...
str(rh2_2$X4to.mes)
##  Date[1:122], format: "2010-10-29" "2011-10-29" NA "2013-05-30" "2014-09-02" "2014-10-31" ...
rh_baja<-rh
rh_baja$FECHA.DE.ALTA<-as.Date(rh_baja$FECHA.DE.ALTA, format ="%d/%m/%Y")
rh_baja$FECHA.DE.NACIMIENTO<-as.Date(rh_baja$FECHA.DE.NACIMIENTO, format ="%d/%m/%Y")
rh_baja$BAJA<-as.Date(rh_baja$BAJA, format ="%d/%m/%Y")
str(rh_baja$FECHA.DE.ALTA)
##  Date[1:238], format: "2020-03-09" "2021-11-09" "2021-11-10" "2021-11-10" "2021-11-18" ...
str(rh_baja$FECHA.DE.NACIMIENTO)
##  Date[1:238], format: "1990-06-24" "1986-07-11" "1999-01-29" "2001-06-11" "1993-01-28" ...
str(rh_baja$BAJA)
##  Date[1:238], format: "2021-11-27" "2022-01-08" "2022-01-08" "2022-01-08" "2022-01-08" ...
Eliminar columnas

Que no vayamos a utilizar todas las variables para nuestra exploración de datos no significa que eliminemos las columnas que no nos sirven. Sin embargo, en la base de datos de Recursos Humanos: Colaboradores hay una columna extra al final con valores vacíos y que debe ser eliminada.

rh2_2<-select(rh2_2, ï..No..De.Empleado:TARJETA....CUENTA)
colnames(rh2_2)
##  [1] "ï..No..De.Empleado"    "APELLIDOS"             "NOMBRE"               
##  [4] "FECHA.DE.NACIMIENTO"   "GENERO"                "RFC"                  
##  [7] "FECHA.DE.ALTA"         "Primer.mes"            "X4to.mes"             
## [10] "BAJA"                  "PUESTO"                "DEPARTAMENTO"         
## [13] "NO.SEGURO.SOCIAL"      "SALARIO.DIARIO.IMSS"   "FACTOR.CRED.INFONAVIT"
## [16] "NÂ..CREDITO.INFONAVIT" "LUGAR.DE.NACIMIENTO"   "CURP"                 
## [19] "CALLE"                 "NUMERO.INTERNO"        "COLONIA"              
## [22] "MUNICIPIO"             "ESTADO"                "CODIGO.POSTAL"        
## [25] "ESTADO.CIVIL"          "TARJETA....CUENTA"

Eliminamos la columna de ID.ODOO en Delivery Plan debido a que para nuestro análisis no representa algo importante a analizar. Dentro de la misma base de datos tenemos la columan de ITEM la cuál representa lo mismo, presentado de una forma más clara y entendible. Explorando más la base de datos nos dimos cuenta que teniamos dos columnas con información vacia al final de la tabla, de igual manera las eliminamos.

dp_1<-dplan
dp_1$ID.ODOO <- NULL
dp_1$X <- NULL
dp_1$X.1 <- NULL
head(dp_1)
##   ï..CLIENTE.PLANTA         PROYECTO                              ITEM JUNIO
## 1              STB3  CANASTILLA GRIS CABLE SET CAJA BACK UP CANASTILLA     0
## 2              STB4 Caja inter chica Caja intercompaâ\210šÂ±â\210šâ‰ a chica     0
## 3              STB5      CHAROLA G09              CHAROLA G09 915898       0
## 4              STB6                                     MOTOR GEAR BOX     0
## 5              STB7                                 BLOQUEO GAS SPRING     0
## 6              STB8        CABLE SET               INSERTOS CABLE SET      0
##   JULIO AGOSTO SEPTIEMBRE OCTUBRE NOVIEMBRE DICIEMBRE ene.22 feb.22 mar.22
## 1   140    530          0     200         0       150    230    500      0
## 2     0      0          0       0         0       184    125     55     55
## 3     0      0          0       0         0        75    126     10      5
## 4     0      0          0       0         0         1      0      1      0
## 5     0      0          0       0         0         0      0      0      0
## 6   300      0          0       0         0         0      0      0      0
##   abr.22 may.22 jun.22 jul.22 ago.22 sep.22 OCTUBRE.22 nov.22 dic.22 ene.23
## 1      0      0    200    900   1000      0          0      0      0      0
## 2      0      0      0      0      0      0          0      0      0      0
## 3      0     15      5     10      0      5         50    125      0      0
## 4      1      3      2      5      3      4          6      7      7      0
## 5      0      0    100    100      0      0          0      0      0      0
## 6    400      0      0      0      0      0          0      0      0      0
##   feb.23 mar.23 TOTAL.MESES
## 1      0      0        3850
## 2      0      0         419
## 3      0      0         426
## 4      0      0          40
## 5      0      0         200
## 6      0      0         700
Registros erroneos

En Recursos Humanos:Bajas en la variable de género nos encontramos con un valor que no corresponde al género y hay que asignar el género correcto.

unique(rh_baja$GENERO)
## [1] "MASCULINO"     "FEMENINO"      "CAPJ000926597" ""
filter(rh_baja, GENERO == "CAPJ000926597")
##       ï..APELLIDOS NOMBRE FECHA.DE.NACIMIENTO        GENERO           RFC
## 1 CASTILLO PERALES JANETH          2000-09-26 CAPJ000926597 CAPJ000926597
##   FECHA.DE.ALTA      MOTIVO.DE.BAJA  X       BAJA      PUESTO
## 1    2021-10-19 RENUNCIA VOLUNTARIA 86 2022-01-13 AY. GENERAL
##            DEPARTAMENTO NO.SEGURO.SOCIAL SALARIO.DIARIO.IMSS
## 1 Produccion Cartón MC      26170070374              151.61
##   FACTOR.CRED.INFONAVIT NÂ..CREDITO.INFONAVIT      LUGAR.DE.NACIMIENTO
## 1                   N/A                   N/A SAN NICOLAS DE LOS GARZA
##                 CURP       CALLE NUMERO.INTERNO      COLONIA CODIGO.POSTAL
## 1 CAPJ000926MNLSRN01 RIO URUGUAY            718 PUEBLO NUEVO         66646
##   MUNICIPIO     ESTADO ESTADO.CIVIL TARJETA....CUENTA
## 1   APODACA NUEVO LEON       CASADA           BANORTE
rh_baja$GENERO[rh_baja$NOMBRE == "JANETH"] <- "FEMENINO"
unique(rh_baja$GENERO)
## [1] "MASCULINO" "FEMENINO"  ""

5) Incluye una breve reflexión de la actividad.

Esta actividad es un ejemplo perfecto de cómo son las bases de datos de las emrpesas en realidad. Hay que comprender que la gran mayoría de las empresas no son expertos en bases de datos ni en recopilación de información, por lo que sus datos suelen carecer de estructura correcta u orden apropiado para su análisis en herramientas como R. Este ejercicio nos ha sido de gran utilidad para aprender a transformar las bases de datos, y limpiarlas para su futuro análisis.

Entregable 2.2

Realizar un análisis estadístico descriptivo en el que logres destacar el conjunto de datos, que apoyan a la empresa a mejorar su operación. Incorpora al menos dos propuestas concretas, apoyadas de tu análisis en donde se incluye al menos: (1) Tabla de frecuencia, (opcional) Tablas cruzadas, (2-3) Gráficos de datos cualitativos y cuantitativos, así como (2-3) Gráficos de dispersión.

Importar la base de datos

bd_ext <- read.csv("Consumer Expenditure on Pharmaceutical Products, Medical Appliances and Equipment.csv")

Identificar la Estructura de Datos (Cualitativas o Cuantitativas)

Utilizaremos la función str() para mostrar la estructura interna de un objeto.

str(bd_ext)
## 'data.frame':    30 obs. of  8 variables:
##  $ ï..Geography: chr  "Argentina" "Belgium" "Bolivia" "Brazil" ...
##  $ Region      : chr  "LATAM" "EUROPE" "LATAM" "LATAM" ...
##  $ X2016       : num  134135 3902 1509 129879 24802 ...
##  $ X2017       : num  178976 3933 1636 141744 26053 ...
##  $ X2018       : num  267389 3928 1739 149986 27096 ...
##  $ X2019       : num  375429 4211 1802 157013 27648 ...
##  $ X2020       : num  459736 3809 1637 185792 28338 ...
##  $ X2021       : num  748630 4168 1746 200785 29641 ...

Entender base de datos

summary(bd_ext)
##  ï..Geography          Region              X2016              X2017         
##  Length:30          Length:30          Min.   :      11   Min.   :      52  
##  Class :character   Class :character   1st Qu.:    5229   1st Qu.:    5373  
##  Mode  :character   Mode  :character   Median :   16902   Median :   17426  
##                                        Mean   : 1098578   Mean   : 1166896  
##                                        3rd Qu.:  107778   3rd Qu.:  117145  
##                                        Max.   :25415783   Max.   :26859592  
##      X2018              X2019              X2020              X2021          
##  Min.   :     840   Min.   :     853   Min.   :     759   Min.   :9.330e+02  
##  1st Qu.:   10722   1st Qu.:   11424   1st Qu.:   11200   1st Qu.:1.253e+04  
##  Median :   19301   Median :   19795   Median :   19829   Median :2.149e+04  
##  Mean   : 1266633   Mean   : 1504649   Mean   : 3645097   Mean   :4.075e+07  
##  3rd Qu.:  124464   3rd Qu.:  284312   3rd Qu.:  303711   3rd Qu.:3.406e+05  
##  Max.   :29173224   Max.   :31651040   Max.   :68889712   Max.   :1.174e+09

Tipos de Variable

Variable Type
Geography Qualitative
Region Qualitative
X2016 Quantitative (discrete)
X2017 Quantitative (discrete)
X2018 Quantitative (discrete)
X2019 Quantitative (discrete)
X2020 Quantitative (discrete)
X2021 Quantitative (discrete)

Acomodo de Datos

bd_ext1 <- gather(bd_ext, key="Year", value="points", 3:8)

Tabla de Frecuencia (Países x Región)

region <- table(bd_ext$Region)
region
## 
## EUROPE  LATAM    NAM 
##     11     16      3
knitr::kable(region)
Var1 Freq
EUROPE 11
LATAM 16
NAM 3

Promedio del gasto del Consumidor por región y por año

str(bd_ext)
## 'data.frame':    30 obs. of  8 variables:
##  $ ï..Geography: chr  "Argentina" "Belgium" "Bolivia" "Brazil" ...
##  $ Region      : chr  "LATAM" "EUROPE" "LATAM" "LATAM" ...
##  $ X2016       : num  134135 3902 1509 129879 24802 ...
##  $ X2017       : num  178976 3933 1636 141744 26053 ...
##  $ X2018       : num  267389 3928 1739 149986 27096 ...
##  $ X2019       : num  375429 4211 1802 157013 27648 ...
##  $ X2020       : num  459736 3809 1637 185792 28338 ...
##  $ X2021       : num  748630 4168 1746 200785 29641 ...
frec_reg<-bd_ext%>%group_by(Region)%>%tally()
X_2016<-aggregate(X2016 ~ Region , data = bd_ext, mean)
X_2017<-aggregate(X2017 ~ Region , data = bd_ext, mean)
X_2018<-aggregate(X2018 ~ Region , data = bd_ext, mean)
X_2019<-aggregate(X2019 ~ Region , data = bd_ext, mean)
X_2020<-aggregate(X2020 ~ Region , data = bd_ext, mean)
X_2021<-aggregate(X2021 ~ Region , data = bd_ext, mean)

Gasto del consumidor en aparatos médicos y farmacéuticos x año

ggplot(X_2016, aes(x=Region, y=X2016)) +
  geom_bar(stat="identity", fill="purple") + scale_fill_grey() + # Add bars to the plot
  labs(title = "Average Expenditure by Region in 2016", # Add a title
       x = "Region", y = "$ Million")

ggplot(X_2017, aes(x=Region, y=X2017)) +
  geom_bar(stat="identity", fill="purple")+ scale_fill_grey() +
  labs(title = "Average Expenditure by Region in 2017", 
       x = "Region", y = "$ Million")

ggplot(X_2018, aes(x=Region, y=X2018)) +
  geom_bar(stat="identity", fill="purple") + scale_fill_grey() + # Add bars to the plot
  labs(title = "Average Expenditure by Region in 2018", # Add a title
       x = "Region", y = "$ Million")

ggplot(X_2019, aes(x=Region, y=X2019)) +
  geom_bar(stat="identity", fill="purple") + scale_fill_grey() + # Add bars to the plot
  labs(title = "Average Expenditure by Region in 2019", # Add a title
       x = "Region", y = "$ Million")

ggplot(X_2020, aes(x=Region, y=X2020)) +
  geom_bar(stat="identity", fill="purple") + scale_fill_grey() + # Add bars to the plot
  labs(title = "Average Expenditure by Region in 2020", # Add a title
       x = "Region", y = "$ Million")

ggplot(X_2021, aes(x=Region, y=X2021)) +
  geom_bar(stat="identity", fill="purple") + scale_fill_grey() + # Add bars to the plot
  labs(title = "Average Expenditure by Region in 2021", # Add a title
       x = "Region", y = "$ Million")

Gráfica de Dispersión: Boxplots

ggplot(bd_ext1, aes(x=Year, y=points)) + 
  geom_boxplot(outlier.colour="black", outlier.shape=16,
             outlier.size=2, notch=FALSE)

  labs(title = "Promedio del Gasto por Consumidor por Año",
       x="Año", y="$ Millones") +
  theme_classic() 
## NULL
ggplot(bd_ext1, aes(x=Region, y=points)) + 
  geom_boxplot(outlier.colour="black", outlier.shape=16,
             outlier.size=2, notch=FALSE)

  labs(title = "Promedio del Gasto por Consumidor por Región",
       x="Año", y="$ Millones") +
  theme_classic() 
## NULL

Scatter plots

longer_data <- bd_ext %>%
  pivot_longer(X2016:X2021, names_to = "year", values_to = "expenditure")

ggplot(data = longer_data, aes(year, expenditure)) +
  geom_line(color = "steelblue", size = 1) +
  geom_point(color="steelblue") + 
  labs(title = "Expenditure per Region by Years",
       y = "Expenditure", x = "Year") + 
  facet_wrap(~ Region)

Propuestas

Propuesta #1 De acuerdo con Statista 2022, la industria médica farmacéutica es la número 4 en generar mayor utilidad para la industria del empaque. En el año presente cuenta con una utilidad del 0.97% y en los próximos se ve reflejado un incremento, para el 2023 tendrá una utilidad del 1.01% y para el 2024 una utilidad del 1.11%. Es por ello que recomendamos a FORM introducirse a la industria médica farmacéutica.

Propuesta #2 En base a las gráficas presentadas anteriormente podemos observar que Latinoamérica es la región con mayores gastos en equipo médico, esta industria alcanza los $2,500,000 millones de pesos en gastos. Por lo que recomendamos a FORM adentrarse en la industria médica farmacéutica específicamente en Latinoamérica ya que es una industria muy rentable. De la misma manera, pensamos que es conveniente que FORM realice convenios con diferentes hospitales y/o farmacias para ser su principal proveedor de empaque.

Entregable 2.3

Empleando las base de datos correspondientes.
a. FORM – Recursos Humanos
b. FORM – Delivery Plan
c. FORM – Delivery Performance

Realizar un análisis estadístico descriptivo en el que logres destacar el conjunto de datos, que apoyan a la empresa a mejorar su operación. Incorpora al menos dos propuestas concretas, apoyadas de tu análisis en donde se incluye al menos: (1) Tabla de frecuencia, (opcional) Tablas cruzadas, (2-3) Gráficos de datos cualitativos y cuantitativos, así como (2-3) Gráficos de dispersión.

Tablas de frecuencia

Recursos Humanos: Bajas

mot_baja<-rh_baja %>% group_by(MOTIVO.DE.BAJA) %>% tally()
mot_baja
## # A tibble: 5 x 2
##   MOTIVO.DE.BAJA          n
##   <chr>               <int>
## 1 ABANDONO                1
## 2 BAJA POR FALTAS       141
## 3 JUBILACION              1
## 4 RENUNCIA VOLUNTARIA    87
## 5 TERMINO DE CONTRATO     8

Recursos Humanos: Colaboradores

rh2_2["GENERO"][rh2_2["GENERO"] == ''] <- NA
rh2_2$GENERO<-rh2_2$GENERO%>% replace_na('FALTANTE')
genero<-rh2_2 %>% group_by(GENERO) %>% tally()
genero
## # A tibble: 3 x 2
##   GENERO        n
##   <chr>     <int>
## 1 FALTANTE      9
## 2 FEMENINO     61
## 3 MASCULINO    52

##Tablas cruzadas
Tabla cruzada de género y motivo de baja

rh_baja["GENERO"][rh_baja["GENERO"] == ''] <- NA
rh_baja$GENERO<-rh_baja$GENERO%>% replace_na('FALTANTE')
tablax1<-rh_baja %>% tabyl(GENERO,MOTIVO.DE.BAJA)
tablax1
##     GENERO ABANDONO BAJA POR FALTAS JUBILACION RENUNCIA VOLUNTARIA
##   FALTANTE        0               0          0                   1
##   FEMENINO        0              90          0                  44
##  MASCULINO        1              51          1                  42
##  TERMINO DE CONTRATO
##                    0
##                    6
##                    2

Tabla cruzada de Cliente y vueltas

tablax2<-dperf2 %>% tabyl(Cliente,VUELTAS)
tablax2
##   Cliente   1   2   3
##     MAGNA 299   0   0
##     MAHLE 299 299 299
##  PRINTEL  299   0   0
##    VARROC 299 299 299

Tabla cruzada de genero y salario diario

tablax3<-rh2_2 %>% tabyl(GENERO,SALARIO.DIARIO.IMSS)
tablax3
##     GENERO 144.45 151.61 151.67 152.86 175.79 176.72 180.68 181.68 184.68
##   FALTANTE      0      0      0      0      0      0      0      0      0
##   FEMENINO      3      7      1      1      0      7     34      1      1
##  MASCULINO      0      5      3      0      1     16     25      0      0
##  185.68 208.65 240.71 240.75 260.01 279.61 337.05 NA_
##       0      0      0      0      0      0      0   9
##       1      1      1      0      1      0      2   0
##       0      0      0      1      0      1      0   0

Tabla cruzada de MOTIVO DE BAJA y departamento

tablax4<-rh_baja %>% tabyl(MOTIVO.DE.BAJA,DEPARTAMENTO)
tablax4
##       MOTIVO.DE.BAJA ADMINISTRATIVO Ay.flexo CAJAS Calidad Cedis CEDIS celdas
##             ABANDONO              0        1     0       0     0     0      0
##      BAJA POR FALTAS              0        3     2       1     4     1      0
##           JUBILACION              0        0     0       0     1     0      0
##  RENUNCIA VOLUNTARIA              3        1     0       2     0     2      1
##  TERMINO DE CONTRATO              1        0     0       0     1     0      0
##  Celdas CELDAS CORTADORAS Costura COSTURA EHS Embarques EMBARQUES Laminado
##       0      0          0       0       0   0         0         0        0
##       5      1          1       3       1   0         1         2        1
##       0      0          0       0       0   0         0         0        0
##       3      0          0       6       0   0         0         4        1
##       1      0          0       0       0   1         0         0        0
##  MANTENIMIENTO Mantenimiento FF Marcadora Materiales Paileria PAILERIA
##              0                0         0          0        0        0
##              0                0         2          3        6        1
##              0                0         0          0        0        0
##              1                1         0          4        3        1
##              0                0         0          0        0        0
##  Producción Retorn Produccion Cartón MC Produccion Cartón MDL stabilus
##                   0                     0                      0        0
##                   6                     4                      0        0
##                   0                     0                      0        0
##                   6                     4                      2        1
##                   0                     1                      0        0
##  Stabilus STABILUS Troquel TROQUEL emptystring_
##         0        0       0       0            0
##        29        2       6       1           55
##         0        0       0       0            0
##        15        1       3       0           22
##         1        0       0       0            2

Tabla cruzada de puesto y salario diario

tablax5<-rh2_2 %>% tabyl(PUESTO,SALARIO.DIARIO.IMSS)
tablax5
##                           PUESTO 144.45 151.61 151.67 152.86 175.79 176.72
##                                       0      0      0      0      0      0
##                      AY. GENERAL      0      7      0      0      0      0
##        AYUDANTE DE MANTENIMIENTO      0      0      0      0      0      0
##                 Ayudante general      0      0      0      0      0      1
##                 AYUDANTE GENERAL      2      5      3      0      1      1
##                           CHOFER      0      0      0      0      0      3
##                    CHOFER GESTOR      0      0      0      0      0      0
##                        COSTURERA      0      0      0      1      0      4
##             CUSTOMER SERVICE INF      0      0      0      0      0      1
##                        ENFERMERA      0      0      0      0      0      1
##                          Externo      0      0      0      0      0      1
##                          EXTERNO      0      0      1      0      0      0
##                           GESTOR      0      0      0      0      0      1
##             GUARDIA DE SEGURIDAD      0      0      0      0      0      0
##             INSPECTOR DE CALIDAD      0      0      0      0      0      0
##            INSPECTORA DE CALIDAD      0      0      0      0      0      0
##                            LIDER      1      0      0      0      0      0
##                         LIMPIEZA      0      0      0      0      0      1
##                    MANTENIMIENTO      0      0      0      0      0      0
##                   MONTACARGUISTA      0      0      0      0      0      0
##                             MOZO      0      0      0      0      0      0
##  OP. FLEXO-RANURADORA-REFILADORA      0      0      0      0      0      1
##                  OPERADOR SIERRA      0      0      0      0      0      0
##                           PINTOR      0      0      0      0      0      1
##                           RECIBO      0      0      0      0      0      1
##                        RESIDENTE      0      0      0      0      0      3
##                         SOLDADOR      0      0      0      0      0      1
##            Supervisor de Máquin      0      0      0      0      0      1
##             Supervisor de pegado      0      0      0      0      0      1
##                      SUPERVISORA      0      0      0      0      0      0
##  180.68 181.68 184.68 185.68 208.65 240.71 240.75 260.01 279.61 337.05 NA_
##       0      0      0      0      0      0      0      0      0      0   9
##       0      0      0      0      0      0      0      0      0      0   0
##       1      0      0      0      0      0      0      0      0      0   0
##       0      0      0      0      0      0      0      0      0      0   0
##      43      1      1      1      0      0      1      0      0      0   0
##       1      0      0      0      0      0      0      0      0      0   0
##       1      0      0      0      0      0      0      0      0      0   0
##       3      0      0      0      0      1      0      1      0      0   0
##       0      0      0      0      0      0      0      0      0      0   0
##       0      0      0      0      0      0      0      0      0      0   0
##       0      0      0      0      0      0      0      0      0      0   0
##       0      0      0      0      0      0      0      0      0      0   0
##       0      0      0      0      0      0      0      0      0      0   0
##       1      0      0      0      0      0      0      0      0      0   0
##       0      0      0      0      1      0      0      0      0      0   0
##       1      0      0      0      0      0      0      0      0      0   0
##       0      0      0      0      0      0      0      0      0      0   0
##       0      0      0      0      0      0      0      0      0      0   0
##       0      0      0      0      0      0      0      0      1      0   0
##       1      0      0      0      0      0      0      0      0      0   0
##       1      0      0      0      0      0      0      0      0      0   0
##       0      0      0      0      0      0      0      0      0      0   0
##       1      0      0      0      0      0      0      0      0      0   0
##       0      0      0      0      0      0      0      0      0      0   0
##       0      0      0      0      0      0      0      0      0      0   0
##       1      0      0      0      0      0      0      0      0      0   0
##       4      0      0      0      0      0      0      0      0      0   0
##       0      0      0      0      0      0      0      0      0      0   0
##       0      0      0      0      0      0      0      0      0      0   0
##       0      0      0      0      0      0      0      0      0      2   0

Graficos de datos cualitativos

Bar Graph/histograma de motivo de bajas

ggplot(mot_baja,aes(x=MOTIVO.DE.BAJA,y=n,fill=n))+
  geom_bar(stat="identity")+
  theme_minimal()+
  labs(title="Motivo de Bajas")

Bar Graph de motivo de bajas por departamento

ggplot(rh_baja,aes(x=DEPARTAMENTO,y=MOTIVO.DE.BAJA,fill=MOTIVO.DE.BAJA))+
  geom_bar(stat="identity")+
  theme_minimal()+
  labs(title="Motivo de Bajas por Departamento")

Gráficos de datos cuantitativos

Bar graph de género y salario promedio

genero_salprom<-aggregate(SALARIO.DIARIO.IMSS ~ GENERO, data = rh2_2, mean)
genero_salprom
##      GENERO SALARIO.DIARIO.IMSS
## 1  FEMENINO            182.2102
## 2 MASCULINO            177.9563
ggplot(genero_salprom,aes(x=GENERO,y=SALARIO.DIARIO.IMSS,fill=SALARIO.DIARIO.IMSS))+
  geom_bar(stat="identity")+
  theme_minimal()+
  labs(title="Salario promedio por género")

Histograma de salarios

hist(rh2_2$SALARIO.DIARIO.IMSS, col="darkblue")

Diferencia promedio por cliente

dif_prom<-aggregate(Diference ~ Cliente, data = dperf2, mean)
dif_prom
##    Cliente Diference
## 1    MAGNA 0.0000000
## 2    MAHLE 0.7880936
## 3 PRINTEL  0.4418395
## 4   VARROC 0.0000000
ggplot(dif_prom,aes(x=Cliente,y=Diference, fill=Diference))+
  geom_bar(stat="identity")+
  theme_minimal()+
  labs(title="Diferencia promedio por cliente")

Plot de salarios

n_distinct(rh2_2$SALARIO.DIARIO.IMSS)
## [1] 17
salario<-rh2_2 %>% group_by(SALARIO.DIARIO.IMSS) %>% tally()
salario
## # A tibble: 17 x 2
##    SALARIO.DIARIO.IMSS     n
##                  <dbl> <int>
##  1                144.     3
##  2                152.    12
##  3                152.     4
##  4                153.     1
##  5                176.     1
##  6                177.    23
##  7                181.    59
##  8                182.     1
##  9                185.     1
## 10                186.     1
## 11                209.     1
## 12                241.     1
## 13                241.     1
## 14                260.     1
## 15                280.     1
## 16                337.     2
## 17                 NA      9
plot(salario$SALARIO.DIARIO.IMSS,salario$n, type="b",col="blue", lwd=1.5, xlab ="Salario Diario",ylab ="Personas con ese salario", main = "Salario diario")

Gráficos de dispersión

Boxplot de salarios

boxplot(rh2_2$SALARIO.DIARIO.IMSS,col=rainbow(ncol(trees)))

Boxplot de Diferencia por Mes

dperf3<-dperf2
dperf3$month <- format(dperf2$FECHA, "%m")              
head(dperf3$month) 
## [1] "07" "07" "07" "07" "07" "07"
boxplot(dperf3$Diference ~ dperf3$month, main="Distribucion de diferencia por mes", 
        xlab="Mes",ylab="Diferencia",col=rainbow(ncol(trees)))

Plot de bajas por mes

rh_baja2<-rh_baja
rh_baja2$month_baja <- format(rh_baja2$BAJA, "%m")              
rh_baja2$month_baja<-as.integer(rh_baja2$month_baja)

n_distinct(rh_baja2$month_baja)
## [1] 10
mes_baja<-rh_baja2 %>% group_by(month_baja) %>% tally()
mes_baja
## # A tibble: 10 x 2
##    month_baja     n
##         <int> <int>
##  1          1    37
##  2          2    21
##  3          3    21
##  4          4    33
##  5          5    30
##  6          6    27
##  7          7    23
##  8          8    30
##  9         11     1
## 10         NA    15
plot(mes_baja$month_baja, mes_baja$n,, main="Bajas por mes", 
        xlab="Mes",ylab="No. de bajas")

Tiempo promedio de permanencia en FORM

rh_baja2$Permanencia<-difftime(rh_baja2$BAJA,rh_baja2$FECHA.DE.ALTA, units = "days")
boxplot(rh_baja2$Permanencia, main="Permanencia en FORM", 
        xlab="Permanencia",ylab="Tiempo en dias",col=rainbow(ncol(trees)))

## Propuestas

Propuestas De acuerdo con el análisis realizado de la base de datos “FORM - Recursos Humanos” se observó que los motivos de baja más comunes son: Baja por faltas: 141 Renuncia voluntaria: 87 Término de contrato: 8

De acuerdo con datos de OCCMundial y Forbes México, el 58% de los trabajadores del país no se presenta a laborar por cuestiones de salud. Entre los principales problemas que se manifiestan están las enfermedades estomacales o gástricas y las cefaleas. De igual manera, el 36% se ausenta de sus obligaciones laborales para resolver trámites personales.

De acuerdo con el IMSS, el 75% de la población trabajadora en México padece de estrés laboral y según datos del Wellness Council México un trabajador falta a sus labores hasta 25 días al año cuando sufre depresión y hasta 20 días por ansiedad.

Por lo tanto, la primera propuesta se basa en mejorar la gestión del absentismo laboral. Primero es importante establecer políticas de asistencia y ausencia para determinar qué casos se considerarán justificados y cuáles no. También proporcionar flexibilidad en cuanto a solicitudes de permisos por trámites personales de acuerdo a la agenda laboral y el nivel de importancia/urgencia del trámite.

Así como también llevar a cabo un proyecto llamado “Un día sin ti”, en el que se involucre a todos los empleados y simulen la ausencia de 1 o varios de sus compañeros durante la jornada laboral con el fin de demostrar cuán valiosa es su presencia dentro de las actividades diarias de la empresa y cómo influye de manera negativa para sus compañeros el faltar injustificadamente al trabajo.

Implementar el horario flexible de trabajo el cual permita que los trabajadores puedan tener un rol más activo en las decisiones que se toman en torno a su jornada laboral. Ofrecer diversas opciones dentro del esquema de horarios de la organización.

Crear un programa de beneficios para los colaboradores, como bonos por desempeño, asistencia, cursos de capacitación, etc. Para fomentar el trabajo en equipo y la motivación.

Y por último crear un programa de bienestar que permita ofrecer acompañamiento psicológico, realizar eventos ya sea 1 vez por quincena para realizar actividades dinámicas combinando el aprendizaje con la diversión, con el fin de fomentar la empatía, trabajo en equipo, escucha activa. Así como también brindar acompañamiento a cada uno de los empleados para conocer su situación personal, cómo se siente, qué desea, si ocurre algo en el trabajo, si tiene algún problema o si tiene alguna propuesta de mejora para alguno de los procesos. Fomentar la confianza entre colaborador - líder que permita el desarrollo personal y profesional de ambas partes. Las empresas con programas de reconocimiento eficaces tienen un 31% menos de rotación voluntaria, según análisis de Bersin por Deloitte.

LS0tDQp0aXRsZTogIkVudHJlZ2FibGVzIg0KYXV0aG9yOiAiRXF1aXBvIDUiDQpkYXRlOiAnMjAyMi0wOS0yMycNCm91dHB1dDoNCiAgaHRtbF9kb2N1bWVudDoNCiAgICB0b2M6IHRydWUNCiAgICB0b2NfZmxvYXQ6IHRydWUNCiAgICBjb2RlX2Rvd25sb2FkOiB0cnVlDQotLS0NCjxjZW50ZXI+DQo8aW1nIHNyYz0iQzovL1VzZXJzLy9qYXZhdy8vT25lRHJpdmUgLSBJbnN0aXR1dG8gVGVjbm9sb2dpY28geSBkZSBFc3R1ZGlvcyBTdXBlcmlvcmVzIGRlIE1vbnRlcnJleS8vTG9nbyBJVEVTTSBzbWFsbC5wbmciPg0KPC9jZW50ZXI+IA0KDQpgYGB7Y3NzLCBlY2hvPUZBTFNFfQ0KaDEsIGg0IHsNCiAgdGV4dC1hbGlnbjogY2VudGVyOw0KfQ0KDQpoMSwgaDIsIGgzIHsNCiAgY29sb3I6ICMwNjFGNkI7DQp9DQpgYGANCg0KIyMgTGlicmVyaWFzICANCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQpsaWJyYXJ5KGRwbHlyKQ0KbGlicmFyeShwbHlyKQ0KbGlicmFyeShnZ3Bsb3QyKQ0KbGlicmFyeShuYW5pYXIpDQpsaWJyYXJ5KEhtaXNjKSAgICAgICAgIA0KbGlicmFyeShwc3ljaCkNCmxpYnJhcnkodGlkeXZlcnNlKQ0KbGlicmFyeShqYW5pdG9yKQ0KbGlicmFyeShrbml0cikNCmxpYnJhcnkocG9sbHN0ZXIpDQpgYGANCg0KIyMgSW1wb3J0YXIgQmFzZXMgZGUgZGF0b3MNCmBgYHtyfQ0Kc2V0d2QoIkM6XFxVc2Vyc1xcamF2YXdcXE9uZURyaXZlIC0gSW5zdGl0dXRvIFRlY25vbG9naWNvIHkgZGUgRXN0dWRpb3MgU3VwZXJpb3JlcyBkZSBNb250ZXJyZXlcXDdtbyBTZW1lc3RyZVxcUmV0byIpDQpkcGVyZjwtcmVhZC5jc3YoIkRlbCBQZXJmLmNzdiIpDQpkcGxhbjwtcmVhZC5jc3YoIkRQXzEuY3N2IikNCnJoPC1yZWFkLmNzdigiUkguY3N2IikNCnJoMjwtcmVhZC5jc3YoIlJIMi5jc3YiKQ0KYGBgDQoNCiMgRW50cmVnYWJsZSAyLjEgDQoNCkFuYWxpemEgbGFzIGJhc2VzIGRlIGRhdG9zIHkgcmVzcG9uZGUgbG8gc2lndWllbnRlOiAgDQoNCiMjIyAxKSDCv0N1w6FudGFzIHZhcmlhYmxlcyB5IGN1YW50b3MgcmVnaXN0cm9zIHRpZW5lIGxhIGJhc2UgZGUgZGF0b3M/DQoNCkxhIGJhc2UgZGUgZGF0b3MgKipEZWxpdmVyeSBQZXJmb3JtYW5jZSoqIHRpZW5lIDcgdmFyaWFibGVzIHkgMjM5MiByZWdpc3Ryb3MuDQoNCmBgYHtyfQ0KZGVzY3JpYmUoZHBlcmYpDQpkaW0oZHBlcmYpDQpgYGANCg0KTGEgYmFzZSBkZSBkYXRvcyAqKlJlY3Vyc29zIEh1bWFub3M6QmFqYXMqKiB0aWVuZSAyNSB2YXJpYWJsZXMgeSAyMzggcmVnaXN0cm9zLg0KYGBge3J9DQpkZXNjcmliZShyaCkNCmRpbShyaCkNCmBgYA0KDQpMYSBiYXNlIGRlIGRhdG9zICoqUmVjdXJzb3MgSHVtYW5vczpDb2xhYm9yYWRvcmVzKiogdGllbmUgMjYgdmFyaWFibGVzIHkgMTIyIHJlZ2lzdHJvcy4gU2kgYmllbiBsYXMgZnVuY2lvbmVzIGRpY2VuIHF1ZSB0aWVuZSAyNywgbGEgw7psdGltYSBlc3TDoSB0b3RhbG1lbnRlIHZhY8OtYSBwb3IgbG8gcXVlIGhheSBxdWUgZWxpbWluYXJsYSBtw6FzIGFkZWxhbnRlLg0KYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCmRlc2NyaWJlKHJoMikNCmRpbShyaDIpDQpgYGANCg0KTGEgYmFzZSBkZSBkYXRvcyAqKkRlbGl2ZXJ5IFBsYW4qKiB0aWVuZSAgdmFyaWFibGVzIHkgIHJlZ2lzdHJvcy4NCmBgYHtyfQ0KI2NvdW50KGRwbGFuLCBDTElFTlRFLlBMQU5UQSwgc29ydCA9IFRSVUUpDQojY291bnQoZHBsYW4sIFBST1lFQ1RPLCBzb3J0ID0gVFJVRSkNCiNjb3VudChkcGxhbiwgSUQuT0RPTywgc29ydCA9IFRSVUUpDQojY291bnQoZHBsYW4sIElURU0sIHNvcnQgPSBUUlVFKQ0KYGBgDQoNCg0KIyMjIDIpIHkgMykgQ2xhc2lmaWNhIGNhZGEgdmFyaWFibGUgZW4gY3VhbGl0YXRpdmEsIGN1YW50aXRhdGl2YSBkaXNjcmV0YSBvIGN1YW50aXRhdGl2YSBjb250aW51YSAgeSBlc2NhbGENCg0KKipEZWxpdmVyeSBQZXJmb3JtYW5jZSoqICANCmBgYHtyfQ0Kc3RyKGRwZXJmKQ0KYGBgDQoNCg0KYGBge3J9DQpWYXJpYWJsZTwtYygiYENsaWVudGVgIiwiYFZ1ZWx0YXNgIiwiYEZlY2hhYCIsImBQbGFuIEFycml2YWxgIiwgImBSZWFsIEFycml2YWxgIiwgImBSZWFsIERlcGFydHVyZWAiLCJgRGlmZmVyZW5jZSBgIikNCg0KVHlwZTwtYygicXVhbGl0YXRpdmUgKG5vbWluYWwpIiwgInF1YW50aWF0aXZlIChkaXNjcmV0ZSkiLCAicXVhbnRpdGF0aXZlIChjb250aW5vdXMpIiwgInF1YW50aXRhdGl2ZSAoZGlzY3JldGUpIiwicXVhbnRpdGF0aXZlIChjb250aW51b3MpIiwicXVhbnRpdGF0aXZlIChjb250aW51b3MpIiwicXVhbnRpdGF0aXZlIChjb250aW51b3MpIikNCg0KdGFibGU8LWRhdGEuZnJhbWUoVmFyaWFibGUsVHlwZSkNCmtuaXRyOjprYWJsZSh0YWJsZSkNCmBgYA0KDQoqKlJlY3Vyc29zIEh1bWFub3M6QmFqYXMqKg0KYGBge3IscmVzdWx0cz0naGlkZSd9DQpjbGVhbl9uYW1lcyhyaCkNCmBgYA0KYGBge3J9DQpzdW1tYXJ5KHJoKQ0KYGBgDQoNCkFsIG9ic2VydmFyIGxhIGJhc2UgZGUgZGF0b3MsIHBvZGVtb3Mgbm90YXIgcXVlIHZhcmlhcyB2YXJpYWJsZXMgbm8gcG9zZWVuIHN1IGNsYXNlIGNvcnJlY3RhLCBzaW4gZW1iYXJnbywgbm8gdG9kYXMgc2Vyw6FuIGNvbnNpZGVyYWRhcyBwYXJhIHJlYWxpemFyIGFuw6FsaXNpcyBwb3IgbG8gcXVlIGRlamFyZW1vcyBzdSBjb3JyZWNjacOzbiBwYXJhIGVsIGZ1dHVyby4NCg0KYGBge3J9DQpWYXJpYWJsZXJoPC1jKCJgw68uLkFQRUxMSURPU2AiLCJgTk9NQlJFYCIsImBGRUNIQS5ERS5OQUNJTUlFTlRPYCIsImBHRU5FUk9gIiwgImBSRkNgIiwgImBGRUNIQS5ERS5BTFRBYCIsImBNT1RJVk8uREUuQkFKQWAiLCJgWGAiLCJgQkFKQWAiLCJgUFVFU1RPYCIsImBERVBBUlRBTUVOVE9gIiwiYE5PLlNFR1VSTy5TT0NJQUxgIiwiYFNBTEFSSU8uRElBUklPLklNU1NgIiwiYEZBQ1RPUi5DUkVELklORk9OQVZJVGAiLCJgTsOCLi5DUkVESVRPLklORk9OQVZJVGAiLCJgTFVHQVIuREUuTkFDSU1JRU5UT2AiLCJgQ1VSUGAiLCJgQ0FMTEVgIikNCg0KVHlwZXJoPC1jKCJxdWFsaXRhdGl2ZSAobm9taW5hbCkiLCAicXVhbGl0YXRpdmUgKG5vbWluYWwpIiwgInF1YW50aXRhdGl2ZSAoY29udGlub3VzKSIsICJxdWFsaXRhdGl2ZSAobm9taW5hbCkiLCJxdWFsaXRhdGl2ZSAobm9taW5hbCkiLCJxdWFudGl0YXRpdmUgKGNvbnRpbm91cykiLCAicXVhbGl0YXRpdmUgKG5vbWluYWwpIiwgInF1YW50aXRhdGl2ZSAoZGlzY3JldGUpIiwicXVhbGl0YXRpdmUgKG5vbWluYWwpIiwicXVhbGl0YXRpdmUgKG5vbWluYWwpIiwicXVhbGl0YXRpdmUgKG5vbWluYWwpIiwicXVhbnRpdGF0aXZlIChkaXNjcmV0ZSkiLCJxdWFudGl0YXRpdmUgKGNvbnRpbnVvcykiLCJxdWFudGl0YXRpdmUgKGNvbnRpbnVvcykiLCJxdWFudGl0YXRpdmUgKGRpc2NyZXRlKSIsICJxdWFsaXRhdGl2ZSAobm9taW5hbCkiLCAicXVhbGl0YXRpdmUgKG5vbWluYWwpIiwgInF1YWxpdGF0aXZlIChub21pbmFsKSIpDQoNCnRhYmxlcmg8LWRhdGEuZnJhbWUoVmFyaWFibGVyaCxUeXBlcmgpDQprbml0cjo6a2FibGUodGFibGVyaCkNCmBgYA0KDQoqKlJlY3Vyc29zIEh1bWFub3M6IENvbGFib3JhZG9yZXMqKg0KYGBge3IsIHJlc3VsdHM9J2hpZGUnfQ0KY2xlYW5fbmFtZXMocmgyKQ0KYGBgDQpgYGB7cn0NCnN1bW1hcnkocmgyKQ0KYGBgDQoNCg0KDQpgYGB7cn0NClZhcmlhYmxlcmhjPC1jKCJgw68uLk5vLi5EZS5FbXBsZWFkb2AiLCJgQVBFTExJRE9TYCIsImBOT01CUkVgIiwiYEZFQ0hBLkRFLk5BQ0lNSUVOVE9gIiwgImBHRU5FUk9gIiwiYFJGQ2AiLCJgRkVDSEEuREUuQUxUQWAiLCJgUHJpbWVyLm1lc2AiLCJgWDR0by5tZXNgIiwiYEJBSkFgIiwiYFBVRVNUT2AiLCJgREVQQVJUQU1FTlRPYCIsImBOTy5TRUdVUk8uU09DSUFMYCIsImBTQUxBUklPLkRJQVJJTy5JTVNTYCIsImBGQUNUT1IuQ1JFRC5JTkZPTkFWSVRgIiwiYE7Dgi4uQ1JFRElUTy5JTkZPTkFWSVRgIiwiYExVR0FSLkRFLk5BQ0lNSUVOVE9gIiwiYENVUlBgIiwiYENBTExFYCIpDQoNClR5cGVyaGM8LWMoInF1YWxpdGF0aXZlIChub21pbmFsKSIsICJxdWFsaXRhdGl2ZSAobm9taW5hbCkiLCJxdWFsaXRhdGl2ZSAobm9taW5hbCkiLCAicXVhbnRpdGF0aXZlIChjb250aW5vdXMpIiwicXVhbGl0YXRpdmUgKG5vbWluYWwpIiwicXVhbGl0YXRpdmUgKG5vbWluYWwpIiwicXVhbnRpdGF0aXZlIChjb250aW5vdXMpIiwicXVhbnRpdGF0aXZlIChjb250aW5vdXMpIiwicXVhbnRpdGF0aXZlIChjb250aW5vdXMpIiwicXVhbnRpYXRpdmUgKGRpc2NyZXRlKSIsInF1YWxpdGF0aXZlIChub21pbmFsKSIsInF1YWxpdGF0aXZlIChub21pbmFsKSIsInF1YW50aXRhdGl2ZSAoZGlzY3JldGUpIiwicXVhbnRpdGF0aXZlIChjb250aW51b3MpIiwicXVhbnRpdGF0aXZlIChjb250aW51b3MpIiwicXVhbnRpdGF0aXZlIChkaXNjcmV0ZSkiLCAicXVhbGl0YXRpdmUgKG5vbWluYWwpIiwgInF1YWxpdGF0aXZlIChub21pbmFsKSIsICJxdWFsaXRhdGl2ZSAobm9taW5hbCkiKQ0KDQp0YWJsZXJoYzwtZGF0YS5mcmFtZShWYXJpYWJsZXJoYyxUeXBlcmhjKQ0Ka25pdHI6OmthYmxlKHRhYmxlcmhjKQ0KYGBgDQoNCg0KKipEZWxpdmVyeSBQbGFuKiogDQpgYGB7cn0NCnN1bW1hcnkoZHBsYW4pDQpgYGANCg0KDQpgYGB7cn0NClZhcmlhYmxlPC1jKCJQUk9ZRUNUTyIsIklELk9ET08iLCAiSVRFTSIsICJDTElFTlRFLlBMQU5UQSIsIkVORVJPLjIyIiwgIkZFQlJFUk8uMjIiLCJNQVJaTy4yMiIsIkFCUklMLjIyIiwiTUFZTy4yMiIsIkpVTklPLjIyIiwiSlVMSU8uMjIiLCJBR09TVE8uMjIiLCJTRVBUSUVNQlJFLjIyIiwiT0NUVUJSRS4yMiIsIk5PVklFTUJSRS4yMiIsIkRJQ0lFTUJSRS4yMiIsICJFTkVSTy4yMyIsICJGRUJSRVJPLjIzIiwgIk1BUlpPLjIzIikNCg0KVGlwbzwtYygiQ3VhbGl0YXRpdmUiLCAiQ3VhbGl0YXRpdmUiLCAiQ3VhbGl0YXRpdmUiLCAiQ3VhbGl0YXRpdmUiLCAicXVhbnRpYXRpdmUgKGRpc2NyZXRlKSIsICJxdWFudGlhdGl2ZSAoZGlzY3JldGUpIiwgInF1YW50aXRhdGl2ZSAoZGlzY3JldGUpIiwgInF1YW50aXRhdGl2ZSAoZGlzY3JldGUpIiwgInF1YW50aXRhdGl2ZSAoZGlzY3JldGUpIiwgInF1YW50aXRhdGl2ZSAoZGlzY3JldGUpIiwgInF1YW50aXRhdGl2ZSAoZGlzY3JldGUpIiwgInF1YW50aXRhdGl2ZSAoZGlzY3JldGUpIiwicXVhbnRpdGF0aXZlIChkaXNjcmV0ZSkiLCJxdWFudGl0YXRpdmUgKGRpc2NyZXRlKSIsInF1YW50aXRhdGl2ZSAoZGlzY3JldGUpIiwicXVhbnRpdGF0aXZlIChkaXNjcmV0ZSkiLCJxdWFudGl0YXRpdmUgKGRpc2NyZXRlKSIsInF1YW50aXRhdGl2ZSAoZGlzY3JldGUpIiwicXVhbnRpdGF0aXZlIChkaXNjcmV0ZSkiKQ0KDQp0YWJsZTwtZGF0YS5mcmFtZShWYXJpYWJsZSxUaXBvKQ0Ka25pdHI6OmthYmxlKHRhYmxlKQ0KYGBgDQoNCmBgYHtyfQ0KVmFyaWFibGU8LWMoIlBST1lFQ1RPIiwiSUQuT0RPTyIsICJJVEVNIiwgIkNMSUVOVEUuUExBTlRBIiwiRU5FUk8uMjIiLCAiRkVCUkVSTy4yMiIsIk1BUlpPLjIyIiwiQUJSSUwuMjIiLCJNQVlPLjIyIiwiSlVOSU8uMjIiLCJKVUxJTy4yMiIsIkFHT1NUTy4yMiIsIlNFUFRJRU1CUkUuMjIiLCJPQ1RVQlJFLjIyIiwiTk9WSUVNQlJFLjIyIiwiRElDSUVNQlJFLjIyIiwgIkVORVJPLjIzIiwgIkZFQlJFUk8uMjMiLCAiTUFSWk8uMjMiKQ0KDQpFc2NhbGE8LWMoIm5vbWluYWwiLCAibm9taW5hbCIsICJub21pbmFsIiwgIm5vbWluYWwiLCAicmF6b24iLCAicmF6b24iLCAicmF6b24iLCAicmF6b24iLCAicmF6b24iLCAicmF6b24iLCAicmF6b24iLCAicmF6b24iLCJyYXpvbiIsInJhem9uIiwicmF6b24iLCJyYXpvbiIsInJhem9uIiwicmF6b24iLCJyYXpvbiIpDQoNCnRhYmxlPC1kYXRhLmZyYW1lKFZhcmlhYmxlLEVzY2FsYSkNCmtuaXRyOjprYWJsZSh0YWJsZSkNCmBgYA0KDQoNCiMjIyA0KSBBcGxpY2EgYWwgbWVub3MgMiB0w6ljbmljYXMgZGUgbGltcGllemEgZGUgYmFzZXMgZGUgZGF0b3MgeSBleHBsw61jYWxhcyBicmV2ZW1lbnRlLCDCv3BvciBxdcOpIHJlYWxpemFzdGUgZXNhcyB0w6ljbmljYXM/DQoNCiMjIyMjIFNhbGFyaW9zIGVxdWl2b2NhZG9zDQpFbiBsYSBiYXNlIGRlIGRhdG9zICoqUmVjdXJzb3MgSHVtYW5vczogQ29sYWJvcmFkb3JlcyoqIGVuY29udHJhbW9zIHVuIHNhbGFyaW8gZGlhcmlvIGV4aG9yYml0YW50ZS4gUG9yIGxvIHF1ZSBoYXkgcXVlIGxpbXBpYXIgZXN0ZSBlcnJvci4gQWRlbcOhcyBkZSBjb252ZXJ0aXIgbGEgdmFyaWFibGUgZGUgY2hhcmFjdGVyIGEgbnVtZXJpYy4NCg0KYGBge3J9DQpyaDIkU0FMQVJJTy5ESUFSSU8uSU1TUzwtZm9ybWF0KHJoMiRTQUxBUklPLkRJQVJJTy5JTVNTLCBzY2llbnRpZmljID0gRkFMU0UpDQpyaDIkU0FMQVJJTy5ESUFSSU8uSU1TUzwtYXMubnVtZXJpYyhyaDIkU0FMQVJJTy5ESUFSSU8uSU1TUykNCnVuaXF1ZShyaDIkU0FMQVJJTy5ESUFSSU8uSU1TUykgJT4lIGZvcm1hdChyaDIkU0FMQVJJTy5ESUFSSU8uSU1TUywgc2NpZW50aWZpYyA9IEZBTFNFKQ0KYGBgDQoNClBhcmEgbGltcGlhcmxvLCBwcmltZXJvIGlkZW50aWZpY2Ftb3MgZWwgcmVnaXN0cm8gY29uIGVzdGUgZXJyb3IuIA0KYGBge3J9DQpyaDJbcmgyJFNBTEFSSU8uRElBUklPLklNU1MgPT0gMTUxNjcyODU3MS4wMCwgXQ0KYGBgDQoNClBvZGVtb3Mgb2JzZXJ2YXIgcXVlIHN1IHB1ZXN0byBlcyAqKkF5dWRhbnRlIGdlbmVyYWwqKiB5IHF1ZSBlc3TDoSBlbiBlbCBkZXBhcnRhbWVudG8gZGUgKipQcm9kdWNjacOzbiBSZXRvcm5vKiouIEFsIG9ic2VydmFyIHJlZ2lzdHJvcyBjb24gZWwgbWlzbW8gcHVlc3RvIHkgZGVwYXJ0YW1lbnRvLCBwb2RlbW9zIG9ic2VydmFyIHF1ZSB0cmVzIGNvbGFib3JhZG9yZXMgdGllbmVuIHVuIHNhbGFyaW8gZGUgKioxNTEuNjEqKiwgeSBlbCBzYWxhcmlvIGVxdWl2b2NhZG8gZXMgZGUgKioxNTE2NzI4NTcxLjAwKiosIHBvciBsbyBxdWUgcG9kcsOtYW1vcyBhc3VtaXIgaGEgc2lkbyB1biBlcnJvciBkZSBkZWRvIHkgZWwgc2FsYXJpbyBjb3JyZWN0byBlcyAqKjE1MS42MSoqLCBwb3IgbG8gcXVlIG9wdGFtb3MgcG9yIHJlbXBsYXphcmxvIHBvciBlc3RlIHZhbG9yLg0KDQpgYGB7cn0NCmZpbHRlcihyaDIsIERFUEFSVEFNRU5UTyA9PSAiUHJvZHVjY2nDg8KzbiBSZXRvcm4iKQ0KYGBgDQpgYGB7cn0NCnJoMiRTQUxBUklPLkRJQVJJTy5JTVNTW3JoMiROT01CUkUgPT0gIkpBSU1FIEVSTkVTVE8iXSA8LSAxNTEuNjENCnVuaXF1ZShyaDIkU0FMQVJJTy5ESUFSSU8uSU1TUykNCmBgYA0KDQpFbCBzZWd1bmRvIHNhbGFyaW8gZXF1aXZvY2FkbyBlcyBkZSAqKjQ0MTM3NTcuMDAqKi4gUmVwZXRpbW9zIGVsIG1pc21vIHByb2NlZGltaWVudG8uIFByaW1lcm8gaWRlbnRpZmljYW1vcyBlbCByZWdpc3Ryby4NCmBgYHtyfQ0KcmgyW3JoMiRTQUxBUklPLkRJQVJJTy5JTVNTID09IDQ0MTM3NTcuMDAsIF0NCmBgYA0KDQpBaG9yYSBoYXkgcXVlIGlkZW50aWZpY2FyIHB1ZXN0b3Mgc2ltaWxhcmVzIGVuIGVsIG1pc21vIGRlcGFydGFtZW50by4NCmBgYHtyfQ0KZmlsdGVyKHJoMiwgREVQQVJUQU1FTlRPID09ICJDb3N0dXJhIikNCmBgYA0KDQpFbiBlc3RlIGNhc28sIGVzIGVsIMO6bmljbyByZWdpc3RybyBjb24gZXNlIHB1ZXN0byBlbiBlbCBkZXBhcnRhbWVudG8sIHBvciBsbyB0YW50byBpZGVudGlmaWNhcmVtb3MgcHVlc3RvcyBzaW1pbGFyZXMgcGVybyBlbiBkaXZlcnNvcyBkZXBhcnRhbWVudG9zLg0KYGBge3J9DQpmaWx0ZXIocmgyLCBQVUVTVE8gPT0gIlNVUEVSVklTT1JBIikNCmBgYA0KDQpIZW1vcyBpZGVudGlmaWNhZG8gc29sbyB1biByZWdpc3RybyBtw6FzIGNvbiBlbCBtaXNtbyBwdWVzdG8sIHBvciBsbyBxdWUgb3B0YXJlbW9zIHBvciBhc2lnbmFyIGVsIG1pc21vIHNhbGFyaW8gYWwgcmVnaXN0cm8gY29uIGVsIHNhbGFyaW8gZWxldmFkby4NCmBgYHtyfQ0KcmgyJFNBTEFSSU8uRElBUklPLklNU1NbcmgyJE5PTUJSRSA9PSAiWU9MQU5EQSJdIDwtIDMzNy4wNQkNCnVuaXF1ZShyaDIkU0FMQVJJTy5ESUFSSU8uSU1TUykNCmBgYA0KDQojIyMjIyBUaXBvcyBkZSB2YXJpYWJsZXMgZXF1aXZvY2Fkb3MgIA0KDQpBbCBvYnNlcnZhciBsb3MgdGlwb3MgZGUgdmFyaWFibGVzIGRlICoqRGVsaXZlcnkgUGVyZm9ybWFuY2UqKiBwb2RlbW9zIG5vdGFyIHF1ZSBsYSBmZWNoYSBlc3TDoSBjb21vIGNoYXJhY3RlciB5IGRlYmVyw61hIGVzdGFyIGNvbW8gZmVjaGEuIFBvciBsbyB0YW50bywgaGF5IHF1ZSBtb2RpZmljYXJsYS4NCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQpkcGVyZjI8LWRwZXJmDQpkcGVyZjIkRkVDSEE8LWFzLkRhdGUoZHBlcmYyJEZFQ0hBLCBmb3JtYXQgPSIlZC8lbS8lWSIpDQpzdHIoZHBlcmYyKQ0KYGBgDQoNCkFzw60gbWlzbW8sIGVuIGFtYmFzIGJhc2VzIGRlIGRhdG9zIGRlICoqUmVjdXJzb3MgSHVtYW5vcyoqIGhlbW9zIGlkZW50aWZpY2FkbyBlbCBtaXNtbyBlcnJvci4NCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQpyaDJfMjwtcmgyDQpyaDJfMiRGRUNIQS5ERS5BTFRBPC1hcy5EYXRlKHJoMl8yJEZFQ0hBLkRFLkFMVEEsIGZvcm1hdCA9IiVkLyVtLyVZIikNCnJoMl8yJEZFQ0hBLkRFLk5BQ0lNSUVOVE88LWFzLkRhdGUocmgyXzIkRkVDSEEuREUuTkFDSU1JRU5UTywgZm9ybWF0ID0iJWQvJW0vJVkiKQ0KcmgyXzIkUHJpbWVyLm1lczwtYXMuRGF0ZShyaDJfMiRQcmltZXIubWVzLCBmb3JtYXQgPSIlZC8lbS8lWSIpDQpyaDJfMiRYNHRvLm1lczwtYXMuRGF0ZShyaDJfMiRYNHRvLm1lcywgZm9ybWF0ID0iJWQvJW0vJVkiKQ0Kc3RyKHJoMl8yJEZFQ0hBLkRFLkFMVEEpDQpzdHIocmgyXzIkRkVDSEEuREUuTkFDSU1JRU5UTykNCnN0cihyaDJfMiRQcmltZXIubWVzKQ0Kc3RyKHJoMl8yJFg0dG8ubWVzKQ0KYGBgDQoNCmBgYHtyfQ0KcmhfYmFqYTwtcmgNCnJoX2JhamEkRkVDSEEuREUuQUxUQTwtYXMuRGF0ZShyaF9iYWphJEZFQ0hBLkRFLkFMVEEsIGZvcm1hdCA9IiVkLyVtLyVZIikNCnJoX2JhamEkRkVDSEEuREUuTkFDSU1JRU5UTzwtYXMuRGF0ZShyaF9iYWphJEZFQ0hBLkRFLk5BQ0lNSUVOVE8sIGZvcm1hdCA9IiVkLyVtLyVZIikNCnJoX2JhamEkQkFKQTwtYXMuRGF0ZShyaF9iYWphJEJBSkEsIGZvcm1hdCA9IiVkLyVtLyVZIikNCnN0cihyaF9iYWphJEZFQ0hBLkRFLkFMVEEpDQpzdHIocmhfYmFqYSRGRUNIQS5ERS5OQUNJTUlFTlRPKQ0Kc3RyKHJoX2JhamEkQkFKQSkNCg0KYGBgDQoNCiMjIyMjIEVsaW1pbmFyIGNvbHVtbmFzDQpRdWUgbm8gdmF5YW1vcyBhIHV0aWxpemFyIHRvZGFzIGxhcyB2YXJpYWJsZXMgcGFyYSBudWVzdHJhIGV4cGxvcmFjacOzbiBkZSBkYXRvcyBubyBzaWduaWZpY2EgcXVlIGVsaW1pbmVtb3MgbGFzIGNvbHVtbmFzIHF1ZSBubyBub3Mgc2lydmVuLiBTaW4gZW1iYXJnbywgZW4gbGEgYmFzZSBkZSBkYXRvcyBkZSAqKlJlY3Vyc29zIEh1bWFub3M6IENvbGFib3JhZG9yZXMqKiBoYXkgdW5hIGNvbHVtbmEgZXh0cmEgYWwgZmluYWwgY29uIHZhbG9yZXMgdmFjw61vcyB5IHF1ZSBkZWJlIHNlciBlbGltaW5hZGEuDQoNCmBgYHtyfQ0KcmgyXzI8LXNlbGVjdChyaDJfMiwgw68uLk5vLi5EZS5FbXBsZWFkbzpUQVJKRVRBLi4uLkNVRU5UQSkNCmNvbG5hbWVzKHJoMl8yKQ0KYGBgDQoNCkVsaW1pbmFtb3MgbGEgY29sdW1uYSBkZSBJRC5PRE9PIGVuICoqRGVsaXZlcnkgUGxhbioqIGRlYmlkbyBhIHF1ZSBwYXJhIG51ZXN0cm8gYW7DoWxpc2lzIG5vIHJlcHJlc2VudGEgYWxnbyBpbXBvcnRhbnRlIGEgYW5hbGl6YXIuIERlbnRybyBkZSBsYSBtaXNtYSBiYXNlIGRlIGRhdG9zIHRlbmVtb3MgbGEgY29sdW1hbiBkZSBJVEVNIGxhIGN1w6FsIHJlcHJlc2VudGEgbG8gbWlzbW8sIHByZXNlbnRhZG8gZGUgdW5hIGZvcm1hIG3DoXMgY2xhcmEgeSBlbnRlbmRpYmxlLiBFeHBsb3JhbmRvIG3DoXMgbGEgYmFzZSBkZSBkYXRvcyBub3MgZGltb3MgY3VlbnRhIHF1ZSB0ZW5pYW1vcyBkb3MgY29sdW1uYXMgY29uIGluZm9ybWFjacOzbiB2YWNpYSBhbCBmaW5hbCBkZSBsYSB0YWJsYSwgZGUgaWd1YWwgbWFuZXJhIGxhcyBlbGltaW5hbW9zLg0KDQpgYGB7cn0NCmRwXzE8LWRwbGFuDQpkcF8xJElELk9ET08gPC0gTlVMTA0KZHBfMSRYIDwtIE5VTEwNCmRwXzEkWC4xIDwtIE5VTEwNCmhlYWQoZHBfMSkNCmBgYA0KDQoNCiMjIyMjIFJlZ2lzdHJvcyBlcnJvbmVvcw0KRW4gKipSZWN1cnNvcyBIdW1hbm9zOkJhamFzKiogZW4gbGEgdmFyaWFibGUgZGUgZ8OpbmVybyBub3MgZW5jb250cmFtb3MgY29uIHVuIHZhbG9yIHF1ZSBubyBjb3JyZXNwb25kZSBhbCBnw6luZXJvIHkgaGF5IHF1ZSBhc2lnbmFyIGVsIGfDqW5lcm8gY29ycmVjdG8uDQpgYGB7cn0NCnVuaXF1ZShyaF9iYWphJEdFTkVSTykNCmZpbHRlcihyaF9iYWphLCBHRU5FUk8gPT0gIkNBUEowMDA5MjY1OTciKQ0KYGBgDQoNCmBgYHtyfQ0KcmhfYmFqYSRHRU5FUk9bcmhfYmFqYSROT01CUkUgPT0gIkpBTkVUSCJdIDwtICJGRU1FTklOTyINCnVuaXF1ZShyaF9iYWphJEdFTkVSTykNCmBgYA0KDQoNCiMjIyA1KSBJbmNsdXllIHVuYSBicmV2ZSByZWZsZXhpw7NuIGRlIGxhIGFjdGl2aWRhZC4NCkVzdGEgYWN0aXZpZGFkIGVzIHVuIGVqZW1wbG8gcGVyZmVjdG8gZGUgY8OzbW8gc29uIGxhcyBiYXNlcyBkZSBkYXRvcyBkZSBsYXMgZW1ycGVzYXMgZW4gcmVhbGlkYWQuIEhheSBxdWUgY29tcHJlbmRlciBxdWUgbGEgZ3JhbiBtYXlvcsOtYSBkZSBsYXMgZW1wcmVzYXMgbm8gc29uIGV4cGVydG9zIGVuIGJhc2VzIGRlIGRhdG9zIG5pIGVuIHJlY29waWxhY2nDs24gZGUgaW5mb3JtYWNpw7NuLCBwb3IgbG8gcXVlIHN1cyBkYXRvcyBzdWVsZW4gY2FyZWNlciBkZSBlc3RydWN0dXJhIGNvcnJlY3RhIHUgb3JkZW4gYXByb3BpYWRvIHBhcmEgc3UgYW7DoWxpc2lzIGVuIGhlcnJhbWllbnRhcyBjb21vICoqUioqLiBFc3RlIGVqZXJjaWNpbyBub3MgaGEgc2lkbyBkZSBncmFuIHV0aWxpZGFkIHBhcmEgYXByZW5kZXIgYSB0cmFuc2Zvcm1hciBsYXMgYmFzZXMgZGUgZGF0b3MsIHkgbGltcGlhcmxhcyBwYXJhIHN1IGZ1dHVybyBhbsOhbGlzaXMuDQoNCg0KIyBFbnRyZWdhYmxlIDIuMiAgDQoNClJlYWxpemFyIHVuIGFuw6FsaXNpcyBlc3RhZMOtc3RpY28gZGVzY3JpcHRpdm8gZW4gZWwgcXVlIGxvZ3JlcyBkZXN0YWNhciBlbCBjb25qdW50byBkZSBkYXRvcywgcXVlIGFwb3lhbiBhIGxhIGVtcHJlc2EgYSBtZWpvcmFyIHN1IG9wZXJhY2nDs24uIEluY29ycG9yYSBhbCBtZW5vcyBkb3MgcHJvcHVlc3RhcyBjb25jcmV0YXMsIGFwb3lhZGFzIGRlIHR1IGFuw6FsaXNpcyBlbiBkb25kZSBzZSBpbmNsdXllIGFsIG1lbm9zOiAoMSkgVGFibGEgZGUgZnJlY3VlbmNpYSwgKG9wY2lvbmFsKSBUYWJsYXMgY3J1emFkYXMsICgyLTMpIEdyw6FmaWNvcyBkZSBkYXRvcyBjdWFsaXRhdGl2b3MgeSBjdWFudGl0YXRpdm9zLCBhc8OtIGNvbW8gKDItMykgR3LDoWZpY29zIGRlIGRpc3BlcnNpw7NuLg0KDQojIyBJbXBvcnRhciBsYSBiYXNlIGRlIGRhdG9zDQpgYGB7cn0NCg0KYmRfZXh0IDwtIHJlYWQuY3N2KCJDb25zdW1lciBFeHBlbmRpdHVyZSBvbiBQaGFybWFjZXV0aWNhbCBQcm9kdWN0cywgTWVkaWNhbCBBcHBsaWFuY2VzIGFuZCBFcXVpcG1lbnQuY3N2IikNCmBgYA0KDQojIyBJZGVudGlmaWNhciBsYSBFc3RydWN0dXJhIGRlIERhdG9zIChDdWFsaXRhdGl2YXMgbyBDdWFudGl0YXRpdmFzKQ0KIFV0aWxpemFyZW1vcyBsYSBmdW5jacOzbiBzdHIoKSBwYXJhIG1vc3RyYXIgbGEgZXN0cnVjdHVyYSBpbnRlcm5hIGRlIHVuIG9iamV0by4NCmBgYHtyfQ0Kc3RyKGJkX2V4dCkNCmBgYA0KDQojIyBFbnRlbmRlciBiYXNlIGRlIGRhdG9zDQpgYGB7cn0NCnN1bW1hcnkoYmRfZXh0KQ0KDQpgYGANCg0KDQojIyBUaXBvcyBkZSBWYXJpYWJsZQ0KYGBge3IgZWNobyA9IEZBTFNFLCByZXN1bHRzID0gVFJVRX0NClZhcmlhYmxlPC1jKCJgR2VvZ3JhcGh5YCIsIlJlZ2lvbiIsICJgWDIwMTZgIiwiYFgyMDE3YCIsImBYMjAxOGAiLCJgWDIwMTlgIiwiYFgyMDIwYCIsImBYMjAyMWAiKQ0KVHlwZTwtYygiUXVhbGl0YXRpdmUiLCAiUXVhbGl0YXRpdmUiLCAiUXVhbnRpdGF0aXZlIChkaXNjcmV0ZSkiLCAiUXVhbnRpdGF0aXZlIChkaXNjcmV0ZSkiLCAiUXVhbnRpdGF0aXZlIChkaXNjcmV0ZSkiLCAiUXVhbnRpdGF0aXZlIChkaXNjcmV0ZSkiLCAiUXVhbnRpdGF0aXZlIChkaXNjcmV0ZSkiLCAiUXVhbnRpdGF0aXZlIChkaXNjcmV0ZSkiKQ0KdGFibGU8LWRhdGEuZnJhbWUoVmFyaWFibGUsVHlwZSkNCmtuaXRyOjprYWJsZSh0YWJsZSkNCmBgYA0KDQojIyBBY29tb2RvIGRlIERhdG9zDQpgYGB7cn0NCmJkX2V4dDEgPC0gZ2F0aGVyKGJkX2V4dCwga2V5PSJZZWFyIiwgdmFsdWU9InBvaW50cyIsIDM6OCkNCmBgYA0KDQojIyBUYWJsYSBkZSBGcmVjdWVuY2lhIChQYcOtc2VzIHggUmVnacOzbikNCmBgYHtyfQ0KcmVnaW9uIDwtIHRhYmxlKGJkX2V4dCRSZWdpb24pDQpyZWdpb24NCmtuaXRyOjprYWJsZShyZWdpb24pDQpgYGANCg0KIyMgUHJvbWVkaW8gZGVsIGdhc3RvIGRlbCBDb25zdW1pZG9yIHBvciByZWdpw7NuIHkgcG9yIGHDsW8NCmBgYHtyfQ0Kc3RyKGJkX2V4dCkNCg0KZnJlY19yZWc8LWJkX2V4dCU+JWdyb3VwX2J5KFJlZ2lvbiklPiV0YWxseSgpDQpYXzIwMTY8LWFnZ3JlZ2F0ZShYMjAxNiB+IFJlZ2lvbiAsIGRhdGEgPSBiZF9leHQsIG1lYW4pDQpYXzIwMTc8LWFnZ3JlZ2F0ZShYMjAxNyB+IFJlZ2lvbiAsIGRhdGEgPSBiZF9leHQsIG1lYW4pDQpYXzIwMTg8LWFnZ3JlZ2F0ZShYMjAxOCB+IFJlZ2lvbiAsIGRhdGEgPSBiZF9leHQsIG1lYW4pDQpYXzIwMTk8LWFnZ3JlZ2F0ZShYMjAxOSB+IFJlZ2lvbiAsIGRhdGEgPSBiZF9leHQsIG1lYW4pDQpYXzIwMjA8LWFnZ3JlZ2F0ZShYMjAyMCB+IFJlZ2lvbiAsIGRhdGEgPSBiZF9leHQsIG1lYW4pDQpYXzIwMjE8LWFnZ3JlZ2F0ZShYMjAyMSB+IFJlZ2lvbiAsIGRhdGEgPSBiZF9leHQsIG1lYW4pDQoNCg0KYGBgDQoNCiMjIEdhc3RvIGRlbCBjb25zdW1pZG9yIGVuIGFwYXJhdG9zIG3DqWRpY29zIHkgZmFybWFjw6l1dGljb3MgeCBhw7FvDQpgYGB7cn0NCmdncGxvdChYXzIwMTYsIGFlcyh4PVJlZ2lvbiwgeT1YMjAxNikpICsNCiAgZ2VvbV9iYXIoc3RhdD0iaWRlbnRpdHkiLCBmaWxsPSJwdXJwbGUiKSArIHNjYWxlX2ZpbGxfZ3JleSgpICsgIyBBZGQgYmFycyB0byB0aGUgcGxvdA0KICBsYWJzKHRpdGxlID0gIkF2ZXJhZ2UgRXhwZW5kaXR1cmUgYnkgUmVnaW9uIGluIDIwMTYiLCAjIEFkZCBhIHRpdGxlDQogICAgICAgeCA9ICJSZWdpb24iLCB5ID0gIiQgTWlsbGlvbiIpDQpgYGANCg0KYGBge3J9DQpnZ3Bsb3QoWF8yMDE3LCBhZXMoeD1SZWdpb24sIHk9WDIwMTcpKSArDQogIGdlb21fYmFyKHN0YXQ9ImlkZW50aXR5IiwgZmlsbD0icHVycGxlIikrIHNjYWxlX2ZpbGxfZ3JleSgpICsNCiAgbGFicyh0aXRsZSA9ICJBdmVyYWdlIEV4cGVuZGl0dXJlIGJ5IFJlZ2lvbiBpbiAyMDE3IiwgDQogICAgICAgeCA9ICJSZWdpb24iLCB5ID0gIiQgTWlsbGlvbiIpDQpgYGANCg0KYGBge3J9DQpnZ3Bsb3QoWF8yMDE4LCBhZXMoeD1SZWdpb24sIHk9WDIwMTgpKSArDQogIGdlb21fYmFyKHN0YXQ9ImlkZW50aXR5IiwgZmlsbD0icHVycGxlIikgKyBzY2FsZV9maWxsX2dyZXkoKSArICMgQWRkIGJhcnMgdG8gdGhlIHBsb3QNCiAgbGFicyh0aXRsZSA9ICJBdmVyYWdlIEV4cGVuZGl0dXJlIGJ5IFJlZ2lvbiBpbiAyMDE4IiwgIyBBZGQgYSB0aXRsZQ0KICAgICAgIHggPSAiUmVnaW9uIiwgeSA9ICIkIE1pbGxpb24iKQ0KYGBgDQoNCmBgYHtyfQ0KZ2dwbG90KFhfMjAxOSwgYWVzKHg9UmVnaW9uLCB5PVgyMDE5KSkgKw0KICBnZW9tX2JhcihzdGF0PSJpZGVudGl0eSIsIGZpbGw9InB1cnBsZSIpICsgc2NhbGVfZmlsbF9ncmV5KCkgKyAjIEFkZCBiYXJzIHRvIHRoZSBwbG90DQogIGxhYnModGl0bGUgPSAiQXZlcmFnZSBFeHBlbmRpdHVyZSBieSBSZWdpb24gaW4gMjAxOSIsICMgQWRkIGEgdGl0bGUNCiAgICAgICB4ID0gIlJlZ2lvbiIsIHkgPSAiJCBNaWxsaW9uIikNCmBgYA0KDQpgYGB7cn0NCmdncGxvdChYXzIwMjAsIGFlcyh4PVJlZ2lvbiwgeT1YMjAyMCkpICsNCiAgZ2VvbV9iYXIoc3RhdD0iaWRlbnRpdHkiLCBmaWxsPSJwdXJwbGUiKSArIHNjYWxlX2ZpbGxfZ3JleSgpICsgIyBBZGQgYmFycyB0byB0aGUgcGxvdA0KICBsYWJzKHRpdGxlID0gIkF2ZXJhZ2UgRXhwZW5kaXR1cmUgYnkgUmVnaW9uIGluIDIwMjAiLCAjIEFkZCBhIHRpdGxlDQogICAgICAgeCA9ICJSZWdpb24iLCB5ID0gIiQgTWlsbGlvbiIpDQpgYGANCg0KYGBge3J9DQpnZ3Bsb3QoWF8yMDIxLCBhZXMoeD1SZWdpb24sIHk9WDIwMjEpKSArDQogIGdlb21fYmFyKHN0YXQ9ImlkZW50aXR5IiwgZmlsbD0icHVycGxlIikgKyBzY2FsZV9maWxsX2dyZXkoKSArICMgQWRkIGJhcnMgdG8gdGhlIHBsb3QNCiAgbGFicyh0aXRsZSA9ICJBdmVyYWdlIEV4cGVuZGl0dXJlIGJ5IFJlZ2lvbiBpbiAyMDIxIiwgIyBBZGQgYSB0aXRsZQ0KICAgICAgIHggPSAiUmVnaW9uIiwgeSA9ICIkIE1pbGxpb24iKQ0KYGBgDQoNCiMjIEdyw6FmaWNhIGRlIERpc3BlcnNpw7NuOiBCb3hwbG90cw0KYGBge3J9DQpnZ3Bsb3QoYmRfZXh0MSwgYWVzKHg9WWVhciwgeT1wb2ludHMpKSArIA0KICBnZW9tX2JveHBsb3Qob3V0bGllci5jb2xvdXI9ImJsYWNrIiwgb3V0bGllci5zaGFwZT0xNiwNCiAgICAgICAgICAgICBvdXRsaWVyLnNpemU9Miwgbm90Y2g9RkFMU0UpDQogIGxhYnModGl0bGUgPSAiUHJvbWVkaW8gZGVsIEdhc3RvIHBvciBDb25zdW1pZG9yIHBvciBBw7FvIiwNCiAgICAgICB4PSJBw7FvIiwgeT0iJCBNaWxsb25lcyIpICsNCiAgdGhlbWVfY2xhc3NpYygpIA0KYGBgDQoNCmBgYHtyfQ0KZ2dwbG90KGJkX2V4dDEsIGFlcyh4PVJlZ2lvbiwgeT1wb2ludHMpKSArIA0KICBnZW9tX2JveHBsb3Qob3V0bGllci5jb2xvdXI9ImJsYWNrIiwgb3V0bGllci5zaGFwZT0xNiwNCiAgICAgICAgICAgICBvdXRsaWVyLnNpemU9Miwgbm90Y2g9RkFMU0UpDQogIGxhYnModGl0bGUgPSAiUHJvbWVkaW8gZGVsIEdhc3RvIHBvciBDb25zdW1pZG9yIHBvciBSZWdpw7NuIiwNCiAgICAgICB4PSJBw7FvIiwgeT0iJCBNaWxsb25lcyIpICsNCiAgdGhlbWVfY2xhc3NpYygpIA0KYGBgDQoNCiMjIFNjYXR0ZXIgcGxvdHMNCmBgYHtyfQ0KbG9uZ2VyX2RhdGEgPC0gYmRfZXh0ICU+JQ0KICBwaXZvdF9sb25nZXIoWDIwMTY6WDIwMjEsIG5hbWVzX3RvID0gInllYXIiLCB2YWx1ZXNfdG8gPSAiZXhwZW5kaXR1cmUiKQ0KDQpnZ3Bsb3QoZGF0YSA9IGxvbmdlcl9kYXRhLCBhZXMoeWVhciwgZXhwZW5kaXR1cmUpKSArDQogIGdlb21fbGluZShjb2xvciA9ICJzdGVlbGJsdWUiLCBzaXplID0gMSkgKw0KICBnZW9tX3BvaW50KGNvbG9yPSJzdGVlbGJsdWUiKSArIA0KICBsYWJzKHRpdGxlID0gIkV4cGVuZGl0dXJlIHBlciBSZWdpb24gYnkgWWVhcnMiLA0KICAgICAgIHkgPSAiRXhwZW5kaXR1cmUiLCB4ID0gIlllYXIiKSArIA0KICBmYWNldF93cmFwKH4gUmVnaW9uKQ0KYGBgDQoNCg0KIyMgUHJvcHVlc3Rhcw0KKipQcm9wdWVzdGEgIzEqKg0KRGUgYWN1ZXJkbyBjb24gU3RhdGlzdGEgMjAyMiwgbGEgaW5kdXN0cmlhIG3DqWRpY2EgZmFybWFjw6l1dGljYSBlcyBsYSBuw7ptZXJvIDQgZW4gZ2VuZXJhciBtYXlvciB1dGlsaWRhZCBwYXJhIGxhIGluZHVzdHJpYSBkZWwgZW1wYXF1ZS4gRW4gZWwgYcOxbyBwcmVzZW50ZSBjdWVudGEgY29uIHVuYSB1dGlsaWRhZCBkZWwgMC45NyUgeSBlbiBsb3MgcHLDs3hpbW9zIHNlIHZlIHJlZmxlamFkbyB1biBpbmNyZW1lbnRvLCBwYXJhIGVsIDIwMjMgdGVuZHLDoSB1bmEgdXRpbGlkYWQgZGVsIDEuMDElIHkgcGFyYSBlbCAyMDI0IHVuYSB1dGlsaWRhZCBkZWwgMS4xMSUuDQpFcyBwb3IgZWxsbyBxdWUgcmVjb21lbmRhbW9zIGEgRk9STSBpbnRyb2R1Y2lyc2UgYSBsYSBpbmR1c3RyaWEgbcOpZGljYSBmYXJtYWPDqXV0aWNhLg0KDQoqKlByb3B1ZXN0YSAjMioqDQpFbiBiYXNlIGEgbGFzIGdyw6FmaWNhcyBwcmVzZW50YWRhcyBhbnRlcmlvcm1lbnRlIHBvZGVtb3Mgb2JzZXJ2YXIgcXVlIExhdGlub2Ftw6lyaWNhIGVzIGxhIHJlZ2nDs24gY29uIG1heW9yZXMgZ2FzdG9zIGVuIGVxdWlwbyBtw6lkaWNvLCBlc3RhIGluZHVzdHJpYSBhbGNhbnphIGxvcyAkMiw1MDAsMDAwIG1pbGxvbmVzIGRlIHBlc29zIGVuIGdhc3Rvcy4gUG9yIGxvIHF1ZSByZWNvbWVuZGFtb3MgYSBGT1JNIGFkZW50cmFyc2UgZW4gbGEgaW5kdXN0cmlhIG3DqWRpY2EgZmFybWFjw6l1dGljYSBlc3BlY8OtZmljYW1lbnRlIGVuIExhdGlub2Ftw6lyaWNhIHlhIHF1ZSBlcyB1bmEgaW5kdXN0cmlhIG11eSByZW50YWJsZS4gDQpEZSBsYSBtaXNtYSBtYW5lcmEsIHBlbnNhbW9zIHF1ZSBlcyBjb252ZW5pZW50ZSBxdWUgRk9STSByZWFsaWNlIGNvbnZlbmlvcyBjb24gZGlmZXJlbnRlcyBob3NwaXRhbGVzIHkvbyBmYXJtYWNpYXMgcGFyYSBzZXIgc3UgcHJpbmNpcGFsIHByb3ZlZWRvciBkZSBlbXBhcXVlLg0KDQojIEVudHJlZ2FibGUgMi4zICANCkVtcGxlYW5kbyBsYXMgYmFzZSBkZSBkYXRvcyBjb3JyZXNwb25kaWVudGVzLiAgDQphLiBGT1JNIOKAkyBSZWN1cnNvcyBIdW1hbm9zICANCmIuIEZPUk0g4oCTIERlbGl2ZXJ5IFBsYW4gIA0KYy4gRk9STSDigJMgRGVsaXZlcnkgUGVyZm9ybWFuY2UgIA0KDQpSZWFsaXphciB1biBhbsOhbGlzaXMgZXN0YWTDrXN0aWNvIGRlc2NyaXB0aXZvIGVuIGVsIHF1ZSBsb2dyZXMgZGVzdGFjYXIgZWwgY29uanVudG8gZGUgZGF0b3MsIHF1ZSBhcG95YW4gYSBsYSBlbXByZXNhIGEgbWVqb3JhciBzdSBvcGVyYWNpw7NuLiBJbmNvcnBvcmEgYWwgbWVub3MgZG9zIHByb3B1ZXN0YXMgY29uY3JldGFzLCBhcG95YWRhcyBkZSB0dSBhbsOhbGlzaXMgZW4gZG9uZGUgc2UgaW5jbHV5ZSBhbCBtZW5vczogKDEpIFRhYmxhIGRlIGZyZWN1ZW5jaWEsIChvcGNpb25hbCkgVGFibGFzIGNydXphZGFzLCAoMi0zKSBHcsOhZmljb3MgZGUgZGF0b3MgY3VhbGl0YXRpdm9zIHkgY3VhbnRpdGF0aXZvcywgYXPDrSBjb21vICgyLTMpIEdyw6FmaWNvcyBkZSBkaXNwZXJzacOzbi4NCg0KIyMgVGFibGFzIGRlIGZyZWN1ZW5jaWENCioqUmVjdXJzb3MgSHVtYW5vczogQmFqYXMqKg0KYGBge3J9DQptb3RfYmFqYTwtcmhfYmFqYSAlPiUgZ3JvdXBfYnkoTU9USVZPLkRFLkJBSkEpICU+JSB0YWxseSgpDQptb3RfYmFqYQ0KYGBgDQoNCioqUmVjdXJzb3MgSHVtYW5vczogQ29sYWJvcmFkb3JlcyoqDQpgYGB7cn0NCnJoMl8yWyJHRU5FUk8iXVtyaDJfMlsiR0VORVJPIl0gPT0gJyddIDwtIE5BDQpyaDJfMiRHRU5FUk88LXJoMl8yJEdFTkVSTyU+JSByZXBsYWNlX25hKCdGQUxUQU5URScpDQpnZW5lcm88LXJoMl8yICU+JSBncm91cF9ieShHRU5FUk8pICU+JSB0YWxseSgpDQpnZW5lcm8NCmBgYA0KDQojI1RhYmxhcyBjcnV6YWRhcyAgDQoqKlRhYmxhIGNydXphZGEgZGUgZ8OpbmVybyB5IG1vdGl2byBkZSBiYWphKioNCmBgYHtyfQ0KcmhfYmFqYVsiR0VORVJPIl1bcmhfYmFqYVsiR0VORVJPIl0gPT0gJyddIDwtIE5BDQpyaF9iYWphJEdFTkVSTzwtcmhfYmFqYSRHRU5FUk8lPiUgcmVwbGFjZV9uYSgnRkFMVEFOVEUnKQ0KdGFibGF4MTwtcmhfYmFqYSAlPiUgdGFieWwoR0VORVJPLE1PVElWTy5ERS5CQUpBKQ0KdGFibGF4MQ0KYGBgDQoNCioqVGFibGEgY3J1emFkYSBkZSBDbGllbnRlIHkgdnVlbHRhcyoqDQpgYGB7cn0NCnRhYmxheDI8LWRwZXJmMiAlPiUgdGFieWwoQ2xpZW50ZSxWVUVMVEFTKQ0KdGFibGF4Mg0KYGBgDQoqKlRhYmxhIGNydXphZGEgZGUgZ2VuZXJvIHkgc2FsYXJpbyBkaWFyaW8qKg0KYGBge3J9DQp0YWJsYXgzPC1yaDJfMiAlPiUgdGFieWwoR0VORVJPLFNBTEFSSU8uRElBUklPLklNU1MpDQp0YWJsYXgzDQpgYGANCg0KKipUYWJsYSBjcnV6YWRhIGRlIE1PVElWTyBERSBCQUpBIHkgZGVwYXJ0YW1lbnRvKioNCmBgYHtyfQ0KdGFibGF4NDwtcmhfYmFqYSAlPiUgdGFieWwoTU9USVZPLkRFLkJBSkEsREVQQVJUQU1FTlRPKQ0KdGFibGF4NA0KYGBgDQoqKlRhYmxhIGNydXphZGEgZGUgcHVlc3RvIHkgc2FsYXJpbyBkaWFyaW8qKg0KYGBge3J9DQp0YWJsYXg1PC1yaDJfMiAlPiUgdGFieWwoUFVFU1RPLFNBTEFSSU8uRElBUklPLklNU1MpDQp0YWJsYXg1DQpgYGANCg0KDQojIyBHcmFmaWNvcyBkZSBkYXRvcyBjdWFsaXRhdGl2b3MgDQoqKkJhciBHcmFwaC9oaXN0b2dyYW1hIGRlIG1vdGl2byBkZSBiYWphcyoqDQpgYGB7cn0NCmdncGxvdChtb3RfYmFqYSxhZXMoeD1NT1RJVk8uREUuQkFKQSx5PW4sZmlsbD1uKSkrDQogIGdlb21fYmFyKHN0YXQ9ImlkZW50aXR5IikrDQogIHRoZW1lX21pbmltYWwoKSsNCiAgbGFicyh0aXRsZT0iTW90aXZvIGRlIEJhamFzIikNCmBgYA0KDQoqKkJhciBHcmFwaCBkZSBtb3Rpdm8gZGUgYmFqYXMgcG9yIGRlcGFydGFtZW50byoqDQpgYGB7cn0NCmdncGxvdChyaF9iYWphLGFlcyh4PURFUEFSVEFNRU5UTyx5PU1PVElWTy5ERS5CQUpBLGZpbGw9TU9USVZPLkRFLkJBSkEpKSsNCiAgZ2VvbV9iYXIoc3RhdD0iaWRlbnRpdHkiKSsNCiAgdGhlbWVfbWluaW1hbCgpKw0KICBsYWJzKHRpdGxlPSJNb3Rpdm8gZGUgQmFqYXMgcG9yIERlcGFydGFtZW50byIpDQpgYGANCg0KDQojIyBHcsOhZmljb3MgZGUgZGF0b3MgY3VhbnRpdGF0aXZvcw0KKipCYXIgZ3JhcGggZGUgZ8OpbmVybyB5IHNhbGFyaW8gcHJvbWVkaW8qKg0KYGBge3J9DQpnZW5lcm9fc2FscHJvbTwtYWdncmVnYXRlKFNBTEFSSU8uRElBUklPLklNU1MgfiBHRU5FUk8sIGRhdGEgPSByaDJfMiwgbWVhbikNCmdlbmVyb19zYWxwcm9tDQpgYGANCg0KYGBge3J9DQpnZ3Bsb3QoZ2VuZXJvX3NhbHByb20sYWVzKHg9R0VORVJPLHk9U0FMQVJJTy5ESUFSSU8uSU1TUyxmaWxsPVNBTEFSSU8uRElBUklPLklNU1MpKSsNCiAgZ2VvbV9iYXIoc3RhdD0iaWRlbnRpdHkiKSsNCiAgdGhlbWVfbWluaW1hbCgpKw0KICBsYWJzKHRpdGxlPSJTYWxhcmlvIHByb21lZGlvIHBvciBnw6luZXJvIikNCmBgYA0KDQoNCioqSGlzdG9ncmFtYSBkZSBzYWxhcmlvcyoqDQpgYGB7cn0NCmhpc3QocmgyXzIkU0FMQVJJTy5ESUFSSU8uSU1TUywgY29sPSJkYXJrYmx1ZSIpDQpgYGANCg0KKipEaWZlcmVuY2lhIHByb21lZGlvIHBvciBjbGllbnRlKioNCmBgYHtyfQ0KZGlmX3Byb208LWFnZ3JlZ2F0ZShEaWZlcmVuY2UgfiBDbGllbnRlLCBkYXRhID0gZHBlcmYyLCBtZWFuKQ0KZGlmX3Byb20NCg0KZ2dwbG90KGRpZl9wcm9tLGFlcyh4PUNsaWVudGUseT1EaWZlcmVuY2UsIGZpbGw9RGlmZXJlbmNlKSkrDQogIGdlb21fYmFyKHN0YXQ9ImlkZW50aXR5IikrDQogIHRoZW1lX21pbmltYWwoKSsNCiAgbGFicyh0aXRsZT0iRGlmZXJlbmNpYSBwcm9tZWRpbyBwb3IgY2xpZW50ZSIpDQpgYGANCg0KKipQbG90IGRlIHNhbGFyaW9zKioNCmBgYHtyfQ0Kbl9kaXN0aW5jdChyaDJfMiRTQUxBUklPLkRJQVJJTy5JTVNTKQ0Kc2FsYXJpbzwtcmgyXzIgJT4lIGdyb3VwX2J5KFNBTEFSSU8uRElBUklPLklNU1MpICU+JSB0YWxseSgpDQpzYWxhcmlvDQoNCnBsb3Qoc2FsYXJpbyRTQUxBUklPLkRJQVJJTy5JTVNTLHNhbGFyaW8kbiwgdHlwZT0iYiIsY29sPSJibHVlIiwgbHdkPTEuNSwgeGxhYiA9IlNhbGFyaW8gRGlhcmlvIix5bGFiID0iUGVyc29uYXMgY29uIGVzZSBzYWxhcmlvIiwgbWFpbiA9ICJTYWxhcmlvIGRpYXJpbyIpDQoNCmBgYA0KDQojIyBHcsOhZmljb3MgZGUgZGlzcGVyc2nDs24gDQoqKkJveHBsb3QgZGUgc2FsYXJpb3MqKg0KYGBge3J9DQpib3hwbG90KHJoMl8yJFNBTEFSSU8uRElBUklPLklNU1MsY29sPXJhaW5ib3cobmNvbCh0cmVlcykpKQ0KYGBgDQoNCioqQm94cGxvdCBkZSBEaWZlcmVuY2lhIHBvciBNZXMqKg0KYGBge3J9DQpkcGVyZjM8LWRwZXJmMg0KZHBlcmYzJG1vbnRoIDwtIGZvcm1hdChkcGVyZjIkRkVDSEEsICIlbSIpICAgICAgICAgICAgICANCmhlYWQoZHBlcmYzJG1vbnRoKSANCmJveHBsb3QoZHBlcmYzJERpZmVyZW5jZSB+IGRwZXJmMyRtb250aCwgbWFpbj0iRGlzdHJpYnVjaW9uIGRlIGRpZmVyZW5jaWEgcG9yIG1lcyIsIA0KICAgICAgICB4bGFiPSJNZXMiLHlsYWI9IkRpZmVyZW5jaWEiLGNvbD1yYWluYm93KG5jb2wodHJlZXMpKSkNCmBgYA0KDQoqKlBsb3QgZGUgYmFqYXMgcG9yIG1lcyAqKg0KYGBge3J9DQpyaF9iYWphMjwtcmhfYmFqYQ0KcmhfYmFqYTIkbW9udGhfYmFqYSA8LSBmb3JtYXQocmhfYmFqYTIkQkFKQSwgIiVtIikgICAgICAgICAgICAgIA0KcmhfYmFqYTIkbW9udGhfYmFqYTwtYXMuaW50ZWdlcihyaF9iYWphMiRtb250aF9iYWphKQ0KDQpuX2Rpc3RpbmN0KHJoX2JhamEyJG1vbnRoX2JhamEpDQptZXNfYmFqYTwtcmhfYmFqYTIgJT4lIGdyb3VwX2J5KG1vbnRoX2JhamEpICU+JSB0YWxseSgpDQptZXNfYmFqYQ0KcGxvdChtZXNfYmFqYSRtb250aF9iYWphLCBtZXNfYmFqYSRuLCwgbWFpbj0iQmFqYXMgcG9yIG1lcyIsIA0KICAgICAgICB4bGFiPSJNZXMiLHlsYWI9Ik5vLiBkZSBiYWphcyIpDQpgYGANCg0KKipUaWVtcG8gcHJvbWVkaW8gZGUgcGVybWFuZW5jaWEgZW4gRk9STSoqDQpgYGB7cn0NCnJoX2JhamEyJFBlcm1hbmVuY2lhPC1kaWZmdGltZShyaF9iYWphMiRCQUpBLHJoX2JhamEyJEZFQ0hBLkRFLkFMVEEsIHVuaXRzID0gImRheXMiKQ0KYm94cGxvdChyaF9iYWphMiRQZXJtYW5lbmNpYSwgbWFpbj0iUGVybWFuZW5jaWEgZW4gRk9STSIsIA0KICAgICAgICB4bGFiPSJQZXJtYW5lbmNpYSIseWxhYj0iVGllbXBvIGVuIGRpYXMiLGNvbD1yYWluYm93KG5jb2wodHJlZXMpKSkNCmBgYA0KIyMgUHJvcHVlc3Rhcw0KDQoqKlByb3B1ZXN0YXMqKg0KRGUgYWN1ZXJkbyBjb24gZWwgYW7DoWxpc2lzIHJlYWxpemFkbyBkZSBsYSBiYXNlIGRlIGRhdG9zIOKAnEZPUk0gLSBSZWN1cnNvcyBIdW1hbm9z4oCdIHNlIG9ic2VydsOzIHF1ZSBsb3MgbW90aXZvcyBkZSBiYWphIG3DoXMgY29tdW5lcyBzb246IA0KQmFqYSBwb3IgZmFsdGFzOiAxNDENClJlbnVuY2lhIHZvbHVudGFyaWE6IDg3IA0KVMOpcm1pbm8gZGUgY29udHJhdG86IDggIA0KDQpEZSBhY3VlcmRvIGNvbiBkYXRvcyBkZSBPQ0NNdW5kaWFsIHkgRm9yYmVzIE3DqXhpY28sIGVsIDU4JSBkZSBsb3MgdHJhYmFqYWRvcmVzIGRlbCBwYcOtcyBubyBzZSBwcmVzZW50YSBhIGxhYm9yYXIgcG9yIGN1ZXN0aW9uZXMgZGUgc2FsdWQuIEVudHJlIGxvcyBwcmluY2lwYWxlcyBwcm9ibGVtYXMgcXVlIHNlIG1hbmlmaWVzdGFuIGVzdMOhbiBsYXMgZW5mZXJtZWRhZGVzIGVzdG9tYWNhbGVzIG8gZ8Ohc3RyaWNhcyB5IGxhcyBjZWZhbGVhcy4gRGUgaWd1YWwgbWFuZXJhLCBlbCAzNiUgc2UgYXVzZW50YSBkZSBzdXMgb2JsaWdhY2lvbmVzIGxhYm9yYWxlcyBwYXJhIHJlc29sdmVyIHRyw6FtaXRlcyBwZXJzb25hbGVzLg0KDQpEZSBhY3VlcmRvIGNvbiBlbCBJTVNTLCBlbCA3NSUgZGUgbGEgcG9ibGFjacOzbiB0cmFiYWphZG9yYSBlbiBNw6l4aWNvIHBhZGVjZSBkZSBlc3Ryw6lzIGxhYm9yYWwgeSBzZWfDum4gZGF0b3MgZGVsIFdlbGxuZXNzIENvdW5jaWwgTcOpeGljbyB1biB0cmFiYWphZG9yIGZhbHRhIGEgc3VzIGxhYm9yZXMgaGFzdGEgMjUgZMOtYXMgYWwgYcOxbyBjdWFuZG8gc3VmcmUgZGVwcmVzacOzbiB5IGhhc3RhIDIwIGTDrWFzIHBvciBhbnNpZWRhZC4NCg0KUG9yIGxvIHRhbnRvLCBsYSBwcmltZXJhIHByb3B1ZXN0YSBzZSBiYXNhIGVuIG1lam9yYXIgbGEgZ2VzdGnDs24gZGVsIGFic2VudGlzbW8gbGFib3JhbC4gUHJpbWVybyBlcyBpbXBvcnRhbnRlIGVzdGFibGVjZXIgcG9sw610aWNhcyBkZSBhc2lzdGVuY2lhIHkgYXVzZW5jaWEgcGFyYSBkZXRlcm1pbmFyIHF1w6kgY2Fzb3Mgc2UgY29uc2lkZXJhcsOhbiBqdXN0aWZpY2Fkb3MgeSBjdcOhbGVzIG5vLiBUYW1iacOpbiBwcm9wb3JjaW9uYXIgZmxleGliaWxpZGFkIGVuIGN1YW50byBhIHNvbGljaXR1ZGVzIGRlIHBlcm1pc29zIHBvciB0csOhbWl0ZXMgcGVyc29uYWxlcyBkZSBhY3VlcmRvIGEgbGEgYWdlbmRhIGxhYm9yYWwgeSBlbCBuaXZlbCBkZSBpbXBvcnRhbmNpYS91cmdlbmNpYSBkZWwgdHLDoW1pdGUuIA0KDQpBc8OtIGNvbW8gdGFtYmnDqW4gbGxldmFyIGEgY2FibyB1biBwcm95ZWN0byBsbGFtYWRvIOKAnFVuIGTDrWEgc2luIHRp4oCdLCBlbiBlbCBxdWUgc2UgaW52b2x1Y3JlIGEgdG9kb3MgbG9zIGVtcGxlYWRvcyB5IHNpbXVsZW4gbGEgYXVzZW5jaWEgZGUgMSBvIHZhcmlvcyBkZSBzdXMgY29tcGHDsWVyb3MgZHVyYW50ZSBsYSBqb3JuYWRhIGxhYm9yYWwgY29uIGVsIGZpbiBkZSBkZW1vc3RyYXIgY3XDoW4gdmFsaW9zYSBlcyBzdSBwcmVzZW5jaWEgZGVudHJvIGRlIGxhcyBhY3RpdmlkYWRlcyBkaWFyaWFzIGRlIGxhIGVtcHJlc2EgeSBjw7NtbyBpbmZsdXllIGRlIG1hbmVyYSBuZWdhdGl2YSBwYXJhIHN1cyBjb21wYcOxZXJvcyBlbCBmYWx0YXIgaW5qdXN0aWZpY2FkYW1lbnRlIGFsIHRyYWJham8uIA0KDQpJbXBsZW1lbnRhciBlbCBob3JhcmlvIGZsZXhpYmxlIGRlIHRyYWJham8gZWwgY3VhbCBwZXJtaXRhIHF1ZSBsb3MgdHJhYmFqYWRvcmVzIHB1ZWRhbiB0ZW5lciB1biByb2wgbcOhcyBhY3Rpdm8gZW4gbGFzIGRlY2lzaW9uZXMgcXVlIHNlIHRvbWFuIGVuIHRvcm5vIGEgc3Ugam9ybmFkYSBsYWJvcmFsLiBPZnJlY2VyIGRpdmVyc2FzIG9wY2lvbmVzIGRlbnRybyBkZWwgZXNxdWVtYSBkZSBob3JhcmlvcyBkZSBsYSBvcmdhbml6YWNpw7NuLg0KDQpDcmVhciB1biBwcm9ncmFtYSBkZSBiZW5lZmljaW9zIHBhcmEgbG9zIGNvbGFib3JhZG9yZXMsIGNvbW8gYm9ub3MgcG9yIGRlc2VtcGXDsW8sIGFzaXN0ZW5jaWEsIGN1cnNvcyBkZSBjYXBhY2l0YWNpw7NuLCBldGMuIFBhcmEgZm9tZW50YXIgZWwgdHJhYmFqbyBlbiBlcXVpcG8geSBsYSBtb3RpdmFjacOzbi4gIA0KDQpZIHBvciDDumx0aW1vIGNyZWFyIHVuIHByb2dyYW1hIGRlIGJpZW5lc3RhciBxdWUgcGVybWl0YSBvZnJlY2VyIGFjb21wYcOxYW1pZW50byBwc2ljb2zDs2dpY28sICByZWFsaXphciBldmVudG9zIHlhIHNlYSAxIHZleiBwb3IgcXVpbmNlbmEgcGFyYSByZWFsaXphciBhY3RpdmlkYWRlcyBkaW7DoW1pY2FzIGNvbWJpbmFuZG8gZWwgYXByZW5kaXphamUgY29uIGxhIGRpdmVyc2nDs24sIGNvbiBlbCBmaW4gZGUgZm9tZW50YXIgbGEgZW1wYXTDrWEsIHRyYWJham8gZW4gZXF1aXBvLCBlc2N1Y2hhIGFjdGl2YS4gQXPDrSBjb21vIHRhbWJpw6luIGJyaW5kYXIgYWNvbXBhw7FhbWllbnRvIGEgY2FkYSB1bm8gZGUgbG9zIGVtcGxlYWRvcyBwYXJhIGNvbm9jZXIgc3Ugc2l0dWFjacOzbiBwZXJzb25hbCwgY8OzbW8gc2Ugc2llbnRlLCBxdcOpIGRlc2VhLCBzaSBvY3VycmUgYWxnbyBlbiBlbCB0cmFiYWpvLCBzaSB0aWVuZSBhbGfDum4gcHJvYmxlbWEgbyBzaSB0aWVuZSBhbGd1bmEgcHJvcHVlc3RhIGRlIG1lam9yYSBwYXJhIGFsZ3VubyBkZSBsb3MgcHJvY2Vzb3MuIEZvbWVudGFyIGxhIGNvbmZpYW56YSBlbnRyZSBjb2xhYm9yYWRvciAtIGzDrWRlciBxdWUgcGVybWl0YSBlbCBkZXNhcnJvbGxvIHBlcnNvbmFsIHkgcHJvZmVzaW9uYWwgZGUgYW1iYXMgcGFydGVzLiBMYXMgZW1wcmVzYXMgY29uIHByb2dyYW1hcyBkZSByZWNvbm9jaW1pZW50byBlZmljYWNlcyB0aWVuZW4gdW4gMzElIG1lbm9zIGRlIHJvdGFjacOzbiB2b2x1bnRhcmlhLCBzZWfDum4gYW7DoWxpc2lzIGRlIEJlcnNpbiBwb3IgRGVsb2l0dGUuDQo=