JuveYell

Parte 1

## Descargar librerías
library(foreign)
library(dplyr)        # data manipulation 
## 
## 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
library(forcats)      # to work with categorical variables
library(ggplot2)      # data visualization
library(readr)        # read specific csv files
library(janitor)      # data exploration and cleaning 
## 
## Attaching package: 'janitor'
## The following objects are masked from 'package:stats':
## 
##     chisq.test, fisher.test
library(Hmisc)        # several useful functions for data analysis 
## Loading required package: lattice
## Loading required package: survival
## Loading required package: Formula
## 
## Attaching package: 'Hmisc'
## The following objects are masked from 'package:dplyr':
## 
##     src, summarize
## The following objects are masked from 'package:base':
## 
##     format.pval, units
library(psych)        # functions for multivariate analysis 
## 
## Attaching package: 'psych'
## The following object is masked from 'package:Hmisc':
## 
##     describe
## The following objects are masked from 'package:ggplot2':
## 
##     %+%, alpha
library(naniar)       # summaries and visualization of missing values NAs
library(dlookr)       # summaries and visualization of missing values NAs
## 
## Attaching package: 'dlookr'
## The following object is masked from 'package:psych':
## 
##     describe
## The following object is masked from 'package:Hmisc':
## 
##     describe
## The following object is masked from 'package:base':
## 
##     transform
library(corrplot)     # correlation plots
## corrplot 0.92 loaded
library(jtools)       # presentation of regression analysis 
## 
## Attaching package: 'jtools'
## The following object is masked from 'package:Hmisc':
## 
##     %nin%
library(lmtest)       # diagnostic checks - linear regression analysis 
## Loading required package: zoo
## 
## Attaching package: 'zoo'
## The following objects are masked from 'package:base':
## 
##     as.Date, as.Date.numeric
library(car)          # diagnostic checks - linear regression analysis
## Loading required package: carData
## 
## Attaching package: 'car'
## The following object is masked from 'package:psych':
## 
##     logit
## The following object is masked from 'package:dplyr':
## 
##     recode
library(olsrr)        # diagnostic checks - linear regression analysis 
## 
## Attaching package: 'olsrr'
## The following object is masked from 'package:datasets':
## 
##     rivers
library(kableExtra)   # HTML table attributes
## 
## Attaching package: 'kableExtra'
## The following object is masked from 'package:dplyr':
## 
##     group_rows
library(gmodels)
library(openxlsx)
library(crosstable)

1. ¿Cuántas variables y cuántos registros tiene la base de datos?

### Importar base de datos
df1 <-read.csv(file.choose())
summary(df1)
##     FECHA               MES                KILOS         X          
##  Length:50          Length:50          Min.   : 790   Mode:logical  
##  Class :character   Class :character   1st Qu.:3178   NA's:50       
##  Mode  :character   Mode  :character   Median :3925                 
##                                        Mean   :3709                 
##                                        3rd Qu.:4232                 
##                                        Max.   :6140                 
##    X.1            X.2            X.3         
##  Mode:logical   Mode:logical   Mode:logical  
##  NA's:50        NA's:50        NA's:50       
##                                              
##                                              
##                                              
## 
describe(df1)
## # 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 KILOS           50     0 3709. 1024.    145.  1055  -0.997    2.17   790  800.
## # … 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

2. Clasifica cada variable en cualitativa, cuantitativa discreta o cuantitativa continua.

### FECHA: Fecha en la cual se registró la merma.
### MES: Mes en el cual se registró la merma.
### KILOS: Kilos de merma desechados.

variable<-c("FECHA","MES","KILOS")
Type<-c("quantiative (discrete)", "quantitative (continous)", "quantitative (continous)")
table<-data.frame(variable,Type)
knitr::kable(table)
variable Type
FECHA quantiative (discrete)
MES quantitative (continous)
KILOS quantitative (continous)

3. Elige la escala de medición de cada variable

variables <- c("FECHA","MES","KILOS")
tipos <- c("cualitativo", "cuantitativo", "cuantitativo")
escalas <- c("(ordinal)", "(ordinal)","(intervalo)")
table1 <- data.frame (variables, tipos, escalas)
knitr::kable(table1)
variables tipos escalas
FECHA cualitativo (ordinal)
MES cuantitativo (ordinal)
KILOS cuantitativo (intervalo)

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

### R. Remover valores irrelevantes y conversión de datos. Las técnicas elegidas en la limpieza de datos van de acuerdo a las necesidades de la base de dato y el beneficio que generó para el análisis descriptivo.

### Conversión de caracter a fecha
df2<-df1
df2$FECHA<-as.Date(df2$FECHA, format= "%d/%m/%Y")
summary(df2)
##      FECHA                MES                KILOS         X          
##  Min.   :2022-01-11   Length:50          Min.   : 790   Mode:logical  
##  1st Qu.:2022-03-12   Class :character   1st Qu.:3178   NA's:50       
##  Median :2022-05-24   Mode  :character   Median :3925                 
##  Mean   :2022-05-25                      Mean   :3709                 
##  3rd Qu.:2022-08-10                      3rd Qu.:4232                 
##  Max.   :2022-09-21                      Max.   :6140                 
##    X.1            X.2            X.3         
##  Mode:logical   Mode:logical   Mode:logical  
##  NA's:50        NA's:50        NA's:50       
##                                              
##                                              
##                                              
## 
### Eliminar renglones duplicados
df3<-df2
df3<-distinct(df3)

### ¿Cuántos NA's tengo en la base de datos? Primera limpieza
sum(is.na(df3))
## [1] 200
### Eliminar columnas
df4<-df3
df4 <- subset(df4, select =-c (X))
df4 <- subset(df4, select =-c (X.1))
df4 <- subset(df4, select =-c (X.2))
df4 <- subset(df4, select =-c (X.3))

### ¿Cuántos NA's tengo en la base de datos? Segunda limpieza
sum(is.na(df4))
## [1] 0

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

