Para comenzar, se importaron las 3 bases de datos y asimismo se entendieron y se usó la función de clean_names para utilizarlas más fácilmente como vemos a continuación:

BASE DE DATOS DE PRODUCCIÓN
Antes de importar la base de datos, se optó por:
1. Solo dejar los datos del mes de Agosto.
2. Se incorporó una nueva columna de “Fecha”.
3. Solo se dejaron los datos de “Tiempo de Maquinas”
4. Eliminar los NAs y variables no numéricas de las columnas de: “Láminas procesadas”.
BASE DE DATOS DE MERMA
Antes de importar la base de datos, se optó por:
1. Solo dejar los totales de merma de cada mes
BASE DE DATOS DE SCRAP
*No se realizaron cambios previos a esta base de datos.

Paso 1. Instalar librerias:

#install.packages("dplyr")
library(dplyr)
## 
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
#install.packages("psych")
library(psych)
#install.packages("janitor")
library(janitor)
## 
## Attaching package: 'janitor'
## The following objects are masked from 'package:stats':
## 
##     chisq.test, fisher.test
#install.packages("ggplot2")
library(ggplot2)
## 
## Attaching package: 'ggplot2'
## The following objects are masked from 'package:psych':
## 
##     %+%, alpha

Paso 2. Importar las bases de datos:

Base de datos de Producción:
#file.choose()
bd <- read.csv("C:\\Users\\maria\\Documents\\ITESM LAET\\Semestre 7\\Reto\\FORM BASES DE DATOS\\Produccion FORM BUENO CSV.csv")

produccion <- clean_names(bd)
summary(produccion)
##     fecha                 no           cliente            id_form         
##  Length:2471        Min.   :  1.00   Length:2471        Length:2471       
##  Class :character   1st Qu.: 27.00   Class :character   Class :character  
##  Mode  :character   Median : 51.00   Mode  :character   Mode  :character  
##                     Mean   : 51.92                                        
##                     3rd Qu.: 76.00                                        
##                     Max.   :121.00                                        
##                     NA's   :7                                             
##    producto         piezas_prog           tmo_min           hr_fin       
##  Length:2471        Length:2471        Min.   :  0.00   Min.   : 0.0000  
##  Class :character   Class :character   1st Qu.: 15.00   1st Qu.: 0.2014  
##  Mode  :character   Mode  :character   Median : 20.00   Median : 0.4062  
##                                        Mean   : 22.09   Mean   : 0.3586  
##                                        3rd Qu.: 25.00   3rd Qu.: 0.4618  
##                                        Max.   :150.00   Max.   :11.1500  
##                                        NA's   :710      NA's   :752      
##  estacion_arranque  laminas_procesadas inicio_sep_up      fin_inicio_de_sep_up
##  Length:2471        Min.   :   0.0     Length:2471        Length:2471         
##  Class :character   1st Qu.:   0.0     Class :character   Class :character    
##  Mode  :character   Median :  56.5     Mode  :character   Mode  :character    
##                     Mean   : 108.5                                            
##                     3rd Qu.: 200.0                                            
##                     Max.   :1125.0                                            
##                     NA's   :563                                               
##  inicio_de_proceso  fin_de_proceso     tiempo_calidad    tiempo_materiales
##  Length:2471        Length:2471        Min.   : 0.0000   Min.   : 0.000   
##  Class :character   Class :character   1st Qu.: 0.0964   1st Qu.: 0.000   
##  Mode  :character   Mode  :character   Median : 1.0000   Median : 0.000   
##                                        Mean   : 0.8687   Mean   : 2.321   
##                                        3rd Qu.: 1.0000   3rd Qu.: 1.000   
##                                        Max.   :22.0000   Max.   :48.000   
##                                        NA's   :603       NA's   :2150     
##  mermas_maquinas 
##  Min.   : 0.000  
##  1st Qu.: 0.000  
##  Median : 1.000  
##  Mean   : 1.626  
##  3rd Qu.: 1.000  
##  Max.   :50.000  
##  NA's   :2364
Base de datos de Merma:
#Importar las bases de datos
#file.choose()
bd1 <- read.csv("C:\\Users\\maria\\Documents\\ITESM LAET\\Semestre 7\\Reto\\FORM BASES DE DATOS\\FORM - Merma .csv")

merma <- clean_names(bd1)
summary(merma)
##   fecha             mes                kilos       
##  Mode:logical   Length:10          Min.   : 13586  
##  NA's:10        Class :character   1st Qu.: 18415  
##                 Mode  :character   Median : 20920  
##                                    Mean   : 37085  
##                                    3rd Qu.: 23265  
##                                    Max.   :185426
Base de datos de Scrap:
#file.choose()
bd2 <- read.csv("C:\\Users\\maria\\Documents\\ITESM LAET\\Semestre 7\\Reto\\FORM BASES DE DATOS\\FORM - Scrap.csv")

scrap <- clean_names(bd2)
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   ubicacion_de_origen ubicacion_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  
##                                                                                
##                                                                                
## 

Paso 3. Limpiar las bases de datos:

