Importar librerías

library(knitr)
library(dplyr)
library(pollster)
library(janitor)
library(ggplot2)
library(naniar)
library(Hmisc)
library(psych)
library(tidyverse)
library(foreign)
library(forcats)      
library(dlookr)       # summaries and visualization of missing values NAs
library(corrplot)     # correlation plots
library(jtools)       # presentation of regression analysis 
library(lmtest)       # diagnostic checks - linear regression analysis 
library(car)          # diagnostic checks - linear regression analysis
library(olsrr)        # diagnostic checks - linear regression analysis 
library(kableExtra)
library(modeest)
#install.packages("foreign")
library(foreign)
#install.packages("forcats")
library(forcats)      # to work with categorical variables
#install.packages ("janitor")
library(janitor)      # data exploration and cleaning 
#install.packages("Hmisc")
library(Hmisc)        # several useful functions for data analysis 
#install.packages ("psych")
library(psych)        # functions for multivariate analysis 
#install.packages("naniar")
library(naniar)       # summaries and visualization of missing values NAs
#install.packages("dlookr")
library(dlookr)       # summaries and visualization of missing values NAs
#install.packages ("kableExtra")
library(kableExtra)
library(readr)
#install.packages ("corrplot")
library(corrplot)
#install.packages ("jtools")
library(jtools) 
#install.packages ("lmtest")
library(lmtest) 
#install.packages ("car")
library(car) 
#install.packages ("olsrr")
library(olsrr) 
#install.packages ("gmodels")
library(gmodels)
library(tidyverse)
#install.packages("foreign")
#install.packages("dplyr")
library(ggplot2)
#install.packages("psych")
library(psych)
#install.packages("corrplot")
library(corrplot)
#install.packages("jtools")
library(jtools)
#install.packages("lmtest")
library(lmtest)
#install.packages("car")
library(car)
#install.packages("carData")
#install.packages("factoextra")
library(factoextra)
#install.packages("janitor")
library(janitor)
#install.packages("readr")
library(readr)
#install.packages("plotrix")
library(plotrix)

Recursos Humanos (Colaboradores = col y Bajas = baj)

#file.choose()
col <- read.csv("/Users/carlosgonzalez/Desktop/Colab_recursoshumanos.csv")
baj <- read.csv("/Users/carlosgonzalez/Desktop/BAJAS_LIMPIA.csv")

Limpieza de base de datos

Entender bases de datos

summary(col)
##   Num_empleado    FECHA.DE.NACIMIENTO    GENERO              RFC           
##  Min.   :  1.00   Length:113          Length:113         Length:113        
##  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   :21                                                                
##  FECHA.DE.ALTA       Primer.mes          X4to.mes            PUESTO         
##  Length:113         Length:113         Length:113         Length:113        
##  Class :character   Class :character   Class :character   Class :character  
##  Mode  :character   Mode  :character   Mode  :character   Mode  :character  
##                                                                             
##                                                                             
##                                                                             
##                                                                             
##  DEPARTAMENTO       NO.SEGURO.SOCIAL   SALARIO.DIARIO.IMSS   COLONIA         
##  Length:113         Length:113         Min.   :144.4       Length:113        
##  Class :character   Class :character   1st Qu.:176.7       Class :character  
##  Mode  :character   Mode  :character   Median :180.7       Mode  :character  
##                                        Mean   :179.1                         
##                                        3rd Qu.:180.7                         
##                                        Max.   :337.1                         
##                                                                              
##   MUNICIPIO            ESTADO         
##  Length:113         Length:113        
##  Class :character   Class :character  
##  Mode  :character   Mode  :character  
##                                       
##                                       
##                                       
## 
summary(baj)
##        X               EDAD       FECHA.NACIMIENTO      GENERO         
##  Min.   :  1.00   Min.   :19.00   Length:233         Length:233        
##  1st Qu.: 75.00   1st Qu.:23.00   Class :character   Class :character  
##  Median : 89.00   Median :29.00   Mode  :character   Mode  :character  
##  Mean   : 87.64   Mean   :31.08                                        
##  3rd Qu.:102.00   3rd Qu.:37.00                                        
##  Max.   :147.00   Max.   :61.00                                        
##  NA's   :56                                                            
##      RFC             FECHA_ALTA        MOTIVO_BAJA        DIAS_LABORADOS   
##  Length:233         Length:233         Length:233         Min.   :   0.00  
##  Class :character   Class :character   Class :character   1st Qu.:   6.00  
##  Mode  :character   Mode  :character   Mode  :character   Median :  15.00  
##                                                           Mean   :  72.73  
##                                                           3rd Qu.:  47.00  
##                                                           Max.   :1966.00  
##                                                                            
##   FECHA_BAJA           PUESTO             DEPTO.             SEGURO         
##  Length:233         Length:233         Length:233         Length:233        
##  Class :character   Class :character   Class :character   Class :character  
##  Mode  :character   Mode  :character   Mode  :character   Mode  :character  
##                                                                             
##                                                                             
##                                                                             
##                                                                             
##  SALARIO_DIARIO  LUGAR_NACIMIENTO       CURP              CALLE          
##  Min.   :144.4   Length:233         Length:233         Length:233        
##  1st Qu.:180.7   Class :character   Class :character   Class :character  
##  Median :180.7   Mode  :character   Mode  :character   Mode  :character  
##  Mean   :177.9                                                           
##  3rd Qu.:180.7                                                           
##  Max.   :500.0                                                           
##                                                                          
##  NUM_INTERNO          COLONIA          CODIGO_POST         MUNICIPIO        
##  Length:233         Length:233         Length:233         Length:233        
##  Class :character   Class :character   Class :character   Class :character  
##  Mode  :character   Mode  :character   Mode  :character   Mode  :character  
##                                                                             
##                                                                             
##                                                                             
##                                                                             
##      EDO             EDO_CIVIL             X.1           
##  Length:233         Length:233         Length:233        
##  Class :character   Class :character   Class :character  
##  Mode  :character   Mode  :character   Mode  :character  
##                                                          
##                                                          
##                                                          
## 

Eliminar NA’s y sustituir con 0’s

Con este metodo de limpieza se pretende convertir todo el contenido de los registros/Variables a un formato cuantitativo donde se pueda medir para posterior analisis.

sum(is.na(col))
## [1] 21
sum(is.na(baj))
## [1] 56
col[is.na(col)] <-0 
baj[is.na(baj)] <-0 

col <- na.omit(col)
baj <- na.omit(baj)

summary(col)
##   Num_empleado    FECHA.DE.NACIMIENTO    GENERO              RFC           
##  Min.   :  0.00   Length:113          Length:113         Length:113        
##  1st Qu.:  8.00   Class :character    Class :character   Class :character  
##  Median : 38.00   Mode  :character    Mode  :character   Mode  :character  
##  Mean   : 46.31                                                            
##  3rd Qu.: 72.00                                                            
##  Max.   :148.00                                                            
##  FECHA.DE.ALTA       Primer.mes          X4to.mes            PUESTO         
##  Length:113         Length:113         Length:113         Length:113        
##  Class :character   Class :character   Class :character   Class :character  
##  Mode  :character   Mode  :character   Mode  :character   Mode  :character  
##                                                                             
##                                                                             
##                                                                             
##  DEPARTAMENTO       NO.SEGURO.SOCIAL   SALARIO.DIARIO.IMSS   COLONIA         
##  Length:113         Length:113         Min.   :144.4       Length:113        
##  Class :character   Class :character   1st Qu.:176.7       Class :character  
##  Mode  :character   Mode  :character   Median :180.7       Mode  :character  
##                                        Mean   :179.1                         
##                                        3rd Qu.:180.7                         
##                                        Max.   :337.1                         
##   MUNICIPIO            ESTADO         
##  Length:113         Length:113        
##  Class :character   Class :character  
##  Mode  :character   Mode  :character  
##                                       
##                                       
## 
summary(baj)
##        X               EDAD       FECHA.NACIMIENTO      GENERO         
##  Min.   :  0.00   Min.   :19.00   Length:233         Length:233        
##  1st Qu.: 14.00   1st Qu.:23.00   Class :character   Class :character  
##  Median : 79.00   Median :29.00   Mode  :character   Mode  :character  
##  Mean   : 66.58   Mean   :31.08                                        
##  3rd Qu.: 97.00   3rd Qu.:37.00                                        
##  Max.   :147.00   Max.   :61.00                                        
##      RFC             FECHA_ALTA        MOTIVO_BAJA        DIAS_LABORADOS   
##  Length:233         Length:233         Length:233         Min.   :   0.00  
##  Class :character   Class :character   Class :character   1st Qu.:   6.00  
##  Mode  :character   Mode  :character   Mode  :character   Median :  15.00  
##                                                           Mean   :  72.73  
##                                                           3rd Qu.:  47.00  
##                                                           Max.   :1966.00  
##   FECHA_BAJA           PUESTO             DEPTO.             SEGURO         
##  Length:233         Length:233         Length:233         Length:233        
##  Class :character   Class :character   Class :character   Class :character  
##  Mode  :character   Mode  :character   Mode  :character   Mode  :character  
##                                                                             
##                                                                             
##                                                                             
##  SALARIO_DIARIO  LUGAR_NACIMIENTO       CURP              CALLE          
##  Min.   :144.4   Length:233         Length:233         Length:233        
##  1st Qu.:180.7   Class :character   Class :character   Class :character  
##  Median :180.7   Mode  :character   Mode  :character   Mode  :character  
##  Mean   :177.9                                                           
##  3rd Qu.:180.7                                                           
##  Max.   :500.0                                                           
##  NUM_INTERNO          COLONIA          CODIGO_POST         MUNICIPIO        
##  Length:233         Length:233         Length:233         Length:233        
##  Class :character   Class :character   Class :character   Class :character  
##  Mode  :character   Mode  :character   Mode  :character   Mode  :character  
##                                                                             
##                                                                             
##                                                                             
##      EDO             EDO_CIVIL             X.1           
##  Length:233         Length:233         Length:233        
##  Class :character   Class :character   Class :character  
##  Mode  :character   Mode  :character   Mode  :character  
##                                                          
##                                                          
## 

Transformación de variable fecha a “formato fecha”

Con este metodo de limpieza se pretende cambiar el formato de la fecha para posteriores gráficas donde esta variable peuda ser de utilidad

#col$FECHA.DE.ALTA-as.Date(col$FECHA.DE.ALTA,format="%y/%m/%d")
baj$FECHA_ALTA<-as.Date(baj$FECHA_ALTA,format="%y/%m/%d")
baj$FECHA_BAJA<-as.Date(baj$FECHA_BAJA,format="%y/%m/%d") 

summary(col)
##   Num_empleado    FECHA.DE.NACIMIENTO    GENERO              RFC           
##  Min.   :  0.00   Length:113          Length:113         Length:113        
##  1st Qu.:  8.00   Class :character    Class :character   Class :character  
##  Median : 38.00   Mode  :character    Mode  :character   Mode  :character  
##  Mean   : 46.31                                                            
##  3rd Qu.: 72.00                                                            
##  Max.   :148.00                                                            
##  FECHA.DE.ALTA       Primer.mes          X4to.mes            PUESTO         
##  Length:113         Length:113         Length:113         Length:113        
##  Class :character   Class :character   Class :character   Class :character  
##  Mode  :character   Mode  :character   Mode  :character   Mode  :character  
##                                                                             
##                                                                             
##                                                                             
##  DEPARTAMENTO       NO.SEGURO.SOCIAL   SALARIO.DIARIO.IMSS   COLONIA         
##  Length:113         Length:113         Min.   :144.4       Length:113        
##  Class :character   Class :character   1st Qu.:176.7       Class :character  
##  Mode  :character   Mode  :character   Median :180.7       Mode  :character  
##                                        Mean   :179.1                         
##                                        3rd Qu.:180.7                         
##                                        Max.   :337.1                         
##   MUNICIPIO            ESTADO         
##  Length:113         Length:113        
##  Class :character   Class :character  
##  Mode  :character   Mode  :character  
##                                       
##                                       
## 
summary(baj)
##        X               EDAD       FECHA.NACIMIENTO      GENERO         
##  Min.   :  0.00   Min.   :19.00   Length:233         Length:233        
##  1st Qu.: 14.00   1st Qu.:23.00   Class :character   Class :character  
##  Median : 79.00   Median :29.00   Mode  :character   Mode  :character  
##  Mean   : 66.58   Mean   :31.08                                        
##  3rd Qu.: 97.00   3rd Qu.:37.00                                        
##  Max.   :147.00   Max.   :61.00                                        
##                                                                        
##      RFC              FECHA_ALTA         MOTIVO_BAJA        DIAS_LABORADOS   
##  Length:233         Min.   :2001-02-22   Length:233         Min.   :   0.00  
##  Class :character   1st Qu.:2010-06-22   Class :character   1st Qu.:   6.00  
##  Mode  :character   Median :2015-06-22   Mode  :character   Median :  15.00  
##                     Mean   :2015-12-07                      Mean   :  72.73  
##                     3rd Qu.:2021-12-21                      3rd Qu.:  47.00  
##                     Max.   :2031-05-21                      Max.   :1966.00  
##                                                                              
##    FECHA_BAJA            PUESTO             DEPTO.             SEGURO         
##  Min.   :2001-02-22   Length:233         Length:233         Length:233        
##  1st Qu.:2010-03-22   Class :character   Class :character   Class :character  
##  Median :2017-05-22   Mode  :character   Mode  :character   Mode  :character  
##  Mean   :2017-02-28                                                           
##  3rd Qu.:2024-11-22                                                           
##  Max.   :2031-01-22                                                           
##  NA's   :14                                                                   
##  SALARIO_DIARIO  LUGAR_NACIMIENTO       CURP              CALLE          
##  Min.   :144.4   Length:233         Length:233         Length:233        
##  1st Qu.:180.7   Class :character   Class :character   Class :character  
##  Median :180.7   Mode  :character   Mode  :character   Mode  :character  
##  Mean   :177.9                                                           
##  3rd Qu.:180.7                                                           
##  Max.   :500.0                                                           
##                                                                          
##  NUM_INTERNO          COLONIA          CODIGO_POST         MUNICIPIO        
##  Length:233         Length:233         Length:233         Length:233        
##  Class :character   Class :character   Class :character   Class :character  
##  Mode  :character   Mode  :character   Mode  :character   Mode  :character  
##                                                                             
##                                                                             
##                                                                             
##                                                                             
##      EDO             EDO_CIVIL             X.1           
##  Length:233         Length:233         Length:233        
##  Class :character   Class :character   Class :character  
##  Mode  :character   Mode  :character   Mode  :character  
##                                                          
##                                                          
##                                                          
## 

Cuantas variables tienen las bases de datos?

La base de datos de colaboradores cuenta con 14 variables y 113 registros, mientras que la base de datos de bajas contiene 23 variables con 233 registros.

str(col)
## 'data.frame':    113 obs. of  14 variables:
##  $ Num_empleado       : num  1 2 3 4 5 6 7 8 9 10 ...
##  $ FECHA.DE.NACIMIENTO: chr  "09/10/55" "5/14/1979" "11/21/1949" "05/01/90" ...
##  $ GENERO             : chr  "MASCULINO" "FEMENINO" "MASCULINO" "FEMENINO" ...
##  $ RFC                : chr  "MALN550910338" "LEMM7905148GA" "HECL4911213X3" "CAMM9005019S8" ...
##  $ FECHA.DE.ALTA      : chr  "40185" "40550" "40869" "1/30/2013" ...
##  $ Primer.mes         : chr  "7/31/2010" "7/31/2011" "" "03/01/13" ...
##  $ X4to.mes           : chr  "10/29/2010" "10/29/2011" "" "5/30/2013" ...
##  $ PUESTO             : chr  "Supervisor de M\xe1quin" "Supervisor de pegado" "Externo" "SUPERVISORA" ...
##  $ DEPARTAMENTO       : chr  "Produccion Cart\xf3n MDL" "Produccion Cart\xf3n MDL" "Externo" "Produccion Cart\xf3n MC" ...
##  $ NO.SEGURO.SOCIAL   : chr  "43745527937" "43127902955" "2184909675" "43089001317" ...
##  $ SALARIO.DIARIO.IMSS: num  177 177 177 337 177 ...
##  $ COLONIA            : chr  "UNIDAD LABORAL" "SANTA TERESITA" "VILLAS DE HUINALA" "PUEBLO NUEVO" ...
##  $ MUNICIPIO          : chr  "SAN NICOLAS DE LOS G" "APODACA" "APODACA" "APODACA" ...
##  $ ESTADO             : chr  "Nuevo.leon" "Nuevo.leon " "Nuevo.leon " "Nuevo.leon " ...
str(baj)
## 'data.frame':    233 obs. of  23 variables:
##  $ X               : num  0 0 0 0 0 0 0 0 0 0 ...
##  $ EDAD            : int  32 36 24 21 30 46 29 31 50 19 ...
##  $ FECHA.NACIMIENTO: chr  "24/06/90" "11/07/86" "29/01/99" "11/06/01" ...
##  $ GENERO          : chr  "MASCULINO" "FEMENINO" "FEMENINO" "FEMENINO" ...
##  $ RFC             : chr  "VAOM900624HG8" "BAMI860711KR7" "GOHL990129GR7" "EAGA010611F57" ...
##  $ FECHA_ALTA      : Date, format: "2009-03-20" "2009-11-21" ...
##  $ MOTIVO_BAJA     : chr  "RENUNCIA VOLUNTARIA" "RENUNCIA VOLUNTARIA" "RENUNCIA VOLUNTARIA" "RENUNCIA VOLUNTARIA" ...
##  $ DIAS_LABORADOS  : int  628 60 59 59 51 37 37 31 18 224 ...
##  $ FECHA_BAJA      : Date, format: "2027-11-21" "2008-01-22" ...
##  $ PUESTO          : chr  "DISEÑO" "AYUDANTE GENERAL" "AYUDANTE GENERAL" "AYUDANTE GENERAL" ...
##  $ DEPTO.          : chr  "ADMINISTRATIVO" "Produccion Cartón MC" "stabilus" "celdas" ...
##  $ SEGURO          : chr  "43139026090" "21058641586" "0 2159983432" "0 3180175535" ...
##  $ SALARIO_DIARIO  : num  500 152 152 152 152 ...
##  $ LUGAR_NACIMIENTO: chr  "AVENIDA DEL COLEGIO" "TUXTLA CHICO,CHIAPAS" "SAN NICOLAS DE LOS GARZA" "SAN NICOLAS DE LOS GARZA" ...
##  $ CURP            : chr  "VAOM900624HCLLRR09" "BAMI860711MCSRNS01" "GOHL990129MNLMRZ02" "EAGA010611MNLSMLA5" ...
##  $ CALLE           : chr  "LAS FLORES" "CANAL SUR" "RIO SAN FRANCISCO" "RIO SAN FRANCISCO" ...
##  $ NUM_INTERNO     : chr  "66438" "3116" "216" "216" ...
##  $ COLONIA         : chr  "SAN NICOLAS DE LOS G" "COLINAS DEL AEROPÑUERTO" "PUEBLO NUEVO" "PUEBLO NUEVO" ...
##  $ CODIGO_POST     : chr  "66438" "0" "66646" "66646" ...
##  $ MUNICIPIO       : chr  "SAN NICOLAS DE LOS G" "PESQUERIA" "APODACA" "APODACA" ...
##  $ EDO             : chr  "Nuevo León" "NUEVO LEON" "NUEVO LEON" "NUEVO LEON" ...
##  $ EDO_CIVIL       : chr  "Soltero" "Unión libre" "matrimonio" "Soltero" ...
##  $ X.1             : chr  "" "" "" "" ...

Escala, Variables y registros (Formato tabla) de RH colaboradores y bajas

Colaboradores

Vari <- c("`Num_empleado`","`FECHA.DE.NACIMIENTO`","`GENERO`","`RFC`","`FECHA.DE.ALTA`","`Primer.mes`","`X4to.mes`","`PUESTO`","`DEPARTAMENTO`", "`NO.SEGURO.SOCIAL`","`SALARIO.DIARIO.IMSS`","`COLONIA`", "`MUNICIPIO`", "`ESTADO`")
Type <- c("cualitativo (discreto)", "cuantitativo (continuo)", "cualitativo (nominal)", "cualitativo (nominal)", "cuantitativo (continuo)", "cuantitativo (continuo)", "cuantitativo (continuo)", "cualitativo (nominal)", "cualitativo (nominal)", "cuantitativo (discreto)", "cuantitativo (continua)", "cualitativa (nominal)", "cualitativa (nominal)", "cualitativa (nominal")
Scales <- c("razón", "razón", "nominal", "intervalo", "intervalo", "intervalo", "intervalo", "ordinal", "nominal", "intervalo", "razón", "nominal", "nominal", "nominal")
table<-(data.frame(Vari, Type, Scales))
knitr::kable(table)
Vari Type Scales
Num_empleado cualitativo (discreto) razón
FECHA.DE.NACIMIENTO cuantitativo (continuo) razón
GENERO cualitativo (nominal) nominal
RFC cualitativo (nominal) intervalo
FECHA.DE.ALTA cuantitativo (continuo) intervalo
Primer.mes cuantitativo (continuo) intervalo
X4to.mes cuantitativo (continuo) intervalo
PUESTO cualitativo (nominal) ordinal
DEPARTAMENTO cualitativo (nominal) nominal
NO.SEGURO.SOCIAL cuantitativo (discreto) intervalo
SALARIO.DIARIO.IMSS cuantitativo (continua) razón
COLONIA cualitativa (nominal) nominal
MUNICIPIO cualitativa (nominal) nominal
ESTADO cualitativa (nominal nominal

Bajas

summary(baj)
##        X               EDAD       FECHA.NACIMIENTO      GENERO         
##  Min.   :  0.00   Min.   :19.00   Length:233         Length:233        
##  1st Qu.: 14.00   1st Qu.:23.00   Class :character   Class :character  
##  Median : 79.00   Median :29.00   Mode  :character   Mode  :character  
##  Mean   : 66.58   Mean   :31.08                                        
##  3rd Qu.: 97.00   3rd Qu.:37.00                                        
##  Max.   :147.00   Max.   :61.00                                        
##                                                                        
##      RFC              FECHA_ALTA         MOTIVO_BAJA        DIAS_LABORADOS   
##  Length:233         Min.   :2001-02-22   Length:233         Min.   :   0.00  
##  Class :character   1st Qu.:2010-06-22   Class :character   1st Qu.:   6.00  
##  Mode  :character   Median :2015-06-22   Mode  :character   Median :  15.00  
##                     Mean   :2015-12-07                      Mean   :  72.73  
##                     3rd Qu.:2021-12-21                      3rd Qu.:  47.00  
##                     Max.   :2031-05-21                      Max.   :1966.00  
##                                                                              
##    FECHA_BAJA            PUESTO             DEPTO.             SEGURO         
##  Min.   :2001-02-22   Length:233         Length:233         Length:233        
##  1st Qu.:2010-03-22   Class :character   Class :character   Class :character  
##  Median :2017-05-22   Mode  :character   Mode  :character   Mode  :character  
##  Mean   :2017-02-28                                                           
##  3rd Qu.:2024-11-22                                                           
##  Max.   :2031-01-22                                                           
##  NA's   :14                                                                   
##  SALARIO_DIARIO  LUGAR_NACIMIENTO       CURP              CALLE          
##  Min.   :144.4   Length:233         Length:233         Length:233        
##  1st Qu.:180.7   Class :character   Class :character   Class :character  
##  Median :180.7   Mode  :character   Mode  :character   Mode  :character  
##  Mean   :177.9                                                           
##  3rd Qu.:180.7                                                           
##  Max.   :500.0                                                           
##                                                                          
##  NUM_INTERNO          COLONIA          CODIGO_POST         MUNICIPIO        
##  Length:233         Length:233         Length:233         Length:233        
##  Class :character   Class :character   Class :character   Class :character  
##  Mode  :character   Mode  :character   Mode  :character   Mode  :character  
##                                                                             
##                                                                             
##                                                                             
##                                                                             
##      EDO             EDO_CIVIL             X.1           
##  Length:233         Length:233         Length:233        
##  Class :character   Class :character   Class :character  
##  Mode  :character   Mode  :character   Mode  :character  
##                                                          
##                                                          
##                                                          
## 
Vari <- c("`X`","`EDAD`","`FECHA.NACIMIENTO`","`GENERO`","`RFC`","`FECHA_ALTA`","`MOTIVO_BAJA`","`DIAS_LABORADOS`","`FECHA_BAJA`", "`PUESTO`","`DEPTO.`","`SEGURO`", "`SALARIO_DIARIO`", "`LUGAR_NACIMIENTO`", "`CURP`", "`CALLE`", "`NUM_INTERNO`", "`COLONIA`", "`CODIGO_POST`", "`MUNICIPIO`", "`EDO`", "`EDO_CIVIL`", "`X.1`")
Type <- c("cualitativo (discreto)", "cuantitativo (continuo)", "cuantitativa (continua)", "cualitativo (nominal)", "cualitativa (nominal)", "cualitativa (nominal)", "cuantitativo (continuo)", "cualitativo (nominal)", "cualitativo (nominal)", "cualitativa (nominal)", "cuantitativo (discreta)", "cualitativa (nominal)", "cualitativa (nominal)", "cualitativa (nominal)", "cualitativa (nominal)", "cualitativa (nominal)", "cualitativa (nominal)", "cualitativa (nominal)", "cualitativa (nominal)", "cualitativa (nominal)", "cualitativa (nominal)", "cualitativa (nominal)", "cualitativa (nominal")
Scales <- c("razón", "razón", "razón", "nominal", "intervalo", "razón", "nominal", "razón", "razón", "ordinal", "nominal", "intervalo", "razón", "nominal", "intervalo", "nominal", "intervalo", "nominal", "intervalo", "nominal", "nominal", "nominal", "intervalo")
table<-(data.frame(Vari, Type, Scales))
knitr::kable(table)
Vari Type Scales
X cualitativo (discreto) razón
EDAD cuantitativo (continuo) razón
FECHA.NACIMIENTO cuantitativa (continua) razón
GENERO cualitativo (nominal) nominal
RFC cualitativa (nominal) intervalo
FECHA_ALTA cualitativa (nominal) razón
MOTIVO_BAJA cuantitativo (continuo) nominal
DIAS_LABORADOS cualitativo (nominal) razón
FECHA_BAJA cualitativo (nominal) razón
PUESTO cualitativa (nominal) ordinal
DEPTO. cuantitativo (discreta) nominal
SEGURO cualitativa (nominal) intervalo
SALARIO_DIARIO cualitativa (nominal) razón
LUGAR_NACIMIENTO cualitativa (nominal) nominal
CURP cualitativa (nominal) intervalo
CALLE cualitativa (nominal) nominal
NUM_INTERNO cualitativa (nominal) intervalo
COLONIA cualitativa (nominal) nominal
CODIGO_POST cualitativa (nominal) intervalo
MUNICIPIO cualitativa (nominal) nominal
EDO cualitativa (nominal) nominal
EDO_CIVIL cualitativa (nominal) nominal
X.1 cualitativa (nominal intervalo

Tabla de frecuencia COLABORADORES

Tabla Salario diario - Genero

summary(col)
##   Num_empleado    FECHA.DE.NACIMIENTO    GENERO              RFC           
##  Min.   :  0.00   Length:113          Length:113         Length:113        
##  1st Qu.:  8.00   Class :character    Class :character   Class :character  
##  Median : 38.00   Mode  :character    Mode  :character   Mode  :character  
##  Mean   : 46.31                                                            
##  3rd Qu.: 72.00                                                            
##  Max.   :148.00                                                            
##  FECHA.DE.ALTA       Primer.mes          X4to.mes            PUESTO         
##  Length:113         Length:113         Length:113         Length:113        
##  Class :character   Class :character   Class :character   Class :character  
##  Mode  :character   Mode  :character   Mode  :character   Mode  :character  
##                                                                             
##                                                                             
##                                                                             
##  DEPARTAMENTO       NO.SEGURO.SOCIAL   SALARIO.DIARIO.IMSS   COLONIA         
##  Length:113         Length:113         Min.   :144.4       Length:113        
##  Class :character   Class :character   1st Qu.:176.7       Class :character  
##  Mode  :character   Mode  :character   Median :180.7       Mode  :character  
##                                        Mean   :179.1                         
##                                        3rd Qu.:180.7                         
##                                        Max.   :337.1                         
##   MUNICIPIO            ESTADO         
##  Length:113         Length:113        
##  Class :character   Class :character  
##  Mode  :character   Mode  :character  
##                                       
##                                       
## 
proportion <- prop.table(table(col$SALARIO.DIARIO.IMSS,col$GENERO))
proportion %>%
  kbl() %>%
  kable_styling()
FEMENINO MASCULINO
144.45 0.0265487 0.0000000
151.61 0.0619469 0.0353982
151.67 0.0088496 0.0265487
152.86 0.0088496 0.0000000
175.79 0.0000000 0.0088496
176.72 0.0707965 0.1504425
180.68 0.3008850 0.2212389
181.68 0.0088496 0.0000000
184.68 0.0088496 0.0000000
185.68 0.0088496 0.0000000
208.65 0.0088496 0.0000000
240.71 0.0088496 0.0000000
240.75 0.0000000 0.0088496
260.01 0.0088496 0.0000000
279.61 0.0000000 0.0088496
337.05 0.0088496 0.0000000

En este caso como se observa en la tabla de frecuencia entre las variables de salario diario y genero, se puede dar a cuenta de cómo el genero femenino tiene una mayor concentración en los salarios diarios más altos. Por lo que se puede concluir en este ejericio que existe un caso de desigualdad en el contexto economico y por consiguiente es necesario proponer sesiones de conscientización sobre dichos temas con la finalidad de que exista una completa armonía y equidad de genero al menos en el contexto salarial interno. Por otra parte se propondría analizar la causa raíz o la razón por la cual a las mujeres se les paga más. Por otra parte, se sostendría una hipotesis sustentada en que existe ligeramente una mayor cantidad de mujeres trabajando en Form y por consiguiente al efectuar el count y la variedad de puestos existentes en FORM es posible que a eso se deba la dispariedad de los salarios. ## Tabla de frecuencia BAJAS ### Tabla Departamento - Salario Diario

proportion <- prop.table(table(col$DEPARTAMENTO,col$SALARIO.DIARIO.IMSS))
proportion %>%
  kbl() %>%
  kable_styling()
144.45 151.61 151.67 152.86 175.79 176.72 180.68 181.68 184.68 185.68 208.65 240.71 240.75 260.01 279.61 337.05
0.0000000 0.0353982 0.0000000 0.0000000 0.0000000 0.0088496 0.2831858 0.0088496 0.0088496 0.0088496 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
Ay.flexo 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0088496 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
Calidad 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0088496 0.0000000 0.0000000 0.0000000 0.0088496 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
Cedis 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0530973 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
CEDIS 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0176991 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
Celdas 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0265487 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
CORTADORAS 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0088496 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
Costura 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0442478 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0088496 0.0000000 0.0088496 0.0000000 0.0000000
COSTURA 0.0000000 0.0088496 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
Costura T2 0.0000000 0.0000000 0.0000000 0.0088496 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
EHS 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0088496 0.0088496 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0088496 0.0000000
Embarques 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0265487 0.0088496 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
Externo 0.0000000 0.0000000 0.0088496 0.0000000 0.0000000 0.0088496 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
Limpieza 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0088496 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
Materiales 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0088496 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
Paileria 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0176991 0.0176991 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
Producci<f3>n Retorn 0.0000000 0.0265487 0.0000000 0.0000000 0.0088496 0.0088496 0.0353982 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0088496 0.0000000 0.0000000 0.0000000
Produccion Cart<f3>n MC 0.0176991 0.0000000 0.0176991 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0088496
Produccion Cart<f3>n MDL 0.0088496 0.0176991 0.0088496 0.0000000 0.0000000 0.0265487 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
Rotativa 0.0000000 0.0088496 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
Stabilus 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0619469 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
Troquel 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0353982 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000

En este caso se puede concluir que producción, costura, ayudante general son los puestos donde se otorga un salario diario mayor, en algunos casos se tiene la hipotesis de que es debido a una alta concentración de colaboradores en un rol especifico, sin embargo como se muestra en la tabla, los departamentos con mayores salarios diarios son los que tienen mayor demanda en terminos de capacitación y experiencia y por consiguiente se infiere que Form toma en cuenta la complejidad del labor para con base a ello proponer un salario diario especifico.

Tablas de frecuencia BAJAS

Tabla Motivo de baja - Genero

summary(baj)
##        X               EDAD       FECHA.NACIMIENTO      GENERO         
##  Min.   :  0.00   Min.   :19.00   Length:233         Length:233        
##  1st Qu.: 14.00   1st Qu.:23.00   Class :character   Class :character  
##  Median : 79.00   Median :29.00   Mode  :character   Mode  :character  
##  Mean   : 66.58   Mean   :31.08                                        
##  3rd Qu.: 97.00   3rd Qu.:37.00                                        
##  Max.   :147.00   Max.   :61.00                                        
##                                                                        
##      RFC              FECHA_ALTA         MOTIVO_BAJA        DIAS_LABORADOS   
##  Length:233         Min.   :2001-02-22   Length:233         Min.   :   0.00  
##  Class :character   1st Qu.:2010-06-22   Class :character   1st Qu.:   6.00  
##  Mode  :character   Median :2015-06-22   Mode  :character   Median :  15.00  
##                     Mean   :2015-12-07                      Mean   :  72.73  
##                     3rd Qu.:2021-12-21                      3rd Qu.:  47.00  
##                     Max.   :2031-05-21                      Max.   :1966.00  
##                                                                              
##    FECHA_BAJA            PUESTO             DEPTO.             SEGURO         
##  Min.   :2001-02-22   Length:233         Length:233         Length:233        
##  1st Qu.:2010-03-22   Class :character   Class :character   Class :character  
##  Median :2017-05-22   Mode  :character   Mode  :character   Mode  :character  
##  Mean   :2017-02-28                                                           
##  3rd Qu.:2024-11-22                                                           
##  Max.   :2031-01-22                                                           
##  NA's   :14                                                                   
##  SALARIO_DIARIO  LUGAR_NACIMIENTO       CURP              CALLE          
##  Min.   :144.4   Length:233         Length:233         Length:233        
##  1st Qu.:180.7   Class :character   Class :character   Class :character  
##  Median :180.7   Mode  :character   Mode  :character   Mode  :character  
##  Mean   :177.9                                                           
##  3rd Qu.:180.7                                                           
##  Max.   :500.0                                                           
##                                                                          
##  NUM_INTERNO          COLONIA          CODIGO_POST         MUNICIPIO        
##  Length:233         Length:233         Length:233         Length:233        
##  Class :character   Class :character   Class :character   Class :character  
##  Mode  :character   Mode  :character   Mode  :character   Mode  :character  
##                                                                             
##                                                                             
##                                                                             
##                                                                             
##      EDO             EDO_CIVIL             X.1           
##  Length:233         Length:233         Length:233        
##  Class :character   Class :character   Class :character  
##  Mode  :character   Mode  :character   Mode  :character  
##                                                          
##                                                          
##                                                          
## 
proportion <- prop.table(table(baj$MOTIVO_BAJA,baj$GENERO))
proportion %>%
  kbl() %>%
  kable_styling()
FEMENINO MASCULINO
ABANDONO 0.0000000 0.0042918
BAJA POR FALTAS 0.3776824 0.2188841
JUBILACION 0.0000000 0.0042918
RENUNCIA VOLUNTARIA 0.1845494 0.1759657
TERMINO DE CONTRATO 0.0257511 0.0085837

En este caso se puede identificar que el genero masculino en este caso tiende a darse de baja de la empresa mediante el abandono, jubilación y de manera casi equitativa por renuncia voluntria; mientras que las mujeres son dadas de baja por faltas, y terminación de contrato, lo cual puede darse a inferir que los hombres tienden a desarrollar sus ultimos años de labor en FORM (para el grupo de edad mayor) o bien al tratarse de jovenes, lo utilizan para ganar dinero de manera temporal.

Tabla Estado civil - Motivo de baja

proportion <- prop.table(table(baj$EDO_CIVIL,baj$MOTIVO_BAJA))
proportion %>%
  kbl() %>%
  kable_styling()
ABANDONO BAJA POR FALTAS JUBILACION RENUNCIA VOLUNTARIA TERMINO DE CONTRATO
divorcio 0.0000000 0.0085837 0.0000000 0.0042918 0.0000000
matrimonio 0.0000000 0.1802575 0.0042918 0.0815451 0.0042918
Sin Conocer 0.0000000 0.0000000 0.0000000 0.0042918 0.0000000
Soltero 0.0042918 0.2145923 0.0000000 0.2188841 0.0214592
Unión libre 0.0000000 0.1931330 0.0000000 0.0515021 0.0085837

Se considera que un hallazgo interesante es que por la tendencia observada en la tabla anterior, las personas solteras son quienes en definitiva salen de la empresa con mayor frecuencia, a diferencia de personas divorsiadas y/o casadas, quienes por razones de sustento familiar, existe menor tendencia de que un grupo de este tipo salga de la empresa.

Gráficos cualitativos/cuantitativos - Colaboradores

pie(prop.table(table(col$GENERO)),col=c("purple","green"),main="Genero", ylab ="Proporción",las=1)

Con el gráfico cualitativo anterior, se puede dar a cuenta de que como se mencionño anteriormente, el genero femenino tiene mayor presencia en la empresa y por consiguiente existe la hipotesis de que esta sea la razón por la cual se registran mayores pagos para las mujeres. Adicionalmente, se percibe que FORM es una empresa incluyente, ya que cuenta con tan solo una liger inclinacón hacia el genero femenino.

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

Con el histograma anterior, se puede dar a cuenta de que el salario diario con mayor concentración ronda entre los 150mxn y 200mxn, siendo el promedio un alrededor de 180mxn. Algo a notar es que existe un pequeño subgrupo donde se percibe un salario diario mayor, el cual se especula es el empleado con mayor antiguedad de la empresa o bien el director genral. Por otra parte, los demás grupos que rondan entre los 200mxn - $280 es probable que surjan debido a la antiguedad, el tipo de pueston y/o demás prestaciones/beneficios con los que cuenten estas personas.

Gen_salarioProm<-aggregate(SALARIO.DIARIO.IMSS ~ GENERO, data = col, mean)
Gen_salarioProm
##      GENERO SALARIO.DIARIO.IMSS
## 1  FEMENINO            179.5818
## 2 MASCULINO            178.4392

Como se puede reafirmar, el promedio de salario diario se encuentra dentro de la cantidad aproximada de 180 pesos; sin embargo se vuelve a reafirmar que las muejres tiene un pago ligeramente mayor que los hombres. para esto se propondría que los administradores de recursos humanos monitoreen las brechas salariales para identificar la causa raíz para que, en caso de ser injustificada, estas cantidades sean ajustadas para lograr una mayor igualdad salarial.

ggplot(Gen_salarioProm,aes(x=GENERO,y=SALARIO.DIARIO.IMSS,fill=SALARIO.DIARIO.IMSS, col="blue"))+
  geom_bar(stat="identity", col="blue")+
  labs(title="Promedio de Salario Femenino | Masculino")

En este caso, el principal insight que se puede apreciar es la relación entre el salario diario contra la proporcion existente de genero en Form. Adicionalmente, se puede corroborar que las mujeres ganan una cantidad ligeramente más alta de dinero que los hombres. # Gráficos cualitativos/cuantitativos - BAJAS

summary(baj)
##        X               EDAD       FECHA.NACIMIENTO      GENERO         
##  Min.   :  0.00   Min.   :19.00   Length:233         Length:233        
##  1st Qu.: 14.00   1st Qu.:23.00   Class :character   Class :character  
##  Median : 79.00   Median :29.00   Mode  :character   Mode  :character  
##  Mean   : 66.58   Mean   :31.08                                        
##  3rd Qu.: 97.00   3rd Qu.:37.00                                        
##  Max.   :147.00   Max.   :61.00                                        
##                                                                        
##      RFC              FECHA_ALTA         MOTIVO_BAJA        DIAS_LABORADOS   
##  Length:233         Min.   :2001-02-22   Length:233         Min.   :   0.00  
##  Class :character   1st Qu.:2010-06-22   Class :character   1st Qu.:   6.00  
##  Mode  :character   Median :2015-06-22   Mode  :character   Median :  15.00  
##                     Mean   :2015-12-07                      Mean   :  72.73  
##                     3rd Qu.:2021-12-21                      3rd Qu.:  47.00  
##                     Max.   :2031-05-21                      Max.   :1966.00  
##                                                                              
##    FECHA_BAJA            PUESTO             DEPTO.             SEGURO         
##  Min.   :2001-02-22   Length:233         Length:233         Length:233        
##  1st Qu.:2010-03-22   Class :character   Class :character   Class :character  
##  Median :2017-05-22   Mode  :character   Mode  :character   Mode  :character  
##  Mean   :2017-02-28                                                           
##  3rd Qu.:2024-11-22                                                           
##  Max.   :2031-01-22                                                           
##  NA's   :14                                                                   
##  SALARIO_DIARIO  LUGAR_NACIMIENTO       CURP              CALLE          
##  Min.   :144.4   Length:233         Length:233         Length:233        
##  1st Qu.:180.7   Class :character   Class :character   Class :character  
##  Median :180.7   Mode  :character   Mode  :character   Mode  :character  
##  Mean   :177.9                                                           
##  3rd Qu.:180.7                                                           
##  Max.   :500.0                                                           
##                                                                          
##  NUM_INTERNO          COLONIA          CODIGO_POST         MUNICIPIO        
##  Length:233         Length:233         Length:233         Length:233        
##  Class :character   Class :character   Class :character   Class :character  
##  Mode  :character   Mode  :character   Mode  :character   Mode  :character  
##                                                                             
##                                                                             
##                                                                             
##                                                                             
##      EDO             EDO_CIVIL             X.1           
##  Length:233         Length:233         Length:233        
##  Class :character   Class :character   Class :character  
##  Mode  :character   Mode  :character   Mode  :character  
##                                                          
##                                                          
##                                                          
## 
pie(prop.table(table(baj$EDO_CIVIL)),col=c("purple","green", "yellow", "blue"),main="Estado Civil", ylab ="Proporción",las=1)

Mediante esta grafica cualitativa, se puede sustentar que el estado civil más común presente en Form es soltería, seguido de matrimonio y unión libre respectivamente. De igual manera, podemos sustentar la hipotesis presentada con anterioridad, donde los solteros son los que salen de la empresa; por consiguiente y en parte debido a que no tienen respondabilidad con familiares y por que representan una alta concentración de la fuerza laboral de la empresa.

Histograma de días laborados

hist(baj$DIAS_LABORADOS, col="blue")

En este caso, se puede observar y recabar informacón complementaria para evaluar la cantidad de días que trabajan los colaboradores. En este caso existe la gram mayoría de la concentración de colaboradores que trabajan aproximadamente 200 días. Adicionalmente, las personas quienes han trabajado más días forman parte de una minoría bastante aislada; especialmente en el caso de aquellos que han trabajado más de 1500 - 2000 días, representando esto 10 veces más que la myoría.

tapply(baj$SALARIO_DIARIO,
       list(baj$GENERO,baj$EDO_CIVIL), mean)
##           divorcio matrimonio Sin Conocer  Soltero Unión libre
## FEMENINO    180.68   176.6727      180.68 175.6555    175.6382
## MASCULINO   180.68   180.2632          NA 182.6171    176.5580
hist(baj$EDAD, freq=TRUE, col='LightBlue', main="Histograma de grupos de edad",xlab="Edad en Años")

Mediante este histograma, se puede identificar que el grupo de edad predominante en Form es de 20 - 30 años, por lo que tomando en cuenta analisis anteriores, se puede probar la hipotesis de que aquellos que son solteros tienen mayor tendencia a salir de la empresa e inclusive a salir de manera “informarl” de la misma. Por otra parte, los grupos de edad menos comunes comienzan a partir de los 40 años en adelante; sin embargo tambien en esos grupos se integran los colaboradores que tienen más tiempo en la empresa.

Graficos de disperción COLABORADORES

Boxplot Colaboradores

boxplot(col$SALARIO.DIARIO.IMSS , vertical = TRUE)

Mediante este box plot, se puede identificar ue existe una fuerte concentración en lo que respecta el salario diario, mientras que aquellos que ganan menos o más que la mayoría, representan un grupo sumamente pequeño de personas. En este caso se puede inferir que aquellos que ganan más son parte del equipo administrativo y/o directivo.

Disperción colaboradores

plot(col$FECHA.DE.ALTA, col$SALARIO.DIARIO.IMSS, main = "Salario por antigüedad",
     xlab = "FECHA DE ALTA", ylab = "SALARIO",
     pch = 19, frame = FALSE)
## Warning in xy.coords(x, y, xlabel, ylabel, log): NAs introduced by coercion

Con este grafico de disperción, se puede sustentar que Form aumenta el salario de aquellos que llevan más tiempo en la organización, ya que observamos la agrupación de puntos ligeramente arriba que la mayoría, significando esto un aumento en salario a traves del tiempo.

Graficos de disperción BAJAS - Días laborados

summary(baj)
##        X               EDAD       FECHA.NACIMIENTO      GENERO         
##  Min.   :  0.00   Min.   :19.00   Length:233         Length:233        
##  1st Qu.: 14.00   1st Qu.:23.00   Class :character   Class :character  
##  Median : 79.00   Median :29.00   Mode  :character   Mode  :character  
##  Mean   : 66.58   Mean   :31.08                                        
##  3rd Qu.: 97.00   3rd Qu.:37.00                                        
##  Max.   :147.00   Max.   :61.00                                        
##                                                                        
##      RFC              FECHA_ALTA         MOTIVO_BAJA        DIAS_LABORADOS   
##  Length:233         Min.   :2001-02-22   Length:233         Min.   :   0.00  
##  Class :character   1st Qu.:2010-06-22   Class :character   1st Qu.:   6.00  
##  Mode  :character   Median :2015-06-22   Mode  :character   Median :  15.00  
##                     Mean   :2015-12-07                      Mean   :  72.73  
##                     3rd Qu.:2021-12-21                      3rd Qu.:  47.00  
##                     Max.   :2031-05-21                      Max.   :1966.00  
##                                                                              
##    FECHA_BAJA            PUESTO             DEPTO.             SEGURO         
##  Min.   :2001-02-22   Length:233         Length:233         Length:233        
##  1st Qu.:2010-03-22   Class :character   Class :character   Class :character  
##  Median :2017-05-22   Mode  :character   Mode  :character   Mode  :character  
##  Mean   :2017-02-28                                                           
##  3rd Qu.:2024-11-22                                                           
##  Max.   :2031-01-22                                                           
##  NA's   :14                                                                   
##  SALARIO_DIARIO  LUGAR_NACIMIENTO       CURP              CALLE          
##  Min.   :144.4   Length:233         Length:233         Length:233        
##  1st Qu.:180.7   Class :character   Class :character   Class :character  
##  Median :180.7   Mode  :character   Mode  :character   Mode  :character  
##  Mean   :177.9                                                           
##  3rd Qu.:180.7                                                           
##  Max.   :500.0                                                           
##                                                                          
##  NUM_INTERNO          COLONIA          CODIGO_POST         MUNICIPIO        
##  Length:233         Length:233         Length:233         Length:233        
##  Class :character   Class :character   Class :character   Class :character  
##  Mode  :character   Mode  :character   Mode  :character   Mode  :character  
##                                                                             
##                                                                             
##                                                                             
##                                                                             
##      EDO             EDO_CIVIL             X.1           
##  Length:233         Length:233         Length:233        
##  Class :character   Class :character   Class :character  
##  Mode  :character   Mode  :character   Mode  :character  
##                                                          
##                                                          
##                                                          
## 
boxplot(baj$DIAS_LABORADOS , vertical = TRUE)

En este caso, de nueva cuenta se puede visualizar que la mayoría de colaboradores realmente no llevan ni 1 año con su contrato laboral activo en la organización, donde en cambio, se detalla que existen pocas personas con un alto numero de días laborados.

Disperción bajas

plot(baj$DIAS_LABORADOS, baj$SALARIO_DIARIO, main = "Sueldo por días totales laborados",
     xlab = "Días laborados", ylab = "Sueldo",
     pch = 19, frame = FALSE)

En este caso se observa dependiendo del puesto que se desempeñe dentro de Form existe una diferencia en el salario diario, sin embargo, es valido recalcar que hay posiciones dentro de la empresa con pagos mayores, quienes probablemente sea el equipo directivo o el dueño.

Tabla de estadisticos (media, mediana, moda, desviación estándar) | COLABORADORES

summary(col)
##   Num_empleado    FECHA.DE.NACIMIENTO    GENERO              RFC           
##  Min.   :  0.00   Length:113          Length:113         Length:113        
##  1st Qu.:  8.00   Class :character    Class :character   Class :character  
##  Median : 38.00   Mode  :character    Mode  :character   Mode  :character  
##  Mean   : 46.31                                                            
##  3rd Qu.: 72.00                                                            
##  Max.   :148.00                                                            
##  FECHA.DE.ALTA       Primer.mes          X4to.mes            PUESTO         
##  Length:113         Length:113         Length:113         Length:113        
##  Class :character   Class :character   Class :character   Class :character  
##  Mode  :character   Mode  :character   Mode  :character   Mode  :character  
##                                                                             
##                                                                             
##                                                                             
##  DEPARTAMENTO       NO.SEGURO.SOCIAL   SALARIO.DIARIO.IMSS   COLONIA         
##  Length:113         Length:113         Min.   :144.4       Length:113        
##  Class :character   Class :character   1st Qu.:176.7       Class :character  
##  Mode  :character   Mode  :character   Median :180.7       Mode  :character  
##                                        Mean   :179.1                         
##                                        3rd Qu.:180.7                         
##                                        Max.   :337.1                         
##   MUNICIPIO            ESTADO         
##  Length:113         Length:113        
##  Class :character   Class :character  
##  Mode  :character   Mode  :character  
##                                       
##                                       
## 
mea2 <- mean(col$Num_empleado)
med2 <- median(col$Num_empleado)
moda2<- mfv(col$Num_empleado)
sd2 <- sd(col$Num_empleado, na.rm = TRUE)
mea3 <- mean(col$FECHA.DE.NACIMIENTO)
## Warning in mean.default(col$FECHA.DE.NACIMIENTO): argument is not numeric or
## logical: returning NA
med3 <- median(col$FECHA.DE.NACIMIENTO)
moda3 <- mfv(col$FECHA.DE.NACIMIENTO)
sd3 <- sd(col$FECHA.DE.NACIMIENTO, na.rm = TRUE)
## Warning in var(if (is.vector(x) || is.factor(x)) x else as.double(x), na.rm =
## na.rm): NAs introduced by coercion
mea4 <- mean(col$GENERO)
## Warning in mean.default(col$GENERO): argument is not numeric or logical:
## returning NA
med4 <- median(col$GENERO)
moda4 <- mfv(col$genero)
sd4 <- sd(col$GENERO, na.rm = TRUE)
## Warning in var(if (is.vector(x) || is.factor(x)) x else as.double(x), na.rm =
## na.rm): NAs introduced by coercion
mea5 <- mean(col$FECHA.DE.ALTA)
## Warning in mean.default(col$FECHA.DE.ALTA): argument is not numeric or logical:
## returning NA
med5 <- median(col$FECHA.DE.ALTA)
moda5 <- mfv(col$FECHA.DE.ALTA)
sd5 <- sd(baj$numero, na.rm = TRUE)
Variables <-c("Num_empleado","Fecha_naci", "Genero", "Fecha_Alta")
Media <-c(mea2,mea3,mea4,mea5)
Mediana <-c(med2,med3,med4,med5)
Moda <-c(moda2,moda3,moda4,moda5)
Desviacion <-c(sd2,sd3,sd4,sd5)
tabla2 <-data.frame(Variables, Media, Mediana, Moda, Desviacion)
knitr::kable(tabla2)
Variables Media Mediana Moda Desviacion
Num_empleado 46.30973 38 0 42.3999
Fecha_naci NA 11/30/1968 01/04/67 NA
Genero NA FEMENINO 01/06/04 NA
Fecha_Alta NA 44621 01/08/82 NA
Num_empleado 46.30973 38 01/11/02 42.3999
Fecha_naci NA 11/30/1968 01/11/92 NA
Genero NA FEMENINO 02/03/78 NA
Fecha_Alta NA 44621 02/04/76 NA
Num_empleado 46.30973 38 03/07/77 42.3999
Fecha_naci NA 11/30/1968 03/12/02 NA
Genero NA FEMENINO 04/01/03 NA
Fecha_Alta NA 44621 04/07/93 NA
Num_empleado 46.30973 38 05/01/00 42.3999
Fecha_naci NA 11/30/1968 05/01/90 NA
Genero NA FEMENINO 05/05/77 NA
Fecha_Alta NA 44621 05/06/64 NA
Num_empleado 46.30973 38 06/02/82 42.3999
Fecha_naci NA 11/30/1968 06/03/73 NA
Genero NA FEMENINO 06/09/84 NA
Fecha_Alta NA 44621 06/11/03 NA
Num_empleado 46.30973 38 06/11/89 42.3999
Fecha_naci NA 11/30/1968 07/01/67 NA
Genero NA FEMENINO 07/07/66 NA
Fecha_Alta NA 44621 08/04/00 NA
Num_empleado 46.30973 38 08/10/94 42.3999
Fecha_naci NA 11/30/1968 08/11/01 NA
Genero NA FEMENINO 08/12/82 NA
Fecha_Alta NA 44621 08/12/99 NA
Num_empleado 46.30973 38 09/04/93 42.3999
Fecha_naci NA 11/30/1968 09/05/85 NA
Genero NA FEMENINO 09/06/65 NA
Fecha_Alta NA 44621 09/10/55 NA
Num_empleado 46.30973 38 1/16/1996 42.3999
Fecha_naci NA 11/30/1968 1/20/2003 NA
Genero NA FEMENINO 1/21/2002 NA
Fecha_Alta NA 44621 1/22/1972 NA
Num_empleado 46.30973 38 1/22/1997 42.3999
Fecha_naci NA 11/30/1968 10/02/74 NA
Genero NA FEMENINO 10/02/94 NA
Fecha_Alta NA 44621 10/17/1987 NA
Num_empleado 46.30973 38 10/19/1962 42.3999
Fecha_naci NA 11/30/1968 10/22/2001 NA
Genero NA FEMENINO 10/23/1996 NA
Fecha_Alta NA 44621 10/23/2002 NA
Num_empleado 46.30973 38 10/25/2001 42.3999
Fecha_naci NA 11/30/1968 10/28/1990 NA
Genero NA FEMENINO 10/31/1967 NA
Fecha_Alta NA 44621 11/03/84 NA
Num_empleado 46.30973 38 11/03/95 42.3999
Fecha_naci NA 11/30/1968 11/10/02 NA
Genero NA FEMENINO 11/11/69 NA
Fecha_Alta NA 44621 11/15/1971 NA
Num_empleado 46.30973 38 11/20/1997 42.3999
Fecha_naci NA 11/30/1968 11/21/1949 NA
Genero NA FEMENINO 11/22/1999 NA
Fecha_Alta NA 44621 11/22/2002 NA
Num_empleado 46.30973 38 11/30/1965 42.3999
Fecha_naci NA 11/30/1968 11/30/1968 NA
Genero NA FEMENINO 12/10/96 NA
Fecha_Alta NA 44621 12/12/80 NA
Num_empleado 46.30973 38 12/16/1979 42.3999
Fecha_naci NA 11/30/1968 12/16/1987 NA
Genero NA FEMENINO 12/17/1994 NA
Fecha_Alta NA 44621 12/23/1994 NA
Num_empleado 46.30973 38 12/24/1981 42.3999
Fecha_naci NA 11/30/1968 12/24/1990 NA
Genero NA FEMENINO 12/26/1966 NA
Fecha_Alta NA 44621 12/28/1996 NA
Num_empleado 46.30973 38 12/30/1992 42.3999
Fecha_naci NA 11/30/1968 2/13/1973 NA
Genero NA FEMENINO 2/14/2003 NA
Fecha_Alta NA 44621 2/18/1983 NA
Num_empleado 46.30973 38 2/21/1969 42.3999
Fecha_naci NA 11/30/1968 2/23/1988 NA
Genero NA FEMENINO 2/23/2022 NA
Fecha_Alta NA 44621 2/26/1990 NA
Num_empleado 46.30973 38 2/26/1993 42.3999
Fecha_naci NA 11/30/1968 2/27/1978 NA
Genero NA FEMENINO 3/18/2001 NA
Fecha_Alta NA 44621 3/18/2003 NA
Num_empleado 46.30973 38 3/19/1962 42.3999
Fecha_naci NA 11/30/1968 3/24/1981 NA
Genero NA FEMENINO 4/18/1984 NA
Fecha_Alta NA 44621 5/14/1979 NA
Num_empleado 46.30973 38 5/14/1997 42.3999
Fecha_naci NA 11/30/1968 5/19/1997 NA
Genero NA FEMENINO 5/24/1989 NA
Fecha_Alta NA 44621 5/27/1999 NA
Num_empleado 46.30973 38 5/30/1984 42.3999
Fecha_naci NA 11/30/1968 5/31/1992 NA
Genero NA FEMENINO 6/21/1989 NA
Fecha_Alta NA 44621 6/21/1994 NA
Num_empleado 46.30973 38 6/22/1984 42.3999
Fecha_naci NA 11/30/1968 6/22/1993 NA
Genero NA FEMENINO 6/24/1977 NA
Fecha_Alta NA 44621 6/24/1990 NA
Num_empleado 46.30973 38 6/27/1969 42.3999
Fecha_naci NA 11/30/1968 6/29/1969 NA
Genero NA FEMENINO 7/13/1998 NA
Fecha_Alta NA 44621 7/16/1982 NA
Num_empleado 46.30973 38 7/19/1993 42.3999
Fecha_naci NA 11/30/1968 7/25/2001 NA
Genero NA FEMENINO 7/31/1990 NA
Fecha_Alta NA 44621 8/18/1985 NA
Num_empleado 46.30973 38 8/19/1984 42.3999
Fecha_naci NA 11/30/1968 8/25/1988 NA
Genero NA FEMENINO 8/28/1963 NA
Fecha_Alta NA 44621 9/15/1995 NA
Num_empleado 46.30973 38 9/18/1972 42.3999
Fecha_naci NA 11/30/1968 9/19/1987 NA
Genero NA FEMENINO 9/22/1969 NA
Fecha_Alta NA 44621 9/22/1988 NA
Num_empleado 46.30973 38 9/29/1976 42.3999
Fecha_naci NA 11/30/1968 9/30/1999 NA
Genero NA FEMENINO NaN NA
Fecha_Alta NA 44621 6/14/2022 NA

En este caso, se considera que los datos mas relevantes son: Mediante la media, se pudo comprobar que las mujeres tienen mayor presencia en la empresa. Por otra parte, la fecha de nacimiento promedio de los colaboradores es en 1992. Por consiguiente, se pretende pintar un perfil de colaborador que pertenece al grupo generacional Milenial.

Tabla de estadisticos (media, mediana, moda, desviación estándar) | BAJAS

summary(baj)
##        X               EDAD       FECHA.NACIMIENTO      GENERO         
##  Min.   :  0.00   Min.   :19.00   Length:233         Length:233        
##  1st Qu.: 14.00   1st Qu.:23.00   Class :character   Class :character  
##  Median : 79.00   Median :29.00   Mode  :character   Mode  :character  
##  Mean   : 66.58   Mean   :31.08                                        
##  3rd Qu.: 97.00   3rd Qu.:37.00                                        
##  Max.   :147.00   Max.   :61.00                                        
##                                                                        
##      RFC              FECHA_ALTA         MOTIVO_BAJA        DIAS_LABORADOS   
##  Length:233         Min.   :2001-02-22   Length:233         Min.   :   0.00  
##  Class :character   1st Qu.:2010-06-22   Class :character   1st Qu.:   6.00  
##  Mode  :character   Median :2015-06-22   Mode  :character   Median :  15.00  
##                     Mean   :2015-12-07                      Mean   :  72.73  
##                     3rd Qu.:2021-12-21                      3rd Qu.:  47.00  
##                     Max.   :2031-05-21                      Max.   :1966.00  
##                                                                              
##    FECHA_BAJA            PUESTO             DEPTO.             SEGURO         
##  Min.   :2001-02-22   Length:233         Length:233         Length:233        
##  1st Qu.:2010-03-22   Class :character   Class :character   Class :character  
##  Median :2017-05-22   Mode  :character   Mode  :character   Mode  :character  
##  Mean   :2017-02-28                                                           
##  3rd Qu.:2024-11-22                                                           
##  Max.   :2031-01-22                                                           
##  NA's   :14                                                                   
##  SALARIO_DIARIO  LUGAR_NACIMIENTO       CURP              CALLE          
##  Min.   :144.4   Length:233         Length:233         Length:233        
##  1st Qu.:180.7   Class :character   Class :character   Class :character  
##  Median :180.7   Mode  :character   Mode  :character   Mode  :character  
##  Mean   :177.9                                                           
##  3rd Qu.:180.7                                                           
##  Max.   :500.0                                                           
##                                                                          
##  NUM_INTERNO          COLONIA          CODIGO_POST         MUNICIPIO        
##  Length:233         Length:233         Length:233         Length:233        
##  Class :character   Class :character   Class :character   Class :character  
##  Mode  :character   Mode  :character   Mode  :character   Mode  :character  
##                                                                             
##                                                                             
##                                                                             
##                                                                             
##      EDO             EDO_CIVIL             X.1           
##  Length:233         Length:233         Length:233        
##  Class :character   Class :character   Class :character  
##  Mode  :character   Mode  :character   Mode  :character  
##                                                          
##                                                          
##                                                          
## 
mea2 <- mean(baj$EDAD)
med2 <- median(baj$EDAD)
moda2<- mfv(baj$EDAD)
sd2 <- sd(baj$EDAD, na.rm = TRUE)
mea3 <- mean(baj$DIAS_LABORADOS)
med3 <- median(baj$DIAS_LABORADOS)
moda3 <- mfv(baj$DIAS_LABORADOS)
sd3 <- sd(baj$DIAS_LABORADOS, na.rm = TRUE)
mea4 <- mean(baj$EDO_CIVIL)
## Warning in mean.default(baj$EDO_CIVIL): argument is not numeric or logical:
## returning NA
med4 <- median(baj$EDO_CIVIL)
moda4 <- mfv(baj$EDO_CIVIL)
sd4 <- sd(baj$EDO_CIVIL, na.rm = TRUE)
## Warning in var(if (is.vector(x) || is.factor(x)) x else as.double(x), na.rm =
## na.rm): NAs introduced by coercion
mea5 <- mean(baj$SALARIO_DIARIO)
med5 <- median(baj$SALARIO_DIARIO)
moda5 <- mfv(baj$SALARIO_DIARIO)
sd5 <- sd(baj$numero, na.rm = TRUE)
Variables <-c("Edad","Dias laborados", "Estado Civil", "Salario Diario")
Media <-c(mea2,mea3,mea4,mea5)
Mediana <-c(med2,med3,med4,med5)
Moda <-c(moda2,moda3,moda4,moda5)
Desviacion <-c(sd2,sd3,sd4,sd5)
tabla2 <-data.frame(Variables, Media, Mediana, Moda, Desviacion)
knitr::kable(tabla2)
Variables Media Mediana Moda Desviacion
Edad 31.08155 29 22 9.643081
Dias laborados 72.72961 15 0 216.267474
Estado Civil NA Soltero Soltero NA
Salario Diario 177.92768 180.68 180.68 NA

En este caso se puede demostrar que El promedio de un colaborador(a) en Form es una persona soltera de 31 años que trabajó al rededor de 2 meses ganando aproximadamente 180mxn diarios

Graficos adicionales

Barplot COLABORADORES

col <- read.csv("/Users/carlosgonzalez/Desktop/Colab_recursoshumanos.csv")
summary(col)
##   Num_empleado    FECHA.DE.NACIMIENTO    GENERO              RFC           
##  Min.   :  1.00   Length:113          Length:113         Length:113        
##  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   :21                                                                
##  FECHA.DE.ALTA       Primer.mes          X4to.mes            PUESTO         
##  Length:113         Length:113         Length:113         Length:113        
##  Class :character   Class :character   Class :character   Class :character  
##  Mode  :character   Mode  :character   Mode  :character   Mode  :character  
##                                                                             
##                                                                             
##                                                                             
##                                                                             
##  DEPARTAMENTO       NO.SEGURO.SOCIAL   SALARIO.DIARIO.IMSS   COLONIA         
##  Length:113         Length:113         Min.   :144.4       Length:113        
##  Class :character   Class :character   1st Qu.:176.7       Class :character  
##  Mode  :character   Mode  :character   Median :180.7       Mode  :character  
##                                        Mean   :179.1                         
##                                        3rd Qu.:180.7                         
##                                        Max.   :337.1                         
##                                                                              
##   MUNICIPIO            ESTADO         
##  Length:113         Length:113        
##  Class :character   Class :character  
##  Mode  :character   Mode  :character  
##                                       
##                                       
##                                       
## 
ggplot(col, aes(factor(`GENERO`), fill = factor(`SALARIO.DIARIO.IMSS`))) +
  geom_bar(position = position_dodge2(preserve = "single"))

Mediante este grafico, se puede especificar el salario fijo de las personas que ganan más. En este caso efectivamente, las mujeres ganan más en el puesto que genera $180.68 mientras que el puesto que genera una menor cantidad tiene mayor participación por parte de hombres. En pocas palabras, se puede inferir que las muejres están en puestos que generan más ingresos, mientras que los hombres están presentes en donde se genera una cantidad menor.

Barplot BAJAS

summary(baj)
##        X               EDAD       FECHA.NACIMIENTO      GENERO         
##  Min.   :  0.00   Min.   :19.00   Length:233         Length:233        
##  1st Qu.: 14.00   1st Qu.:23.00   Class :character   Class :character  
##  Median : 79.00   Median :29.00   Mode  :character   Mode  :character  
##  Mean   : 66.58   Mean   :31.08                                        
##  3rd Qu.: 97.00   3rd Qu.:37.00                                        
##  Max.   :147.00   Max.   :61.00                                        
##                                                                        
##      RFC              FECHA_ALTA         MOTIVO_BAJA        DIAS_LABORADOS   
##  Length:233         Min.   :2001-02-22   Length:233         Min.   :   0.00  
##  Class :character   1st Qu.:2010-06-22   Class :character   1st Qu.:   6.00  
##  Mode  :character   Median :2015-06-22   Mode  :character   Median :  15.00  
##                     Mean   :2015-12-07                      Mean   :  72.73  
##                     3rd Qu.:2021-12-21                      3rd Qu.:  47.00  
##                     Max.   :2031-05-21                      Max.   :1966.00  
##                                                                              
##    FECHA_BAJA            PUESTO             DEPTO.             SEGURO         
##  Min.   :2001-02-22   Length:233         Length:233         Length:233        
##  1st Qu.:2010-03-22   Class :character   Class :character   Class :character  
##  Median :2017-05-22   Mode  :character   Mode  :character   Mode  :character  
##  Mean   :2017-02-28                                                           
##  3rd Qu.:2024-11-22                                                           
##  Max.   :2031-01-22                                                           
##  NA's   :14                                                                   
##  SALARIO_DIARIO  LUGAR_NACIMIENTO       CURP              CALLE          
##  Min.   :144.4   Length:233         Length:233         Length:233        
##  1st Qu.:180.7   Class :character   Class :character   Class :character  
##  Median :180.7   Mode  :character   Mode  :character   Mode  :character  
##  Mean   :177.9                                                           
##  3rd Qu.:180.7                                                           
##  Max.   :500.0                                                           
##                                                                          
##  NUM_INTERNO          COLONIA          CODIGO_POST         MUNICIPIO        
##  Length:233         Length:233         Length:233         Length:233        
##  Class :character   Class :character   Class :character   Class :character  
##  Mode  :character   Mode  :character   Mode  :character   Mode  :character  
##                                                                             
##                                                                             
##                                                                             
##                                                                             
##      EDO             EDO_CIVIL             X.1           
##  Length:233         Length:233         Length:233        
##  Class :character   Class :character   Class :character  
##  Mode  :character   Mode  :character   Mode  :character  
##                                                          
##                                                          
##                                                          
## 
ggplot(baj, aes(factor(`MOTIVO_BAJA`), fill = factor(`GENERO`))) +
  geom_bar(position = position_dodge2(preserve = "single"))

En este caso, se puede dar a cuenta de que las mujeres cuentan con mayor numero de bajas al simplemente dejar de venir la cantidad de veces semanales que indica su cintrato, mientras que los hombres se van por abandono, jubilaciñon y por renuncia voluntaria.

Dispercion plots (presentados anteriormente)

Time series plot (lineplot, heatmap)

plot(col$FECHA.DE.ALTA, xlab = "Fecha de alta en FORM", ylab = " ")
## Warning in xy.coords(x, y, xlabel, ylabel, log): NAs introduced by coercion

#polygon(col$FECHA.DE.ALTA, col="green", border="black")

Para esta grafica, se puede inferir que Form tiene contrataciones constantes y durante todo el año, es decir, a diferencia de las organizaciones tradicionales quienes contratan especialmente durante el ultimo cuarto del año y principios del siguiente año, form constantemente contrata. Por otra parte, así como hay contrataciones, hay dadas de baja y por consiguiente se entiende la estrategia de reclutamiento de Form, donde debe mantener un flujo constante de personal en función con las bajas que se tienen.

Grafica de PIE del genero

pie(table(baj$GENERO))

Finalmente, se tiene que se tienen más colaboradores de genero femenino, mientras que el masculino, debido a que son quienes generan la mayoría de las bajas y por consiguiente mayor rotación; las mujeres tienden a estar más tiempo y desemepeñar labores con mayor nivel de complejidad y por consiguiente estñan mayor tiempo en la empresa.

Delivery Plan

#file.choose()
dplan <- read.csv("/Users/carlosgonzalez/Desktop/Delivery Plan BD FINAL.csv")

Entender base de datos

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

Limpieza de base de datos

Método #1 Realizar un pivote con la finalidad de unir los pedidos programados en una sola columna. Adicionalmente, con este método se pretende que las variables se arreglen de manera alfabética para facilitar el entendimiento y comprención de las gráficas.

library(tidyr)
dplan <- clean_names(dplan)
dplan <- dplan %>% dplyr::rename(cliente=cliente_planta,
                             A_jun_21=junio,
                             B_jul_21=julio,
                             C_ago_21=agosto,
                             D_sep_21=septiembre,
                             E_oct_21=octubre,
                             F_nov_21=noviembre,
                             G_dic_21=diciembre,
                             H_ene_22=ene_22,
                             I_feb_22=feb_22,
                            J_mar_22=mar_22,
                            K_abr_22=abr_22,
                            L_may_22=may_22,
                            M_jun_22=jun_22,
                            N_jul_22=jul_22,
                            O_ago_22=ago_22,
                            P_sep_22=sep_22,
                            Q_oct_22=octubre_22,
                            R_nov_22=nov_22,
                            S_dic_22=dic_22,
                            T_ene_23=ene_23,
                            U_feb_23=feb_23,
                            V_mar_23=feb_23
                          
                           )

colnames(dplan)
##  [1] "cliente"     "proyecto"    "id_odoo"     "item"        "A_jun_21"   
##  [6] "B_jul_21"    "C_ago_21"    "D_sep_21"    "E_oct_21"    "F_nov_21"   
## [11] "G_dic_21"    "H_ene_22"    "I_feb_22"    "J_mar_22"    "K_abr_22"   
## [16] "L_may_22"    "M_jun_22"    "N_jul_22"    "O_ago_22"    "P_sep_22"   
## [21] "Q_oct_22"    "R_nov_22"    "S_dic_22"    "T_ene_23"    "V_mar_23"   
## [26] "mar_23"      "total_meses"
dplan <- pivot_longer(dplan, cols=5:14, names_to = "Mes", values_to = "Unidades")

str(dplan)
## tibble [2,310 × 19] (S3: tbl_df/tbl/data.frame)
##  $ cliente    : chr [1:2310] "STB3" "STB3" "STB3" "STB3" ...
##  $ proyecto   : chr [1:2310] "CANASTILLA GRIS" "CANASTILLA GRIS" "CANASTILLA GRIS" "CANASTILLA GRIS" ...
##  $ id_odoo    : chr [1:2310] "15.785" "15.785" "15.785" "15.785" ...
##  $ item       : chr [1:2310] "CABLE SET CAJA BACK UP CANASTILLA" "CABLE SET CAJA BACK UP CANASTILLA" "CABLE SET CAJA BACK UP CANASTILLA" "CABLE SET CAJA BACK UP CANASTILLA" ...
##  $ K_abr_22   : int [1:2310] 0 0 0 0 0 0 0 0 0 0 ...
##  $ L_may_22   : int [1:2310] 0 0 0 0 0 0 0 0 0 0 ...
##  $ M_jun_22   : int [1:2310] 200 200 200 200 200 200 200 200 200 200 ...
##  $ N_jul_22   : int [1:2310] 900 900 900 900 900 900 900 900 900 900 ...
##  $ O_ago_22   : int [1:2310] 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 ...
##  $ P_sep_22   : int [1:2310] 0 0 0 0 0 0 0 0 0 0 ...
##  $ Q_oct_22   : int [1:2310] 0 0 0 0 0 0 0 0 0 0 ...
##  $ R_nov_22   : int [1:2310] 0 0 0 0 0 0 0 0 0 0 ...
##  $ S_dic_22   : int [1:2310] 0 0 0 0 0 0 0 0 0 0 ...
##  $ T_ene_23   : int [1:2310] 0 0 0 0 0 0 0 0 0 0 ...
##  $ V_mar_23   : int [1:2310] 0 0 0 0 0 0 0 0 0 0 ...
##  $ mar_23     : int [1:2310] 0 0 0 0 0 0 0 0 0 0 ...
##  $ total_meses: int [1:2310] 3850 3850 3850 3850 3850 3850 3850 3850 3850 3850 ...
##  $ Mes        : chr [1:2310] "A_jun_21" "B_jul_21" "C_ago_21" "D_sep_21" ...
##  $ Unidades   : int [1:2310] 0 140 530 0 200 0 150 230 500 0 ...

Método de limpieza #2: Remover ceros de la base de datos

dplan1 <- filter(dplan, Unidades>0)

Método de limpieza #3: Eliminar variables innecesarias. Para esto se plantea dejar unicamente las variables más importantes tales como Cliente, Mes y unidades. Con dichas variables se podrán realizar distintos analisis los cuales serán de utilidad para realizar propuestas de alto impacto para la organización y su competitividad a largo plazo.

dplan2 <- dplan1         
dplan2 <- subset (dplan1, select = -c (proyecto, id_odoo, item, K_abr_22, L_may_22, M_jun_22,N_jul_22,O_ago_22, P_sep_22, Q_oct_22, R_nov_22,  S_dic_22, T_ene_23, V_mar_23, mar_23, total_meses))
summary(dplan2)
##    cliente              Mes               Unidades      
##  Length:590         Length:590         Min.   :    1.0  
##  Class :character   Class :character   1st Qu.:   30.0  
##  Mode  :character   Mode  :character   Median :   80.0  
##                                        Mean   :  358.4  
##                                        3rd Qu.:  300.0  
##                                        Max.   :13120.0

Entender la base de datos mediante variables y registros

describe(dplan2)
## # A tibble: 1 × 26
##   described_…¹     n    na  mean    sd se_mean   IQR skewn…² kurto…³   p00   p01
##   <chr>        <int> <int> <dbl> <dbl>   <dbl> <dbl>   <dbl>   <dbl> <dbl> <dbl>
## 1 Unidades       590     0  358. 1003.    41.3   270    7.51    73.0     1     1
## # … with 15 more variables: p05 <dbl>, p10 <dbl>, p20 <dbl>, p25 <dbl>,
## #   p30 <dbl>, p40 <dbl>, p50 <dbl>, p60 <dbl>, p70 <dbl>, p75 <dbl>,
## #   p80 <dbl>, p90 <dbl>, p95 <dbl>, p99 <dbl>, p100 <dbl>, and abbreviated
## #   variable names ¹​described_variables, ²​skewness, ³​kurtosis
str(dplan2)
## tibble [590 × 3] (S3: tbl_df/tbl/data.frame)
##  $ cliente : chr [1:590] "STB3" "STB3" "STB3" "STB3" ...
##  $ Mes     : chr [1:590] "B_jul_21" "C_ago_21" "E_oct_21" "G_dic_21" ...
##  $ Unidades: int [1:590] 140 530 200 150 230 500 184 125 55 55 ...

Se encuentran 3 variables con 590 registros respectivamente

Vari <- c("`Cliente`","`Mes`","`Unidades`")
Type <- c("cualitativo (discreto)", "cualitativo (discreto)", "cuantitativo (nominal)")
Scales <- c("razón", "ordinal", "nominal")
table<-(data.frame(Vari, Type, Scales))
knitr::kable(table)
Vari Type Scales
Cliente cualitativo (discreto) razón
Mes cualitativo (discreto) ordinal
Unidades cuantitativo (nominal) nominal

Tabla de Frecuencia

summary(dplan2)
##    cliente              Mes               Unidades      
##  Length:590         Length:590         Min.   :    1.0  
##  Class :character   Class :character   1st Qu.:   30.0  
##  Mode  :character   Mode  :character   Median :   80.0  
##                                        Mean   :  358.4  
##                                        3rd Qu.:  300.0  
##                                        Max.   :13120.0

Unidades por Cliente

proportion <- prop.table(table(dplan2$Unidades,dplan2$cliente))
proportion %>%
  kbl() %>%
  kable_styling()
ABC QUERETARO ANTOLIN TOLUCA DENSO HELLA INOAC POLYTEC ISRI MERIDIAN SEGROVE STB 1 STB3 STB4 STB5 STB6 STB8 STB9 TRMX UFI VARROC YANFENG sm YF QRO YF RAMOS YFCF YFTO
1 0.0000000 0.0000000 0.0084746 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0033898 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0033898 0.0000000
2 0.0000000 0.0000000 0.0033898 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0050847 0.0000000 0.0000000 0.0000000 0.0067797 0.0000000
3 0.0000000 0.0000000 0.0033898 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0050847 0.0000000
4 0.0000000 0.0000000 0.0016949 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0016949 0.0050847 0.0000000 0.0000000 0.0033898 0.0016949
5 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0016949 0.0000000 0.0000000 0.0000000 0.0000000 0.0016949 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0033898 0.0000000 0.0000000 0.0000000 0.0016949 0.0000000
6 0.0000000 0.0000000 0.0016949 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0084746 0.0033898
7 0.0000000 0.0016949 0.0016949 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0016949 0.0000000 0.0000000 0.0000000 0.0000000 0.0016949 0.0000000
8 0.0016949 0.0000000 0.0016949 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0016949 0.0000000 0.0000000 0.0000000 0.0050847 0.0000000
9 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0016949 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0016949 0.0000000
10 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0016949 0.0000000 0.0000000 0.0000000 0.0016949 0.0000000 0.0135593 0.0000000 0.0000000 0.0016949 0.0016949 0.0000000
11 0.0000000 0.0000000 0.0000000 0.0000000 0.0016949 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0016949 0.0000000 0.0000000
12 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0169492 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
14 0.0000000 0.0000000 0.0016949 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0016949 0.0000000 0.0000000 0.0016949 0.0000000
15 0.0000000 0.0000000 0.0033898 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0016949 0.0000000 0.0067797 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
16 0.0000000 0.0000000 0.0016949 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0050847 0.0000000 0.0000000 0.0000000 0.0067797 0.0000000
18 0.0000000 0.0000000 0.0016949 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0016949 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
19 0.0000000 0.0000000 0.0016949 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
20 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0220339 0.0016949 0.0000000 0.0016949 0.0000000 0.0000000
21 0.0000000 0.0000000 0.0016949 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
22 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0016949 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
24 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0118644 0.0000000 0.0000000 0.0033898 0.0016949 0.0000000
25 0.0000000 0.0000000 0.0101695 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0016949 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
26 0.0000000 0.0000000 0.0016949 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0016949 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
27 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0016949 0.0000000 0.0000000
28 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0016949 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
30 0.0000000 0.0000000 0.0050847 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0050847 0.0033898 0.0152542 0.0000000 0.0000000 0.0016949 0.0000000 0.0000000
32 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0050847 0.0000000 0.0000000 0.0000000 0.0033898 0.0000000
33 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0016949 0.0000000 0.0000000
34 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0016949 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
35 0.0000000 0.0016949 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0050847 0.0000000 0.0000000 0.0016949 0.0000000 0.0000000
36 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0135593 0.0000000 0.0016949 0.0000000 0.0000000 0.0000000
39 0.0000000 0.0016949 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
40 0.0000000 0.0000000 0.0016949 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0135593 0.0016949 0.0000000 0.0016949 0.0016949 0.0000000
42 0.0000000 0.0000000 0.0016949 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
43 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0033898 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
44 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0016949 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
45 0.0000000 0.0016949 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0067797 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
46 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0016949 0.0000000
47 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0016949 0.0016949 0.0000000 0.0000000 0.0000000 0.0000000
48 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0135593 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
50 0.0000000 0.0000000 0.0067797 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0016949 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0067797 0.0000000 0.0050847 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
51 0.0000000 0.0000000 0.0016949 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
52 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0016949 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
55 0.0000000 0.0016949 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0033898 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0016949 0.0000000 0.0000000
56 0.0000000 0.0000000 0.0016949 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0067797 0.0016949 0.0000000 0.0000000 0.0016949 0.0000000
57 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0016949 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
58 0.0000000 0.0016949 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
60 0.0000000 0.0000000 0.0016949 0.0033898 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0288136 0.0000000 0.0000000 0.0084746 0.0000000 0.0000000
61 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0016949 0.0016949 0.0000000 0.0000000 0.0000000 0.0000000
62 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0016949 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
65 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0033898 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0016949 0.0000000 0.0000000
66 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0033898 0.0000000 0.0000000 0.0000000 0.0016949 0.0000000
67 0.0000000 0.0000000 0.0016949 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
70 0.0000000 0.0000000 0.0016949 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0033898 0.0016949 0.0033898 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
71 0.0000000 0.0000000 0.0016949 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0016949 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
72 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0118644 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
74 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0016949 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
75 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0016949 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0050847 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
76 0.0000000 0.0000000 0.0016949 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
80 0.0000000 0.0016949 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0067797 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
82 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0016949 0.0000000 0.0000000 0.0000000 0.0000000
83 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0016949 0.0000000 0.0000000 0.0000000 0.0000000
84 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0033898 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
85 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0016949 0.0000000 0.0000000
88 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0033898 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
90 0.0000000 0.0000000 0.0000000 0.0016949 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
91 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0016949 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
92 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0016949 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
96 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0084746 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
100 0.0000000 0.0000000 0.0016949 0.0033898 0.0000000 0.0000000 0.0016949 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0084746 0.0000000 0.0033898 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
101 0.0000000 0.0000000 0.0016949 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
104 0.0000000 0.0000000 0.0000000 0.0016949 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0016949 0.0000000 0.0000000 0.0000000 0.0000000
108 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0033898 0.0000000 0.0000000 0.0016949 0.0000000 0.0000000
114 0.0000000 0.0000000 0.0016949 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
120 0.0000000 0.0000000 0.0016949 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0033898 0.0084746 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
125 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0016949 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0016949 0.0000000 0.0000000
126 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0016949 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
128 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0033898 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
132 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0016949 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
136 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0016949 0.0000000
140 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0016949 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0033898 0.0000000 0.0000000 0.0016949 0.0000000 0.0000000
144 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0033898 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
149 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0016949 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
150 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0016949 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0016949 0.0000000 0.0050847 0.0000000 0.0000000 0.0016949 0.0000000 0.0000000
151 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0033898 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
152 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0016949 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
155 0.0000000 0.0016949 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0016949 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
157 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0016949 0.0000000
160 0.0000000 0.0000000 0.0016949 0.0033898 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0084746 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
162 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0033898 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
164 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0016949 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
165 0.0000000 0.0000000 0.0033898 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0016949 0.0000000 0.0000000 0.0000000 0.0016949 0.0000000
166 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0016949 0.0000000 0.0000000 0.0000000 0.0000000
167 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0016949 0.0000000 0.0000000
170 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0033898 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
172 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0016949 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
174 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0016949 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
180 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0050847 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
183 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0016949 0.0000000
184 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0016949 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
187 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0016949 0.0000000
190 0.0000000 0.0000000 0.0000000 0.0016949 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0016949 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
192 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0016949 0.0000000 0.0000000
195 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0016949 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
196 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0016949 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
198 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0016949 0.0000000 0.0000000 0.0000000 0.0000000
200 0.0000000 0.0000000 0.0016949 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0016949 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0016949 0.0000000 0.0067797 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
206 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0016949 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
208 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0016949 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
210 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0016949 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
220 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0033898 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
222 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0016949 0.0000000
226 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0016949 0.0000000 0.0000000
230 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0016949 0.0000000 0.0000000 0.0016949 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
238 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0016949 0.0000000 0.0000000 0.0000000 0.0016949 0.0000000
239 0.0000000 0.0000000 0.0000000 0.0016949 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
240 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0016949 0.0000000 0.0101695 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
245 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0016949 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
246 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0033898 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
247 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0016949 0.0000000
250 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0016949 0.0000000 0.0084746 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
260 0.0000000 0.0000000 0.0000000 0.0016949 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
270 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0033898 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
280 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0016949 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
288 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0016949 0.0000000 0.0000000 0.0000000 0.0016949 0.0000000
300 0.0000000 0.0000000 0.0000000 0.0016949 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0016949 0.0000000 0.0118644 0.0000000 0.0084746 0.0000000 0.0000000 0.0016949 0.0016949 0.0000000
302 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0016949 0.0000000
308 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0016949 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
310 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0016949 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
320 0.0000000 0.0000000 0.0000000 0.0050847 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0016949 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
340 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0033898 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
344 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0016949 0.0000000
350 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0033898 0.0000000 0.0016949 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
355 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0016949 0.0000000 0.0016949 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
358 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0016949 0.0000000
360 0.0000000 0.0000000 0.0000000 0.0016949 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0016949 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
372 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0016949 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
378 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0016949 0.0000000
382 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0016949 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
390 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0033898 0.0000000 0.0000000 0.0000000 0.0016949 0.0000000
400 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0067797 0.0000000 0.0033898 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
409 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0016949 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
411 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0016949 0.0000000
420 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0033898 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
450 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0033898 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
455 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0016949 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
456 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0016949 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
463 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0016949 0.0000000 0.0000000
480 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0050847 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
485 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0016949 0.0000000
500 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0016949 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0067797 0.0000000 0.0016949 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
506 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0016949 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
509 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0016949 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
525 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0016949 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
526 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0016949 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
529 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0016949 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
530 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0016949 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
532 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0016949 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
540 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0050847 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
580 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0016949 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
600 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0050847 0.0000000 0.0016949 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
612 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0033898 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
640 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0033898 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
660 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0016949 0.0000000 0.0000000
690 0.0000000 0.0016949 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
700 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0016949 0.0000000 0.0033898 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
710 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0016949 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
736 0.0000000 0.0000000 0.0016949 0.0000000 0.0000000 0.0000000 0.0000000 0.0016949 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
780 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0016949 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
800 0.0000000 0.0000000 0.0000000 0.0084746 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0016949 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
890 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0016949 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
930 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0016949 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
945 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0016949 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
950 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0016949 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
994 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0016949 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
1014 0.0000000 0.0000000 0.0016949 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
1040 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0016949 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
1100 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0033898 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
1120 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0016949 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
1128 0.0000000 0.0000000 0.0016949 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
1200 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0033898 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
1280 0.0000000 0.0000000 0.0000000 0.0016949 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
1300 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0016949 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
1394 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0016949 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
1400 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0016949 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
1450 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0016949 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
1500 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0016949 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
1548 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0033898 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
1600 0.0000000 0.0000000 0.0000000 0.0033898 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
1650 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0016949 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
1993 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0016949 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
2000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0016949 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
2020 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0016949 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
2100 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0016949 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0033898 0.0000000
2200 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0033898 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
2304 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0033898 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
2400 0.0000000 0.0000000 0.0000000 0.0033898 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
3000 0.0000000 0.0000000 0.0016949 0.0000000 0.0000000 0.0016949 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
3200 0.0000000 0.0000000 0.0000000 0.0067797 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
3498 0.0000000 0.0000000 0.0016949 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
4080 0.0000000 0.0000000 0.0000000 0.0016949 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
4169 0.0000000 0.0000000 0.0016949 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
6400 0.0000000 0.0000000 0.0000000 0.0033898 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
9600 0.0000000 0.0000000 0.0000000 0.0033898 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
13120 0.0000000 0.0000000 0.0000000 0.0016949 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000

Unidades por mes

proportion <- prop.table(table(dplan2$Unidades,dplan2$Mes))
proportion %>%
  kbl() %>%
  kable_styling()
A_jun_21 B_jul_21 C_ago_21 D_sep_21 E_oct_21 F_nov_21 G_dic_21 H_ene_22 I_feb_22 J_mar_22
1 0.0016949 0.0000000 0.0033898 0.0000000 0.0033898 0.0016949 0.0033898 0.0000000 0.0016949 0.0000000
2 0.0016949 0.0033898 0.0016949 0.0016949 0.0000000 0.0016949 0.0016949 0.0016949 0.0000000 0.0016949
3 0.0000000 0.0000000 0.0000000 0.0016949 0.0000000 0.0016949 0.0016949 0.0000000 0.0016949 0.0016949
4 0.0000000 0.0016949 0.0000000 0.0033898 0.0000000 0.0000000 0.0016949 0.0033898 0.0033898 0.0000000
5 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0033898 0.0000000 0.0016949 0.0016949 0.0016949
6 0.0000000 0.0000000 0.0016949 0.0016949 0.0000000 0.0016949 0.0016949 0.0033898 0.0016949 0.0016949
7 0.0000000 0.0016949 0.0000000 0.0000000 0.0016949 0.0000000 0.0000000 0.0033898 0.0000000 0.0000000
8 0.0016949 0.0016949 0.0000000 0.0000000 0.0016949 0.0000000 0.0016949 0.0000000 0.0033898 0.0000000
9 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0033898 0.0000000 0.0000000 0.0000000
10 0.0016949 0.0000000 0.0033898 0.0016949 0.0016949 0.0016949 0.0016949 0.0000000 0.0067797 0.0016949
11 0.0000000 0.0000000 0.0000000 0.0000000 0.0016949 0.0000000 0.0016949 0.0000000 0.0000000 0.0000000
12 0.0033898 0.0000000 0.0033898 0.0033898 0.0033898 0.0000000 0.0033898 0.0000000 0.0000000 0.0000000
14 0.0000000 0.0000000 0.0000000 0.0000000 0.0016949 0.0000000 0.0000000 0.0000000 0.0016949 0.0016949
15 0.0000000 0.0000000 0.0033898 0.0000000 0.0000000 0.0016949 0.0000000 0.0067797 0.0000000 0.0000000
16 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0033898 0.0016949 0.0016949 0.0067797
18 0.0016949 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0016949 0.0000000 0.0000000 0.0000000
19 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0016949 0.0000000 0.0000000
20 0.0050847 0.0033898 0.0016949 0.0016949 0.0033898 0.0016949 0.0033898 0.0000000 0.0000000 0.0050847
21 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0016949 0.0000000 0.0000000
22 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0016949 0.0000000 0.0000000
24 0.0000000 0.0000000 0.0016949 0.0000000 0.0016949 0.0033898 0.0016949 0.0000000 0.0067797 0.0016949
25 0.0016949 0.0016949 0.0016949 0.0000000 0.0016949 0.0000000 0.0000000 0.0016949 0.0000000 0.0033898
26 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0016949 0.0000000 0.0016949 0.0000000 0.0000000
27 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0016949 0.0000000 0.0000000
28 0.0000000 0.0016949 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
30 0.0000000 0.0000000 0.0016949 0.0050847 0.0067797 0.0067797 0.0050847 0.0050847 0.0000000 0.0000000
32 0.0000000 0.0000000 0.0000000 0.0000000 0.0016949 0.0016949 0.0000000 0.0033898 0.0000000 0.0016949
33 0.0000000 0.0000000 0.0016949 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
34 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0016949 0.0000000
35 0.0016949 0.0000000 0.0016949 0.0000000 0.0016949 0.0016949 0.0000000 0.0016949 0.0000000 0.0000000
36 0.0033898 0.0050847 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0033898 0.0033898
39 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0016949 0.0000000 0.0000000
40 0.0000000 0.0016949 0.0016949 0.0033898 0.0067797 0.0016949 0.0016949 0.0016949 0.0016949 0.0000000
42 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0016949 0.0000000 0.0000000
43 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0033898 0.0000000
44 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0016949 0.0000000 0.0000000 0.0000000 0.0000000
45 0.0016949 0.0016949 0.0000000 0.0000000 0.0000000 0.0033898 0.0000000 0.0016949 0.0000000 0.0000000
46 0.0000000 0.0000000 0.0000000 0.0016949 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
47 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0016949 0.0000000 0.0016949
48 0.0016949 0.0016949 0.0000000 0.0000000 0.0016949 0.0000000 0.0016949 0.0000000 0.0033898 0.0033898
50 0.0000000 0.0000000 0.0033898 0.0016949 0.0016949 0.0033898 0.0000000 0.0050847 0.0000000 0.0050847
51 0.0000000 0.0000000 0.0000000 0.0000000 0.0016949 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
52 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0016949 0.0000000 0.0000000
55 0.0000000 0.0000000 0.0000000 0.0000000 0.0016949 0.0000000 0.0000000 0.0016949 0.0016949 0.0016949
56 0.0033898 0.0033898 0.0000000 0.0000000 0.0000000 0.0033898 0.0000000 0.0000000 0.0016949 0.0000000
57 0.0000000 0.0016949 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
58 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0016949 0.0000000 0.0000000
60 0.0000000 0.0101695 0.0016949 0.0050847 0.0016949 0.0016949 0.0050847 0.0101695 0.0016949 0.0050847
61 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0016949 0.0016949
62 0.0000000 0.0000000 0.0000000 0.0000000 0.0016949 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
65 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0016949 0.0016949 0.0016949 0.0000000
66 0.0033898 0.0016949 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
67 0.0000000 0.0000000 0.0000000 0.0000000 0.0016949 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
70 0.0000000 0.0033898 0.0016949 0.0000000 0.0016949 0.0000000 0.0000000 0.0000000 0.0016949 0.0016949
71 0.0000000 0.0000000 0.0000000 0.0016949 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0016949
72 0.0033898 0.0033898 0.0016949 0.0000000 0.0033898 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
74 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0016949 0.0000000 0.0000000 0.0000000
75 0.0000000 0.0000000 0.0016949 0.0000000 0.0033898 0.0000000 0.0016949 0.0000000 0.0000000 0.0000000
76 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0016949 0.0000000 0.0000000 0.0000000 0.0000000
80 0.0000000 0.0016949 0.0000000 0.0016949 0.0033898 0.0016949 0.0000000 0.0000000 0.0000000 0.0000000
82 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0016949 0.0000000 0.0000000 0.0000000
83 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0016949 0.0000000 0.0000000
84 0.0000000 0.0000000 0.0000000 0.0033898 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
85 0.0000000 0.0000000 0.0016949 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
88 0.0000000 0.0000000 0.0033898 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
90 0.0000000 0.0000000 0.0000000 0.0016949 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
91 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0016949 0.0000000
92 0.0000000 0.0000000 0.0000000 0.0016949 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
96 0.0000000 0.0000000 0.0000000 0.0016949 0.0000000 0.0000000 0.0033898 0.0033898 0.0000000 0.0000000
100 0.0000000 0.0000000 0.0050847 0.0000000 0.0033898 0.0033898 0.0033898 0.0016949 0.0000000 0.0016949
101 0.0000000 0.0000000 0.0000000 0.0016949 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
104 0.0000000 0.0000000 0.0000000 0.0000000 0.0016949 0.0000000 0.0000000 0.0000000 0.0000000 0.0016949
108 0.0000000 0.0000000 0.0016949 0.0000000 0.0000000 0.0016949 0.0016949 0.0000000 0.0000000 0.0000000
114 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0016949 0.0000000 0.0000000
120 0.0000000 0.0000000 0.0033898 0.0000000 0.0033898 0.0000000 0.0000000 0.0016949 0.0000000 0.0050847
125 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0016949 0.0016949 0.0000000 0.0000000
126 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0016949 0.0000000 0.0000000
128 0.0000000 0.0033898 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
132 0.0000000 0.0000000 0.0016949 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
136 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0016949 0.0000000
140 0.0000000 0.0016949 0.0000000 0.0000000 0.0000000 0.0016949 0.0000000 0.0016949 0.0000000 0.0016949
144 0.0000000 0.0000000 0.0000000 0.0016949 0.0000000 0.0000000 0.0000000 0.0016949 0.0000000 0.0000000
149 0.0000000 0.0000000 0.0000000 0.0000000 0.0016949 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
150 0.0016949 0.0000000 0.0000000 0.0000000 0.0016949 0.0033898 0.0016949 0.0000000 0.0000000 0.0016949
151 0.0016949 0.0016949 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
152 0.0000000 0.0000000 0.0000000 0.0000000 0.0016949 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
155 0.0016949 0.0000000 0.0000000 0.0016949 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
157 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0016949 0.0000000
160 0.0000000 0.0033898 0.0016949 0.0000000 0.0016949 0.0050847 0.0000000 0.0000000 0.0000000 0.0016949
162 0.0016949 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0016949
164 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0016949
165 0.0016949 0.0016949 0.0000000 0.0016949 0.0000000 0.0000000 0.0016949 0.0000000 0.0000000 0.0000000
166 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0016949
167 0.0000000 0.0000000 0.0000000 0.0000000 0.0016949 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
170 0.0000000 0.0000000 0.0000000 0.0033898 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
172 0.0000000 0.0000000 0.0000000 0.0016949 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
174 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0016949 0.0000000 0.0000000 0.0000000
180 0.0000000 0.0000000 0.0033898 0.0000000 0.0000000 0.0016949 0.0000000 0.0000000 0.0000000 0.0000000
183 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0016949 0.0000000 0.0000000
184 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0016949 0.0000000 0.0000000 0.0000000
187 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0016949 0.0000000 0.0000000
190 0.0000000 0.0000000 0.0000000 0.0000000 0.0033898 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
192 0.0016949 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
195 0.0000000 0.0000000 0.0016949 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
196 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0016949 0.0000000 0.0000000
198 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0016949 0.0000000 0.0000000
200 0.0000000 0.0016949 0.0016949 0.0016949 0.0016949 0.0016949 0.0016949 0.0000000 0.0016949 0.0000000
206 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0016949 0.0000000 0.0000000 0.0000000 0.0000000
208 0.0000000 0.0000000 0.0000000 0.0016949 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
210 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0016949
220 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0016949 0.0016949
222 0.0016949 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
226 0.0000000 0.0000000 0.0016949 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
230 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0033898 0.0000000 0.0000000
238 0.0000000 0.0000000 0.0033898 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
239 0.0000000 0.0000000 0.0000000 0.0016949 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
240 0.0016949 0.0000000 0.0016949 0.0000000 0.0000000 0.0000000 0.0016949 0.0033898 0.0000000 0.0033898
245 0.0000000 0.0000000 0.0000000 0.0000000 0.0016949 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
246 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0033898 0.0000000 0.0000000 0.0000000 0.0000000
247 0.0000000 0.0000000 0.0000000 0.0016949 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
250 0.0016949 0.0016949 0.0016949 0.0000000 0.0000000 0.0016949 0.0000000 0.0000000 0.0016949 0.0016949
260 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0016949 0.0000000 0.0000000 0.0000000
270 0.0000000 0.0000000 0.0000000 0.0016949 0.0000000 0.0016949 0.0000000 0.0000000 0.0000000 0.0000000
280 0.0000000 0.0000000 0.0000000 0.0016949 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
288 0.0000000 0.0000000 0.0000000 0.0000000 0.0016949 0.0000000 0.0000000 0.0000000 0.0016949 0.0000000
300 0.0016949 0.0033898 0.0000000 0.0016949 0.0016949 0.0000000 0.0050847 0.0016949 0.0050847 0.0067797
302 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0016949
308 0.0000000 0.0000000 0.0000000 0.0000000 0.0016949 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
310 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0016949 0.0000000 0.0000000 0.0000000 0.0000000
320 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0016949 0.0016949 0.0000000 0.0033898 0.0000000
340 0.0000000 0.0000000 0.0016949 0.0000000 0.0016949 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
344 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0016949 0.0000000 0.0000000 0.0000000 0.0000000
350 0.0000000 0.0000000 0.0000000 0.0000000 0.0016949 0.0016949 0.0000000 0.0016949 0.0000000 0.0000000
355 0.0000000 0.0016949 0.0016949 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
358 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0016949 0.0000000 0.0000000 0.0000000 0.0000000
360 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0016949 0.0000000 0.0000000 0.0000000 0.0016949
372 0.0000000 0.0000000 0.0016949 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
378 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0016949 0.0000000 0.0000000 0.0000000
382 0.0000000 0.0016949 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
390 0.0000000 0.0033898 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0016949 0.0000000
400 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0033898 0.0016949 0.0016949 0.0033898
409 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0016949 0.0000000 0.0000000 0.0000000
411 0.0000000 0.0000000 0.0000000 0.0000000 0.0016949 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
420 0.0016949 0.0016949 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
450 0.0016949 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0016949 0.0000000
455 0.0000000 0.0016949 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
456 0.0000000 0.0000000 0.0000000 0.0000000 0.0016949 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
463 0.0000000 0.0016949 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
480 0.0000000 0.0016949 0.0000000 0.0016949 0.0000000 0.0000000 0.0000000 0.0016949 0.0000000 0.0000000
485 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0016949
500 0.0016949 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0033898 0.0016949 0.0033898
506 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0016949 0.0000000 0.0000000
509 0.0000000 0.0000000 0.0016949 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
525 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0016949 0.0000000 0.0000000 0.0000000
526 0.0000000 0.0000000 0.0000000 0.0016949 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
529 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0016949
530 0.0000000 0.0000000 0.0016949 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
532 0.0000000 0.0000000 0.0000000 0.0016949 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
540 0.0016949 0.0000000 0.0000000 0.0000000 0.0016949 0.0016949 0.0000000 0.0000000 0.0000000 0.0000000
580 0.0000000 0.0016949 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
600 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0033898 0.0000000 0.0016949 0.0016949 0.0000000
612 0.0000000 0.0000000 0.0000000 0.0016949 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0016949
640 0.0000000 0.0000000 0.0000000 0.0000000 0.0016949 0.0000000 0.0000000 0.0000000 0.0016949 0.0000000
660 0.0000000 0.0016949 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
690 0.0000000 0.0000000 0.0000000 0.0016949 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
700 0.0000000 0.0000000 0.0000000 0.0016949 0.0000000 0.0016949 0.0000000 0.0000000 0.0000000 0.0016949
710 0.0000000 0.0000000 0.0000000 0.0016949 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
736 0.0000000 0.0000000 0.0000000 0.0033898 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
780 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0016949 0.0000000 0.0000000 0.0000000 0.0000000
800 0.0016949 0.0000000 0.0016949 0.0016949 0.0016949 0.0000000 0.0000000 0.0033898 0.0000000 0.0000000
890 0.0000000 0.0016949 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
930 0.0000000 0.0000000 0.0016949 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
945 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0016949 0.0000000 0.0000000
950 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0016949 0.0000000
994 0.0000000 0.0000000 0.0016949 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
1014 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0016949
1040 0.0000000 0.0016949 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
1100 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0033898 0.0000000 0.0000000 0.0000000 0.0000000
1120 0.0000000 0.0000000 0.0000000 0.0000000 0.0016949 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
1128 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0016949 0.0000000 0.0000000 0.0000000
1200 0.0000000 0.0000000 0.0000000 0.0016949 0.0000000 0.0000000 0.0000000 0.0016949 0.0000000 0.0000000
1280 0.0016949 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
1300 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0016949
1394 0.0000000 0.0000000 0.0016949 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
1400 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0016949 0.0000000 0.0000000 0.0000000
1450 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0016949 0.0000000 0.0000000 0.0000000
1500 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0016949 0.0000000 0.0000000 0.0000000 0.0000000
1548 0.0000000 0.0000000 0.0000000 0.0016949 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0016949
1600 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0016949 0.0016949 0.0000000 0.0000000 0.0000000
1650 0.0000000 0.0000000 0.0016949 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
1993 0.0000000 0.0000000 0.0000000 0.0000000 0.0016949 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
2000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0016949 0.0000000 0.0000000
2020 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0016949 0.0000000 0.0000000 0.0000000
2100 0.0000000 0.0016949 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0033898 0.0000000
2200 0.0000000 0.0016949 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0016949 0.0000000 0.0000000
2304 0.0000000 0.0000000 0.0000000 0.0016949 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0016949
2400 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0016949 0.0016949
3000 0.0000000 0.0000000 0.0016949 0.0000000 0.0000000 0.0000000 0.0016949 0.0000000 0.0000000 0.0000000
3200 0.0000000 0.0000000 0.0016949 0.0016949 0.0016949 0.0000000 0.0000000 0.0016949 0.0000000 0.0000000
3498 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0016949
4080 0.0000000 0.0016949 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
4169 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0016949
6400 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0016949 0.0016949 0.0000000 0.0000000 0.0000000
9600 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0016949 0.0016949
13120 0.0000000 0.0016949 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000

Gráficas cualitativas y cuantitativas

Unidades por mes

ggplot(dplan2, aes(Mes,Unidades)) +                                    
  geom_bar(stat = "identity") +
  scale_fill_brewer(palette = "Set2") + ggtitle("Unidades por mes") 

de acuerdo con el analisis, existe una instancia al rededor de cada cuarto del año donde existe un pico relativo al numero de pedidos programados para el mes, lo cual quiere decir que o bien, casualmente se realizan pedidos en esas instancias dentro del periodo anual, o por procedimientos adminstrativos estos datos son capturados al final de cada cuarto y por consiguiente son representados de esta manera.

Pedidos por cliente

ggplot(dplan2, aes(x = Mes, y = Unidades, group = cliente)) +
  geom_line()+
  ggtitle("Pedidos por Cliente")

En este grafico se sigue con el tipo de tendencia en donde los pedidos por cliente aumentan o disminuyen de acuerdo al cuarto del año; sin embargo se pueden observar grupos de actividad en la grafica, representando bloques bimestrales que se correlacionan con el insight anterior. ### Gráfica cualitativa de Clientes

pie(table(dplan2$cliente))

En este grafico de pie se pueden visualizar los clientes, donde VARROC es quien predomina casi el 50% de las figuraciones dentro de las base de datos. Ahora bien, si es cierto que aparece más veces en la base de datos, pero no necesamiamente es quien realiza pedidos más grandes o que aporte en mayor cantidad a Form, sino que, aportando otra hipotesis, sería valido decir que puede ser un cliente con pedidos pequeños pero multiples a lo largo del periodo establecido.

Gráficos de disperción:

Gráfico de disperción 1

qqnorm(dplan2$Unidades, main="Grafica de dispersion", ylab="Pedidos programados",col='#FF7F24')
  qqline(dplan2$Unidades, col='#FF7F24')

En este caso, se puede observar la dispercion de los pedidos programados, donde se reafirma la hipotesis en donde hay una concentración de pedidos en ciertos periodos, mientras qeue en otros periodos son más aislados o bajan la recurrencia operativa en ese sentido.

hist(dplan2$Unidades,main="Histograma",xlab="Delivery diference",col='#FF7F24')

Hallazgos: La mayoría de porcentaje de pedidos consta de menos de 1000 piezas

Tabla de estadisticas | Media, Mediana, Moda y Desviación Estandar

mea2 <- mean(dplan2$cliente)
## Warning in mean.default(dplan2$cliente): argument is not numeric or logical:
## returning NA
med2 <- median(dplan2$cliente)
## Warning in mean.default(sort(x, partial = half + 0L:1L)[half + 0L:1L]): argument
## is not numeric or logical: returning NA
moda2<- mfv(dplan2$cliente)
sd2 <- sd(dplan2$cliente, na.rm = TRUE)
## Warning in var(if (is.vector(x) || is.factor(x)) x else as.double(x), na.rm =
## na.rm): NAs introduced by coercion
mea3 <- mean(dplan2$Mes)
## Warning in mean.default(dplan2$Mes): argument is not numeric or logical:
## returning NA
med3 <- median(dplan2$Mes)
## Warning in mean.default(sort(x, partial = half + 0L:1L)[half + 0L:1L]): argument
## is not numeric or logical: returning NA
moda3 <- mfv(dplan2$Mes)
sd3 <- sd(dplan2$Mes, na.rm = TRUE)
## Warning in var(if (is.vector(x) || is.factor(x)) x else as.double(x), na.rm =
## na.rm): NAs introduced by coercion
mea4 <- mean(dplan2$Unidades)
med4 <- median(dplan2$Unidades)
moda4 <- mfv(dplan2$Unidades)
sd4 <- sd(dplan2$Unidades, na.rm = TRUE)
Variables <-c("Cliente", "Mes", "Unidades")
Media <-c(mea2,mea3,mea4)
Mediana <-c(med2,med3,med4)
Moda <-c(moda2,moda3,moda4)
Desviacion <-c(sd2,sd3,sd4)
tabla2 <-data.frame(Variables, Media, Mediana, Moda, Desviacion)
knitr::kable(tabla2)
Variables Media Mediana Moda Desviacion
Cliente NA NA VARROC NA
Mes NA NA H_ene_22 NA
Unidades 358.3729 80 60 1002.834

Bar plot adicional

ggplot(dplan2, aes(cliente,Unidades)) +                                    
  geom_bar(stat = "identity") +
  scale_fill_brewer(palette = "Set1") + ggtitle("Unidades por mes") 

En este caso se muestra la cantidad de unidades por mes por cada cliente; donde se puede dar a cuenta que en definitiva existen clientes especificos los cuales requicitan de mayor demanda a Form que otros clientes.

Scatter plot

  plot(dplan2$Unidades, dplan2$Unidades, main = "Disperción de proporción de piezas programadas",
     xlab = "Unidades", ylab = " ",
     pch = 19, frame = FALSE)

Para este scatter plot, se puede identificar la tendencia en donde la concentracion de pedidos pequeños es mayor que la de pedidos grandes, donde en contexto relativo hay solo unos cuantos clientes que requieren unidades/Cantidades grandes por parte de form. En otras palabras, Form dada su capacidad y perfil de empresa, no deja de tener areas de oportunidad en lo que respecta la produccion si desea crecer. ## Box Plot

boxplot(dplan2$Unidades , vertical = TRUE)

Nuevamente se reafirma la hipotesis de que son pocos los clientes quienes realizan pedidos muy grandes en comparacion con los demás

Time series plot

plot(dplan2$Unidades, xlab = "Mes", ylab = "Kilos")
polygon(dplan2$Mes, col="green", border="black")
## Warning in xy.coords(x, y, setLab = FALSE): NAs introduced by coercion

*Por un error desconocido, R no me permite ejecutar correctamente un time series plot, por lo que interpretaré la presente gráfica como si tuviera los atributos de una time series.

Hallazgos:

Delivery Performance

#file.choose()
dep <- read.csv("/Users/carlosgonzalez/Desktop/FORM - Delivery Performance.csv")

Entender base de datos

summary(dep)
##      Target    Cliente             Vueltas      Plan.arrival   
##  Min.   :1   Length:1440        Min.   :1.00   Min.   : 0.000  
##  1st Qu.:1   Class :character   1st Qu.:1.00   1st Qu.: 0.000  
##  Median :1   Mode  :character   Median :1.50   Median : 4.000  
##  Mean   :1                      Mean   :1.75   Mean   : 6.625  
##  3rd Qu.:1                      3rd Qu.:2.25   3rd Qu.:10.750  
##  Max.   :1                      Max.   :3.00   Max.   :20.000  
##   Real.arrival    Real.departure     Diference            Date          
##  Min.   : 0.000   Min.   : 0.000   Min.   :-14.3500   Length:1440       
##  1st Qu.: 0.000   1st Qu.: 0.000   1st Qu.:  0.0000   Class :character  
##  Median : 0.000   Median : 0.000   Median :  0.0000   Mode  :character  
##  Mean   : 3.823   Mean   : 4.142   Mean   :  0.3155                     
##  3rd Qu.: 8.000   3rd Qu.: 9.000   3rd Qu.:  0.8000                     
##  Max.   :23.500   Max.   :24.500   Max.   : 20.0000

Numero de variables y registros presentes en la base de datos

str(dep)
## 'data.frame':    1440 obs. of  8 variables:
##  $ Target        : int  1 1 1 1 1 1 1 1 1 1 ...
##  $ Cliente       : chr  "PRINTEL " "MAHLE" "MAHLE" "MAHLE" ...
##  $ Vueltas       : int  1 1 2 3 1 1 2 3 1 1 ...
##  $ Plan.arrival  : num  16 8 9 20 0 0 0 0 16 8 ...
##  $ Real.arrival  : num  16 8 9 20 0 0 0 0 16 8 ...
##  $ Real.departure: num  19.3 8.55 10 21 0 0 0 0 18.1 9 ...
##  $ Diference     : num  3.3 0.55 1 1 0 0 0 0 2.1 1 ...
##  $ Date          : chr  "02/01/22" "02/01/22" "02/01/22" "02/01/22" ...

Actualmente existen 8 variables con 1440 registros respectivamente.

Limpieza de la base de base de datos

Eliminar variable inecesaria con la finalidad de trabajar unicamente con las que se utilicen para el ejercicio de alto impacto.

dep <-subset (dep, select =-c(Target)) 

Cambiar formato de caracter a fecha:

En este caso se pretende cambiar el formato, ya que la base de datos da estimados de entrega para los clientes y por consiguiente es imperativo que las fechas tengan el formato óptimo para el estudio y resultado deseado.

dep$Date <-as.Date(dep$Date,format ="%d/%m/%Y")
tibble(dep)
## # A tibble: 1,440 × 7
##    Cliente    Vueltas Plan.arrival Real.arrival Real.depart…¹ Difer…² Date      
##    <chr>        <int>        <dbl>        <dbl>         <dbl>   <dbl> <date>    
##  1 "PRINTEL "       1           16           16         19.3     3.3  0022-01-02
##  2 "MAHLE"          1            8            8          8.55    0.55 0022-01-02
##  3 "MAHLE"          2            9            9         10       1    0022-01-02
##  4 "MAHLE"          3           20           20         21       1    0022-01-02
##  5 "MAGNA"          1            0            0          0       0    0022-01-02
##  6 "VARROC"         1            0            0          0       0    0022-01-02
##  7 "VARROC"         2            0            0          0       0    0022-01-02
##  8 "VARROC"         3            0            0          0       0    0022-01-02
##  9 "PRINTEL "       1           16           16         18.1     2.1  0022-01-03
## 10 "MAHLE"          1            8            8          9       1    0022-01-03
## # … with 1,430 more rows, and abbreviated variable names ¹​Real.departure,
## #   ²​Diference

Identiificar valores faltantes | Verificar la existencia de NA’s o datos invalidos en la base de datos

sum(is.na(dep))
## [1] 0

Por variable

sapply(dep,function(x)sum(is.na(x)))
##        Cliente        Vueltas   Plan.arrival   Real.arrival Real.departure 
##              0              0              0              0              0 
##      Diference           Date 
##              0              0

Borrar registros invalidos (NA’s)

dep <- na.omit(dep)
summary(dep)
##    Cliente             Vueltas      Plan.arrival     Real.arrival   
##  Length:1440        Min.   :1.00   Min.   : 0.000   Min.   : 0.000  
##  Class :character   1st Qu.:1.00   1st Qu.: 0.000   1st Qu.: 0.000  
##  Mode  :character   Median :1.50   Median : 4.000   Median : 0.000  
##                     Mean   :1.75   Mean   : 6.625   Mean   : 3.823  
##                     3rd Qu.:2.25   3rd Qu.:10.750   3rd Qu.: 8.000  
##                     Max.   :3.00   Max.   :20.000   Max.   :23.500  
##  Real.departure     Diference             Date           
##  Min.   : 0.000   Min.   :-14.3500   Min.   :0022-01-02  
##  1st Qu.: 0.000   1st Qu.:  0.0000   1st Qu.:0022-02-23  
##  Median : 0.000   Median :  0.0000   Median :0022-04-17  
##  Mean   : 4.142   Mean   :  0.3155   Mean   :0022-04-16  
##  3rd Qu.: 9.000   3rd Qu.:  0.8000   3rd Qu.:0022-06-08  
##  Max.   :24.500   Max.   : 20.0000   Max.   :0022-07-23

Variables y registros

str(dep)
## 'data.frame':    1440 obs. of  7 variables:
##  $ Cliente       : chr  "PRINTEL " "MAHLE" "MAHLE" "MAHLE" ...
##  $ Vueltas       : int  1 1 2 3 1 1 2 3 1 1 ...
##  $ Plan.arrival  : num  16 8 9 20 0 0 0 0 16 8 ...
##  $ Real.arrival  : num  16 8 9 20 0 0 0 0 16 8 ...
##  $ Real.departure: num  19.3 8.55 10 21 0 0 0 0 18.1 9 ...
##  $ Diference     : num  3.3 0.55 1 1 0 0 0 0 2.1 1 ...
##  $ Date          : Date, format: "0022-01-02" "0022-01-02" ...

Tras la limpieza de datos, se finaliza la base de datos con 7 variables y 1440 registros respectivamente, con lo cual, se proseguirá a realizar el analisis de la misma.

Tabla de clasificación de variables

variables <- c("`Cliente`","`Vueltas`","`Plan.arrival`","`Real.arrival`","`Plan.departure`","`Diference`","`Date`")
tipos <- c("cualitativo  ", "cuantitativo (discreto)  ", "cuantitativo (continuo)  ", "cuantitativo (continuo)  ", "cuantitativo (continuo)  ", "cuantitativo (continuo)  ", "cualitativo  ")
escalas <- c("nominal", "razon", "razon", "razon", "razon", "razon", "ordinal")
table1 <- data.frame (variables, tipos, escalas)
knitr::kable(table1)
variables tipos escalas
Cliente cualitativo nominal
Vueltas cuantitativo (discreto) razon
Plan.arrival cuantitativo (continuo) razon
Real.arrival cuantitativo (continuo) razon
Plan.departure cuantitativo (continuo) razon
Diference cuantitativo (continuo) razon
Date cualitativo ordinal

Tabla de frecuencia 1 | Cliente y plan arrival

proportion <- prop.table(table(dep$Cliente,dep$Plan.arrival))
proportion %>%
  kbl() %>%
  kable_styling()
0 8 9 16 20
MAGNA 0.125 0.000 0.000 0.000 0.000
MAHLE 0.000 0.125 0.125 0.000 0.125
PRINTEL 0.000 0.000 0.000 0.125 0.000
VARROC 0.375 0.000 0.000 0.000 0.000

En este caso se planteó realizar esta tabla de frecuencia, ya que nos indica la frecuencia de cada cliente en función de las fechas esperadas o programadas que se tienen. En este caso podemos ver que existen ciertos clientes que cuentan con mayor de esta frecuencia, relacionandose con no solo la importancia de cada cliente, sino con el % de participación en la operación de Form.

Tabla cruzada

location <- CrossTable(dep$Cliente, dep$Plan.arrival, prop.t=TRUE, prop.r=TRUE, prop.c=TRUE)
## 
##  
##    Cell Contents
## |-------------------------|
## |                       N |
## | Chi-square contribution |
## |           N / Row Total |
## |           N / Col Total |
## |         N / Table Total |
## |-------------------------|
## 
##  
## Total Observations in Table:  1440 
## 
##  
##              | dep$Plan.arrival 
##  dep$Cliente |         0 |         8 |         9 |        16 |        20 | Row Total | 
## -------------|-----------|-----------|-----------|-----------|-----------|-----------|
##        MAGNA |       180 |         0 |         0 |         0 |         0 |       180 | 
##              |    90.000 |    22.500 |    22.500 |    22.500 |    22.500 |           | 
##              |     1.000 |     0.000 |     0.000 |     0.000 |     0.000 |     0.125 | 
##              |     0.250 |     0.000 |     0.000 |     0.000 |     0.000 |           | 
##              |     0.125 |     0.000 |     0.000 |     0.000 |     0.000 |           | 
## -------------|-----------|-----------|-----------|-----------|-----------|-----------|
##        MAHLE |         0 |       180 |       180 |         0 |       180 |       540 | 
##              |   270.000 |   187.500 |   187.500 |    67.500 |   187.500 |           | 
##              |     0.000 |     0.333 |     0.333 |     0.000 |     0.333 |     0.375 | 
##              |     0.000 |     1.000 |     1.000 |     0.000 |     1.000 |           | 
##              |     0.000 |     0.125 |     0.125 |     0.000 |     0.125 |           | 
## -------------|-----------|-----------|-----------|-----------|-----------|-----------|
##     PRINTEL  |         0 |         0 |         0 |       180 |         0 |       180 | 
##              |    90.000 |    22.500 |    22.500 |  1102.500 |    22.500 |           | 
##              |     0.000 |     0.000 |     0.000 |     1.000 |     0.000 |     0.125 | 
##              |     0.000 |     0.000 |     0.000 |     1.000 |     0.000 |           | 
##              |     0.000 |     0.000 |     0.000 |     0.125 |     0.000 |           | 
## -------------|-----------|-----------|-----------|-----------|-----------|-----------|
##       VARROC |       540 |         0 |         0 |         0 |         0 |       540 | 
##              |   270.000 |    67.500 |    67.500 |    67.500 |    67.500 |           | 
##              |     1.000 |     0.000 |     0.000 |     0.000 |     0.000 |     0.375 | 
##              |     0.750 |     0.000 |     0.000 |     0.000 |     0.000 |           | 
##              |     0.375 |     0.000 |     0.000 |     0.000 |     0.000 |           | 
## -------------|-----------|-----------|-----------|-----------|-----------|-----------|
## Column Total |       720 |       180 |       180 |       180 |       180 |      1440 | 
##              |     0.500 |     0.125 |     0.125 |     0.125 |     0.125 |           | 
## -------------|-----------|-----------|-----------|-----------|-----------|-----------|
## 
## 
kbl(location) %>%
  kable_classic()
0 8 9 16 20
MAGNA 180 0 0 0 0
MAHLE 0 180 180 0 180
PRINTEL 0 0 0 180 0
VARROC 540 0 0 0 0
0 8 9 16 20
MAGNA 1 0.0000000 0.0000000 0 0.0000000
MAHLE 0 0.3333333 0.3333333 0 0.3333333
PRINTEL 0 0.0000000 0.0000000 1 0.0000000
VARROC 1 0.0000000 0.0000000 0 0.0000000
0 8 9 16 20
MAGNA 0.25 0 0 0 0
MAHLE 0.00 1 1 0 1
PRINTEL 0.00 0 0 1 0
VARROC 0.75 0 0 0 0
0 8 9 16 20
MAGNA 0.125 0.000 0.000 0.000 0.000
MAHLE 0.000 0.125 0.125 0.000 0.125
PRINTEL 0.000 0.000 0.000 0.125 0.000
VARROC 0.375 0.000 0.000 0.000 0.000

Graficos cuantitativos y cualitativos

Grafico cuantitativo | Vueltas por cliente

ggplot(dep, aes(dep$Cliente,dep$Vueltas)) +                                    
  geom_bar(stat = "identity") +
  scale_fill_brewer(palette = "Set2") + ggtitle("Vueltas por cliente") 
## Warning: Use of `dep$Cliente` is discouraged. Use `Cliente` instead.
## Warning: Use of `dep$Vueltas` is discouraged. Use `Vueltas` instead.

Grafico cuantitativo | Planes de llegada por cliente

ggplot(dep, aes(dep$Cliente,dep$Plan.arrival)) +                                    
  geom_bar(stat = "identity") +
  scale_fill_brewer(palette = "Set2") + ggtitle("Planes de llegada por cliente") 
## Warning: Use of `dep$Cliente` is discouraged. Use `Cliente` instead.
## Warning: Use of `dep$Plan.arrival` is discouraged. Use `Plan.arrival` instead.

En este caso se puede inferir que existen dos clientes cuyos esfuerzos muestran mayor magnitud por parte de la productividad de Form, ya que de acuerdo con el grafico anterior, MAHLE y PRINTEL son los cientes quienes tiene mayor presencia en la agenda de la empresa.

Grafico cualitativo

pie(table(dep$Cliente))

En este caso, se muestran los clientes principales de Form, donde destaca inicialmente MAHLE y VARROC, donde de acuerdo con el grafico anterior, tienen mayor participación en las operaciones de Form.

Gráficos de dispersión

Delivery <- data.frame(dep$Cliente, dep$Plan.arrival, dep$Real.arrival, dep$Real.departure, dep$Date)
colnames(Delivery)<-c('Cliente', 'Plan.arrival', 'Real.arrival', 'Real.departure', 'Date')
Realarrival_boxplot = subset(Delivery, select =-c (Cliente, Date))
boxplot(Realarrival_boxplot,data=data,main="Entregas", 
        col=rainbow (ncol(trees)))

Con los boxplot anteriores, se puede dar a cuenta de que Form generalmente hace sus entregas alrededor y dentro del margen posiblemente aceptable, donde las fecha planeadas no se alejan tanto de la realidad en función de la salida de la fabrica y la fecha de llegada.

Histograma | Diferencia en días de planeado contra realizado

hist(dep$Diference,main="Diferencia en días de planeado contra realizado",xlab="Delivery diference",col='#FF7F24')

En este caso, tenemos un numero negativo, indicando que Form realiza entregas incluso antes de los esperado al cliente, aportando mayor valor dentro de su servicio. Por otra parte, existen ocasiones más escazas donde Form lleva a cabo las entrgas 5 días después. Analizado lo anterior, es importante generar una estrategia que permita a Form realizar las entregas el día establecido o incluso antes. Por otra parte, si se trata de retos técnicos que impidieron la entrega dentro del periodo estipulado, es necesario reforzar la realción con el cliente de alguna manera (descuento/producto gratis/logíastica/entrega a menor costo o gratuito, etc.)

Tabla de estadisticas | Media, Mediana, Moda y Desviación Estandar

moda <- function(x) {
  ux <- unique(x)    
  ux[which.max(tabulate(match(x, ux)))]      
}    
mea2 <- mean(dep$Vueltas)
med2 <- median(dep$Vueltas)
moda2 <- moda(dep$Vueltas)
Moda1sd2 <- sd(dep$Vueltas, na.rm = TRUE)
mea3 <- mean(dep$Cliente)
## Warning in mean.default(dep$Cliente): argument is not numeric or logical:
## returning NA
med3 <- median(dep$Cliente)
## Warning in mean.default(sort(x, partial = half + 0L:1L)[half + 0L:1L]): argument
## is not numeric or logical: returning NA
moda3 <- moda(dep$Cliente)
sd3 <- sd(dep$Cliente, na.rm = TRUE)
## Warning in var(if (is.vector(x) || is.factor(x)) x else as.double(x), na.rm =
## na.rm): NAs introduced by coercion
mea4 <- mean(dep$Diference)
med4 <- median(dep$Diference)
moda4 <- moda(dep$Diference)
sd4 <- sd(dep$Diference, na.rm = TRUE)
mea5 <- mean(dep$Real.arrival)
med5 <- median(dep$Real.arrival)
moda5 <- moda(dep$Real.arrival)
sd5 <- sd(dep$Real.arrival, na.rm = TRUE)
Variables <-c("Vueltas", "Cliente", "Diference", "Real_Arrival")
Media <-c(mea2,mea3,mea4, mea5)
Mediana <-c(med2,med3,med4, med5)
Moda <-c(moda2,moda3,moda4, moda5)
Desviacion <-c(sd2,sd3,sd4, sd5)
tabla2 <-data.frame(Variables, Media, Mediana, Moda, Desviacion)
knitr::kable(tabla2)
Variables Media Mediana Moda Desviacion
Vueltas 1.750000 1.5 1 NA
Cliente NA NA MAHLE NA
Diference 0.315500 0.0 0 0.9218758
Real_Arrival 3.822792 0.0 0 6.5059024

Hallazgos:

Diagrama de dispersión

qqnorm(dep$Diference, main="Grafica de dispersion", ylab="Delivery diference",col='#FF7F24')
qqline(dep$Diference, col='#FF7F24')

Time series plot

ggplot(dep,aes(x= Date))+
  geom_point(aes(y=Plan.arrival),color="#4169E1")+
  geom_point(aes(y=Real.arrival),color="#FF7F24")+
  labs(x="2022",y="Llegadas")+
  ggtitle("Llegadas planeadas y reales de pedidos")

En esta serie de tiempo, se puede observar con claridad que existen ciertas concentraciones en febrero-marzo y junio-agosto donde hay variaciones que no necesariamente siguen los tiempo de llegada planeados, es decir, Form en ocasiones no tiene la capacidad operativa o de infraestructura para garantizar a un 100% que se realizarán entregas cuando lo indica inicialmente.

Producción

#file.choose()
prod <- read.csv("/Users/carlosgonzalez/Desktop/produccion.csv") 

Entender base de datos

summary(prod)
##     fecha                 no           cliente            id_form         
##  Length:5411        Min.   :  1.00   Length:5411        Length:5411       
##  Class :character   1st Qu.: 23.00   Class :character   Class :character  
##  Mode  :character   Median : 46.00   Mode  :character   Mode  :character  
##                     Mean   : 48.55                                        
##                     3rd Qu.: 72.00                                        
##                     Max.   :121.00                                        
##                                                                           
##    producto         piezas_prog        tiempo_minutos       hora_fin        
##  Length:5411        Length:5411        Length:5411        Length:5411       
##  Class :character   Class :character   Class :character   Class :character  
##  Mode  :character   Mode  :character   Mode  :character   Mode  :character  
##                                                                             
##                                                                             
##                                                                             
##                                                                             
##  estacion_arranque  laminas_procesadas inicio_setup       fin_inicio_su     
##  Length:5411        Length:5411        Length:5411        Length:5411       
##  Class :character   Class :character   Class :character   Class :character  
##  Mode  :character   Mode  :character   Mode  :character   Mode  :character  
##                                                                             
##                                                                             
##                                                                             
##                                                                             
##  inicio_proceso     fin_proceso        tiempo_calidad     tiempo_materiales
##  Length:5411        Length:5411        Length:5411        Min.   : 0.000   
##  Class :character   Class :character   Class :character   1st Qu.: 0.000   
##  Mode  :character   Mode  :character   Mode  :character   Median : 0.000   
##                                                           Mean   : 4.568   
##                                                           3rd Qu.: 6.000   
##                                                           Max.   :60.000   
##                                                           NA's   :5152     
##     merma          
##  Length:5411       
##  Class :character  
##  Mode  :character  
##                    
##                    
##                    
## 

Limpieza de base de datos | Producción

Limpieza #1 Eliminar columnas innecesarias para el estudio en cuestión

prod1 <- subset(prod,select = -c (no, id_form, producto, hora_fin, inicio_setup, fin_inicio_su, inicio_proceso, fin_proceso, tiempo_materiales, merma))

summary(prod1)
##     fecha             cliente          piezas_prog        tiempo_minutos    
##  Length:5411        Length:5411        Length:5411        Length:5411       
##  Class :character   Class :character   Class :character   Class :character  
##  Mode  :character   Mode  :character   Mode  :character   Mode  :character  
##  estacion_arranque  laminas_procesadas tiempo_calidad    
##  Length:5411        Length:5411        Length:5411       
##  Class :character   Class :character   Class :character  
##  Mode  :character   Mode  :character   Mode  :character

Se escogió este metodo de limpieza ya que mediante el presente, se tendrá la posibilidad de trabajar únicamente con las variables de alto impacto para nuestro estudio.

Limpieza #2 Formatear las variables

prod1$piezas_prog<-as.numeric(prod1$piezas_prog)
## Warning: NAs introduced by coercion
prod1$tiempo_minutos<-as.numeric(prod1$tiempo_minutos)
## Warning: NAs introduced by coercion
prod1$laminas_procesadas<-as.numeric(prod1$laminas_procesadas)
## Warning: NAs introduced by coercion
prod1$tiempo_calidad<-as.numeric(prod1$tiempo_calidad)
## Warning: NAs introduced by coercion
prod1$cliente<-as.factor(prod1$cliente)  
prod1$estacion_arranque<-as.factor(prod1$estacion_arranque) 

colSums(is.na(prod1))
##              fecha            cliente        piezas_prog     tiempo_minutos 
##                  0                  1                830               3332 
##  estacion_arranque laminas_procesadas     tiempo_calidad 
##                  0               2208               2919

Se empleó este metodo de limpieza, ya que la base de datos contaba con las variables con formato de caractér, lo cual no es lo óptimo para el posterior análisis. Esto contribuirá a la gorrecta visualización de los datos, los cuales de no contar con el formato correcto, R puede no hacer uso óptimo de los registros provenientes de la base de datos.

Reemplazar NA’s con el promedio

prod1<-prod1 %>% mutate(piezas_prog=ifelse(is.na(piezas_prog),median(piezas_prog,na.rm=T),piezas_prog))
prod1<-prod1 %>% mutate(tiempo_minutos=ifelse(is.na(tiempo_minutos),median(tiempo_minutos,na.rm=T),tiempo_minutos))
prod1<-prod1 %>% mutate(laminas_procesadas=ifelse(is.na(laminas_procesadas),median(laminas_procesadas,na.rm=T),laminas_procesadas))
prod1<-prod1 %>% mutate(tiempo_calidad=ifelse(is.na(tiempo_calidad),median(tiempo_calidad,na.rm=T),tiempo_calidad))

Variables y registros presentes en la base de datos de Producción

str(prod1)
## 'data.frame':    5411 obs. of  7 variables:
##  $ fecha             : chr  "15/07/2022" "15/07/2022" "15/07/2022" "15/07/2022" ...
##  $ cliente           : Factor w/ 13 levels "","DENSO","HANON SYSTEMS",..: 6 6 6 6 13 9 6 13 13 13 ...
##  $ piezas_prog       : num  200 100 216 100 20 200 100 12 32 500 ...
##  $ tiempo_minutos    : num  20 15 20 10 10 20 10 10 10 60 ...
##  $ estacion_arranque : Factor w/ 356 levels "","0","1","10",..: 324 324 324 324 324 324 326 326 326 329 ...
##  $ laminas_procesadas: num  402 134 110 100 51 402 22 13 33 11 ...
##  $ tiempo_calidad    : num  1 1 1 1 1 1 1 1 1 2 ...

En este caso, se tienen 7 variables con 5411 registros respectivamente.

Clasificación de variables y escala de medición | Formato tabla

#summary(prod1)
variables <- c("`fecha`","`cliente`","`piezas_prog`","`tiempo_minutos`","`estacion_arranque`","`laminas_procesadas`","`tiempo_calidad`")
tipos <- c("cualitativo  ", "Cualitativo", "cuantitativo (continuo)  ", "cuantitativo (continuo)  ", "cualitativo (continuo)  ", "cuantitativo (continuo)  ", "cualitativo")
escalas <- c("razon", "nominal", "razón", "razon", "nominal", "razon", "razon")

table1 <- data.frame (variables, tipos, escalas)
knitr::kable(table1)
variables tipos escalas
fecha cualitativo razon
cliente Cualitativo nominal
piezas_prog cuantitativo (continuo) razón
tiempo_minutos cuantitativo (continuo) razon
estacion_arranque cualitativo (continuo) nominal
laminas_procesadas cuantitativo (continuo) razon
tiempo_calidad cualitativo razon

2 Tablas de frecuencia

Tabla de frecuencia Tiempo de Calidad por cliente.

proportion <- prop.table(table(prod1$cliente,prod1$tiempo_calidad))
proportion %>%
  kbl() %>%
  kable_styling()
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 20 21 22 23 30 32 33 36 39 48
0.0029575 0.0048059 0.0001848 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
DENSO 0.0110906 0.0839187 0.0009242 0.0001848 0.0000000 0.0000000 0.0001848 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0001848 0.0000000 0.0001848 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0001848 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
HANON SYSTEMS 0.0000000 0.0029575 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
HELLA 0.0033272 0.0182994 0.0001848 0.0001848 0.0000000 0.0001848 0.0001848 0.0000000 0.0000000 0.0000000 0.0001848 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
MERIDIAN LIGHTWEIGHT 0.0044362 0.0144177 0.0016636 0.0000000 0.0001848 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0001848 0.0000000 0.0001848 0.0000000 0.0001848 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
STABILUS 1 0.0399261 0.2539741 0.0029575 0.0009242 0.0007394 0.0003697 0.0005545 0.0003697 0.0003697 0.0003697 0.0009242 0.0001848 0.0001848 0.0001848 0.0000000 0.0000000 0.0000000 0.0001848 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
STABILUS 3 0.0258780 0.1353050 0.0020333 0.0001848 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0001848 0.0001848 0.0000000 0.0001848 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
STABILUS 3. 0.0009242 0.0057301 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
TRMX 0.0277264 0.1495379 0.0022181 0.0007394 0.0000000 0.0000000 0.0001848 0.0000000 0.0000000 0.0000000 0.0001848 0.0000000 0.0001848 0.0000000 0.0000000 0.0001848 0.0000000 0.0000000 0.0003697 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
VARROC 0.0086876 0.0582255 0.0016636 0.0003697 0.0007394 0.0001848 0.0005545 0.0003697 0.0005545 0.0003697 0.0000000 0.0001848 0.0001848 0.0000000 0.0000000 0.0000000 0.0001848 0.0000000 0.0000000 0.0000000 0.0001848 0.0000000 0.0000000 0.0000000 0.0001848 0.0001848 0.0001848
VL-017-13939 0.0001848 0.0005545 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
VL-017-14086 0.0001848 0.0003697 0.0005545 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
YANFENG 0.0192237 0.0900185 0.0031423 0.0024030 0.0005545 0.0005545 0.0007394 0.0000000 0.0000000 0.0005545 0.0005545 0.0005545 0.0003697 0.0001848 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0001848 0.0000000 0.0000000 0.0001848 0.0001848 0.0000000 0.0000000 0.0000000

Tabla de frecuencia #2

Tiempo de calidad dedicado por numero de piezas.

proportion <- prop.table(table(prod1$tiempo_calidad,prod1$piezas_prog))
proportion %>%
  kbl() %>%
  kable_styling()
0 1 2 3 4 5 6 7 8 9 10 12 14 15 16 17 18 20 21 22 23 24 25 26 27 28 30 31 32 33 34 35 36 38 40 41 42 44 45 46 48 50 52 53 54 55 56 57 59 60 62 63 64 65 68 69 70 71 72 74 75 76 78 80 86 88 90 91 96 98 99 100 104 105 108 112 114 116 119 120 122 125 126 134 138 140 142 144 150 152 155 156 157 160 168 170 178 180 192 194 197 199 200 201 208 210 211 214 216 224 225 231 238 240 248 250 256 258 270 288 290 298 299 300 308 320 350 355 360 370 375 384 400 408 410 420 450 456 483 496 500 510 574 600 620 700 800 900 912 1000 1500 1600 2000
0 0.0009240 0.0000000 0.0001848 0.0001848 0.0000000 0.0000000 0.0000000 0.0001848 0.0007392 0.0001848 0.0029569 0.0001848 0.0000000 0.0009240 0.0000000 0.000000 0.0007392 0.0033266 0.0000000 0.0005544 0.0001848 0.0001848 0.0079468 0.0000000 0.0001848 0.0000000 0.0007392 0.0000000 0.0009240 0.0000000 0.0000000 0.0005544 0.000000 0.0000000 0.0011089 0.0000000 0.0000000 0.0001848 0.0001848 0.0000000 0.0001848 0.0040658 0.0001848 0.0000000 0.0000000 0.0001848 0.0001848 0.0000000 0.0000000 0.0449085 0.0000000 0.0000000 0.0007392 0.0000000 0.0000000 0.0001848 0.0003696 0.0000000 0.0011089 0.0000000 0.000000 0.0001848 0.0000000 0.0000000 0.0001848 0.0000000 0.0000000 0.0001848 0.0014785 0.0000000 0.0001848 0.0138607 0.0000000 0.0001848 0.0000000 0.0001848 0.0001848 0.0000000 0.0000000 0.0040658 0.0000000 0.0000000 0.0000000 0.0000000 0.0001848 0.0000000 0.0001848 0.0005544 0.0003696 0.0000000 0.0001848 0.0000000 0.0000000 0.0001848 0.0005544 0.0001848 0.0000000 0.0000000 0.0012937 0.0000000 0.0001848 0.0000000 0.0186657 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0005544 0.0001848 0.0000000 0.0000000 0.0000000 0.0011089 0.0000000 0.0007392 0.0001848 0.0000000 0.0001848 0.0000000 0.0001848 0.0000000 0.0000000 0.0012937 0.0000000 0.0003696 0.0000000 0.0000000 0.0000000 0.0005544 0.0000000 0.0000000 0.0133062 0.0000000 0.0000000 0.0001848 0.0000000 0.0001848 0.0001848 0.0000000 0.0007392 0.0000000 0.0000000 0.0024025 0.0001848 0.0000000 0.0014785 0.0001848 0.0000000 0.0012937 0.0000000 0.0001848 0.0001848
1 0.0049898 0.0005544 0.0000000 0.0009240 0.0011089 0.0009240 0.0011089 0.0001848 0.0007392 0.0005544 0.0689337 0.0011089 0.0005544 0.0515616 0.0016633 0.000924 0.0020329 0.0535945 0.0001848 0.0001848 0.0003696 0.0011089 0.0827943 0.0005544 0.0005544 0.0001848 0.0134910 0.0005544 0.0027721 0.0001848 0.0005544 0.0092404 0.003881 0.0003696 0.0175568 0.0005544 0.0001848 0.0005544 0.0024025 0.0001848 0.0016633 0.0399187 0.0007392 0.0001848 0.0001848 0.0001848 0.0007392 0.0003696 0.0001848 0.1232674 0.0025873 0.0003696 0.0007392 0.0001848 0.0001848 0.0024025 0.0020329 0.0001848 0.0011089 0.0001848 0.000924 0.0005544 0.0003696 0.0011089 0.0005544 0.0003696 0.0011089 0.0001848 0.0101645 0.0001848 0.0003696 0.0748475 0.0005544 0.0001848 0.0018481 0.0011089 0.0000000 0.0001848 0.0003696 0.0170024 0.0001848 0.0003696 0.0012937 0.0007392 0.0000000 0.0003696 0.0000000 0.0022177 0.0025873 0.0001848 0.0001848 0.0014785 0.0001848 0.0011089 0.0033266 0.0005544 0.0001848 0.0024025 0.0046202 0.0001848 0.0001848 0.0007392 0.0929588 0.0001848 0.0007392 0.0000000 0.0005544 0.0000000 0.0031417 0.0005544 0.0001848 0.0001848 0.0001848 0.0081316 0.0003696 0.0011089 0.0000000 0.0001848 0.0001848 0.0003696 0.0000000 0.0003696 0.0001848 0.0127518 0.0001848 0.0009240 0.0001848 0.0001848 0.0024025 0.0025873 0.0005544 0.0003696 0.0247644 0.0001848 0.0005544 0.0007392 0.0001848 0.0003696 0.0005544 0.0003696 0.0035114 0.0001848 0.0001848 0.0064683 0.0009240 0.0001848 0.0048050 0.0003696 0.0003696 0.0009240 0.0001848 0.0001848 0.0000000
2 0.0000000 0.0001848 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0003696 0.0000000 0.0000000 0.0003696 0.0003696 0.000000 0.0000000 0.0007392 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0001848 0.0000000 0.0003696 0.0000000 0.0001848 0.0000000 0.0000000 0.0003696 0.000000 0.0000000 0.0003696 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0001848 0.0003696 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0003696 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0001848 0.0000000 0.0000000 0.0001848 0.0000000 0.000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0005544 0.0001848 0.0000000 0.0033266 0.0001848 0.0000000 0.0003696 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0001848 0.0003696 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0020329 0.0000000 0.0003696 0.0001848 0.0000000 0.0001848 0.0003696 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0001848 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0003696 0.0003696 0.0000000 0.0005544 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0001848 0.0000000 0.0000000 0.0005544 0.0000000 0.0000000 0.0001848 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
3 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0001848 0.0000000 0.0000000 0.0000000 0.0000000 0.0007392 0.0000000 0.0000000 0.0000000 0.0000000 0.000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0001848 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0001848 0.0000000 0.0000000 0.0001848 0.000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0001848 0.0000000 0.0000000 0.0000000 0.0000000 0.000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0003696 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0001848 0.0000000 0.0000000 0.0000000 0.0000000 0.0001848 0.0007392 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0001848 0.0000000 0.0000000 0.0001848 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0003696 0.0000000 0.0001848 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0003696 0.0000000 0.0000000 0.0000000 0.0000000 0.0001848 0.0000000 0.0000000 0.0001848 0.0000000 0.0000000 0.0000000 0.0001848 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
4 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0005544 0.0000000 0.0000000 0.0000000 0.0000000 0.000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0001848 0.0000000 0.0000000 0.0000000 0.000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0001848 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0001848 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0003696 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0003696 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0001848 0.0000000 0.0001848 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
5 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0001848 0.0000000 0.0000000 0.0001848 0.0000000 0.000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0001848 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0001848 0.0000000 0.0000000 0.0000000 0.0003696 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0001848 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
6 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0009240 0.0000000 0.0000000 0.0001848 0.0000000 0.000000 0.0000000 0.0003696 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0001848 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0001848 0.0000000 0.0000000 0.0000000 0.0000000 0.0001848 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0001848 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0001848 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
7 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0003696 0.0000000 0.0000000 0.0001848 0.0000000 0.000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0001848 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
8 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0003696 0.0000000 0.0000000 0.0001848 0.0000000 0.000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0001848 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0001848 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
9 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0005544 0.0000000 0.0000000 0.0000000 0.0000000 0.000000 0.0000000 0.0001848 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0001848 0.0000000 0.0000000 0.0000000 0.0000000 0.0001848 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0001848 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0001848 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
10 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0014785 0.0000000 0.0000000 0.0001848 0.0000000 0.000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0001848 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0001848 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0001848 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
11 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0005544 0.0000000 0.0000000 0.0000000 0.0000000 0.000000 0.0000000 0.0001848 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0001848 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
12 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0007392 0.0000000 0.0000000 0.0001848 0.0000000 0.000000 0.0000000 0.0001848 0.0000000 0.0000000 0.0000000 0.0000000 0.0001848 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
13 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0003696 0.0000000 0.0000000 0.0001848 0.0000000 0.000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
14 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.000000 0.0000000 0.0001848 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
15 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0001848 0.0000000 0.0000000 0.0001848 0.0000000 0.000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
16 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0001848 0.0000000 0.0000000 0.0000000 0.0000000 0.000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
20 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0001848 0.0000000 0.0000000 0.0000000 0.0000000 0.000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
21 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0001848 0.0000000 0.000000 0.0000000 0.0001848 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
22 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.000000 0.0000000 0.0001848 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
23 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0001848 0.0000000 0.0000000 0.0000000 0.0000000 0.000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
30 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0001848 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
32 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0001848 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
33 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0001848 0.0000000 0.0000000 0.0000000 0.000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
36 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0001848 0.0000000 0.0000000 0.0000000 0.0000000 0.000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
39 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0001848 0.0000000 0.0000000 0.0000000 0.0000000 0.000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
48 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0001848 0.0000000 0.0000000 0.0000000 0.0000000 0.000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000

Gráficos cualitativos y cuantitativos

Gráfica de barras laminas procesadas por cliente

sss <- aggregate(laminas_procesadas ~ cliente, data = prod1, FUN=sum)
ss <- aggregate(laminas_procesadas ~ cliente, data = prod1, FUN=mean)
as.matrix(ss$laminas_procesadas)
##            [,1]
##  [1,]  10.72093
##  [2,]  28.29065
##  [3,]  60.12500
##  [4,]  41.19418
##  [5,]  13.71696
##  [6,]  56.65153
##  [7,]  46.86364
##  [8,] 118.19086
##  [9,]  39.77853
## [10,]  45.38937
## [11,] 274.25000
## [12,] 120.16667
## [13,]  61.10280
as.matrix(ss$laminas_procesadas)
##            [,1]
##  [1,]  10.72093
##  [2,]  28.29065
##  [3,]  60.12500
##  [4,]  41.19418
##  [5,]  13.71696
##  [6,]  56.65153
##  [7,]  46.86364
##  [8,] 118.19086
##  [9,]  39.77853
## [10,]  45.38937
## [11,] 274.25000
## [12,] 120.16667
## [13,]  61.10280
data <- data.frame(
  name = sss$cliente,
  average = ss$laminas_procesadas,
  number = sss$laminas_procesadas
)

my_bar <- barplot(height=data$number, names=data$name)

En este caso se puede sustentar que Form destina una parte fuerte de sus operaciones a los clientes de STABIULUS 3, TRMX, VL y Denso. En otras palabras, La mayor parte de producción es destinada a estos clientes.

summary(prod1)
##     fecha                 cliente      piezas_prog     tiempo_minutos    
##  Length:5411        STABILUS 1:1635   Min.   :   0.0   Min.   :  0.3854  
##  Class :character   TRMX      : 981   1st Qu.:  25.0   1st Qu.: 20.0000  
##  Mode  :character   STABILUS 3: 887   Median :  60.0   Median : 20.0000  
##                     YANFENG   : 646   Mean   : 111.9   Mean   : 21.1835  
##                     DENSO     : 524   3rd Qu.: 150.0   3rd Qu.: 20.0000  
##                     (Other)   : 737   Max.   :2000.0   Max.   :150.0000  
##                     NA's      :   1                                      
##  estacion_arranque laminas_procesadas tiempo_calidad  
##          : 546     Min.   :   0.00    Min.   : 0.000  
##  0       : 478     1st Qu.:   0.00    1st Qu.: 1.000  
##  TROQUEL : 422     Median :  11.00    Median : 1.000  
##  CAJAS   : 331     Mean   :  47.98    Mean   : 1.046  
##  ROTATIVA: 270     3rd Qu.:  28.50    3rd Qu.: 1.000  
##  C3      : 263     Max.   :1263.00    Max.   :48.000  
##  (Other) :3101
ggplot(prod1, aes(cliente,tiempo_calidad)) +                                    
  geom_bar(stat = "identity") +
  scale_fill_brewer(palette = "Set2") + ggtitle("TIEMPO INVERTIDO DE CALIDAD POR CLIENTE") 

En este caso, se puede identificar el comportamiento operativo de FORM, donde evidentemente se le invierte tiempo de calidad más fuerte a clientes que demandan más pedidos por parte de form; Queriendo decir que entre mayor sea la demanda del cliente, mayor será el tiempo de calidad invertido respectivamente.

Gráfica cualitativa

pie(table(prod1$cliente))

En este caso, se pueden identificar los clientes que aparecen más en la base de datos de Form. Ahora bien, esto no significa que sean los clientes que contribuyen en mayor medida a la operación, ni mucho menos a los ingresos de Form, sin embargo es imperativo tomar en cuenta que al aparecer en esta grafica, significa que muy probablemente hacen muchos pedidos, pero no necesariamente que demanden muchas piezas.

Gráficas de disperción

plot(prod1$piezas_prog,prod1$laminas_procesadas, col="red", xlab="Laminas Programadas",ylab="Laminas Procesadas")

En este caso, se puede identificar que la gran parte de la actividad de form en lo que respecta su productividad en función de la producción programada es que sus pedidos se constituyen en su mayoría por pedidos relativamente pequeños.

Gráfica de disperción

plot(prod1$laminas_procesadas,prod1$tiempo_minutos, col="blue", xlab="Laminas Programadas",ylab="Laminas Procesadas")

Tabla de estadisticos

Se utilizarán las variables más útiles para el estudio.

moda <- function(x) {
  ux <- unique(x)    
  ux[which.max(tabulate(match(x, ux)))]      
}    
mea2 <- mean(prod1$fecha)
## Warning in mean.default(prod1$fecha): argument is not numeric or logical:
## returning NA
med2 <- median(prod1$fecha)
moda2 <- moda(prod1$fecha)
sd2 <- sd(prod$fecha, na.rm = TRUE)
## Warning in var(if (is.vector(x) || is.factor(x)) x else as.double(x), na.rm =
## na.rm): NAs introduced by coercion
mea3 <- mean(prod1$piezas_prog)
med3 <- median(prod1$piezas_prog)
moda3 <- moda(prod1$piezas_prog)
sd3 <- sd(prod1$piezas_prog, na.rm = TRUE)
mea4 <- mean(prod1$tiempo_minutos)
med4 <- median(prod1$tiempo_minutos)
moda4 <- moda(prod1$tiempo_minutos)
sd4 <- sd(prod1$tiempo_minutos, na.rm = TRUE)
mea5 <- mean(prod1$laminas_procesadas)
med5 <- median(prod1$laminas_procesadas)
moda5 <- moda(prod1$laminas_procesadas)
sd5 <- sd(prod1$Real.arrival, na.rm = TRUE)
Variables <-c("fecha", "piezas_prog", "tiempo_minutos", "laminas_procesadas")
Media <-c(mea2,mea3,mea4, mea5)
Mediana <-c(med2,med3,med4, med5)
Moda <-c(moda2,moda3,moda4, moda5)
Desviacion <-c(sd2,sd3,sd4, sd5)
tabla2 <-data.frame(Variables, Media, Mediana, Moda, Desviacion)
knitr::kable(tabla2)
Variables Media Mediana Moda Desviacion
fecha NA 16/08/2022 08/09/2022 NA
piezas_prog 111.94678 60 60 143.379386
tiempo_minutos 21.18350 20 20 9.447922
laminas_procesadas 47.98421 11 11 NA

Barplotsy dispercion plots presentados anteriormente.

Time series plot

plot(prod1$piezas_prog, xlab = "Tiempo", ylab = "Piezas programadas")
polygon(prod1$tiempo_calidad, col="green", border="black") 

*Como se especificó anteriormente, se desconoce la razoón por la cual mi computadora no corre la time plot correctamente, sin embargo me gustaría interpretar la gráfica que me genera el código.

En este caso, se puede interpretar que el numero de instancias donde se programan mayores nuemeros de pedidos de piezas es durante el penultimo cuarto del año, así como principios del siguiente año, mientras que a mediados del año presente existe una cantidad estable de pedidos programados y por consiguiente podemos concluir que Form emplea mayor producción en estos periodos del año y por lo tanto podemos asumir y sustentar que es cuando generan mayor parte de los ingresos.

Merma

#file.choose()
merma <- read.csv("/Users/carlosgonzalez/Desktop/FORM - Merma1.csv")

Limpiar base de datos

Eliminar datos NA

sum(is.na(merma))
## [1] 0

En este caso se considera importante corroborar que no existan datos invalidos como NA’s en la base de datos para que en dado caso, se reemplacen por 0’s

Variables y registros

str(merma)
## 'data.frame':    9 obs. of  2 variables:
##  $ Mes  : chr  "ENERO" "FEBRERO" "Total MARZO" "Total ABRIL" ...
##  $ Kilos: int  14560 22830 22470 18820 23410 18280 19370 32100 13586

Por otra parte, no se percibe que la base de datos requiera de mayor limpieza, ya que cuenta con solo dos variables y 9 registros que correponden a los meses

Clasificación de variables

variables <- c("`Mes`","`Kilos`")
tipos <- c("cualitativo  ", "cuantitativo (discreto)")
escalas <- c("ordinal", "razón")

table1 <- data.frame (variables, tipos, escalas)
knitr::kable(table1)
variables tipos escalas
Mes cualitativo ordinal
Kilos cuantitativo (discreto) razón

#Tabla de frecuencia

  proportion <- prop.table(table(merma$Mes,merma$Kilos))
proportion %>%
  kbl() %>%
  kable_styling()
13586 14560 18280 18820 19370 22470 22830 23410 32100
ENERO 0.0000000 0.1111111 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
FEBRERO 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.1111111 0.0000000 0.0000000
Total ABRIL 0.0000000 0.0000000 0.0000000 0.1111111 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
Total AGOSTO 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.1111111
Total JULIO 0.0000000 0.0000000 0.0000000 0.0000000 0.1111111 0.0000000 0.0000000 0.0000000 0.0000000
Total JUNIO 0.0000000 0.0000000 0.1111111 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
Total MARZO 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.1111111 0.0000000 0.0000000 0.0000000
Total MAYO 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.1111111 0.0000000
Total SEPTIEMBRE 0.1111111 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000

Para el caso de la tabla anterior, se puede identificar que existe mayor concentración de merma alrededor de agosto y principios de año.

ggplot(merma, aes(Mes,Kilos)) +                                    
  geom_bar(stat = "identity") +
  scale_fill_brewer(palette = "Set2") + ggtitle("Kilos por mes") 

Como se puede visualizar y corroborar, mediante esta gráfica se puede dar a cuenta de que efectivamente, los meses con mayor producción de merma durante el periodo proporcionado es el mes de agosto. Sin embargo, se considera valioso poner sobre la mesa que existe un mes pico cada cuarto (Q) del año con una mayor concentración en el ultimo mes del 2do cuarto y un aumento considerable a principios del primer cuarto. Esto nos dice que de acuerdo a la producción a partir de los pedidos programados, los cuales coinciden con la hipotesis propuesta, da razón a que sobretodo en agosto se produzcan mayores desperdicios dada la operación.

summary(merma)
##      Mes                Kilos      
##  Length:9           Min.   :13586  
##  Class :character   1st Qu.:18280  
##  Mode  :character   Median :19370  
##                     Mean   :20603  
##                     3rd Qu.:22830  
##                     Max.   :32100
moda <- function(x) {
  ux <- unique(x)    
  ux[which.max(tabulate(match(x, ux)))]      
}    
mea1 <- mean(merma$Kilos)
med1 <- median(merma$Kilos)
moda1 <- moda(merma$Kilos)
sd1 <- sd(merma$Kilos, na.rm = TRUE)
Variables <-c("Kilos")
Media <-c(mea1)
Mediana <-c(med1)
Moda <-c(moda1)
Desviacion <-c(sd1)
tabla2 <-data.frame(Variables, Media, Mediana, Moda, Desviacion)
knitr::kable(tabla2)
Variables Media Mediana Moda Desviacion
Kilos 20602.89 19370 14560 5526.723

Variables Media Mediana Moda Desviacion Cantidad 20602.89 19370 1 5526.723 Para este caso se tiene que el promedio de merma generado es de 20,602kg ## Box plot

boxplot(merma$Kilos , vertical = TRUE)

Con el box plot anterior se puede identificar que por lo general los kilos que se generan provenientes de la materia prima es de entre 150K - 250K, lo cual es importante para saber el rango en el que se puede operar para deasrrollar una propuesta en lo que respecta el seguimiento de esta materia sobrante.

hist(merma$Kilos,main="Rango de kilos producidos",xlab="Kilos producidos",col='#FF7F24')

Con este histograma se puede dar a cuenta de que la inmensa mayoría de las cantidades en el contexto de desperdicios se encuentra concentrada dentro de un rango de entre 150,000 - 250,000 kilos, lo cual se considera información de valor ya que es importante tomarse en cuenta para identificar posibles usos del material sobrante.

plot(merma$Kilos, xlab = "Mes", ylab = "Kilos")
polygon(merma$Kilos, col="green", border="black")

*La función de time series plot no me permite emplear colores a las lineas para la grafica. En nueva cuenta, se puede identificar que durante el mes 8 (agosto) es cuando hay un pico maximo del periodo total, sin embargo, y de igual manera, se tienen elementos para argumentar que cada cuarto del mes existe un pico; eso si, con mayor pronunciacion y comportamiento alcista durante el mes de agosto.

Scrap

#file.choose()
scrap <- read.csv("/Users/carlosgonzalez/Desktop/FORM _Scrap_Ev2_No_Limpia.csv")

Limpieza de base de datos

Eliminar datos NA

sum(is.na(scrap))
## [1] 0

No se registran datos de este tipo en la base de datos.

Asignar formato òptimo a la fecha dentro de la base de datos

scr1 <- scrap
scr1$Fecha <- as.Date(scr1$Fecha, format = "%d/%m/%Y")
summary(scr1)
##   Referencia            Fecha              Producto            Cantidad     
##  Length:250         Min.   :2022-08-01   Length:250         Min.   : 0.000  
##  Class :character   1st Qu.:2022-08-11   Class :character   1st Qu.: 1.000  
##  Mode  :character   Median :2022-08-19   Mode  :character   Median : 2.000  
##                     Mean   :2022-08-17                      Mean   : 6.696  
##                     3rd Qu.:2022-08-25                      3rd Qu.: 7.000  
##                     Max.   :2022-08-31                      Max.   :96.000  
##  Unidad.de.medida   Ubicación.de.origen Ubicación.de.desecho    Estado         
##  Length:250         Length:250          Length:250           Length:250        
##  Class :character   Class :character    Class :character     Class :character  
##  Mode  :character   Mode  :character    Mode  :character     Mode  :character  
##                                                                                
##                                                                                
## 

Con esta limpieza se pretende ajustar el formato correcto de la fecha para posteriores visualizaciones.

Variables y registros

str(scr1)
## 'data.frame':    250 obs. of  8 variables:
##  $ Referencia          : chr  "SP/08731" "SP/08730" "SP/08729" "SP/08728" ...
##  $ Fecha               : Date, format: "2022-08-31" "2022-08-31" ...
##  $ Producto            : chr  "[BACKFRAME 60% CUELLO ARMADO] 18805. 60% Backframe. Cuello Armado." "[N61506747 CAJA] N61506747. Kit. Caja." "[N61506729 SEPARADOR] N61506729. Kit. Separador." "[341332 DIVISOR - U611 & U625] 341332. U611. U625. Divisor Troquelado." ...
##  $ Cantidad            : num  2 1 1 31 1 1 1 9 2 1 ...
##  $ Unidad.de.medida    : chr  "Unidad(es)" "Unidad(es)" "Unidad(es)" "Unidad(es)" ...
##  $ Ubicación.de.origen : chr  "SAB/Calidad/Entrega de PT" "SAB/Calidad/Entrega de PT" "SAB/Calidad/Entrega de PT" "SAB/Pre-Production" ...
##  $ Ubicación.de.desecho: chr  "Virtual Locations/Scrapped" "Virtual Locations/Scrapped" "Virtual Locations/Scrapped" "Virtual Locations/Scrapped" ...
##  $ Estado              : chr  "Hecho" "Hecho" "Hecho" "Hecho" ...

Clasificación de variables

summary(scr1)
##   Referencia            Fecha              Producto            Cantidad     
##  Length:250         Min.   :2022-08-01   Length:250         Min.   : 0.000  
##  Class :character   1st Qu.:2022-08-11   Class :character   1st Qu.: 1.000  
##  Mode  :character   Median :2022-08-19   Mode  :character   Median : 2.000  
##                     Mean   :2022-08-17                      Mean   : 6.696  
##                     3rd Qu.:2022-08-25                      3rd Qu.: 7.000  
##                     Max.   :2022-08-31                      Max.   :96.000  
##  Unidad.de.medida   Ubicación.de.origen Ubicación.de.desecho    Estado         
##  Length:250         Length:250          Length:250           Length:250        
##  Class :character   Class :character    Class :character     Class :character  
##  Mode  :character   Mode  :character    Mode  :character     Mode  :character  
##                                                                                
##                                                                                
## 
variables <- c("`Referencia`","`Fecha`","`Producto`","`Cantidad`","`Unidad.de.medida`","`Ubicación.de.origen`","`Ubicación.de.desecho`", "`Estado`")
tipos <- c("cualitativo  ", "Cualitativo", "Cualitativo", "cuantitativo (continuo)  ", "cualitativo", "cualitativo", "cualitativo", "`cualitativo`")
escalas <- c("nominal", "ordinal", "nominal", "razon", "nominal", "nominal", "nominal", "nominal")

table1 <- data.frame (variables, tipos, escalas)
knitr::kable(table1)
variables tipos escalas
Referencia cualitativo nominal
Fecha Cualitativo ordinal
Producto Cualitativo nominal
Cantidad cuantitativo (continuo) razon
Unidad.de.medida cualitativo nominal
Ubicación.de.origen cualitativo nominal
Ubicación.de.desecho cualitativo nominal
Estado cualitativo nominal

Tabla de frecuencia

proportion <- prop.table(table(prod1$cliente,prod1$tiempo_calidad))
proportion %>%
  kbl() %>%
  kable_styling()
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 20 21 22 23 30 32 33 36 39 48
0.0029575 0.0048059 0.0001848 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
DENSO 0.0110906 0.0839187 0.0009242 0.0001848 0.0000000 0.0000000 0.0001848 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0001848 0.0000000 0.0001848 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0001848 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
HANON SYSTEMS 0.0000000 0.0029575 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
HELLA 0.0033272 0.0182994 0.0001848 0.0001848 0.0000000 0.0001848 0.0001848 0.0000000 0.0000000 0.0000000 0.0001848 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
MERIDIAN LIGHTWEIGHT 0.0044362 0.0144177 0.0016636 0.0000000 0.0001848 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0001848 0.0000000 0.0001848 0.0000000 0.0001848 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
STABILUS 1 0.0399261 0.2539741 0.0029575 0.0009242 0.0007394 0.0003697 0.0005545 0.0003697 0.0003697 0.0003697 0.0009242 0.0001848 0.0001848 0.0001848 0.0000000 0.0000000 0.0000000 0.0001848 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
STABILUS 3 0.0258780 0.1353050 0.0020333 0.0001848 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0001848 0.0001848 0.0000000 0.0001848 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
STABILUS 3. 0.0009242 0.0057301 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
TRMX 0.0277264 0.1495379 0.0022181 0.0007394 0.0000000 0.0000000 0.0001848 0.0000000 0.0000000 0.0000000 0.0001848 0.0000000 0.0001848 0.0000000 0.0000000 0.0001848 0.0000000 0.0000000 0.0003697 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
VARROC 0.0086876 0.0582255 0.0016636 0.0003697 0.0007394 0.0001848 0.0005545 0.0003697 0.0005545 0.0003697 0.0000000 0.0001848 0.0001848 0.0000000 0.0000000 0.0000000 0.0001848 0.0000000 0.0000000 0.0000000 0.0001848 0.0000000 0.0000000 0.0000000 0.0001848 0.0001848 0.0001848
VL-017-13939 0.0001848 0.0005545 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
VL-017-14086 0.0001848 0.0003697 0.0005545 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
YANFENG 0.0192237 0.0900185 0.0031423 0.0024030 0.0005545 0.0005545 0.0007394 0.0000000 0.0000000 0.0005545 0.0005545 0.0005545 0.0003697 0.0001848 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0001848 0.0000000 0.0000000 0.0001848 0.0001848 0.0000000 0.0000000 0.0000000

Datos estadísticos

Se tomó en cuenta que la unica variable de impacto para el estudio es la de cantidad, ya que se trata de la unica la cual es cuantitativa.

moda <- function(x) {
  ux <- unique(x)    
  ux[which.max(tabulate(match(x, ux)))]      
}    
mea1 <- mean(scr1$Cantidad)
mea1 <- mean(scr1$Cantidad)
med1 <- median(scr1$Cantidad)
moda1 <- moda(scr1$Cantidad)
sd1 <- sd(scr1$Cantidad, na.rm = TRUE)
Variable <- c("Cantidad")
Promedio <- c("6.726")
Moda <- c("1")
Mediana <- c("2")
Varianza <- c("140.747")
Desviación_Estándar <- c("11.863")
tabla <-data.frame(Variable,Promedio, Moda, Mediana, Varianza, Desviación_Estándar)
knitr::kable(tabla)
Variable Promedio Moda Mediana Varianza Desviación_Estándar
Cantidad 6.726 1 2 140.747 11.863

Variables Media Mediana Moda Desviacion

En este caso se puede analizar que en lo que respecta la cantidad, hay una media de entre 6 y 7 piezas por orden; sin embargo, como se ha mencionado anteriormente durante el documento, la mayor parte de la producción de form es en cantidades pequeñas y por consiguiente tiene sentido que la moda sea de 1.

Tabla de frecuencia

Gráficas cuantitativas y cualitativas

summary(scr1)
##   Referencia            Fecha              Producto            Cantidad     
##  Length:250         Min.   :2022-08-01   Length:250         Min.   : 0.000  
##  Class :character   1st Qu.:2022-08-11   Class :character   1st Qu.: 1.000  
##  Mode  :character   Median :2022-08-19   Mode  :character   Median : 2.000  
##                     Mean   :2022-08-17                      Mean   : 6.696  
##                     3rd Qu.:2022-08-25                      3rd Qu.: 7.000  
##                     Max.   :2022-08-31                      Max.   :96.000  
##  Unidad.de.medida   Ubicación.de.origen Ubicación.de.desecho    Estado         
##  Length:250         Length:250          Length:250           Length:250        
##  Class :character   Class :character    Class :character     Class :character  
##  Mode  :character   Mode  :character    Mode  :character     Mode  :character  
##                                                                                
##                                                                                
## 
ggplot(scr1, aes(Producto,Cantidad)) +                                    
  geom_bar(stat = "identity") +
  scale_fill_brewer(palette = "Set2") + ggtitle("Unidades por mes") 

Hallazgo: Posterior al desarrollo de esta grafica, se puede dat a cuenta de que Form tiene una amplia variedad de productos, sin embargo existen unos cuantos (cantidad considerable) la cual se sustenta son productos populares o de alta demanda durante los pedidos.

Cualiativa

pie(table(scr1$Ubicación.de.origen))

En este caso, se puede identificar la distribución de los productos de los pedidos en sus respectivas etapas. En primera instancia se identifica que en su gran mayoría se tiene una tendencia a que los productos pasen por la etapa de pre-production (lo cual tiene sentido ya que es la etapa de preparacion o previa a desarrollar el producto. etapa de planeación por parte del equipo de TI)

Diagrama de dispersion

summary(scr1)
##   Referencia            Fecha              Producto            Cantidad     
##  Length:250         Min.   :2022-08-01   Length:250         Min.   : 0.000  
##  Class :character   1st Qu.:2022-08-11   Class :character   1st Qu.: 1.000  
##  Mode  :character   Median :2022-08-19   Mode  :character   Median : 2.000  
##                     Mean   :2022-08-17                      Mean   : 6.696  
##                     3rd Qu.:2022-08-25                      3rd Qu.: 7.000  
##                     Max.   :2022-08-31                      Max.   :96.000  
##  Unidad.de.medida   Ubicación.de.origen Ubicación.de.desecho    Estado         
##  Length:250         Length:250          Length:250           Length:250        
##  Class :character   Class :character    Class :character     Class :character  
##  Mode  :character   Mode  :character    Mode  :character     Mode  :character  
##                                                                                
##                                                                                
## 
ggplot(scr1, aes(x=Fecha, y=Cantidad, colour=Ubicación.de.origen)) + geom_point()

En este caso se tiene un insight que en lo personal considero bastante curioso, ya que en primera instancia podemos observar como es que los pedidos con más de 25 unidades siempre están en pre-producción, por otro lado, Post producción y entrega de PT están en órdenes menores de 25 unidades. Lo cual significa que Form batalla un poco más con pedidos más grandes y por consiguiente, se considera que valdría la pena indagar en sus procesos internos para evaluar elementos a eficientizar.

PREDICCIÓN

Predicción del Desempeño de la Industria Automotriz USA

#file.choose()
PREDUSA <- read.csv("/Users/carlosgonzalez/Desktop/Base EUA nueva.csv")
library(forecast)
## Registered S3 method overwritten by 'quantmod':
##   method            from
##   as.zoo.data.frame zoo
## Registered S3 method overwritten by 'forecast':
##   method          from  
##   predict.default statip
## 
## Attaching package: 'forecast'
## The following object is masked from 'package:modeest':
## 
##     naive
summary(PREDUSA)
##      Year             Production        Sales         Inflacion     
##  Length:21          Min.   : 5710   Min.   : 7868   Min.   :-0.360  
##  Class :character   1st Qu.:10336   1st Qu.:11582   1st Qu.: 1.590  
##  Mode  :character   Median :11260   Median :13638   Median : 2.130  
##                     Mean   :10705   Mean   :12664   Mean   : 2.126  
##                     3rd Qu.:11960   3rd Qu.:13880   3rd Qu.: 2.850  
##                     Max.   :12774   Max.   :14923   Max.   : 3.840  
##     Pobreza            PIB          Poblacion           Desempleo    
##  Min.   :0.7000   Min.   :36330   Min.   :282162411   Min.   :3.670  
##  1st Qu.:1.0000   1st Qu.:44123   1st Qu.:295516599   1st Qu.:4.620  
##  Median :1.0000   Median :48651   Median :309327143   Median :5.530  
##  Mean   :0.9857   Mean   :50062   Mean   :308023794   Mean   :5.985  
##  3rd Qu.:1.0000   3rd Qu.:56763   3rd Qu.:320738994   3rd Qu.:7.370  
##  Max.   :1.2000   Max.   :65095   Max.   :331501080   Max.   :9.630  
##    Autopartes    
##  Min.   :300543  
##  1st Qu.:466904  
##  Median :501311  
##  Mean   :518449  
##  3rd Qu.:601972  
##  Max.   :668450

Gráfico de correlación

library(corrplot)
PUSA<-subset(PREDUSA,select=-c(Year))
corrplot(cor(PUSA),type='upper',order='hclust',addCoef.col='black')

A manera de insights, en este caso, se puede observar que existe una directa correlación con la variable dependiente autopartes en lo que respecta ventas con 0.56, al igual que las ventas(se puede sustentar que es debido al incremento en demanda de autos y por consiguiente las armadoras continuar produciendo junto con sus proveedores las autopartes, lo cual impacta directamente a Form, ya que por consiguiente se requieren empaques para realizar una logistica sostenible). Por otra parte, se tienen las autopartes con la población, donde se infiere que cuanto mayor es la población, mayor es la necesidad de transporte y por consiguiente, y en conjunto, nuevamente se valida la hipotesis (insight #1).

Modelo predictivo

regresion <- lm(Production~ Inflacion + Pobreza + PIB + Poblacion + Desempleo + Autopartes, data=PREDUSA)
summary (regresion)
## 
## Call:
## lm(formula = Production ~ Inflacion + Pobreza + PIB + Poblacion + 
##     Desempleo + Autopartes, data = PREDUSA)
## 
## Residuals:
##    Min     1Q Median     3Q    Max 
## -353.2 -195.4    2.9  151.9  513.4 
## 
## Coefficients:
##               Estimate Std. Error t value Pr(>|t|)    
## (Intercept)  4.535e+03  1.192e+04   0.380   0.7095    
## Inflacion    5.299e+01  7.411e+01   0.715   0.4864    
## Pobreza     -3.493e+02  5.939e+02  -0.588   0.5658    
## PIB         -2.616e-01  8.870e-02  -2.949   0.0106 *  
## Poblacion    2.454e-05  5.586e-05   0.439   0.6672    
## Desempleo   -9.185e+01  9.657e+01  -0.951   0.3577    
## Autopartes   2.409e-02  1.538e-03  15.661 2.87e-10 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 267.2 on 14 degrees of freedom
## Multiple R-squared:  0.9844, Adjusted R-squared:  0.9777 
## F-statistic: 147.3 on 6 and 14 DF,  p-value: 7.853e-12

Como se puede observar en la tabla, se tiene una r^2 del 98% y por consiguiente se puede sustentar que la hipotesis es valida, donde la variable dependiente de producción, tiene una fuerte correlación las variables independientes listadas anteriormente, por lo que se considera una hipotesis valida para el estudio.

datos_nuevos <- data.frame(Inflacion=2, Pobreza=1, PIB=47195, Poblacion=325122128, Desempleo =5, Autopartes=636320)
predict(regresion,datos_nuevos)
##        1 
## 14793.52
#install.packages("jtools")
summary(PREDUSA)
##      Year             Production        Sales         Inflacion     
##  Length:21          Min.   : 5710   Min.   : 7868   Min.   :-0.360  
##  Class :character   1st Qu.:10336   1st Qu.:11582   1st Qu.: 1.590  
##  Mode  :character   Median :11260   Median :13638   Median : 2.130  
##                     Mean   :10705   Mean   :12664   Mean   : 2.126  
##                     3rd Qu.:11960   3rd Qu.:13880   3rd Qu.: 2.850  
##                     Max.   :12774   Max.   :14923   Max.   : 3.840  
##     Pobreza            PIB          Poblacion           Desempleo    
##  Min.   :0.7000   Min.   :36330   Min.   :282162411   Min.   :3.670  
##  1st Qu.:1.0000   1st Qu.:44123   1st Qu.:295516599   1st Qu.:4.620  
##  Median :1.0000   Median :48651   Median :309327143   Median :5.530  
##  Mean   :0.9857   Mean   :50062   Mean   :308023794   Mean   :5.985  
##  3rd Qu.:1.0000   3rd Qu.:56763   3rd Qu.:320738994   3rd Qu.:7.370  
##  Max.   :1.2000   Max.   :65095   Max.   :331501080   Max.   :9.630  
##    Autopartes    
##  Min.   :300543  
##  1st Qu.:466904  
##  Median :501311  
##  Mean   :518449  
##  3rd Qu.:601972  
##  Max.   :668450
library(jtools)
effect_plot(regresion,pred = Autopartes,interval=TRUE)

En este caso se puede confirmar la alta validéz del modelo, donde la variable independiente se ve sumamente influenciada y en dado caso con crecimiento proporcional a la independiente de producción.

Modelo 2

regresion2 <- lm(Sales~ Inflacion + Pobreza + PIB + Poblacion + Desempleo + Autopartes, data=PREDUSA)
summary (regresion2)
## 
## Call:
## lm(formula = Sales ~ Inflacion + Pobreza + PIB + Poblacion + 
##     Desempleo + Autopartes, data = PREDUSA)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -511.56 -258.33   27.97  179.05  697.03 
## 
## Coefficients:
##               Estimate Std. Error t value Pr(>|t|)    
## (Intercept)  2.133e+04  1.729e+04   1.233    0.238    
## Inflacion   -1.057e+02  1.075e+02  -0.984    0.342    
## Pobreza     -1.475e+03  8.612e+02  -1.712    0.109    
## PIB         -1.234e-01  1.286e-01  -0.960    0.354    
## Poblacion   -3.456e-05  8.099e-05  -0.427    0.676    
## Desempleo   -2.424e+02  1.400e+02  -1.731    0.105    
## Autopartes   2.178e-02  2.231e-03   9.762 1.26e-07 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 387.5 on 14 degrees of freedom
## Multiple R-squared:  0.9713, Adjusted R-squared:  0.959 
## F-statistic: 79.02 on 6 and 14 DF,  p-value: 5.461e-10

Para este caso en especifico, nuevamente se tiene una r^2 con el 97% de confiabilidad y por consiguiente se sostiene que las ventas tienen una directa correlación con las demás variables listadas.

datos_nuevos2 <- data.frame(Inflacion=2, Pobreza=1, PIB=47195, Poblacion=325122128, Desempleo =5, Autopartes=636320)
predict(regresion2,datos_nuevos2)
##        1 
## 15224.71
effect_plot(regresion2,pred=Autopartes,interval=TRUE)

En este caso se puede observar la directa correlación y el comportamiento que se tiene al juntar ambas variables

MEX

Predicción del Desempeño de la Industria Automotriz MEX

#file.choose()
PREDMX <- read.csv("/Users/carlosgonzalez/Desktop/PREDICCION_MX.csv")
library(forecast)
summary(PREDMX)
##       Year           Mes            Venta          Produccion    
##  Min.   :2006   Min.   : 1.00   Min.   : 34927   Min.   :  3722  
##  1st Qu.:2010   1st Qu.: 3.00   1st Qu.: 78543   1st Qu.:189031  
##  Median :2014   Median : 6.00   Median : 88580   Median :248433  
##  Mean   :2014   Mean   : 6.42   Mean   : 94178   Mean   :241511  
##  3rd Qu.:2018   3rd Qu.: 9.00   3rd Qu.:110134   3rd Qu.:292709  
##  Max.   :2022   Max.   :12.00   Max.   :192741   Max.   :382110  
##   Exportacion     Tipo.de.cambio    Inflacion      porcentaje_ocu 
##  Min.   : 15139   Min.   :10.09   Min.   :-0.250   Min.   :93.58  
##  1st Qu.:153219   1st Qu.:12.66   1st Qu.: 0.815   1st Qu.:95.06  
##  Median :209160   Median :13.56   Median : 1.480   Median :95.88  
##  Mean   :201664   Mean   :15.48   Mean   : 1.951   Mean   :95.76  
##  3rd Qu.:243900   3rd Qu.:19.10   3rd Qu.: 2.895   3rd Qu.:96.47  
##  Max.   :327454   Max.   :24.24   Max.   : 7.360   Max.   :97.16  
##  porcentaje_desocu conf_consumidor
##  Min.   :2.840     Min.   :28.67  
##  1st Qu.:3.527     1st Qu.:36.69  
##  Median :4.125     Median :38.47  
##  Mean   :4.244     Mean   :39.15  
##  3rd Qu.:4.940     3rd Qu.:42.58  
##  Max.   :6.420     Max.   :47.83

Limpieza base de datos

# Limpieza de la base de datos
# Eliminar columnas irrelevantes 
PREDMX <- subset(PREDMX, select = -c ( Venta))
summary(PREDMX)
##       Year           Mes          Produccion      Exportacion    
##  Min.   :2006   Min.   : 1.00   Min.   :  3722   Min.   : 15139  
##  1st Qu.:2010   1st Qu.: 3.00   1st Qu.:189031   1st Qu.:153219  
##  Median :2014   Median : 6.00   Median :248433   Median :209160  
##  Mean   :2014   Mean   : 6.42   Mean   :241511   Mean   :201664  
##  3rd Qu.:2018   3rd Qu.: 9.00   3rd Qu.:292709   3rd Qu.:243900  
##  Max.   :2022   Max.   :12.00   Max.   :382110   Max.   :327454  
##  Tipo.de.cambio    Inflacion      porcentaje_ocu  porcentaje_desocu
##  Min.   :10.09   Min.   :-0.250   Min.   :93.58   Min.   :2.840    
##  1st Qu.:12.66   1st Qu.: 0.815   1st Qu.:95.06   1st Qu.:3.527    
##  Median :13.56   Median : 1.480   Median :95.88   Median :4.125    
##  Mean   :15.48   Mean   : 1.951   Mean   :95.76   Mean   :4.244    
##  3rd Qu.:19.10   3rd Qu.: 2.895   3rd Qu.:96.47   3rd Qu.:4.940    
##  Max.   :24.24   Max.   : 7.360   Max.   :97.16   Max.   :6.420    
##  conf_consumidor
##  Min.   :28.67  
##  1st Qu.:36.69  
##  Median :38.47  
##  Mean   :39.15  
##  3rd Qu.:42.58  
##  Max.   :47.83

Eliminar NA’s

sum(is.na(PREDMX))
## [1] 0
PREDMX <- na.omit(PREDMX)
summary(PREDMX)
##       Year           Mes          Produccion      Exportacion    
##  Min.   :2006   Min.   : 1.00   Min.   :  3722   Min.   : 15139  
##  1st Qu.:2010   1st Qu.: 3.00   1st Qu.:189031   1st Qu.:153219  
##  Median :2014   Median : 6.00   Median :248433   Median :209160  
##  Mean   :2014   Mean   : 6.42   Mean   :241511   Mean   :201664  
##  3rd Qu.:2018   3rd Qu.: 9.00   3rd Qu.:292709   3rd Qu.:243900  
##  Max.   :2022   Max.   :12.00   Max.   :382110   Max.   :327454  
##  Tipo.de.cambio    Inflacion      porcentaje_ocu  porcentaje_desocu
##  Min.   :10.09   Min.   :-0.250   Min.   :93.58   Min.   :2.840    
##  1st Qu.:12.66   1st Qu.: 0.815   1st Qu.:95.06   1st Qu.:3.527    
##  Median :13.56   Median : 1.480   Median :95.88   Median :4.125    
##  Mean   :15.48   Mean   : 1.951   Mean   :95.76   Mean   :4.244    
##  3rd Qu.:19.10   3rd Qu.: 2.895   3rd Qu.:96.47   3rd Qu.:4.940    
##  Max.   :24.24   Max.   : 7.360   Max.   :97.16   Max.   :6.420    
##  conf_consumidor
##  Min.   :28.67  
##  1st Qu.:36.69  
##  Median :38.47  
##  Mean   :39.15  
##  3rd Qu.:42.58  
##  Max.   :47.83
# Gráfico de corelación
MEX<-subset(PREDMX,select=-c(Year, Mes))
corrplot(cor(MEX),type='upper',order='hclust',addCoef.col='black') 

Se puede observar cómo es que el desempleo afecta negativamente a todas las variables, incluyendo la exportación y el tipo de cambio

Modelo predictivo

# Modelo predictivo
summary(PREDMX)
##       Year           Mes          Produccion      Exportacion    
##  Min.   :2006   Min.   : 1.00   Min.   :  3722   Min.   : 15139  
##  1st Qu.:2010   1st Qu.: 3.00   1st Qu.:189031   1st Qu.:153219  
##  Median :2014   Median : 6.00   Median :248433   Median :209160  
##  Mean   :2014   Mean   : 6.42   Mean   :241511   Mean   :201664  
##  3rd Qu.:2018   3rd Qu.: 9.00   3rd Qu.:292709   3rd Qu.:243900  
##  Max.   :2022   Max.   :12.00   Max.   :382110   Max.   :327454  
##  Tipo.de.cambio    Inflacion      porcentaje_ocu  porcentaje_desocu
##  Min.   :10.09   Min.   :-0.250   Min.   :93.58   Min.   :2.840    
##  1st Qu.:12.66   1st Qu.: 0.815   1st Qu.:95.06   1st Qu.:3.527    
##  Median :13.56   Median : 1.480   Median :95.88   Median :4.125    
##  Mean   :15.48   Mean   : 1.951   Mean   :95.76   Mean   :4.244    
##  3rd Qu.:19.10   3rd Qu.: 2.895   3rd Qu.:96.47   3rd Qu.:4.940    
##  Max.   :24.24   Max.   : 7.360   Max.   :97.16   Max.   :6.420    
##  conf_consumidor
##  Min.   :28.67  
##  1st Qu.:36.69  
##  Median :38.47  
##  Mean   :39.15  
##  3rd Qu.:42.58  
##  Max.   :47.83
regresion_mx1 <- lm(Exportacion ~ Tipo.de.cambio + Produccion + Inflacion + porcentaje_ocu + porcentaje_desocu + conf_consumidor, data=PREDMX)
summary(regresion_mx1)
## 
## Call:
## lm(formula = Exportacion ~ Tipo.de.cambio + Produccion + Inflacion + 
##     porcentaje_ocu + porcentaje_desocu + conf_consumidor, data = PREDMX)
## 
## Residuals:
##    Min     1Q Median     3Q    Max 
## -40333  -9991  -1940   8334  56413 
## 
## Coefficients: (1 not defined because of singularities)
##                     Estimate Std. Error t value Pr(>|t|)    
## (Intercept)       -6.645e+04  1.637e+05  -0.406  0.68529    
## Tipo.de.cambio     2.317e+03  3.967e+02   5.842 2.15e-08 ***
## Produccion         7.634e-01  2.002e-02  38.126  < 2e-16 ***
## Inflacion          2.393e+03  7.697e+02   3.109  0.00216 ** 
## porcentaje_ocu     1.330e+01  1.797e+03   0.007  0.99410    
## porcentaje_desocu         NA         NA      NA       NA    
## conf_consumidor    1.071e+03  3.543e+02   3.023  0.00284 ** 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 16240 on 194 degrees of freedom
## Multiple R-squared:  0.9344, Adjusted R-squared:  0.9327 
## F-statistic: 552.9 on 5 and 194 DF,  p-value: < 2.2e-16

MODELO 1

summary(PREDMX)
##       Year           Mes          Produccion      Exportacion    
##  Min.   :2006   Min.   : 1.00   Min.   :  3722   Min.   : 15139  
##  1st Qu.:2010   1st Qu.: 3.00   1st Qu.:189031   1st Qu.:153219  
##  Median :2014   Median : 6.00   Median :248433   Median :209160  
##  Mean   :2014   Mean   : 6.42   Mean   :241511   Mean   :201664  
##  3rd Qu.:2018   3rd Qu.: 9.00   3rd Qu.:292709   3rd Qu.:243900  
##  Max.   :2022   Max.   :12.00   Max.   :382110   Max.   :327454  
##  Tipo.de.cambio    Inflacion      porcentaje_ocu  porcentaje_desocu
##  Min.   :10.09   Min.   :-0.250   Min.   :93.58   Min.   :2.840    
##  1st Qu.:12.66   1st Qu.: 0.815   1st Qu.:95.06   1st Qu.:3.527    
##  Median :13.56   Median : 1.480   Median :95.88   Median :4.125    
##  Mean   :15.48   Mean   : 1.951   Mean   :95.76   Mean   :4.244    
##  3rd Qu.:19.10   3rd Qu.: 2.895   3rd Qu.:96.47   3rd Qu.:4.940    
##  Max.   :24.24   Max.   : 7.360   Max.   :97.16   Max.   :6.420    
##  conf_consumidor
##  Min.   :28.67  
##  1st Qu.:36.69  
##  Median :38.47  
##  Mean   :39.15  
##  3rd Qu.:42.58  
##  Max.   :47.83
effect_plot(regresion_mx1,pred=Produccion,interval=TRUE)
## Warning in predict.lm(model, newdata = pm, se.fit = interval, interval =
## int.type[1], : prediction from a rank-deficient fit may be misleading

Se observa la fuerte correlación entre mayor demanda, mayor producción

Modelo 2

regresion_mx2 <- lm(conf_consumidor ~ Tipo.de.cambio + Inflacion + porcentaje_ocu + porcentaje_desocu + Produccion, data=PREDMX)
summary(regresion_mx2)
## 
## Call:
## lm(formula = conf_consumidor ~ Tipo.de.cambio + Inflacion + porcentaje_ocu + 
##     porcentaje_desocu + Produccion, data = PREDMX)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -10.715  -2.299   0.395   2.195   7.314 
## 
## Coefficients: (1 not defined because of singularities)
##                     Estimate Std. Error t value Pr(>|t|)    
## (Intercept)       -1.844e+02  3.035e+01  -6.075 6.39e-09 ***
## Tipo.de.cambio    -2.555e-01  7.808e-02  -3.273  0.00126 ** 
## Inflacion         -1.234e-01  1.553e-01  -0.794  0.42788    
## porcentaje_ocu     2.367e+00  3.213e-01   7.367 4.81e-12 ***
## porcentaje_desocu         NA         NA      NA       NA    
## Produccion         4.413e-06  4.035e-06   1.094  0.27551    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 3.282 on 195 degrees of freedom
## Multiple R-squared:  0.2349, Adjusted R-squared:  0.2192 
## F-statistic: 14.97 on 4 and 195 DF,  p-value: 1.098e-10
summary(PREDMX)
##       Year           Mes          Produccion      Exportacion    
##  Min.   :2006   Min.   : 1.00   Min.   :  3722   Min.   : 15139  
##  1st Qu.:2010   1st Qu.: 3.00   1st Qu.:189031   1st Qu.:153219  
##  Median :2014   Median : 6.00   Median :248433   Median :209160  
##  Mean   :2014   Mean   : 6.42   Mean   :241511   Mean   :201664  
##  3rd Qu.:2018   3rd Qu.: 9.00   3rd Qu.:292709   3rd Qu.:243900  
##  Max.   :2022   Max.   :12.00   Max.   :382110   Max.   :327454  
##  Tipo.de.cambio    Inflacion      porcentaje_ocu  porcentaje_desocu
##  Min.   :10.09   Min.   :-0.250   Min.   :93.58   Min.   :2.840    
##  1st Qu.:12.66   1st Qu.: 0.815   1st Qu.:95.06   1st Qu.:3.527    
##  Median :13.56   Median : 1.480   Median :95.88   Median :4.125    
##  Mean   :15.48   Mean   : 1.951   Mean   :95.76   Mean   :4.244    
##  3rd Qu.:19.10   3rd Qu.: 2.895   3rd Qu.:96.47   3rd Qu.:4.940    
##  Max.   :24.24   Max.   : 7.360   Max.   :97.16   Max.   :6.420    
##  conf_consumidor
##  Min.   :28.67  
##  1st Qu.:36.69  
##  Median :38.47  
##  Mean   :39.15  
##  3rd Qu.:42.58  
##  Max.   :47.83
effect_plot(regresion_mx2,pred=Produccion,interval=TRUE)
## Warning in predict.lm(model, newdata = pm, se.fit = interval, interval =
## int.type[1], : prediction from a rank-deficient fit may be misleading

Tanto en la regresion como en el plot, ser observa que la r^2 (+-20%) no tiene una correlación tan fuerte en función de la confianza del consumidor y la producción.

PRONÓSTICO

Pronóstico del Desempeño de la Industria Automotriz USA

#file.choose()
pronosUSA <- read.csv("/Users/carlosgonzalez/Desktop/Pronosico_Produccion_de_autos_USA.csv")
library(forecast)
summary(pronosUSA)
##     Unidades         Años     
##  Min.   :1468   Min.   :2016  
##  1st Qu.:1768   1st Qu.:2018  
##  Median :2513   Median :2019  
##  Mean   :2465   Mean   :2019  
##  3rd Qu.:2909   3rd Qu.:2020  
##  Max.   :3917   Max.   :2022

Principalmente, cuáles son las variables explanatorias que muestran un impacto significativo en la variable dependiente? Cómo es el impacto de dichas variables explanatorias sobre la variable dependiente?

p1 <- ts(data = pronosUSA$Unidades, start = c(2016), frequency = 1)
modelo <- auto.arima(p1)
modelo
## Series: p1 
## ARIMA(0,1,0) with drift 
## 
## Coefficients:
##           drift
##       -408.1667
## s.e.   102.9936
## 
## sigma^2 = 76378:  log likelihood = -41.7
## AIC=87.39   AICc=91.39   BIC=86.98
pronosUSA <- forecast(modelo, level=c(95), h=3)
pronosUSA
##      Point Forecast     Lo 95    Hi 95
## 2023      1059.8333  518.1683 1601.498
## 2024       651.6667 -114.3634 1417.697
## 2025       243.5000 -694.6914 1181.691
plot(pronosUSA,main="Pronostico de producción de auto en Estados Unidos", ylab="Producción en USA")

Interpretación De acuerdo con el analisis pronosticado, se puede sustentar que la producción de autos en estados unidos experimentará una contracción o comportamiento bajista durante los siguientes 3 años. Esto es algo imperativo a considerar, ya que Form, en el contexto internacional tiene a USA como uno de los prcincipales clientes (marcas de autos) y por consiguiente, en este caso y dado el pronostico, se recomendaría que la empresa comenzara a voltear a ver otras industrias a lo menos en el contexto macro de estados unidos.

Pronóstico del Desempeño de la Industria Automotriz MEX

#file.choose()
pronosMEX <- read.csv("/Users/carlosgonzalez/Desktop/Produccion_autos_MX_2016_2022.csv")
library(forecast)
#install.packages("forecast")
summary(pronosMEX)
##     Periodo        Unidades   
##  Min.   :2016   Min.   : 708  
##  1st Qu.:2018   1st Qu.: 904  
##  Median :2019   Median :1397  
##  Mean   :2019   Mean   :1343  
##  3rd Qu.:2020   3rd Qu.:1746  
##  Max.   :2022   Max.   :1996
p1 <- ts(data = pronosMEX$Unidades, start = c(2016), frequency = 1)
modelo <- auto.arima(p1)
modelo
## Series: p1 
## ARIMA(0,1,0) 
## 
## sigma^2 = 69482:  log likelihood = -41.96
## AIC=85.92   AICc=86.92   BIC=85.71
pronosMEX <- forecast(modelo, level=c(95), h=3)
pronosMEX
##      Point Forecast     Lo 95    Hi 95
## 2023            841 324.36389 1357.636
## 2024            841 110.36620 1571.634
## 2025            841 -53.83999 1735.840
plot(pronosMEX,main="Pronostico de producción de auto en Mexico", ylab="Producción en MX")

Interpretación: Para el caso de México, se tiene pronosticado que que tras el 2021, se tratara de un comportamiento alcista y se mantenga durante los siguientes 3 años. Por lo tanto, se puede sustentar que continuar on esta linea de negocio en mexico es viable y en todo caso sostenible en el mediano - largo plazo.

Pronostico FORM

BAE DATOS FORM | Merma

#file.choose()
mer <- read.csv("/Users/carlosgonzalez/Desktop/FORM - Merma1.csv")
summary(mer)
##      Mes                Kilos      
##  Length:9           Min.   :13586  
##  Class :character   1st Qu.:18280  
##  Mode  :character   Median :19370  
##                     Mean   :20603  
##                     3rd Qu.:22830  
##                     Max.   :32100

Pronóstico

a3 <- ts(data = mer$Kilos, start = c(2022,1), frequency = 12)
modelo_pron_merma <- auto.arima(a3)
modelo_pron_merma
## Series: a3 
## ARIMA(0,0,0) with non-zero mean 
## 
## Coefficients:
##            mean
##       20602.889
## s.e.   1736.893
## 
## sigma^2 = 30544665:  log likelihood = -89.8
## AIC=183.59   AICc=185.59   BIC=183.99
forecast_merma <- forecast(modelo_pron_merma, level=c(95), h=3)
forecast_merma
##          Point Forecast    Lo 95    Hi 95
## Oct 2022       20602.89 9770.711 31435.07
## Nov 2022       20602.89 9770.711 31435.07
## Dec 2022       20602.89 9770.711 31435.07
plot(forecast_merma)

En este caso, se puede observar el pronóstico de la producción de merma en Form, donde si bien tuvo una caida pronunciada, se espera que se recupere a un punto estable por lo proximos 3 periodos/años

BASE FORM | Producción

#file.choose()
PROD <- read.csv("/Users/carlosgonzalez/Desktop/produccion.csv")
summary(PROD)
##     fecha                 no           cliente            id_form         
##  Length:5411        Min.   :  1.00   Length:5411        Length:5411       
##  Class :character   1st Qu.: 23.00   Class :character   Class :character  
##  Mode  :character   Median : 46.00   Mode  :character   Mode  :character  
##                     Mean   : 48.55                                        
##                     3rd Qu.: 72.00                                        
##                     Max.   :121.00                                        
##                                                                           
##    producto         piezas_prog        tiempo_minutos       hora_fin        
##  Length:5411        Length:5411        Length:5411        Length:5411       
##  Class :character   Class :character   Class :character   Class :character  
##  Mode  :character   Mode  :character   Mode  :character   Mode  :character  
##                                                                             
##                                                                             
##                                                                             
##                                                                             
##  estacion_arranque  laminas_procesadas inicio_setup       fin_inicio_su     
##  Length:5411        Length:5411        Length:5411        Length:5411       
##  Class :character   Class :character   Class :character   Class :character  
##  Mode  :character   Mode  :character   Mode  :character   Mode  :character  
##                                                                             
##                                                                             
##                                                                             
##                                                                             
##  inicio_proceso     fin_proceso        tiempo_calidad     tiempo_materiales
##  Length:5411        Length:5411        Length:5411        Min.   : 0.000   
##  Class :character   Class :character   Class :character   1st Qu.: 0.000   
##  Mode  :character   Mode  :character   Mode  :character   Median : 0.000   
##                                                           Mean   : 4.568   
##                                                           3rd Qu.: 6.000   
##                                                           Max.   :60.000   
##                                                           NA's   :5152     
##     merma          
##  Length:5411       
##  Class :character  
##  Mode  :character  
##                    
##                    
##                    
## 
PROD$piezas_prog <- as.numeric(PROD$piezas_prog)
## Warning: NAs introduced by coercion
str(PROD)
## 'data.frame':    5411 obs. of  17 variables:
##  $ fecha             : chr  "15/07/2022" "15/07/2022" "15/07/2022" "15/07/2022" ...
##  $ no                : int  1 2 3 4 5 6 7 8 9 10 ...
##  $ cliente           : chr  "STABILUS 1" "STABILUS 1" "STABILUS 1" "STABILUS 1" ...
##  $ id_form           : chr  "" "N.A." "CORTE." "ST-026-13892" ...
##  $ producto          : chr  "STABOMAT 643920. CAJA IMP. CORTE. AZUL.PC0011. ( 2 Pza/Caja)." "KR55006. CAJA IMP. AZUL. CORTE. ( 1 pieza)." "241B KIT. EXPORT. INSERTO CON INSERTO. CORTE para Troquel." "MOPAR GDE. 754549. CAJA IMP. NEGRA. PC0022. ( PC0043: solo si autoriza Calidad). ( 1 Pieza). CORTE." ...
##  $ piezas_prog       : num  200 100 216 100 20 200 100 12 32 500 ...
##  $ tiempo_minutos    : chr  "20" "15" "20" "10" ...
##  $ hora_fin          : chr  "9:20" "9:35" "9:55" "10:05" ...
##  $ estacion_arranque : chr  "C1" "C1" "C1" "C1" ...
##  $ laminas_procesadas: chr  "402" "134" "110" "100" ...
##  $ inicio_setup      : chr  "9:05" "10:05" "9:40" "11.20" ...
##  $ fin_inicio_su     : chr  "9.10" "10:16" "9:43" "11:26" ...
##  $ inicio_proceso    : chr  "9:12" "10.17" "9:45" "11:30" ...
##  $ fin_proceso       : chr  "10:04" "11:05" "9.57" "11:49" ...
##  $ tiempo_calidad    : chr  "1" "1" "1" "1" ...
##  $ tiempo_materiales : int  NA NA NA 7 NA NA NA NA NA NA ...
##  $ merma             : chr  "" "" "" "" ...
PROD$fecha <- as.Date(PROD$fecha, format = "%d%m%Y")

a4 <- ts(data = PROD$piezas_prog, start = c(2022,1), frequency = 12)
modeloPROD <- auto.arima(a4)
modeloPROD
## Series: a4 
## ARIMA(5,1,0) 
## 
## Coefficients:
##           ar1      ar2      ar3      ar4      ar5
##       -0.5716  -0.4128  -0.3184  -0.2467  -0.1415
## s.e.   0.0147   0.0166   0.0168   0.0163   0.0143
## 
## sigma^2 = 16851:  log likelihood = -28837.01
## AIC=57686.02   AICc=57686.04   BIC=57725.6
forecastProd <- forecast(modeloPROD, level=c(95), h=3)
forecastProd
##          Point Forecast      Lo 95    Hi 95
## Dec 2472       218.7385  -35.68441 473.1615
## Jan 2473       189.8464  -86.93677 466.6296
## Feb 2473       181.9135 -108.25340 472.0804
plot(forecastProd)

Para este modelo, se nota que no tiene un porcentaje de confiabilidad certero, sin embargo con base a los datos obtenidos, se identifia que si bien la producción ha tenido unos picos momentaneos, se espera que se mantenga en un punto estable por los proximos 3 periodos, y si bien se mantienen en niveles bajos, se puede comparar con periodos anteriores (la mayoría de los periodos) donde parece ser que es el punto de equilibrio en lo que respecta la capacidad operativa de Form. Por consiguiente, se espera que Form mantenga su nivel de producción normal y de forma estable por los siguientes años.

BASE FORM | Scrap

#file.choose()
scrap <- read.csv("/Users/carlosgonzalez/Desktop/FORM _Scrap_Ev2_No_Limpia.csv")
summary(scrap)
##   Referencia           Fecha             Producto            Cantidad     
##  Length:250         Length:250         Length:250         Min.   : 0.000  
##  Class :character   Class :character   Class :character   1st Qu.: 1.000  
##  Mode  :character   Mode  :character   Mode  :character   Median : 2.000  
##                                                           Mean   : 6.696  
##                                                           3rd Qu.: 7.000  
##                                                           Max.   :96.000  
##  Unidad.de.medida   Ubicación.de.origen Ubicación.de.desecho    Estado         
##  Length:250         Length:250          Length:250           Length:250        
##  Class :character   Class :character    Class :character     Class :character  
##  Mode  :character   Mode  :character    Mode  :character     Mode  :character  
##                                                                                
##                                                                                
## 
scrap$Cantidad <- as.numeric(scrap$Cantidad)
str(scrap)
## 'data.frame':    250 obs. of  8 variables:
##  $ Referencia          : chr  "SP/08731" "SP/08730" "SP/08729" "SP/08728" ...
##  $ Fecha               : chr  "31/08/2022" "31/08/2022" "31/08/2022" "31/08/2022" ...
##  $ Producto            : chr  "[BACKFRAME 60% CUELLO ARMADO] 18805. 60% Backframe. Cuello Armado." "[N61506747 CAJA] N61506747. Kit. Caja." "[N61506729 SEPARADOR] N61506729. Kit. Separador." "[341332 DIVISOR - U611 & U625] 341332. U611. U625. Divisor Troquelado." ...
##  $ Cantidad            : num  2 1 1 31 1 1 1 9 2 1 ...
##  $ Unidad.de.medida    : chr  "Unidad(es)" "Unidad(es)" "Unidad(es)" "Unidad(es)" ...
##  $ Ubicación.de.origen : chr  "SAB/Calidad/Entrega de PT" "SAB/Calidad/Entrega de PT" "SAB/Calidad/Entrega de PT" "SAB/Pre-Production" ...
##  $ Ubicación.de.desecho: chr  "Virtual Locations/Scrapped" "Virtual Locations/Scrapped" "Virtual Locations/Scrapped" "Virtual Locations/Scrapped" ...
##  $ Estado              : chr  "Hecho" "Hecho" "Hecho" "Hecho" ...
scrap$Fecha <- as.Date(scrap$Fecha, format = "%d%m%Y")

a4 <- ts(data = scrap$Cantidad, start = c(2022,1), frequency = 12)
modeloPROD <- auto.arima(a4)
modeloPROD
## Series: a4 
## ARIMA(0,0,0) with non-zero mean 
## 
## Coefficients:
##         mean
##       6.6960
## s.e.  0.7479
## 
## sigma^2 = 140.4:  log likelihood = -972.29
## AIC=1948.58   AICc=1948.63   BIC=1955.63
forecastProd <- forecast(modeloPROD, level=c(95), h=3)
forecastProd
##          Point Forecast     Lo 95    Hi 95
## Nov 2042          6.696 -16.52731 29.91931
## Dec 2042          6.696 -16.52731 29.91931
## Jan 2043          6.696 -16.52731 29.91931
plot(forecastProd)

En este caso, al ir de la mano con merma, se sostiene que se espera un comportamiento bajista actual, para pasar a niveles normales y estables en los demás periodos.

CLUSTERING RH BAJAS

Tomando en cuenta los clusters que se generarán a continuación,se identificarán los insights al final del ejercicio clustering RH bajas de la mano con las distintas visualizaciones desarrolladas (meaningfull insights)

#file.choose()
rh <- read.csv("/Users/carlosgonzalez/Desktop/recursos.humanos.base.limpia.csv")
# descargar y llamar librerías
#install.packages("tidyverse")
library(tidyverse)
#install.packages("foreign")
#install.packages("dplyr")
library(ggplot2)
#install.packages("psych")
library(psych)
#install.packages("corrplot")
library(corrplot)
#install.packages("jtools")
library(jtools)
#install.packages("lmtest")
library(lmtest)
#install.packages("car")
library(car)
#install.packages("factoextra")
library(factoextra)
#install.packages("janitor")
library(janitor)
#install.packages("readr")
library(readr)
#install.packages("plotrix")
library(plotrix)
# Limpiar nombre
rh1 <- clean_names(rh)
# Visualizar base de datos
summary(rh1)
##        x           apellidos            nombre               edad      
##  Min.   :  1.00   Length:233         Length:233         Min.   :19.00  
##  1st Qu.: 75.00   Class :character   Class :character   1st Qu.:23.00  
##  Median : 89.00   Mode  :character   Mode  :character   Median :29.00  
##  Mean   : 87.64                                         Mean   :31.08  
##  3rd Qu.:102.00                                         3rd Qu.:37.00  
##  Max.   :147.00                                         Max.   :61.00  
##  NA's   :56                                                            
##  fecha_de_nacimiento    genero              rfc            fecha_de_alta     
##  Length:233          Length:233         Length:233         Length:233        
##  Class :character    Class :character   Class :character   Class :character  
##  Mode  :character    Mode  :character   Mode  :character   Mode  :character  
##                                                                              
##                                                                              
##                                                                              
##                                                                              
##  motivo_de_baja     dias_laborados        baja              puesto         
##  Length:233         Min.   :   0.00   Length:233         Length:233        
##  Class :character   1st Qu.:   6.00   Class :character   Class :character  
##  Mode  :character   Median :  15.00   Mode  :character   Mode  :character  
##                     Mean   :  72.73                                        
##                     3rd Qu.:  47.00                                        
##                     Max.   :1966.00                                        
##                                                                            
##  departamento       no_seguro_social   salario_diario_imss
##  Length:233         Length:233         Min.   :144.4      
##  Class :character   Class :character   1st Qu.:180.7      
##  Mode  :character   Mode  :character   Median :180.7      
##                                        Mean   :177.9      
##                                        3rd Qu.:180.7      
##                                        Max.   :500.0      
##                                                           
##  factor_cred_infonavit n_credito_infonavit lugar_de_nacimiento
##  Length:233            Length:233          Length:233         
##  Class :character      Class :character    Class :character   
##  Mode  :character      Mode  :character    Mode  :character   
##                                                               
##                                                               
##                                                               
##                                                               
##      curp              calle           numero_interno       colonia         
##  Length:233         Length:233         Length:233         Length:233        
##  Class :character   Class :character   Class :character   Class :character  
##  Mode  :character   Mode  :character   Mode  :character   Mode  :character  
##                                                                             
##                                                                             
##                                                                             
##                                                                             
##  codigo_postal       municipio            estado          estado_civil      
##  Length:233         Length:233         Length:233         Length:233        
##  Class :character   Class :character   Class :character   Class :character  
##  Mode  :character   Mode  :character   Mode  :character   Mode  :character  
##                                                                             
##                                                                             
##                                                                             
##                                                                             
##  tarjeta_cuenta         x_1           
##  Length:233         Length:233        
##  Class :character   Class :character  
##  Mode  :character   Mode  :character  
##                                       
##                                       
##                                       
## 
rh2 <- subset(rh1,select = -c (apellidos, nombre, fecha_de_nacimiento, rfc, fecha_de_alta, baja, departamento, 
                               no_seguro_social, factor_cred_infonavit, n_credito_infonavit, lugar_de_nacimiento,
                               curp, calle, numero_interno, colonia, codigo_postal, municipio, estado))
summary(rh2)
##        x               edad          genero          motivo_de_baja    
##  Min.   :  1.00   Min.   :19.00   Length:233         Length:233        
##  1st Qu.: 75.00   1st Qu.:23.00   Class :character   Class :character  
##  Median : 89.00   Median :29.00   Mode  :character   Mode  :character  
##  Mean   : 87.64   Mean   :31.08                                        
##  3rd Qu.:102.00   3rd Qu.:37.00                                        
##  Max.   :147.00   Max.   :61.00                                        
##  NA's   :56                                                            
##  dias_laborados       puesto          salario_diario_imss estado_civil      
##  Min.   :   0.00   Length:233         Min.   :144.4       Length:233        
##  1st Qu.:   6.00   Class :character   1st Qu.:180.7       Class :character  
##  Median :  15.00   Mode  :character   Median :180.7       Mode  :character  
##  Mean   :  72.73                      Mean   :177.9                         
##  3rd Qu.:  47.00                      3rd Qu.:180.7                         
##  Max.   :1966.00                      Max.   :500.0                         
##                                                                             
##  tarjeta_cuenta         x_1           
##  Length:233         Length:233        
##  Class :character   Class :character  
##  Mode  :character   Mode  :character  
##                                       
##                                       
##                                       
## 
sum(is.na(rh2))
## [1] 56
sapply(rh2, function(x) sum(is.na(x)))
##                   x                edad              genero      motivo_de_baja 
##                  56                   0                   0                   0 
##      dias_laborados              puesto salario_diario_imss        estado_civil 
##                   0                   0                   0                   0 
##      tarjeta_cuenta                 x_1 
##                   0                   0
rh2$edad <- as.numeric(rh2$edad)
rh2$genero <- as.factor(rh2$genero)
rh2$motivo_de_baja <- as.factor(rh2$motivo_de_baja)
rh2$dias_laborados <- as.numeric(rh2$dias_laborados)
rh2$puesto <- as.factor(rh2$puesto)
rh2$salario_diario_imss <- as.numeric(rh2$salario_diario_imss)
rh2$estado_civil <- as.factor(rh2$estado_civil)
summary(rh2)
##        x               edad             genero                motivo_de_baja
##  Min.   :  1.00   Min.   :19.00   FEMENINO :137   ABANDONO           :  1   
##  1st Qu.: 75.00   1st Qu.:23.00   MASCULINO: 96   BAJA POR FALTAS    :139   
##  Median : 89.00   Median :29.00                   JUBILACION         :  1   
##  Mean   : 87.64   Mean   :31.08                   RENUNCIA VOLUNTARIA: 84   
##  3rd Qu.:102.00   3rd Qu.:37.00                   TERMINO DE CONTRATO:  8   
##  Max.   :147.00   Max.   :61.00                                             
##  NA's   :56                                                                 
##  dias_laborados                      puesto    salario_diario_imss
##  Min.   :   0.00   AYUDANTE GENERAL     :171   Min.   :144.4      
##  1st Qu.:   6.00   COSTURERA            : 10   1st Qu.:180.7      
##  Median :  15.00   SOLDADOR             : 10   Median :180.7      
##  Mean   :  72.73   MONTACARGUISTA       :  5   Mean   :177.9      
##  3rd Qu.:  47.00   AY. GENERAL          :  4   3rd Qu.:180.7      
##  Max.   :1966.00   AUXILIAR DE EMBARQUES:  3   Max.   :500.0      
##                    (Other)              : 30                      
##       estado_civil tarjeta_cuenta         x_1           
##  divorcio   :  3   Length:233         Length:233        
##  matrimonio : 63   Class :character   Class :character  
##  Sin Conocer:  1   Mode  :character   Mode  :character  
##  Soltero    :107                                        
##  Unión libre: 59                                        
##                                                         
## 
rh_edad_dias <-rh2 %>% select(salario_diario_imss, edad, dias_laborados)
rh_edad_dias_norm<-scale(rh_edad_dias[2:3]) 
plot(rh_edad_dias_norm)

fviz_nbclust(rh_edad_dias_norm, kmeans, method="wss")+ 
  geom_vline(xintercept=6, linetype=2)+           
  labs(subtitle = "Elbow method")  

cluster1 <-kmeans(rh_edad_dias_norm,5)
cluster1
## K-means clustering with 5 clusters of sizes 43, 4, 68, 8, 110
## 
## Cluster means:
##         edad dias_laborados
## 1  1.5856496     -0.1730602
## 2  1.0544820      6.6446440
## 3  0.2370717     -0.2593203
## 4  0.2767222      1.9190143
## 5 -0.8248684     -0.1532302
## 
## Clustering vector:
##   1   2   3   4   5   6   7   8   9  10  11  12  13  14  15  16  17  18  19  20 
##   4   3   5   5   3   1   3   3   1   5   5   3   5   3   4   5   5   5   5   5 
##  21  22  23  24  25  26  27  28  29  30  31  32  33  34  35  36  37  38  39  40 
##   3   2   5   3   1   5   3   5   5   5   3   5   5   5   3   5   5   4   3   5 
##  41  42  43  44  45  46  47  48  49  50  51  52  53  54  55  56  57  58  59  60 
##   4   4   5   5   5   5   5   5   1   1   1   2   5   1   5   5   1   5   5   5 
##  61  62  63  64  65  66  67  68  69  70  71  72  73  74  75  76  77  78  79  80 
##   5   5   3   5   5   1   5   4   4   5   5   5   3   5   3   5   1   5   5   1 
##  81  82  83  84  85  86  87  88  89  90  91  92  93  94  95  96  97  98  99 100 
##   2   5   1   5   5   5   1   5   5   5   3   1   1   5   5   5   1   3   5   3 
## 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 
##   5   5   1   3   5   5   3   2   3   5   3   3   5   3   3   3   1   1   1   5 
## 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 
##   5   5   5   5   3   5   3   1   5   3   5   4   5   5   5   3   1   3   1   3 
## 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 
##   3   1   1   1   5   3   3   3   5   5   5   3   1   1   5   3   5   3   1   1 
## 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 
##   1   1   3   1   5   5   3   5   5   1   3   1   5   1   3   3   1   3   3   5 
## 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 
##   5   5   3   1   3   3   5   5   3   3   3   3   3   3   5   3   3   3   3   5 
## 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 
##   3   1   3   5   5   5   1   5   5   5   3   3   5   5   3   3   3   1   5   5 
## 221 222 223 224 225 226 227 228 229 230 231 232 233 
##   3   5   5   5   5   1   3   1   5   5   5   5   5 
## 
## Within cluster sum of squares by cluster:
## [1] 11.405375 15.799166  7.976676  7.819045 14.649008
##  (between_SS / total_SS =  87.6 %)
## 
## Available components:
## 
## [1] "cluster"      "centers"      "totss"        "withinss"     "tot.withinss"
## [6] "betweenss"    "size"         "iter"         "ifault"
fviz_cluster(cluster1,data=rh_edad_dias_norm)

rh_edad_sal <-rh2 %>% select(salario_diario_imss, edad, dias_laborados)
rh_edad_sal_norm<-scale(rh_edad_dias[1:2]) 
plot(rh_edad_sal_norm)

fviz_nbclust(rh_edad_sal_norm, kmeans, method="wss")+ 
  geom_vline(xintercept=5, linetype=2)+           
  labs(subtitle = "Elbow method") 

cluster2 <-kmeans(rh_edad_sal_norm,5)
cluster2
## K-means clustering with 5 clusters of sizes 1, 34, 40, 63, 95
## 
## Cluster means:
##   salario_diario_imss        edad
## 1         13.75965225  0.09524497
## 2         -0.11512539  1.83986677
## 3          0.11335568  0.74337807
## 4         -0.11750244 -0.10886552
## 5         -0.07344171 -0.90028748
## 
## Clustering vector:
##   1   2   3   4   5   6   7   8   9  10  11  12  13  14  15  16  17  18  19  20 
##   1   4   5   5   4   2   4   4   2   5   5   4   5   4   4   5   5   5   5   5 
##  21  22  23  24  25  26  27  28  29  30  31  32  33  34  35  36  37  38  39  40 
##   4   2   5   4   2   5   3   5   5   5   4   5   5   5   4   5   5   4   4   5 
##  41  42  43  44  45  46  47  48  49  50  51  52  53  54  55  56  57  58  59  60 
##   5   4   5   5   5   5   5   5   2   2   3   2   5   2   5   5   2   5   5   5 
##  61  62  63  64  65  66  67  68  69  70  71  72  73  74  75  76  77  78  79  80 
##   5   5   3   4   4   3   5   2   4   5   5   5   3   4   3   5   3   5   5   2 
##  81  82  83  84  85  86  87  88  89  90  91  92  93  94  95  96  97  98  99 100 
##   4   4   2   5   5   5   3   5   5   5   4   3   2   5   5   4   2   4   5   4 
## 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 
##   5   5   3   4   5   5   3   4   3   5   4   4   5   3   4   4   2   2   2   5 
## 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 
##   5   5   5   5   4   5   3   2   4   3   5   2   5   4   4   4   2   4   3   3 
## 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 
##   4   3   2   2   5   4   3   4   5   4   5   3   2   2   5   3   5   3   3   3 
## 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 
##   2   2   4   2   5   4   4   5   4   2   4   2   4   3   4   3   2   3   3   5 
## 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 
##   5   5   4   2   3   3   5   5   4   3   3   4   3   4   5   4   4   4   4   5 
## 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 
##   4   2   3   5   5   5   2   4   5   5   3   4   5   5   3   3   3   2   4   4 
## 221 222 223 224 225 226 227 228 229 230 231 232 233 
##   4   5   5   5   4   3   4   3   5   5   5   5   5 
## 
## Within cluster sum of squares by cluster:
## [1]  0.000000 13.383803  2.840067 17.829341 23.318853
##  (between_SS / total_SS =  87.6 %)
## 
## Available components:
## 
## [1] "cluster"      "centers"      "totss"        "withinss"     "tot.withinss"
## [6] "betweenss"    "size"         "iter"         "ifault"
fviz_cluster(cluster2,data=rh_edad_sal_norm)

rh_dias_sal <-rh2 %>% select(salario_diario_imss, dias_laborados, edad)
rh_dias_sal_norm<-scale(rh_dias_sal[1:2]) 
plot(rh_dias_sal_norm)

fviz_nbclust(rh_dias_sal_norm, kmeans, method="wss")+ 
  geom_vline(xintercept=5, linetype=2)+           
  labs(subtitle = "Elbow method")  

cluster3 <-kmeans(rh_dias_sal_norm,5)
cluster3
## K-means clustering with 5 clusters of sizes 4, 1, 10, 27, 191
## 
## Cluster means:
##   salario_diario_imss dias_laborados
## 1          -0.3962566     6.64464404
## 2          13.7596523     2.56751686
## 3          -0.3729089     1.50771810
## 4          -1.1243505     0.03652891
## 5           0.1147221    -0.23669924
## 
## Clustering vector:
##   1   2   3   4   5   6   7   8   9  10  11  12  13  14  15  16  17  18  19  20 
##   2   4   4   4   4   4   4   4   4   3   4   4   5   5   3   4   4   4   4   4 
##  21  22  23  24  25  26  27  28  29  30  31  32  33  34  35  36  37  38  39  40 
##   4   1   4   4   5   5   5   5   5   5   5   5   5   5   5   5   4   3   5   5 
##  41  42  43  44  45  46  47  48  49  50  51  52  53  54  55  56  57  58  59  60 
##   3   3   5   5   5   5   5   5   5   5   5   1   3   5   5   5   5   5   5   4 
##  61  62  63  64  65  66  67  68  69  70  71  72  73  74  75  76  77  78  79  80 
##   5   5   5   5   5   5   5   3   3   4   5   5   5   5   5   5   5   5   5   5 
##  81  82  83  84  85  86  87  88  89  90  91  92  93  94  95  96  97  98  99 100 
##   1   4   4   4   4   5   5   5   5   5   5   5   5   5   5   5   4   4   5   5 
## 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 
##   5   5   5   5   5   5   5   1   5   5   5   5   5   5   5   5   5   5   5   5 
## 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 
##   5   5   5   5   5   5   5   5   5   5   5   3   5   5   5   5   5   5   5   5 
## 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 
##   5   5   5   5   5   5   5   5   5   5   5   5   5   5   5   5   5   5   5   5 
## 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 
##   5   5   5   5   5   5   5   5   5   5   5   5   5   5   5   5   5   5   5   5 
## 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 
##   5   5   5   5   5   5   5   5   5   5   5   5   5   5   5   5   5   5   5   5 
## 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 
##   5   5   5   5   5   5   5   5   5   5   5   5   5   5   5   5   5   3   5   5 
## 221 222 223 224 225 226 227 228 229 230 231 232 233 
##   5   5   5   5   5   5   5   5   5   5   5   5   5 
## 
## Within cluster sum of squares by cluster:
## [1] 7.839149 0.000000 6.408768 1.637196 3.455406
##  (between_SS / total_SS =  95.8 %)
## 
## Available components:
## 
## [1] "cluster"      "centers"      "totss"        "withinss"     "tot.withinss"
## [6] "betweenss"    "size"         "iter"         "ifault"
fviz_cluster(cluster3,data=rh_dias_sal_norm)

rh3 <- rh2
rh3$Clusters<-cluster2$cluster
rh4 <- rh3 %>% group_by(Clusters) %>% summarise(edad=max(edad)) %>% arrange(desc(edad))

# Nombrar cada cluster 
rh3$nombres_clusters <- factor(rh3$Clusters,levels = c(1,2,3,4,5), 
                              labels=c("Excepcion", "Jubilados", "Mayores", "Adultos", "Jovenes"))
# Agrupar los datos por nombre de clusters 
library(dplyr)
#install.packages("dplyr")
rh5 <- rh3 %>% group_by(nombres_clusters) %>% dplyr::summarize(edad_años=max(edad), 
                                                        salario_imss=mean(salario_diario_imss),
                                                        Count=n())
clusters<-as.data.frame(rh5)
clusters
##   nombres_clusters edad_años salario_imss Count
## 1        Excepcion        32     500.0000     1
## 2        Jubilados        61     175.2329    34
## 3          Mayores        43     180.5810    40
## 4          Adultos        36     175.1773    63
## 5          Jovenes        26     176.2086    95

Gráficos para identificación de insights

Identificar numero de bajas en función con la edad mediante el cluster previo

ggplot(rh5,aes(x=reorder(nombres_clusters,Count),y=Count,fill=nombres_clusters)) +
  geom_bar(stat="identity")

En este caso, el numero de bajas está relacionado con la edad, ya que como se observa en el gráfico, los jovenes son quienes generan el mayor numero de bajas, seguido de adultos, adultos mayores y jubilados. Con esto se puede inferir que las personas tienen responsabilidades familiares y/o personales que deben atender y por consiguiente, para obtener un salario que aporte a cubrir sus necesidades, entre mayor es la persona, menor es la probabilidad de terminar el contrato con FORM.

Identificación del maximo de edad por grupo

ggplot(rh5, aes(x=nombres_clusters,y=edad_años,fill= nombres_clusters,label=round(edad_años,digits=2))) + 
  geom_col() + 
  geom_text()

Mediante este gráfico se pueden establecer los perfiles con rangos maximos de edad de los colaboradores, por lo que surge una oportunidad de Form para identificar las necesidades de los distintos grupos de edad.

Gráfico de generos de personas quienes se dieron de baja

library(ggplot2)
ggplot(rh3, aes(fill=genero, y=genero, x=nombres_clusters)) + 
  geom_bar(position="stack", stat="identity") 

Como se puede observar en el gráfico, se tiene que en definitiva los hombres son quienes se dan de baja en todos los grupos de edades

Razones de baja por grupos de edad

#summary(rh3)
ggplot(rh3, aes(factor(nombres_clusters), fill = factor(motivo_de_baja))) +
  geom_bar(position = position_dodge2(preserve = "single"))

Dada la gráfica anterior, se puede identificar que la mayor razón por la cual los colaboradores se van de la empresa es debido a la baja por faltas, mientras que un dato importante es que la razón de abandono menos común solo se encuentra presente en los grupos de jovenes y jubilados, quienes por inferencia se puede sustentar que es debido a las responsabilidades de estos grupos de edad. En ocasiones, como lo mencionó el dueño de la empresa, los jovenes solo están poco tiempo para ahorrar en periodos cortos, mientras que los jubilados al estar en esta etapa, simplemente dejan de venir a la empresa.

library(plotrix)
library(jtools)
proporciones <- c(176, 11, 11, 8, 26)
eti <- c("ayudante general", "ayu. soldador/soldador", "costurera", "ayu. embarque", "otros" )
pct <- round(proporciones/sum(proporciones)*100)
eti <- paste(eti, pct)
eti <- paste(eti,"%",sep="")
pie3D(proporciones,labels = eti,
    col=rainbow(length(eti)),
    main="Puestos de bajas")

En este caso, se puede sustentar que la mayoría de los puestos que se dan de baja de la empresa son los de ayudante general; sin embargo y de igual forma, se sostiene la razón de que al ser el puesto con mayor numero de colaboradores, naturalmente se tenga un cesgo que genere el verdadero puesto, sin embargo, al ser un puesto proporcional y objetivamente con más colaboradores (además de que al ser ayudante general, se infiere que no requiere de entrenamiento previo) tiene sentido validar que la independientemente del sesgo mencionado, el ayudante general es quien más abandona la empresa.

Estado civil de bajas

#install.packages("plotrix")
library(plotrix)
proporciones1 <- c(107, 3, 59, 63)
etiquetas <- c("soltero", "divorcio", "union libre", "matrimonio")
pct <- round(proporciones1/sum(proporciones1)*100)
etiquetas <- paste(etiquetas, pct)
etiquetas <- paste(etiquetas,"%",sep="")
pie3D(proporciones1,labels = etiquetas,
      col=rainbow(length(etiquetas)),
      main="Estado civil de bajas")

En pocas palabras, es evidente que los solteros son quienes se dan más de baja de la empresa, ya que al estar en esta posición y probablemente ser jovenes, no cargan con una responsabilidad familiar. Por lado contrario, el grupo de divorsiados son quienes menos se dan de baja, ya que si bien se considera que no es un grupo grande de personas, son quienes ahora tienen responsabilidad de proveer por sus dependientes o por ellos/ellas mismos.

Meaningfull insights

  1. Entre menor es la edad, existe mayor probabilidad de que se den de baja
  2. Los hombres son más propensos a darse de baja de la empresa, lo cual se puede correlacionar con el perfil de hombre joven, quien tiene mayor probabilidad de irse de la empresa.
  3. El grupo de estado civil divorsiado sustenta el 46% de las bajas de la empresa
  4. Con la información anterior, se puede generar un perfil de una persona con mayor probabilidad de datse de baja, el cual es un hombre joven soltero de entre 19 - 26 años con el puesto de ayudante general. por lo tanto, se recomendaría a la empresa que se desarrolle un programa de retención, con la finalidad de no tener rotación tan constante, lo cual puede incluso generar costos adicionales a la empresa.
  5. Como se mencionó anteriormente, la mayoría de los puestos que se dan de baja de la empresa son los de ayudante general; sin embargo y de igual forma, se sostiene la razón de que al ser el puesto con mayor numero de colaboradores, naturalmente se tenga un cesgo que genere el verdadero puesto, sin embargo, al ser un puesto proporcional y objetivamente con más colaboradores (además de que al ser ayudante general, se infiere que no requiere de entrenamiento previo) tiene sentido validar que la independientemente del sesgo mencionado, el ayudante general es quien más abandona la empresa.

Gráfico tipo ggalluvial

summary(rh3)
##        x               edad             genero                motivo_de_baja
##  Min.   :  1.00   Min.   :19.00   FEMENINO :137   ABANDONO           :  1   
##  1st Qu.: 75.00   1st Qu.:23.00   MASCULINO: 96   BAJA POR FALTAS    :139   
##  Median : 89.00   Median :29.00                   JUBILACION         :  1   
##  Mean   : 87.64   Mean   :31.08                   RENUNCIA VOLUNTARIA: 84   
##  3rd Qu.:102.00   3rd Qu.:37.00                   TERMINO DE CONTRATO:  8   
##  Max.   :147.00   Max.   :61.00                                             
##  NA's   :56                                                                 
##  dias_laborados                      puesto    salario_diario_imss
##  Min.   :   0.00   AYUDANTE GENERAL     :171   Min.   :144.4      
##  1st Qu.:   6.00   COSTURERA            : 10   1st Qu.:180.7      
##  Median :  15.00   SOLDADOR             : 10   Median :180.7      
##  Mean   :  72.73   MONTACARGUISTA       :  5   Mean   :177.9      
##  3rd Qu.:  47.00   AY. GENERAL          :  4   3rd Qu.:180.7      
##  Max.   :1966.00   AUXILIAR DE EMBARQUES:  3   Max.   :500.0      
##                    (Other)              : 30                      
##       estado_civil tarjeta_cuenta         x_1               Clusters    
##  divorcio   :  3   Length:233         Length:233         Min.   :1.000  
##  matrimonio : 63   Class :character   Class :character   1st Qu.:3.000  
##  Sin Conocer:  1   Mode  :character   Mode  :character   Median :4.000  
##  Soltero    :107                                         Mean   :3.931  
##  Unión libre: 59                                         3rd Qu.:5.000  
##                                                          Max.   :5.000  
##                                                                         
##   nombres_clusters
##  Excepcion: 1     
##  Jubilados:34     
##  Mayores  :40     
##  Adultos  :63     
##  Jovenes  :95     
##                   
## 
library(ggalluvial)
rhGG <-rh3 %>% filter(Clusters==4 | Clusters==3) %>% arrange(Clusters)

ggplot(as.data.frame(rhGG),
       aes(y=salario_diario_imss, axis1= genero, axis2=estado_civil)) +
  geom_alluvium(aes(fill=nombres_clusters), width = 1/12) +
  geom_stratum(width = 1/12, fill = "black", color = "grey") +
  geom_label(stat = "stratum", aes(label = after_stat(stratum))) +
  scale_x_discrete(limits = c("Género", "Estado civil"), expand = c(.05, .05)) +
  scale_fill_brewer(type = "qual", palette = "Set1") +
  ggtitle("FORM's Salario Diario por Género y Estado Civil")

Meaningfull insights

En este caso se puede sustentar que en general (1) los divorciados ganan más.
Por otra parte, y de manera más especifica, (2) las colaboradores que ganan más en la empresa son mujeres mayores (3) divorciadas, mientras que (4) las que ganan menos son adultas y (5) están en unión libre. Por parte del segmento masculino, se muestra que (6) el que gana más es un hombre mayor (7) divorciado, y (8) el que gana menos está en union libre, (9) perteneciendo al segmento de edad adulta. En conclusión, se sustenta que por tendencia, el salario aumenta o disminuye dependiendo del género y el estado civil.

Trabajo escrito

  1. A partir del análisis de las bases de datos de las diferentes áreas de la empresa FORM, identificar y describir los principales 6-8 hallazgos (meaningful insights).
  1. Por parte del recurso humano, form cuenta con un perfil promedio de colaborador el cual consiste en un hombre joven y soltero de entre 19 - 26 con el puesto de ayudante general. asimismo, se sustenta que dicho perfil, al ser el más concurrido, es el que tiene mayores bajas de la empresa.

  2. La producción en Form, dada la crisis automotriz (la cual sigue en recuperación) ha disminuido, se espera que durante los proximos años se retome la producción a niveles operativos normales junto con un periodo estable de dicha actividad.

  3. Si bien existe una correlación entre los niveles de producción y la merma; esta segunda área se espera que de igualmente recupere sus niveles bajos para pasar a un periodo estable y constante durante los proximos años, lo cual deja lugar a una area de oportunidad a atender de hallar nuevas maneras de aprovechar los desperdicios para crear una economía circular interna, o bien una entrada adicional de ingresos para la empresa.

  4. Como se pudo observar, se pronostica que la producción de autos en estados unidos sufra de un comportamiento bajosta durante los proximos 3 años; a diferencia de méxico el cual por el contrario se pronostica un aumento en la producción durante los proximos periodos. Esta información es de suma relevancia, ya que como lo establece Form con su fuerte relación con automotrices Estadounidenses y dada la pronosticada caida de la prodicción de este producto en USA, se recomendaría a Form de indagar a nuevas entradas a industrias desconocidas donde puedan aportar valor con los activos con los que cuentan actualmente. En pocas palabras, se espera un declieve de producción automotriz en EEUU y por consiguiente Form debe comenzar a investigar nuevas industrias las cuales puede entrar para garantizar su posicionamiento en el mercado y sobrevivencia.

  5. Periodos intensivos de actividad: Según los datos proporcionados y analisados, existen instancias alrededor de una vez cada cuarto del año en donde hay mayor demanda por parte de los clientes, requieriendo mayores pedidos; generando más merma y por consiguiente toda la logistica que esto conlleva (scrap). Dicho lo anterior, se considera pertinente que Form halle nuevas fuentes de ingreso durante los meses de relativa poca actividad operativa.

  6. Como se observó durante el análisis, Form cuenta con una area de oportunidad, tratandose de que la empresa mantiene su punto de equilibrio operacional mientras no exceda un numero mayor a 25 pedidos. Esto se traduce a que existe una area de oportunidad en la capacidad de producción. Para esto, y de la mano con los demás insights del mismo contexto, valdría la pena evaluar una inversión a activos que permitan a Form una mayor expansión y posicionamiento dentro de su industria. Esto con la finalidad de atender a más clientes, con mayor numero de unidades/piezas por producto de manera simultanea, lo cual requeriría eventualmente una serie de inversion no solo de activos fijos, sino tambien de capital humano (y todo lo que conlleva dicha tarea) así como de logística, R&D, sin tomar en cuenta el insight anterior de investigar nuevas industrias a las cuales atender.

  7. RRHH | Dados los distintos analisis realizados en este contexto, se tiene como insight que Form tiene distintas combianciones de perfiles en su organización, y si bien como se mencionó con anterioridad, existe un perfil promedio que combina distintas variables (edad, estado civil, genero, puesto, etc) es importante que Form tenga bien establecidos los distintos perfiles de cliente interno para que con ello pueda adaptarse y atender sus necesidades en contexto de desarrollo profesional; lo cual eventual y simultaneamente funcionaría como un puente en el cual se puedan disminuir los niveles de rotación a nivel inerno.

  1. A partir del análisis de las bases de datos de las diferentes áreas de la empresa FORM, describir 3 sugerencias que le permitan al socio formador mejorar su proceso de captura, organización, y analítica de datos.

Sugerencia 1: Si bien es poco probable que una organización con el tamaño de Form (chica-mediana) tenga la capacidad y motivas para desarrollar internamente su propia plataforma de información, se puede sugerir en invertir en un una plataforma terciarizada que permita a la empresa sistematizar y automatizar sus procesos de captura y organización de datos, para una posterior analitica de los mismos que pueda ser visualizada por todas las áreas de la empresa y obtener mayor poder de decisión.

Sugerencia 2: Dada la enriquecedora experiencia de socio formador - alumno ITESM, donde se pudo dar a cuenta de que las bases de datos no tenian (a grandes rasgos) el formato óptimo para su anaálisis, se plantearía que Form, con base a esta experiencia, desarrolle una serie de formatos dependiendo de las necesidades y requerimientos de los distintos departamentos, donde se realicen formatos institucionales establecidos y de uso permanente que sean de utilidad para la captura y organización de sus bases de datos, con la cual puedan analisar el crecimiento en todas sus areas.

Sugerencia 3: De la mano con las otras dos sugerencias, se plantea que se de un enfoque en lo que respecta la preparación de los colaboradores existentes, donde se contraten/impartan cursos/talleres externos con un enfoque hacia la optimización de las practicas en las bases de datos y manejo de la información, con lo cual se tengan los elementos suficientes para tener formatos de información ideales, en conjunto con un personal que gracias a dichos cursos/certificaciones, este lo suficientemente capacitados para desarrrollar una labor de excelencia en lo que respecta la cultura con base a datos. En pocas palabras, invertir en el desarrollo de competencia de los colaboradores administrativos para potenciar la administración de la emrpesa.

Sugerencia extra: En palabras coloquiales, me gustaría añadir que en Form hablaban de encontrar y contratar el mejor talento, pero por que no mejor desarrollar el mejor talento.

Responder las siguientes preguntas:

  • Describir con tus propias palabras los términos Business Analytics y Business Intelligence. Así también, identificar y describir 3 principales diferencias entre Business Analytics y Business Intelligence.

R= En lo personal considero que BI tiene un enfoque más técnico en cuestión de capturar, administar y utilizar la información del pasado y del presente para su posterior descripción y visualización, mientras que Business Analytics percibo que cuenta con un carácter más predictivo, es decir, con BI saber lo que ha sucedido y lo que sucede, y con BA identificar patrones y estrategias predictivas que permitan realizar propuestas de crecimiento a largo plazo en el rubro de interés.

Diferencias:
1. BI es descriptivo, BA es predictivo
2. BA se enfoca en proponer soluciones, mientras que BI se enfoca más en analizar la situación. Ambas van de la mano.
3. BI se centra en recolectar información, mientras que BI destina esa información para realizar visualizaciones predictivas que permitan proponer soluciones y/o siguientes pasos a tomar.

  • Describir con tus propias palabras el concepto de Indicador Clave de Rendimiento / Key Performance Indicators (KPI).

En lo personal, considero que el concepto de los KPIs tratan de desarrollar métricas con enfoque cuantitativo que permitan dar seguimiento y monitoreo de un proceso en especifico para con base a ello ver si se va por la dirección correcta o proponer acciones que permitan mejorar la actividad en cuestión.

  • A partir del análisis de las bases de datos de las diferentes áreas de la empresa FORM, proponer y describir 3 posibles KPIs que permitan evaluar el desempeño de algunas de sus áreas.
  1. Producción: % de eficiencia de activos (con esto se busca evaluar la eficacia de los equips de maquinaria para la producción, con la finalidad de evaluar si existe una sobrecarga de produccion en función de los activos disponibles o es necesaria la inversión de más y/o nuevos activos)
  2. RRHH: % de rotación (entradas y salidas de personal)
  3. % de merma liquida (merma la cual pudo ser comercializada o reutilizada nuevamente)

Fuentes:
What package is best for cluster analysis in R? (s. f.). Quora. Recuperado el 21 de octubre de 2022 en https://www.quora.com/What-package-is-best-for-cluster-analysis-in-R

INEGI (bases de datos externas proporcionadas por la maestra)

Car production USA 2016 - 2022 (Euromonitor, 2022) recuperado el 18 de octubre, 2022 en: https://www.portal.euromonitor.com/portal/?f55ra1h6e0PzNUGtEjobGnvOI0290vyNwvzSxIBZynEgrndowmeCbw%3d%3d

Produccion carros mexico 2016 - 2022 (Euromonitor, 2022) recuperado el 18 de octubre, 2022 en: https://www.portal.euromonitor.com/portal/?%2bVagoqwKr8dnIPUq6bPfEeUzRlFjfDeZzaNi81PY51drWZHGLbqnxw%3d%3d

LS0tCnRpdGxlOiA8c3BhbiBzdHlsZT0iQ29sb3I6Qmx1ZSI+ICJFdmlkZW5jaWEgMiB8IE1hbmVqbywgYW7DoWxpc2lzIGRlIGRhdG9zIHkgcHJvbsOzc3RpY29zIgphdXRob3I6ICJDYXJsb3MgR29uesOhbGV6IEF5ZXJkaSBBMDA4MjkxMjYiCmRhdGU6ICIyMDIyLTEwLTEyIgpvdXRwdXQ6IAogIGh0bWxfZG9jdW1lbnQ6IAogICAgdG9jOiB0cnVlCiAgICB0b2NfZmxvYXQ6IHRydWUKICAgIGNvZGVfZG93bmxvYWQ6IHRydWUKLS0tCjxpbWcgc3JjPSAiL1VzZXJzL2Nhcmxvc2dvbnphbGV6L0Rlc2t0b3AvRk9STS5wbmciPiAKCiMgSW1wb3J0YXIgbGlicmVyw61hcwoKYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KbGlicmFyeShrbml0cikKbGlicmFyeShkcGx5cikKbGlicmFyeShwb2xsc3RlcikKbGlicmFyeShqYW5pdG9yKQpsaWJyYXJ5KGdncGxvdDIpCmxpYnJhcnkobmFuaWFyKQpsaWJyYXJ5KEhtaXNjKQpsaWJyYXJ5KHBzeWNoKQpsaWJyYXJ5KHRpZHl2ZXJzZSkKbGlicmFyeShmb3JlaWduKQpsaWJyYXJ5KGZvcmNhdHMpICAgICAgCmxpYnJhcnkoZGxvb2tyKSAgICAgICAjIHN1bW1hcmllcyBhbmQgdmlzdWFsaXphdGlvbiBvZiBtaXNzaW5nIHZhbHVlcyBOQXMKbGlicmFyeShjb3JycGxvdCkgICAgICMgY29ycmVsYXRpb24gcGxvdHMKbGlicmFyeShqdG9vbHMpICAgICAgICMgcHJlc2VudGF0aW9uIG9mIHJlZ3Jlc3Npb24gYW5hbHlzaXMgCmxpYnJhcnkobG10ZXN0KSAgICAgICAjIGRpYWdub3N0aWMgY2hlY2tzIC0gbGluZWFyIHJlZ3Jlc3Npb24gYW5hbHlzaXMgCmxpYnJhcnkoY2FyKSAgICAgICAgICAjIGRpYWdub3N0aWMgY2hlY2tzIC0gbGluZWFyIHJlZ3Jlc3Npb24gYW5hbHlzaXMKbGlicmFyeShvbHNycikgICAgICAgICMgZGlhZ25vc3RpYyBjaGVja3MgLSBsaW5lYXIgcmVncmVzc2lvbiBhbmFseXNpcyAKbGlicmFyeShrYWJsZUV4dHJhKQpsaWJyYXJ5KG1vZGVlc3QpCiNpbnN0YWxsLnBhY2thZ2VzKCJmb3JlaWduIikKbGlicmFyeShmb3JlaWduKQojaW5zdGFsbC5wYWNrYWdlcygiZm9yY2F0cyIpCmxpYnJhcnkoZm9yY2F0cykgICAgICAjIHRvIHdvcmsgd2l0aCBjYXRlZ29yaWNhbCB2YXJpYWJsZXMKI2luc3RhbGwucGFja2FnZXMgKCJqYW5pdG9yIikKbGlicmFyeShqYW5pdG9yKSAgICAgICMgZGF0YSBleHBsb3JhdGlvbiBhbmQgY2xlYW5pbmcgCiNpbnN0YWxsLnBhY2thZ2VzKCJIbWlzYyIpCmxpYnJhcnkoSG1pc2MpICAgICAgICAjIHNldmVyYWwgdXNlZnVsIGZ1bmN0aW9ucyBmb3IgZGF0YSBhbmFseXNpcyAKI2luc3RhbGwucGFja2FnZXMgKCJwc3ljaCIpCmxpYnJhcnkocHN5Y2gpICAgICAgICAjIGZ1bmN0aW9ucyBmb3IgbXVsdGl2YXJpYXRlIGFuYWx5c2lzIAojaW5zdGFsbC5wYWNrYWdlcygibmFuaWFyIikKbGlicmFyeShuYW5pYXIpICAgICAgICMgc3VtbWFyaWVzIGFuZCB2aXN1YWxpemF0aW9uIG9mIG1pc3NpbmcgdmFsdWVzIE5BcwojaW5zdGFsbC5wYWNrYWdlcygiZGxvb2tyIikKbGlicmFyeShkbG9va3IpICAgICAgICMgc3VtbWFyaWVzIGFuZCB2aXN1YWxpemF0aW9uIG9mIG1pc3NpbmcgdmFsdWVzIE5BcwojaW5zdGFsbC5wYWNrYWdlcyAoImthYmxlRXh0cmEiKQpsaWJyYXJ5KGthYmxlRXh0cmEpCmxpYnJhcnkocmVhZHIpCiNpbnN0YWxsLnBhY2thZ2VzICgiY29ycnBsb3QiKQpsaWJyYXJ5KGNvcnJwbG90KQojaW5zdGFsbC5wYWNrYWdlcyAoImp0b29scyIpCmxpYnJhcnkoanRvb2xzKSAKI2luc3RhbGwucGFja2FnZXMgKCJsbXRlc3QiKQpsaWJyYXJ5KGxtdGVzdCkgCiNpbnN0YWxsLnBhY2thZ2VzICgiY2FyIikKbGlicmFyeShjYXIpIAojaW5zdGFsbC5wYWNrYWdlcyAoIm9sc3JyIikKbGlicmFyeShvbHNycikgCiNpbnN0YWxsLnBhY2thZ2VzICgiZ21vZGVscyIpCmxpYnJhcnkoZ21vZGVscykKbGlicmFyeSh0aWR5dmVyc2UpCiNpbnN0YWxsLnBhY2thZ2VzKCJmb3JlaWduIikKI2luc3RhbGwucGFja2FnZXMoImRwbHlyIikKbGlicmFyeShnZ3Bsb3QyKQojaW5zdGFsbC5wYWNrYWdlcygicHN5Y2giKQpsaWJyYXJ5KHBzeWNoKQojaW5zdGFsbC5wYWNrYWdlcygiY29ycnBsb3QiKQpsaWJyYXJ5KGNvcnJwbG90KQojaW5zdGFsbC5wYWNrYWdlcygianRvb2xzIikKbGlicmFyeShqdG9vbHMpCiNpbnN0YWxsLnBhY2thZ2VzKCJsbXRlc3QiKQpsaWJyYXJ5KGxtdGVzdCkKI2luc3RhbGwucGFja2FnZXMoImNhciIpCmxpYnJhcnkoY2FyKQojaW5zdGFsbC5wYWNrYWdlcygiY2FyRGF0YSIpCiNpbnN0YWxsLnBhY2thZ2VzKCJmYWN0b2V4dHJhIikKbGlicmFyeShmYWN0b2V4dHJhKQojaW5zdGFsbC5wYWNrYWdlcygiamFuaXRvciIpCmxpYnJhcnkoamFuaXRvcikKI2luc3RhbGwucGFja2FnZXMoInJlYWRyIikKbGlicmFyeShyZWFkcikKI2luc3RhbGwucGFja2FnZXMoInBsb3RyaXgiKQpsaWJyYXJ5KHBsb3RyaXgpCgpgYGAKCiMgUmVjdXJzb3MgSHVtYW5vcyAoQ29sYWJvcmFkb3JlcyA9IGNvbCB5IEJhamFzID0gYmFqKQpgYGB7cn0KI2ZpbGUuY2hvb3NlKCkKY29sIDwtIHJlYWQuY3N2KCIvVXNlcnMvY2FybG9zZ29uemFsZXovRGVza3RvcC9Db2xhYl9yZWN1cnNvc2h1bWFub3MuY3N2IikKYmFqIDwtIHJlYWQuY3N2KCIvVXNlcnMvY2FybG9zZ29uemFsZXovRGVza3RvcC9CQUpBU19MSU1QSUEuY3N2IikKYGBgCgojIyBMaW1waWV6YSBkZSBiYXNlIGRlIGRhdG9zCgojIEVudGVuZGVyIGJhc2VzIGRlIGRhdG9zCmBgYHtyfQpzdW1tYXJ5KGNvbCkKc3VtbWFyeShiYWopCmBgYAoKIyBFbGltaW5hciBOQSdzIHkgc3VzdGl0dWlyIGNvbiAwJ3MgIApDb24gZXN0ZSBtZXRvZG8gZGUgbGltcGllemEgc2UgcHJldGVuZGUgY29udmVydGlyIHRvZG8gZWwgY29udGVuaWRvIGRlIGxvcyByZWdpc3Ryb3MvVmFyaWFibGVzIGEgdW4gZm9ybWF0byBjdWFudGl0YXRpdm8gZG9uZGUgc2UgcHVlZGEgbWVkaXIgcGFyYSBwb3N0ZXJpb3IgYW5hbGlzaXMuCmBgYHtyfQpzdW0oaXMubmEoY29sKSkKc3VtKGlzLm5hKGJhaikpCgpjb2xbaXMubmEoY29sKV0gPC0wIApiYWpbaXMubmEoYmFqKV0gPC0wIAoKY29sIDwtIG5hLm9taXQoY29sKQpiYWogPC0gbmEub21pdChiYWopCgpzdW1tYXJ5KGNvbCkKc3VtbWFyeShiYWopCmBgYAoKIyMgVHJhbnNmb3JtYWNpw7NuIGRlIHZhcmlhYmxlIGZlY2hhIGEgImZvcm1hdG8gZmVjaGEiICAgIApDb24gZXN0ZSBtZXRvZG8gZGUgbGltcGllemEgc2UgcHJldGVuZGUgY2FtYmlhciBlbCBmb3JtYXRvIGRlIGxhIGZlY2hhIHBhcmEgcG9zdGVyaW9yZXMgZ3LDoWZpY2FzIGRvbmRlIGVzdGEgdmFyaWFibGUgcGV1ZGEgc2VyIGRlIHV0aWxpZGFkCmBgYHtyfQojY29sJEZFQ0hBLkRFLkFMVEEtYXMuRGF0ZShjb2wkRkVDSEEuREUuQUxUQSxmb3JtYXQ9IiV5LyVtLyVkIikKYmFqJEZFQ0hBX0FMVEE8LWFzLkRhdGUoYmFqJEZFQ0hBX0FMVEEsZm9ybWF0PSIleS8lbS8lZCIpCmJhaiRGRUNIQV9CQUpBPC1hcy5EYXRlKGJhaiRGRUNIQV9CQUpBLGZvcm1hdD0iJXkvJW0vJWQiKSAKCnN1bW1hcnkoY29sKQpzdW1tYXJ5KGJhaikKYGBgCgojIyBDdWFudGFzIHZhcmlhYmxlcyB0aWVuZW4gbGFzIGJhc2VzIGRlIGRhdG9zPwpMYSBiYXNlIGRlIGRhdG9zIGRlIGNvbGFib3JhZG9yZXMgY3VlbnRhIGNvbiAxNCB2YXJpYWJsZXMgeSAxMTMgcmVnaXN0cm9zLCBtaWVudHJhcyBxdWUgbGEgYmFzZSBkZSBkYXRvcyBkZSBiYWphcyBjb250aWVuZSAyMyB2YXJpYWJsZXMgY29uIDIzMyByZWdpc3Ryb3MuCmBgYHtyfQpzdHIoY29sKQpzdHIoYmFqKQpgYGAKCgojIyBFc2NhbGEsIFZhcmlhYmxlcyB5IHJlZ2lzdHJvcyAoRm9ybWF0byB0YWJsYSkgZGUgUkggY29sYWJvcmFkb3JlcyB5IGJhamFzICAKIyMjIENvbGFib3JhZG9yZXMKYGBge3J9ClZhcmkgPC0gYygiYE51bV9lbXBsZWFkb2AiLCJgRkVDSEEuREUuTkFDSU1JRU5UT2AiLCJgR0VORVJPYCIsImBSRkNgIiwiYEZFQ0hBLkRFLkFMVEFgIiwiYFByaW1lci5tZXNgIiwiYFg0dG8ubWVzYCIsImBQVUVTVE9gIiwiYERFUEFSVEFNRU5UT2AiLCAiYE5PLlNFR1VSTy5TT0NJQUxgIiwiYFNBTEFSSU8uRElBUklPLklNU1NgIiwiYENPTE9OSUFgIiwgImBNVU5JQ0lQSU9gIiwgImBFU1RBRE9gIikKYGBgCgpgYGB7cn0KVHlwZSA8LSBjKCJjdWFsaXRhdGl2byAoZGlzY3JldG8pIiwgImN1YW50aXRhdGl2byAoY29udGludW8pIiwgImN1YWxpdGF0aXZvIChub21pbmFsKSIsICJjdWFsaXRhdGl2byAobm9taW5hbCkiLCAiY3VhbnRpdGF0aXZvIChjb250aW51bykiLCAiY3VhbnRpdGF0aXZvIChjb250aW51bykiLCAiY3VhbnRpdGF0aXZvIChjb250aW51bykiLCAiY3VhbGl0YXRpdm8gKG5vbWluYWwpIiwgImN1YWxpdGF0aXZvIChub21pbmFsKSIsICJjdWFudGl0YXRpdm8gKGRpc2NyZXRvKSIsICJjdWFudGl0YXRpdm8gKGNvbnRpbnVhKSIsICJjdWFsaXRhdGl2YSAobm9taW5hbCkiLCAiY3VhbGl0YXRpdmEgKG5vbWluYWwpIiwgImN1YWxpdGF0aXZhIChub21pbmFsIikKYGBgCgpgYGB7cn0KU2NhbGVzIDwtIGMoInJhesOzbiIsICJyYXrDs24iLCAibm9taW5hbCIsICJpbnRlcnZhbG8iLCAiaW50ZXJ2YWxvIiwgImludGVydmFsbyIsICJpbnRlcnZhbG8iLCAib3JkaW5hbCIsICJub21pbmFsIiwgImludGVydmFsbyIsICJyYXrDs24iLCAibm9taW5hbCIsICJub21pbmFsIiwgIm5vbWluYWwiKQpgYGAKCgpgYGB7cn0KdGFibGU8LShkYXRhLmZyYW1lKFZhcmksIFR5cGUsIFNjYWxlcykpCmtuaXRyOjprYWJsZSh0YWJsZSkKYGBgCgojIyMgQmFqYXMKYGBge3J9CnN1bW1hcnkoYmFqKQpgYGAKCmBgYHtyfQpWYXJpIDwtIGMoImBYYCIsImBFREFEYCIsImBGRUNIQS5OQUNJTUlFTlRPYCIsImBHRU5FUk9gIiwiYFJGQ2AiLCJgRkVDSEFfQUxUQWAiLCJgTU9USVZPX0JBSkFgIiwiYERJQVNfTEFCT1JBRE9TYCIsImBGRUNIQV9CQUpBYCIsICJgUFVFU1RPYCIsImBERVBUTy5gIiwiYFNFR1VST2AiLCAiYFNBTEFSSU9fRElBUklPYCIsICJgTFVHQVJfTkFDSU1JRU5UT2AiLCAiYENVUlBgIiwgImBDQUxMRWAiLCAiYE5VTV9JTlRFUk5PYCIsICJgQ09MT05JQWAiLCAiYENPRElHT19QT1NUYCIsICJgTVVOSUNJUElPYCIsICJgRURPYCIsICJgRURPX0NJVklMYCIsICJgWC4xYCIpCmBgYAoKYGBge3J9ClR5cGUgPC0gYygiY3VhbGl0YXRpdm8gKGRpc2NyZXRvKSIsICJjdWFudGl0YXRpdm8gKGNvbnRpbnVvKSIsICJjdWFudGl0YXRpdmEgKGNvbnRpbnVhKSIsICJjdWFsaXRhdGl2byAobm9taW5hbCkiLCAiY3VhbGl0YXRpdmEgKG5vbWluYWwpIiwgImN1YWxpdGF0aXZhIChub21pbmFsKSIsICJjdWFudGl0YXRpdm8gKGNvbnRpbnVvKSIsICJjdWFsaXRhdGl2byAobm9taW5hbCkiLCAiY3VhbGl0YXRpdm8gKG5vbWluYWwpIiwgImN1YWxpdGF0aXZhIChub21pbmFsKSIsICJjdWFudGl0YXRpdm8gKGRpc2NyZXRhKSIsICJjdWFsaXRhdGl2YSAobm9taW5hbCkiLCAiY3VhbGl0YXRpdmEgKG5vbWluYWwpIiwgImN1YWxpdGF0aXZhIChub21pbmFsKSIsICJjdWFsaXRhdGl2YSAobm9taW5hbCkiLCAiY3VhbGl0YXRpdmEgKG5vbWluYWwpIiwgImN1YWxpdGF0aXZhIChub21pbmFsKSIsICJjdWFsaXRhdGl2YSAobm9taW5hbCkiLCAiY3VhbGl0YXRpdmEgKG5vbWluYWwpIiwgImN1YWxpdGF0aXZhIChub21pbmFsKSIsICJjdWFsaXRhdGl2YSAobm9taW5hbCkiLCAiY3VhbGl0YXRpdmEgKG5vbWluYWwpIiwgImN1YWxpdGF0aXZhIChub21pbmFsIikKYGBgCgpgYGB7cn0KU2NhbGVzIDwtIGMoInJhesOzbiIsICJyYXrDs24iLCAicmF6w7NuIiwgIm5vbWluYWwiLCAiaW50ZXJ2YWxvIiwgInJhesOzbiIsICJub21pbmFsIiwgInJhesOzbiIsICJyYXrDs24iLCAib3JkaW5hbCIsICJub21pbmFsIiwgImludGVydmFsbyIsICJyYXrDs24iLCAibm9taW5hbCIsICJpbnRlcnZhbG8iLCAibm9taW5hbCIsICJpbnRlcnZhbG8iLCAibm9taW5hbCIsICJpbnRlcnZhbG8iLCAibm9taW5hbCIsICJub21pbmFsIiwgIm5vbWluYWwiLCAiaW50ZXJ2YWxvIikKYGBgCgoKYGBge3J9CnRhYmxlPC0oZGF0YS5mcmFtZShWYXJpLCBUeXBlLCBTY2FsZXMpKQprbml0cjo6a2FibGUodGFibGUpCmBgYAoKCiMjIFRhYmxhIGRlIGZyZWN1ZW5jaWEgQ09MQUJPUkFET1JFUwojIyMgVGFibGEgU2FsYXJpbyBkaWFyaW8gLSBHZW5lcm8KYGBge3J9CnN1bW1hcnkoY29sKQpwcm9wb3J0aW9uIDwtIHByb3AudGFibGUodGFibGUoY29sJFNBTEFSSU8uRElBUklPLklNU1MsY29sJEdFTkVSTykpCnByb3BvcnRpb24gJT4lCiAga2JsKCkgJT4lCiAga2FibGVfc3R5bGluZygpCmBgYApFbiBlc3RlIGNhc28gY29tbyBzZSBvYnNlcnZhIGVuIGxhIHRhYmxhIGRlIGZyZWN1ZW5jaWEgZW50cmUgbGFzIHZhcmlhYmxlcyBkZSBzYWxhcmlvIGRpYXJpbyB5IGdlbmVybywgc2UgcHVlZGUgZGFyIGEgY3VlbnRhIGRlIGPDs21vIGVsIGdlbmVybyBmZW1lbmlubyB0aWVuZSB1bmEgbWF5b3IgY29uY2VudHJhY2nDs24gZW4gbG9zIHNhbGFyaW9zIGRpYXJpb3MgbcOhcyBhbHRvcy4gUG9yIGxvIHF1ZSBzZSBwdWVkZSBjb25jbHVpciBlbiBlc3RlIGVqZXJpY2lvIHF1ZSBleGlzdGUgdW4gY2FzbyBkZSBkZXNpZ3VhbGRhZCBlbiBlbCBjb250ZXh0byBlY29ub21pY28geSBwb3IgY29uc2lndWllbnRlIGVzIG5lY2VzYXJpbyBwcm9wb25lciBzZXNpb25lcyBkZSBjb25zY2llbnRpemFjacOzbiBzb2JyZSBkaWNob3MgdGVtYXMgY29uIGxhIGZpbmFsaWRhZCBkZSBxdWUgZXhpc3RhIHVuYSBjb21wbGV0YSBhcm1vbsOtYSB5IGVxdWlkYWQgZGUgZ2VuZXJvIGFsIG1lbm9zIGVuIGVsIGNvbnRleHRvIHNhbGFyaWFsIGludGVybm8uIFBvciBvdHJhIHBhcnRlIHNlIHByb3BvbmRyw61hIGFuYWxpemFyIGxhIGNhdXNhIHJhw616IG8gbGEgcmF6w7NuIHBvciBsYSBjdWFsIGEgbGFzIG11amVyZXMgc2UgbGVzIHBhZ2EgbcOhcy4gUG9yIG90cmEgcGFydGUsIHNlIHNvc3RlbmRyw61hIHVuYSBoaXBvdGVzaXMgc3VzdGVudGFkYSBlbiBxdWUgZXhpc3RlIGxpZ2VyYW1lbnRlIHVuYSBtYXlvciBjYW50aWRhZCBkZSBtdWplcmVzIHRyYWJhamFuZG8gZW4gRm9ybSB5IHBvciBjb25zaWd1aWVudGUgYWwgZWZlY3R1YXIgZWwgY291bnQgeSBsYSB2YXJpZWRhZCBkZSBwdWVzdG9zIGV4aXN0ZW50ZXMgZW4gRk9STSBlcyBwb3NpYmxlIHF1ZSBhIGVzbyBzZSBkZWJhIGxhIGRpc3BhcmllZGFkIGRlIGxvcyBzYWxhcmlvcy4KIyMgVGFibGEgZGUgZnJlY3VlbmNpYSBCQUpBUwojIyMgVGFibGEgRGVwYXJ0YW1lbnRvIC0gU2FsYXJpbyBEaWFyaW8gCmBgYHtyfQpwcm9wb3J0aW9uIDwtIHByb3AudGFibGUodGFibGUoY29sJERFUEFSVEFNRU5UTyxjb2wkU0FMQVJJTy5ESUFSSU8uSU1TUykpCnByb3BvcnRpb24gJT4lCiAga2JsKCkgJT4lCiAga2FibGVfc3R5bGluZygpCmBgYApFbiBlc3RlIGNhc28gc2UgcHVlZGUgY29uY2x1aXIgcXVlIHByb2R1Y2Npw7NuLCBjb3N0dXJhLCBheXVkYW50ZSBnZW5lcmFsIHNvbiBsb3MgcHVlc3RvcyBkb25kZSBzZSBvdG9yZ2EgdW4gc2FsYXJpbyBkaWFyaW8gbWF5b3IsIGVuIGFsZ3Vub3MgY2Fzb3Mgc2UgdGllbmUgbGEgaGlwb3Rlc2lzIGRlIHF1ZSBlcyBkZWJpZG8gYSB1bmEgYWx0YSBjb25jZW50cmFjacOzbiBkZSBjb2xhYm9yYWRvcmVzIGVuIHVuIHJvbCBlc3BlY2lmaWNvLCBzaW4gZW1iYXJnbyBjb21vIHNlIG11ZXN0cmEgZW4gbGEgdGFibGEsIGxvcyBkZXBhcnRhbWVudG9zIGNvbiBtYXlvcmVzIHNhbGFyaW9zIGRpYXJpb3Mgc29uIGxvcyBxdWUgdGllbmVuIG1heW9yIGRlbWFuZGEgZW4gdGVybWlub3MgZGUgY2FwYWNpdGFjacOzbiB5IGV4cGVyaWVuY2lhIHkgcG9yIGNvbnNpZ3VpZW50ZSBzZSBpbmZpZXJlIHF1ZSBGb3JtIHRvbWEgZW4gY3VlbnRhIGxhIGNvbXBsZWppZGFkIGRlbCBsYWJvciBwYXJhIGNvbiBiYXNlIGEgZWxsbyBwcm9wb25lciB1biBzYWxhcmlvIGRpYXJpbyBlc3BlY2lmaWNvLgoKIyMgVGFibGFzIGRlIGZyZWN1ZW5jaWEgQkFKQVMKIyMjIFRhYmxhIE1vdGl2byBkZSBiYWphIC0gR2VuZXJvCmBgYHtyfQpzdW1tYXJ5KGJhaikKcHJvcG9ydGlvbiA8LSBwcm9wLnRhYmxlKHRhYmxlKGJhaiRNT1RJVk9fQkFKQSxiYWokR0VORVJPKSkKcHJvcG9ydGlvbiAlPiUKICBrYmwoKSAlPiUKICBrYWJsZV9zdHlsaW5nKCkKYGBgCkVuIGVzdGUgY2FzbyBzZSBwdWVkZSBpZGVudGlmaWNhciBxdWUgZWwgZ2VuZXJvIG1hc2N1bGlubyBlbiBlc3RlIGNhc28gdGllbmRlIGEgZGFyc2UgZGUgYmFqYSBkZSBsYSBlbXByZXNhIG1lZGlhbnRlIGVsIGFiYW5kb25vLCBqdWJpbGFjacOzbiB5IGRlIG1hbmVyYSBjYXNpIGVxdWl0YXRpdmEgcG9yIHJlbnVuY2lhIHZvbHVudHJpYTsgbWllbnRyYXMgcXVlIGxhcyBtdWplcmVzIHNvbiBkYWRhcyBkZSBiYWphIHBvciBmYWx0YXMsIHkgdGVybWluYWNpw7NuIGRlIGNvbnRyYXRvLCBsbyBjdWFsIHB1ZWRlIGRhcnNlIGEgaW5mZXJpciBxdWUgbG9zIGhvbWJyZXMgdGllbmRlbiBhIGRlc2Fycm9sbGFyIHN1cyB1bHRpbW9zIGHDsW9zIGRlIGxhYm9yIGVuIEZPUk0gKHBhcmEgZWwgZ3J1cG8gZGUgZWRhZCBtYXlvcikgbyBiaWVuIGFsIHRyYXRhcnNlIGRlIGpvdmVuZXMsIGxvIHV0aWxpemFuIHBhcmEgZ2FuYXIgZGluZXJvIGRlIG1hbmVyYSB0ZW1wb3JhbC4gCgojIyMgVGFibGEgRXN0YWRvIGNpdmlsIC0gTW90aXZvIGRlIGJhamEgIApgYGB7cn0KcHJvcG9ydGlvbiA8LSBwcm9wLnRhYmxlKHRhYmxlKGJhaiRFRE9fQ0lWSUwsYmFqJE1PVElWT19CQUpBKSkKcHJvcG9ydGlvbiAlPiUKICBrYmwoKSAlPiUKICBrYWJsZV9zdHlsaW5nKCkKYGBgClNlIGNvbnNpZGVyYSBxdWUgdW4gaGFsbGF6Z28gaW50ZXJlc2FudGUgZXMgcXVlIHBvciBsYSB0ZW5kZW5jaWEgb2JzZXJ2YWRhIGVuIGxhIHRhYmxhIGFudGVyaW9yLCBsYXMgcGVyc29uYXMgc29sdGVyYXMgc29uIHF1aWVuZXMgZW4gZGVmaW5pdGl2YSBzYWxlbiBkZSBsYSBlbXByZXNhIGNvbiBtYXlvciBmcmVjdWVuY2lhLCBhIGRpZmVyZW5jaWEgZGUgcGVyc29uYXMgZGl2b3JzaWFkYXMgeS9vIGNhc2FkYXMsIHF1aWVuZXMgcG9yIHJhem9uZXMgZGUgc3VzdGVudG8gZmFtaWxpYXIsIGV4aXN0ZSBtZW5vciB0ZW5kZW5jaWEgZGUgcXVlIHVuIGdydXBvIGRlIGVzdGUgdGlwbyBzYWxnYSBkZSBsYSBlbXByZXNhLgoKIyBHcsOhZmljb3MgY3VhbGl0YXRpdm9zL2N1YW50aXRhdGl2b3MgLSBDb2xhYm9yYWRvcmVzCmBgYHtyfQpwaWUocHJvcC50YWJsZSh0YWJsZShjb2wkR0VORVJPKSksY29sPWMoInB1cnBsZSIsImdyZWVuIiksbWFpbj0iR2VuZXJvIiwgeWxhYiA9IlByb3BvcmNpw7NuIixsYXM9MSkKYGBgCkNvbiBlbCBncsOhZmljbyBjdWFsaXRhdGl2byBhbnRlcmlvciwgc2UgcHVlZGUgZGFyIGEgY3VlbnRhIGRlIHF1ZSBjb21vIHNlIG1lbmNpb27DsW8gYW50ZXJpb3JtZW50ZSwgZWwgZ2VuZXJvIGZlbWVuaW5vIHRpZW5lIG1heW9yIHByZXNlbmNpYSBlbiBsYSBlbXByZXNhIHkgcG9yIGNvbnNpZ3VpZW50ZSBleGlzdGUgbGEgaGlwb3Rlc2lzIGRlIHF1ZSBlc3RhIHNlYSBsYSByYXrDs24gcG9yIGxhIGN1YWwgc2UgcmVnaXN0cmFuIG1heW9yZXMgcGFnb3MgcGFyYSBsYXMgbXVqZXJlcy4gQWRpY2lvbmFsbWVudGUsIHNlIHBlcmNpYmUgcXVlIEZPUk0gZXMgdW5hIGVtcHJlc2EgaW5jbHV5ZW50ZSwgeWEgcXVlIGN1ZW50YSBjb24gdGFuIHNvbG8gdW5hIGxpZ2VyIGluY2xpbmFjw7NuIGhhY2lhIGVsIGdlbmVybyBmZW1lbmluby4gCmBgYHtyfQpoaXN0KGNvbCRTQUxBUklPLkRJQVJJTy5JTVNTLCBjb2w9ImN5YW4iKQpgYGAKQ29uIGVsIGhpc3RvZ3JhbWEgYW50ZXJpb3IsIHNlIHB1ZWRlIGRhciBhIGN1ZW50YSBkZSBxdWUgZWwgc2FsYXJpbyBkaWFyaW8gY29uIG1heW9yIGNvbmNlbnRyYWNpw7NuIHJvbmRhIGVudHJlIGxvcyAxNTBteG4geSAyMDBteG4sIHNpZW5kbyBlbCBwcm9tZWRpbyB1biBhbHJlZGVkb3IgZGUgMTgwbXhuLiBBbGdvIGEgbm90YXIgZXMgcXVlIGV4aXN0ZSB1biBwZXF1ZcOxbyBzdWJncnVwbyBkb25kZSBzZSBwZXJjaWJlIHVuIHNhbGFyaW8gZGlhcmlvIG1heW9yLCBlbCBjdWFsIHNlIGVzcGVjdWxhIGVzIGVsIGVtcGxlYWRvIGNvbiBtYXlvciBhbnRpZ3VlZGFkIGRlIGxhIGVtcHJlc2EgbyBiaWVuIGVsIGRpcmVjdG9yIGdlbnJhbC4gUG9yIG90cmEgcGFydGUsIGxvcyBkZW3DoXMgZ3J1cG9zIHF1ZSByb25kYW4gZW50cmUgbG9zIDIwMG14biAtICQyODAgZXMgcHJvYmFibGUgcXVlIHN1cmphbiBkZWJpZG8gYSBsYSBhbnRpZ3VlZGFkLCBlbCB0aXBvIGRlIHB1ZXN0b24geS9vIGRlbcOhcyBwcmVzdGFjaW9uZXMvYmVuZWZpY2lvcyBjb24gbG9zIHF1ZSBjdWVudGVuIGVzdGFzIHBlcnNvbmFzLiAKCmBgYHtyfQpHZW5fc2FsYXJpb1Byb208LWFnZ3JlZ2F0ZShTQUxBUklPLkRJQVJJTy5JTVNTIH4gR0VORVJPLCBkYXRhID0gY29sLCBtZWFuKQpHZW5fc2FsYXJpb1Byb20KYGBgCgpDb21vIHNlIHB1ZWRlIHJlYWZpcm1hciwgZWwgcHJvbWVkaW8gZGUgc2FsYXJpbyBkaWFyaW8gc2UgZW5jdWVudHJhIGRlbnRybyBkZSBsYSBjYW50aWRhZCBhcHJveGltYWRhIGRlIDE4MCBwZXNvczsgc2luIGVtYmFyZ28gc2UgdnVlbHZlIGEgcmVhZmlybWFyIHF1ZSBsYXMgbXVlanJlcyB0aWVuZSB1biBwYWdvIGxpZ2VyYW1lbnRlIG1heW9yIHF1ZSBsb3MgaG9tYnJlcy4gcGFyYSBlc3RvIHNlIHByb3BvbmRyw61hIHF1ZSBsb3MgYWRtaW5pc3RyYWRvcmVzIGRlIHJlY3Vyc29zIGh1bWFub3MgbW9uaXRvcmVlbiBsYXMgYnJlY2hhcyBzYWxhcmlhbGVzIHBhcmEgaWRlbnRpZmljYXIgbGEgY2F1c2EgcmHDrXogcGFyYSBxdWUsIGVuIGNhc28gZGUgc2VyIGluanVzdGlmaWNhZGEsIGVzdGFzIGNhbnRpZGFkZXMgc2VhbiBhanVzdGFkYXMgcGFyYSBsb2dyYXIgdW5hIG1heW9yIGlndWFsZGFkIHNhbGFyaWFsLgoKYGBge3J9CmdncGxvdChHZW5fc2FsYXJpb1Byb20sYWVzKHg9R0VORVJPLHk9U0FMQVJJTy5ESUFSSU8uSU1TUyxmaWxsPVNBTEFSSU8uRElBUklPLklNU1MsIGNvbD0iYmx1ZSIpKSsKICBnZW9tX2JhcihzdGF0PSJpZGVudGl0eSIsIGNvbD0iYmx1ZSIpKwogIGxhYnModGl0bGU9IlByb21lZGlvIGRlIFNhbGFyaW8gRmVtZW5pbm8gfCBNYXNjdWxpbm8iKQpgYGAKRW4gZXN0ZSBjYXNvLCBlbCBwcmluY2lwYWwgaW5zaWdodCBxdWUgc2UgcHVlZGUgYXByZWNpYXIgZXMgbGEgcmVsYWNpw7NuIGVudHJlIGVsIHNhbGFyaW8gZGlhcmlvIGNvbnRyYSBsYSBwcm9wb3JjaW9uIGV4aXN0ZW50ZSBkZSBnZW5lcm8gZW4gRm9ybS4gQWRpY2lvbmFsbWVudGUsIHNlIHB1ZWRlIGNvcnJvYm9yYXIgcXVlIGxhcyBtdWplcmVzIGdhbmFuIHVuYSBjYW50aWRhZCBsaWdlcmFtZW50ZSBtw6FzIGFsdGEgZGUgZGluZXJvIHF1ZSBsb3MgaG9tYnJlcy4KIyBHcsOhZmljb3MgY3VhbGl0YXRpdm9zL2N1YW50aXRhdGl2b3MgLSBCQUpBUwpgYGB7cn0Kc3VtbWFyeShiYWopCnBpZShwcm9wLnRhYmxlKHRhYmxlKGJhaiRFRE9fQ0lWSUwpKSxjb2w9YygicHVycGxlIiwiZ3JlZW4iLCAieWVsbG93IiwgImJsdWUiKSxtYWluPSJFc3RhZG8gQ2l2aWwiLCB5bGFiID0iUHJvcG9yY2nDs24iLGxhcz0xKQpgYGAKTWVkaWFudGUgZXN0YSBncmFmaWNhIGN1YWxpdGF0aXZhLCBzZSBwdWVkZSBzdXN0ZW50YXIgcXVlIGVsIGVzdGFkbyBjaXZpbCBtw6FzIGNvbcO6biBwcmVzZW50ZSBlbiBGb3JtIGVzIHNvbHRlcsOtYSwgc2VndWlkbyBkZSBtYXRyaW1vbmlvIHkgdW5pw7NuIGxpYnJlIHJlc3BlY3RpdmFtZW50ZS4gRGUgaWd1YWwgbWFuZXJhLCBwb2RlbW9zIHN1c3RlbnRhciBsYSBoaXBvdGVzaXMgcHJlc2VudGFkYSBjb24gYW50ZXJpb3JpZGFkLCBkb25kZSBsb3Mgc29sdGVyb3Mgc29uIGxvcyBxdWUgc2FsZW4gZGUgbGEgZW1wcmVzYTsgcG9yIGNvbnNpZ3VpZW50ZSB5IGVuIHBhcnRlIGRlYmlkbyBhIHF1ZSBubyB0aWVuZW4gcmVzcG9uZGFiaWxpZGFkIGNvbiBmYW1pbGlhcmVzIHkgcG9yIHF1ZSByZXByZXNlbnRhbiB1bmEgYWx0YSBjb25jZW50cmFjacOzbiBkZSBsYSBmdWVyemEgbGFib3JhbCBkZSBsYSBlbXByZXNhLiAKCiMjIEhpc3RvZ3JhbWEgZGUgZMOtYXMgbGFib3JhZG9zIApgYGB7cn0KaGlzdChiYWokRElBU19MQUJPUkFET1MsIGNvbD0iYmx1ZSIpCmBgYApFbiBlc3RlIGNhc28sIHNlIHB1ZWRlIG9ic2VydmFyIHkgcmVjYWJhciBpbmZvcm1hY8OzbiBjb21wbGVtZW50YXJpYSBwYXJhIGV2YWx1YXIgbGEgY2FudGlkYWQgZGUgZMOtYXMgcXVlIHRyYWJhamFuIGxvcyBjb2xhYm9yYWRvcmVzLiBFbiBlc3RlIGNhc28gZXhpc3RlIGxhIGdyYW0gbWF5b3LDrWEgZGUgbGEgY29uY2VudHJhY2nDs24gZGUgY29sYWJvcmFkb3JlcyBxdWUgdHJhYmFqYW4gYXByb3hpbWFkYW1lbnRlIDIwMCBkw61hcy4gQWRpY2lvbmFsbWVudGUsIGxhcyBwZXJzb25hcyBxdWllbmVzIGhhbiB0cmFiYWphZG8gbcOhcyBkw61hcyBmb3JtYW4gcGFydGUgZGUgdW5hIG1pbm9yw61hIGJhc3RhbnRlIGFpc2xhZGE7IGVzcGVjaWFsbWVudGUgZW4gZWwgY2FzbyBkZSBhcXVlbGxvcyBxdWUgaGFuIHRyYWJhamFkbyBtw6FzIGRlIDE1MDAgLSAyMDAwIGTDrWFzLCByZXByZXNlbnRhbmRvIGVzdG8gMTAgdmVjZXMgbcOhcyBxdWUgbGEgbXlvcsOtYS4gCmBgYHtyfQp0YXBwbHkoYmFqJFNBTEFSSU9fRElBUklPLAogICAgICAgbGlzdChiYWokR0VORVJPLGJhaiRFRE9fQ0lWSUwpLCBtZWFuKQoKaGlzdChiYWokRURBRCwgZnJlcT1UUlVFLCBjb2w9J0xpZ2h0Qmx1ZScsIG1haW49Ikhpc3RvZ3JhbWEgZGUgZ3J1cG9zIGRlIGVkYWQiLHhsYWI9IkVkYWQgZW4gQcOxb3MiKQpgYGAKTWVkaWFudGUgZXN0ZSBoaXN0b2dyYW1hLCBzZSBwdWVkZSBpZGVudGlmaWNhciBxdWUgZWwgZ3J1cG8gZGUgZWRhZCBwcmVkb21pbmFudGUgZW4gRm9ybSBlcyBkZSAyMCAtIDMwIGHDsW9zLCBwb3IgbG8gcXVlIHRvbWFuZG8gZW4gY3VlbnRhIGFuYWxpc2lzIGFudGVyaW9yZXMsIHNlIHB1ZWRlIHByb2JhciBsYSBoaXBvdGVzaXMgZGUgcXVlIGFxdWVsbG9zIHF1ZSBzb24gc29sdGVyb3MgdGllbmVuIG1heW9yIHRlbmRlbmNpYSBhIHNhbGlyIGRlIGxhIGVtcHJlc2EgZSBpbmNsdXNpdmUgYSBzYWxpciBkZSBtYW5lcmEgImluZm9ybWFybCIgZGUgbGEgbWlzbWEuIFBvciBvdHJhIHBhcnRlLCBsb3MgZ3J1cG9zIGRlIGVkYWQgbWVub3MgY29tdW5lcyBjb21pZW56YW4gYSBwYXJ0aXIgZGUgbG9zIDQwIGHDsW9zIGVuIGFkZWxhbnRlOyBzaW4gZW1iYXJnbyB0YW1iaWVuIGVuIGVzb3MgZ3J1cG9zIHNlIGludGVncmFuIGxvcyBjb2xhYm9yYWRvcmVzIHF1ZSB0aWVuZW4gbcOhcyB0aWVtcG8gZW4gbGEgZW1wcmVzYS4gCgojIEdyYWZpY29zIGRlIGRpc3BlcmNpw7NuIENPTEFCT1JBRE9SRVMKCiMjIyBCb3hwbG90IENvbGFib3JhZG9yZXMKYGBge3J9CmJveHBsb3QoY29sJFNBTEFSSU8uRElBUklPLklNU1MgLCB2ZXJ0aWNhbCA9IFRSVUUpCmBgYApNZWRpYW50ZSBlc3RlIGJveCBwbG90LCBzZSBwdWVkZSBpZGVudGlmaWNhciB1ZSBleGlzdGUgdW5hIGZ1ZXJ0ZSBjb25jZW50cmFjacOzbiBlbiBsbyBxdWUgcmVzcGVjdGEgZWwgc2FsYXJpbyBkaWFyaW8sIG1pZW50cmFzIHF1ZSBhcXVlbGxvcyBxdWUgZ2FuYW4gbWVub3MgbyBtw6FzIHF1ZSBsYSBtYXlvcsOtYSwgcmVwcmVzZW50YW4gdW4gZ3J1cG8gc3VtYW1lbnRlIHBlcXVlw7FvIGRlIHBlcnNvbmFzLiBFbiBlc3RlIGNhc28gc2UgcHVlZGUgaW5mZXJpciBxdWUgYXF1ZWxsb3MgcXVlIGdhbmFuIG3DoXMgc29uIHBhcnRlIGRlbCBlcXVpcG8gYWRtaW5pc3RyYXRpdm8geS9vIGRpcmVjdGl2by4KCiMjIyBEaXNwZXJjacOzbiBjb2xhYm9yYWRvcmVzCmBgYHtyfQpwbG90KGNvbCRGRUNIQS5ERS5BTFRBLCBjb2wkU0FMQVJJTy5ESUFSSU8uSU1TUywgbWFpbiA9ICJTYWxhcmlvIHBvciBhbnRpZ8O8ZWRhZCIsCiAgICAgeGxhYiA9ICJGRUNIQSBERSBBTFRBIiwgeWxhYiA9ICJTQUxBUklPIiwKICAgICBwY2ggPSAxOSwgZnJhbWUgPSBGQUxTRSkKYGBgCkNvbiBlc3RlIGdyYWZpY28gZGUgZGlzcGVyY2nDs24sIHNlIHB1ZWRlIHN1c3RlbnRhciBxdWUgRm9ybSBhdW1lbnRhIGVsIHNhbGFyaW8gZGUgYXF1ZWxsb3MgcXVlIGxsZXZhbiBtw6FzIHRpZW1wbyBlbiBsYSBvcmdhbml6YWNpw7NuLCB5YSBxdWUgb2JzZXJ2YW1vcyBsYSBhZ3J1cGFjacOzbiBkZSBwdW50b3MgbGlnZXJhbWVudGUgYXJyaWJhIHF1ZSBsYSBtYXlvcsOtYSwgc2lnbmlmaWNhbmRvIGVzdG8gdW4gYXVtZW50byBlbiBzYWxhcmlvIGEgdHJhdmVzIGRlbCB0aWVtcG8uIAoKIyMgR3JhZmljb3MgZGUgZGlzcGVyY2nDs24gQkFKQVMgLSBEw61hcyBsYWJvcmFkb3MKYGBge3J9CnN1bW1hcnkoYmFqKQpib3hwbG90KGJhaiRESUFTX0xBQk9SQURPUyAsIHZlcnRpY2FsID0gVFJVRSkKYGBgCgpFbiBlc3RlIGNhc28sIGRlIG51ZXZhIGN1ZW50YSBzZSBwdWVkZSB2aXN1YWxpemFyIHF1ZSBsYSBtYXlvcsOtYSBkZSBjb2xhYm9yYWRvcmVzIHJlYWxtZW50ZSBubyBsbGV2YW4gbmkgMSBhw7FvIGNvbiBzdSBjb250cmF0byBsYWJvcmFsIGFjdGl2byBlbiBsYSBvcmdhbml6YWNpw7NuLCBkb25kZSBlbiBjYW1iaW8sIHNlIGRldGFsbGEgcXVlIGV4aXN0ZW4gcG9jYXMgcGVyc29uYXMgY29uICB1biBhbHRvIG51bWVybyBkZSBkw61hcyBsYWJvcmFkb3MuIAoKIyMjIERpc3BlcmNpw7NuIGJhamFzCmBgYHtyfQpwbG90KGJhaiRESUFTX0xBQk9SQURPUywgYmFqJFNBTEFSSU9fRElBUklPLCBtYWluID0gIlN1ZWxkbyBwb3IgZMOtYXMgdG90YWxlcyBsYWJvcmFkb3MiLAogICAgIHhsYWIgPSAiRMOtYXMgbGFib3JhZG9zIiwgeWxhYiA9ICJTdWVsZG8iLAogICAgIHBjaCA9IDE5LCBmcmFtZSA9IEZBTFNFKQpgYGAKRW4gZXN0ZSBjYXNvIHNlIG9ic2VydmEgZGVwZW5kaWVuZG8gZGVsIHB1ZXN0byBxdWUgc2UgZGVzZW1wZcOxZSBkZW50cm8gZGUgRm9ybSBleGlzdGUgdW5hIGRpZmVyZW5jaWEgZW4gZWwgc2FsYXJpbyBkaWFyaW8sIHNpbiBlbWJhcmdvLCBlcyB2YWxpZG8gcmVjYWxjYXIgcXVlIGhheSBwb3NpY2lvbmVzIGRlbnRybyBkZSBsYSBlbXByZXNhIGNvbiBwYWdvcyBtYXlvcmVzLCBxdWllbmVzIHByb2JhYmxlbWVudGUgc2VhIGVsIGVxdWlwbyBkaXJlY3Rpdm8gbyBlbCBkdWXDsW8uIAoKIyMgVGFibGEgZGUgZXN0YWRpc3RpY29zIChtZWRpYSwgbWVkaWFuYSwgbW9kYSwgZGVzdmlhY2nDs24gZXN0w6FuZGFyKSB8IENPTEFCT1JBRE9SRVMKYGBge3J9CnN1bW1hcnkoY29sKQptZWEyIDwtIG1lYW4oY29sJE51bV9lbXBsZWFkbykKbWVkMiA8LSBtZWRpYW4oY29sJE51bV9lbXBsZWFkbykKbW9kYTI8LSBtZnYoY29sJE51bV9lbXBsZWFkbykKc2QyIDwtIHNkKGNvbCROdW1fZW1wbGVhZG8sIG5hLnJtID0gVFJVRSkKYGBgCgpgYGB7cn0KbWVhMyA8LSBtZWFuKGNvbCRGRUNIQS5ERS5OQUNJTUlFTlRPKQptZWQzIDwtIG1lZGlhbihjb2wkRkVDSEEuREUuTkFDSU1JRU5UTykKbW9kYTMgPC0gbWZ2KGNvbCRGRUNIQS5ERS5OQUNJTUlFTlRPKQpzZDMgPC0gc2QoY29sJEZFQ0hBLkRFLk5BQ0lNSUVOVE8sIG5hLnJtID0gVFJVRSkKYGBgCgpgYGB7cn0KbWVhNCA8LSBtZWFuKGNvbCRHRU5FUk8pCm1lZDQgPC0gbWVkaWFuKGNvbCRHRU5FUk8pCm1vZGE0IDwtIG1mdihjb2wkZ2VuZXJvKQpzZDQgPC0gc2QoY29sJEdFTkVSTywgbmEucm0gPSBUUlVFKQpgYGAKCmBgYHtyfQptZWE1IDwtIG1lYW4oY29sJEZFQ0hBLkRFLkFMVEEpCm1lZDUgPC0gbWVkaWFuKGNvbCRGRUNIQS5ERS5BTFRBKQptb2RhNSA8LSBtZnYoY29sJEZFQ0hBLkRFLkFMVEEpCnNkNSA8LSBzZChiYWokbnVtZXJvLCBuYS5ybSA9IFRSVUUpCmBgYAoKYGBge3J9ClZhcmlhYmxlcyA8LWMoIk51bV9lbXBsZWFkbyIsIkZlY2hhX25hY2kiLCAiR2VuZXJvIiwgIkZlY2hhX0FsdGEiKQpNZWRpYSA8LWMobWVhMixtZWEzLG1lYTQsbWVhNSkKTWVkaWFuYSA8LWMobWVkMixtZWQzLG1lZDQsbWVkNSkKTW9kYSA8LWMobW9kYTIsbW9kYTMsbW9kYTQsbW9kYTUpCkRlc3ZpYWNpb24gPC1jKHNkMixzZDMsc2Q0LHNkNSkKdGFibGEyIDwtZGF0YS5mcmFtZShWYXJpYWJsZXMsIE1lZGlhLCBNZWRpYW5hLCBNb2RhLCBEZXN2aWFjaW9uKQprbml0cjo6a2FibGUodGFibGEyKQpgYGAKRW4gZXN0ZSBjYXNvLCBzZSBjb25zaWRlcmEgcXVlIGxvcyBkYXRvcyBtYXMgcmVsZXZhbnRlcyBzb246IE1lZGlhbnRlIGxhIG1lZGlhLCBzZSBwdWRvIGNvbXByb2JhciBxdWUgbGFzIG11amVyZXMgdGllbmVuIG1heW9yIHByZXNlbmNpYSBlbiBsYSBlbXByZXNhLiBQb3Igb3RyYSBwYXJ0ZSwgbGEgZmVjaGEgZGUgbmFjaW1pZW50byBwcm9tZWRpbyBkZSBsb3MgY29sYWJvcmFkb3JlcyBlcyBlbiAxOTkyLiBQb3IgY29uc2lndWllbnRlLCBzZSBwcmV0ZW5kZSBwaW50YXIgdW4gcGVyZmlsIGRlIGNvbGFib3JhZG9yIHF1ZSBwZXJ0ZW5lY2UgYWwgZ3J1cG8gZ2VuZXJhY2lvbmFsIE1pbGVuaWFsLgoKIyMgVGFibGEgZGUgZXN0YWRpc3RpY29zIChtZWRpYSwgbWVkaWFuYSwgbW9kYSwgZGVzdmlhY2nDs24gZXN0w6FuZGFyKSB8IEJBSkFTCmBgYHtyfQpzdW1tYXJ5KGJhaikKbWVhMiA8LSBtZWFuKGJhaiRFREFEKQptZWQyIDwtIG1lZGlhbihiYWokRURBRCkKbW9kYTI8LSBtZnYoYmFqJEVEQUQpCnNkMiA8LSBzZChiYWokRURBRCwgbmEucm0gPSBUUlVFKQpgYGAKCmBgYHtyfQptZWEzIDwtIG1lYW4oYmFqJERJQVNfTEFCT1JBRE9TKQptZWQzIDwtIG1lZGlhbihiYWokRElBU19MQUJPUkFET1MpCm1vZGEzIDwtIG1mdihiYWokRElBU19MQUJPUkFET1MpCnNkMyA8LSBzZChiYWokRElBU19MQUJPUkFET1MsIG5hLnJtID0gVFJVRSkKYGBgCgpgYGB7cn0KbWVhNCA8LSBtZWFuKGJhaiRFRE9fQ0lWSUwpCm1lZDQgPC0gbWVkaWFuKGJhaiRFRE9fQ0lWSUwpCm1vZGE0IDwtIG1mdihiYWokRURPX0NJVklMKQpzZDQgPC0gc2QoYmFqJEVET19DSVZJTCwgbmEucm0gPSBUUlVFKQpgYGAKCmBgYHtyfQptZWE1IDwtIG1lYW4oYmFqJFNBTEFSSU9fRElBUklPKQptZWQ1IDwtIG1lZGlhbihiYWokU0FMQVJJT19ESUFSSU8pCm1vZGE1IDwtIG1mdihiYWokU0FMQVJJT19ESUFSSU8pCnNkNSA8LSBzZChiYWokbnVtZXJvLCBuYS5ybSA9IFRSVUUpCmBgYAoKYGBge3J9ClZhcmlhYmxlcyA8LWMoIkVkYWQiLCJEaWFzIGxhYm9yYWRvcyIsICJFc3RhZG8gQ2l2aWwiLCAiU2FsYXJpbyBEaWFyaW8iKQpNZWRpYSA8LWMobWVhMixtZWEzLG1lYTQsbWVhNSkKTWVkaWFuYSA8LWMobWVkMixtZWQzLG1lZDQsbWVkNSkKTW9kYSA8LWMobW9kYTIsbW9kYTMsbW9kYTQsbW9kYTUpCkRlc3ZpYWNpb24gPC1jKHNkMixzZDMsc2Q0LHNkNSkKdGFibGEyIDwtZGF0YS5mcmFtZShWYXJpYWJsZXMsIE1lZGlhLCBNZWRpYW5hLCBNb2RhLCBEZXN2aWFjaW9uKQprbml0cjo6a2FibGUodGFibGEyKQpgYGAKRW4gZXN0ZSBjYXNvIHNlIHB1ZWRlIGRlbW9zdHJhciBxdWUgRWwgcHJvbWVkaW8gZGUgdW4gY29sYWJvcmFkb3IoYSkgZW4gRm9ybSBlcyB1bmEgcGVyc29uYSBzb2x0ZXJhIGRlIDMxIGHDsW9zIHF1ZSB0cmFiYWrDsyBhbCByZWRlZG9yIGRlIDIgbWVzZXMgZ2FuYW5kbyAgYXByb3hpbWFkYW1lbnRlIDE4MG14biBkaWFyaW9zCgojIEdyYWZpY29zIGFkaWNpb25hbGVzCgojIyBCYXJwbG90IENPTEFCT1JBRE9SRVMKYGBge3J9IApjb2wgPC0gcmVhZC5jc3YoIi9Vc2Vycy9jYXJsb3Nnb256YWxlei9EZXNrdG9wL0NvbGFiX3JlY3Vyc29zaHVtYW5vcy5jc3YiKQpzdW1tYXJ5KGNvbCkKZ2dwbG90KGNvbCwgYWVzKGZhY3RvcihgR0VORVJPYCksIGZpbGwgPSBmYWN0b3IoYFNBTEFSSU8uRElBUklPLklNU1NgKSkpICsKICBnZW9tX2Jhcihwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlMihwcmVzZXJ2ZSA9ICJzaW5nbGUiKSkKYGBgCk1lZGlhbnRlIGVzdGUgZ3JhZmljbywgc2UgcHVlZGUgZXNwZWNpZmljYXIgZWwgc2FsYXJpbyBmaWpvIGRlIGxhcyBwZXJzb25hcyBxdWUgZ2FuYW4gbcOhcy4gRW4gZXN0ZSBjYXNvIGVmZWN0aXZhbWVudGUsIGxhcyBtdWplcmVzIGdhbmFuIG3DoXMgZW4gZWwgcHVlc3RvIHF1ZSBnZW5lcmEgJDE4MC42OCBtaWVudHJhcyBxdWUgZWwgcHVlc3RvIHF1ZSBnZW5lcmEgdW5hIG1lbm9yIGNhbnRpZGFkIHRpZW5lIG1heW9yIHBhcnRpY2lwYWNpw7NuIHBvciBwYXJ0ZSBkZSBob21icmVzLiBFbiBwb2NhcyBwYWxhYnJhcywgc2UgcHVlZGUgaW5mZXJpciBxdWUgbGFzIG11ZWpyZXMgZXN0w6FuIGVuIHB1ZXN0b3MgcXVlIGdlbmVyYW4gbcOhcyBpbmdyZXNvcywgbWllbnRyYXMgcXVlIGxvcyBob21icmVzIGVzdMOhbiBwcmVzZW50ZXMgZW4gZG9uZGUgc2UgZ2VuZXJhIHVuYSBjYW50aWRhZCBtZW5vci4KCiMjIEJhcnBsb3QgQkFKQVMKYGBge3J9CnN1bW1hcnkoYmFqKQpnZ3Bsb3QoYmFqLCBhZXMoZmFjdG9yKGBNT1RJVk9fQkFKQWApLCBmaWxsID0gZmFjdG9yKGBHRU5FUk9gKSkpICsKICBnZW9tX2Jhcihwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlMihwcmVzZXJ2ZSA9ICJzaW5nbGUiKSkKYGBgCkVuIGVzdGUgY2Fzbywgc2UgcHVlZGUgZGFyIGEgY3VlbnRhIGRlIHF1ZSBsYXMgbXVqZXJlcyBjdWVudGFuIGNvbiBtYXlvciBudW1lcm8gZGUgYmFqYXMgYWwgc2ltcGxlbWVudGUgZGVqYXIgZGUgdmVuaXIgbGEgY2FudGlkYWQgZGUgdmVjZXMgc2VtYW5hbGVzIHF1ZSBpbmRpY2Egc3UgY2ludHJhdG8sIG1pZW50cmFzIHF1ZSBsb3MgaG9tYnJlcyBzZSB2YW4gcG9yIGFiYW5kb25vLCBqdWJpbGFjacOxb24geSBwb3IgcmVudW5jaWEgdm9sdW50YXJpYS4gCgojIyBEaXNwZXJjaW9uIHBsb3RzIChwcmVzZW50YWRvcyBhbnRlcmlvcm1lbnRlKQoKIyMgVGltZSBzZXJpZXMgcGxvdCAobGluZXBsb3QsIGhlYXRtYXApCgpgYGB7cn0KcGxvdChjb2wkRkVDSEEuREUuQUxUQSwgeGxhYiA9ICJGZWNoYSBkZSBhbHRhIGVuIEZPUk0iLCB5bGFiID0gIiAiKQojcG9seWdvbihjb2wkRkVDSEEuREUuQUxUQSwgY29sPSJncmVlbiIsIGJvcmRlcj0iYmxhY2siKQpgYGAKUGFyYSBlc3RhIGdyYWZpY2EsIHNlIHB1ZWRlIGluZmVyaXIgcXVlIEZvcm0gdGllbmUgY29udHJhdGFjaW9uZXMgY29uc3RhbnRlcyB5IGR1cmFudGUgdG9kbyBlbCBhw7FvLCBlcyBkZWNpciwgYSBkaWZlcmVuY2lhIGRlIGxhcyBvcmdhbml6YWNpb25lcyB0cmFkaWNpb25hbGVzIHF1aWVuZXMgY29udHJhdGFuIGVzcGVjaWFsbWVudGUgZHVyYW50ZSBlbCB1bHRpbW8gY3VhcnRvIGRlbCBhw7FvIHkgcHJpbmNpcGlvcyBkZWwgc2lndWllbnRlIGHDsW8sIGZvcm0gY29uc3RhbnRlbWVudGUgY29udHJhdGEuIFBvciBvdHJhIHBhcnRlLCBhc8OtIGNvbW8gaGF5IGNvbnRyYXRhY2lvbmVzLCBoYXkgZGFkYXMgZGUgYmFqYSB5IHBvciBjb25zaWd1aWVudGUgc2UgZW50aWVuZGUgbGEgZXN0cmF0ZWdpYSBkZSByZWNsdXRhbWllbnRvIGRlIEZvcm0sIGRvbmRlIGRlYmUgbWFudGVuZXIgdW4gZmx1am8gY29uc3RhbnRlIGRlIHBlcnNvbmFsIGVuIGZ1bmNpw7NuIGNvbiBsYXMgYmFqYXMgcXVlIHNlIHRpZW5lbi4KCiMjIyBHcmFmaWNhIGRlIFBJRSBkZWwgZ2VuZXJvIApgYGB7cn0KcGllKHRhYmxlKGJhaiRHRU5FUk8pKQpgYGAKRmluYWxtZW50ZSwgc2UgdGllbmUgcXVlIHNlIHRpZW5lbiBtw6FzIGNvbGFib3JhZG9yZXMgZGUgZ2VuZXJvIGZlbWVuaW5vLCBtaWVudHJhcyBxdWUgZWwgbWFzY3VsaW5vLCBkZWJpZG8gYSBxdWUgc29uIHF1aWVuZXMgZ2VuZXJhbiBsYSBtYXlvcsOtYSBkZSBsYXMgYmFqYXMgeSBwb3IgY29uc2lndWllbnRlIG1heW9yIHJvdGFjacOzbjsgbGFzIG11amVyZXMgdGllbmRlbiBhIGVzdGFyIG3DoXMgdGllbXBvIHkgZGVzZW1lcGXDsWFyIGxhYm9yZXMgY29uIG1heW9yIG5pdmVsIGRlIGNvbXBsZWppZGFkIHkgcG9yIGNvbnNpZ3VpZW50ZSBlc3TDsWFuIG1heW9yIHRpZW1wbyBlbiBsYSBlbXByZXNhLiAKCiMgRGVsaXZlcnkgUGxhbgpgYGB7cn0KI2ZpbGUuY2hvb3NlKCkKZHBsYW4gPC0gcmVhZC5jc3YoIi9Vc2Vycy9jYXJsb3Nnb256YWxlei9EZXNrdG9wL0RlbGl2ZXJ5IFBsYW4gQkQgRklOQUwuY3N2IikKYGBgCgojIyBFbnRlbmRlciBiYXNlIGRlIGRhdG9zCmBgYHtyfQpzdW1tYXJ5KGRwbGFuKQpgYGAKCiMjIExpbXBpZXphIGRlIGJhc2UgZGUgZGF0b3MKIyMjIE3DqXRvZG8gIzEgUmVhbGl6YXIgdW4gcGl2b3RlIGNvbiBsYSBmaW5hbGlkYWQgZGUgdW5pciBsb3MgcGVkaWRvcyBwcm9ncmFtYWRvcyBlbiB1bmEgc29sYSBjb2x1bW5hLiBBZGljaW9uYWxtZW50ZSwgY29uIGVzdGUgbcOpdG9kbyBzZSBwcmV0ZW5kZSBxdWUgbGFzIHZhcmlhYmxlcyBzZSBhcnJlZ2xlbiBkZSBtYW5lcmEgYWxmYWLDqXRpY2EgcGFyYSBmYWNpbGl0YXIgZWwgZW50ZW5kaW1pZW50byB5IGNvbXByZW5jacOzbiBkZSBsYXMgZ3LDoWZpY2FzLgpgYGB7cn0KbGlicmFyeSh0aWR5cikKZHBsYW4gPC0gY2xlYW5fbmFtZXMoZHBsYW4pCmRwbGFuIDwtIGRwbGFuICU+JSBkcGx5cjo6cmVuYW1lKGNsaWVudGU9Y2xpZW50ZV9wbGFudGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQV9qdW5fMjE9anVuaW8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQl9qdWxfMjE9anVsaW8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ19hZ29fMjE9YWdvc3RvLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIERfc2VwXzIxPXNlcHRpZW1icmUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRV9vY3RfMjE9b2N0dWJyZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGX25vdl8yMT1ub3ZpZW1icmUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR19kaWNfMjE9ZGljaWVtYnJlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhfZW5lXzIyPWVuZV8yMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJX2ZlYl8yMj1mZWJfMjIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBKX21hcl8yMj1tYXJfMjIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBLX2Ficl8yMj1hYnJfMjIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBMX21heV8yMj1tYXlfMjIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBNX2p1bl8yMj1qdW5fMjIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBOX2p1bF8yMj1qdWxfMjIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBPX2Fnb18yMj1hZ29fMjIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBQX3NlcF8yMj1zZXBfMjIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBRX29jdF8yMj1vY3R1YnJlXzIyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgUl9ub3ZfMjI9bm92XzIyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgU19kaWNfMjI9ZGljXzIyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgVF9lbmVfMjM9ZW5lXzIzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgVV9mZWJfMjM9ZmViXzIzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgVl9tYXJfMjM9ZmViXzIzCiAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICkKCmNvbG5hbWVzKGRwbGFuKQpgYGAKCgpgYGB7cn0KZHBsYW4gPC0gcGl2b3RfbG9uZ2VyKGRwbGFuLCBjb2xzPTU6MTQsIG5hbWVzX3RvID0gIk1lcyIsIHZhbHVlc190byA9ICJVbmlkYWRlcyIpCgpzdHIoZHBsYW4pCmBgYAoKCiMjIE3DqXRvZG8gZGUgbGltcGllemEgIzI6IFJlbW92ZXIgY2Vyb3MgZGUgbGEgYmFzZSBkZSBkYXRvcwpgYGB7cn0KZHBsYW4xIDwtIGZpbHRlcihkcGxhbiwgVW5pZGFkZXM+MCkKYGBgCgojIyBNw6l0b2RvIGRlIGxpbXBpZXphICMzOiBFbGltaW5hciB2YXJpYWJsZXMgaW5uZWNlc2FyaWFzLiBQYXJhIGVzdG8gc2UgcGxhbnRlYSBkZWphciB1bmljYW1lbnRlIGxhcyB2YXJpYWJsZXMgbcOhcyBpbXBvcnRhbnRlcyB0YWxlcyBjb21vIENsaWVudGUsIE1lcyB5IHVuaWRhZGVzLiBDb24gZGljaGFzIHZhcmlhYmxlcyBzZSBwb2Ryw6FuIHJlYWxpemFyIGRpc3RpbnRvcyBhbmFsaXNpcyBsb3MgY3VhbGVzIHNlcsOhbiBkZSB1dGlsaWRhZCBwYXJhIHJlYWxpemFyIHByb3B1ZXN0YXMgZGUgYWx0byBpbXBhY3RvIHBhcmEgbGEgb3JnYW5pemFjacOzbiB5IHN1IGNvbXBldGl0aXZpZGFkIGEgbGFyZ28gcGxhem8uCgpgYGB7cn0KZHBsYW4yIDwtIGRwbGFuMSAgICAgICAgIApkcGxhbjIgPC0gc3Vic2V0IChkcGxhbjEsIHNlbGVjdCA9IC1jIChwcm95ZWN0bywgaWRfb2RvbywgaXRlbSwgS19hYnJfMjIsIExfbWF5XzIyLCBNX2p1bl8yMixOX2p1bF8yMixPX2Fnb18yMiwgUF9zZXBfMjIsIFFfb2N0XzIyLCBSX25vdl8yMiwgIFNfZGljXzIyLCBUX2VuZV8yMywgVl9tYXJfMjMsIG1hcl8yMywgdG90YWxfbWVzZXMpKQpzdW1tYXJ5KGRwbGFuMikKYGBgCgojIyBFbnRlbmRlciBsYSBiYXNlIGRlIGRhdG9zIG1lZGlhbnRlIHZhcmlhYmxlcyB5IHJlZ2lzdHJvcwpgYGB7cn0KZGVzY3JpYmUoZHBsYW4yKQpzdHIoZHBsYW4yKQpgYGAKClNlIGVuY3VlbnRyYW4gMyB2YXJpYWJsZXMgY29uIDU5MCByZWdpc3Ryb3MgcmVzcGVjdGl2YW1lbnRlIAoKYGBge3J9ClZhcmkgPC0gYygiYENsaWVudGVgIiwiYE1lc2AiLCJgVW5pZGFkZXNgIikKYGBgCgpgYGB7cn0KVHlwZSA8LSBjKCJjdWFsaXRhdGl2byAoZGlzY3JldG8pIiwgImN1YWxpdGF0aXZvIChkaXNjcmV0bykiLCAiY3VhbnRpdGF0aXZvIChub21pbmFsKSIpCmBgYAoKCmBgYHtyfQpTY2FsZXMgPC0gYygicmF6w7NuIiwgIm9yZGluYWwiLCAibm9taW5hbCIpCmBgYAoKCmBgYHtyfQp0YWJsZTwtKGRhdGEuZnJhbWUoVmFyaSwgVHlwZSwgU2NhbGVzKSkKa25pdHI6OmthYmxlKHRhYmxlKQpgYGAKCgojIFRhYmxhIGRlIEZyZWN1ZW5jaWEgCgpgYGB7cn0Kc3VtbWFyeShkcGxhbjIpCmBgYAoKIyMjIFVuaWRhZGVzIHBvciBDbGllbnRlCmBgYHtyfQpwcm9wb3J0aW9uIDwtIHByb3AudGFibGUodGFibGUoZHBsYW4yJFVuaWRhZGVzLGRwbGFuMiRjbGllbnRlKSkKcHJvcG9ydGlvbiAlPiUKICBrYmwoKSAlPiUKICBrYWJsZV9zdHlsaW5nKCkKYGBgCgojIyMgVW5pZGFkZXMgcG9yIG1lcwpgYGB7cn0KcHJvcG9ydGlvbiA8LSBwcm9wLnRhYmxlKHRhYmxlKGRwbGFuMiRVbmlkYWRlcyxkcGxhbjIkTWVzKSkKcHJvcG9ydGlvbiAlPiUKICBrYmwoKSAlPiUKICBrYWJsZV9zdHlsaW5nKCkKYGBgCgojIEdyw6FmaWNhcyBjdWFsaXRhdGl2YXMgeSBjdWFudGl0YXRpdmFzCiMjIyBVbmlkYWRlcyBwb3IgbWVzCmBgYHtyfQpnZ3Bsb3QoZHBsYW4yLCBhZXMoTWVzLFVuaWRhZGVzKSkgKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiKSArCiAgc2NhbGVfZmlsbF9icmV3ZXIocGFsZXR0ZSA9ICJTZXQyIikgKyBnZ3RpdGxlKCJVbmlkYWRlcyBwb3IgbWVzIikgCmBgYApkZSBhY3VlcmRvIGNvbiBlbCBhbmFsaXNpcywgZXhpc3RlIHVuYSBpbnN0YW5jaWEgYWwgcmVkZWRvciBkZSBjYWRhIGN1YXJ0byBkZWwgYcOxbyBkb25kZSBleGlzdGUgdW4gcGljbyByZWxhdGl2byBhbCBudW1lcm8gZGUgcGVkaWRvcyBwcm9ncmFtYWRvcyBwYXJhIGVsIG1lcywgbG8gY3VhbCBxdWllcmUgZGVjaXIgcXVlIG8gYmllbiwgY2FzdWFsbWVudGUgc2UgcmVhbGl6YW4gcGVkaWRvcyBlbiBlc2FzIGluc3RhbmNpYXMgZGVudHJvIGRlbCBwZXJpb2RvIGFudWFsLCBvIHBvciBwcm9jZWRpbWllbnRvcyBhZG1pbnN0cmF0aXZvcyBlc3RvcyBkYXRvcyBzb24gY2FwdHVyYWRvcyBhbCBmaW5hbCBkZSBjYWRhIGN1YXJ0byB5IHBvciBjb25zaWd1aWVudGUgc29uIHJlcHJlc2VudGFkb3MgZGUgZXN0YSBtYW5lcmEuCgojIyMgUGVkaWRvcyBwb3IgY2xpZW50ZQpgYGB7cn0KZ2dwbG90KGRwbGFuMiwgYWVzKHggPSBNZXMsIHkgPSBVbmlkYWRlcywgZ3JvdXAgPSBjbGllbnRlKSkgKwogIGdlb21fbGluZSgpKwogIGdndGl0bGUoIlBlZGlkb3MgcG9yIENsaWVudGUiKQpgYGAKRW4gZXN0ZSBncmFmaWNvIHNlIHNpZ3VlIGNvbiBlbCB0aXBvIGRlIHRlbmRlbmNpYSBlbiBkb25kZSBsb3MgcGVkaWRvcyBwb3IgY2xpZW50ZSBhdW1lbnRhbiBvIGRpc21pbnV5ZW4gZGUgYWN1ZXJkbyBhbCBjdWFydG8gZGVsIGHDsW87IHNpbiBlbWJhcmdvIHNlIHB1ZWRlbiBvYnNlcnZhciBncnVwb3MgZGUgYWN0aXZpZGFkIGVuIGxhIGdyYWZpY2EsIHJlcHJlc2VudGFuZG8gYmxvcXVlcyBiaW1lc3RyYWxlcyBxdWUgc2UgY29ycmVsYWNpb25hbiBjb24gZWwgaW5zaWdodCBhbnRlcmlvci4gCiMjIyBHcsOhZmljYSBjdWFsaXRhdGl2YSBkZSBDbGllbnRlcwpgYGB7cn0KcGllKHRhYmxlKGRwbGFuMiRjbGllbnRlKSkKYGBgCkVuIGVzdGUgZ3JhZmljbyBkZSBwaWUgc2UgcHVlZGVuIHZpc3VhbGl6YXIgbG9zIGNsaWVudGVzLCBkb25kZSBWQVJST0MgZXMgcXVpZW4gcHJlZG9taW5hIGNhc2kgZWwgNTAlIGRlIGxhcyBmaWd1cmFjaW9uZXMgZGVudHJvIGRlIGxhcyBiYXNlIGRlIGRhdG9zLiBBaG9yYSBiaWVuLCBzaSBlcyBjaWVydG8gcXVlIGFwYXJlY2UgbcOhcyB2ZWNlcyBlbiBsYSBiYXNlIGRlIGRhdG9zLCBwZXJvIG5vIG5lY2VzYW1pYW1lbnRlIGVzIHF1aWVuIHJlYWxpemEgcGVkaWRvcyBtw6FzIGdyYW5kZXMgbyBxdWUgYXBvcnRlIGVuIG1heW9yIGNhbnRpZGFkIGEgRm9ybSwgc2lubyBxdWUsIGFwb3J0YW5kbyBvdHJhIGhpcG90ZXNpcywgc2Vyw61hIHZhbGlkbyBkZWNpciBxdWUgcHVlZGUgc2VyIHVuIGNsaWVudGUgY29uIHBlZGlkb3MgcGVxdWXDsW9zIHBlcm8gbXVsdGlwbGVzIGEgbG8gbGFyZ28gZGVsIHBlcmlvZG8gZXN0YWJsZWNpZG8uIAoKIyBHcsOhZmljb3MgZGUgZGlzcGVyY2nDs246CiMjIyBHcsOhZmljbyBkZSBkaXNwZXJjacOzbiAxCgpgYGB7cn0KcXFub3JtKGRwbGFuMiRVbmlkYWRlcywgbWFpbj0iR3JhZmljYSBkZSBkaXNwZXJzaW9uIiwgeWxhYj0iUGVkaWRvcyBwcm9ncmFtYWRvcyIsY29sPScjRkY3RjI0JykKICBxcWxpbmUoZHBsYW4yJFVuaWRhZGVzLCBjb2w9JyNGRjdGMjQnKQpgYGAKRW4gZXN0ZSBjYXNvLCBzZSBwdWVkZSBvYnNlcnZhciBsYSBkaXNwZXJjaW9uIGRlIGxvcyBwZWRpZG9zIHByb2dyYW1hZG9zLCBkb25kZSBzZSByZWFmaXJtYSBsYSBoaXBvdGVzaXMgZW4gZG9uZGUgaGF5IHVuYSBjb25jZW50cmFjacOzbiBkZSBwZWRpZG9zIGVuIGNpZXJ0b3MgcGVyaW9kb3MsIG1pZW50cmFzIHFldWUgZW4gb3Ryb3MgcGVyaW9kb3Mgc29uIG3DoXMgYWlzbGFkb3MgbyBiYWphbiBsYSByZWN1cnJlbmNpYSBvcGVyYXRpdmEgZW4gZXNlIHNlbnRpZG8uIAoKYGBge3J9Cmhpc3QoZHBsYW4yJFVuaWRhZGVzLG1haW49Ikhpc3RvZ3JhbWEiLHhsYWI9IkRlbGl2ZXJ5IGRpZmVyZW5jZSIsY29sPScjRkY3RjI0JykKYGBgCgpIYWxsYXpnb3M6IExhIG1heW9yw61hIGRlIHBvcmNlbnRhamUgZGUgcGVkaWRvcyBjb25zdGEgZGUgbWVub3MgZGUgMTAwMCBwaWV6YXMKCiMgVGFibGEgZGUgZXN0YWRpc3RpY2FzIHwgTWVkaWEsIE1lZGlhbmEsIE1vZGEgeSBEZXN2aWFjacOzbiBFc3RhbmRhcgpgYGB7cn0KbWVhMiA8LSBtZWFuKGRwbGFuMiRjbGllbnRlKQptZWQyIDwtIG1lZGlhbihkcGxhbjIkY2xpZW50ZSkKbW9kYTI8LSBtZnYoZHBsYW4yJGNsaWVudGUpCnNkMiA8LSBzZChkcGxhbjIkY2xpZW50ZSwgbmEucm0gPSBUUlVFKQpgYGAKCmBgYHtyfQptZWEzIDwtIG1lYW4oZHBsYW4yJE1lcykKbWVkMyA8LSBtZWRpYW4oZHBsYW4yJE1lcykKbW9kYTMgPC0gbWZ2KGRwbGFuMiRNZXMpCnNkMyA8LSBzZChkcGxhbjIkTWVzLCBuYS5ybSA9IFRSVUUpCmBgYAoKYGBge3J9Cm1lYTQgPC0gbWVhbihkcGxhbjIkVW5pZGFkZXMpCm1lZDQgPC0gbWVkaWFuKGRwbGFuMiRVbmlkYWRlcykKbW9kYTQgPC0gbWZ2KGRwbGFuMiRVbmlkYWRlcykKc2Q0IDwtIHNkKGRwbGFuMiRVbmlkYWRlcywgbmEucm0gPSBUUlVFKQpgYGAKCgpgYGB7cn0KVmFyaWFibGVzIDwtYygiQ2xpZW50ZSIsICJNZXMiLCAiVW5pZGFkZXMiKQpNZWRpYSA8LWMobWVhMixtZWEzLG1lYTQpCk1lZGlhbmEgPC1jKG1lZDIsbWVkMyxtZWQ0KQpNb2RhIDwtYyhtb2RhMixtb2RhMyxtb2RhNCkKRGVzdmlhY2lvbiA8LWMoc2QyLHNkMyxzZDQpCnRhYmxhMiA8LWRhdGEuZnJhbWUoVmFyaWFibGVzLCBNZWRpYSwgTWVkaWFuYSwgTW9kYSwgRGVzdmlhY2lvbikKa25pdHI6OmthYmxlKHRhYmxhMikKYGBgCgojIEJhciBwbG90IGFkaWNpb25hbApgYGB7cn0KZ2dwbG90KGRwbGFuMiwgYWVzKGNsaWVudGUsVW5pZGFkZXMpKSArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIpICsKICBzY2FsZV9maWxsX2JyZXdlcihwYWxldHRlID0gIlNldDEiKSArIGdndGl0bGUoIlVuaWRhZGVzIHBvciBtZXMiKSAKYGBgCkVuIGVzdGUgY2FzbyBzZSBtdWVzdHJhIGxhIGNhbnRpZGFkIGRlIHVuaWRhZGVzIHBvciBtZXMgcG9yIGNhZGEgY2xpZW50ZTsgZG9uZGUgc2UgcHVlZGUgZGFyIGEgY3VlbnRhIHF1ZSBlbiBkZWZpbml0aXZhIGV4aXN0ZW4gY2xpZW50ZXMgZXNwZWNpZmljb3MgbG9zIGN1YWxlcyByZXF1aWNpdGFuIGRlIG1heW9yIGRlbWFuZGEgYSBGb3JtIHF1ZSBvdHJvcyBjbGllbnRlcy4gCgoKIyMgU2NhdHRlciBwbG90CmBgYHtyfQogIHBsb3QoZHBsYW4yJFVuaWRhZGVzLCBkcGxhbjIkVW5pZGFkZXMsIG1haW4gPSAiRGlzcGVyY2nDs24gZGUgcHJvcG9yY2nDs24gZGUgcGllemFzIHByb2dyYW1hZGFzIiwKICAgICB4bGFiID0gIlVuaWRhZGVzIiwgeWxhYiA9ICIgIiwKICAgICBwY2ggPSAxOSwgZnJhbWUgPSBGQUxTRSkKYGBgClBhcmEgZXN0ZSBzY2F0dGVyIHBsb3QsIHNlIHB1ZWRlIGlkZW50aWZpY2FyIGxhIHRlbmRlbmNpYSBlbiBkb25kZSBsYSBjb25jZW50cmFjaW9uIGRlIHBlZGlkb3MgcGVxdWXDsW9zIGVzIG1heW9yIHF1ZSBsYSBkZSBwZWRpZG9zIGdyYW5kZXMsIGRvbmRlIGVuIGNvbnRleHRvIHJlbGF0aXZvIGhheSBzb2xvIHVub3MgY3VhbnRvcyBjbGllbnRlcyBxdWUgcmVxdWllcmVuIHVuaWRhZGVzL0NhbnRpZGFkZXMgZ3JhbmRlcyBwb3IgcGFydGUgZGUgZm9ybS4gRW4gb3RyYXMgcGFsYWJyYXMsIEZvcm0gZGFkYSBzdSBjYXBhY2lkYWQgeSBwZXJmaWwgZGUgZW1wcmVzYSwgbm8gZGVqYSBkZSB0ZW5lciBhcmVhcyBkZSBvcG9ydHVuaWRhZCBlbiBsbyBxdWUgcmVzcGVjdGEgbGEgcHJvZHVjY2lvbiBzaSBkZXNlYSBjcmVjZXIuIAojIyBCb3ggUGxvdAoKYGBge3J9CmJveHBsb3QoZHBsYW4yJFVuaWRhZGVzICwgdmVydGljYWwgPSBUUlVFKQpgYGAKCk51ZXZhbWVudGUgc2UgcmVhZmlybWEgbGEgaGlwb3Rlc2lzIGRlIHF1ZSBzb24gcG9jb3MgbG9zIGNsaWVudGVzIHF1aWVuZXMgcmVhbGl6YW4gcGVkaWRvcyBtdXkgZ3JhbmRlcyBlbiBjb21wYXJhY2lvbiBjb24gbG9zIGRlbcOhcwoKIyBUaW1lIHNlcmllcyBwbG90CmBgYHtyfQpwbG90KGRwbGFuMiRVbmlkYWRlcywgeGxhYiA9ICJNZXMiLCB5bGFiID0gIktpbG9zIikKcG9seWdvbihkcGxhbjIkTWVzLCBjb2w9ImdyZWVuIiwgYm9yZGVyPSJibGFjayIpCmBgYAoKICAqUG9yIHVuIGVycm9yIGRlc2Nvbm9jaWRvLCBSIG5vIG1lIHBlcm1pdGUgZWplY3V0YXIgY29ycmVjdGFtZW50ZSB1biB0aW1lIHNlcmllcyBwbG90LCBwb3IgbG8gcXVlIGludGVycHJldGFyw6kgbGEgcHJlc2VudGUgZ3LDoWZpY2EgY29tbyBzaSB0dXZpZXJhIGxvcyBhdHJpYnV0b3MgZGUgdW5hIHRpbWUgc2VyaWVzLiAKCkhhbGxhemdvczogCgoKIyBEZWxpdmVyeSBQZXJmb3JtYW5jZQpgYGB7cn0KI2ZpbGUuY2hvb3NlKCkKZGVwIDwtIHJlYWQuY3N2KCIvVXNlcnMvY2FybG9zZ29uemFsZXovRGVza3RvcC9GT1JNIC0gRGVsaXZlcnkgUGVyZm9ybWFuY2UuY3N2IikKYGBgCgojIyBFbnRlbmRlciBiYXNlIGRlIGRhdG9zCmBgYHtyfQpzdW1tYXJ5KGRlcCkKYGBgCgojIyBOdW1lcm8gZGUgdmFyaWFibGVzIHkgcmVnaXN0cm9zIHByZXNlbnRlcyBlbiBsYSBiYXNlIGRlIGRhdG9zCmBgYHtyfQpzdHIoZGVwKQpgYGAKQWN0dWFsbWVudGUgZXhpc3RlbiA4IHZhcmlhYmxlcyBjb24gMTQ0MCByZWdpc3Ryb3MgcmVzcGVjdGl2YW1lbnRlLiAKCiMgTGltcGllemEgZGUgbGEgYmFzZSBkZSBiYXNlIGRlIGRhdG9zCgojIyMgRWxpbWluYXIgdmFyaWFibGUgaW5lY2VzYXJpYSBjb24gbGEgZmluYWxpZGFkIGRlIHRyYWJhamFyIHVuaWNhbWVudGUgY29uIGxhcyBxdWUgc2UgdXRpbGljZW4gcGFyYSBlbCBlamVyY2ljaW8gZGUgYWx0byBpbXBhY3RvLgpgYGB7cn0KZGVwIDwtc3Vic2V0IChkZXAsIHNlbGVjdCA9LWMoVGFyZ2V0KSkgCmBgYAoKCiMjIyBDYW1iaWFyIGZvcm1hdG8gZGUgY2FyYWN0ZXIgYSBmZWNoYTogCkVuIGVzdGUgY2FzbyBzZSBwcmV0ZW5kZSBjYW1iaWFyIGVsIGZvcm1hdG8sIHlhIHF1ZSBsYSBiYXNlIGRlIGRhdG9zIGRhIGVzdGltYWRvcyBkZSBlbnRyZWdhIHBhcmEgbG9zIGNsaWVudGVzIHkgcG9yIGNvbnNpZ3VpZW50ZSBlcyBpbXBlcmF0aXZvIHF1ZSBsYXMgZmVjaGFzIHRlbmdhbiBlbCBmb3JtYXRvIMOzcHRpbW8gcGFyYSBlbCBlc3R1ZGlvIHkgcmVzdWx0YWRvIGRlc2VhZG8uIAoKYGBge3J9CmRlcCREYXRlIDwtYXMuRGF0ZShkZXAkRGF0ZSxmb3JtYXQgPSIlZC8lbS8lWSIpCnRpYmJsZShkZXApCmBgYAoKCiMgSWRlbnRpaWZpY2FyIHZhbG9yZXMgZmFsdGFudGVzIHwgVmVyaWZpY2FyIGxhIGV4aXN0ZW5jaWEgZGUgTkEncyBvIGRhdG9zIGludmFsaWRvcyBlbiBsYSBiYXNlIGRlIGRhdG9zCgpgYGB7cn0Kc3VtKGlzLm5hKGRlcCkpCmBgYAoKIyMjIFBvciB2YXJpYWJsZQpgYGB7cn0Kc2FwcGx5KGRlcCxmdW5jdGlvbih4KXN1bShpcy5uYSh4KSkpCmBgYAoKIyMjIEJvcnJhciByZWdpc3Ryb3MgaW52YWxpZG9zIChOQSdzKQpgYGB7cn0KZGVwIDwtIG5hLm9taXQoZGVwKQpzdW1tYXJ5KGRlcCkKYGBgCgojIFZhcmlhYmxlcyB5IHJlZ2lzdHJvcwpgYGB7cn0Kc3RyKGRlcCkKYGBgClRyYXMgbGEgbGltcGllemEgZGUgZGF0b3MsIHNlIGZpbmFsaXphIGxhIGJhc2UgZGUgZGF0b3MgY29uIDcgdmFyaWFibGVzIHkgMTQ0MCByZWdpc3Ryb3MgcmVzcGVjdGl2YW1lbnRlLCBjb24gbG8gY3VhbCwgc2UgcHJvc2VndWlyw6EgYSByZWFsaXphciBlbCBhbmFsaXNpcyBkZSBsYSBtaXNtYS4gCgoKIyBUYWJsYSBkZSBjbGFzaWZpY2FjacOzbiBkZSB2YXJpYWJsZXMKYGBge3J9CnZhcmlhYmxlcyA8LSBjKCJgQ2xpZW50ZWAiLCJgVnVlbHRhc2AiLCJgUGxhbi5hcnJpdmFsYCIsImBSZWFsLmFycml2YWxgIiwiYFBsYW4uZGVwYXJ0dXJlYCIsImBEaWZlcmVuY2VgIiwiYERhdGVgIikKdGlwb3MgPC0gYygiY3VhbGl0YXRpdm8gICIsICJjdWFudGl0YXRpdm8gKGRpc2NyZXRvKSAgIiwgImN1YW50aXRhdGl2byAoY29udGludW8pICAiLCAiY3VhbnRpdGF0aXZvIChjb250aW51bykgICIsICJjdWFudGl0YXRpdm8gKGNvbnRpbnVvKSAgIiwgImN1YW50aXRhdGl2byAoY29udGludW8pICAiLCAiY3VhbGl0YXRpdm8gICIpCmVzY2FsYXMgPC0gYygibm9taW5hbCIsICJyYXpvbiIsICJyYXpvbiIsICJyYXpvbiIsICJyYXpvbiIsICJyYXpvbiIsICJvcmRpbmFsIikKdGFibGUxIDwtIGRhdGEuZnJhbWUgKHZhcmlhYmxlcywgdGlwb3MsIGVzY2FsYXMpCmtuaXRyOjprYWJsZSh0YWJsZTEpCmBgYAoKIyBUYWJsYSBkZSBmcmVjdWVuY2lhIDEgfCBDbGllbnRlIHkgcGxhbiBhcnJpdmFsCgpgYGB7cn0KcHJvcG9ydGlvbiA8LSBwcm9wLnRhYmxlKHRhYmxlKGRlcCRDbGllbnRlLGRlcCRQbGFuLmFycml2YWwpKQpwcm9wb3J0aW9uICU+JQogIGtibCgpICU+JQogIGthYmxlX3N0eWxpbmcoKQpgYGAKCkVuIGVzdGUgY2FzbyBzZSBwbGFudGXDsyByZWFsaXphciBlc3RhIHRhYmxhIGRlIGZyZWN1ZW5jaWEsIHlhIHF1ZSBub3MgaW5kaWNhIGxhIGZyZWN1ZW5jaWEgZGUgY2FkYSBjbGllbnRlIGVuIGZ1bmNpw7NuIGRlIGxhcyBmZWNoYXMgZXNwZXJhZGFzIG8gcHJvZ3JhbWFkYXMgcXVlIHNlIHRpZW5lbi4gRW4gZXN0ZSBjYXNvIHBvZGVtb3MgdmVyIHF1ZSBleGlzdGVuIGNpZXJ0b3MgY2xpZW50ZXMgcXVlIGN1ZW50YW4gY29uIG1heW9yIGRlIGVzdGEgZnJlY3VlbmNpYSwgcmVsYWNpb25hbmRvc2UgY29uIG5vIHNvbG8gbGEgaW1wb3J0YW5jaWEgZGUgY2FkYSBjbGllbnRlLCBzaW5vIGNvbiBlbCAlIGRlIHBhcnRpY2lwYWNpw7NuIGVuIGxhIG9wZXJhY2nDs24gZGUgRm9ybS4KCiMgVGFibGEgY3J1emFkYQoKYGBge3J9CmxvY2F0aW9uIDwtIENyb3NzVGFibGUoZGVwJENsaWVudGUsIGRlcCRQbGFuLmFycml2YWwsIHByb3AudD1UUlVFLCBwcm9wLnI9VFJVRSwgcHJvcC5jPVRSVUUpCmtibChsb2NhdGlvbikgJT4lCiAga2FibGVfY2xhc3NpYygpCmBgYAoKIyBHcmFmaWNvcyBjdWFudGl0YXRpdm9zIHkgY3VhbGl0YXRpdm9zCgojIyBHcmFmaWNvIGN1YW50aXRhdGl2byB8IFZ1ZWx0YXMgcG9yIGNsaWVudGUgCmBgYHtyfQpnZ3Bsb3QoZGVwLCBhZXMoZGVwJENsaWVudGUsZGVwJFZ1ZWx0YXMpKSArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIpICsKICBzY2FsZV9maWxsX2JyZXdlcihwYWxldHRlID0gIlNldDIiKSArIGdndGl0bGUoIlZ1ZWx0YXMgcG9yIGNsaWVudGUiKSAKYGBgCgoKIyMgR3JhZmljbyBjdWFudGl0YXRpdm8gfCBQbGFuZXMgZGUgbGxlZ2FkYSBwb3IgY2xpZW50ZQpgYGB7cn0KZ2dwbG90KGRlcCwgYWVzKGRlcCRDbGllbnRlLGRlcCRQbGFuLmFycml2YWwpKSArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIpICsKICBzY2FsZV9maWxsX2JyZXdlcihwYWxldHRlID0gIlNldDIiKSArIGdndGl0bGUoIlBsYW5lcyBkZSBsbGVnYWRhIHBvciBjbGllbnRlIikgCmBgYAoKRW4gZXN0ZSBjYXNvIHNlIHB1ZWRlIGluZmVyaXIgcXVlIGV4aXN0ZW4gZG9zIGNsaWVudGVzIGN1eW9zIGVzZnVlcnpvcyBtdWVzdHJhbiBtYXlvciBtYWduaXR1ZCBwb3IgcGFydGUgZGUgbGEgcHJvZHVjdGl2aWRhZCBkZSBGb3JtLCB5YSBxdWUgZGUgYWN1ZXJkbyBjb24gZWwgZ3JhZmljbyBhbnRlcmlvciwgTUFITEUgeSBQUklOVEVMIHNvbiBsb3MgY2llbnRlcyBxdWllbmVzIHRpZW5lIG1heW9yIHByZXNlbmNpYSBlbiBsYSBhZ2VuZGEgZGUgbGEgZW1wcmVzYS4gCgojIyBHcmFmaWNvIGN1YWxpdGF0aXZvCgpgYGB7cn0KcGllKHRhYmxlKGRlcCRDbGllbnRlKSkKYGBgCgpFbiBlc3RlIGNhc28sIHNlIG11ZXN0cmFuIGxvcyBjbGllbnRlcyBwcmluY2lwYWxlcyBkZSBGb3JtLCBkb25kZSBkZXN0YWNhIGluaWNpYWxtZW50ZSBNQUhMRSB5IFZBUlJPQywgZG9uZGUgZGUgYWN1ZXJkbyBjb24gZWwgZ3JhZmljbyBhbnRlcmlvciwgdGllbmVuIG1heW9yIHBhcnRpY2lwYWNpw7NuIGVuIGxhcyBvcGVyYWNpb25lcyBkZSBGb3JtLiAKCiMgR3LDoWZpY29zIGRlIGRpc3BlcnNpw7NuCgpgYGB7cn0KRGVsaXZlcnkgPC0gZGF0YS5mcmFtZShkZXAkQ2xpZW50ZSwgZGVwJFBsYW4uYXJyaXZhbCwgZGVwJFJlYWwuYXJyaXZhbCwgZGVwJFJlYWwuZGVwYXJ0dXJlLCBkZXAkRGF0ZSkKY29sbmFtZXMoRGVsaXZlcnkpPC1jKCdDbGllbnRlJywgJ1BsYW4uYXJyaXZhbCcsICdSZWFsLmFycml2YWwnLCAnUmVhbC5kZXBhcnR1cmUnLCAnRGF0ZScpClJlYWxhcnJpdmFsX2JveHBsb3QgPSBzdWJzZXQoRGVsaXZlcnksIHNlbGVjdCA9LWMgKENsaWVudGUsIERhdGUpKQpib3hwbG90KFJlYWxhcnJpdmFsX2JveHBsb3QsZGF0YT1kYXRhLG1haW49IkVudHJlZ2FzIiwgCiAgICAgICAgY29sPXJhaW5ib3cgKG5jb2wodHJlZXMpKSkKYGBgCkNvbiBsb3MgYm94cGxvdCBhbnRlcmlvcmVzLCBzZSBwdWVkZSBkYXIgYSBjdWVudGEgZGUgcXVlIEZvcm0gZ2VuZXJhbG1lbnRlIGhhY2Ugc3VzIGVudHJlZ2FzIGFscmVkZWRvciB5IGRlbnRybyBkZWwgbWFyZ2VuIHBvc2libGVtZW50ZSBhY2VwdGFibGUsIGRvbmRlIGxhcyBmZWNoYSBwbGFuZWFkYXMgbm8gc2UgYWxlamFuIHRhbnRvIGRlIGxhIHJlYWxpZGFkIGVuIGZ1bmNpw7NuIGRlIGxhIHNhbGlkYSBkZSBsYSBmYWJyaWNhIHkgbGEgZmVjaGEgZGUgbGxlZ2FkYS4gCgoKIyBIaXN0b2dyYW1hIHwgRGlmZXJlbmNpYSBlbiBkw61hcyBkZSBwbGFuZWFkbyBjb250cmEgcmVhbGl6YWRvCmBgYHtyfQpoaXN0KGRlcCREaWZlcmVuY2UsbWFpbj0iRGlmZXJlbmNpYSBlbiBkw61hcyBkZSBwbGFuZWFkbyBjb250cmEgcmVhbGl6YWRvIix4bGFiPSJEZWxpdmVyeSBkaWZlcmVuY2UiLGNvbD0nI0ZGN0YyNCcpCmBgYAoKRW4gZXN0ZSBjYXNvLCB0ZW5lbW9zIHVuIG51bWVybyBuZWdhdGl2bywgaW5kaWNhbmRvIHF1ZSBGb3JtIHJlYWxpemEgZW50cmVnYXMgaW5jbHVzbyBhbnRlcyBkZSBsb3MgZXNwZXJhZG8gYWwgY2xpZW50ZSwgYXBvcnRhbmRvIG1heW9yIHZhbG9yIGRlbnRybyBkZSBzdSBzZXJ2aWNpby4gUG9yIG90cmEgcGFydGUsIGV4aXN0ZW4gb2Nhc2lvbmVzIG3DoXMgZXNjYXphcyBkb25kZSBGb3JtIGxsZXZhIGEgY2FibyBsYXMgZW50cmdhcyA1IGTDrWFzIGRlc3B1w6lzLiAKQW5hbGl6YWRvIGxvIGFudGVyaW9yLCBlcyBpbXBvcnRhbnRlIGdlbmVyYXIgdW5hIGVzdHJhdGVnaWEgcXVlIHBlcm1pdGEgYSBGb3JtIHJlYWxpemFyIGxhcyBlbnRyZWdhcyBlbCBkw61hIGVzdGFibGVjaWRvIG8gaW5jbHVzbyBhbnRlcy4gUG9yIG90cmEgcGFydGUsIHNpIHNlIHRyYXRhIGRlIHJldG9zIHTDqWNuaWNvcyBxdWUgaW1waWRpZXJvbiBsYSBlbnRyZWdhIGRlbnRybyBkZWwgcGVyaW9kbyBlc3RpcHVsYWRvLCBlcyBuZWNlc2FyaW8gcmVmb3J6YXIgbGEgcmVhbGNpw7NuIGNvbiBlbCBjbGllbnRlIGRlIGFsZ3VuYSBtYW5lcmEgKGRlc2N1ZW50by9wcm9kdWN0byBncmF0aXMvbG9nw61hc3RpY2EvZW50cmVnYSBhIG1lbm9yIGNvc3RvIG8gZ3JhdHVpdG8sIGV0Yy4pCgojIFRhYmxhIGRlIGVzdGFkaXN0aWNhcyB8IE1lZGlhLCBNZWRpYW5hLCBNb2RhIHkgRGVzdmlhY2nDs24gRXN0YW5kYXIKYGBge3J9Cm1vZGEgPC0gZnVuY3Rpb24oeCkgewogIHV4IDwtIHVuaXF1ZSh4KSAgICAKICB1eFt3aGljaC5tYXgodGFidWxhdGUobWF0Y2goeCwgdXgpKSldICAgICAgCn0gICAgCm1lYTIgPC0gbWVhbihkZXAkVnVlbHRhcykKbWVkMiA8LSBtZWRpYW4oZGVwJFZ1ZWx0YXMpCm1vZGEyIDwtIG1vZGEoZGVwJFZ1ZWx0YXMpCk1vZGExc2QyIDwtIHNkKGRlcCRWdWVsdGFzLCBuYS5ybSA9IFRSVUUpCmBgYAoKYGBge3J9Cm1lYTMgPC0gbWVhbihkZXAkQ2xpZW50ZSkKbWVkMyA8LSBtZWRpYW4oZGVwJENsaWVudGUpCm1vZGEzIDwtIG1vZGEoZGVwJENsaWVudGUpCnNkMyA8LSBzZChkZXAkQ2xpZW50ZSwgbmEucm0gPSBUUlVFKQpgYGAKCmBgYHtyfQptZWE0IDwtIG1lYW4oZGVwJERpZmVyZW5jZSkKbWVkNCA8LSBtZWRpYW4oZGVwJERpZmVyZW5jZSkKbW9kYTQgPC0gbW9kYShkZXAkRGlmZXJlbmNlKQpzZDQgPC0gc2QoZGVwJERpZmVyZW5jZSwgbmEucm0gPSBUUlVFKQpgYGAKCmBgYHtyfQptZWE1IDwtIG1lYW4oZGVwJFJlYWwuYXJyaXZhbCkKbWVkNSA8LSBtZWRpYW4oZGVwJFJlYWwuYXJyaXZhbCkKbW9kYTUgPC0gbW9kYShkZXAkUmVhbC5hcnJpdmFsKQpzZDUgPC0gc2QoZGVwJFJlYWwuYXJyaXZhbCwgbmEucm0gPSBUUlVFKQpgYGAKCmBgYHtyfQpWYXJpYWJsZXMgPC1jKCJWdWVsdGFzIiwgIkNsaWVudGUiLCAiRGlmZXJlbmNlIiwgIlJlYWxfQXJyaXZhbCIpCk1lZGlhIDwtYyhtZWEyLG1lYTMsbWVhNCwgbWVhNSkKTWVkaWFuYSA8LWMobWVkMixtZWQzLG1lZDQsIG1lZDUpCk1vZGEgPC1jKG1vZGEyLG1vZGEzLG1vZGE0LCBtb2RhNSkKRGVzdmlhY2lvbiA8LWMoc2QyLHNkMyxzZDQsIHNkNSkKdGFibGEyIDwtZGF0YS5mcmFtZShWYXJpYWJsZXMsIE1lZGlhLCBNZWRpYW5hLCBNb2RhLCBEZXN2aWFjaW9uKQprbml0cjo6a2FibGUodGFibGEyKQpgYGAKCgpIYWxsYXpnb3M6IAoKIyMgRGlhZ3JhbWEgZGUgZGlzcGVyc2nDs24KYGBge3J9CnFxbm9ybShkZXAkRGlmZXJlbmNlLCBtYWluPSJHcmFmaWNhIGRlIGRpc3BlcnNpb24iLCB5bGFiPSJEZWxpdmVyeSBkaWZlcmVuY2UiLGNvbD0nI0ZGN0YyNCcpCnFxbGluZShkZXAkRGlmZXJlbmNlLCBjb2w9JyNGRjdGMjQnKQpgYGAKCiMgVGltZSBzZXJpZXMgcGxvdApgYGB7cn0KZ2dwbG90KGRlcCxhZXMoeD0gRGF0ZSkpKwogIGdlb21fcG9pbnQoYWVzKHk9UGxhbi5hcnJpdmFsKSxjb2xvcj0iIzQxNjlFMSIpKwogIGdlb21fcG9pbnQoYWVzKHk9UmVhbC5hcnJpdmFsKSxjb2xvcj0iI0ZGN0YyNCIpKwogIGxhYnMoeD0iMjAyMiIseT0iTGxlZ2FkYXMiKSsKICBnZ3RpdGxlKCJMbGVnYWRhcyBwbGFuZWFkYXMgeSByZWFsZXMgZGUgcGVkaWRvcyIpCmBgYAoKRW4gZXN0YSBzZXJpZSBkZSB0aWVtcG8sIHNlIHB1ZWRlIG9ic2VydmFyIGNvbiBjbGFyaWRhZCBxdWUgZXhpc3RlbiBjaWVydGFzIGNvbmNlbnRyYWNpb25lcyBlbiBmZWJyZXJvLW1hcnpvIHkganVuaW8tYWdvc3RvIGRvbmRlIGhheSB2YXJpYWNpb25lcyBxdWUgbm8gbmVjZXNhcmlhbWVudGUgc2lndWVuIGxvcyB0aWVtcG8gZGUgbGxlZ2FkYSBwbGFuZWFkb3MsIGVzIGRlY2lyLCBGb3JtIGVuIG9jYXNpb25lcyBubyB0aWVuZSBsYSBjYXBhY2lkYWQgb3BlcmF0aXZhIG8gZGUgaW5mcmFlc3RydWN0dXJhIHBhcmEgZ2FyYW50aXphciBhIHVuIDEwMCUgcXVlIHNlIHJlYWxpemFyw6FuIGVudHJlZ2FzIGN1YW5kbyBsbyBpbmRpY2EgaW5pY2lhbG1lbnRlLiAgCgojIyBQcm9kdWNjacOzbgoKYGBge3J9CiNmaWxlLmNob29zZSgpCnByb2QgPC0gcmVhZC5jc3YoIi9Vc2Vycy9jYXJsb3Nnb256YWxlei9EZXNrdG9wL3Byb2R1Y2Npb24uY3N2IikgCmBgYAoKIyBFbnRlbmRlciBiYXNlIGRlIGRhdG9zCmBgYHtyfQpzdW1tYXJ5KHByb2QpCmBgYAoKCiMgTGltcGllemEgZGUgYmFzZSBkZSBkYXRvcyB8IFByb2R1Y2Npw7NuCgojIyMgTGltcGllemEgIzEgRWxpbWluYXIgY29sdW1uYXMgaW5uZWNlc2FyaWFzIHBhcmEgZWwgZXN0dWRpbyBlbiBjdWVzdGnDs24KCmBgYHtyfQpwcm9kMSA8LSBzdWJzZXQocHJvZCxzZWxlY3QgPSAtYyAobm8sIGlkX2Zvcm0sIHByb2R1Y3RvLCBob3JhX2ZpbiwgaW5pY2lvX3NldHVwLCBmaW5faW5pY2lvX3N1LCBpbmljaW9fcHJvY2VzbywgZmluX3Byb2Nlc28sIHRpZW1wb19tYXRlcmlhbGVzLCBtZXJtYSkpCgpzdW1tYXJ5KHByb2QxKQpgYGAKClNlIGVzY29nacOzIGVzdGUgbWV0b2RvIGRlIGxpbXBpZXphIHlhIHF1ZSBtZWRpYW50ZSBlbCBwcmVzZW50ZSwgc2UgdGVuZHLDoSBsYSBwb3NpYmlsaWRhZCBkZSB0cmFiYWphciDDum5pY2FtZW50ZSBjb24gbGFzIHZhcmlhYmxlcyBkZSBhbHRvIGltcGFjdG8gcGFyYSBudWVzdHJvIGVzdHVkaW8uCgojIyMgTGltcGllemEgIzIgRm9ybWF0ZWFyIGxhcyB2YXJpYWJsZXMKYGBge3J9CnByb2QxJHBpZXphc19wcm9nPC1hcy5udW1lcmljKHByb2QxJHBpZXphc19wcm9nKQpwcm9kMSR0aWVtcG9fbWludXRvczwtYXMubnVtZXJpYyhwcm9kMSR0aWVtcG9fbWludXRvcykKcHJvZDEkbGFtaW5hc19wcm9jZXNhZGFzPC1hcy5udW1lcmljKHByb2QxJGxhbWluYXNfcHJvY2VzYWRhcykKcHJvZDEkdGllbXBvX2NhbGlkYWQ8LWFzLm51bWVyaWMocHJvZDEkdGllbXBvX2NhbGlkYWQpCnByb2QxJGNsaWVudGU8LWFzLmZhY3Rvcihwcm9kMSRjbGllbnRlKSAgCnByb2QxJGVzdGFjaW9uX2FycmFucXVlPC1hcy5mYWN0b3IocHJvZDEkZXN0YWNpb25fYXJyYW5xdWUpIAoKY29sU3Vtcyhpcy5uYShwcm9kMSkpCmBgYAoKU2UgZW1wbGXDsyBlc3RlIG1ldG9kbyBkZSBsaW1waWV6YSwgeWEgcXVlIGxhIGJhc2UgZGUgZGF0b3MgY29udGFiYSBjb24gbGFzIHZhcmlhYmxlcyBjb24gZm9ybWF0byBkZSBjYXJhY3TDqXIsIGxvIGN1YWwgbm8gZXMgbG8gw7NwdGltbyBwYXJhIGVsIHBvc3RlcmlvciBhbsOhbGlzaXMuIEVzdG8gY29udHJpYnVpcsOhIGEgbGEgZ29ycmVjdGEgdmlzdWFsaXphY2nDs24gZGUgbG9zIGRhdG9zLCBsb3MgY3VhbGVzIGRlIG5vIGNvbnRhciBjb24gZWwgZm9ybWF0byBjb3JyZWN0bywgUiBwdWVkZSBubyBoYWNlciB1c28gw7NwdGltbyBkZSBsb3MgcmVnaXN0cm9zIHByb3ZlbmllbnRlcyBkZSBsYSBiYXNlIGRlIGRhdG9zLiAKCiMgUmVlbXBsYXphciBOQSdzIGNvbiBlbCBwcm9tZWRpbyAKYGBge3J9CnByb2QxPC1wcm9kMSAlPiUgbXV0YXRlKHBpZXphc19wcm9nPWlmZWxzZShpcy5uYShwaWV6YXNfcHJvZyksbWVkaWFuKHBpZXphc19wcm9nLG5hLnJtPVQpLHBpZXphc19wcm9nKSkKcHJvZDE8LXByb2QxICU+JSBtdXRhdGUodGllbXBvX21pbnV0b3M9aWZlbHNlKGlzLm5hKHRpZW1wb19taW51dG9zKSxtZWRpYW4odGllbXBvX21pbnV0b3MsbmEucm09VCksdGllbXBvX21pbnV0b3MpKQpwcm9kMTwtcHJvZDEgJT4lIG11dGF0ZShsYW1pbmFzX3Byb2Nlc2FkYXM9aWZlbHNlKGlzLm5hKGxhbWluYXNfcHJvY2VzYWRhcyksbWVkaWFuKGxhbWluYXNfcHJvY2VzYWRhcyxuYS5ybT1UKSxsYW1pbmFzX3Byb2Nlc2FkYXMpKQpwcm9kMTwtcHJvZDEgJT4lIG11dGF0ZSh0aWVtcG9fY2FsaWRhZD1pZmVsc2UoaXMubmEodGllbXBvX2NhbGlkYWQpLG1lZGlhbih0aWVtcG9fY2FsaWRhZCxuYS5ybT1UKSx0aWVtcG9fY2FsaWRhZCkpCmBgYAoKCiMjIyBWYXJpYWJsZXMgeSByZWdpc3Ryb3MgcHJlc2VudGVzIGVuIGxhIGJhc2UgZGUgZGF0b3MgZGUgUHJvZHVjY2nDs24KYGBge3J9CnN0cihwcm9kMSkKYGBgCgpFbiBlc3RlIGNhc28sIHNlIHRpZW5lbiA3IHZhcmlhYmxlcyBjb24gNTQxMSByZWdpc3Ryb3MgcmVzcGVjdGl2YW1lbnRlLiAKCgojIyBDbGFzaWZpY2FjacOzbiBkZSB2YXJpYWJsZXMgeSBlc2NhbGEgZGUgbWVkaWNpw7NuIHwgRm9ybWF0byB0YWJsYQoKYGBge3J9CiNzdW1tYXJ5KHByb2QxKQp2YXJpYWJsZXMgPC0gYygiYGZlY2hhYCIsImBjbGllbnRlYCIsImBwaWV6YXNfcHJvZ2AiLCJgdGllbXBvX21pbnV0b3NgIiwiYGVzdGFjaW9uX2FycmFucXVlYCIsImBsYW1pbmFzX3Byb2Nlc2FkYXNgIiwiYHRpZW1wb19jYWxpZGFkYCIpCnRpcG9zIDwtIGMoImN1YWxpdGF0aXZvICAiLCAiQ3VhbGl0YXRpdm8iLCAiY3VhbnRpdGF0aXZvIChjb250aW51bykgICIsICJjdWFudGl0YXRpdm8gKGNvbnRpbnVvKSAgIiwgImN1YWxpdGF0aXZvIChjb250aW51bykgICIsICJjdWFudGl0YXRpdm8gKGNvbnRpbnVvKSAgIiwgImN1YWxpdGF0aXZvIikKZXNjYWxhcyA8LSBjKCJyYXpvbiIsICJub21pbmFsIiwgInJhesOzbiIsICJyYXpvbiIsICJub21pbmFsIiwgInJhem9uIiwgInJhem9uIikKCnRhYmxlMSA8LSBkYXRhLmZyYW1lICh2YXJpYWJsZXMsIHRpcG9zLCBlc2NhbGFzKQprbml0cjo6a2FibGUodGFibGUxKQpgYGAKCiMjICAyIFRhYmxhcyBkZSBmcmVjdWVuY2lhIAojIyMgVGFibGEgZGUgZnJlY3VlbmNpYSBUaWVtcG8gZGUgQ2FsaWRhZCBwb3IgY2xpZW50ZS4KYGBge3J9CnByb3BvcnRpb24gPC0gcHJvcC50YWJsZSh0YWJsZShwcm9kMSRjbGllbnRlLHByb2QxJHRpZW1wb19jYWxpZGFkKSkKcHJvcG9ydGlvbiAlPiUKICBrYmwoKSAlPiUKICBrYWJsZV9zdHlsaW5nKCkKYGBgCiMjIFRhYmxhIGRlIGZyZWN1ZW5jaWEgIzIgCiMjIyBUaWVtcG8gZGUgY2FsaWRhZCBkZWRpY2FkbyBwb3IgbnVtZXJvIGRlIHBpZXphcy4gCgpgYGB7cn0KcHJvcG9ydGlvbiA8LSBwcm9wLnRhYmxlKHRhYmxlKHByb2QxJHRpZW1wb19jYWxpZGFkLHByb2QxJHBpZXphc19wcm9nKSkKcHJvcG9ydGlvbiAlPiUKICBrYmwoKSAlPiUKICBrYWJsZV9zdHlsaW5nKCkKYGBgCgojIyBHcsOhZmljb3MgY3VhbGl0YXRpdm9zIHkgY3VhbnRpdGF0aXZvcwoKIyMgR3LDoWZpY2EgZGUgYmFycmFzIGxhbWluYXMgcHJvY2VzYWRhcyBwb3IgY2xpZW50ZQpgYGB7cn0Kc3NzIDwtIGFnZ3JlZ2F0ZShsYW1pbmFzX3Byb2Nlc2FkYXMgfiBjbGllbnRlLCBkYXRhID0gcHJvZDEsIEZVTj1zdW0pCnNzIDwtIGFnZ3JlZ2F0ZShsYW1pbmFzX3Byb2Nlc2FkYXMgfiBjbGllbnRlLCBkYXRhID0gcHJvZDEsIEZVTj1tZWFuKQphcy5tYXRyaXgoc3MkbGFtaW5hc19wcm9jZXNhZGFzKQpgYGAKCgpgYGB7cn0KYXMubWF0cml4KHNzJGxhbWluYXNfcHJvY2VzYWRhcykKYGBgCgoKYGBge3J9CmRhdGEgPC0gZGF0YS5mcmFtZSgKICBuYW1lID0gc3NzJGNsaWVudGUsCiAgYXZlcmFnZSA9IHNzJGxhbWluYXNfcHJvY2VzYWRhcywKICBudW1iZXIgPSBzc3MkbGFtaW5hc19wcm9jZXNhZGFzCikKCm15X2JhciA8LSBiYXJwbG90KGhlaWdodD1kYXRhJG51bWJlciwgbmFtZXM9ZGF0YSRuYW1lKQpgYGAKRW4gZXN0ZSBjYXNvIHNlIHB1ZWRlIHN1c3RlbnRhciBxdWUgRm9ybSBkZXN0aW5hIHVuYSBwYXJ0ZSBmdWVydGUgZGUgc3VzIG9wZXJhY2lvbmVzIGEgbG9zIGNsaWVudGVzIGRlIFNUQUJJVUxVUyAzLCBUUk1YLCBWTCB5IERlbnNvLiBFbiBvdHJhcyBwYWxhYnJhcywgTGEgbWF5b3IgcGFydGUgZGUgcHJvZHVjY2nDs24gZXMgZGVzdGluYWRhIGEgZXN0b3MgY2xpZW50ZXMuIAoKYGBgYHtyfQpzdW1tYXJ5KHByb2QxKQpnZ3Bsb3QocHJvZDEsIGFlcyhjbGllbnRlLHRpZW1wb19jYWxpZGFkKSkgKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiKSArCiAgc2NhbGVfZmlsbF9icmV3ZXIocGFsZXR0ZSA9ICJTZXQyIikgKyBnZ3RpdGxlKCJUSUVNUE8gSU5WRVJUSURPIERFIENBTElEQUQgUE9SIENMSUVOVEUiKSAKYGBgYApFbiBlc3RlIGNhc28sIHNlIHB1ZWRlIGlkZW50aWZpY2FyIGVsIGNvbXBvcnRhbWllbnRvIG9wZXJhdGl2byBkZSBGT1JNLCBkb25kZSBldmlkZW50ZW1lbnRlIHNlIGxlIGludmllcnRlIHRpZW1wbyBkZSBjYWxpZGFkIG3DoXMgZnVlcnRlIGEgY2xpZW50ZXMgcXVlIGRlbWFuZGFuIG3DoXMgcGVkaWRvcyBwb3IgcGFydGUgZGUgZm9ybTsgUXVlcmllbmRvIGRlY2lyIHF1ZSBlbnRyZSBtYXlvciBzZWEgbGEgZGVtYW5kYSBkZWwgY2xpZW50ZSwgbWF5b3Igc2Vyw6EgZWwgdGllbXBvIGRlIGNhbGlkYWQgaW52ZXJ0aWRvIHJlc3BlY3RpdmFtZW50ZS4gCgpHcsOhZmljYSBjdWFsaXRhdGl2YQpgYGB7cn0KcGllKHRhYmxlKHByb2QxJGNsaWVudGUpKQpgYGAKRW4gZXN0ZSBjYXNvLCBzZSBwdWVkZW4gaWRlbnRpZmljYXIgbG9zIGNsaWVudGVzIHF1ZSBhcGFyZWNlbiBtw6FzIGVuIGxhIGJhc2UgZGUgZGF0b3MgZGUgRm9ybS4gQWhvcmEgYmllbiwgZXN0byBubyBzaWduaWZpY2EgcXVlIHNlYW4gbG9zIGNsaWVudGVzIHF1ZSBjb250cmlidXllbiBlbiBtYXlvciBtZWRpZGEgYSBsYSBvcGVyYWNpw7NuLCBuaSBtdWNobyBtZW5vcyBhIGxvcyBpbmdyZXNvcyBkZSBGb3JtLCBzaW4gZW1iYXJnbyBlcyBpbXBlcmF0aXZvIHRvbWFyIGVuIGN1ZW50YSBxdWUgYWwgYXBhcmVjZXIgZW4gZXN0YSBncmFmaWNhLCBzaWduaWZpY2EgcXVlIG11eSBwcm9iYWJsZW1lbnRlIGhhY2VuIG11Y2hvcyBwZWRpZG9zLCBwZXJvIG5vIG5lY2VzYXJpYW1lbnRlIHF1ZSBkZW1hbmRlbiBtdWNoYXMgcGllemFzLiAKCiMjIEdyw6FmaWNhcyBkZSBkaXNwZXJjacOzbgoKYGBge3J9CnBsb3QocHJvZDEkcGllemFzX3Byb2cscHJvZDEkbGFtaW5hc19wcm9jZXNhZGFzLCBjb2w9InJlZCIsIHhsYWI9IkxhbWluYXMgUHJvZ3JhbWFkYXMiLHlsYWI9IkxhbWluYXMgUHJvY2VzYWRhcyIpCmBgYAoKRW4gZXN0ZSBjYXNvLCBzZSBwdWVkZSBpZGVudGlmaWNhciBxdWUgbGEgZ3JhbiBwYXJ0ZSBkZSBsYSBhY3RpdmlkYWQgZGUgZm9ybSBlbiBsbyBxdWUgcmVzcGVjdGEgc3UgcHJvZHVjdGl2aWRhZCBlbiBmdW5jacOzbiBkZSBsYSBwcm9kdWNjacOzbiBwcm9ncmFtYWRhIGVzIHF1ZSBzdXMgcGVkaWRvcyBzZSBjb25zdGl0dXllbiBlbiBzdSBtYXlvcsOtYSBwb3IgcGVkaWRvcyByZWxhdGl2YW1lbnRlIHBlcXVlw7Fvcy4gCgojIyBHcsOhZmljYSBkZSBkaXNwZXJjacOzbgpgYGB7cn0KcGxvdChwcm9kMSRsYW1pbmFzX3Byb2Nlc2FkYXMscHJvZDEkdGllbXBvX21pbnV0b3MsIGNvbD0iYmx1ZSIsIHhsYWI9IkxhbWluYXMgUHJvZ3JhbWFkYXMiLHlsYWI9IkxhbWluYXMgUHJvY2VzYWRhcyIpCmBgYAoKCiMjIFRhYmxhIGRlIGVzdGFkaXN0aWNvcyAKIyMjIFNlIHV0aWxpemFyw6FuIGxhcyB2YXJpYWJsZXMgbcOhcyDDunRpbGVzIHBhcmEgZWwgZXN0dWRpby4gCmBgYHtyfQptb2RhIDwtIGZ1bmN0aW9uKHgpIHsKICB1eCA8LSB1bmlxdWUoeCkgICAgCiAgdXhbd2hpY2gubWF4KHRhYnVsYXRlKG1hdGNoKHgsIHV4KSkpXSAgICAgIAp9ICAgIAptZWEyIDwtIG1lYW4ocHJvZDEkZmVjaGEpCm1lZDIgPC0gbWVkaWFuKHByb2QxJGZlY2hhKQptb2RhMiA8LSBtb2RhKHByb2QxJGZlY2hhKQpzZDIgPC0gc2QocHJvZCRmZWNoYSwgbmEucm0gPSBUUlVFKQpgYGAKCmBgYHtyfQptZWEzIDwtIG1lYW4ocHJvZDEkcGllemFzX3Byb2cpCm1lZDMgPC0gbWVkaWFuKHByb2QxJHBpZXphc19wcm9nKQptb2RhMyA8LSBtb2RhKHByb2QxJHBpZXphc19wcm9nKQpzZDMgPC0gc2QocHJvZDEkcGllemFzX3Byb2csIG5hLnJtID0gVFJVRSkKYGBgCgpgYGB7cn0KbWVhNCA8LSBtZWFuKHByb2QxJHRpZW1wb19taW51dG9zKQptZWQ0IDwtIG1lZGlhbihwcm9kMSR0aWVtcG9fbWludXRvcykKbW9kYTQgPC0gbW9kYShwcm9kMSR0aWVtcG9fbWludXRvcykKc2Q0IDwtIHNkKHByb2QxJHRpZW1wb19taW51dG9zLCBuYS5ybSA9IFRSVUUpCmBgYAoKYGBge3J9Cm1lYTUgPC0gbWVhbihwcm9kMSRsYW1pbmFzX3Byb2Nlc2FkYXMpCm1lZDUgPC0gbWVkaWFuKHByb2QxJGxhbWluYXNfcHJvY2VzYWRhcykKbW9kYTUgPC0gbW9kYShwcm9kMSRsYW1pbmFzX3Byb2Nlc2FkYXMpCnNkNSA8LSBzZChwcm9kMSRSZWFsLmFycml2YWwsIG5hLnJtID0gVFJVRSkKYGBgCgpgYGB7cn0KVmFyaWFibGVzIDwtYygiZmVjaGEiLCAicGllemFzX3Byb2ciLCAidGllbXBvX21pbnV0b3MiLCAibGFtaW5hc19wcm9jZXNhZGFzIikKTWVkaWEgPC1jKG1lYTIsbWVhMyxtZWE0LCBtZWE1KQpNZWRpYW5hIDwtYyhtZWQyLG1lZDMsbWVkNCwgbWVkNSkKTW9kYSA8LWMobW9kYTIsbW9kYTMsbW9kYTQsIG1vZGE1KQpEZXN2aWFjaW9uIDwtYyhzZDIsc2QzLHNkNCwgc2Q1KQp0YWJsYTIgPC1kYXRhLmZyYW1lKFZhcmlhYmxlcywgTWVkaWEsIE1lZGlhbmEsIE1vZGEsIERlc3ZpYWNpb24pCmtuaXRyOjprYWJsZSh0YWJsYTIpCmBgYAoKIyMgQmFycGxvdHN5IGRpc3BlcmNpb24gcGxvdHMgcHJlc2VudGFkb3MgYW50ZXJpb3JtZW50ZS4gCgojIyBUaW1lIHNlcmllcyBwbG90CmBgYHtyfQpwbG90KHByb2QxJHBpZXphc19wcm9nLCB4bGFiID0gIlRpZW1wbyIsIHlsYWIgPSAiUGllemFzIHByb2dyYW1hZGFzIikKcG9seWdvbihwcm9kMSR0aWVtcG9fY2FsaWRhZCwgY29sPSJncmVlbiIsIGJvcmRlcj0iYmxhY2siKSAKYGBgCipDb21vIHNlIGVzcGVjaWZpY8OzIGFudGVyaW9ybWVudGUsIHNlIGRlc2Nvbm9jZSBsYSByYXpvw7NuIHBvciBsYSBjdWFsIG1pIGNvbXB1dGFkb3JhIG5vIGNvcnJlIGxhIHRpbWUgcGxvdCBjb3JyZWN0YW1lbnRlLCBzaW4gZW1iYXJnbyBtZSBndXN0YXLDrWEgaW50ZXJwcmV0YXIgbGEgZ3LDoWZpY2EgcXVlIG1lIGdlbmVyYSBlbCBjw7NkaWdvLgoKRW4gZXN0ZSBjYXNvLCBzZSBwdWVkZSBpbnRlcnByZXRhciBxdWUgZWwgbnVtZXJvIGRlIGluc3RhbmNpYXMgZG9uZGUgc2UgcHJvZ3JhbWFuIG1heW9yZXMgbnVlbWVyb3MgZGUgcGVkaWRvcyBkZSBwaWV6YXMgZXMgZHVyYW50ZSBlbCBwZW51bHRpbW8gY3VhcnRvIGRlbCBhw7FvLCBhc8OtIGNvbW8gcHJpbmNpcGlvcyBkZWwgc2lndWllbnRlIGHDsW8sIG1pZW50cmFzIHF1ZSBhIG1lZGlhZG9zIGRlbCBhw7FvIHByZXNlbnRlIGV4aXN0ZSB1bmEgY2FudGlkYWQgZXN0YWJsZSBkZSBwZWRpZG9zIHByb2dyYW1hZG9zIHkgcG9yIGNvbnNpZ3VpZW50ZSBwb2RlbW9zIGNvbmNsdWlyIHF1ZSBGb3JtIGVtcGxlYSBtYXlvciBwcm9kdWNjacOzbiBlbiBlc3RvcyBwZXJpb2RvcyBkZWwgYcOxbyB5IHBvciBsbyB0YW50byBwb2RlbW9zIGFzdW1pciB5IHN1c3RlbnRhciBxdWUgZXMgY3VhbmRvIGdlbmVyYW4gbWF5b3IgcGFydGUgZGUgbG9zIGluZ3Jlc29zLiAKCgojIE1lcm1hCmBgYHtyfQojZmlsZS5jaG9vc2UoKQptZXJtYSA8LSByZWFkLmNzdigiL1VzZXJzL2Nhcmxvc2dvbnphbGV6L0Rlc2t0b3AvRk9STSAtIE1lcm1hMS5jc3YiKQpgYGAKCiMgTGltcGlhciBiYXNlIGRlIGRhdG9zCiMjIyBFbGltaW5hciBkYXRvcyBOQQpgYGB7cn0Kc3VtKGlzLm5hKG1lcm1hKSkKYGBgCkVuIGVzdGUgY2FzbyBzZSBjb25zaWRlcmEgaW1wb3J0YW50ZSBjb3Jyb2JvcmFyIHF1ZSBubyBleGlzdGFuIGRhdG9zIGludmFsaWRvcyBjb21vIE5BJ3MgZW4gbGEgYmFzZSBkZSBkYXRvcyBwYXJhIHF1ZSBlbiBkYWRvIGNhc28sIHNlIHJlZW1wbGFjZW4gcG9yIDAncwoKIyBWYXJpYWJsZXMgeSByZWdpc3Ryb3MKYGBge3J9CnN0cihtZXJtYSkKYGBgCgpQb3Igb3RyYSBwYXJ0ZSwgbm8gc2UgcGVyY2liZSBxdWUgbGEgYmFzZSBkZSBkYXRvcyByZXF1aWVyYSBkZSBtYXlvciBsaW1waWV6YSwgeWEgcXVlIGN1ZW50YSBjb24gc29sbyBkb3MgdmFyaWFibGVzIHkgOSByZWdpc3Ryb3MgcXVlIGNvcnJlcG9uZGVuIGEgbG9zIG1lc2VzCgojIENsYXNpZmljYWNpw7NuIGRlIHZhcmlhYmxlcwpgYGB7cn0KdmFyaWFibGVzIDwtIGMoImBNZXNgIiwiYEtpbG9zYCIpCnRpcG9zIDwtIGMoImN1YWxpdGF0aXZvICAiLCAiY3VhbnRpdGF0aXZvIChkaXNjcmV0bykiKQplc2NhbGFzIDwtIGMoIm9yZGluYWwiLCAicmF6w7NuIikKCnRhYmxlMSA8LSBkYXRhLmZyYW1lICh2YXJpYWJsZXMsIHRpcG9zLCBlc2NhbGFzKQprbml0cjo6a2FibGUodGFibGUxKQpgYGAKCiNUYWJsYSBkZSBmcmVjdWVuY2lhCmBgYHtyfQogIHByb3BvcnRpb24gPC0gcHJvcC50YWJsZSh0YWJsZShtZXJtYSRNZXMsbWVybWEkS2lsb3MpKQpwcm9wb3J0aW9uICU+JQogIGtibCgpICU+JQogIGthYmxlX3N0eWxpbmcoKQpgYGAKUGFyYSBlbCBjYXNvIGRlIGxhIHRhYmxhIGFudGVyaW9yLCBzZSBwdWVkZSBpZGVudGlmaWNhciBxdWUgZXhpc3RlIG1heW9yIGNvbmNlbnRyYWNpw7NuIGRlIG1lcm1hIGFscmVkZWRvciBkZSBhZ29zdG8geSBwcmluY2lwaW9zIGRlIGHDsW8uCgpgYGB7cn0KZ2dwbG90KG1lcm1hLCBhZXMoTWVzLEtpbG9zKSkgKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiKSArCiAgc2NhbGVfZmlsbF9icmV3ZXIocGFsZXR0ZSA9ICJTZXQyIikgKyBnZ3RpdGxlKCJLaWxvcyBwb3IgbWVzIikgCmBgYApDb21vIHNlIHB1ZWRlIHZpc3VhbGl6YXIgeSBjb3Jyb2JvcmFyLCBtZWRpYW50ZSBlc3RhIGdyw6FmaWNhIHNlIHB1ZWRlIGRhciBhIGN1ZW50YSBkZSBxdWUgZWZlY3RpdmFtZW50ZSwgbG9zIG1lc2VzIGNvbiBtYXlvciBwcm9kdWNjacOzbiBkZSBtZXJtYSBkdXJhbnRlIGVsIHBlcmlvZG8gcHJvcG9yY2lvbmFkbyBlcyBlbCBtZXMgZGUgYWdvc3RvLiBTaW4gZW1iYXJnbywgc2UgY29uc2lkZXJhIHZhbGlvc28gcG9uZXIgc29icmUgbGEgbWVzYSBxdWUgZXhpc3RlIHVuIG1lcyBwaWNvIGNhZGEgY3VhcnRvIChRKSBkZWwgYcOxbyBjb24gdW5hIG1heW9yIGNvbmNlbnRyYWNpw7NuIGVuIGVsIHVsdGltbyBtZXMgZGVsIDJkbyBjdWFydG8geSB1biBhdW1lbnRvIGNvbnNpZGVyYWJsZSBhIHByaW5jaXBpb3MgZGVsIHByaW1lciBjdWFydG8uIEVzdG8gbm9zIGRpY2UgcXVlIGRlIGFjdWVyZG8gYSBsYSBwcm9kdWNjacOzbiBhIHBhcnRpciBkZSBsb3MgcGVkaWRvcyBwcm9ncmFtYWRvcywgbG9zIGN1YWxlcyBjb2luY2lkZW4gY29uIGxhIGhpcG90ZXNpcyBwcm9wdWVzdGEsIGRhIHJhesOzbiBhIHF1ZSBzb2JyZXRvZG8gZW4gYWdvc3RvIHNlIHByb2R1emNhbiBtYXlvcmVzIGRlc3BlcmRpY2lvcyBkYWRhIGxhIG9wZXJhY2nDs24uIAoKYGBge3J9CnN1bW1hcnkobWVybWEpCm1vZGEgPC0gZnVuY3Rpb24oeCkgewogIHV4IDwtIHVuaXF1ZSh4KSAgICAKICB1eFt3aGljaC5tYXgodGFidWxhdGUobWF0Y2goeCwgdXgpKSldICAgICAgCn0gICAgCmBgYAoKYGBge3J9Cm1lYTEgPC0gbWVhbihtZXJtYSRLaWxvcykKbWVkMSA8LSBtZWRpYW4obWVybWEkS2lsb3MpCm1vZGExIDwtIG1vZGEobWVybWEkS2lsb3MpCnNkMSA8LSBzZChtZXJtYSRLaWxvcywgbmEucm0gPSBUUlVFKQoKYGBgCgpgYGB7cn0KVmFyaWFibGVzIDwtYygiS2lsb3MiKQpNZWRpYSA8LWMobWVhMSkKTWVkaWFuYSA8LWMobWVkMSkKTW9kYSA8LWMobW9kYTEpCkRlc3ZpYWNpb24gPC1jKHNkMSkKdGFibGEyIDwtZGF0YS5mcmFtZShWYXJpYWJsZXMsIE1lZGlhLCBNZWRpYW5hLCBNb2RhLCBEZXN2aWFjaW9uKQprbml0cjo6a2FibGUodGFibGEyKQpgYGAKClZhcmlhYmxlcwlNZWRpYQlNZWRpYW5hCU1vZGEJRGVzdmlhY2lvbgpDYW50aWRhZAkyMDYwMi44OQkxOTM3MAkxCTU1MjYuNzIzClBhcmEgZXN0ZSBjYXNvIHNlIHRpZW5lIHF1ZSBlbCBwcm9tZWRpbyBkZSBtZXJtYSBnZW5lcmFkbyBlcyBkZSAyMCw2MDJrZwojIyBCb3ggcGxvdApgYGB7cn0KYm94cGxvdChtZXJtYSRLaWxvcyAsIHZlcnRpY2FsID0gVFJVRSkKYGBgCkNvbiBlbCBib3ggcGxvdCBhbnRlcmlvciBzZSBwdWVkZSBpZGVudGlmaWNhciBxdWUgcG9yIGxvIGdlbmVyYWwgbG9zIGtpbG9zIHF1ZSBzZSBnZW5lcmFuIHByb3ZlbmllbnRlcyBkZSBsYSBtYXRlcmlhIHByaW1hIGVzIGRlIGVudHJlIDE1MEsgLSAyNTBLLCBsbyBjdWFsIGVzIGltcG9ydGFudGUgcGFyYSBzYWJlciBlbCByYW5nbyBlbiBlbCBxdWUgc2UgcHVlZGUgb3BlcmFyIHBhcmEgZGVhc3Jyb2xsYXIgdW5hIHByb3B1ZXN0YSBlbiBsbyBxdWUgcmVzcGVjdGEgZWwgc2VndWltaWVudG8gZGUgZXN0YSBtYXRlcmlhIHNvYnJhbnRlLgoKCgpgYGB7cn0KaGlzdChtZXJtYSRLaWxvcyxtYWluPSJSYW5nbyBkZSBraWxvcyBwcm9kdWNpZG9zIix4bGFiPSJLaWxvcyBwcm9kdWNpZG9zIixjb2w9JyNGRjdGMjQnKQpgYGAKQ29uIGVzdGUgaGlzdG9ncmFtYSBzZSBwdWVkZSBkYXIgYSBjdWVudGEgZGUgcXVlIGxhIGlubWVuc2EgbWF5b3LDrWEgZGUgbGFzIGNhbnRpZGFkZXMgZW4gZWwgY29udGV4dG8gZGUgZGVzcGVyZGljaW9zIHNlIGVuY3VlbnRyYSBjb25jZW50cmFkYSBkZW50cm8gZGUgdW4gcmFuZ28gZGUgZW50cmUgMTUwLDAwMCAtIDI1MCwwMDAga2lsb3MsIGxvIGN1YWwgc2UgY29uc2lkZXJhIGluZm9ybWFjacOzbiBkZSB2YWxvciB5YSBxdWUgZXMgaW1wb3J0YW50ZSB0b21hcnNlIGVuIGN1ZW50YSBwYXJhIGlkZW50aWZpY2FyIHBvc2libGVzIHVzb3MgZGVsIG1hdGVyaWFsIHNvYnJhbnRlLiAKCgpgYGB7cn0KcGxvdChtZXJtYSRLaWxvcywgeGxhYiA9ICJNZXMiLCB5bGFiID0gIktpbG9zIikKcG9seWdvbihtZXJtYSRLaWxvcywgY29sPSJncmVlbiIsIGJvcmRlcj0iYmxhY2siKQpgYGAKKkxhIGZ1bmNpw7NuIGRlIHRpbWUgc2VyaWVzIHBsb3Qgbm8gbWUgcGVybWl0ZSBlbXBsZWFyIGNvbG9yZXMgYSBsYXMgbGluZWFzIHBhcmEgbGEgZ3JhZmljYS4gCkVuIG51ZXZhIGN1ZW50YSwgc2UgcHVlZGUgaWRlbnRpZmljYXIgcXVlIGR1cmFudGUgZWwgbWVzIDggKGFnb3N0bykgZXMgY3VhbmRvIGhheSB1biBwaWNvIG1heGltbyBkZWwgcGVyaW9kbyB0b3RhbCwgc2luIGVtYmFyZ28sIHkgZGUgaWd1YWwgbWFuZXJhLCBzZSB0aWVuZW4gZWxlbWVudG9zIHBhcmEgYXJndW1lbnRhciBxdWUgY2FkYSBjdWFydG8gZGVsIG1lcyBleGlzdGUgdW4gcGljbzsgZXNvIHNpLCBjb24gbWF5b3IgcHJvbnVuY2lhY2lvbiB5IGNvbXBvcnRhbWllbnRvIGFsY2lzdGEgZHVyYW50ZSBlbCBtZXMgZGUgYWdvc3RvLiAKCiMgU2NyYXAKYGBge3J9CiNmaWxlLmNob29zZSgpCnNjcmFwIDwtIHJlYWQuY3N2KCIvVXNlcnMvY2FybG9zZ29uemFsZXovRGVza3RvcC9GT1JNIF9TY3JhcF9FdjJfTm9fTGltcGlhLmNzdiIpCmBgYAoKCiMjIExpbXBpZXphIGRlIGJhc2UgZGUgZGF0b3MKCiMjIyBFbGltaW5hciBkYXRvcyBOQQpgYGB7cn0Kc3VtKGlzLm5hKHNjcmFwKSkKYGBgCgpObyBzZSByZWdpc3RyYW4gZGF0b3MgZGUgZXN0ZSB0aXBvIGVuIGxhIGJhc2UgZGUgZGF0b3MuCgojIyMgQXNpZ25hciBmb3JtYXRvIMOycHRpbW8gYSBsYSBmZWNoYSBkZW50cm8gZGUgbGEgYmFzZSBkZSBkYXRvcwpgYGB7cn0Kc2NyMSA8LSBzY3JhcApzY3IxJEZlY2hhIDwtIGFzLkRhdGUoc2NyMSRGZWNoYSwgZm9ybWF0ID0gIiVkLyVtLyVZIikKc3VtbWFyeShzY3IxKQpgYGAKCkNvbiBlc3RhIGxpbXBpZXphIHNlIHByZXRlbmRlIGFqdXN0YXIgZWwgZm9ybWF0byBjb3JyZWN0byBkZSBsYSBmZWNoYSBwYXJhIHBvc3RlcmlvcmVzIHZpc3VhbGl6YWNpb25lcy4gCgojIFZhcmlhYmxlcyB5IHJlZ2lzdHJvcwpgYGB7cn0Kc3RyKHNjcjEpCmBgYAoKIyBDbGFzaWZpY2FjacOzbiBkZSB2YXJpYWJsZXMKYGBge3J9CnN1bW1hcnkoc2NyMSkKdmFyaWFibGVzIDwtIGMoImBSZWZlcmVuY2lhYCIsImBGZWNoYWAiLCJgUHJvZHVjdG9gIiwiYENhbnRpZGFkYCIsImBVbmlkYWQuZGUubWVkaWRhYCIsImBVYmljYWNpw7NuLmRlLm9yaWdlbmAiLCJgVWJpY2FjacOzbi5kZS5kZXNlY2hvYCIsICJgRXN0YWRvYCIpCnRpcG9zIDwtIGMoImN1YWxpdGF0aXZvICAiLCAiQ3VhbGl0YXRpdm8iLCAiQ3VhbGl0YXRpdm8iLCAiY3VhbnRpdGF0aXZvIChjb250aW51bykgICIsICJjdWFsaXRhdGl2byIsICJjdWFsaXRhdGl2byIsICJjdWFsaXRhdGl2byIsICJgY3VhbGl0YXRpdm9gIikKZXNjYWxhcyA8LSBjKCJub21pbmFsIiwgIm9yZGluYWwiLCAibm9taW5hbCIsICJyYXpvbiIsICJub21pbmFsIiwgIm5vbWluYWwiLCAibm9taW5hbCIsICJub21pbmFsIikKCnRhYmxlMSA8LSBkYXRhLmZyYW1lICh2YXJpYWJsZXMsIHRpcG9zLCBlc2NhbGFzKQprbml0cjo6a2FibGUodGFibGUxKQpgYGAKCgojIFRhYmxhIGRlIGZyZWN1ZW5jaWEgCmBgYHtyfQpwcm9wb3J0aW9uIDwtIHByb3AudGFibGUodGFibGUocHJvZDEkY2xpZW50ZSxwcm9kMSR0aWVtcG9fY2FsaWRhZCkpCnByb3BvcnRpb24gJT4lCiAga2JsKCkgJT4lCiAga2FibGVfc3R5bGluZygpCmBgYAoKCiMgRGF0b3MgZXN0YWTDrXN0aWNvcwpTZSB0b23DsyBlbiBjdWVudGEgcXVlIGxhIHVuaWNhIHZhcmlhYmxlIGRlIGltcGFjdG8gcGFyYSBlbCBlc3R1ZGlvIGVzIGxhIGRlIGNhbnRpZGFkLCB5YSBxdWUgc2UgdHJhdGEgZGUgbGEgdW5pY2EgbGEgY3VhbCBlcyBjdWFudGl0YXRpdmEuCgpgYGB7cn0KbW9kYSA8LSBmdW5jdGlvbih4KSB7CiAgdXggPC0gdW5pcXVlKHgpICAgIAogIHV4W3doaWNoLm1heCh0YWJ1bGF0ZShtYXRjaCh4LCB1eCkpKV0gICAgICAKfSAgICAKbWVhMSA8LSBtZWFuKHNjcjEkQ2FudGlkYWQpCmBgYAoKYGBge3J9Cm1lYTEgPC0gbWVhbihzY3IxJENhbnRpZGFkKQptZWQxIDwtIG1lZGlhbihzY3IxJENhbnRpZGFkKQptb2RhMSA8LSBtb2RhKHNjcjEkQ2FudGlkYWQpCnNkMSA8LSBzZChzY3IxJENhbnRpZGFkLCBuYS5ybSA9IFRSVUUpCgpgYGAKCmBgYHtyfQpWYXJpYWJsZSA8LSBjKCJDYW50aWRhZCIpClByb21lZGlvIDwtIGMoIjYuNzI2IikKTW9kYSA8LSBjKCIxIikKTWVkaWFuYSA8LSBjKCIyIikKVmFyaWFuemEgPC0gYygiMTQwLjc0NyIpCkRlc3ZpYWNpw7NuX0VzdMOhbmRhciA8LSBjKCIxMS44NjMiKQp0YWJsYSA8LWRhdGEuZnJhbWUoVmFyaWFibGUsUHJvbWVkaW8sIE1vZGEsIE1lZGlhbmEsIFZhcmlhbnphLCBEZXN2aWFjacOzbl9Fc3TDoW5kYXIpCmtuaXRyOjprYWJsZSh0YWJsYSkKYGBgClZhcmlhYmxlcwlNZWRpYQlNZWRpYW5hCU1vZGEJRGVzdmlhY2lvbgoKCkVuIGVzdGUgY2FzbyBzZSBwdWVkZSBhbmFsaXphciBxdWUgZW4gbG8gcXVlIHJlc3BlY3RhIGxhIGNhbnRpZGFkLCBoYXkgdW5hIG1lZGlhIGRlIGVudHJlIDYgeSA3IHBpZXphcyBwb3Igb3JkZW47IHNpbiBlbWJhcmdvLCBjb21vIHNlIGhhIG1lbmNpb25hZG8gYW50ZXJpb3JtZW50ZSBkdXJhbnRlIGVsIGRvY3VtZW50bywgbGEgbWF5b3IgcGFydGUgZGUgbGEgcHJvZHVjY2nDs24gZGUgZm9ybSBlcyBlbiBjYW50aWRhZGVzIHBlcXVlw7FhcyB5IHBvciBjb25zaWd1aWVudGUgdGllbmUgc2VudGlkbyBxdWUgbGEgbW9kYSBzZWEgZGUgMS4KCiMgVGFibGEgZGUgZnJlY3VlbmNpYQoKCiMgR3LDoWZpY2FzIGN1YW50aXRhdGl2YXMgeSBjdWFsaXRhdGl2YXMKYGBge3J9CnN1bW1hcnkoc2NyMSkKZ2dwbG90KHNjcjEsIGFlcyhQcm9kdWN0byxDYW50aWRhZCkpICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IikgKwogIHNjYWxlX2ZpbGxfYnJld2VyKHBhbGV0dGUgPSAiU2V0MiIpICsgZ2d0aXRsZSgiVW5pZGFkZXMgcG9yIG1lcyIpIApgYGAKSGFsbGF6Z286IFBvc3RlcmlvciBhbCBkZXNhcnJvbGxvIGRlIGVzdGEgZ3JhZmljYSwgc2UgcHVlZGUgZGF0IGEgY3VlbnRhIGRlIHF1ZSBGb3JtIHRpZW5lIHVuYSBhbXBsaWEgdmFyaWVkYWQgZGUgcHJvZHVjdG9zLCBzaW4gZW1iYXJnbyBleGlzdGVuIHVub3MgY3VhbnRvcyAoY2FudGlkYWQgY29uc2lkZXJhYmxlKSBsYSBjdWFsIHNlIHN1c3RlbnRhIHNvbiBwcm9kdWN0b3MgcG9wdWxhcmVzIG8gZGUgYWx0YSBkZW1hbmRhIGR1cmFudGUgbG9zIHBlZGlkb3MuCgojIEN1YWxpYXRpdmEKYGBge3J9CnBpZSh0YWJsZShzY3IxJFViaWNhY2nDs24uZGUub3JpZ2VuKSkKYGBgCgpFbiBlc3RlIGNhc28sIHNlIHB1ZWRlIGlkZW50aWZpY2FyIGxhIGRpc3RyaWJ1Y2nDs24gZGUgbG9zIHByb2R1Y3RvcyBkZSBsb3MgcGVkaWRvcyBlbiBzdXMgcmVzcGVjdGl2YXMgZXRhcGFzLiBFbiBwcmltZXJhIGluc3RhbmNpYSBzZSBpZGVudGlmaWNhIHF1ZSBlbiBzdSBncmFuIG1heW9yw61hIHNlIHRpZW5lIHVuYSB0ZW5kZW5jaWEgYSBxdWUgbG9zIHByb2R1Y3RvcyBwYXNlbiBwb3IgbGEgZXRhcGEgZGUgcHJlLXByb2R1Y3Rpb24gKGxvIGN1YWwgdGllbmUgc2VudGlkbyB5YSBxdWUgZXMgbGEgZXRhcGEgZGUgcHJlcGFyYWNpb24gbyBwcmV2aWEgYSBkZXNhcnJvbGxhciBlbCBwcm9kdWN0by4gZXRhcGEgZGUgcGxhbmVhY2nDs24gcG9yIHBhcnRlIGRlbCBlcXVpcG8gZGUgVEkpIAoKIyBEaWFncmFtYSBkZSBkaXNwZXJzaW9uIApgYGB7cn0Kc3VtbWFyeShzY3IxKQpnZ3Bsb3Qoc2NyMSwgYWVzKHg9RmVjaGEsIHk9Q2FudGlkYWQsIGNvbG91cj1VYmljYWNpw7NuLmRlLm9yaWdlbikpICsgZ2VvbV9wb2ludCgpCmBgYAoKRW4gZXN0ZSBjYXNvIHNlIHRpZW5lIHVuIGluc2lnaHQgcXVlIGVuIGxvIHBlcnNvbmFsIGNvbnNpZGVybyBiYXN0YW50ZSBjdXJpb3NvLCB5YSBxdWUgZW4gcHJpbWVyYSBpbnN0YW5jaWEgcG9kZW1vcyBvYnNlcnZhciBjb21vIGVzIHF1ZSBsb3MgcGVkaWRvcyBjb24gbcOhcyBkZSAyNSB1bmlkYWRlcyBzaWVtcHJlIGVzdMOhbiBlbiBwcmUtcHJvZHVjY2nDs24sIHBvciBvdHJvIGxhZG8sIFBvc3QgcHJvZHVjY2nDs24geSBlbnRyZWdhIGRlIFBUIGVzdMOhbiBlbiDDs3JkZW5lcyBtZW5vcmVzIGRlIDI1IHVuaWRhZGVzLiBMbyBjdWFsIHNpZ25pZmljYSBxdWUgRm9ybSBiYXRhbGxhIHVuIHBvY28gbcOhcyBjb24gcGVkaWRvcyBtw6FzIGdyYW5kZXMgeSBwb3IgY29uc2lndWllbnRlLCBzZSBjb25zaWRlcmEgcXVlIHZhbGRyw61hIGxhIHBlbmEgaW5kYWdhciBlbiBzdXMgcHJvY2Vzb3MgaW50ZXJub3MgcGFyYSBldmFsdWFyIGVsZW1lbnRvcyBhIGVmaWNpZW50aXphci4gCgojIFBSRURJQ0NJw5NOCgojIyBQcmVkaWNjacOzbiBkZWwgRGVzZW1wZcOxbyBkZSBsYSBJbmR1c3RyaWEgQXV0b21vdHJpeiBVU0EgCmBgYHtyfQojZmlsZS5jaG9vc2UoKQpQUkVEVVNBIDwtIHJlYWQuY3N2KCIvVXNlcnMvY2FybG9zZ29uemFsZXovRGVza3RvcC9CYXNlIEVVQSBudWV2YS5jc3YiKQpsaWJyYXJ5KGZvcmVjYXN0KQpzdW1tYXJ5KFBSRURVU0EpCmBgYAoKIyMjIEdyw6FmaWNvIGRlIGNvcnJlbGFjacOzbgpgYGB7cn0KCmxpYnJhcnkoY29ycnBsb3QpClBVU0E8LXN1YnNldChQUkVEVVNBLHNlbGVjdD0tYyhZZWFyKSkKY29ycnBsb3QoY29yKFBVU0EpLHR5cGU9J3VwcGVyJyxvcmRlcj0naGNsdXN0JyxhZGRDb2VmLmNvbD0nYmxhY2snKQpgYGAKCkEgbWFuZXJhIGRlIGluc2lnaHRzLCBlbiBlc3RlIGNhc28sIHNlIHB1ZWRlIG9ic2VydmFyIHF1ZSBleGlzdGUgdW5hIGRpcmVjdGEgY29ycmVsYWNpw7NuIGNvbiBsYSB2YXJpYWJsZSBkZXBlbmRpZW50ZSAgYXV0b3BhcnRlcyBlbiBsbyBxdWUgcmVzcGVjdGEgdmVudGFzIGNvbiAwLjU2LCBhbCBpZ3VhbCBxdWUgbGFzIHZlbnRhcyhzZSBwdWVkZSBzdXN0ZW50YXIgcXVlIGVzIGRlYmlkbyBhbCBpbmNyZW1lbnRvIGVuIGRlbWFuZGEgZGUgYXV0b3MgeSBwb3IgY29uc2lndWllbnRlIGxhcyBhcm1hZG9yYXMgY29udGludWFyIHByb2R1Y2llbmRvIGp1bnRvIGNvbiBzdXMgcHJvdmVlZG9yZXMgbGFzIGF1dG9wYXJ0ZXMsIGxvIGN1YWwgaW1wYWN0YSBkaXJlY3RhbWVudGUgYSBGb3JtLCB5YSBxdWUgcG9yIGNvbnNpZ3VpZW50ZSBzZSByZXF1aWVyZW4gZW1wYXF1ZXMgcGFyYSByZWFsaXphciB1bmEgbG9naXN0aWNhIHNvc3RlbmlibGUpLiBQb3Igb3RyYSBwYXJ0ZSwgc2UgdGllbmVuIGxhcyBhdXRvcGFydGVzIGNvbiBsYSBwb2JsYWNpw7NuLCBkb25kZSBzZSBpbmZpZXJlIHF1ZSBjdWFudG8gbWF5b3IgZXMgbGEgcG9ibGFjacOzbiwgbWF5b3IgZXMgbGEgbmVjZXNpZGFkIGRlIHRyYW5zcG9ydGUgeSBwb3IgY29uc2lndWllbnRlLCB5IGVuIGNvbmp1bnRvLCBudWV2YW1lbnRlIHNlIHZhbGlkYSBsYSBoaXBvdGVzaXMgKGluc2lnaHQgIzEpLgoKIyMjIE1vZGVsbyBwcmVkaWN0aXZvIApgYGB7cn0KcmVncmVzaW9uIDwtIGxtKFByb2R1Y3Rpb25+IEluZmxhY2lvbiArIFBvYnJlemEgKyBQSUIgKyBQb2JsYWNpb24gKyBEZXNlbXBsZW8gKyBBdXRvcGFydGVzLCBkYXRhPVBSRURVU0EpCnN1bW1hcnkgKHJlZ3Jlc2lvbikKYGBgCgpDb21vIHNlIHB1ZWRlIG9ic2VydmFyIGVuIGxhIHRhYmxhLCBzZSB0aWVuZSB1bmEgcl4yIGRlbCA5OCUgeSBwb3IgY29uc2lndWllbnRlIHNlIHB1ZWRlIHN1c3RlbnRhciBxdWUgbGEgaGlwb3Rlc2lzIGVzIHZhbGlkYSwgZG9uZGUgbGEgdmFyaWFibGUgZGVwZW5kaWVudGUgZGUgcHJvZHVjY2nDs24sIHRpZW5lIHVuYSBmdWVydGUgY29ycmVsYWNpw7NuIGxhcyB2YXJpYWJsZXMgaW5kZXBlbmRpZW50ZXMgCmxpc3RhZGFzIGFudGVyaW9ybWVudGUsIHBvciBsbyBxdWUgc2UgY29uc2lkZXJhIHVuYSBoaXBvdGVzaXMgdmFsaWRhIHBhcmEgZWwgZXN0dWRpby4KCgpgYGB7cn0KZGF0b3NfbnVldm9zIDwtIGRhdGEuZnJhbWUoSW5mbGFjaW9uPTIsIFBvYnJlemE9MSwgUElCPTQ3MTk1LCBQb2JsYWNpb249MzI1MTIyMTI4LCBEZXNlbXBsZW8gPTUsIEF1dG9wYXJ0ZXM9NjM2MzIwKQpwcmVkaWN0KHJlZ3Jlc2lvbixkYXRvc19udWV2b3MpCmBgYAoKYGBge3J9CiNpbnN0YWxsLnBhY2thZ2VzKCJqdG9vbHMiKQpzdW1tYXJ5KFBSRURVU0EpCmxpYnJhcnkoanRvb2xzKQplZmZlY3RfcGxvdChyZWdyZXNpb24scHJlZCA9IEF1dG9wYXJ0ZXMsaW50ZXJ2YWw9VFJVRSkKYGBgCgpFbiBlc3RlIGNhc28gc2UgcHVlZGUgY29uZmlybWFyIGxhIGFsdGEgdmFsaWTDqXogZGVsIG1vZGVsbywgZG9uZGUgbGEgdmFyaWFibGUgaW5kZXBlbmRpZW50ZSBzZSB2ZSBzdW1hbWVudGUgaW5mbHVlbmNpYWRhIHkgZW4gZGFkbyBjYXNvIGNvbiBjcmVjaW1pZW50byBwcm9wb3JjaW9uYWwgYSBsYSBpbmRlcGVuZGllbnRlIGRlIHByb2R1Y2Npw7NuLgoKIyBNb2RlbG8gMgpgYGB7cn0KcmVncmVzaW9uMiA8LSBsbShTYWxlc34gSW5mbGFjaW9uICsgUG9icmV6YSArIFBJQiArIFBvYmxhY2lvbiArIERlc2VtcGxlbyArIEF1dG9wYXJ0ZXMsIGRhdGE9UFJFRFVTQSkKc3VtbWFyeSAocmVncmVzaW9uMikKYGBgCgpQYXJhIGVzdGUgY2FzbyBlbiBlc3BlY2lmaWNvLCBudWV2YW1lbnRlIHNlIHRpZW5lIHVuYSByXjIgY29uIGVsIDk3JSBkZSBjb25maWFiaWxpZGFkIHkgcG9yIGNvbnNpZ3VpZW50ZSBzZSBzb3N0aWVuZSBxdWUgbGFzIHZlbnRhcyB0aWVuZW4gdW5hIGRpcmVjdGEgY29ycmVsYWNpw7NuIGNvbiBsYXMgZGVtw6FzIHZhcmlhYmxlcyBsaXN0YWRhcy4KCmBgYHtyfQpkYXRvc19udWV2b3MyIDwtIGRhdGEuZnJhbWUoSW5mbGFjaW9uPTIsIFBvYnJlemE9MSwgUElCPTQ3MTk1LCBQb2JsYWNpb249MzI1MTIyMTI4LCBEZXNlbXBsZW8gPTUsIEF1dG9wYXJ0ZXM9NjM2MzIwKQpwcmVkaWN0KHJlZ3Jlc2lvbjIsZGF0b3NfbnVldm9zMikKYGBgCgoKYGBge3J9CmVmZmVjdF9wbG90KHJlZ3Jlc2lvbjIscHJlZD1BdXRvcGFydGVzLGludGVydmFsPVRSVUUpCmBgYAoKRW4gZXN0ZSBjYXNvIHNlIHB1ZWRlIG9ic2VydmFyIGxhIGRpcmVjdGEgY29ycmVsYWNpw7NuIHkgZWwgY29tcG9ydGFtaWVudG8gcXVlIHNlIHRpZW5lIGFsIGp1bnRhciBhbWJhcyB2YXJpYWJsZXMKCiMjIE1FWAojIyBQcmVkaWNjacOzbiBkZWwgRGVzZW1wZcOxbyBkZSBsYSBJbmR1c3RyaWEgQXV0b21vdHJpeiBNRVgKCmBgYHtyfQojZmlsZS5jaG9vc2UoKQpQUkVETVggPC0gcmVhZC5jc3YoIi9Vc2Vycy9jYXJsb3Nnb256YWxlei9EZXNrdG9wL1BSRURJQ0NJT05fTVguY3N2IikKbGlicmFyeShmb3JlY2FzdCkKc3VtbWFyeShQUkVETVgpCmBgYAojIyBMaW1waWV6YSBiYXNlIGRlIGRhdG9zCgpgYGB7cn0KIyBMaW1waWV6YSBkZSBsYSBiYXNlIGRlIGRhdG9zCiMgRWxpbWluYXIgY29sdW1uYXMgaXJyZWxldmFudGVzIApQUkVETVggPC0gc3Vic2V0KFBSRURNWCwgc2VsZWN0ID0gLWMgKCBWZW50YSkpCnN1bW1hcnkoUFJFRE1YKQoKYGBgCgojIyBFbGltaW5hciBOQSdzCmBgYHtyfQpzdW0oaXMubmEoUFJFRE1YKSkKClBSRURNWCA8LSBuYS5vbWl0KFBSRURNWCkKc3VtbWFyeShQUkVETVgpCmBgYAoKYGBge3J9CiMgR3LDoWZpY28gZGUgY29yZWxhY2nDs24KTUVYPC1zdWJzZXQoUFJFRE1YLHNlbGVjdD0tYyhZZWFyLCBNZXMpKQpjb3JycGxvdChjb3IoTUVYKSx0eXBlPSd1cHBlcicsb3JkZXI9J2hjbHVzdCcsYWRkQ29lZi5jb2w9J2JsYWNrJykgCmBgYAoKU2UgcHVlZGUgb2JzZXJ2YXIgY8OzbW8gZXMgcXVlIGVsIGRlc2VtcGxlbyBhZmVjdGEgbmVnYXRpdmFtZW50ZSBhIHRvZGFzIGxhcyB2YXJpYWJsZXMsIGluY2x1eWVuZG8gbGEgZXhwb3J0YWNpw7NuIHkgZWwgdGlwbyBkZSBjYW1iaW8KCiMjIE1vZGVsbyBwcmVkaWN0aXZvCmBgYHtyfQojIE1vZGVsbyBwcmVkaWN0aXZvCnN1bW1hcnkoUFJFRE1YKQpyZWdyZXNpb25fbXgxIDwtIGxtKEV4cG9ydGFjaW9uIH4gVGlwby5kZS5jYW1iaW8gKyBQcm9kdWNjaW9uICsgSW5mbGFjaW9uICsgcG9yY2VudGFqZV9vY3UgKyBwb3JjZW50YWplX2Rlc29jdSArIGNvbmZfY29uc3VtaWRvciwgZGF0YT1QUkVETVgpCnN1bW1hcnkocmVncmVzaW9uX214MSkKYGBgCgoKIyMgTU9ERUxPIDEKYGBge3J9CnN1bW1hcnkoUFJFRE1YKQplZmZlY3RfcGxvdChyZWdyZXNpb25fbXgxLHByZWQ9UHJvZHVjY2lvbixpbnRlcnZhbD1UUlVFKQpgYGAKClNlIG9ic2VydmEgbGEgZnVlcnRlIGNvcnJlbGFjacOzbiBlbnRyZSBtYXlvciBkZW1hbmRhLCBtYXlvciBwcm9kdWNjacOzbgoKIyMgTW9kZWxvIDIKYGBge3J9CnJlZ3Jlc2lvbl9teDIgPC0gbG0oY29uZl9jb25zdW1pZG9yIH4gVGlwby5kZS5jYW1iaW8gKyBJbmZsYWNpb24gKyBwb3JjZW50YWplX29jdSArIHBvcmNlbnRhamVfZGVzb2N1ICsgUHJvZHVjY2lvbiwgZGF0YT1QUkVETVgpCnN1bW1hcnkocmVncmVzaW9uX214MikKYGBgCgpgYGB7cn0Kc3VtbWFyeShQUkVETVgpCmVmZmVjdF9wbG90KHJlZ3Jlc2lvbl9teDIscHJlZD1Qcm9kdWNjaW9uLGludGVydmFsPVRSVUUpCmBgYApUYW50byBlbiBsYSByZWdyZXNpb24gY29tbyBlbiBlbCBwbG90LCBzZXIgb2JzZXJ2YSBxdWUgbGEgcl4yICgrLTIwJSkgbm8gdGllbmUgdW5hIGNvcnJlbGFjacOzbiB0YW4gZnVlcnRlIGVuIGZ1bmNpw7NuIGRlIGxhIGNvbmZpYW56YSBkZWwgY29uc3VtaWRvciB5IGxhIHByb2R1Y2Npw7NuLgoKIyBQUk9Ow5NTVElDTwoKIyMgUHJvbsOzc3RpY28gZGVsIERlc2VtcGXDsW8gZGUgbGEgSW5kdXN0cmlhIEF1dG9tb3RyaXogVVNBCgpgYGB7cn0KI2ZpbGUuY2hvb3NlKCkKcHJvbm9zVVNBIDwtIHJlYWQuY3N2KCIvVXNlcnMvY2FybG9zZ29uemFsZXovRGVza3RvcC9Qcm9ub3NpY29fUHJvZHVjY2lvbl9kZV9hdXRvc19VU0EuY3N2IikKbGlicmFyeShmb3JlY2FzdCkKc3VtbWFyeShwcm9ub3NVU0EpCmBgYAoKUHJpbmNpcGFsbWVudGUsIGN1w6FsZXMgc29uIGxhcyB2YXJpYWJsZXMgZXhwbGFuYXRvcmlhcyBxdWUgbXVlc3RyYW4gdW4KaW1wYWN0byBzaWduaWZpY2F0aXZvIGVuIGxhIHZhcmlhYmxlIGRlcGVuZGllbnRlPyBDw7NtbyBlcyBlbCBpbXBhY3RvIGRlCmRpY2hhcyB2YXJpYWJsZXMgZXhwbGFuYXRvcmlhcyBzb2JyZSBsYSB2YXJpYWJsZSBkZXBlbmRpZW50ZT8KCmBgYHtyfQpwMSA8LSB0cyhkYXRhID0gcHJvbm9zVVNBJFVuaWRhZGVzLCBzdGFydCA9IGMoMjAxNiksIGZyZXF1ZW5jeSA9IDEpCm1vZGVsbyA8LSBhdXRvLmFyaW1hKHAxKQptb2RlbG8KcHJvbm9zVVNBIDwtIGZvcmVjYXN0KG1vZGVsbywgbGV2ZWw9Yyg5NSksIGg9MykKcHJvbm9zVVNBCnBsb3QocHJvbm9zVVNBLG1haW49IlByb25vc3RpY28gZGUgcHJvZHVjY2nDs24gZGUgYXV0byBlbiBFc3RhZG9zIFVuaWRvcyIsIHlsYWI9IlByb2R1Y2Npw7NuIGVuIFVTQSIpCmBgYAoKSW50ZXJwcmV0YWNpw7NuCkRlIGFjdWVyZG8gY29uIGVsIGFuYWxpc2lzIHByb25vc3RpY2Fkbywgc2UgcHVlZGUgc3VzdGVudGFyIHF1ZSBsYSBwcm9kdWNjacOzbiBkZSBhdXRvcyBlbiBlc3RhZG9zIHVuaWRvcyBleHBlcmltZW50YXLDoSB1bmEgY29udHJhY2Npw7NuIG8gY29tcG9ydGFtaWVudG8gYmFqaXN0YSBkdXJhbnRlIGxvcyBzaWd1aWVudGVzIDMgYcOxb3MuIEVzdG8gZXMgYWxnbyBpbXBlcmF0aXZvIGEgY29uc2lkZXJhciwgeWEgcXVlIEZvcm0sIGVuIGVsIGNvbnRleHRvIGludGVybmFjaW9uYWwgdGllbmUgYSBVU0EgY29tbyB1bm8gZGUgbG9zIHByY2luY2lwYWxlcyBjbGllbnRlcyAobWFyY2FzIGRlIGF1dG9zKSB5IHBvciBjb25zaWd1aWVudGUsIGVuIGVzdGUgY2FzbyB5IGRhZG8gZWwgcHJvbm9zdGljbywgc2UgcmVjb21lbmRhcsOtYSBxdWUgbGEgZW1wcmVzYSBjb21lbnphcmEgYSB2b2x0ZWFyIGEgdmVyIG90cmFzIGluZHVzdHJpYXMgYSBsbyBtZW5vcyBlbiBlbCBjb250ZXh0byBtYWNybyBkZSBlc3RhZG9zIHVuaWRvcy4gCgojIyBQcm9uw7NzdGljbyBkZWwgRGVzZW1wZcOxbyBkZSBsYSBJbmR1c3RyaWEgQXV0b21vdHJpeiBNRVgKCmBgYHtyfQojZmlsZS5jaG9vc2UoKQpwcm9ub3NNRVggPC0gcmVhZC5jc3YoIi9Vc2Vycy9jYXJsb3Nnb256YWxlei9EZXNrdG9wL1Byb2R1Y2Npb25fYXV0b3NfTVhfMjAxNl8yMDIyLmNzdiIpCmxpYnJhcnkoZm9yZWNhc3QpCiNpbnN0YWxsLnBhY2thZ2VzKCJmb3JlY2FzdCIpCmBgYAoKCmBgYHtyfQpzdW1tYXJ5KHByb25vc01FWCkKcDEgPC0gdHMoZGF0YSA9IHByb25vc01FWCRVbmlkYWRlcywgc3RhcnQgPSBjKDIwMTYpLCBmcmVxdWVuY3kgPSAxKQptb2RlbG8gPC0gYXV0by5hcmltYShwMSkKbW9kZWxvCnByb25vc01FWCA8LSBmb3JlY2FzdChtb2RlbG8sIGxldmVsPWMoOTUpLCBoPTMpCnByb25vc01FWApwbG90KHByb25vc01FWCxtYWluPSJQcm9ub3N0aWNvIGRlIHByb2R1Y2Npw7NuIGRlIGF1dG8gZW4gTWV4aWNvIiwgeWxhYj0iUHJvZHVjY2nDs24gZW4gTVgiKQpgYGAKSW50ZXJwcmV0YWNpw7NuOgpQYXJhIGVsIGNhc28gZGUgTcOpeGljbywgc2UgdGllbmUgcHJvbm9zdGljYWRvIHF1ZSBxdWUgdHJhcyBlbCAyMDIxLCBzZSB0cmF0YXJhIGRlIHVuIGNvbXBvcnRhbWllbnRvIGFsY2lzdGEgeSBzZSBtYW50ZW5nYSBkdXJhbnRlIGxvcyBzaWd1aWVudGVzIDMgYcOxb3MuIFBvciBsbyB0YW50bywgc2UgcHVlZGUgc3VzdGVudGFyIHF1ZSBjb250aW51YXIgb24gZXN0YSBsaW5lYSBkZSBuZWdvY2lvIGVuIG1leGljbyBlcyB2aWFibGUgeSBlbiB0b2RvIGNhc28gc29zdGVuaWJsZSBlbiBlbCBtZWRpYW5vIC0gbGFyZ28gcGxhem8uIAoKCiMgUHJvbm9zdGljbyBGT1JNCgojIyBCQUUgREFUT1MgRk9STSB8IE1lcm1hCmBgYHtyfQojZmlsZS5jaG9vc2UoKQptZXIgPC0gcmVhZC5jc3YoIi9Vc2Vycy9jYXJsb3Nnb256YWxlei9EZXNrdG9wL0ZPUk0gLSBNZXJtYTEuY3N2IikKc3VtbWFyeShtZXIpCmBgYAoKIyBQcm9uw7NzdGljbyAKYGBge3J9CmEzIDwtIHRzKGRhdGEgPSBtZXIkS2lsb3MsIHN0YXJ0ID0gYygyMDIyLDEpLCBmcmVxdWVuY3kgPSAxMikKbW9kZWxvX3Byb25fbWVybWEgPC0gYXV0by5hcmltYShhMykKbW9kZWxvX3Byb25fbWVybWEKZm9yZWNhc3RfbWVybWEgPC0gZm9yZWNhc3QobW9kZWxvX3Byb25fbWVybWEsIGxldmVsPWMoOTUpLCBoPTMpCmZvcmVjYXN0X21lcm1hCnBsb3QoZm9yZWNhc3RfbWVybWEpCmBgYAoKRW4gZXN0ZSBjYXNvLCBzZSBwdWVkZSBvYnNlcnZhciBlbCBwcm9uw7NzdGljbyBkZSBsYSBwcm9kdWNjacOzbiBkZSBtZXJtYSBlbiBGb3JtLCBkb25kZSBzaSBiaWVuIHR1dm8gdW5hIGNhaWRhIHByb251bmNpYWRhLCBzZSBlc3BlcmEgcXVlIHNlIHJlY3VwZXJlIGEgdW4gcHVudG8gZXN0YWJsZSBwb3IgbG8gcHJveGltb3MgMyBwZXJpb2Rvcy9hw7FvcwoKIyMgQkFTRSBGT1JNIHwgUHJvZHVjY2nDs24KYGBge3J9CiNmaWxlLmNob29zZSgpClBST0QgPC0gcmVhZC5jc3YoIi9Vc2Vycy9jYXJsb3Nnb256YWxlei9EZXNrdG9wL3Byb2R1Y2Npb24uY3N2IikKc3VtbWFyeShQUk9EKQpgYGAKCgpgYGB7cn0KUFJPRCRwaWV6YXNfcHJvZyA8LSBhcy5udW1lcmljKFBST0QkcGllemFzX3Byb2cpCnN0cihQUk9EKQoKUFJPRCRmZWNoYSA8LSBhcy5EYXRlKFBST0QkZmVjaGEsIGZvcm1hdCA9ICIlZCVtJVkiKQoKYTQgPC0gdHMoZGF0YSA9IFBST0QkcGllemFzX3Byb2csIHN0YXJ0ID0gYygyMDIyLDEpLCBmcmVxdWVuY3kgPSAxMikKbW9kZWxvUFJPRCA8LSBhdXRvLmFyaW1hKGE0KQptb2RlbG9QUk9ECmZvcmVjYXN0UHJvZCA8LSBmb3JlY2FzdChtb2RlbG9QUk9ELCBsZXZlbD1jKDk1KSwgaD0zKQpmb3JlY2FzdFByb2QKcGxvdChmb3JlY2FzdFByb2QpCmBgYAoKUGFyYSBlc3RlIG1vZGVsbywgc2Ugbm90YSBxdWUgbm8gdGllbmUgdW4gcG9yY2VudGFqZSBkZSBjb25maWFiaWxpZGFkIGNlcnRlcm8sIHNpbiBlbWJhcmdvIGNvbiBiYXNlIGEgbG9zIGRhdG9zIG9idGVuaWRvcywgc2UgaWRlbnRpZmlhIHF1ZSBzaSBiaWVuIGxhIHByb2R1Y2Npw7NuIGhhIHRlbmlkbyB1bm9zIHBpY29zIG1vbWVudGFuZW9zLCBzZSBlc3BlcmEgcXVlIHNlIG1hbnRlbmdhIGVuIHVuIHB1bnRvIGVzdGFibGUgcG9yIGxvcyBwcm94aW1vcyAzIHBlcmlvZG9zLCB5IHNpIGJpZW4gc2UgbWFudGllbmVuIGVuIG5pdmVsZXMgYmFqb3MsIHNlIHB1ZWRlIGNvbXBhcmFyIGNvbiBwZXJpb2RvcyBhbnRlcmlvcmVzIChsYSBtYXlvcsOtYSBkZSBsb3MgcGVyaW9kb3MpIGRvbmRlIHBhcmVjZSBzZXIgcXVlIGVzIGVsIHB1bnRvIGRlIGVxdWlsaWJyaW8gZW4gbG8gcXVlIHJlc3BlY3RhIGxhIGNhcGFjaWRhZCBvcGVyYXRpdmEgZGUgRm9ybS4gUG9yIGNvbnNpZ3VpZW50ZSwgc2UgZXNwZXJhIHF1ZSBGb3JtIG1hbnRlbmdhIHN1IG5pdmVsIGRlIHByb2R1Y2Npw7NuIG5vcm1hbCB5IGRlIGZvcm1hIGVzdGFibGUgcG9yIGxvcyBzaWd1aWVudGVzIGHDsW9zLgoKCiMjIEJBU0UgRk9STSB8IFNjcmFwCmBgYHtyfQojZmlsZS5jaG9vc2UoKQpzY3JhcCA8LSByZWFkLmNzdigiL1VzZXJzL2Nhcmxvc2dvbnphbGV6L0Rlc2t0b3AvRk9STSBfU2NyYXBfRXYyX05vX0xpbXBpYS5jc3YiKQpzdW1tYXJ5KHNjcmFwKQpgYGAKCmBgYHtyfQpzY3JhcCRDYW50aWRhZCA8LSBhcy5udW1lcmljKHNjcmFwJENhbnRpZGFkKQpzdHIoc2NyYXApCgpzY3JhcCRGZWNoYSA8LSBhcy5EYXRlKHNjcmFwJEZlY2hhLCBmb3JtYXQgPSAiJWQlbSVZIikKCmE0IDwtIHRzKGRhdGEgPSBzY3JhcCRDYW50aWRhZCwgc3RhcnQgPSBjKDIwMjIsMSksIGZyZXF1ZW5jeSA9IDEyKQptb2RlbG9QUk9EIDwtIGF1dG8uYXJpbWEoYTQpCm1vZGVsb1BST0QKZm9yZWNhc3RQcm9kIDwtIGZvcmVjYXN0KG1vZGVsb1BST0QsIGxldmVsPWMoOTUpLCBoPTMpCmZvcmVjYXN0UHJvZApwbG90KGZvcmVjYXN0UHJvZCkKYGBgCkVuIGVzdGUgY2FzbywgYWwgaXIgZGUgbGEgbWFubyBjb24gbWVybWEsIHNlIHNvc3RpZW5lIHF1ZSBzZSBlc3BlcmEgdW4gY29tcG9ydGFtaWVudG8gYmFqaXN0YSBhY3R1YWwsIHBhcmEgcGFzYXIgYSBuaXZlbGVzIG5vcm1hbGVzIHkgZXN0YWJsZXMgZW4gbG9zIGRlbcOhcyBwZXJpb2Rvcy4KCgojIENMVVNURVJJTkcgUkggQkFKQVMKClRvbWFuZG8gZW4gY3VlbnRhIGxvcyBjbHVzdGVycyBxdWUgc2UgZ2VuZXJhcsOhbiBhIGNvbnRpbnVhY2nDs24sc2UgaWRlbnRpZmljYXLDoW4gbG9zIGluc2lnaHRzIGFsIGZpbmFsIGRlbCBlamVyY2ljaW8gY2x1c3RlcmluZyBSSCBiYWphcyBkZSBsYSBtYW5vIGNvbiBsYXMgZGlzdGludGFzIHZpc3VhbGl6YWNpb25lcyBkZXNhcnJvbGxhZGFzIChtZWFuaW5nZnVsbCBpbnNpZ2h0cykKCmBgYHtyfQojZmlsZS5jaG9vc2UoKQpyaCA8LSByZWFkLmNzdigiL1VzZXJzL2Nhcmxvc2dvbnphbGV6L0Rlc2t0b3AvcmVjdXJzb3MuaHVtYW5vcy5iYXNlLmxpbXBpYS5jc3YiKQpgYGAKCmBgYHtyfQojIGRlc2NhcmdhciB5IGxsYW1hciBsaWJyZXLDrWFzCiNpbnN0YWxsLnBhY2thZ2VzKCJ0aWR5dmVyc2UiKQpsaWJyYXJ5KHRpZHl2ZXJzZSkKI2luc3RhbGwucGFja2FnZXMoImZvcmVpZ24iKQojaW5zdGFsbC5wYWNrYWdlcygiZHBseXIiKQpsaWJyYXJ5KGdncGxvdDIpCiNpbnN0YWxsLnBhY2thZ2VzKCJwc3ljaCIpCmxpYnJhcnkocHN5Y2gpCiNpbnN0YWxsLnBhY2thZ2VzKCJjb3JycGxvdCIpCmxpYnJhcnkoY29ycnBsb3QpCiNpbnN0YWxsLnBhY2thZ2VzKCJqdG9vbHMiKQpsaWJyYXJ5KGp0b29scykKI2luc3RhbGwucGFja2FnZXMoImxtdGVzdCIpCmxpYnJhcnkobG10ZXN0KQojaW5zdGFsbC5wYWNrYWdlcygiY2FyIikKbGlicmFyeShjYXIpCiNpbnN0YWxsLnBhY2thZ2VzKCJmYWN0b2V4dHJhIikKbGlicmFyeShmYWN0b2V4dHJhKQojaW5zdGFsbC5wYWNrYWdlcygiamFuaXRvciIpCmxpYnJhcnkoamFuaXRvcikKI2luc3RhbGwucGFja2FnZXMoInJlYWRyIikKbGlicmFyeShyZWFkcikKI2luc3RhbGwucGFja2FnZXMoInBsb3RyaXgiKQpsaWJyYXJ5KHBsb3RyaXgpCmBgYAoKCmBgYHtyfQojIExpbXBpYXIgbm9tYnJlCnJoMSA8LSBjbGVhbl9uYW1lcyhyaCkKIyBWaXN1YWxpemFyIGJhc2UgZGUgZGF0b3MKc3VtbWFyeShyaDEpCmBgYAoKCmBgYHtyfQpyaDIgPC0gc3Vic2V0KHJoMSxzZWxlY3QgPSAtYyAoYXBlbGxpZG9zLCBub21icmUsIGZlY2hhX2RlX25hY2ltaWVudG8sIHJmYywgZmVjaGFfZGVfYWx0YSwgYmFqYSwgZGVwYXJ0YW1lbnRvLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vX3NlZ3Vyb19zb2NpYWwsIGZhY3Rvcl9jcmVkX2luZm9uYXZpdCwgbl9jcmVkaXRvX2luZm9uYXZpdCwgbHVnYXJfZGVfbmFjaW1pZW50bywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnAsIGNhbGxlLCBudW1lcm9faW50ZXJubywgY29sb25pYSwgY29kaWdvX3Bvc3RhbCwgbXVuaWNpcGlvLCBlc3RhZG8pKQpzdW1tYXJ5KHJoMikKYGBgCgoKYGBge3J9CnN1bShpcy5uYShyaDIpKQpgYGAKCmBgYHtyfQpzYXBwbHkocmgyLCBmdW5jdGlvbih4KSBzdW0oaXMubmEoeCkpKQpgYGAKYGBge3J9CnJoMiRlZGFkIDwtIGFzLm51bWVyaWMocmgyJGVkYWQpCnJoMiRnZW5lcm8gPC0gYXMuZmFjdG9yKHJoMiRnZW5lcm8pCnJoMiRtb3Rpdm9fZGVfYmFqYSA8LSBhcy5mYWN0b3IocmgyJG1vdGl2b19kZV9iYWphKQpyaDIkZGlhc19sYWJvcmFkb3MgPC0gYXMubnVtZXJpYyhyaDIkZGlhc19sYWJvcmFkb3MpCnJoMiRwdWVzdG8gPC0gYXMuZmFjdG9yKHJoMiRwdWVzdG8pCnJoMiRzYWxhcmlvX2RpYXJpb19pbXNzIDwtIGFzLm51bWVyaWMocmgyJHNhbGFyaW9fZGlhcmlvX2ltc3MpCnJoMiRlc3RhZG9fY2l2aWwgPC0gYXMuZmFjdG9yKHJoMiRlc3RhZG9fY2l2aWwpCnN1bW1hcnkocmgyKQpgYGAKCgoKYGBge3J9CnJoX2VkYWRfZGlhcyA8LXJoMiAlPiUgc2VsZWN0KHNhbGFyaW9fZGlhcmlvX2ltc3MsIGVkYWQsIGRpYXNfbGFib3JhZG9zKQpyaF9lZGFkX2RpYXNfbm9ybTwtc2NhbGUocmhfZWRhZF9kaWFzWzI6M10pIApwbG90KHJoX2VkYWRfZGlhc19ub3JtKQpgYGAKCgpgYGB7cn0KZnZpel9uYmNsdXN0KHJoX2VkYWRfZGlhc19ub3JtLCBrbWVhbnMsIG1ldGhvZD0id3NzIikrIAogIGdlb21fdmxpbmUoeGludGVyY2VwdD02LCBsaW5ldHlwZT0yKSsgICAgICAgICAgIAogIGxhYnMoc3VidGl0bGUgPSAiRWxib3cgbWV0aG9kIikgIApgYGAKCgpgYGB7cn0KY2x1c3RlcjEgPC1rbWVhbnMocmhfZWRhZF9kaWFzX25vcm0sNSkKY2x1c3RlcjEKYGBgCgoKYGBge3J9CmZ2aXpfY2x1c3RlcihjbHVzdGVyMSxkYXRhPXJoX2VkYWRfZGlhc19ub3JtKQpgYGAKCmBgYHtyfQpyaF9lZGFkX3NhbCA8LXJoMiAlPiUgc2VsZWN0KHNhbGFyaW9fZGlhcmlvX2ltc3MsIGVkYWQsIGRpYXNfbGFib3JhZG9zKQpyaF9lZGFkX3NhbF9ub3JtPC1zY2FsZShyaF9lZGFkX2RpYXNbMToyXSkgCnBsb3QocmhfZWRhZF9zYWxfbm9ybSkKYGBgCmBgYHtyfQpmdml6X25iY2x1c3QocmhfZWRhZF9zYWxfbm9ybSwga21lYW5zLCBtZXRob2Q9IndzcyIpKyAKICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQ9NSwgbGluZXR5cGU9MikrICAgICAgICAgICAKICBsYWJzKHN1YnRpdGxlID0gIkVsYm93IG1ldGhvZCIpIApgYGAKCmBgYHtyfQpjbHVzdGVyMiA8LWttZWFucyhyaF9lZGFkX3NhbF9ub3JtLDUpCmNsdXN0ZXIyCmBgYApgYGB7cn0KZnZpel9jbHVzdGVyKGNsdXN0ZXIyLGRhdGE9cmhfZWRhZF9zYWxfbm9ybSkKYGBgCgoKYGBge3J9CnJoX2RpYXNfc2FsIDwtcmgyICU+JSBzZWxlY3Qoc2FsYXJpb19kaWFyaW9faW1zcywgZGlhc19sYWJvcmFkb3MsIGVkYWQpCnJoX2RpYXNfc2FsX25vcm08LXNjYWxlKHJoX2RpYXNfc2FsWzE6Ml0pIApwbG90KHJoX2RpYXNfc2FsX25vcm0pCmBgYApgYGB7cn0KZnZpel9uYmNsdXN0KHJoX2RpYXNfc2FsX25vcm0sIGttZWFucywgbWV0aG9kPSJ3c3MiKSsgCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0PTUsIGxpbmV0eXBlPTIpKyAgICAgICAgICAgCiAgbGFicyhzdWJ0aXRsZSA9ICJFbGJvdyBtZXRob2QiKSAgCmBgYAoKCmBgYHtyfQpjbHVzdGVyMyA8LWttZWFucyhyaF9kaWFzX3NhbF9ub3JtLDUpCmNsdXN0ZXIzCmBgYAoKCmBgYHtyfQpmdml6X2NsdXN0ZXIoY2x1c3RlcjMsZGF0YT1yaF9kaWFzX3NhbF9ub3JtKQpgYGAKCmBgYHtyfQpyaDMgPC0gcmgyCnJoMyRDbHVzdGVyczwtY2x1c3RlcjIkY2x1c3RlcgpgYGAKCgpgYGB7cn0Kcmg0IDwtIHJoMyAlPiUgZ3JvdXBfYnkoQ2x1c3RlcnMpICU+JSBzdW1tYXJpc2UoZWRhZD1tYXgoZWRhZCkpICU+JSBhcnJhbmdlKGRlc2MoZWRhZCkpCgojIE5vbWJyYXIgY2FkYSBjbHVzdGVyIApyaDMkbm9tYnJlc19jbHVzdGVycyA8LSBmYWN0b3IocmgzJENsdXN0ZXJzLGxldmVscyA9IGMoMSwyLDMsNCw1KSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVscz1jKCJFeGNlcGNpb24iLCAiSnViaWxhZG9zIiwgIk1heW9yZXMiLCAiQWR1bHRvcyIsICJKb3ZlbmVzIikpCmBgYAoKCmBgYHtyfQojIEFncnVwYXIgbG9zIGRhdG9zIHBvciBub21icmUgZGUgY2x1c3RlcnMgCmxpYnJhcnkoZHBseXIpCiNpbnN0YWxsLnBhY2thZ2VzKCJkcGx5ciIpCmBgYAoKCmBgYHtyfQoKcmg1IDwtIHJoMyAlPiUgZ3JvdXBfYnkobm9tYnJlc19jbHVzdGVycykgJT4lIGRwbHlyOjpzdW1tYXJpemUoZWRhZF9hw7Fvcz1tYXgoZWRhZCksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbGFyaW9faW1zcz1tZWFuKHNhbGFyaW9fZGlhcmlvX2ltc3MpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvdW50PW4oKSkKCmBgYAoKYGBge3J9CmNsdXN0ZXJzPC1hcy5kYXRhLmZyYW1lKHJoNSkKY2x1c3RlcnMKYGBgCgojIEdyw6FmaWNvcyBwYXJhIGlkZW50aWZpY2FjacOzbiBkZSBpbnNpZ2h0cwoKIyMgSWRlbnRpZmljYXIgbnVtZXJvIGRlIGJhamFzIGVuIGZ1bmNpw7NuIGNvbiBsYSBlZGFkIG1lZGlhbnRlIGVsIGNsdXN0ZXIgcHJldmlvIApgYGB7cn0KZ2dwbG90KHJoNSxhZXMoeD1yZW9yZGVyKG5vbWJyZXNfY2x1c3RlcnMsQ291bnQpLHk9Q291bnQsZmlsbD1ub21icmVzX2NsdXN0ZXJzKSkgKwogIGdlb21fYmFyKHN0YXQ9ImlkZW50aXR5IikKYGBgCkVuIGVzdGUgY2FzbywgZWwgbnVtZXJvIGRlIGJhamFzIGVzdMOhIHJlbGFjaW9uYWRvIGNvbiBsYSBlZGFkLCB5YSBxdWUgY29tbyBzZSBvYnNlcnZhIGVuIGVsIGdyw6FmaWNvLCBsb3Mgam92ZW5lcyBzb24gcXVpZW5lcyBnZW5lcmFuIGVsIG1heW9yIG51bWVybyBkZSBiYWphcywgc2VndWlkbyBkZSBhZHVsdG9zLCBhZHVsdG9zIG1heW9yZXMgeSBqdWJpbGFkb3MuIENvbiBlc3RvIHNlIHB1ZWRlIGluZmVyaXIgcXVlIGxhcyBwZXJzb25hcyB0aWVuZW4gcmVzcG9uc2FiaWxpZGFkZXMgZmFtaWxpYXJlcyB5L28gcGVyc29uYWxlcyBxdWUgZGViZW4gYXRlbmRlciB5IHBvciBjb25zaWd1aWVudGUsIHBhcmEgb2J0ZW5lciB1biBzYWxhcmlvIHF1ZSBhcG9ydGUgYSBjdWJyaXIgc3VzIG5lY2VzaWRhZGVzLCBlbnRyZSBtYXlvciBlcyBsYSBwZXJzb25hLCBtZW5vciBlcyBsYSBwcm9iYWJpbGlkYWQgZGUgdGVybWluYXIgZWwgY29udHJhdG8gY29uIEZPUk0uCgpJZGVudGlmaWNhY2nDs24gZGVsIG1heGltbyBkZSBlZGFkIHBvciBncnVwbyAKYGBge3J9CmdncGxvdChyaDUsIGFlcyh4PW5vbWJyZXNfY2x1c3RlcnMseT1lZGFkX2HDsW9zLGZpbGw9IG5vbWJyZXNfY2x1c3RlcnMsbGFiZWw9cm91bmQoZWRhZF9hw7FvcyxkaWdpdHM9MikpKSArIAogIGdlb21fY29sKCkgKyAKICBnZW9tX3RleHQoKQpgYGAKTWVkaWFudGUgZXN0ZSBncsOhZmljbyBzZSBwdWVkZW4gZXN0YWJsZWNlciBsb3MgcGVyZmlsZXMgY29uIHJhbmdvcyBtYXhpbW9zIGRlIGVkYWQgZGUgbG9zIGNvbGFib3JhZG9yZXMsIHBvciBsbyBxdWUgc3VyZ2UgdW5hIG9wb3J0dW5pZGFkIGRlIEZvcm0gcGFyYSBpZGVudGlmaWNhciBsYXMgbmVjZXNpZGFkZXMgZGUgbG9zIGRpc3RpbnRvcyBncnVwb3MgZGUgZWRhZC4gCgoKIyMjIEdyw6FmaWNvIGRlIGdlbmVyb3MgZGUgcGVyc29uYXMgcXVpZW5lcyBzZSBkaWVyb24gZGUgYmFqYSAKYGBge3J9CmxpYnJhcnkoZ2dwbG90MikKZ2dwbG90KHJoMywgYWVzKGZpbGw9Z2VuZXJvLCB5PWdlbmVybywgeD1ub21icmVzX2NsdXN0ZXJzKSkgKyAKICBnZW9tX2Jhcihwb3NpdGlvbj0ic3RhY2siLCBzdGF0PSJpZGVudGl0eSIpIApgYGAKCkNvbW8gc2UgcHVlZGUgb2JzZXJ2YXIgZW4gZWwgZ3LDoWZpY28sIHNlIHRpZW5lIHF1ZSBlbiBkZWZpbml0aXZhIGxvcyBob21icmVzIHNvbiBxdWllbmVzIHNlIGRhbiBkZSBiYWphIGVuIHRvZG9zIGxvcyBncnVwb3MgZGUgZWRhZGVzCgojIyBSYXpvbmVzIGRlIGJhamEgcG9yIGdydXBvcyBkZSBlZGFkCmBgYHtyfQojc3VtbWFyeShyaDMpCmdncGxvdChyaDMsIGFlcyhmYWN0b3Iobm9tYnJlc19jbHVzdGVycyksIGZpbGwgPSBmYWN0b3IobW90aXZvX2RlX2JhamEpKSkgKwogIGdlb21fYmFyKHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2UyKHByZXNlcnZlID0gInNpbmdsZSIpKQpgYGAKRGFkYSBsYSBncsOhZmljYSBhbnRlcmlvciwgc2UgcHVlZGUgaWRlbnRpZmljYXIgcXVlIGxhIG1heW9yIHJhesOzbiBwb3IgbGEgY3VhbCBsb3MgY29sYWJvcmFkb3JlcyBzZSB2YW4gZGUgbGEgZW1wcmVzYSBlcyBkZWJpZG8gYSBsYSBiYWphIHBvciBmYWx0YXMsIG1pZW50cmFzIHF1ZSB1biBkYXRvIGltcG9ydGFudGUgZXMgcXVlIGxhIHJhesOzbiBkZSBhYmFuZG9ubyBtZW5vcyBjb23Dum4gc29sbyBzZSBlbmN1ZW50cmEgcHJlc2VudGUgZW4gbG9zIGdydXBvcyBkZSBqb3ZlbmVzIHkganViaWxhZG9zLCBxdWllbmVzIHBvciBpbmZlcmVuY2lhIHNlIHB1ZWRlIHN1c3RlbnRhciBxdWUgZXMgZGViaWRvIGEgbGFzIHJlc3BvbnNhYmlsaWRhZGVzIGRlIGVzdG9zIGdydXBvcyBkZSBlZGFkLiBFbiBvY2FzaW9uZXMsIGNvbW8gbG8gbWVuY2lvbsOzIGVsIGR1ZcOxbyBkZSBsYSBlbXByZXNhLCBsb3Mgam92ZW5lcyBzb2xvIGVzdMOhbiBwb2NvIHRpZW1wbyBwYXJhIGFob3JyYXIgZW4gcGVyaW9kb3MgY29ydG9zLCBtaWVudHJhcyBxdWUgbG9zIGp1YmlsYWRvcyBhbCBlc3RhciBlbiBlc3RhIGV0YXBhLCBzaW1wbGVtZW50ZSBkZWphbiBkZSB2ZW5pciBhIGxhIGVtcHJlc2EuIAoKYGBge3J9CmxpYnJhcnkocGxvdHJpeCkKbGlicmFyeShqdG9vbHMpCnByb3BvcmNpb25lcyA8LSBjKDE3NiwgMTEsIDExLCA4LCAyNikKZXRpIDwtIGMoImF5dWRhbnRlIGdlbmVyYWwiLCAiYXl1LiBzb2xkYWRvci9zb2xkYWRvciIsICJjb3N0dXJlcmEiLCAiYXl1LiBlbWJhcnF1ZSIsICJvdHJvcyIgKQpwY3QgPC0gcm91bmQocHJvcG9yY2lvbmVzL3N1bShwcm9wb3JjaW9uZXMpKjEwMCkKZXRpIDwtIHBhc3RlKGV0aSwgcGN0KQpldGkgPC0gcGFzdGUoZXRpLCIlIixzZXA9IiIpCnBpZTNEKHByb3BvcmNpb25lcyxsYWJlbHMgPSBldGksCiAgICBjb2w9cmFpbmJvdyhsZW5ndGgoZXRpKSksCiAgICBtYWluPSJQdWVzdG9zIGRlIGJhamFzIikKYGBgCkVuIGVzdGUgY2Fzbywgc2UgcHVlZGUgc3VzdGVudGFyIHF1ZSBsYSBtYXlvcsOtYSBkZSBsb3MgcHVlc3RvcyBxdWUgc2UgZGFuIGRlIGJhamEgZGUgbGEgZW1wcmVzYSBzb24gbG9zIGRlIGF5dWRhbnRlIGdlbmVyYWw7IHNpbiBlbWJhcmdvIHkgZGUgaWd1YWwgZm9ybWEsIHNlIHNvc3RpZW5lIGxhIHJhesOzbiBkZSBxdWUgYWwgc2VyIGVsIHB1ZXN0byBjb24gbWF5b3IgbnVtZXJvIGRlIGNvbGFib3JhZG9yZXMsIG5hdHVyYWxtZW50ZSBzZSB0ZW5nYSB1biBjZXNnbyBxdWUgZ2VuZXJlIGVsIHZlcmRhZGVybyBwdWVzdG8sIHNpbiBlbWJhcmdvLCBhbCBzZXIgdW4gcHVlc3RvIHByb3BvcmNpb25hbCB5IG9iamV0aXZhbWVudGUgY29uIG3DoXMgY29sYWJvcmFkb3JlcyAoYWRlbcOhcyBkZSBxdWUgYWwgc2VyIGF5dWRhbnRlIGdlbmVyYWwsIHNlIGluZmllcmUgcXVlIG5vIHJlcXVpZXJlIGRlIGVudHJlbmFtaWVudG8gcHJldmlvKSB0aWVuZSBzZW50aWRvIHZhbGlkYXIgcXVlIGxhIGluZGVwZW5kaWVudGVtZW50ZSBkZWwgc2VzZ28gbWVuY2lvbmFkbywgZWwgYXl1ZGFudGUgZ2VuZXJhbCBlcyBxdWllbiBtw6FzIGFiYW5kb25hIGxhIGVtcHJlc2EuCgoKRXN0YWRvIGNpdmlsIGRlIGJhamFzCmBgYHtyfQojaW5zdGFsbC5wYWNrYWdlcygicGxvdHJpeCIpCmxpYnJhcnkocGxvdHJpeCkKcHJvcG9yY2lvbmVzMSA8LSBjKDEwNywgMywgNTksIDYzKQpldGlxdWV0YXMgPC0gYygic29sdGVybyIsICJkaXZvcmNpbyIsICJ1bmlvbiBsaWJyZSIsICJtYXRyaW1vbmlvIikKcGN0IDwtIHJvdW5kKHByb3BvcmNpb25lczEvc3VtKHByb3BvcmNpb25lczEpKjEwMCkKZXRpcXVldGFzIDwtIHBhc3RlKGV0aXF1ZXRhcywgcGN0KQpldGlxdWV0YXMgPC0gcGFzdGUoZXRpcXVldGFzLCIlIixzZXA9IiIpCnBpZTNEKHByb3BvcmNpb25lczEsbGFiZWxzID0gZXRpcXVldGFzLAogICAgICBjb2w9cmFpbmJvdyhsZW5ndGgoZXRpcXVldGFzKSksCiAgICAgIG1haW49IkVzdGFkbyBjaXZpbCBkZSBiYWphcyIpCmBgYAoKCkVuIHBvY2FzIHBhbGFicmFzLCBlcyBldmlkZW50ZSBxdWUgbG9zIHNvbHRlcm9zIHNvbiBxdWllbmVzIHNlIGRhbiBtw6FzIGRlIGJhamEgZGUgbGEgZW1wcmVzYSwgeWEgcXVlIGFsIGVzdGFyIGVuIGVzdGEgcG9zaWNpw7NuIHkgcHJvYmFibGVtZW50ZSBzZXIgam92ZW5lcywgbm8gY2FyZ2FuIGNvbiB1bmEgcmVzcG9uc2FiaWxpZGFkIGZhbWlsaWFyLiBQb3IgbGFkbyBjb250cmFyaW8sIGVsIGdydXBvIGRlIGRpdm9yc2lhZG9zIHNvbiBxdWllbmVzIG1lbm9zIHNlIGRhbiBkZSBiYWphLCB5YSBxdWUgc2kgYmllbiBzZSBjb25zaWRlcmEgcXVlIG5vIGVzIHVuIGdydXBvIGdyYW5kZSBkZSBwZXJzb25hcywgc29uIHF1aWVuZXMgYWhvcmEgdGllbmVuIHJlc3BvbnNhYmlsaWRhZCBkZSBwcm92ZWVyIHBvciBzdXMgZGVwZW5kaWVudGVzIG8gcG9yIGVsbG9zL2VsbGFzIG1pc21vcy4KCiMgTWVhbmluZ2Z1bGwgaW5zaWdodHMKCjEuIEVudHJlIG1lbm9yIGVzIGxhIGVkYWQsIGV4aXN0ZSBtYXlvciBwcm9iYWJpbGlkYWQgZGUgcXVlIHNlIGRlbiBkZSBiYWphIAoyLiBMb3MgaG9tYnJlcyBzb24gbcOhcyBwcm9wZW5zb3MgYSBkYXJzZSBkZSBiYWphIGRlIGxhIGVtcHJlc2EsIGxvIGN1YWwgc2UgcHVlZGUgY29ycmVsYWNpb25hciBjb24gZWwgcGVyZmlsIGRlIGhvbWJyZSBqb3ZlbiwgcXVpZW4gdGllbmUgbWF5b3IgcHJvYmFiaWxpZGFkIGRlIGlyc2UgZGUgbGEgZW1wcmVzYS4KMy4gRWwgZ3J1cG8gZGUgZXN0YWRvIGNpdmlsIGRpdm9yc2lhZG8gc3VzdGVudGEgZWwgNDYlIGRlIGxhcyBiYWphcyBkZSBsYSBlbXByZXNhCjQuIENvbiBsYSBpbmZvcm1hY2nDs24gYW50ZXJpb3IsIHNlIHB1ZWRlIGdlbmVyYXIgdW4gcGVyZmlsIGRlIHVuYSBwZXJzb25hIGNvbiBtYXlvciBwcm9iYWJpbGlkYWQgZGUgZGF0c2UgZGUgYmFqYSwgZWwgY3VhbCBlcyB1biBob21icmUgam92ZW4gc29sdGVybyBkZSBlbnRyZSAxOSAtIDI2IGHDsW9zIGNvbiBlbCBwdWVzdG8gZGUgYXl1ZGFudGUgZ2VuZXJhbC4gcG9yIGxvIHRhbnRvLCBzZSByZWNvbWVuZGFyw61hIGEgbGEgZW1wcmVzYSBxdWUgc2UgZGVzYXJyb2xsZSB1biBwcm9ncmFtYSBkZSByZXRlbmNpw7NuLCBjb24gbGEgZmluYWxpZGFkIGRlIG5vIHRlbmVyIHJvdGFjacOzbiB0YW4gY29uc3RhbnRlLCBsbyBjdWFsIHB1ZWRlIGluY2x1c28gZ2VuZXJhciBjb3N0b3MgYWRpY2lvbmFsZXMgYSBsYSBlbXByZXNhLgo1LiBDb21vIHNlIG1lbmNpb27DsyBhbnRlcmlvcm1lbnRlLCBsYSBtYXlvcsOtYSBkZSBsb3MgcHVlc3RvcyBxdWUgc2UgZGFuIGRlIGJhamEgZGUgbGEgZW1wcmVzYSBzb24gbG9zIGRlIGF5dWRhbnRlIGdlbmVyYWw7IHNpbiBlbWJhcmdvIHkgZGUgaWd1YWwgZm9ybWEsIHNlIHNvc3RpZW5lIGxhIHJhesOzbiBkZSBxdWUgYWwgc2VyIGVsIHB1ZXN0byBjb24gbWF5b3IgbnVtZXJvIGRlIGNvbGFib3JhZG9yZXMsIG5hdHVyYWxtZW50ZSBzZSB0ZW5nYSB1biBjZXNnbyBxdWUgZ2VuZXJlIGVsIHZlcmRhZGVybyBwdWVzdG8sIHNpbiBlbWJhcmdvLCBhbCBzZXIgdW4gcHVlc3RvIHByb3BvcmNpb25hbCB5IG9iamV0aXZhbWVudGUgY29uIG3DoXMgY29sYWJvcmFkb3JlcyAoYWRlbcOhcyBkZSBxdWUgYWwgc2VyIGF5dWRhbnRlIGdlbmVyYWwsIHNlIGluZmllcmUgcXVlIG5vIHJlcXVpZXJlIGRlIGVudHJlbmFtaWVudG8gcHJldmlvKSB0aWVuZSBzZW50aWRvIHZhbGlkYXIgcXVlIGxhIGluZGVwZW5kaWVudGVtZW50ZSBkZWwgc2VzZ28gbWVuY2lvbmFkbywgZWwgYXl1ZGFudGUgZ2VuZXJhbCBlcyBxdWllbiBtw6FzIGFiYW5kb25hIGxhIGVtcHJlc2EuCgojIEdyw6FmaWNvIHRpcG8gZ2dhbGx1dmlhbApgYGB7cn0Kc3VtbWFyeShyaDMpCmxpYnJhcnkoZ2dhbGx1dmlhbCkKcmhHRyA8LXJoMyAlPiUgZmlsdGVyKENsdXN0ZXJzPT00IHwgQ2x1c3RlcnM9PTMpICU+JSBhcnJhbmdlKENsdXN0ZXJzKQoKZ2dwbG90KGFzLmRhdGEuZnJhbWUocmhHRyksCiAgICAgICBhZXMoeT1zYWxhcmlvX2RpYXJpb19pbXNzLCBheGlzMT0gZ2VuZXJvLCBheGlzMj1lc3RhZG9fY2l2aWwpKSArCiAgZ2VvbV9hbGx1dml1bShhZXMoZmlsbD1ub21icmVzX2NsdXN0ZXJzKSwgd2lkdGggPSAxLzEyKSArCiAgZ2VvbV9zdHJhdHVtKHdpZHRoID0gMS8xMiwgZmlsbCA9ICJibGFjayIsIGNvbG9yID0gImdyZXkiKSArCiAgZ2VvbV9sYWJlbChzdGF0ID0gInN0cmF0dW0iLCBhZXMobGFiZWwgPSBhZnRlcl9zdGF0KHN0cmF0dW0pKSkgKwogIHNjYWxlX3hfZGlzY3JldGUobGltaXRzID0gYygiR8OpbmVybyIsICJFc3RhZG8gY2l2aWwiKSwgZXhwYW5kID0gYyguMDUsIC4wNSkpICsKICBzY2FsZV9maWxsX2JyZXdlcih0eXBlID0gInF1YWwiLCBwYWxldHRlID0gIlNldDEiKSArCiAgZ2d0aXRsZSgiRk9STSdzIFNhbGFyaW8gRGlhcmlvIHBvciBHw6luZXJvIHkgRXN0YWRvIENpdmlsIikKYGBgCgojIyBNZWFuaW5nZnVsbCBpbnNpZ2h0cwpFbiBlc3RlIGNhc28gc2UgcHVlZGUgc3VzdGVudGFyIHF1ZSBlbiBnZW5lcmFsICgxKSBsb3MgZGl2b3JjaWFkb3MgZ2FuYW4gbcOhcy4gICAKUG9yIG90cmEgcGFydGUsIHkgZGUgbWFuZXJhIG3DoXMgZXNwZWNpZmljYSwgKDIpIGxhcyBjb2xhYm9yYWRvcmVzIHF1ZSBnYW5hbiBtw6FzIGVuIGxhIGVtcHJlc2Egc29uIG11amVyZXMgbWF5b3JlcyAoMykgZGl2b3JjaWFkYXMsIG1pZW50cmFzIHF1ZSAoNCkgbGFzIHF1ZSBnYW5hbiBtZW5vcyBzb24gYWR1bHRhcyB5ICg1KSBlc3TDoW4gZW4gdW5pw7NuIGxpYnJlLgpQb3IgcGFydGUgZGVsIHNlZ21lbnRvIG1hc2N1bGlubywgc2UgbXVlc3RyYSBxdWUgKDYpIGVsIHF1ZSBnYW5hIG3DoXMgZXMgdW4gaG9tYnJlIG1heW9yICg3KSBkaXZvcmNpYWRvLCB5ICg4KSBlbCBxdWUgZ2FuYSBtZW5vcyBlc3TDoSBlbiB1bmlvbiBsaWJyZSwgKDkpIHBlcnRlbmVjaWVuZG8gYWwgc2VnbWVudG8gZGUgZWRhZCBhZHVsdGEuCkVuIGNvbmNsdXNpw7NuLCBzZSBzdXN0ZW50YSBxdWUgcG9yIHRlbmRlbmNpYSwgZWwgc2FsYXJpbyBhdW1lbnRhIG8gZGlzbWludXllIGRlcGVuZGllbmRvIGRlbCBnw6luZXJvIHkgZWwgZXN0YWRvIGNpdmlsLgoKCgojIFRyYWJham8gZXNjcml0byAKMSkgQSBwYXJ0aXIgZGVsIGFuw6FsaXNpcyBkZSBsYXMgYmFzZXMgZGUgZGF0b3MgZGUgbGFzIGRpZmVyZW50ZXMgw6FyZWFzIGRlIGxhCmVtcHJlc2EgRk9STSwgaWRlbnRpZmljYXIgeSBkZXNjcmliaXIgbG9zIHByaW5jaXBhbGVzIDYtOCBoYWxsYXpnb3MKKG1lYW5pbmdmdWwgaW5zaWdodHMpLiAgICAKCjEuICBQb3IgcGFydGUgZGVsIHJlY3Vyc28gaHVtYW5vLCBmb3JtIGN1ZW50YSBjb24gdW4gcGVyZmlsIHByb21lZGlvIGRlIGNvbGFib3JhZG9yIGVsIGN1YWwgY29uc2lzdGUgZW4gdW4gaG9tYnJlIGpvdmVuIHkgc29sdGVybyBkZSBlbnRyZSAxOSAtIDI2IGNvbiBlbCBwdWVzdG8gZGUgYXl1ZGFudGUgZ2VuZXJhbC4gYXNpbWlzbW8sIHNlIHN1c3RlbnRhIHF1ZSBkaWNobyBwZXJmaWwsIGFsIHNlciBlbCBtw6FzIGNvbmN1cnJpZG8sIGVzIGVsIHF1ZSB0aWVuZSBtYXlvcmVzIGJhamFzIGRlIGxhIGVtcHJlc2EuICAgIAoKMi4gTGEgcHJvZHVjY2nDs24gZW4gRm9ybSwgZGFkYSBsYSBjcmlzaXMgYXV0b21vdHJpeiAobGEgY3VhbCBzaWd1ZSBlbiByZWN1cGVyYWNpw7NuKSBoYSBkaXNtaW51aWRvLCBzZSBlc3BlcmEgcXVlIGR1cmFudGUgbG9zIHByb3hpbW9zIGHDsW9zIHNlIHJldG9tZSBsYSBwcm9kdWNjacOzbiBhIG5pdmVsZXMgb3BlcmF0aXZvcyBub3JtYWxlcyBqdW50byBjb24gdW4gcGVyaW9kbyBlc3RhYmxlIGRlIGRpY2hhIGFjdGl2aWRhZC4gICAgCgozLiBTaSBiaWVuIGV4aXN0ZSB1bmEgY29ycmVsYWNpw7NuIGVudHJlIGxvcyBuaXZlbGVzIGRlIHByb2R1Y2Npw7NuIHkgbGEgbWVybWE7IGVzdGEgc2VndW5kYSDDoXJlYSBzZSBlc3BlcmEgcXVlIGRlIGlndWFsbWVudGUgcmVjdXBlcmUgc3VzIG5pdmVsZXMgYmFqb3MgcGFyYSBwYXNhciBhIHVuIHBlcmlvZG8gZXN0YWJsZSB5IGNvbnN0YW50ZSBkdXJhbnRlIGxvcyBwcm94aW1vcyBhw7FvcywgbG8gY3VhbCBkZWphIGx1Z2FyIGEgdW5hIGFyZWEgZGUgb3BvcnR1bmlkYWQgYSBhdGVuZGVyIGRlIGhhbGxhciBudWV2YXMgbWFuZXJhcyBkZSBhcHJvdmVjaGFyIGxvcyBkZXNwZXJkaWNpb3MgcGFyYSBjcmVhciB1bmEgZWNvbm9tw61hIGNpcmN1bGFyIGludGVybmEsIG8gYmllbiB1bmEgZW50cmFkYSBhZGljaW9uYWwgZGUgaW5ncmVzb3MgcGFyYSBsYSBlbXByZXNhLiAgCgo0LiBDb21vIHNlIHB1ZG8gb2JzZXJ2YXIsIHNlIHByb25vc3RpY2EgcXVlIGxhIHByb2R1Y2Npw7NuIGRlIGF1dG9zIGVuIGVzdGFkb3MgdW5pZG9zIHN1ZnJhIGRlIHVuIGNvbXBvcnRhbWllbnRvIGJham9zdGEgZHVyYW50ZSBsb3MgcHJveGltb3MgMyBhw7FvczsgYSBkaWZlcmVuY2lhIGRlIG3DqXhpY28gZWwgY3VhbCBwb3IgZWwgY29udHJhcmlvIHNlIHByb25vc3RpY2EgdW4gYXVtZW50byBlbiBsYSBwcm9kdWNjacOzbiBkdXJhbnRlIGxvcyBwcm94aW1vcyBwZXJpb2Rvcy4gRXN0YSBpbmZvcm1hY2nDs24gZXMgZGUgc3VtYSByZWxldmFuY2lhLCB5YSBxdWUgY29tbyBsbyBlc3RhYmxlY2UgRm9ybSBjb24gc3UgZnVlcnRlIHJlbGFjacOzbiBjb24gYXV0b21vdHJpY2VzIEVzdGFkb3VuaWRlbnNlcyB5IGRhZGEgbGEgcHJvbm9zdGljYWRhIGNhaWRhIGRlIGxhIHByb2RpY2Npw7NuIGRlIGVzdGUgcHJvZHVjdG8gZW4gVVNBLCBzZSByZWNvbWVuZGFyw61hIGEgRm9ybSBkZSBpbmRhZ2FyIGEgbnVldmFzIGVudHJhZGFzIGEgaW5kdXN0cmlhcyBkZXNjb25vY2lkYXMgZG9uZGUgcHVlZGFuIGFwb3J0YXIgdmFsb3IgY29uIGxvcyBhY3Rpdm9zIGNvbiBsb3MgcXVlIGN1ZW50YW4gYWN0dWFsbWVudGUuIEVuIHBvY2FzIHBhbGFicmFzLCBzZSBlc3BlcmEgdW4gZGVjbGlldmUgZGUgcHJvZHVjY2nDs24gYXV0b21vdHJpeiBlbiBFRVVVIHkgcG9yIGNvbnNpZ3VpZW50ZSBGb3JtIGRlYmUgY29tZW56YXIgYSBpbnZlc3RpZ2FyIG51ZXZhcyBpbmR1c3RyaWFzIGxhcyBjdWFsZXMgcHVlZGUgZW50cmFyIHBhcmEgZ2FyYW50aXphciBzdSBwb3NpY2lvbmFtaWVudG8gZW4gZWwgbWVyY2FkbyB5IHNvYnJldml2ZW5jaWEuICAKCjUuIFBlcmlvZG9zIGludGVuc2l2b3MgZGUgYWN0aXZpZGFkOiBTZWfDum4gbG9zIGRhdG9zIHByb3BvcmNpb25hZG9zIHkgYW5hbGlzYWRvcywgZXhpc3RlbiBpbnN0YW5jaWFzIGFscmVkZWRvciBkZSB1bmEgdmV6IGNhZGEgY3VhcnRvIGRlbCBhw7FvIGVuIGRvbmRlIGhheSBtYXlvciBkZW1hbmRhIHBvciBwYXJ0ZSBkZSBsb3MgY2xpZW50ZXMsIHJlcXVpZXJpZW5kbyBtYXlvcmVzIHBlZGlkb3M7IGdlbmVyYW5kbyBtw6FzIG1lcm1hIHkgcG9yIGNvbnNpZ3VpZW50ZSB0b2RhIGxhIGxvZ2lzdGljYSBxdWUgZXN0byBjb25sbGV2YSAoc2NyYXApLiBEaWNobyBsbyBhbnRlcmlvciwgc2UgY29uc2lkZXJhIHBlcnRpbmVudGUgcXVlIEZvcm0gaGFsbGUgbnVldmFzIGZ1ZW50ZXMgZGUgaW5ncmVzbyBkdXJhbnRlIGxvcyBtZXNlcyBkZSByZWxhdGl2YSBwb2NhIGFjdGl2aWRhZCBvcGVyYXRpdmEuICAKCjYuIENvbW8gc2Ugb2JzZXJ2w7MgZHVyYW50ZSBlbCBhbsOhbGlzaXMsIEZvcm0gY3VlbnRhIGNvbiB1bmEgYXJlYSBkZSBvcG9ydHVuaWRhZCwgdHJhdGFuZG9zZSBkZSBxdWUgbGEgZW1wcmVzYSBtYW50aWVuZSBzdSBwdW50byBkZSBlcXVpbGlicmlvIG9wZXJhY2lvbmFsIG1pZW50cmFzIG5vIGV4Y2VkYSB1biBudW1lcm8gbWF5b3IgYSAyNSBwZWRpZG9zLiBFc3RvIHNlIHRyYWR1Y2UgYSBxdWUgZXhpc3RlIHVuYSBhcmVhIGRlIG9wb3J0dW5pZGFkIGVuIGxhIGNhcGFjaWRhZCBkZSBwcm9kdWNjacOzbi4gUGFyYSBlc3RvLCB5IGRlIGxhIG1hbm8gY29uIGxvcyBkZW3DoXMgaW5zaWdodHMgZGVsIG1pc21vIGNvbnRleHRvLCB2YWxkcsOtYSBsYSBwZW5hIGV2YWx1YXIgdW5hIGludmVyc2nDs24gYSBhY3Rpdm9zIHF1ZSBwZXJtaXRhbiBhIEZvcm0gdW5hIG1heW9yIGV4cGFuc2nDs24geSBwb3NpY2lvbmFtaWVudG8gZGVudHJvIGRlIHN1IGluZHVzdHJpYS4gRXN0byBjb24gbGEgZmluYWxpZGFkIGRlIGF0ZW5kZXIgYSBtw6FzIGNsaWVudGVzLCBjb24gbWF5b3IgbnVtZXJvIGRlIHVuaWRhZGVzL3BpZXphcyBwb3IgcHJvZHVjdG8gZGUgbWFuZXJhIHNpbXVsdGFuZWEsIGxvIGN1YWwgcmVxdWVyaXLDrWEgZXZlbnR1YWxtZW50ZSB1bmEgc2VyaWUgZGUgaW52ZXJzaW9uIG5vIHNvbG8gZGUgYWN0aXZvcyBmaWpvcywgc2lubyB0YW1iaWVuIGRlIGNhcGl0YWwgaHVtYW5vICh5IHRvZG8gbG8gcXVlIGNvbmxsZXZhIGRpY2hhIHRhcmVhKSBhc8OtIGNvbW8gZGUgbG9nw61zdGljYSwgUiZELCBzaW4gdG9tYXIgZW4gY3VlbnRhIGVsIGluc2lnaHQgYW50ZXJpb3IgZGUgaW52ZXN0aWdhciBudWV2YXMgaW5kdXN0cmlhcyBhIGxhcyBjdWFsZXMgYXRlbmRlci4gICAKCjcuIFJSSEggfCBEYWRvcyBsb3MgZGlzdGludG9zIGFuYWxpc2lzIHJlYWxpemFkb3MgZW4gZXN0ZSBjb250ZXh0bywgc2UgdGllbmUgY29tbyBpbnNpZ2h0IHF1ZSBGb3JtIHRpZW5lIGRpc3RpbnRhcyBjb21iaWFuY2lvbmVzIGRlIHBlcmZpbGVzIGVuIHN1IG9yZ2FuaXphY2nDs24sIHkgc2kgYmllbiBjb21vIHNlIG1lbmNpb27DsyBjb24gYW50ZXJpb3JpZGFkLCBleGlzdGUgdW4gcGVyZmlsIHByb21lZGlvIHF1ZSBjb21iaW5hIGRpc3RpbnRhcyB2YXJpYWJsZXMgKGVkYWQsIGVzdGFkbyBjaXZpbCwgZ2VuZXJvLCBwdWVzdG8sIGV0YykgZXMgaW1wb3J0YW50ZSBxdWUgRm9ybSB0ZW5nYSBiaWVuIGVzdGFibGVjaWRvcyBsb3MgZGlzdGludG9zIHBlcmZpbGVzIGRlIGNsaWVudGUgaW50ZXJubyBwYXJhIHF1ZSBjb24gZWxsbyBwdWVkYSBhZGFwdGFyc2UgeSBhdGVuZGVyIHN1cyBuZWNlc2lkYWRlcyBlbiBjb250ZXh0byBkZSBkZXNhcnJvbGxvIHByb2Zlc2lvbmFsOyBsbyBjdWFsIGV2ZW50dWFsIHkgc2ltdWx0YW5lYW1lbnRlIGZ1bmNpb25hcsOtYSBjb21vIHVuIHB1ZW50ZSBlbiBlbCBjdWFsIHNlIHB1ZWRhbiBkaXNtaW51aXIgbG9zIG5pdmVsZXMgZGUgcm90YWNpw7NuIGEgbml2ZWwgaW5lcm5vLiAKCgoyKSBBIHBhcnRpciBkZWwgYW7DoWxpc2lzIGRlIGxhcyBiYXNlcyBkZSBkYXRvcyBkZSBsYXMgZGlmZXJlbnRlcyDDoXJlYXMgZGUgbGEKZW1wcmVzYSBGT1JNLCBkZXNjcmliaXIgMyBzdWdlcmVuY2lhcyBxdWUgbGUgcGVybWl0YW4gYWwgc29jaW8gZm9ybWFkb3IKbWVqb3JhciBzdSBwcm9jZXNvIGRlIGNhcHR1cmEsIG9yZ2FuaXphY2nDs24sIHkgYW5hbMOtdGljYSBkZSBkYXRvcy4gIAoKU3VnZXJlbmNpYSAxOiBTaSBiaWVuIGVzIHBvY28gcHJvYmFibGUgcXVlIHVuYSBvcmdhbml6YWNpw7NuIGNvbiBlbCB0YW1hw7FvIGRlIEZvcm0gKGNoaWNhLW1lZGlhbmEpIHRlbmdhIGxhIGNhcGFjaWRhZCB5IG1vdGl2YXMgcGFyYSBkZXNhcnJvbGxhciBpbnRlcm5hbWVudGUgc3UgcHJvcGlhIHBsYXRhZm9ybWEgZGUgaW5mb3JtYWNpw7NuLCBzZSBwdWVkZSBzdWdlcmlyIGVuIGludmVydGlyIGVuIHVuIHVuYSBwbGF0YWZvcm1hIHRlcmNpYXJpemFkYSBxdWUgcGVybWl0YSBhIGxhIGVtcHJlc2Egc2lzdGVtYXRpemFyIHkgYXV0b21hdGl6YXIgc3VzIHByb2Nlc29zIGRlIGNhcHR1cmEgeSBvcmdhbml6YWNpw7NuIGRlIGRhdG9zLCBwYXJhIHVuYSBwb3N0ZXJpb3IgYW5hbGl0aWNhIGRlIGxvcyBtaXNtb3MgcXVlIHB1ZWRhIHNlciB2aXN1YWxpemFkYSBwb3IgdG9kYXMgbGFzIMOhcmVhcyBkZSBsYSBlbXByZXNhIHkgb2J0ZW5lciBtYXlvciBwb2RlciBkZSBkZWNpc2nDs24uCgpTdWdlcmVuY2lhIDI6IERhZGEgbGEgZW5yaXF1ZWNlZG9yYSBleHBlcmllbmNpYSBkZSBzb2NpbyBmb3JtYWRvciAtIGFsdW1ubyBJVEVTTSwgZG9uZGUgc2UgcHVkbyBkYXIgYSBjdWVudGEgZGUgcXVlIGxhcyBiYXNlcyBkZSBkYXRvcyBubyB0ZW5pYW4gKGEgZ3JhbmRlcyByYXNnb3MpIGVsIGZvcm1hdG8gw7NwdGltbyBwYXJhIHN1IGFuYcOhbGlzaXMsIHNlIHBsYW50ZWFyw61hIHF1ZSBGb3JtLCBjb24gYmFzZSBhIGVzdGEgZXhwZXJpZW5jaWEsIGRlc2Fycm9sbGUgdW5hIHNlcmllIGRlIGZvcm1hdG9zIGRlcGVuZGllbmRvIGRlIGxhcyBuZWNlc2lkYWRlcyB5IHJlcXVlcmltaWVudG9zIGRlIGxvcyBkaXN0aW50b3MgZGVwYXJ0YW1lbnRvcywgZG9uZGUgc2UgcmVhbGljZW4gZm9ybWF0b3MgaW5zdGl0dWNpb25hbGVzIGVzdGFibGVjaWRvcyB5IGRlIHVzbyBwZXJtYW5lbnRlIHF1ZSBzZWFuIGRlIHV0aWxpZGFkIHBhcmEgbGEgY2FwdHVyYSB5IG9yZ2FuaXphY2nDs24gZGUgc3VzIGJhc2VzIGRlIGRhdG9zLCBjb24gbGEgY3VhbCBwdWVkYW4gYW5hbGlzYXIgZWwgY3JlY2ltaWVudG8gZW4gdG9kYXMgc3VzIGFyZWFzLiAgIAoKU3VnZXJlbmNpYSAzOiBEZSBsYSBtYW5vIGNvbiBsYXMgb3RyYXMgZG9zIHN1Z2VyZW5jaWFzLCBzZSBwbGFudGVhIHF1ZSBzZSBkZSB1biBlbmZvcXVlIGVuIGxvIHF1ZSByZXNwZWN0YSBsYSBwcmVwYXJhY2nDs24gZGUgbG9zIGNvbGFib3JhZG9yZXMgZXhpc3RlbnRlcywgZG9uZGUgc2UgY29udHJhdGVuL2ltcGFydGFuIGN1cnNvcy90YWxsZXJlcyBleHRlcm5vcyBjb24gdW4gZW5mb3F1ZSBoYWNpYSBsYSBvcHRpbWl6YWNpw7NuIGRlIGxhcyBwcmFjdGljYXMgZW4gbGFzIGJhc2VzIGRlIGRhdG9zIHkgbWFuZWpvIGRlIGxhIGluZm9ybWFjacOzbiwgY29uIGxvIGN1YWwgc2UgdGVuZ2FuIGxvcyBlbGVtZW50b3Mgc3VmaWNpZW50ZXMgcGFyYSB0ZW5lciBmb3JtYXRvcyBkZSBpbmZvcm1hY2nDs24gaWRlYWxlcywgZW4gY29uanVudG8gY29uIHVuIHBlcnNvbmFsIHF1ZSBncmFjaWFzIGEgZGljaG9zIGN1cnNvcy9jZXJ0aWZpY2FjaW9uZXMsIGVzdGUgbG8gc3VmaWNpZW50ZW1lbnRlIGNhcGFjaXRhZG9zIHBhcmEgZGVzYXJycm9sbGFyIHVuYSBsYWJvciBkZSBleGNlbGVuY2lhIGVuIGxvIHF1ZSByZXNwZWN0YSBsYSBjdWx0dXJhIGNvbiBiYXNlIGEgZGF0b3MuIEVuIHBvY2FzIHBhbGFicmFzLCBpbnZlcnRpciBlbiBlbCBkZXNhcnJvbGxvIGRlIGNvbXBldGVuY2lhIGRlIGxvcyBjb2xhYm9yYWRvcmVzIGFkbWluaXN0cmF0aXZvcyBwYXJhIHBvdGVuY2lhciBsYSBhZG1pbmlzdHJhY2nDs24gZGUgbGEgZW1ycGVzYS4gICAKClN1Z2VyZW5jaWEgZXh0cmE6IEVuIHBhbGFicmFzIGNvbG9xdWlhbGVzLCBtZSBndXN0YXLDrWEgYcOxYWRpciBxdWUgZW4gRm9ybSBoYWJsYWJhbiBkZSBlbmNvbnRyYXIgeSBjb250cmF0YXIgZWwgbWVqb3IgdGFsZW50bywgcGVybyBwb3IgcXVlIG5vIG1lam9yICoqZGVzYXJyb2xsYXIqKiBlbCBtZWpvciB0YWxlbnRvLgoKClJlc3BvbmRlciBsYXMgc2lndWllbnRlcyBwcmVndW50YXM6ICAKCi0gRGVzY3JpYmlyIGNvbiB0dXMgcHJvcGlhcyBwYWxhYnJhcyBsb3MgdMOpcm1pbm9zIEJ1c2luZXNzIEFuYWx5dGljcyB5IEJ1c2luZXNzCkludGVsbGlnZW5jZS4gQXPDrSB0YW1iacOpbiwgaWRlbnRpZmljYXIgeSBkZXNjcmliaXIgMyBwcmluY2lwYWxlcyBkaWZlcmVuY2lhcyBlbnRyZQpCdXNpbmVzcyBBbmFseXRpY3MgeSBCdXNpbmVzcyBJbnRlbGxpZ2VuY2UuICAKClI9IEVuIGxvIHBlcnNvbmFsIGNvbnNpZGVybyBxdWUgQkkgdGllbmUgdW4gZW5mb3F1ZSBtw6FzIHTDqWNuaWNvIGVuIGN1ZXN0acOzbiBkZSBjYXB0dXJhciwgYWRtaW5pc3RhciB5IHV0aWxpemFyIGxhIGluZm9ybWFjacOzbiBkZWwgcGFzYWRvIHkgZGVsIHByZXNlbnRlIHBhcmEgc3UgcG9zdGVyaW9yIGRlc2NyaXBjacOzbiB5IHZpc3VhbGl6YWNpw7NuLCBtaWVudHJhcyBxdWUgQnVzaW5lc3MgQW5hbHl0aWNzIHBlcmNpYm8gcXVlIGN1ZW50YSBjb24gdW4gY2Fyw6FjdGVyIG3DoXMgcHJlZGljdGl2bywgZXMgZGVjaXIsIGNvbiBCSSBzYWJlciBsbyBxdWUgaGEgc3VjZWRpZG8geSBsbyBxdWUgc3VjZWRlLCB5IGNvbiBCQSBpZGVudGlmaWNhciBwYXRyb25lcyB5IGVzdHJhdGVnaWFzIHByZWRpY3RpdmFzIHF1ZSBwZXJtaXRhbiByZWFsaXphciBwcm9wdWVzdGFzIGRlIGNyZWNpbWllbnRvIGEgbGFyZ28gcGxhem8gZW4gZWwgcnVicm8gZGUgaW50ZXLDqXMuIAoKRGlmZXJlbmNpYXM6ICAKMS4gQkkgZXMgZGVzY3JpcHRpdm8sIEJBIGVzIHByZWRpY3Rpdm8gIAoyLiBCQSBzZSBlbmZvY2EgZW4gcHJvcG9uZXIgc29sdWNpb25lcywgbWllbnRyYXMgcXVlIEJJIHNlIGVuZm9jYSBtw6FzIGVuIGFuYWxpemFyIGxhIHNpdHVhY2nDs24uIEFtYmFzIHZhbiBkZSBsYSBtYW5vLiAgCjMuIEJJIHNlIGNlbnRyYSBlbiByZWNvbGVjdGFyIGluZm9ybWFjacOzbiwgbWllbnRyYXMgcXVlIEJJIGRlc3RpbmEgZXNhIGluZm9ybWFjacOzbiBwYXJhIHJlYWxpemFyIHZpc3VhbGl6YWNpb25lcyBwcmVkaWN0aXZhcyBxdWUgcGVybWl0YW4gcHJvcG9uZXIgc29sdWNpb25lcyB5L28gc2lndWllbnRlcyBwYXNvcyBhIHRvbWFyLiAgIAoKLSBEZXNjcmliaXIgY29uIHR1cyBwcm9waWFzIHBhbGFicmFzIGVsIGNvbmNlcHRvIGRlIEluZGljYWRvciBDbGF2ZSBkZQpSZW5kaW1pZW50byAvIEtleSBQZXJmb3JtYW5jZSBJbmRpY2F0b3JzIChLUEkpLiAgCgpFbiBsbyBwZXJzb25hbCwgY29uc2lkZXJvIHF1ZSBlbCBjb25jZXB0byBkZSBsb3MgS1BJcyB0cmF0YW4gZGUgZGVzYXJyb2xsYXIgbcOpdHJpY2FzIGNvbiBlbmZvcXVlIGN1YW50aXRhdGl2byBxdWUgcGVybWl0YW4gZGFyIHNlZ3VpbWllbnRvIHkgbW9uaXRvcmVvIGRlIHVuIHByb2Nlc28gZW4gZXNwZWNpZmljbyBwYXJhIGNvbiBiYXNlIGEgZWxsbyB2ZXIgc2kgc2UgdmEgcG9yIGxhIGRpcmVjY2nDs24gY29ycmVjdGEgbyBwcm9wb25lciBhY2Npb25lcyBxdWUgcGVybWl0YW4gbWVqb3JhciBsYSBhY3RpdmlkYWQgZW4gY3Vlc3Rpw7NuLiAgCgoKLSBBIHBhcnRpciBkZWwgYW7DoWxpc2lzIGRlIGxhcyBiYXNlcyBkZSBkYXRvcyBkZSBsYXMgZGlmZXJlbnRlcyDDoXJlYXMgZGUgbGEKZW1wcmVzYSBGT1JNLCBwcm9wb25lciB5IGRlc2NyaWJpciAzIHBvc2libGVzIEtQSXMgcXVlIHBlcm1pdGFuIGV2YWx1YXIKZWwgZGVzZW1wZcOxbyBkZSBhbGd1bmFzIGRlIHN1cyDDoXJlYXMuCgoxLiBQcm9kdWNjacOzbjogJSBkZSBlZmljaWVuY2lhIGRlIGFjdGl2b3MgKGNvbiBlc3RvIHNlIGJ1c2NhIGV2YWx1YXIgbGEgZWZpY2FjaWEgZGUgbG9zIGVxdWlwcyBkZSBtYXF1aW5hcmlhIHBhcmEgbGEgcHJvZHVjY2nDs24sIGNvbiBsYSBmaW5hbGlkYWQgZGUgZXZhbHVhciBzaSBleGlzdGUgdW5hIHNvYnJlY2FyZ2EgZGUgcHJvZHVjY2lvbiBlbiBmdW5jacOzbiBkZSBsb3MgYWN0aXZvcyBkaXNwb25pYmxlcyBvIGVzIG5lY2VzYXJpYSBsYSBpbnZlcnNpw7NuIGRlIG3DoXMgeS9vIG51ZXZvcyBhY3Rpdm9zKSAgCjMuIFJSSEg6ICUgZGUgcm90YWNpw7NuIChlbnRyYWRhcyB5IHNhbGlkYXMgZGUgcGVyc29uYWwpICAKMy4gJSBkZSBtZXJtYSBsaXF1aWRhIChtZXJtYSBsYSBjdWFsIHB1ZG8gc2VyIGNvbWVyY2lhbGl6YWRhIG8gcmV1dGlsaXphZGEgbnVldmFtZW50ZSkgIAoKRnVlbnRlczogICAgICAKV2hhdCBwYWNrYWdlIGlzIGJlc3QgZm9yIGNsdXN0ZXIgYW5hbHlzaXMgaW4gUj8gKHMuIGYuKS4gUXVvcmEuIFJlY3VwZXJhZG8gZWwgMjEgZGUgb2N0dWJyZSBkZSAyMDIyIGVuIGh0dHBzOi8vd3d3LnF1b3JhLmNvbS9XaGF0LXBhY2thZ2UtaXMtYmVzdC1mb3ItY2x1c3Rlci1hbmFseXNpcy1pbi1SICAgICAgCgpJTkVHSSAoYmFzZXMgZGUgZGF0b3MgZXh0ZXJuYXMgcHJvcG9yY2lvbmFkYXMgcG9yIGxhIG1hZXN0cmEpICAgICAgCgpDYXIgcHJvZHVjdGlvbiBVU0EgMjAxNiAtIDIwMjIgKEV1cm9tb25pdG9yLCAyMDIyKSByZWN1cGVyYWRvIGVsIDE4IGRlIG9jdHVicmUsIDIwMjIgZW46Cmh0dHBzOi8vd3d3LnBvcnRhbC5ldXJvbW9uaXRvci5jb20vcG9ydGFsLz9mNTVyYTFoNmUwUHpOVUd0RWpvYkdudk9JMDI5MHZ5Tnd2elN4SUJaeW5FZ3JuZG93bWVDYnclM2QlM2QgIAoKUHJvZHVjY2lvbiBjYXJyb3MgbWV4aWNvIDIwMTYgLSAyMDIyICAoRXVyb21vbml0b3IsIDIwMjIpIHJlY3VwZXJhZG8gZWwgMTggZGUgb2N0dWJyZSwgMjAyMiBlbjoKaHR0cHM6Ly93d3cucG9ydGFsLmV1cm9tb25pdG9yLmNvbS9wb3J0YWwvPyUyYlZhZ29xd0tyOGRuSVBVcTZiUGZFZVV6UmxGamZEZVp6YU5pODFQWTUxZHJXWkhHTGJxbnh3JTNkJTNkCgoK