### En la primera parte de la limpieza de datos, vemos que la variable "FECHA" estaba en formato de caracter y se generaron 4 variables adicionales (X a X.3). Al realizar las modificaciones correspondientes de conversión de datos, eliminar columnas y eliminar datos irrelevantes, se muestra que tenemos tres variables esenciales a analizar y un total de 50 registros por variable. Esto nos permitirá realizar un análisis concreto más adelante.

Parte 2

6. Análisis estadístico descriptivo

describe(df4)
## # 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 KILOS           50     0 3709. 1024.    145.  1055  -0.997    2.17   790  800.
## # … 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
count(df4, FECHA, sort = TRUE)
##         FECHA n
## 1  2022-02-18 5
## 2  2022-01-11 2
## 3  2022-01-22 2
## 4  2022-08-29 2
## 5  2022-08-31 2
## 6  2022-02-24 1
## 7  2022-03-03 1
## 8  2022-03-08 1
## 9  2022-03-11 1
## 10 2022-03-16 1
## 11 2022-03-23 1
## 12 2022-03-30 1
## 13 2022-04-04 1
## 14 2022-04-11 1
## 15 2022-04-14 1
## 16 2022-04-21 1
## 17 2022-04-27 1
## 18 2022-05-02 1
## 19 2022-05-09 1
## 20 2022-05-14 1
## 21 2022-05-24 1
## 22 2022-05-25 1
## 23 2022-06-07 1
## 24 2022-06-15 1
## 25 2022-06-20 1
## 26 2022-06-27 1
## 27 2022-07-04 1
## 28 2022-07-11 1
## 29 2022-07-16 1
## 30 2022-07-21 1
## 31 2022-07-27 1
## 32 2022-08-08 1
## 33 2022-08-10 1
## 34 2022-08-11 1
## 35 2022-08-13 1
## 36 2022-08-15 1
## 37 2022-08-22 1
## 38 2022-08-30 1
## 39 2022-09-05 1
## 40 2022-09-07 1
## 41 2022-09-15 1
## 42 2022-09-21 1
count(df4, MES, sort = TRUE)
##          MES  n
## 1     AGOSTO 11
## 2    FEBRERO  6
## 3      MARZO  6
## 4      ABRIL  5
## 5      JULIO  5
## 6       MAYO  5
## 7      ENERO  4
## 8      JUNIO  4
## 9 SEPTIEMBRE  4
count(df4, KILOS, sort = TRUE)
##    KILOS n
## 1   3140 2
## 2   3810 2
## 3   4190 2
## 4   4200 2
## 5    790 1
## 6    810 1
## 7   1040 1
## 8   2130 1
## 9   2480 1
## 10  2680 1
## 11  2830 1
## 12  2950 1
## 13  2980 1
## 14  2990 1
## 15  3050 1
## 16  3290 1
## 17  3410 1
## 18  3590 1
## 19  3650 1
## 20  3680 1
## 21  3690 1
## 22  3739 1
## 23  3780 1
## 24  3870 1
## 25  3920 1
## 26  3930 1
## 27  3940 1
## 28  3960 1
## 29  3967 1
## 30  4000 1
## 31  4050 1
## 32  4130 1
## 33  4210 1
## 34  4240 1
## 35  4260 1
## 36  4270 1
## 37  4310 1
## 38  4330 1
## 39  4380 1
## 40  4510 1
## 41  4680 1
## 42  4770 1
## 43  5010 1
## 44  5080 1
## 45  5230 1
## 46  6140 1
### Total de kilos de merma
totkilos = colSums (df4[3])
totkilos
##  KILOS 
## 185426
tibble(df4)
## # A tibble: 50 × 3
##    FECHA      MES     KILOS
##    <date>     <chr>   <int>
##  1 2022-01-11 ENERO    5080
##  2 2022-01-11 ENERO    3810
##  3 2022-01-22 ENERO    2990
##  4 2022-01-22 ENERO    2680
##  5 2022-02-18 FEBRERO  3650
##  6 2022-02-18 FEBRERO  4380
##  7 2022-02-18 FEBRERO  3870
##  8 2022-02-18 FEBRERO  3590
##  9 2022-02-18 FEBRERO  3410
## 10 2022-02-24 FEBRERO  3930
## # … with 40 more rows
## 6.1 Tabla de frecuencia (1)
df4<-data.frame(df4$KILOS)
df4
##    df4.KILOS
## 1       5080
## 2       3810
## 3       2990
## 4       2680
## 5       3650
## 6       4380
## 7       3870
## 8       3590
## 9       3410
## 10      3930
## 11      4000
## 12      4190
## 13      2980
## 14      3290
## 15      4200
## 16      3810
## 17      3940
## 18      4190
## 19      2950
## 20      3690
## 21      4050
## 22      4310
## 23      4770
## 24      3680
## 25      6140
## 26      4510
## 27      4680
## 28      4330
## 29      5010
## 30      4260
## 31      5230
## 32      2130
## 33      4130
## 34      3920
## 35      3960
## 36      3140
## 37      4210
## 38      3140
## 39      3780
## 40      4240
## 41      4200
## 42      4270
## 43       810
## 44      1040
## 45      2480
## 46       790
## 47      3050
## 48      2830
## 49      3967
## 50      3739
df5<-
  data.frame(
    MES = c(
      "ENERO",
      "FEBRERO",
      "MARZO",
      "ABRIL",
      "MAYO",
      "JUNIO",
      "JULIO",
      "AGOSTO",
      "SEPTIEMBRE",
      "TOTAL DE MERMA"
    ),
    KILOS = c(
      "14,560",
      "22,830",
      "22,470",
      "18,820",
      "23,410",
      "18,280",
      "19,370",
      "32,100",
      "13,586",
      "185,426"
    )
  )