Base de datos de Producción:
#Técnica 1: Eliminar columnas inecesarias
produccion <- subset(produccion,select = -c (no, id_form, producto, hr_fin, estacion_arranque, inicio_sep_up, fin_inicio_de_sep_up, inicio_de_proceso, fin_de_proceso, tiempo_materiales, mermas_maquinas))
summary(produccion)
##     fecha             cliente          piezas_prog           tmo_min      
##  Length:2471        Length:2471        Length:2471        Min.   :  0.00  
##  Class :character   Class :character   Class :character   1st Qu.: 15.00  
##  Mode  :character   Mode  :character   Mode  :character   Median : 20.00  
##                                                           Mean   : 22.09  
##                                                           3rd Qu.: 25.00  
##                                                           Max.   :150.00  
##                                                           NA's   :710     
##  laminas_procesadas tiempo_calidad   
##  Min.   :   0.0     Min.   : 0.0000  
##  1st Qu.:   0.0     1st Qu.: 0.0964  
##  Median :  56.5     Median : 1.0000  
##  Mean   : 108.5     Mean   : 0.8687  
##  3rd Qu.: 200.0     3rd Qu.: 1.0000  
##  Max.   :1125.0     Max.   :22.0000  
##  NA's   :563        NA's   :603
#Técnica 2: Borrar todos los registros NA de la base de datos
produccion <- produccion[!is.na(produccion$tmo_min),]
summary(produccion)
##     fecha             cliente          piezas_prog           tmo_min      
##  Length:1761        Length:1761        Length:1761        Min.   :  0.00  
##  Class :character   Class :character   Class :character   1st Qu.: 15.00  
##  Mode  :character   Mode  :character   Mode  :character   Median : 20.00  
##                                                           Mean   : 22.09  
##                                                           3rd Qu.: 25.00  
##                                                           Max.   :150.00  
##                                                                           
##  laminas_procesadas tiempo_calidad  
##  Min.   :   0.0     Min.   : 0.000  
##  1st Qu.:  34.5     1st Qu.: 1.000  
##  Median : 100.0     Median : 1.000  
##  Mean   : 131.7     Mean   : 1.048  
##  3rd Qu.: 202.0     3rd Qu.: 1.000  
##  Max.   :1125.0     Max.   :22.000  
##  NA's   :226        NA's   :255
produccion <- produccion[!is.na(produccion$laminas_procesadas),]
summary(produccion)
##     fecha             cliente          piezas_prog           tmo_min      
##  Length:1535        Length:1535        Length:1535        Min.   :  0.00  
##  Class :character   Class :character   Class :character   1st Qu.: 15.00  
##  Mode  :character   Mode  :character   Mode  :character   Median : 20.00  
##                                                           Mean   : 22.26  
##                                                           3rd Qu.: 25.00  
##                                                           Max.   :120.00  
##                                                                           
##  laminas_procesadas tiempo_calidad  
##  Min.   :   0.0     Min.   : 0.000  
##  1st Qu.:  34.5     1st Qu.: 1.000  
##  Median : 100.0     Median : 1.000  
##  Mean   : 131.7     Mean   : 1.053  
##  3rd Qu.: 202.0     3rd Qu.: 1.000  
##  Max.   :1125.0     Max.   :22.000  
##                     NA's   :49
#Técnica 3: Cambiar formato de piezas programadas y laminadas procesadas (de caracter a entero); de tmo_min y tiempo calidad (de caracter a minutos) y de fecha a formato fecha.
#Convertir de caracter a fecha
produccion$fecha <- as.Date(produccion$fecha, format = "%d/%m/%Y")
tibble(produccion)
## # A tibble: 1,535 × 6
##    fecha      cliente    piezas_prog tmo_min laminas_procesadas tiempo_calidad
##    <date>     <chr>      <chr>         <int>              <int>          <dbl>
##  1 2022-08-05 STABILUS 3 300             120                600              1
##  2 2022-08-31 VARROC     210             120                210              2
##  3 2022-08-09 TRMX       400             100                 50              1
##  4 2022-08-04 YANFENG    352              90                352              1
##  5 2022-08-03 VARROC     240              80                122              1
##  6 2022-08-18 STABILUS 1 600              75                376              1
##  7 2022-08-19 STABILUS 1 600              75                150              1
##  8 2022-08-29 STABILUS 1 600              75                151              1
##  9 2022-08-30 STABILUS 1 600              75                151              1
## 10 2022-08-31 STABILUS 1 600              75                400              1
## # … with 1,525 more rows
#Convertir de caracter a entero 
produccion$ piezas_prog <- substr(produccion$ piezas_prog, start = 1, stop = 2)
tibble(produccion)
## # A tibble: 1,535 × 6
##    fecha      cliente    piezas_prog tmo_min laminas_procesadas tiempo_calidad
##    <date>     <chr>      <chr>         <int>              <int>          <dbl>
##  1 2022-08-05 STABILUS 3 30              120                600              1
##  2 2022-08-31 VARROC     21              120                210              2
##  3 2022-08-09 TRMX       40              100                 50              1
##  4 2022-08-04 YANFENG    35               90                352              1
##  5 2022-08-03 VARROC     24               80                122              1
##  6 2022-08-18 STABILUS 1 60               75                376              1
##  7 2022-08-19 STABILUS 1 60               75                150              1
##  8 2022-08-29 STABILUS 1 60               75                151              1
##  9 2022-08-30 STABILUS 1 60               75                151              1
## 10 2022-08-31 STABILUS 1 60               75                400              1
## # … with 1,525 more rows
produccion$ piezas_prog <- as.integer(produccion$ piezas_prog)
str(produccion)
## 'data.frame':    1535 obs. of  6 variables:
##  $ fecha             : Date, format: "2022-08-05" "2022-08-31" ...
##  $ cliente           : chr  "STABILUS 3" "VARROC" "TRMX" "YANFENG" ...
##  $ piezas_prog       : int  30 21 40 35 24 60 60 60 60 60 ...
##  $ tmo_min           : int  120 120 100 90 80 75 75 75 75 75 ...
##  $ laminas_procesadas: int  600 210 50 352 122 376 150 151 151 400 ...
##  $ tiempo_calidad    : num  1 2 1 1 1 1 1 1 1 1 ...
produccion$ laminas_procesadas <- substr(produccion$ laminas_procesadas, start = 1, stop = 2)
tibble(produccion)
## # A tibble: 1,535 × 6
##    fecha      cliente    piezas_prog tmo_min laminas_procesadas tiempo_calidad
##    <date>     <chr>            <int>   <int> <chr>                       <dbl>
##  1 2022-08-05 STABILUS 3          30     120 60                              1
##  2 2022-08-31 VARROC              21     120 21                              2
##  3 2022-08-09 TRMX                40     100 50                              1
##  4 2022-08-04 YANFENG             35      90 35                              1
##  5 2022-08-03 VARROC              24      80 12                              1
##  6 2022-08-18 STABILUS 1          60      75 37                              1
##  7 2022-08-19 STABILUS 1          60      75 15                              1
##  8 2022-08-29 STABILUS 1          60      75 15                              1
##  9 2022-08-30 STABILUS 1          60      75 15                              1
## 10 2022-08-31 STABILUS 1          60      75 40                              1
## # … with 1,525 more rows
produccion$ laminas_procesadas <- as.integer(produccion$ laminas_procesadas)
str(produccion)
## 'data.frame':    1535 obs. of  6 variables:
##  $ fecha             : Date, format: "2022-08-05" "2022-08-31" ...
##  $ cliente           : chr  "STABILUS 3" "VARROC" "TRMX" "YANFENG" ...
##  $ piezas_prog       : int  30 21 40 35 24 60 60 60 60 60 ...
##  $ tmo_min           : int  120 120 100 90 80 75 75 75 75 75 ...
##  $ laminas_procesadas: int  60 21 50 35 12 37 15 15 15 40 ...
##  $ tiempo_calidad    : num  1 2 1 1 1 1 1 1 1 1 ...
Base de datos de Merma:
#Técnica 1: Eliminar columnas inecesarias
merma <- subset(merma,select = -c (fecha))
Base de datos de Scrap:
#Técnica 1: Eliminar columnas inecesarias
scrap <- subset(scrap, select = -c (referencia, producto, ubicacion_de_desecho, estado, unidad_de_medida))

Paso 4. Clasificar cada variable y eligir su escala de medición:

Base de datos de Producción:
#Sacar número de variables:
describeData(produccion,head=1,tail=1)
## n.obs =  1535 of which  1485   are complete cases.   Number of variables =  6  of which all are numeric  FALSE  
##                    variable # n.obs type         H1         T1
## fecha*                      1  1534    4 2022-08-05 2022-08-22
## cliente*                    2  1535    3 STABILUS 3 STABILUS 1
## piezas_prog                 3  1535    1         30         20
## tmo_min                     4  1535    1        120          0
## laminas_procesadas          5  1535    1         60          0
## tiempo_calidad              6  1486    1          1          0
#R: Existen 6 variables.

#Sacar número de registros totales en la base de datos:
#R: Existen 1,535 registros por columna, siendo asi 9,210 registros totales en la base de datos.

#Clasifica cada variable en cualitativa, cuantitativa discreta o cuantitativa continua.
Variable<-c("Fecha", "Cliente", "Piezas Programadas", "Tiempo Min", "Láminas Procesadas", "Tiempo Calidad")
Tipo<-c("Cualitativa", "Cualitativa", "Cuantitativa(Discreta)", "Cuantitativa (Continua)", "Cuantitativa(Discreta)","Cuantitativa(Continua)")
Escala_Medicion <-c("NA", "NA", "No. Piezas",  "Horas", "No. Piezas", "Horas")
tabla<-data.frame(Variable, Tipo, Escala_Medicion)
knitr::kable(tabla)
Variable Tipo Escala_Medicion
Fecha Cualitativa NA
Cliente Cualitativa NA
Piezas Programadas Cuantitativa(Discreta) No. Piezas
Tiempo Min Cuantitativa (Continua) Horas
Láminas Procesadas Cuantitativa(Discreta) No. Piezas
Tiempo Calidad Cuantitativa(Continua) Horas
Base de datos de Merma:
#Sacar número de variables:
describeData(merma,head=1,tail=1)
## n.obs =  10 of which  10   are complete cases.   Number of variables =  2  of which all are numeric  FALSE  
##       variable # n.obs type    H1            T1
## mes*           1    10    3 ENERO Total general
## kilos          2    10    1 14560        185426
#R: Existen 2 variables.

#Sacar número de registros totales en la base de datos:
#R: Existen 10 registros por columna, siendo asi 20 registros totales en la base de datos.

#Clasifica cada variable en cualitativa, cuantitativa discreta o cuantitativa continua.
Variable1 <-c("Mes", "Kilos")
Tipo1 <-c("Cualitativa", "Cuantitativa (Continua)")
Escala_Medicion1 <-c("NA", "Kilogramos")
tabla1 <-data.frame(Variable1, Tipo1, Escala_Medicion1)
knitr::kable(tabla1)
Variable1 Tipo1 Escala_Medicion1
Mes Cualitativa NA
Kilos Cuantitativa (Continua) Kilogramos
Base de datos de Scrap:
#Sacar número de variables:
describeData(scrap,head=1,tail=1)
## n.obs =  250 of which  250   are complete cases.   Number of variables =  3  of which all are numeric  FALSE  
##                      variable # n.obs type             H1              T1
## fecha*                        1   250    3     06/08/2022      05/08/2022
## cantidad                      2   250    1             43               7
## ubicacion_de_origen*          3   250    3 Pre-Production Post-Production
#R: Existen 4 variables.