df5
##               MES   KILOS
## 1           ENERO  14,560
## 2         FEBRERO  22,830
## 3           MARZO  22,470
## 4           ABRIL  18,820
## 5            MAYO  23,410
## 6           JUNIO  18,280
## 7           JULIO  19,370
## 8          AGOSTO  32,100
## 9      SEPTIEMBRE  13,586
## 10 TOTAL DE MERMA 185,426
## 6.2 Tabla cruzada (1)

table(df5$KILOS, df5$MES)
##          
##           ABRIL AGOSTO ENERO FEBRERO JULIO JUNIO MARZO MAYO SEPTIEMBRE
##   13,586      0      0     0       0     0     0     0    0          1
##   14,560      0      0     1       0     0     0     0    0          0
##   18,280      0      0     0       0     0     1     0    0          0
##   18,820      1      0     0       0     0     0     0    0          0
##   185,426     0      0     0       0     0     0     0    0          0
##   19,370      0      0     0       0     1     0     0    0          0
##   22,470      0      0     0       0     0     0     1    0          0
##   22,830      0      0     0       1     0     0     0    0          0
##   23,410      0      0     0       0     0     0     0    1          0
##   32,100      0      1     0       0     0     0     0    0          0
##          
##           TOTAL DE MERMA
##   13,586               0
##   14,560               0
##   18,280               0
##   18,820               0
##   185,426              1
##   19,370               0
##   22,470               0
##   22,830               0
##   23,410               0
##   32,100               0
## 6.3 Gráficos de datos cuantitativos y cualitativos (2)

### Importar base de datos
df6 <-read.csv(file.choose())
summary(df6)
##     MES_num      MES                KILOS      
##  Min.   :1   Length:9           Min.   :13586  
##  1st Qu.:3   Class :character   1st Qu.:18280  
##  Median :5   Mode  :character   Median :19370  
##  Mean   :5                      Mean   :20603  
##  3rd Qu.:7                      3rd Qu.:22830  
##  Max.   :9                      Max.   :32100
### ¿Cuántos NA's tengo en la base de datos?
sum(is.na(df6))
## [1] 0
### Eliminar columnas
df7<-df6
df7 <- subset(df7, select =-c (MES_num))


## 6.3.1 Gráfica de barras

### Gráfica de barras: Merma de producción en kg (Q1-Q3 (2022))
mt1<- tapply(df7$KILOS,df6$MES_num,sum)

barplot(mt1,
        main= "Merma de producción en kg (Q1-Q3 (2022))",
        xlab= "Mes",
        ylab="Merma en kg",
        col= "orange"
)

## 6.3.2 Pie chart

### Importar base de datos
df7 <-read.csv(file.choose())
summary(df7)
##     MES_num       Q                 KILOS      
##  Min.   :1   Length:10          Min.   :13586  
##  1st Qu.:1   Class :character   1st Qu.:18280  
##  Median :2   Mode  :character   Median :19370  
##  Mean   :2                      Mean   :20603  
##  3rd Qu.:3                      3rd Qu.:22830  
##  Max.   :3                      Max.   :32100  
##  NA's   :1                      NA's   :1
### ¿Cuántos NA's tengo en la base de datos?
sum(is.na(df7))
## [1] 2
### Borrar todos los registros NA's de una tabla
df8<-df7
df8<-na.omit(df8)
summary(df8)
##     MES_num       Q                 KILOS      
##  Min.   :1   Length:9           Min.   :13586  
##  1st Qu.:1   Class :character   1st Qu.:18280  
##  Median :2   Mode  :character   Median :19370  
##  Mean   :2                      Mean   :20603  
##  3rd Qu.:3                      3rd Qu.:22830  
##  Max.   :3                      Max.   :32100
### ¿Cuántos NA's tengo en la base de datos?
sum(is.na(df8))
## [1] 0
### Pie chart: Merma de producción en kg por 'quarters'
pie(table(df8$Q), col=c("lightsalmon2","orange","coral1"),
    main="Merma de producción en kg 2022 (Q1-Q3)")

## 6.4 Gráficos de dispersión (2)

### Importar base de datos
df9<-df8

### Gráfica de dispersión: Total de Merma en kg (Q1-Q3 (2022))
plot(x= df9$KILOS, y=df9$MES)

### Gráfica de dispersión: Merma de producción en kg por 'quarters'
plot(df9$KILOS, horizontal= TRUE)
## Warning in plot.window(...): "horizontal" is not a graphical parameter
## Warning in plot.xy(xy, type, ...): "horizontal" is not a graphical parameter
## Warning in axis(side = side, at = at, labels = labels, ...): "horizontal" is not
## a graphical parameter

## Warning in axis(side = side, at = at, labels = labels, ...): "horizontal" is not
## a graphical parameter
## Warning in box(...): "horizontal" is not a graphical parameter
## Warning in title(...): "horizontal" is not a graphical parameter

7. Propuestas

Propuesta 1: De acuerdo al cálculo de merma total, se generaron 185,426 kilos de Enero a Septiembre del 2022. En el análisis se muestra un incremento de producción de merma del 60.34%. Podemos suponer que este incremento se debe al aumento de la industria automotriz en producción, exportaciones y ventas internas (El Economista, 2022). Esto para FORM significaría que tuvieron un aumento en pedidos y por ende, hubo un descuido en los procesos de calidad y producción. Como propuesta de mejora, se sugeriría llevar un control puntual del manejo de mercancía a través de tecnologías digitales. Esto a través de un control puntual de cuánto se está desperdiciando para cada producto o cliente y definir un valor máximo de merma a poder generar.

Propuesta 2: Como segundo plan de acción, se recomienda identificar la causa de la merma, es decir, saber qué recursos se merman. Esto con el objetivo de identificar qué es lo que genera esta pérdida y trabajar sobre ella para evitar que se repita.

8. Conclusiones