#Sacar número de registros totales en la base de datos:
#R: Existen 250 registros por columna, siendo asi 1,000 registros totales en la base de datos.

#Clasifica cada variable en cualitativa, cuantitativa discreta o cuantitativa continua.
Variable2 <-c("Fecha", "ID_Producto", "Producto", "Cantidad", "Estado")
Tipo2 <-c("Cualitativa", "Cualitativa", "Cualitativa", "Cuantitativa (Discreta)", "Cualitativa")
Escala_Medicion2 <-c("NA", "NA", "NA", "Unidades", "NA")
tabla2 <-data.frame(Variable2, Tipo2, Escala_Medicion2)
knitr::kable(tabla2)
Variable2 Tipo2 Escala_Medicion2
Fecha Cualitativa NA
ID_Producto Cualitativa NA
Producto Cualitativa NA
Cantidad Cuantitativa (Discreta) Unidades
Estado Cualitativa NA

Paso 5. Realizar un análisis estadístico descriptivo:

summary(produccion)
##      fecha              cliente           piezas_prog       tmo_min      
##  Min.   :2022-08-01   Length:1535        Min.   : 1.00   Min.   :  0.00  
##  1st Qu.:2022-08-09   Class :character   1st Qu.:14.00   1st Qu.: 15.00  
##  Median :2022-08-17   Mode  :character   Median :20.00   Median : 20.00  
##  Mean   :2022-08-16                      Mean   :26.02   Mean   : 22.26  
##  3rd Qu.:2022-08-24                      3rd Qu.:32.00   3rd Qu.: 25.00  
##  Max.   :2022-08-31                      Max.   :99.00   Max.   :120.00  
##  NA's   :1                                                               
##  laminas_procesadas tiempo_calidad  
##  Min.   : 0.00      Min.   : 0.000  
##  1st Qu.:11.00      1st Qu.: 1.000  
##  Median :20.00      Median : 1.000  
##  Mean   :27.57      Mean   : 1.053  
##  3rd Qu.:40.00      3rd Qu.: 1.000  
##  Max.   :98.00      Max.   :22.000  
##                     NA's   :49
summary(merma)
##      mes                kilos       
##  Length:10          Min.   : 13586  
##  Class :character   1st Qu.: 18415  
##  Mode  :character   Median : 20920  
##                     Mean   : 37085  
##                     3rd Qu.: 23265  
##                     Max.   :185426
summary(scrap)
##     fecha              cantidad      ubicacion_de_origen
##  Length:250         Min.   : 0.000   Length:250         
##  Class :character   1st Qu.: 1.000   Class :character   
##  Mode  :character   Median : 2.000   Mode  :character   
##                     Mean   : 6.696                      
##                     3rd Qu.: 7.000                      
##                     Max.   :96.000

Con la función de “Summary” fue posible el analizar que las bases de datos ya estuvieran completamente limpias, sin NA´s, con el formato apropiado de cada variable, y solo con las variables necesarias para poder hacer las gráficas solicitadas.

Paso 6. Gráficas:

1. Gráfica Cuantitativa (Histograma-Producción):
hist(produccion$piezas_prog, main = "Piezas producidas", ylab = "Frecuencia", xlab = "Piezas Programadas", col = "lightblue")

mean (produccion$piezas_prog)
## [1] 26.01694

En este gráfica podemos observar que es más común producir tandas menores a 20 piezas por cliente, pero en promedio se producen 26 piezas.

2. Gráfica de Dispersión (Producción):
plot(produccion$tiempo_calidad, produccion$tmo_min, main = "Tiempo de calidad invertido por tiempo de producción", xlab = "Tiempo de Calidad", ylab = "Tiempo de Producción", col= "blue")

En esta gráfica podemos observar que a un tiempo de 50h de producción, hay una mayor inversión de tiempo de calidad. Y a un tiempo mayor a 60 horas, hay una mucha menor inversión de tiempo de calidad. Lo que significa que entre más se tarden haciendo un producto, menos horas de calidad le invierten, esto se puede deber a que como el proceso es más largo, le invierten más cuidado en cada paso, y cuando es más corto el proceso puede ser mas rutinario y es necesario invertirle horas extra a asegurarse que se haya producido correctamente.

3. Gráfico de Dispersión (Ggplot - Producción):
ggplot(data=produccion, mapping = aes(piezas_prog, laminas_procesadas)) + geom_point(aes(color = tmo_min)) + theme_bw()

Con esta gráfica podemos observar que hay una relación lineal positiva entre las piezas producidas y la cantida de laminas utilizadas (materia prima) realizadas en un tiempo menor a 30 horas.

4. Tabla de Frecuencia (Producción):
produccion %>% 
  group_by(cliente) %>% 
  summarise(frequency = n())
## # A tibble: 9 × 2
##   cliente              frequency
##   <chr>                    <int>
## 1 DENSO                      166
## 2 HELLA                       60
## 3 MERIDIAN LIGHTWEIGHT        24
## 4 STABILUS 1                 515
## 5 STABILUS 3                 225
## 6 STABILUS 3.                 17
## 7 TRMX                       222
## 8 VARROC                     108
## 9 YANFENG                    198

En esta tabla podemos observar las veces que aparece el cliente en la base de datos de producción, viendo asi que “Stabilius 1” es el cliente que más pedidos le ordena a FORM.

5. Gráfico Cualitativo (Pay - Merma):
table(merma$mes)
## 
##         ABRIL        AGOSTO         ENERO       FEBRERO         JULIO 
##             1             1             1             1             1 
##         JUNIO         MARZO          MAYO    SEPTIEMBRE Total general 
##             1             1             1             1             1
proporciones <- c(14560, 22830, 22470, 18820, 23410, 18280, 19370, 32100, 13586)
etiquetas <- c("Enero", "Febrero", "Marzo", "Abril", "Mayo", "Junio", "Julio", "Agosto", "Septiembre")
pct <- round(proporciones/sum(proporciones)*100)
etiquetas <- paste(etiquetas, pct)
etiquetas <- paste(etiquetas,"%",sep="")
pie(proporciones,labels = etiquetas,
    col=rainbow(length(etiquetas)),
    main="Merma por mes")

En este gráfico podemos observar que la mayor cantidad de Merma de lo que va de este año fue en Agosto con un 17%. Sin embargo, no hubo una diferencia muy notoria entre todos los meses.

6. Gráfica Cuantitativa (Boxplot - Scrap):
boxplot(scrap$cantidad  ~  scrap$ubicacion_de_origen,
        col = rainbow(ncol(trees)))

Con esta gráfica podemos observar que la cantidad de unidades producidas está normalmente ubicada en “Pre-Producción” y asimismo esta categoría es la más dispersa.

Paso 7. Propuestas:

  1. Al observar las horas de calidad invertidas en producción, se propone que FORM genere un sistema de calidad equitativo dependiendo del cliente y de la cantidad de horas invertidas en la producción, pues bien, hay mucha dispersión en la gráfica 1 como podemos observar, y esto puede ocasionar fallas en los productos entregados y asimismo habría un mayor control de calidad en planta. Un ejemplo de esto sería que el sistema generado de prioridad a los clientes más importantes como lo es Stabilus y asimismo si hubo mucho tiempo de producción en algun producto, las horas invertidas de calidad sean menores que las invertidas en un producto que se tardó menos en producir, esto tomando en cuenta que el producto con mayor tiempo de producción fue realizado con más cuidado en cada etapa, necesitando menos horas de calidad.

  2. Tomando en cuenta la cantidad de merma generada, observamos que hay meses que se producen desde 14,560 kg (enero) hasta 32,100 kg (agosto), como se ve en la gráfica 5, merma generada proporcional a la cantidad de producción, siendo mayor en el tercer trimestre del año. Se propone invertir en el proceso de producción para disminuir el uso de láminas utilizadas por piezas programadas como se ve en la gráfica 3 para disminuir al máximo la dispersión existente al generar un nuevo acomodo de las laminas para la generación de los empaques o bien, que los residuos de las láminas se reciclen para la producción de nuevos empaques.

Paso 8. Reflexión:

Con esta actividad, fue posible el analizar detenidamente la información brindada por FORM, donde pude notar primeramente que muchas de las bases de datos trabajadas interiormente, están desordenadas, no son del todo ágiles y carecen de orden, por lo que fue difícil comprender la información brindada de la base de datos de “Producción” principalmente, siendo una fuerte área de oportunidad el volver a hacer el formato de sus BD para que sus colaboradores y gente externa, puedan comprenderla, agilizar sus procesos y poder trabajar con ellas para hacer indicadores de mejora en el futuro.

Por otro lado, las gráficas realizadas fueron sumamente útiles para la mejor comprensión de la información brindada, dando una mejor visualización y gracias a ellas, se pudieron hacer propuestas de mejora respaldadas con datos verídicos, siendo los mas rectables la inmensa cantidad de merma que FORM produce en cada mes, así como el análisis de las horas de calidad y producción invertidas en los productos realizados en planta.

Para concluir, usar R como herramienta principal de análisis ha sido sumamente útil y nos ha ayudado a realizar todo lo necesario para que FORM pueda mejorar sus procesos, desde la limpieza de las bases, hasta crear gráficas complicadas, algunas operaciones y crar propuestas con visualizaciones atractivas.

LS0tDQp0aXRsZTogPHNwYW4gc3R5bGU9IkNvbG9yOk9yYW5nZSIgPiBFbnRyZWdhYmxlIFI1IC0gSW5kaXZpZHVhbA0KYXV0aG9yOiAiTWFyaWFuYSBVbGxvYSAtIEEwMTI1MzA3NiINCmRhdGU6ICIyMDIyLTA5LTI2Ig0Kb3V0cHV0OiANCiAgaHRtbF9kb2N1bWVudDoNCiAgICB0b2M6IHRydWUNCiAgICB0b2NfZmxvYXQ6IHRydWUNCiAgICBjb2RlX2Rvd25sb2FkOiB0cnVlDQotLS0NCg0KPGltZyBzcmM9ICJDOlxcVXNlcnNcXG1hcmlhXFxEb2N1bWVudHNcXElURVNNIExBRVRcXFNlbWVzdHJlIDdcXFJldG9cXGxvZ28gZm9ybS5wbmciPg0KDQpQYXJhIGNvbWVuemFyLCBzZSBpbXBvcnRhcm9uIGxhcyAzIGJhc2VzIGRlIGRhdG9zIHkgYXNpbWlzbW8gc2UgZW50ZW5kaWVyb24geSBzZSB1c8OzIGxhIGZ1bmNpw7NuIGRlIGNsZWFuX25hbWVzIHBhcmEgdXRpbGl6YXJsYXMgbcOhcyBmw6FjaWxtZW50ZSBjb21vIHZlbW9zIGEgY29udGludWFjacOzbjoNCg0KIyMjIyMgKipCQVNFIERFIERBVE9TIERFIFBST0RVQ0NJw5NOKioNCiMjIyMjIyBBbnRlcyBkZSBpbXBvcnRhciBsYSBiYXNlIGRlIGRhdG9zLCBzZSBvcHTDsyBwb3I6DQojIyMjIyMgMS4gU29sbyBkZWphciBsb3MgZGF0b3MgZGVsIG1lcyBkZSBBZ29zdG8uDQojIyMjIyMgMi4gU2UgaW5jb3Jwb3LDsyB1bmEgbnVldmEgY29sdW1uYSBkZSAiRmVjaGEiLg0KIyMjIyMjIDMuIFNvbG8gc2UgZGVqYXJvbiBsb3MgZGF0b3MgZGUgIlRpZW1wbyBkZSBNYXF1aW5hcyINCiMjIyMjIyA0LiBFbGltaW5hciBsb3MgTkFzIHkgdmFyaWFibGVzIG5vIG51bcOpcmljYXMgZGUgbGFzIGNvbHVtbmFzIGRlOiAiTMOhbWluYXMgcHJvY2VzYWRhcyIuDQoNCg0KIyMjIyMgKipCQVNFIERFIERBVE9TIERFIE1FUk1BKioNCiMjIyMjIyBBbnRlcyBkZSBpbXBvcnRhciBsYSBiYXNlIGRlIGRhdG9zLCBzZSBvcHTDsyBwb3I6DQojIyMjIyMgMS4gU29sbyBkZWphciBsb3MgdG90YWxlcyBkZSBtZXJtYSBkZSBjYWRhIG1lcw0KDQojIyMjIyAqKkJBU0UgREUgREFUT1MgREUgU0NSQVAqKg0KIyMjIyMjICpObyBzZSByZWFsaXphcm9uIGNhbWJpb3MgcHJldmlvcyBhIGVzdGEgYmFzZSBkZSBkYXRvcy4NCg0KIyMjICoqUGFzbyAxLiBJbnN0YWxhciBsaWJyZXJpYXM6KioNCmBgYHtyfQ0KI2luc3RhbGwucGFja2FnZXMoImRwbHlyIikNCmxpYnJhcnkoZHBseXIpDQojaW5zdGFsbC5wYWNrYWdlcygicHN5Y2giKQ0KbGlicmFyeShwc3ljaCkNCiNpbnN0YWxsLnBhY2thZ2VzKCJqYW5pdG9yIikNCmxpYnJhcnkoamFuaXRvcikNCiNpbnN0YWxsLnBhY2thZ2VzKCJnZ3Bsb3QyIikNCmxpYnJhcnkoZ2dwbG90MikNCmBgYA0KDQoNCiMjIyAqKlBhc28gMi4gSW1wb3J0YXIgbGFzIGJhc2VzIGRlIGRhdG9zOioqDQoNCiMjIyMjIEJhc2UgZGUgZGF0b3MgZGUgKipQcm9kdWNjacOzbjoqKg0KYGBge3J9DQojZmlsZS5jaG9vc2UoKQ0KYmQgPC0gcmVhZC5jc3YoIkM6XFxVc2Vyc1xcbWFyaWFcXERvY3VtZW50c1xcSVRFU00gTEFFVFxcU2VtZXN0cmUgN1xcUmV0b1xcRk9STSBCQVNFUyBERSBEQVRPU1xcUHJvZHVjY2lvbiBGT1JNIEJVRU5PIENTVi5jc3YiKQ0KDQpwcm9kdWNjaW9uIDwtIGNsZWFuX25hbWVzKGJkKQ0Kc3VtbWFyeShwcm9kdWNjaW9uKQ0KDQpgYGANCg0KIyMjIyMgQmFzZSBkZSBkYXRvcyBkZSAqKk1lcm1hOioqDQpgYGB7cn0NCiNJbXBvcnRhciBsYXMgYmFzZXMgZGUgZGF0b3MNCiNmaWxlLmNob29zZSgpDQpiZDEgPC0gcmVhZC5jc3YoIkM6XFxVc2Vyc1xcbWFyaWFcXERvY3VtZW50c1xcSVRFU00gTEFFVFxcU2VtZXN0cmUgN1xcUmV0b1xcRk9STSBCQVNFUyBERSBEQVRPU1xcRk9STSAtIE1lcm1hIC5jc3YiKQ0KDQptZXJtYSA8LSBjbGVhbl9uYW1lcyhiZDEpDQpzdW1tYXJ5KG1lcm1hKQ0KDQpgYGANCg0KIyMjIyMgQmFzZSBkZSBkYXRvcyBkZSAqKlNjcmFwOioqDQpgYGB7cn0NCiNmaWxlLmNob29zZSgpDQpiZDIgPC0gcmVhZC5jc3YoIkM6XFxVc2Vyc1xcbWFyaWFcXERvY3VtZW50c1xcSVRFU00gTEFFVFxcU2VtZXN0cmUgN1xcUmV0b1xcRk9STSBCQVNFUyBERSBEQVRPU1xcRk9STSAtIFNjcmFwLmNzdiIpDQoNCnNjcmFwIDwtIGNsZWFuX25hbWVzKGJkMikNCnN1bW1hcnkoc2NyYXApDQpgYGANCg0KIyMjICoqUGFzbyAzLiBMaW1waWFyIGxhcyBiYXNlcyBkZSBkYXRvczoqKg0KDQojIyMjIyBCYXNlIGRlIGRhdG9zIGRlICoqUHJvZHVjY2nDs246KioNCmBgYHtyfQ0KI1TDqWNuaWNhIDE6IEVsaW1pbmFyIGNvbHVtbmFzIGluZWNlc2FyaWFzDQpwcm9kdWNjaW9uIDwtIHN1YnNldChwcm9kdWNjaW9uLHNlbGVjdCA9IC1jIChubywgaWRfZm9ybSwgcHJvZHVjdG8sIGhyX2ZpbiwgZXN0YWNpb25fYXJyYW5xdWUsIGluaWNpb19zZXBfdXAsIGZpbl9pbmljaW9fZGVfc2VwX3VwLCBpbmljaW9fZGVfcHJvY2VzbywgZmluX2RlX3Byb2Nlc28sIHRpZW1wb19tYXRlcmlhbGVzLCBtZXJtYXNfbWFxdWluYXMpKQ0Kc3VtbWFyeShwcm9kdWNjaW9uKQ0KDQojVMOpY25pY2EgMjogQm9ycmFyIHRvZG9zIGxvcyByZWdpc3Ryb3MgTkEgZGUgbGEgYmFzZSBkZSBkYXRvcw0KcHJvZHVjY2lvbiA8LSBwcm9kdWNjaW9uWyFpcy5uYShwcm9kdWNjaW9uJHRtb19taW4pLF0NCnN1bW1hcnkocHJvZHVjY2lvbikNCg0KcHJvZHVjY2lvbiA8LSBwcm9kdWNjaW9uWyFpcy5uYShwcm9kdWNjaW9uJGxhbWluYXNfcHJvY2VzYWRhcyksXQ0Kc3VtbWFyeShwcm9kdWNjaW9uKQ0KDQojVMOpY25pY2EgMzogQ2FtYmlhciBmb3JtYXRvIGRlIHBpZXphcyBwcm9ncmFtYWRhcyB5IGxhbWluYWRhcyBwcm9jZXNhZGFzIChkZSBjYXJhY3RlciBhIGVudGVybyk7IGRlIHRtb19taW4geSB0aWVtcG8gY2FsaWRhZCAoZGUgY2FyYWN0ZXIgYSBtaW51dG9zKSB5IGRlIGZlY2hhIGEgZm9ybWF0byBmZWNoYS4NCiNDb252ZXJ0aXIgZGUgY2FyYWN0ZXIgYSBmZWNoYQ0KcHJvZHVjY2lvbiRmZWNoYSA8LSBhcy5EYXRlKHByb2R1Y2Npb24kZmVjaGEsIGZvcm1hdCA9ICIlZC8lbS8lWSIpDQp0aWJibGUocHJvZHVjY2lvbikNCg0KI0NvbnZlcnRpciBkZSBjYXJhY3RlciBhIGVudGVybyANCnByb2R1Y2Npb24kIHBpZXphc19wcm9nIDwtIHN1YnN0cihwcm9kdWNjaW9uJCBwaWV6YXNfcHJvZywgc3RhcnQgPSAxLCBzdG9wID0gMikNCnRpYmJsZShwcm9kdWNjaW9uKQ0KcHJvZHVjY2lvbiQgcGllemFzX3Byb2cgPC0gYXMuaW50ZWdlcihwcm9kdWNjaW9uJCBwaWV6YXNfcHJvZykNCnN0cihwcm9kdWNjaW9uKQ0KDQpwcm9kdWNjaW9uJCBsYW1pbmFzX3Byb2Nlc2FkYXMgPC0gc3Vic3RyKHByb2R1Y2Npb24kIGxhbWluYXNfcHJvY2VzYWRhcywgc3RhcnQgPSAxLCBzdG9wID0gMikNCnRpYmJsZShwcm9kdWNjaW9uKQ0KcHJvZHVjY2lvbiQgbGFtaW5hc19wcm9jZXNhZGFzIDwtIGFzLmludGVnZXIocHJvZHVjY2lvbiQgbGFtaW5hc19wcm9jZXNhZGFzKQ0Kc3RyKHByb2R1Y2Npb24pDQpgYGANCg0KIyMjIyMgQmFzZSBkZSBkYXRvcyBkZSAqKk1lcm1hOioqDQpgYGB7cn0NCiNUw6ljbmljYSAxOiBFbGltaW5hciBjb2x1bW5hcyBpbmVjZXNhcmlhcw0KbWVybWEgPC0gc3Vic2V0KG1lcm1hLHNlbGVjdCA9IC1jIChmZWNoYSkpDQpgYGANCg0KIyMjIyMgQmFzZSBkZSBkYXRvcyBkZSAqKlNjcmFwOioqDQpgYGB7cn0NCiNUw6ljbmljYSAxOiBFbGltaW5hciBjb2x1bW5hcyBpbmVjZXNhcmlhcw0Kc2NyYXAgPC0gc3Vic2V0KHNjcmFwLCBzZWxlY3QgPSAtYyAocmVmZXJlbmNpYSwgcHJvZHVjdG8sIHViaWNhY2lvbl9kZV9kZXNlY2hvLCBlc3RhZG8sIHVuaWRhZF9kZV9tZWRpZGEpKQ0KYGBgDQoNCiMjIyAqKlBhc28gNC4gQ2xhc2lmaWNhciBjYWRhIHZhcmlhYmxlIHkgZWxpZ2lyIHN1IGVzY2FsYSBkZSBtZWRpY2nDs246KioNCg0KIyMjIyMgQmFzZSBkZSBkYXRvcyBkZSAqKlByb2R1Y2Npw7NuOioqDQpgYGB7cn0NCiNTYWNhciBuw7ptZXJvIGRlIHZhcmlhYmxlczoNCmRlc2NyaWJlRGF0YShwcm9kdWNjaW9uLGhlYWQ9MSx0YWlsPTEpDQoNCiNSOiBFeGlzdGVuIDYgdmFyaWFibGVzLg0KDQojU2FjYXIgbsO6bWVybyBkZSByZWdpc3Ryb3MgdG90YWxlcyBlbiBsYSBiYXNlIGRlIGRhdG9zOg0KI1I6IEV4aXN0ZW4gMSw1MzUgcmVnaXN0cm9zIHBvciBjb2x1bW5hLCBzaWVuZG8gYXNpIDksMjEwIHJlZ2lzdHJvcyB0b3RhbGVzIGVuIGxhIGJhc2UgZGUgZGF0b3MuDQoNCiNDbGFzaWZpY2EgY2FkYSB2YXJpYWJsZSBlbiBjdWFsaXRhdGl2YSwgY3VhbnRpdGF0aXZhIGRpc2NyZXRhIG8gY3VhbnRpdGF0aXZhIGNvbnRpbnVhLg0KVmFyaWFibGU8LWMoIkZlY2hhIiwgIkNsaWVudGUiLCAiUGllemFzIFByb2dyYW1hZGFzIiwgIlRpZW1wbyBNaW4iLCAiTMOhbWluYXMgUHJvY2VzYWRhcyIsICJUaWVtcG8gQ2FsaWRhZCIpDQpUaXBvPC1jKCJDdWFsaXRhdGl2YSIsICJDdWFsaXRhdGl2YSIsICJDdWFudGl0YXRpdmEoRGlzY3JldGEpIiwgIkN1YW50aXRhdGl2YSAoQ29udGludWEpIiwgIkN1YW50aXRhdGl2YShEaXNjcmV0YSkiLCJDdWFudGl0YXRpdmEoQ29udGludWEpIikNCkVzY2FsYV9NZWRpY2lvbiA8LWMoIk5BIiwgIk5BIiwgIk5vLiBQaWV6YXMiLCAgIkhvcmFzIiwgIk5vLiBQaWV6YXMiLCAiSG9yYXMiKQ0KdGFibGE8LWRhdGEuZnJhbWUoVmFyaWFibGUsIFRpcG8sIEVzY2FsYV9NZWRpY2lvbikNCmtuaXRyOjprYWJsZSh0YWJsYSkNCg0KYGBgDQoNCiMjIyMjIEJhc2UgZGUgZGF0b3MgZGUgKipNZXJtYToqKg0KYGBge3J9DQojU2FjYXIgbsO6bWVybyBkZSB2YXJpYWJsZXM6DQpkZXNjcmliZURhdGEobWVybWEsaGVhZD0xLHRhaWw9MSkNCg0KI1I6IEV4aXN0ZW4gMiB2YXJpYWJsZXMuDQoNCiNTYWNhciBuw7ptZXJvIGRlIHJlZ2lzdHJvcyB0b3RhbGVzIGVuIGxhIGJhc2UgZGUgZGF0b3M6DQojUjogRXhpc3RlbiAxMCByZWdpc3Ryb3MgcG9yIGNvbHVtbmEsIHNpZW5kbyBhc2kgMjAgcmVnaXN0cm9zIHRvdGFsZXMgZW4gbGEgYmFzZSBkZSBkYXRvcy4NCg0KI0NsYXNpZmljYSBjYWRhIHZhcmlhYmxlIGVuIGN1YWxpdGF0aXZhLCBjdWFudGl0YXRpdmEgZGlzY3JldGEgbyBjdWFudGl0YXRpdmEgY29udGludWEuDQpWYXJpYWJsZTEgPC1jKCJNZXMiLCAiS2lsb3MiKQ0KVGlwbzEgPC1jKCJDdWFsaXRhdGl2YSIsICJDdWFudGl0YXRpdmEgKENvbnRpbnVhKSIpDQpFc2NhbGFfTWVkaWNpb24xIDwtYygiTkEiLCAiS2lsb2dyYW1vcyIpDQp0YWJsYTEgPC1kYXRhLmZyYW1lKFZhcmlhYmxlMSwgVGlwbzEsIEVzY2FsYV9NZWRpY2lvbjEpDQprbml0cjo6a2FibGUodGFibGExKQ0KYGBgDQoNCiMjIyMjIEJhc2UgZGUgZGF0b3MgZGUgKipTY3JhcCoqOg0KYGBge3J9DQojU2FjYXIgbsO6bWVybyBkZSB2YXJpYWJsZXM6DQpkZXNjcmliZURhdGEoc2NyYXAsaGVhZD0xLHRhaWw9MSkNCg0KI1I6IEV4aXN0ZW4gNCB2YXJpYWJsZXMuDQoNCiNTYWNhciBuw7ptZXJvIGRlIHJlZ2lzdHJvcyB0b3RhbGVzIGVuIGxhIGJhc2UgZGUgZGF0b3M6DQojUjogRXhpc3RlbiAyNTAgcmVnaXN0cm9zIHBvciBjb2x1bW5hLCBzaWVuZG8gYXNpIDEsMDAwIHJlZ2lzdHJvcyB0b3RhbGVzIGVuIGxhIGJhc2UgZGUgZGF0b3MuDQoNCiNDbGFzaWZpY2EgY2FkYSB2YXJpYWJsZSBlbiBjdWFsaXRhdGl2YSwgY3VhbnRpdGF0aXZhIGRpc2NyZXRhIG8gY3VhbnRpdGF0aXZhIGNvbnRpbnVhLg0KVmFyaWFibGUyIDwtYygiRmVjaGEiLCAiSURfUHJvZHVjdG8iLCAiUHJvZHVjdG8iLCAiQ2FudGlkYWQiLCAiRXN0YWRvIikNClRpcG8yIDwtYygiQ3VhbGl0YXRpdmEiLCAiQ3VhbGl0YXRpdmEiLCAiQ3VhbGl0YXRpdmEiLCAiQ3VhbnRpdGF0aXZhIChEaXNjcmV0YSkiLCAiQ3VhbGl0YXRpdmEiKQ0KRXNjYWxhX01lZGljaW9uMiA8LWMoIk5BIiwgIk5BIiwgIk5BIiwgIlVuaWRhZGVzIiwgIk5BIikNCnRhYmxhMiA8LWRhdGEuZnJhbWUoVmFyaWFibGUyLCBUaXBvMiwgRXNjYWxhX01lZGljaW9uMikNCmtuaXRyOjprYWJsZSh0YWJsYTIpDQpgYGANCg0KDQojIyMgKipQYXNvIDUuIFJlYWxpemFyIHVuIGFuw6FsaXNpcyBlc3RhZMOtc3RpY28gZGVzY3JpcHRpdm86KioNCmBgYHtyfQ0Kc3VtbWFyeShwcm9kdWNjaW9uKQ0Kc3VtbWFyeShtZXJtYSkNCnN1bW1hcnkoc2NyYXApDQpgYGANCkNvbiBsYSBmdW5jacOzbiBkZSAqKiJTdW1tYXJ5IioqIGZ1ZSBwb3NpYmxlIGVsIGFuYWxpemFyIHF1ZSBsYXMgYmFzZXMgZGUgZGF0b3MgeWEgZXN0dXZpZXJhbiBjb21wbGV0YW1lbnRlIGxpbXBpYXMsIHNpbiBOQcK0cywgY29uIGVsIGZvcm1hdG8gYXByb3BpYWRvIGRlIGNhZGEgdmFyaWFibGUsIHkgc29sbyBjb24gbGFzICp2YXJpYWJsZXMgbmVjZXNhcmlhcyogcGFyYSBwb2RlciBoYWNlciBsYXMgZ3LDoWZpY2FzIHNvbGljaXRhZGFzLg0KDQojIyMgKipQYXNvIDYuIEdyw6FmaWNhczoqKg0KDQojIyMjIyAqKjEuIEdyw6FmaWNhIEN1YW50aXRhdGl2YSAoSGlzdG9ncmFtYS1Qcm9kdWNjacOzbik6KioNCmBgYHtyfQ0KaGlzdChwcm9kdWNjaW9uJHBpZXphc19wcm9nLCBtYWluID0gIlBpZXphcyBwcm9kdWNpZGFzIiwgeWxhYiA9ICJGcmVjdWVuY2lhIiwgeGxhYiA9ICJQaWV6YXMgUHJvZ3JhbWFkYXMiLCBjb2wgPSAibGlnaHRibHVlIikNCg0KbWVhbiAocHJvZHVjY2lvbiRwaWV6YXNfcHJvZykNCmBgYA0KRW4gZXN0ZSBncsOhZmljYSBwb2RlbW9zIG9ic2VydmFyIHF1ZSBlcyAqKm3DoXMgY29tw7puIHByb2R1Y2lyIHRhbmRhcyBtZW5vcmVzIGEgMjAgcGllemFzIHBvciBjbGllbnRlKiosIHBlcm8gZW4gKnByb21lZGlvIHNlIHByb2R1Y2VuIDI2IHBpZXphcy4qDQoNCg0KIyMjIyMgKioyLiBHcsOhZmljYSBkZSBEaXNwZXJzacOzbiAoUHJvZHVjY2nDs24pOioqDQpgYGB7cn0NCnBsb3QocHJvZHVjY2lvbiR0aWVtcG9fY2FsaWRhZCwgcHJvZHVjY2lvbiR0bW9fbWluLCBtYWluID0gIlRpZW1wbyBkZSBjYWxpZGFkIGludmVydGlkbyBwb3IgdGllbXBvIGRlIHByb2R1Y2Npw7NuIiwgeGxhYiA9ICJUaWVtcG8gZGUgQ2FsaWRhZCIsIHlsYWIgPSAiVGllbXBvIGRlIFByb2R1Y2Npw7NuIiwgY29sPSAiYmx1ZSIpDQoNCmBgYA0KRW4gZXN0YSBncsOhZmljYSBwb2RlbW9zIG9ic2VydmFyIHF1ZSAqKmEgdW4gdGllbXBvIGRlIDUwaCBkZSBwcm9kdWNjacOzbiwgaGF5IHVuYSBtYXlvciBpbnZlcnNpw7NuIGRlIHRpZW1wbyBkZSBjYWxpZGFkLioqIFkgKiphIHVuIHRpZW1wbyBtYXlvciBhIDYwIGhvcmFzLCBoYXkgdW5hIG11Y2hhIG1lbm9yIGludmVyc2nDs24gZGUgdGllbXBvIGRlIGNhbGlkYWQuKiogTG8gcXVlIHNpZ25pZmljYSBxdWUgKmVudHJlIG3DoXMgc2UgdGFyZGVuIGhhY2llbmRvIHVuIHByb2R1Y3RvLCBtZW5vcyBob3JhcyBkZSBjYWxpZGFkIGxlIGludmllcnRlbiwqIGVzdG8gc2UgcHVlZGUgZGViZXIgYSBxdWUgY29tbyBlbCBwcm9jZXNvIGVzIG3DoXMgbGFyZ28sIGxlIGludmllcnRlbiBtw6FzIGN1aWRhZG8gZW4gY2FkYSBwYXNvLCB5IGN1YW5kbyBlcyBtw6FzIGNvcnRvIGVsIHByb2Nlc28gcHVlZGUgc2VyIG1hcyBydXRpbmFyaW8geSBlcyBuZWNlc2FyaW8gaW52ZXJ0aXJsZSBob3JhcyBleHRyYSBhIGFzZWd1cmFyc2UgcXVlIHNlIGhheWEgcHJvZHVjaWRvIGNvcnJlY3RhbWVudGUuDQoNCg0KIyMjIyMgKiozLiBHcsOhZmljbyBkZSBEaXNwZXJzacOzbiAoR2dwbG90IC0gUHJvZHVjY2nDs24pOioqDQpgYGB7cn0NCmdncGxvdChkYXRhPXByb2R1Y2Npb24sIG1hcHBpbmcgPSBhZXMocGllemFzX3Byb2csIGxhbWluYXNfcHJvY2VzYWRhcykpICsgZ2VvbV9wb2ludChhZXMoY29sb3IgPSB0bW9fbWluKSkgKyB0aGVtZV9idygpDQpgYGANCkNvbiBlc3RhIGdyw6FmaWNhIHBvZGVtb3Mgb2JzZXJ2YXIgcXVlICoqaGF5IHVuYSByZWxhY2nDs24gbGluZWFsIHBvc2l0aXZhIGVudHJlIGxhcyBwaWV6YXMgcHJvZHVjaWRhcyB5IGxhIGNhbnRpZGEgZGUgbGFtaW5hcyB1dGlsaXphZGFzIChtYXRlcmlhIHByaW1hKSByZWFsaXphZGFzIGVuIHVuIHRpZW1wbyBtZW5vciBhIDMwIGhvcmFzLioqDQoNCg0KIyMjIyMgKio0LiBUYWJsYSBkZSBGcmVjdWVuY2lhIChQcm9kdWNjacOzbik6KioNCmBgYHtyfQ0KcHJvZHVjY2lvbiAlPiUgDQogIGdyb3VwX2J5KGNsaWVudGUpICU+JSANCiAgc3VtbWFyaXNlKGZyZXF1ZW5jeSA9IG4oKSkNCmBgYA0KRW4gZXN0YSB0YWJsYSBwb2RlbW9zIG9ic2VydmFyIGxhcyB2ZWNlcyBxdWUgYXBhcmVjZSBlbCBjbGllbnRlIGVuIGxhIGJhc2UgZGUgZGF0b3MgZGUgcHJvZHVjY2nDs24sIHZpZW5kbyBhc2kgcXVlICoqIlN0YWJpbGl1cyAxIiBlcyBlbCBjbGllbnRlIHF1ZSBtw6FzIHBlZGlkb3MgbGUgb3JkZW5hIGEgRk9STS4qKg0KDQoNCiMjIyMjICoqNS4gR3LDoWZpY28gQ3VhbGl0YXRpdm8gKFBheSAtIE1lcm1hKToqKg0KYGBge3J9DQp0YWJsZShtZXJtYSRtZXMpDQpwcm9wb3JjaW9uZXMgPC0gYygxNDU2MCwgMjI4MzAsIDIyNDcwLCAxODgyMCwgMjM0MTAsIDE4MjgwLCAxOTM3MCwgMzIxMDAsIDEzNTg2KQ0KZXRpcXVldGFzIDwtIGMoIkVuZXJvIiwgIkZlYnJlcm8iLCAiTWFyem8iLCAiQWJyaWwiLCAiTWF5byIsICJKdW5pbyIsICJKdWxpbyIsICJBZ29zdG8iLCAiU2VwdGllbWJyZSIpDQpwY3QgPC0gcm91bmQocHJvcG9yY2lvbmVzL3N1bShwcm9wb3JjaW9uZXMpKjEwMCkNCmV0aXF1ZXRhcyA8LSBwYXN0ZShldGlxdWV0YXMsIHBjdCkNCmV0aXF1ZXRhcyA8LSBwYXN0ZShldGlxdWV0YXMsIiUiLHNlcD0iIikNCnBpZShwcm9wb3JjaW9uZXMsbGFiZWxzID0gZXRpcXVldGFzLA0KICAgIGNvbD1yYWluYm93KGxlbmd0aChldGlxdWV0YXMpKSwNCiAgICBtYWluPSJNZXJtYSBwb3IgbWVzIikNCmBgYA0KRW4gZXN0ZSBncsOhZmljbyBwb2RlbW9zIG9ic2VydmFyIHF1ZSAqKmxhIG1heW9yIGNhbnRpZGFkIGRlIE1lcm1hIGRlIGxvIHF1ZSB2YSBkZSBlc3RlIGHDsW8gZnVlIGVuIEFnb3N0byBjb24gdW4gMTclLioqIFNpbiBlbWJhcmdvLCBubyBodWJvIHVuYSBkaWZlcmVuY2lhIG11eSBub3RvcmlhIGVudHJlIHRvZG9zIGxvcyBtZXNlcy4NCg0KDQojIyMjIyAqKjYuIEdyw6FmaWNhIEN1YW50aXRhdGl2YSAoQm94cGxvdCAtIFNjcmFwKToqKg0KYGBge3J9DQpib3hwbG90KHNjcmFwJGNhbnRpZGFkICB+ICBzY3JhcCR1YmljYWNpb25fZGVfb3JpZ2VuLA0KICAgICAgICBjb2wgPSByYWluYm93KG5jb2wodHJlZXMpKSkNCmBgYA0KQ29uIGVzdGEgZ3LDoWZpY2EgcG9kZW1vcyBvYnNlcnZhciBxdWUgKipsYSBjYW50aWRhZCBkZSB1bmlkYWRlcyBwcm9kdWNpZGFzIGVzdMOhIG5vcm1hbG1lbnRlIHViaWNhZGEgZW4gIlByZS1Qcm9kdWNjacOzbiIgeSBhc2ltaXNtbyBlc3RhIGNhdGVnb3LDrWEgZXMgbGEgbcOhcyBkaXNwZXJzYS4qKg0KDQojIyMgKipQYXNvIDcuIFByb3B1ZXN0YXM6KioNCg0KMS4gQWwgb2JzZXJ2YXIgbGFzIGhvcmFzIGRlIGNhbGlkYWQgaW52ZXJ0aWRhcyBlbiBwcm9kdWNjacOzbiwgc2UgcHJvcG9uZSBxdWUgRk9STSAqKmdlbmVyZSB1biBzaXN0ZW1hIGRlIGNhbGlkYWQgZXF1aXRhdGl2byBkZXBlbmRpZW5kbyBkZWwgY2xpZW50ZSB5IGRlIGxhIGNhbnRpZGFkIGRlIGhvcmFzIGludmVydGlkYXMgZW4gbGEgcHJvZHVjY2nDs24qKiwgcHVlcyBiaWVuLCBoYXkgbXVjaGEgZGlzcGVyc2nDs24gZW4gbGEgZ3LDoWZpY2EgMSBjb21vIHBvZGVtb3Mgb2JzZXJ2YXIsIHkgZXN0byBwdWVkZSAqb2Nhc2lvbmFyIGZhbGxhcyBlbiBsb3MgcHJvZHVjdG9zIGVudHJlZ2Fkb3MgeSBhc2ltaXNtbyBoYWJyw61hIHVuIG1heW9yIGNvbnRyb2wgZGUgY2FsaWRhZCBlbiBwbGFudGEuKiANClVuIGVqZW1wbG8gZGUgZXN0byBzZXLDrWEgcXVlIGVsIHNpc3RlbWEgZ2VuZXJhZG8gZGUgcHJpb3JpZGFkIGEgbG9zICpjbGllbnRlcyBtw6FzIGltcG9ydGFudGVzKiBjb21vIGxvIGVzIFN0YWJpbHVzIHkgYXNpbWlzbW8gKnNpIGh1Ym8gbXVjaG8gdGllbXBvIGRlIHByb2R1Y2Npw7NuIGVuIGFsZ3VuIHByb2R1Y3RvLCBsYXMgaG9yYXMgaW52ZXJ0aWRhcyBkZSBjYWxpZGFkIHNlYW4gbWVub3JlcyBxdWUgbGFzIGludmVydGlkYXMgZW4gdW4gcHJvZHVjdG8gcXVlIHNlIHRhcmTDsyBtZW5vcyBlbiBwcm9kdWNpciwqIGVzdG8gdG9tYW5kbyBlbiBjdWVudGEgcXVlIGVsIHByb2R1Y3RvIGNvbiBtYXlvciB0aWVtcG8gZGUgcHJvZHVjY2nDs24gZnVlIHJlYWxpemFkbyBjb24gbcOhcyBjdWlkYWRvIGVuIGNhZGEgZXRhcGEsIG5lY2VzaXRhbmRvIG1lbm9zIGhvcmFzIGRlIGNhbGlkYWQuDQoNCjIuIFRvbWFuZG8gZW4gY3VlbnRhIGxhIGNhbnRpZGFkIGRlIG1lcm1hIGdlbmVyYWRhLCBvYnNlcnZhbW9zIHF1ZSBoYXkgbWVzZXMgcXVlIHNlIHByb2R1Y2VuIGRlc2RlIDE0LDU2MCBrZyAoZW5lcm8pIGhhc3RhIDMyLDEwMCBrZyAoYWdvc3RvKSwgY29tbyBzZSB2ZSBlbiBsYSBncsOhZmljYSA1LCBtZXJtYSBnZW5lcmFkYSBwcm9wb3JjaW9uYWwgYSBsYSBjYW50aWRhZCBkZSBwcm9kdWNjacOzbiwgKnNpZW5kbyBtYXlvciBlbiBlbCB0ZXJjZXIgdHJpbWVzdHJlIGRlbCBhw7FvKi4gU2UgcHJvcG9uZSAqKmludmVydGlyIGVuIGVsIHByb2Nlc28gZGUgcHJvZHVjY2nDs24gcGFyYSBkaXNtaW51aXIgZWwgdXNvIGRlIGzDoW1pbmFzIHV0aWxpemFkYXMgcG9yIHBpZXphcyBwcm9ncmFtYWRhcyoqIGNvbW8gc2UgdmUgZW4gbGEgZ3LDoWZpY2EgMyBwYXJhIGRpc21pbnVpciBhbCBtw6F4aW1vIGxhIGRpc3BlcnNpw7NuIGV4aXN0ZW50ZSBhbCAqZ2VuZXJhciB1biBudWV2byBhY29tb2RvKiBkZSBsYXMgbGFtaW5hcyBwYXJhIGxhIGdlbmVyYWNpw7NuIGRlIGxvcyBlbXBhcXVlcyBvIGJpZW4sIHF1ZSBsb3MgKnJlc2lkdW9zIGRlIGxhcyBsw6FtaW5hcyBzZSByZWNpY2xlbiBwYXJhIGxhIHByb2R1Y2Npw7NuIGRlIG51ZXZvcyBlbXBhcXVlcy4qDQoNCg0KIyMjICoqUGFzbyA4LiBSZWZsZXhpw7NuOioqDQpDb24gZXN0YSBhY3RpdmlkYWQsIGZ1ZSBwb3NpYmxlIGVsIGFuYWxpemFyIGRldGVuaWRhbWVudGUgbGEgaW5mb3JtYWNpw7NuIGJyaW5kYWRhIHBvciBGT1JNLCBkb25kZSBwdWRlIG5vdGFyIHByaW1lcmFtZW50ZSBxdWUgbXVjaGFzIGRlICpsYXMgYmFzZXMgZGUgZGF0b3MgdHJhYmFqYWRhcyBpbnRlcmlvcm1lbnRlLCBlc3TDoW4gZGVzb3JkZW5hZGFzLCBubyBzb24gZGVsIHRvZG8gw6FnaWxlcyB5IGNhcmVjZW4gZGUgb3JkZW4qLCBwb3IgbG8gcXVlICoqZnVlIGRpZsOtY2lsIGNvbXByZW5kZXIgbGEgaW5mb3JtYWNpw7NuIGJyaW5kYWRhKiogZGUgbGEgYmFzZSBkZSBkYXRvcyBkZSAiUHJvZHVjY2nDs24iIHByaW5jaXBhbG1lbnRlLCBzaWVuZG8gdW5hIGZ1ZXJ0ZSDDoXJlYSBkZSBvcG9ydHVuaWRhZCBlbCB2b2x2ZXIgYSBoYWNlciBlbCBmb3JtYXRvIGRlIHN1cyBCRCBwYXJhIHF1ZSBzdXMgY29sYWJvcmFkb3JlcyB5IGdlbnRlIGV4dGVybmEsIHB1ZWRhbiAqKmNvbXByZW5kZXJsYSwgYWdpbGl6YXIgc3VzIHByb2Nlc29zIHkgcG9kZXIgdHJhYmFqYXIgY29uIGVsbGFzIHBhcmEgaGFjZXIgaW5kaWNhZG9yZXMgZGUgbWVqb3JhIGVuIGVsIGZ1dHVyby4qKg0KDQpQb3Igb3RybyBsYWRvLCBsYXMgKmdyw6FmaWNhcyByZWFsaXphZGFzIGZ1ZXJvbiBzdW1hbWVudGUgw7p0aWxlcyBwYXJhIGxhIG1lam9yIGNvbXByZW5zacOzbiBkZSBsYSBpbmZvcm1hY2nDs24qIGJyaW5kYWRhLCBkYW5kbyB1bmEgbWVqb3IgdmlzdWFsaXphY2nDs24geSBncmFjaWFzIGEgZWxsYXMsIHNlIHB1ZGllcm9uIGhhY2VyICoqcHJvcHVlc3RhcyBkZSBtZWpvcmEgcmVzcGFsZGFkYXMgY29uIGRhdG9zIHZlcsOtZGljb3MsKiogc2llbmRvIGxvcyBtYXMgcmVjdGFibGVzIGxhIGlubWVuc2EgY2FudGlkYWQgZGUgbWVybWEgcXVlIEZPUk0gcHJvZHVjZSBlbiBjYWRhIG1lcywgYXPDrSBjb21vIGVsIGFuw6FsaXNpcyBkZSBsYXMgaG9yYXMgZGUgY2FsaWRhZCB5IHByb2R1Y2Npw7NuIGludmVydGlkYXMgZW4gbG9zIHByb2R1Y3RvcyByZWFsaXphZG9zIGVuIHBsYW50YS4gDQoNClBhcmEgY29uY2x1aXIsIHVzYXIgKipSIGNvbW8gaGVycmFtaWVudGEgcHJpbmNpcGFsIGRlIGFuw6FsaXNpcyBoYSBzaWRvIHN1bWFtZW50ZSDDunRpbCoqIHkgbm9zIGhhIGF5dWRhZG8gYSByZWFsaXphciB0b2RvIGxvIG5lY2VzYXJpbyBwYXJhIHF1ZSBGT1JNIHB1ZWRhIG1lam9yYXIgc3VzIHByb2Nlc29zLCBkZXNkZSBsYSBsaW1waWV6YSBkZSBsYXMgYmFzZXMsIGhhc3RhIGNyZWFyIGdyw6FmaWNhcyBjb21wbGljYWRhcywgYWxndW5hcyBvcGVyYWNpb25lcyB5IGNyYXIgcHJvcHVlc3RhcyBjb24gdmlzdWFsaXphY2lvbmVzIGF0cmFjdGl2YXMu