De acuerdo a la limpieza de datos realizada, vemos que es importante considerar los alcances y dificultades que pueden traer una base de datos sucia. Por esto, ahora logramos ver un análisis limpio con la información necesaria, sin datos duplicados, sin información irrelevante y con una mayor facilidad de interpretación. Gracias a este análisis, se tuvo un acercamiento a cuáles son las principales áreas de oportunidad de la empresa en cuanto a merma dentro del proceso productivo y pudimos entender los principales alcances que tienen dentro de la misma. En el apartado de propuestas, se presentan algunos puntos que podrían implementar para tener un cambio perecedero dentro de su proceso de trabajo. Sin embargo, sería importante considerar que para tener un cambio significativo, es necesario darle importancia al correcto almacenamiento de datos y procesamiento de los mismos, pues éstas son las bases de una ágil interpretación de datos, generando así una mejor toma de decisiones y por ende, un correcto manejo de la información.

9. Referencias

Ana Karen García. (2022, September 8). Industria automotriz anota un buen agosto: crecen producción, exportaciones y ventas internas. El Economista; El Economista. https://www.eleconomista.com.mx/empresas/Industria-automotriz-anota-un-buen-agosto-crecen-produccion-exportaciones-y-ventas-internas-20220907-0031.html

Hernández, F., & Usuga, O. (2022). 9 Tablas de frecuencia | Manual de R. Retrieved 24 September 2022, from https://fhernanb.github.io/Manual-de-R/tablas.html#ejemplo-tabla-de-frecuencia-relativa-de-una-v%C3%ADa

9 Estilos y formatos de tabla | Tablas y graficos con R y R Studio. (2022). Retrieved 24 September 2022, from https://tables.investigaonline.com/tse-formateo.html

LS0tDQp0aXRsZTogIkFuw6FsaXNpcyBkZSBiYXNlIGRlIGRhdG9zIEZPUk06IE1FUk1BIg0KYXV0aG9yOiAiSmltZW5hIE1pZ3VlbCINCmRhdGU6ICIyMDIyLTA5LTI1Ig0Kb3V0cHV0Og0KICBodG1sX2RvY3VtZW50Og0KICAgIHRvYzogdHJ1ZQ0KICAgIHRvY19mbG9hdDogdHJ1ZQ0KICAgIGNvZGVfZG93bmxvYWQ6IHRydWUNCi0tLQ0KDQo8ZGl2Pg0KPHAgc3R5bGUgPSAndGV4dC1hbGlnbjpjZW50ZXI7Jz4NCjxpbWcgc3JjPSJodHRwczovL21lZGlhLWV4cDEubGljZG4uY29tL2Rtcy9pbWFnZS9DNEQxNkFRRzM3dkZ0MmJpMTdRL3Byb2ZpbGUtZGlzcGxheWJhY2tncm91bmRpbWFnZS1zaHJpbmtfMjAwXzgwMC8wLzE2MzUxNzUwNTg2Njc/ZT0yMTQ3NDgzNjQ3JnY9YmV0YSZ0PVpYSG54eGYzWWVxeHY1X0xTYTlXMHhXakJZMXpVeXljUWY2b0dBR0l5RFEiIGFsdD0iSnV2ZVllbGwiIHdpZHRoPSIzMDBweCI+DQo8L3A+DQo8L2Rpdj4NCg0KIyMgUGFydGUgMQ0KYGBge3J9DQoNCiMjIERlc2NhcmdhciBsaWJyZXLDrWFzDQpsaWJyYXJ5KGZvcmVpZ24pDQpsaWJyYXJ5KGRwbHlyKSAgICAgICAgIyBkYXRhIG1hbmlwdWxhdGlvbiANCmxpYnJhcnkoZm9yY2F0cykgICAgICAjIHRvIHdvcmsgd2l0aCBjYXRlZ29yaWNhbCB2YXJpYWJsZXMNCmxpYnJhcnkoZ2dwbG90MikgICAgICAjIGRhdGEgdmlzdWFsaXphdGlvbg0KbGlicmFyeShyZWFkcikgICAgICAgICMgcmVhZCBzcGVjaWZpYyBjc3YgZmlsZXMNCmxpYnJhcnkoamFuaXRvcikgICAgICAjIGRhdGEgZXhwbG9yYXRpb24gYW5kIGNsZWFuaW5nIA0KbGlicmFyeShIbWlzYykgICAgICAgICMgc2V2ZXJhbCB1c2VmdWwgZnVuY3Rpb25zIGZvciBkYXRhIGFuYWx5c2lzIA0KbGlicmFyeShwc3ljaCkgICAgICAgICMgZnVuY3Rpb25zIGZvciBtdWx0aXZhcmlhdGUgYW5hbHlzaXMgDQpsaWJyYXJ5KG5hbmlhcikgICAgICAgIyBzdW1tYXJpZXMgYW5kIHZpc3VhbGl6YXRpb24gb2YgbWlzc2luZyB2YWx1ZXMgTkFzDQpsaWJyYXJ5KGRsb29rcikgICAgICAgIyBzdW1tYXJpZXMgYW5kIHZpc3VhbGl6YXRpb24gb2YgbWlzc2luZyB2YWx1ZXMgTkFzDQpsaWJyYXJ5KGNvcnJwbG90KSAgICAgIyBjb3JyZWxhdGlvbiBwbG90cw0KbGlicmFyeShqdG9vbHMpICAgICAgICMgcHJlc2VudGF0aW9uIG9mIHJlZ3Jlc3Npb24gYW5hbHlzaXMgDQpsaWJyYXJ5KGxtdGVzdCkgICAgICAgIyBkaWFnbm9zdGljIGNoZWNrcyAtIGxpbmVhciByZWdyZXNzaW9uIGFuYWx5c2lzIA0KbGlicmFyeShjYXIpICAgICAgICAgICMgZGlhZ25vc3RpYyBjaGVja3MgLSBsaW5lYXIgcmVncmVzc2lvbiBhbmFseXNpcw0KbGlicmFyeShvbHNycikgICAgICAgICMgZGlhZ25vc3RpYyBjaGVja3MgLSBsaW5lYXIgcmVncmVzc2lvbiBhbmFseXNpcyANCmxpYnJhcnkoa2FibGVFeHRyYSkgICAjIEhUTUwgdGFibGUgYXR0cmlidXRlcw0KbGlicmFyeShnbW9kZWxzKQ0KbGlicmFyeShvcGVueGxzeCkNCmxpYnJhcnkoY3Jvc3N0YWJsZSkNCmBgYA0KDQojIyAxLiDCv0N1w6FudGFzIHZhcmlhYmxlcyB5IGN1w6FudG9zIHJlZ2lzdHJvcyB0aWVuZSBsYSBiYXNlIGRlIGRhdG9zPw0KYGBge3J9DQoNCiMjIyBJbXBvcnRhciBiYXNlIGRlIGRhdG9zDQpkZjEgPC1yZWFkLmNzdihmaWxlLmNob29zZSgpKQ0Kc3VtbWFyeShkZjEpDQpkZXNjcmliZShkZjEpDQpgYGANCg0KIyMgMi4gQ2xhc2lmaWNhIGNhZGEgdmFyaWFibGUgZW4gY3VhbGl0YXRpdmEsIGN1YW50aXRhdGl2YSBkaXNjcmV0YSBvIGN1YW50aXRhdGl2YSBjb250aW51YS4NCmBgYHtyfQ0KDQojIyMgRkVDSEE6IEZlY2hhIGVuIGxhIGN1YWwgc2UgcmVnaXN0csOzIGxhIG1lcm1hLg0KIyMjIE1FUzogTWVzIGVuIGVsIGN1YWwgc2UgcmVnaXN0csOzIGxhIG1lcm1hLg0KIyMjIEtJTE9TOiBLaWxvcyBkZSBtZXJtYSBkZXNlY2hhZG9zLg0KDQp2YXJpYWJsZTwtYygiRkVDSEEiLCJNRVMiLCJLSUxPUyIpDQpUeXBlPC1jKCJxdWFudGlhdGl2ZSAoZGlzY3JldGUpIiwgInF1YW50aXRhdGl2ZSAoY29udGlub3VzKSIsICJxdWFudGl0YXRpdmUgKGNvbnRpbm91cykiKQ0KdGFibGU8LWRhdGEuZnJhbWUodmFyaWFibGUsVHlwZSkNCmtuaXRyOjprYWJsZSh0YWJsZSkNCmBgYA0KDQojIyAzLiBFbGlnZSBsYSBlc2NhbGEgZGUgbWVkaWNpw7NuIGRlIGNhZGEgdmFyaWFibGUNCmBgYHtyfQ0KDQp2YXJpYWJsZXMgPC0gYygiRkVDSEEiLCJNRVMiLCJLSUxPUyIpDQp0aXBvcyA8LSBjKCJjdWFsaXRhdGl2byIsICJjdWFudGl0YXRpdm8iLCAiY3VhbnRpdGF0aXZvIikNCmVzY2FsYXMgPC0gYygiKG9yZGluYWwpIiwgIihvcmRpbmFsKSIsIihpbnRlcnZhbG8pIikNCnRhYmxlMSA8LSBkYXRhLmZyYW1lICh2YXJpYWJsZXMsIHRpcG9zLCBlc2NhbGFzKQ0Ka25pdHI6OmthYmxlKHRhYmxlMSkNCmBgYA0KDQojIyA0LiBBcGxpY2EgYWwgbWVub3MgMiB0w6ljbmljYXMgZGUgbGltcGllemEgZGUgYmFzZXMgZGUgZGF0b3MgeSBleHBsw61jYWxhcyBicmV2ZW1lbnRlLiDCv1BvciBxdcOpIHJlYWxpemFzdGUgZXNhcyB0w6ljbmljYXM/DQpgYGB7cn0NCg0KIyMjIFIuIFJlbW92ZXIgdmFsb3JlcyBpcnJlbGV2YW50ZXMgeSBjb252ZXJzacOzbiBkZSBkYXRvcy4gTGFzIHTDqWNuaWNhcyBlbGVnaWRhcyBlbiBsYSBsaW1waWV6YSBkZSBkYXRvcyB2YW4gZGUgYWN1ZXJkbyBhIGxhcyBuZWNlc2lkYWRlcyBkZSBsYSBiYXNlIGRlIGRhdG8geSBlbCBiZW5lZmljaW8gcXVlIGdlbmVyw7MgcGFyYSBlbCBhbsOhbGlzaXMgZGVzY3JpcHRpdm8uDQoNCiMjIyBDb252ZXJzacOzbiBkZSBjYXJhY3RlciBhIGZlY2hhDQpkZjI8LWRmMQ0KZGYyJEZFQ0hBPC1hcy5EYXRlKGRmMiRGRUNIQSwgZm9ybWF0PSAiJWQvJW0vJVkiKQ0Kc3VtbWFyeShkZjIpDQoNCiMjIyBFbGltaW5hciByZW5nbG9uZXMgZHVwbGljYWRvcw0KZGYzPC1kZjINCmRmMzwtZGlzdGluY3QoZGYzKQ0KDQojIyMgwr9DdcOhbnRvcyBOQSdzIHRlbmdvIGVuIGxhIGJhc2UgZGUgZGF0b3M/IFByaW1lcmEgbGltcGllemENCnN1bShpcy5uYShkZjMpKQ0KDQojIyMgRWxpbWluYXIgY29sdW1uYXMNCmRmNDwtZGYzDQpkZjQgPC0gc3Vic2V0KGRmNCwgc2VsZWN0ID0tYyAoWCkpDQpkZjQgPC0gc3Vic2V0KGRmNCwgc2VsZWN0ID0tYyAoWC4xKSkNCmRmNCA8LSBzdWJzZXQoZGY0LCBzZWxlY3QgPS1jIChYLjIpKQ0KZGY0IDwtIHN1YnNldChkZjQsIHNlbGVjdCA9LWMgKFguMykpDQoNCiMjIyDCv0N1w6FudG9zIE5BJ3MgdGVuZ28gZW4gbGEgYmFzZSBkZSBkYXRvcz8gU2VndW5kYSBsaW1waWV6YQ0Kc3VtKGlzLm5hKGRmNCkpDQpgYGANCg0KIyMgNS4gSW5jbHV5ZSB1bmEgYnJldmUgcmVmbGV4acOzbiBkZSBsYSBhY3RpdmlkYWQuDQpgYGB7cn0NCiMjIyBFbiBsYSBwcmltZXJhIHBhcnRlIGRlIGxhIGxpbXBpZXphIGRlIGRhdG9zLCB2ZW1vcyBxdWUgbGEgdmFyaWFibGUgIkZFQ0hBIiBlc3RhYmEgZW4gZm9ybWF0byBkZSBjYXJhY3RlciB5IHNlIGdlbmVyYXJvbiA0IHZhcmlhYmxlcyBhZGljaW9uYWxlcyAoWCBhIFguMykuIEFsIHJlYWxpemFyIGxhcyBtb2RpZmljYWNpb25lcyBjb3JyZXNwb25kaWVudGVzIGRlIGNvbnZlcnNpw7NuIGRlIGRhdG9zLCBlbGltaW5hciBjb2x1bW5hcyB5IGVsaW1pbmFyIGRhdG9zIGlycmVsZXZhbnRlcywgc2UgbXVlc3RyYSBxdWUgdGVuZW1vcyB0cmVzIHZhcmlhYmxlcyBlc2VuY2lhbGVzIGEgYW5hbGl6YXIgeSB1biB0b3RhbCBkZSA1MCByZWdpc3Ryb3MgcG9yIHZhcmlhYmxlLiBFc3RvIG5vcyBwZXJtaXRpcsOhIHJlYWxpemFyIHVuIGFuw6FsaXNpcyBjb25jcmV0byBtw6FzIGFkZWxhbnRlLg0KYGBgDQoNCg0KIyMgUGFydGUgMg0KDQojIyA2LiBBbsOhbGlzaXMgZXN0YWTDrXN0aWNvIGRlc2NyaXB0aXZvDQpgYGB7cn0NCmRlc2NyaWJlKGRmNCkNCg0KY291bnQoZGY0LCBGRUNIQSwgc29ydCA9IFRSVUUpDQpjb3VudChkZjQsIE1FUywgc29ydCA9IFRSVUUpDQpjb3VudChkZjQsIEtJTE9TLCBzb3J0ID0gVFJVRSkNCg0KIyMjIFRvdGFsIGRlIGtpbG9zIGRlIG1lcm1hDQp0b3RraWxvcyA9IGNvbFN1bXMgKGRmNFszXSkNCnRvdGtpbG9zDQoNCnRpYmJsZShkZjQpDQoNCiMjIDYuMSBUYWJsYSBkZSBmcmVjdWVuY2lhICgxKQ0KZGY0PC1kYXRhLmZyYW1lKGRmNCRLSUxPUykNCmRmNA0KDQpkZjU8LQ0KICBkYXRhLmZyYW1lKA0KICAgIE1FUyA9IGMoDQogICAgICAiRU5FUk8iLA0KICAgICAgIkZFQlJFUk8iLA0KICAgICAgIk1BUlpPIiwNCiAgICAgICJBQlJJTCIsDQogICAgICAiTUFZTyIsDQogICAgICAiSlVOSU8iLA0KICAgICAgIkpVTElPIiwNCiAgICAgICJBR09TVE8iLA0KICAgICAgIlNFUFRJRU1CUkUiLA0KICAgICAgIlRPVEFMIERFIE1FUk1BIg0KICAgICksDQogICAgS0lMT1MgPSBjKA0KICAgICAgIjE0LDU2MCIsDQogICAgICAiMjIsODMwIiwNCiAgICAgICIyMiw0NzAiLA0KICAgICAgIjE4LDgyMCIsDQogICAgICAiMjMsNDEwIiwNCiAgICAgICIxOCwyODAiLA0KICAgICAgIjE5LDM3MCIsDQogICAgICAiMzIsMTAwIiwNCiAgICAgICIxMyw1ODYiLA0KICAgICAgIjE4NSw0MjYiDQogICAgKQ0KICApDQpkZjUNCg0KIyMgNi4yIFRhYmxhIGNydXphZGEgKDEpDQoNCnRhYmxlKGRmNSRLSUxPUywgZGY1JE1FUykNCg0KIyMgNi4zIEdyw6FmaWNvcyBkZSBkYXRvcyBjdWFudGl0YXRpdm9zIHkgY3VhbGl0YXRpdm9zICgyKQ0KDQojIyMgSW1wb3J0YXIgYmFzZSBkZSBkYXRvcw0KZGY2IDwtcmVhZC5jc3YoZmlsZS5jaG9vc2UoKSkNCnN1bW1hcnkoZGY2KQ0KDQojIyMgwr9DdcOhbnRvcyBOQSdzIHRlbmdvIGVuIGxhIGJhc2UgZGUgZGF0b3M/DQpzdW0oaXMubmEoZGY2KSkNCg0KIyMjIEVsaW1pbmFyIGNvbHVtbmFzDQpkZjc8LWRmNg0KZGY3IDwtIHN1YnNldChkZjcsIHNlbGVjdCA9LWMgKE1FU19udW0pKQ0KDQoNCiMjIDYuMy4xIEdyw6FmaWNhIGRlIGJhcnJhcw0KDQojIyMgR3LDoWZpY2EgZGUgYmFycmFzOiBNZXJtYSBkZSBwcm9kdWNjacOzbiBlbiBrZyAoUTEtUTMgKDIwMjIpKQ0KbXQxPC0gdGFwcGx5KGRmNyRLSUxPUyxkZjYkTUVTX251bSxzdW0pDQoNCmJhcnBsb3QobXQxLA0KICAgICAgICBtYWluPSAiTWVybWEgZGUgcHJvZHVjY2nDs24gZW4ga2cgKFExLVEzICgyMDIyKSkiLA0KICAgICAgICB4bGFiPSAiTWVzIiwNCiAgICAgICAgeWxhYj0iTWVybWEgZW4ga2ciLA0KICAgICAgICBjb2w9ICJvcmFuZ2UiDQopDQoNCg0KIyMgNi4zLjIgUGllIGNoYXJ0DQoNCiMjIyBJbXBvcnRhciBiYXNlIGRlIGRhdG9zDQpkZjcgPC1yZWFkLmNzdihmaWxlLmNob29zZSgpKQ0Kc3VtbWFyeShkZjcpDQoNCiMjIyDCv0N1w6FudG9zIE5BJ3MgdGVuZ28gZW4gbGEgYmFzZSBkZSBkYXRvcz8NCnN1bShpcy5uYShkZjcpKQ0KDQojIyMgQm9ycmFyIHRvZG9zIGxvcyByZWdpc3Ryb3MgTkEncyBkZSB1bmEgdGFibGENCmRmODwtZGY3DQpkZjg8LW5hLm9taXQoZGY4KQ0Kc3VtbWFyeShkZjgpDQoNCiMjIyDCv0N1w6FudG9zIE5BJ3MgdGVuZ28gZW4gbGEgYmFzZSBkZSBkYXRvcz8NCnN1bShpcy5uYShkZjgpKQ0KDQojIyMgUGllIGNoYXJ0OiBNZXJtYSBkZSBwcm9kdWNjacOzbiBlbiBrZyBwb3IgJ3F1YXJ0ZXJzJw0KcGllKHRhYmxlKGRmOCRRKSwgY29sPWMoImxpZ2h0c2FsbW9uMiIsIm9yYW5nZSIsImNvcmFsMSIpLA0KICAgIG1haW49Ik1lcm1hIGRlIHByb2R1Y2Npw7NuIGVuIGtnIDIwMjIgKFExLVEzKSIpDQoNCg0KIyMgNi40IEdyw6FmaWNvcyBkZSBkaXNwZXJzacOzbiAoMikNCg0KIyMjIEltcG9ydGFyIGJhc2UgZGUgZGF0b3MNCmRmOTwtZGY4DQoNCiMjIyBHcsOhZmljYSBkZSBkaXNwZXJzacOzbjogVG90YWwgZGUgTWVybWEgZW4ga2cgKFExLVEzICgyMDIyKSkNCnBsb3QoeD0gZGY5JEtJTE9TLCB5PWRmOSRNRVMpDQoNCiMjIyBHcsOhZmljYSBkZSBkaXNwZXJzacOzbjogTWVybWEgZGUgcHJvZHVjY2nDs24gZW4ga2cgcG9yICdxdWFydGVycycNCnBsb3QoZGY5JEtJTE9TLCBob3Jpem9udGFsPSBUUlVFKQ0KYGBgDQoNCiMjIDcuIFByb3B1ZXN0YXMNClByb3B1ZXN0YSAxOiBEZSBhY3VlcmRvIGFsIGPDoWxjdWxvIGRlIG1lcm1hIHRvdGFsLCBzZSBnZW5lcmFyb24gMTg1LDQyNiBraWxvcyBkZSBFbmVybyBhIFNlcHRpZW1icmUgZGVsIDIwMjIuIEVuIGVsIGFuw6FsaXNpcyBzZSBtdWVzdHJhIHVuIGluY3JlbWVudG8gZGUgcHJvZHVjY2nDs24gZGUgbWVybWEgZGVsIDYwLjM0JS4gUG9kZW1vcyBzdXBvbmVyIHF1ZSBlc3RlIGluY3JlbWVudG8gc2UgZGViZSBhbCBhdW1lbnRvIGRlIGxhIGluZHVzdHJpYSBhdXRvbW90cml6IGVuIHByb2R1Y2Npw7NuLCBleHBvcnRhY2lvbmVzIHkgdmVudGFzIGludGVybmFzIChFbCBFY29ub21pc3RhLCAyMDIyKS4gRXN0byBwYXJhIEZPUk0gc2lnbmlmaWNhcsOtYSBxdWUgdHV2aWVyb24gdW4gYXVtZW50byBlbiBwZWRpZG9zIHkgcG9yIGVuZGUsIGh1Ym8gdW4gZGVzY3VpZG8gZW4gbG9zIHByb2Nlc29zIGRlIGNhbGlkYWQgeSBwcm9kdWNjacOzbi4gQ29tbyBwcm9wdWVzdGEgZGUgbWVqb3JhLCBzZSBzdWdlcmlyw61hIGxsZXZhciB1biBjb250cm9sIHB1bnR1YWwgZGVsIG1hbmVqbyBkZSBtZXJjYW5jw61hIGEgdHJhdsOpcyBkZSB0ZWNub2xvZ8OtYXMgZGlnaXRhbGVzLiBFc3RvIGEgdHJhdsOpcyBkZSB1biBjb250cm9sIHB1bnR1YWwgZGUgY3XDoW50byBzZSBlc3TDoSBkZXNwZXJkaWNpYW5kbyBwYXJhIGNhZGEgcHJvZHVjdG8gbyBjbGllbnRlIHkgZGVmaW5pciB1biB2YWxvciBtw6F4aW1vIGRlIG1lcm1hIGEgcG9kZXIgZ2VuZXJhci4gDQoNClByb3B1ZXN0YSAyOiBDb21vIHNlZ3VuZG8gcGxhbiBkZSBhY2Npw7NuLCBzZSByZWNvbWllbmRhIGlkZW50aWZpY2FyIGxhIGNhdXNhIGRlIGxhIG1lcm1hLCBlcyBkZWNpciwgc2FiZXIgcXXDqSByZWN1cnNvcyBzZSBtZXJtYW4uIEVzdG8gY29uIGVsIG9iamV0aXZvIGRlIGlkZW50aWZpY2FyIHF1w6kgZXMgbG8gcXVlIGdlbmVyYSBlc3RhIHDDqXJkaWRhIHkgdHJhYmFqYXIgc29icmUgZWxsYSBwYXJhIGV2aXRhciBxdWUgc2UgcmVwaXRhLg0KDQojIyA4LiBDb25jbHVzaW9uZXMNCkRlIGFjdWVyZG8gYSBsYSBsaW1waWV6YSBkZSBkYXRvcyByZWFsaXphZGEsIHZlbW9zIHF1ZSBlcyBpbXBvcnRhbnRlIGNvbnNpZGVyYXIgbG9zIGFsY2FuY2VzIHkgZGlmaWN1bHRhZGVzIHF1ZSBwdWVkZW4gdHJhZXIgdW5hIGJhc2UgZGUgZGF0b3Mgc3VjaWEuIFBvciBlc3RvLCBhaG9yYSBsb2dyYW1vcyB2ZXIgdW4gYW7DoWxpc2lzIGxpbXBpbyBjb24gbGEgaW5mb3JtYWNpw7NuIG5lY2VzYXJpYSwgc2luIGRhdG9zIGR1cGxpY2Fkb3MsIHNpbiBpbmZvcm1hY2nDs24gaXJyZWxldmFudGUgeSBjb24gdW5hIG1heW9yIGZhY2lsaWRhZCBkZSBpbnRlcnByZXRhY2nDs24uIEdyYWNpYXMgYSBlc3RlIGFuw6FsaXNpcywgc2UgdHV2byB1biBhY2VyY2FtaWVudG8gYSBjdcOhbGVzIHNvbiBsYXMgcHJpbmNpcGFsZXMgw6FyZWFzIGRlIG9wb3J0dW5pZGFkIGRlIGxhIGVtcHJlc2EgZW4gY3VhbnRvIGEgbWVybWEgZGVudHJvIGRlbCBwcm9jZXNvIHByb2R1Y3Rpdm8geSBwdWRpbW9zIGVudGVuZGVyIGxvcyBwcmluY2lwYWxlcyBhbGNhbmNlcyBxdWUgdGllbmVuIGRlbnRybyBkZSBsYSBtaXNtYS4gRW4gZWwgYXBhcnRhZG8gZGUgcHJvcHVlc3Rhcywgc2UgcHJlc2VudGFuIGFsZ3Vub3MgcHVudG9zIHF1ZSBwb2Ryw61hbiBpbXBsZW1lbnRhciBwYXJhIHRlbmVyIHVuIGNhbWJpbyBwZXJlY2VkZXJvIGRlbnRybyBkZSBzdSBwcm9jZXNvIGRlIHRyYWJham8uIFNpbiBlbWJhcmdvLCBzZXLDrWEgaW1wb3J0YW50ZSBjb25zaWRlcmFyIHF1ZSBwYXJhIHRlbmVyIHVuIGNhbWJpbyBzaWduaWZpY2F0aXZvLCBlcyBuZWNlc2FyaW8gZGFybGUgaW1wb3J0YW5jaWEgYWwgY29ycmVjdG8gYWxtYWNlbmFtaWVudG8gZGUgZGF0b3MgeSBwcm9jZXNhbWllbnRvIGRlIGxvcyBtaXNtb3MsIHB1ZXMgw6lzdGFzIHNvbiBsYXMgYmFzZXMgZGUgdW5hIMOhZ2lsIGludGVycHJldGFjacOzbiBkZSBkYXRvcywgZ2VuZXJhbmRvIGFzw60gdW5hIG1lam9yIHRvbWEgZGUgZGVjaXNpb25lcyB5IHBvciBlbmRlLCB1biBjb3JyZWN0byBtYW5lam8gZGUgbGEgaW5mb3JtYWNpw7NuLg0KDQojIyA5LiBSZWZlcmVuY2lhcw0KICBBbmEgS2FyZW4gR2FyY8OtYS4gKDIwMjIsIFNlcHRlbWJlciA4KS4gSW5kdXN0cmlhIGF1dG9tb3RyaXogYW5vdGEgdW4gYnVlbiBhZ29zdG86IGNyZWNlbiBwcm9kdWNjacOzbiwgZXhwb3J0YWNpb25lcyB5IHZlbnRhcyBpbnRlcm5hcy4gRWwgRWNvbm9taXN0YTsgRWwgRWNvbm9taXN0YS4gaHR0cHM6Ly93d3cuZWxlY29ub21pc3RhLmNvbS5teC9lbXByZXNhcy9JbmR1c3RyaWEtYXV0b21vdHJpei1hbm90YS11bi1idWVuLWFnb3N0by1jcmVjZW4tcHJvZHVjY2lvbi1leHBvcnRhY2lvbmVzLXktdmVudGFzLWludGVybmFzLTIwMjIwOTA3LTAwMzEuaHRtbA0KDQogIEhlcm7DoW5kZXosIEYuLCAmIFVzdWdhLCBPLiAoMjAyMikuIDkgVGFibGFzIGRlIGZyZWN1ZW5jaWEgfCBNYW51YWwgZGUgUi4gUmV0cmlldmVkIDI0IFNlcHRlbWJlciAyMDIyLCBmcm9tIGh0dHBzOi8vZmhlcm5hbmIuZ2l0aHViLmlvL01hbnVhbC1kZS1SL3RhYmxhcy5odG1sI2VqZW1wbG8tdGFibGEtZGUtZnJlY3VlbmNpYS1yZWxhdGl2YS1kZS11bmEtdiVDMyVBRGENCiAgDQogIDkgRXN0aWxvcyB5IGZvcm1hdG9zIGRlIHRhYmxhIHwgVGFibGFzIHkgZ3JhZmljb3MgY29uIFIgeSBSIFN0dWRpby4gKDIwMjIpLiBSZXRyaWV2ZWQgMjQgU2VwdGVtYmVyIDIwMjIsIGZyb20gaHR0cHM6Ly90YWJsZXMuaW52ZXN0aWdhb25saW5lLmNvbS90c2UtZm9ybWF0ZW8uaHRtbA0K