FORM
SCRAP
Importar base de datos Scrap
#file.choose()
bd <- read.csv("/Users/joseramonvazquezguzman/Documents/Tecnológico de Monterrey/Septimo semestre/Analítica de datos /RETO/Bases de datos (limpias) CSV /FORM - Scrap Limpia .csv")
Cantidad de productos por día
bd$Fecha<- as.Date(bd$Fecha,format = "%d/%m/%Y")
plot(bd$Fecha, bd$Cantidad)
summary(bd)
## Referencia Fecha Hora Producto
## Length:250 Min. :2022-08-01 Length:250 Length:250
## Class :character 1st Qu.:2022-08-11 Class :character Class :character
## Mode :character Median :2022-08-19 Mode :character Mode :character
## Mean :2022-08-17
## 3rd Qu.:2022-08-25
## Max. :2022-08-31
## Cantidad Unidad.de.medida Ubicación.de.origen Ubicación.de.desecho
## Min. : 0.000 Length:250 Length:250 Length:250
## 1st Qu.: 1.000 Class :character Class :character Class :character
## Median : 2.000 Mode :character Mode :character Mode :character
## Mean : 6.696
## 3rd Qu.: 7.000
## Max. :96.000
## Estado
## Length:250
## Class :character
## Mode :character
##
##
##
library(tidyverse)
## ── Attaching packages ─────────────────────────────────────── tidyverse 1.3.2 ──
## ✔ ggplot2 3.3.6 ✔ purrr 0.3.4
## ✔ tibble 3.1.8 ✔ dplyr 1.0.10
## ✔ tidyr 1.2.0 ✔ stringr 1.4.1
## ✔ readr 2.1.2 ✔ forcats 0.5.2
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag() masks stats::lag()

library(janitor)
##
## Attaching package: 'janitor'
##
## The following objects are masked from 'package:stats':
##
## chisq.test, fisher.test
Número de variables y registros en base de datos
library(psych)
##
## Attaching package: 'psych'
## The following objects are masked from 'package:ggplot2':
##
## %+%, alpha
describe(bd)
## Warning in FUN(newX[, i], ...): no non-missing arguments to min; returning Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to max; returning -Inf
## vars n mean sd median trimmed mad min max range
## Referencia* 1 250 125.50 72.31 125.5 125.50 92.66 1 250 249
## Fecha 2 250 NaN NA NA NaN NA Inf -Inf -Inf
## Hora* 3 250 125.50 72.31 125.5 125.50 92.66 1 250 249
## Producto* 4 250 44.38 24.72 45.0 44.12 25.95 1 95 94
## Cantidad 5 250 6.70 11.85 2.0 3.88 1.48 0 96 96
## Unidad.de.medida* 6 250 1.00 0.00 1.0 1.00 0.00 1 1 0
## Ubicación.de.origen* 7 250 2.48 0.85 3.0 2.60 0.00 1 3 2
## Ubicación.de.desecho* 8 250 1.00 0.00 1.0 1.00 0.00 1 1 0
## Estado* 9 250 1.00 0.00 1.0 1.00 0.00 1 1 0
## skew kurtosis se
## Referencia* 0.00 -1.21 4.57
## Fecha NA NA NA
## Hora* 0.00 -1.21 4.57
## Producto* 0.01 -0.79 1.56
## Cantidad 4.12 21.14 0.75
## Unidad.de.medida* NaN NaN 0.00
## Ubicación.de.origen* -1.10 -0.70 0.05
## Ubicación.de.desecho* NaN NaN 0.00
## Estado* NaN NaN 0.00
str(bd)
## 'data.frame': 250 obs. of 9 variables:
## $ Referencia : chr "SP/08731" "SP/08730" "SP/08729" "SP/08728" ...
## $ Fecha : Date, format: "2022-08-31" "2022-08-31" ...
## $ Hora : chr "14:55:40" "14:49:25" "13:49:29" "09:30:07" ...
## $ 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" ...
tabyl(bd, Producto, Ubicación.de.origen)
## Producto
## [2065WY AS 30 99 0000 00 000 TAPA - BOX 2064WY] BOX 2064WY
## [241B EXPORT CAJA] 241B. Export. Caja.
## [341332 CELDA - U611 & U625] 341332. U611. U625. Celda Troquelada.
## [341332 CHAROLA - U611 & U625] 341332. U611. U625. Charola Troquelada.
## [341332 DIVISOR - U611 & U625] 341332. U611. U625. Divisor Troquelado.
## [357790-TAPA] 357790. Tapa.
## [358268-CAJA] 358268-CAJA
## [358268-TAPA] 358268-TAPA
## [428579 AS 30 99 0000 00 000 INSERTO- FORD DAMPER] 14306. Damper Ford DTP. Inserto.
## [428818 AS 30 99 0000 00 000 INSERTO - CHRYSLER INSERT DJ] CHRYSLER INSERT DJ PART 694087
## [429296 AS 30 99 0000 00 000 INSERTO - INSERT TMC 150 TESLA] 14783. TMC150. Inserto.
## [446265 AS 30 99 0000 00 000 CAPA INTERMEDIA- PAD 43X36 DAIMLER] 14454. Daimler Pad 43 X 36
## [467.416-24 COMPARTIMENT INSERT 535X335X221MM CC ESD] Refacciones. P1. Celdado.
## [496455 FS 30 99 0000 00 000 CARTÓN - BOX 0371813] BOX 0371813
## [500033 AS 30 99 0000 00 000 INSERTO - Inserto FORD China 500033] 17397. 500033. FORD China. Inserto.
## [642762 PACKING, SHEET, 565.2X742.9 - INSERT 642762] 642762. Pad. S.M.
## [643920 CART, SOM, 746.8X569.0X292.1, RSC - BOX 643920 STABOMAT] 13891. 643920. Stabomat. Caja.
## [647713] 647713. Caja.
## [938830 FS 30 99 0000 00 000 CARTÓN - SIZE 24"] 24". Caja Terminada.
## [939069 FS 30 99 0000 00 000 CARTÓN -BOX 939069 34"] 34". Caja Terminada.
## [A - CELDA SUDAFRICA BMW G01 LCI] Sudafrica. A. Pieza.
## [B - CELDA SUDAFRICA BMW G01 LCI] Sudáfrica. B. Pieza.
## [BACKFRAME 60% CUELLO ARMADO] 18805. 60% Backframe. Cuello Armado.
## [BACKFRAME 60% TAPA BASE] 18271. 60% Backframe. Tapa Base.
## [BOX 143907 - CELDA] 143907. Solares. Celda Troquelada.
## [BOX 143907 - TAPA] 143907. Solares. Tapa Troquelada.
## [C - CELDA SUDAFRICA BMW G01 LCI] Sudáfrica. C. Pieza.
## [CAJA ( ARMREST / HR REAR) TMC 110 MODEL Y] 19148. Modelo Y. TMC0110. Armrest & Rear & Center. Caja
## [CAJA 695] N61506695. Caja.
## [CAJA 726] N61506726 CAJA
## [CAJA 734949] CAJA 734949
## [CAJA 784] 784. Kit. Caja.
## [CAJA 95161] 19079. 95161. Kit. Caja.
## [Caja backup canastilla gris] CAJA DE CARTÓN BACK UP CANASTILLA GRIS- P3
## [CAJA INDUSTRIAL 16" ROTATIVA] 16". Lamina Troquelada.
## [CAJA INDUSTRIAL 24" ROTATIVA COMPLETA] 24". Lamina Troquelada.
## [CAJA INDUSTRIAL 34" ROTATIVA] 34". Lamina Troquelada.
## [CAJA INDUSTRIAL 48" CON SELLO (PP)] 48". Lamina Troquelada.
## [CAJA MCV] Toyota. MCV. Caja Troquelada.
## [CAJA RSC DE KIT REFLEX] 857. Reflex. Caja.
## [CAJA RSC SHOCK TOWER] Shock Tower. Caja.
## [CAJA RSC TGTX] TGTX. Caja RSC.
## [CELDA 955061] 955061. Celda Troquelada.
## [Celda Audi coupe] 18892. Coupe. Celda Troquelada.
## [CELDA AUDI Q5] 14096. Audi Q5. Celda Troquelada.
## [CELDA CON MICRO CORUUGAD O EN 32 PORTA ETIQUETA] TR13777 KIT TGTX. Caja + Celda
## [CELDA GM177] 14100. GM177. Celda Troquelada.
## [CELDA VW CHATTANOOGA] Chattanooga. St3. Celda Troquelada.
## [CELL C] 60% Backframe. Separador con Doblez.
## [CHAROLA 955061] 955061. Charola Troquelada.
## [Charola audi coupe] 18890. Coupe. Charola Troquelada.
## [CHAROLA AUDI Q5] 14128. Audi Q5. Charola Troquelada.
## [CHAROLA GM177] 14131. GM177. Charola Troquelada.
## [CHAROLA VW CHATTANOOGA] Chattanooga. St1 y St3. Charola Troquelada.
## [Console cell] Console Lower. Celda Armada.
## [D - CELDA SUDAFRICA BMW G01 LCI] Sudáfrica. D. Pieza.
## [DIVISOR AUDI Q5] 14234. Audi Q5. Divisor Troquelado.
## [DIVISOR CON DOBLEZ VW CHATTANOOGA] Chattanooga. St1 y St3. Divisor Troquelado.
## [DIVISOR GM177] 14238. GM177. Divisor.
## [DIVISOR REFLEX] 857. Reflex. Divisor.
## [DIVISOR ZIGZAG VW CHATTANOOGA] Chattanooga. St1 y St3. Zig Zag Troquelado.
## [E - CELDA SUDAFRICA BMW G01 LCI] Sudáfrica. E. Pieza.
## [F - CELDA SUDAFRICA BMW G01 LCI] Sudáfrica. F. Pieza.
## [HSC P702 ICP] 17215. P558. P702. CD539. ICP. Caja HSC. Pieza.
## [INSERTO 241B EXPORT] 14308. 241B. Export. Inserto.
## [Inserto Nextracker 3.0] Nextracker. 2.0. Damper. Inserto.
## [INSERTO SOLARES] 143907. Solares. Inserto Troquelada.
## [MITAD DE CUELLO SHOCK TOWER] Shock Tower. Mitad Cuello.
## [MQ4A-Dunnage-part2] Kia. Inserto. Pieza.
## [MQ4A-Dunnage-tray] Kia. Charola. Pieza.
## [N61506396 CAJA] N61506396. Caja.
## [N61506396 SEPARADOR] N61506396. Separador.
## [N61506729 SEPARADOR] N61506729. Kit. Separador.
## [N61506747 CAJA] N61506747. Kit. Caja.
## [N61506747 TAPA] N61506747. Kit. Tapa.
## [NEXTRACKER 2.0 DAMPER CUELLO] 18976. Nextracker. 2.0. Damper. Cuello,
## [NEXTRACKER 2.0 DAMPER TAPA DE COROPLAST] Nextracker. 2.0. Damper. Tapa de Coroplast.
## [PTN.WS IP 60 CELL IBT] Y0199489 PTN.WS IP 60 CELL IBT
## [REJILLA DE 16X PARA PIVOT DE TESLA PARA PROCESO DE MTM A PPG] CELDA PIVOTE CONTENEDOR RETORNABLE
## [SEAT BACK CAJA] Seat Back. Caja HSC 1/2
## [SEAT BACK CELDADO] Seat Back. Celda Armada.
## [SEPARADOR 41" X 44" PARA PIVOTE Y SEAT BACK DE MTM A PPG] SEPARADOR PIVOTE CONTENEDOR RETORNABLE
## [SEPARADOR MOTORGEAR] Motorgear. Separador para Celdas.
## [TAPA 695] N61506695. Tapa.
## [TAPA AVANAZAR] Avanzar. Tapa. Pieza.
## [TESLA XDA90 CELDA A] XDA90. A. Pieza.
## [TESLA XDA90 CELDA B] XDA90. B. Pieza.
## [TESLA XDA90 CHAROLA SUAJADA] XDA90. Charola. Pieza.
## [TMC 050 - RSC] Console lower - TMC 050
## [TMC 095] 19162. Modelo Y. TMC095. Front. Caja.
## [TMC XXX] Armrest. Caja RSC.
## [TR11910 CHAROLA C/2 DIV #20 SMOOTH C/32 CAVIDADES] TR11910. U725. DMS. ITB. Charola con ITB.
## [TR12438 TAPA ICP 539 TAPA 2415-2 EN CPARTÓN SENCILLO CORRUGADO] 18840. CD539. Tapa.
## [TR12440 TAPA P558] 18842. P558. Tapa.
## [TR13776 CAJA RSC CK 44 ECT C/ PORTA ETIQUETA] TR13776. Caja con Porta Etiqueta.
## SAB/Calidad/Entrega de PT SAB/Post-Production SAB/Pre-Production
## 1 0 1
## 1 0 0
## 0 0 10
## 0 0 5
## 0 0 5
## 2 0 1
## 2 0 0
## 2 0 0
## 1 0 0
## 1 0 2
## 1 0 0
## 2 0 0
## 1 0 0
## 0 1 0
## 1 0 0
## 3 0 0
## 1 0 1
## 1 0 2
## 1 0 0
## 1 0 0
## 0 0 3
## 0 0 3
## 1 0 0
## 1 0 0
## 0 0 3
## 0 0 1
## 0 0 3
## 0 0 1
## 0 1 0
## 0 1 0
## 0 0 1
## 0 2 0
## 0 0 1
## 0 1 0
## 0 0 12
## 0 0 3
## 0 0 11
## 0 0 7
## 0 0 2
## 0 1 0
## 2 0 0
## 0 0 1
## 0 0 6
## 0 0 3
## 0 0 10
## 1 0 0
## 0 0 9
## 0 0 1
## 1 0 0
## 0 0 5
## 0 0 2
## 0 0 5
## 0 0 5
## 0 0 5
## 2 0 0
## 0 0 3
## 0 0 4
## 0 0 4
## 0 0 5
## 0 1 0
## 0 0 4
## 0 0 2
## 0 0 3
## 0 0 4
## 2 0 0
## 3 0 1
## 0 0 1
## 0 0 1
## 0 0 3
## 0 0 3
## 1 1 0
## 0 1 0
## 1 0 0
## 3 0 0
## 2 0 0
## 2 0 0
## 2 0 0
## 1 0 0
## 1 0 0
## 2 0 0
## 1 0 0
## 1 0 0
## 1 0 0
## 0 1 0
## 0 0 2
## 0 0 3
## 0 0 1
## 0 0 2
## 0 0 1
## 1 0 1
## 0 0 1
## 3 0 0
## 0 1 0
## 1 0 0
## 0 1 0
Tipos de Variables Existentes
variable<-c("Referencia","Fecha", "Hora", "Producto", "Cantidad", "Unidad.de.medida", "Ubicación.de.origen", "Ubicación.de.desecho")
type<-c("Cualitativo (nominal)","Cuantitativo (disccreta)", "Cuantitativo (discreta)", "Cualitativo (nominal)","Cuantitativo (Continua)", "Cualitativo (nominal)", "Cualitativo (nominal)","Cualitativo (nominal)")
Escala_de_Medición<-c("Numero", "Fecha", "Categoría", "Kg", "Medición", "Posición", "Posición", "Estado")
table<-data.frame(variable,type)
knitr::kable(table)
| Referencia |
Cualitativo (nominal) |
| Fecha |
Cuantitativo (disccreta) |
| Hora |
Cuantitativo (discreta) |
| Producto |
Cualitativo (nominal) |
| Cantidad |
Cuantitativo (Continua) |
| Unidad.de.medida |
Cualitativo (nominal) |
| Ubicación.de.origen |
Cualitativo (nominal) |
| Ubicación.de.desecho |
Cualitativo (nominal) |
La base de datos cuenta con 2259 regitros y 9 variables
Escala de medición
Escala_de_medición <-c("Número", "Fecha","Categoría", "Kg", "Medición", "Posición","Posición", "Estado")
Eliminar columnas que no se usan
bd1 <- bd
bd1<- subset(bd1, select = -c (Referencia, Producto, Unidad.de.medida, Hora, Ubicación.de.desecho, Estado))
bd2 <- bd
bd2<- subset(bd2, select = -c (Referencia, Producto, Unidad.de.medida, Hora, Ubicación.de.desecho, Estado))
media <- mean(bd2$Cantidad)
mediana <- median(bd2$Cantidad)
mode <- function (x) {
ux <- unique(x)
ux [which.max(tabulate(match(x,ux)))]
}
mode <- mode(bd2$Cantidad)
mode
## [1] 1
hist(bd2$Cantidad)

Grafica ciuantitativa
count(bd2, Ubicación.de.origen, sort = TRUE)
## Ubicación.de.origen n
## 1 SAB/Pre-Production 179
## 2 SAB/Calidad/Entrega de PT 58
## 3 SAB/Post-Production 13
ggplot(bd2, aes(x=media, y= Ubicación.de.origen)) +
geom_bar(stat="identity", fill="red") + scale_fill_grey() + # Add bars to the plot
labs(title = "Ubicación de origen", # Add a title
subtitle = "Scrap empresa FORM", # Add a subtitle
caption = "Relación", # Add a caption
x = "x")

count(bd1, Fecha, sort = TRUE)
## Fecha n
## 1 2022-08-16 24
## 2 2022-08-24 21
## 3 2022-08-19 17
## 4 2022-08-30 17
## 5 2022-08-03 13
## 6 2022-08-10 13
## 7 2022-08-12 12
## 8 2022-08-26 12
## 9 2022-08-27 12
## 10 2022-08-22 11
## 11 2022-08-25 11
## 12 2022-08-31 10
## 13 2022-08-17 9
## 14 2022-08-20 9
## 15 2022-08-29 8
## 16 2022-08-05 7
## 17 2022-08-06 7
## 18 2022-08-04 6
## 19 2022-08-15 6
## 20 2022-08-02 5
## 21 2022-08-09 5
## 22 2022-08-13 5
## 23 2022-08-08 4
## 24 2022-08-11 3
## 25 2022-08-01 2
## 26 2022-08-23 1
Propuesta
Como se puede ver en la gráfica de dispersión, tenemos a lo largo
del mes una cantidad baja de scrap que podemos aprovechar para reciclar,
por ende lo que se propone es mantenerse así o incluso disminuir la
cantidad de materia reciclada que produce la empresa, con usos que
signifiquen otros aprovechamiento dentro de la organización,
significando un buen aprovechamiento de los recursos.

Producción
Importar base de datos
#file.choose()
bd <- read.csv("/Users/joseramonvazquezguzman/Documents/Tecnológico de Monterrey/Septimo semestre/Analítica de datos /RETO/Bases de datos (limpias) CSV /FormProducción.csv")
Entender la base de datos
resumen <- summary(bd)
resumen
## No. CLIENTE ID.FORM PRODUCTO
## Min. : 1.0 Length:2568 Length:2568 Length:2568
## 1st Qu.: 25.0 Class :character Class :character Class :character
## Median : 50.0 Mode :character Mode :character Mode :character
## Mean : 50.8
## 3rd Qu.: 75.0
## Max. :121.0
## NA's :8
## FECHA PIEZAS.PROG. TMO..MIN. HR..FIN
## Length:2568 Length:2568 Length:2568 Length:2568
## Class :character Class :character Class :character Class :character
## Mode :character Mode :character Mode :character Mode :character
##
##
##
##
## ESTACION.ARRANQUE Laminas.procesadas INICIO.SEP.UP fin.de.set.up
## Length:2568 Min. : 0.0 Length:2568 Length:2568
## Class :character 1st Qu.: 0.5 Class :character Class :character
## Mode :character Median : 60.0 Mode :character Mode :character
## Mean : 108.9
## 3rd Qu.: 200.0
## Max. :1125.0
## NA's :593
## INICIO.de.PROCESO FIN.de.PROCESO TIEMPO.CALIDAD TIEMPO.MATERIALES
## Length:2568 Length:2568 Length:2568 Min. : 0.000
## Class :character Class :character Class :character 1st Qu.: 0.000
## Mode :character Mode :character Mode :character Median : 0.000
## Mean : 2.535
## 3rd Qu.: 1.000
## Max. :48.000
## NA's :2243
## MERMAS.Maquinas.
## Min. : 0.000
## 1st Qu.: 0.000
## Median : 1.000
## Mean : 1.626
## 3rd Qu.: 1.000
## Max. :50.000
## NA's :2461
str(bd)
## 'data.frame': 2568 obs. of 17 variables:
## $ No. : int 1 2 3 4 5 6 7 8 9 10 ...
## $ CLIENTE : chr "VARROC" "VARROC" "VARROC" "DENSO" ...
## $ ID.FORM : chr "VL-017-13938" "VL-017-13936" "VL-017-14729" "" ...
## $ PRODUCTO : chr "763 . KIT. CAJA." "747 KIT. CAJA HSC. ( 2 Partes)" "747 KIT. TAPA." "TOYOTA. MCV. Insterto D 2R. CORTE. 1 Golpe = 12 piezas. ( 9 Pza. / Celda)." ...
## $ FECHA : chr "01/08/22" "01/08/22" "01/08/22" "01/08/22" ...
## $ PIEZAS.PROG. : chr "199" "57" "68" "192" ...
## $ TMO..MIN. : chr "15" "10" "10" "15" ...
## $ HR..FIN : chr "09:15:00" "09:25:00" "09:35:00" "09:50:00" ...
## $ ESTACION.ARRANQUE : chr "C1" "C1Y2" "C1Y2" "C1" ...
## $ Laminas.procesadas: int 201 116 69 49 49 801 41 53 53 55 ...
## $ INICIO.SEP.UP : chr "09:00:00" "09:26:00" "10:02:00" "10:12:00" ...
## $ fin.de.set.up : chr "09:12:00" "09:31:00" "10:09:00" "10:17:00" ...
## $ INICIO.de.PROCESO : chr "09:13:00" "09:32:00" "10:09:00" "10:18:00" ...
## $ FIN.de.PROCESO : chr "09:26:00" "09:53:00" "00:00:00" "10:20:00" ...
## $ TIEMPO.CALIDAD : chr "1" "1" "1" "1" ...
## $ TIEMPO.MATERIALES : int NA NA NA NA NA 3 NA NA NA NA ...
## $ MERMAS.Maquinas. : int NA NA NA NA NA NA NA NA NA NA ...
library(psych)
#install.packages("psych")
Tipo de variables
Variable<-c("No.","CLIENTE","ID.FORM ", "P..DUCTO","PIEZAS.P..G.","TMO..MIN.",
"HR..FIN","ESTACION.AR..NQUE","Laminas.Procesadas"," INICIO.SEP.UP",
"FIN.INICIO.DE.SEP.UP","INICIO.de.P....SO", "FIN.de.P....SO","TIEMPO..CALIDAD",
"TIEMPO.MATERIALES","MERMAS.Maquinas.","Date")
Type<-c("Cuantitativa (Discreta)", "Cualitativa", "Cuantitativa (Discreta)", "Cualitativa",
"Cuantitativa (Discreta)","Cuantitativa (Discreta)","Cuantitativa (Discreta)","Cualitativa",
"Cuantitativa (Discreta)","Cuantitativa (Discreta)","Cuantitativa (Discreta)","Cuantitativa (Discreta)",
"Cuantitativa (Discreta)","Cuantitativa (Discreta)","Cuantitativa (Discreta)","Cuantitativa (Discreta)",
"Cuantitativa (Discreta)")
table<-data.frame(Variable,Type)
knitr::kable(table)
| No. |
Cuantitativa (Discreta) |
| CLIENTE |
Cualitativa |
| ID.FORM |
Cuantitativa (Discreta) |
| P..DUCTO |
Cualitativa |
| PIEZAS.P..G. |
Cuantitativa (Discreta) |
| TMO..MIN. |
Cuantitativa (Discreta) |
| HR..FIN |
Cuantitativa (Discreta) |
| ESTACION.AR..NQUE |
Cualitativa |
| Laminas.Procesadas |
Cuantitativa (Discreta) |
| INICIO.SEP.UP |
Cuantitativa (Discreta) |
| FIN.INICIO.DE.SEP.UP |
Cuantitativa (Discreta) |
| INICIO.de.P….SO |
Cuantitativa (Discreta) |
| FIN.de.P….SO |
Cuantitativa (Discreta) |
| TIEMPO..CALIDAD |
Cuantitativa (Discreta) |
| TIEMPO.MATERIALES |
Cuantitativa (Discreta) |
| MERMAS.Maquinas. |
Cuantitativa (Discreta) |
| Date |
Cuantitativa (Discreta) |
Escala_de_Medición <- c("Numero", "Empresa", "ID","Categoria", "Piezas", "Minutos","Tiempo","Maquina","Sobrante","Hora","Hora","Hora","Hora","Tiempo","Tiempo","Mermas","Fecha")
Técnicas de limpieza
Eliminar columnas
bd1 <- bd
bd1<-subset(bd1,select=-c(No.,ID.FORM, HR..FIN, ESTACION.ARRANQUE, INICIO.SEP.UP, fin.de.set.up, INICIO.SEP.UP,INICIO.de.PROCESO, FIN.de.PROCESO, TIEMPO.MATERIALES, MERMAS.Maquinas.))
str(bd1)
## 'data.frame': 2568 obs. of 7 variables:
## $ CLIENTE : chr "VARROC" "VARROC" "VARROC" "DENSO" ...
## $ PRODUCTO : chr "763 . KIT. CAJA." "747 KIT. CAJA HSC. ( 2 Partes)" "747 KIT. TAPA." "TOYOTA. MCV. Insterto D 2R. CORTE. 1 Golpe = 12 piezas. ( 9 Pza. / Celda)." ...
## $ FECHA : chr "01/08/22" "01/08/22" "01/08/22" "01/08/22" ...
## $ PIEZAS.PROG. : chr "199" "57" "68" "192" ...
## $ TMO..MIN. : chr "15" "10" "10" "15" ...
## $ Laminas.procesadas: int 201 116 69 49 49 801 41 53 53 55 ...
## $ TIEMPO.CALIDAD : chr "1" "1" "1" "1" ...
Cambiaarlos NA con ceros
sum(is.na(bd1))
## [1] 593
bd1[is.na(bd1)]<-0
summary(bd1)
## CLIENTE PRODUCTO FECHA PIEZAS.PROG.
## Length:2568 Length:2568 Length:2568 Length:2568
## Class :character Class :character Class :character Class :character
## Mode :character Mode :character Mode :character Mode :character
##
##
##
## TMO..MIN. Laminas.procesadas TIEMPO.CALIDAD
## Length:2568 Min. : 0.00 Length:2568
## Class :character 1st Qu.: 0.00 Class :character
## Mode :character Median : 31.00 Mode :character
## Mean : 83.72
## 3rd Qu.: 122.25
## Max. :1125.00
bd1 <- na.omit(bd1)
summary(bd1)
## CLIENTE PRODUCTO FECHA PIEZAS.PROG.
## Length:2568 Length:2568 Length:2568 Length:2568
## Class :character Class :character Class :character Class :character
## Mode :character Mode :character Mode :character Mode :character
##
##
##
## TMO..MIN. Laminas.procesadas TIEMPO.CALIDAD
## Length:2568 Min. : 0.00 Length:2568
## Class :character 1st Qu.: 0.00 Class :character
## Mode :character Median : 31.00 Mode :character
## Mean : 83.72
## 3rd Qu.: 122.25
## Max. :1125.00
str(bd1)
## 'data.frame': 2568 obs. of 7 variables:
## $ CLIENTE : chr "VARROC" "VARROC" "VARROC" "DENSO" ...
## $ PRODUCTO : chr "763 . KIT. CAJA." "747 KIT. CAJA HSC. ( 2 Partes)" "747 KIT. TAPA." "TOYOTA. MCV. Insterto D 2R. CORTE. 1 Golpe = 12 piezas. ( 9 Pza. / Celda)." ...
## $ FECHA : chr "01/08/22" "01/08/22" "01/08/22" "01/08/22" ...
## $ PIEZAS.PROG. : chr "199" "57" "68" "192" ...
## $ TMO..MIN. : chr "15" "10" "10" "15" ...
## $ Laminas.procesadas: num 201 116 69 49 49 801 41 53 53 55 ...
## $ TIEMPO.CALIDAD : chr "1" "1" "1" "1" ...
Tabla de Frecuencia
#install.packages("epiDisplay")
library(epiDisplay)
## Loading required package: foreign
## Loading required package: survival
## Loading required package: MASS
##
## Attaching package: 'MASS'
## The following object is masked from 'package:dplyr':
##
## select
## Loading required package: nnet
##
## Attaching package: 'epiDisplay'
## The following objects are masked from 'package:psych':
##
## alpha, cs, lookup
## The following object is masked from 'package:ggplot2':
##
## alpha
tab1<-table(bd1$CLIENTE, bd1$TIEMPO.CALIDAD) # A will be rows, B will be columns
tab1
##
## 0 1 1:22 1.40 10 10:00 10:04 10:17 11 11:22
## 5 15 0 0 0 0 0 0 0 0 0
## DENSO 46 37 164 0 0 0 0 0 0 0 0
## HELLA 15 18 48 0 0 0 0 0 0 0 0
## MERIDIAN LIGHTWEIGHT 8 11 23 0 0 1 0 0 0 2 0
## STABILUS 1 133 115 463 0 1 2 1 1 0 1 1
## STABILUS 3 143 68 177 0 0 0 0 0 1 0 0
## STABILUS 3. 1 4 13 0 0 0 0 0 0 0 0
## TRMX 153 80 198 1 0 0 0 0 0 0 0
## VARROC 12 29 114 0 0 1 0 0 0 1 0
## VL-017-14086 0 1 0 0 0 0 0 0 0 0 0
## YANFENG 87 90 181 0 0 2 0 0 0 0 0
##
## 11:43 11:55 12:30 12:45 12:53 17 2 2:15 2:20 2:42 21
## 0 0 0 0 0 0 0 0 0 0 0
## DENSO 0 0 0 0 0 0 1 0 0 0 0
## HELLA 0 0 0 0 0 0 2 0 0 0 0
## MERIDIAN LIGHTWEIGHT 0 0 0 0 0 0 3 0 0 0 0
## STABILUS 1 1 0 1 0 0 0 12 0 0 0 0
## STABILUS 3 0 0 0 0 0 0 6 0 0 0 0
## STABILUS 3. 0 0 0 0 0 0 0 0 0 0 0
## TRMX 0 1 0 1 1 1 5 1 0 0 0
## VARROC 0 0 0 0 0 0 10 0 0 0 1
## VL-017-14086 0 0 0 0 0 0 0 0 0 0 0
## YANFENG 0 0 0 0 0 0 19 0 1 1 0
##
## 22 25 3 3:15 4 5 7 8 8:18 8:38 9 9:05 9:30
## 0 0 0 0 0 0 0 0 0 0 0 0 0
## DENSO 0 0 0 0 0 0 0 0 0 0 0 0 0
## HELLA 0 0 1 0 0 0 0 0 0 0 0 0 0
## MERIDIAN LIGHTWEIGHT 0 0 1 0 0 0 0 0 0 0 0 0 0
## STABILUS 1 0 0 3 1 2 2 0 0 0 0 0 0 1
## STABILUS 3 0 0 0 0 0 0 0 0 1 0 1 0 0
## STABILUS 3. 0 0 0 0 0 0 0 0 0 0 0 0 0
## TRMX 1 0 2 0 0 1 0 0 0 1 0 1 0
## VARROC 0 0 2 0 0 1 2 0 0 0 1 0 0
## VL-017-14086 0 0 0 0 0 0 0 0 0 0 0 0 0
## YANFENG 0 1 2 0 0 2 1 1 0 0 0 0 0
prop.table(tab1, 2)
##
## 0 1 1:22
## 0.008291874 0.032051282 0.000000000 0.000000000
## DENSO 0.076285240 0.079059829 0.118754526 0.000000000
## HELLA 0.024875622 0.038461538 0.034757422 0.000000000
## MERIDIAN LIGHTWEIGHT 0.013266998 0.023504274 0.016654598 0.000000000
## STABILUS 1 0.220563847 0.245726496 0.335264301 0.000000000
## STABILUS 3 0.237147595 0.145299145 0.128167994 0.000000000
## STABILUS 3. 0.001658375 0.008547009 0.009413469 0.000000000
## TRMX 0.253731343 0.170940171 0.143374366 1.000000000
## VARROC 0.019900498 0.061965812 0.082548878 0.000000000
## VL-017-14086 0.000000000 0.002136752 0.000000000 0.000000000
## YANFENG 0.144278607 0.192307692 0.131064446 0.000000000
##
## 1.40 10 10:00 10:04
## 0.000000000 0.000000000 0.000000000 0.000000000
## DENSO 0.000000000 0.000000000 0.000000000 0.000000000
## HELLA 0.000000000 0.000000000 0.000000000 0.000000000
## MERIDIAN LIGHTWEIGHT 0.000000000 0.166666667 0.000000000 0.000000000
## STABILUS 1 1.000000000 0.333333333 1.000000000 1.000000000
## STABILUS 3 0.000000000 0.000000000 0.000000000 0.000000000
## STABILUS 3. 0.000000000 0.000000000 0.000000000 0.000000000
## TRMX 0.000000000 0.000000000 0.000000000 0.000000000
## VARROC 0.000000000 0.166666667 0.000000000 0.000000000
## VL-017-14086 0.000000000 0.000000000 0.000000000 0.000000000
## YANFENG 0.000000000 0.333333333 0.000000000 0.000000000
##
## 10:17 11 11:22 11:43
## 0.000000000 0.000000000 0.000000000 0.000000000
## DENSO 0.000000000 0.000000000 0.000000000 0.000000000
## HELLA 0.000000000 0.000000000 0.000000000 0.000000000
## MERIDIAN LIGHTWEIGHT 0.000000000 0.500000000 0.000000000 0.000000000
## STABILUS 1 0.000000000 0.250000000 1.000000000 1.000000000
## STABILUS 3 1.000000000 0.000000000 0.000000000 0.000000000
## STABILUS 3. 0.000000000 0.000000000 0.000000000 0.000000000
## TRMX 0.000000000 0.000000000 0.000000000 0.000000000
## VARROC 0.000000000 0.250000000 0.000000000 0.000000000
## VL-017-14086 0.000000000 0.000000000 0.000000000 0.000000000
## YANFENG 0.000000000 0.000000000 0.000000000 0.000000000
##
## 11:55 12:30 12:45 12:53
## 0.000000000 0.000000000 0.000000000 0.000000000
## DENSO 0.000000000 0.000000000 0.000000000 0.000000000
## HELLA 0.000000000 0.000000000 0.000000000 0.000000000
## MERIDIAN LIGHTWEIGHT 0.000000000 0.000000000 0.000000000 0.000000000
## STABILUS 1 0.000000000 1.000000000 0.000000000 0.000000000
## STABILUS 3 0.000000000 0.000000000 0.000000000 0.000000000
## STABILUS 3. 0.000000000 0.000000000 0.000000000 0.000000000
## TRMX 1.000000000 0.000000000 1.000000000 1.000000000
## VARROC 0.000000000 0.000000000 0.000000000 0.000000000
## VL-017-14086 0.000000000 0.000000000 0.000000000 0.000000000
## YANFENG 0.000000000 0.000000000 0.000000000 0.000000000
##
## 17 2 2:15 2:20
## 0.000000000 0.000000000 0.000000000 0.000000000
## DENSO 0.000000000 0.017241379 0.000000000 0.000000000
## HELLA 0.000000000 0.034482759 0.000000000 0.000000000
## MERIDIAN LIGHTWEIGHT 0.000000000 0.051724138 0.000000000 0.000000000
## STABILUS 1 0.000000000 0.206896552 0.000000000 0.000000000
## STABILUS 3 0.000000000 0.103448276 0.000000000 0.000000000
## STABILUS 3. 0.000000000 0.000000000 0.000000000 0.000000000
## TRMX 1.000000000 0.086206897 1.000000000 0.000000000
## VARROC 0.000000000 0.172413793 0.000000000 0.000000000
## VL-017-14086 0.000000000 0.000000000 0.000000000 0.000000000
## YANFENG 0.000000000 0.327586207 0.000000000 1.000000000
##
## 2:42 21 22 25
## 0.000000000 0.000000000 0.000000000 0.000000000
## DENSO 0.000000000 0.000000000 0.000000000 0.000000000
## HELLA 0.000000000 0.000000000 0.000000000 0.000000000
## MERIDIAN LIGHTWEIGHT 0.000000000 0.000000000 0.000000000 0.000000000
## STABILUS 1 0.000000000 0.000000000 0.000000000 0.000000000
## STABILUS 3 0.000000000 0.000000000 0.000000000 0.000000000
## STABILUS 3. 0.000000000 0.000000000 0.000000000 0.000000000
## TRMX 0.000000000 0.000000000 1.000000000 0.000000000
## VARROC 0.000000000 1.000000000 0.000000000 0.000000000
## VL-017-14086 0.000000000 0.000000000 0.000000000 0.000000000
## YANFENG 1.000000000 0.000000000 0.000000000 1.000000000
##
## 3 3:15 4 5
## 0.000000000 0.000000000 0.000000000 0.000000000
## DENSO 0.000000000 0.000000000 0.000000000 0.000000000
## HELLA 0.090909091 0.000000000 0.000000000 0.000000000
## MERIDIAN LIGHTWEIGHT 0.090909091 0.000000000 0.000000000 0.000000000
## STABILUS 1 0.272727273 1.000000000 1.000000000 0.333333333
## STABILUS 3 0.000000000 0.000000000 0.000000000 0.000000000
## STABILUS 3. 0.000000000 0.000000000 0.000000000 0.000000000
## TRMX 0.181818182 0.000000000 0.000000000 0.166666667
## VARROC 0.181818182 0.000000000 0.000000000 0.166666667
## VL-017-14086 0.000000000 0.000000000 0.000000000 0.000000000
## YANFENG 0.181818182 0.000000000 0.000000000 0.333333333
##
## 7 8 8:18 8:38
## 0.000000000 0.000000000 0.000000000 0.000000000
## DENSO 0.000000000 0.000000000 0.000000000 0.000000000
## HELLA 0.000000000 0.000000000 0.000000000 0.000000000
## MERIDIAN LIGHTWEIGHT 0.000000000 0.000000000 0.000000000 0.000000000
## STABILUS 1 0.000000000 0.000000000 0.000000000 0.000000000
## STABILUS 3 0.000000000 0.000000000 1.000000000 0.000000000
## STABILUS 3. 0.000000000 0.000000000 0.000000000 0.000000000
## TRMX 0.000000000 0.000000000 0.000000000 1.000000000
## VARROC 0.666666667 0.000000000 0.000000000 0.000000000
## VL-017-14086 0.000000000 0.000000000 0.000000000 0.000000000
## YANFENG 0.333333333 1.000000000 0.000000000 0.000000000
##
## 9 9:05 9:30
## 0.000000000 0.000000000 0.000000000
## DENSO 0.000000000 0.000000000 0.000000000
## HELLA 0.000000000 0.000000000 0.000000000
## MERIDIAN LIGHTWEIGHT 0.000000000 0.000000000 0.000000000
## STABILUS 1 0.000000000 0.000000000 1.000000000
## STABILUS 3 0.500000000 0.000000000 0.000000000
## STABILUS 3. 0.000000000 0.000000000 0.000000000
## TRMX 0.000000000 1.000000000 0.000000000
## VARROC 0.500000000 0.000000000 0.000000000
## VL-017-14086 0.000000000 0.000000000 0.000000000
## YANFENG 0.000000000 0.000000000 0.000000000
Grafica Cualitativa
bd2 <- table(bd1$TMO..MIN.)
bd2 <- prop.table(bd2)
bd2
##
## 0 0:00 10 100 120
## 0.2757009346 0.0124610592 0.0015576324 0.1545950156 0.0003894081 0.0015576324
## 15 150 20 25 30 35
## 0.1183800623 0.0007788162 0.1121495327 0.1978193146 0.0163551402 0.0229750779
## 40 45 5 50 60 65
## 0.0307632399 0.0050623053 0.0003894081 0.0253115265 0.0147975078 0.0003894081
## 70 75 80 90 KIT
## 0.0046728972 0.0019470405 0.0007788162 0.0007788162 0.0003894081
barplot(bd2, xlab='TMO..MIN.',
ylab='Frecuencia Relativa', las=3, col="red1")

Grafica Cuantitativa
bd3<-subset(bd1,select=-c(Laminas.procesadas,FECHA, TMO..MIN., PIEZAS.PROG. ))
str(bd3)
## 'data.frame': 2568 obs. of 3 variables:
## $ CLIENTE : chr "VARROC" "VARROC" "VARROC" "DENSO" ...
## $ PRODUCTO : chr "763 . KIT. CAJA." "747 KIT. CAJA HSC. ( 2 Partes)" "747 KIT. TAPA." "TOYOTA. MCV. Insterto D 2R. CORTE. 1 Golpe = 12 piezas. ( 9 Pza. / Celda)." ...
## $ TIEMPO.CALIDAD: chr "1" "1" "1" "1" ...
Grafica Dispersión
library(ggplot2)
ggplot(bd1, aes(x=TIEMPO.CALIDAD , y=CLIENTE)) +
geom_point(shape=19, size=3) + labs(title = "Relación entre Tiempo Calidad y Cliente"
,caption ="FORM Producción",x="Tiempo Calidad",
y="CLiente") + theme_classic()

Grafica relación entre cliente y el tiempo de calidad
ggplot(bd1, aes(x=CLIENTE, y=TIEMPO.CALIDAD)) +
geom_bar(stat="identity", fill="red") + scale_fill_grey() + # Add bars to the plot
labs(title = "Relación entre cliente y el tiempo de calidad", # Add a title
subtitle = "RH de FORM", # Add a subtitle
caption = "Relación", # Add a caption
x = "Cliente")


Propuesta
Mejorar los tiempos de set up, siendo estos ya cortos entre pausa y
pausa puede ser más complicado bajar el porcentaje, pero de igual manera
se puede hacer más efectivo el aprovecahamiento del tiempo por lo que se
propone reducir un 15%-20% más el tiempo que hay entre este set up
mediante el mantenimiento y cuidado de la maquinaria y compromiso y
atención de los colaboradores.
Merma
Importar base de datos
#file.choose()
bd <-read.csv("/Users/joseramonvazquezguzman/Documents/Tecnológico de Monterrey/Septimo semestre/Analítica de datos /RETO/Bases de datos (limpias) CSV /FORM - Merma limpia.csv")
Analizar base de datos
summary(bd)
## Fecha Kilos
## Length:52 Min. : 790
## Class :character 1st Qu.:3178
## Mode :character Median :3925
## Mean :3709
## 3rd Qu.:4232
## Max. :6140
## NA's :2
str(bd)
## 'data.frame': 52 obs. of 2 variables:
## $ Fecha: chr "11/01/22" "11/01/22" "22/01/22" "22/01/22" ...
## $ Kilos: int 5080 3810 2990 2680 3650 4380 3870 3590 3410 3930 ...
# install.packages("tidyverse")
library(tidyverse)
# install.packages("janitor")
library(janitor)
Tipos de Variables
Variable<-c("`Fecha´","`Mes´","`Kilos`")
Type<-c("quanlitative (nominal)", "quantiative (discrete)", "quantitative (discrete)")
table<-data.frame(Variable,Type)
knitr::kable(table)
Fecha´ |quanlitative (nominal) | |Mes´ |
quantiative (discrete) |
Kilos |
quantitative (discrete) |
Escala_de_Medición <- c("Mermas","Fecha")
Limpieza de datos
#Eliminar duplicados
bd[duplicated(bd), ]
## Fecha Kilos
## 52 NA
sum(duplicated(bd))
## [1] 1
#Eliminar negativos con cero
bd1<-bd
bd1[bd1 <0] <-0
summary(bd1)
## Fecha Kilos
## Length:52 Min. : 790
## Class :character 1st Qu.:3178
## Mode :character Median :3925
## Mean :3709
## 3rd Qu.:4232
## Max. :6140
## NA's :2
## Eliminar columnas que no se usaran
### Estas se eliminaron direcramente en excel, se eliminó la columna MES
Análisis Base de Datos
media_bd <- mean(bd$Kilos)
media_bd
## [1] NA
median_bd <- median(bd$Kilos)
median_bd
## [1] NA
mode_bd <- mode(bd$Kilos)
mode_bd
## [1] "numeric"
hist(bd$Kilos)

bd$Fecha<- as.Date(bd$Fecha,format = "%d/%m/%Y")
plot(bd$Fecha, bd$Kilos)

Graficas
#Contar Variables
count(bd,Kilos, sort = TRUE)
## Kilos n
## 1 3140 2
## 2 3810 2
## 3 4190 2
## 4 4200 2
## 5 NA 2
## 6 790 1
## 7 810 1
## 8 1040 1
## 9 2130 1
## 10 2480 1
## 11 2680 1
## 12 2830 1
## 13 2950 1
## 14 2980 1
## 15 2990 1
## 16 3050 1
## 17 3290 1
## 18 3410 1
## 19 3590 1
## 20 3650 1
## 21 3680 1
## 22 3690 1
## 23 3739 1
## 24 3780 1
## 25 3870 1
## 26 3920 1
## 27 3930 1
## 28 3940 1
## 29 3960 1
## 30 3967 1
## 31 4000 1
## 32 4050 1
## 33 4130 1
## 34 4210 1
## 35 4240 1
## 36 4260 1
## 37 4270 1
## 38 4310 1
## 39 4330 1
## 40 4380 1
## 41 4510 1
## 42 4680 1
## 43 4770 1
## 44 5010 1
## 45 5080 1
## 46 5230 1
## 47 6140 1
count(bd,Fecha, sort = TRUE)
## Fecha n
## 1 0022-02-18 5
## 2 0022-01-11 2
## 3 0022-01-22 2
## 4 0022-08-29 2
## 5 0022-08-31 2
## 6 <NA> 2
## 7 0022-02-24 1
## 8 0022-03-03 1
## 9 0022-03-08 1
## 10 0022-03-11 1
## 11 0022-03-16 1
## 12 0022-03-23 1
## 13 0022-03-30 1
## 14 0022-04-04 1
## 15 0022-04-11 1
## 16 0022-04-14 1
## 17 0022-04-21 1
## 18 0022-04-27 1
## 19 0022-05-02 1
## 20 0022-05-09 1
## 21 0022-05-14 1
## 22 0022-05-24 1
## 23 0022-05-25 1
## 24 0022-06-07 1
## 25 0022-06-15 1
## 26 0022-06-20 1
## 27 0022-06-27 1
## 28 0022-07-04 1
## 29 0022-07-11 1
## 30 0022-07-16 1
## 31 0022-07-21 1
## 32 0022-07-27 1
## 33 0022-08-08 1
## 34 0022-08-10 1
## 35 0022-08-11 1
## 36 0022-08-13 1
## 37 0022-08-15 1
## 38 0022-08-22 1
## 39 0022-08-30 1
## 40 0022-09-05 1
## 41 0022-09-07 1
## 42 0022-09-15 1
## 43 0022-09-21 1
Propuesta
Implementar KPI’s específicos con los colaboradores que se encargan
de la producción con una medida de tiempo mes con mes donde se reduzca
la merma producida y esta baje en un 15% a 20% ala termino del primer
mes de establecer los KPI´s.
También se sugiere mantener el nivel de calidad siempre en ese
estándar de excelencia para no tener productos regresados, contratiempos
con esas entregas o que se retrasen otras por culpa de tener que
producir o arreglar cierto empaque.
LS0tCnRpdGxlOiAiRW50cmVnYWJsZSBSNSIKYXV0aG9yOiAiSm9zw6kgUmFtw7NuIFbDoXpxdWV6IEd1em3DoW4gQTAxNjI1MjAzIgpkYXRlOiAiMjgtMDktMjAyMiIKb3V0cHV0OgogIGh0bWxfZG9jdW1lbnQ6CiAgIHRvYzogdHJ1ZQogICB0b2NfZmxvYXQ6IHRydWUKICAgY29kZV9kb3dubG9hZDogdHJ1ZQoKLS0tCgo8aW1nIHNyYz0gIi9Vc2Vycy9qb3NlcmFtb252YXpxdWV6Z3V6bWFuL0Rlc2t0b3AvZm9ybS5wbmciPgoKIyAqKkZPUk0qKgoKIyMgIDxzcGFuIHN0eWxlPSJjb2xvcjpyZWQiPlNDUkFQPC9zcGFuPgoKIyMgSW1wb3J0YXIgYmFzZSBkZSBkYXRvcyBTY3JhcCAKCmBgYHtyfQoKI2ZpbGUuY2hvb3NlKCkKYmQgPC0gcmVhZC5jc3YoIi9Vc2Vycy9qb3NlcmFtb252YXpxdWV6Z3V6bWFuL0RvY3VtZW50cy9UZWNub2xvzIFnaWNvIGRlIE1vbnRlcnJleS9TZXB0aW1vIHNlbWVzdHJlL0FuYWxpzIF0aWNhIGRlIGRhdG9zIC9SRVRPL0Jhc2VzIGRlIGRhdG9zIChsaW1waWFzKSBDU1YgL0ZPUk0gLSBTY3JhcCBMaW1waWEgLmNzdiIpCgpgYGAKCiMjICBDYW50aWRhZCBkZSBwcm9kdWN0b3MgcG9yIGTDrWEgCmBgYHtyfQoKYmQkRmVjaGE8LSBhcy5EYXRlKGJkJEZlY2hhLGZvcm1hdCA9ICIlZC8lbS8lWSIpCnBsb3QoYmQkRmVjaGEsIGJkJENhbnRpZGFkKQoKc3VtbWFyeShiZCkKCmxpYnJhcnkodGlkeXZlcnNlKQpsaWJyYXJ5KGphbml0b3IpCgpgYGAKCiMjICBOw7ptZXJvIGRlIHZhcmlhYmxlcyB5IHJlZ2lzdHJvcyBlbiBiYXNlIGRlIGRhdG9zCmBgYHtyfQoKbGlicmFyeShwc3ljaCkKZGVzY3JpYmUoYmQpCnN0cihiZCkKCnRhYnlsKGJkLCBQcm9kdWN0bywgVWJpY2FjacOzbi5kZS5vcmlnZW4pCgpgYGAKCiMjICBUaXBvcyBkZSBWYXJpYWJsZXMgRXhpc3RlbnRlcwoKYGBge3J9Cgp2YXJpYWJsZTwtYygiUmVmZXJlbmNpYSIsIkZlY2hhIiwgIkhvcmEiLCAiUHJvZHVjdG8iLCAiQ2FudGlkYWQiLCAiVW5pZGFkLmRlLm1lZGlkYSIsICJVYmljYWNpw7NuLmRlLm9yaWdlbiIsICJVYmljYWNpw7NuLmRlLmRlc2VjaG8iKQoKdHlwZTwtYygiQ3VhbGl0YXRpdm8gKG5vbWluYWwpIiwiQ3VhbnRpdGF0aXZvIChkaXNjY3JldGEpIiwgIkN1YW50aXRhdGl2byAoZGlzY3JldGEpIiwgIkN1YWxpdGF0aXZvIChub21pbmFsKSIsIkN1YW50aXRhdGl2byAoQ29udGludWEpIiwgIkN1YWxpdGF0aXZvIChub21pbmFsKSIsICJDdWFsaXRhdGl2byAobm9taW5hbCkiLCJDdWFsaXRhdGl2byAobm9taW5hbCkiKQoKRXNjYWxhX2RlX01lZGljacOzbjwtYygiTnVtZXJvIiwgIkZlY2hhIiwgIkNhdGVnb3LDrWEiLCAiS2ciLCAiTWVkaWNpw7NuIiwgIlBvc2ljacOzbiIsICJQb3NpY2nDs24iLCAiRXN0YWRvIikKCgp0YWJsZTwtZGF0YS5mcmFtZSh2YXJpYWJsZSx0eXBlKQprbml0cjo6a2FibGUodGFibGUpCgoKCmBgYAojIyMgTGEgYmFzZSBkZSBkYXRvcyBjdWVudGEgY29uIDIyNTkgcmVnaXRyb3MgeSA5ICB2YXJpYWJsZXMgCgoKIyMgRXNjYWxhIGRlIG1lZGljacOzbgoKYGBge3J9CgpFc2NhbGFfZGVfbWVkaWNpw7NuIDwtYygiTsO6bWVybyIsICJGZWNoYSIsIkNhdGVnb3LDrWEiLCAiS2ciLCAiTWVkaWNpw7NuIiwgIlBvc2ljacOzbiIsIlBvc2ljacOzbiIsICJFc3RhZG8iKQoKYGBgCgoKCiMjIEVsaW1pbmFyIGNvbHVtbmFzIHF1ZSBubyBzZSB1c2FuCgpgYGB7cn0KCmJkMSA8LSBiZApiZDE8LSBzdWJzZXQoYmQxLCBzZWxlY3QgPSAtYyAoUmVmZXJlbmNpYSwgUHJvZHVjdG8sIFVuaWRhZC5kZS5tZWRpZGEsIEhvcmEsIFViaWNhY2nDs24uZGUuZGVzZWNobywgRXN0YWRvKSkKCgpiZDIgPC0gYmQKYmQyPC0gc3Vic2V0KGJkMiwgc2VsZWN0ID0gLWMgKFJlZmVyZW5jaWEsIFByb2R1Y3RvLCBVbmlkYWQuZGUubWVkaWRhLCBIb3JhLCBVYmljYWNpw7NuLmRlLmRlc2VjaG8sIEVzdGFkbykpCgptZWRpYSA8LSBtZWFuKGJkMiRDYW50aWRhZCkKCm1lZGlhbmEgPC0gbWVkaWFuKGJkMiRDYW50aWRhZCkKCm1vZGUgPC0gZnVuY3Rpb24gKHgpIHsKICB1eCA8LSB1bmlxdWUoeCkKICB1eCBbd2hpY2gubWF4KHRhYnVsYXRlKG1hdGNoKHgsdXgpKSldCn0KCm1vZGUgPC0gbW9kZShiZDIkQ2FudGlkYWQpCm1vZGUKCmhpc3QoYmQyJENhbnRpZGFkKQpgYGAKCiMjICBHcmFmaWNhIGNpdWFudGl0YXRpdmEKYGBge3J9CmNvdW50KGJkMiwgVWJpY2FjacOzbi5kZS5vcmlnZW4sIHNvcnQgPSBUUlVFKQoKZ2dwbG90KGJkMiwgYWVzKHg9bWVkaWEsIHk9IFViaWNhY2nDs24uZGUub3JpZ2VuKSkgKwogIGdlb21fYmFyKHN0YXQ9ImlkZW50aXR5IiwgZmlsbD0icmVkIikgKyBzY2FsZV9maWxsX2dyZXkoKSArICMgQWRkIGJhcnMgdG8gdGhlIHBsb3QKICBsYWJzKHRpdGxlID0gIlViaWNhY2nDs24gZGUgb3JpZ2VuIiwgIyBBZGQgYSB0aXRsZQogICAgICAgc3VidGl0bGUgPSAiU2NyYXAgZW1wcmVzYSBGT1JNIiwgIyBBZGQgYSBzdWJ0aXRsZQogICAgICAgY2FwdGlvbiA9ICJSZWxhY2nDs24iLCAjIEFkZCBhIGNhcHRpb24KICAgICAgIHggPSAieCIpCgpjb3VudChiZDEsIEZlY2hhLCBzb3J0ID0gVFJVRSkKCgpgYGAKCgoKIyMgIFByb3B1ZXN0YSAKCiMjIyAgQ29tbyBzZSBwdWVkZSB2ZXIgZW4gbGEgZ3LDoWZpY2EgZGUgZGlzcGVyc2nDs24sIHRlbmVtb3MgYSBsbyBsYXJnbyBkZWwgbWVzIHVuYSBjYW50aWRhZCBiYWphIGRlIHNjcmFwIHF1ZSBwb2RlbW9zIGFwcm92ZWNoYXIgcGFyYSByZWNpY2xhciwgcG9yIGVuZGUgbG8gcXVlIHNlIHByb3BvbmUgZXMgbWFudGVuZXJzZSBhc8OtIG8gaW5jbHVzbyBkaXNtaW51aXIgbGEgY2FudGlkYWQgZGUgbWF0ZXJpYSByZWNpY2xhZGEgcXVlIHByb2R1Y2UgbGEgZW1wcmVzYSwgY29uIHVzb3MgcXVlIHNpZ25pZmlxdWVuIG90cm9zIGFwcm92ZWNoYW1pZW50byBkZW50cm8gZGUgbGEgb3JnYW5pemFjacOzbiwgc2lnbmlmaWNhbmRvIHVuIGJ1ZW4gYXByb3ZlY2hhbWllbnRvIGRlIGxvcyByZWN1cnNvcy4gIAoKPGltZyBzcmM9ICIvVXNlcnMvam9zZXJhbW9udmF6cXVlemd1em1hbi9Eb2N1bWVudHMvV2hhdHNBcHAgSW1hZ2UgMjAyMi0wOS0yOCBhdCAxLjE2LjA1IFBNLmpwZWciPgoKCgoKIyMgIDxzcGFuIHN0eWxlPSJjb2xvcjpyZWQiPlByb2R1Y2Npw7NuPC9zcGFuPgoKCiMjIEltcG9ydGFyIGJhc2UgZGUgZGF0b3MKYGBge3J9CgojZmlsZS5jaG9vc2UoKQpiZCA8LSByZWFkLmNzdigiL1VzZXJzL2pvc2VyYW1vbnZhenF1ZXpndXptYW4vRG9jdW1lbnRzL1RlY25vbG/MgWdpY28gZGUgTW9udGVycmV5L1NlcHRpbW8gc2VtZXN0cmUvQW5hbGnMgXRpY2EgZGUgZGF0b3MgL1JFVE8vQmFzZXMgZGUgZGF0b3MgKGxpbXBpYXMpIENTViAvRm9ybVByb2R1Y2Npb8yBbi5jc3YiKQoKYGBgCgojIyAgRW50ZW5kZXIgbGEgYmFzZSBkZSBkYXRvcwpgYGB7cn0KCnJlc3VtZW4gPC0gc3VtbWFyeShiZCkKcmVzdW1lbgoKc3RyKGJkKQpsaWJyYXJ5KHBzeWNoKQojaW5zdGFsbC5wYWNrYWdlcygicHN5Y2giKQoKYGBgCgojIyBUaXBvIGRlIHZhcmlhYmxlcwpgYGB7cn0KClZhcmlhYmxlPC1jKCJOby4iLCJDTElFTlRFIiwiSUQuRk9STSAiLCAiUC4uRFVDVE8iLCJQSUVaQVMuUC4uRy4iLCJUTU8uLk1JTi4iLAogICAgICAgICAgICAiSFIuLkZJTiIsIkVTVEFDSU9OLkFSLi5OUVVFIiwiTGFtaW5hcy5Qcm9jZXNhZGFzIiwiIElOSUNJTy5TRVAuVVAiLAogICAgICAgICAgICAiRklOLklOSUNJTy5ERS5TRVAuVVAiLCJJTklDSU8uZGUuUC4uLi5TTyIsICJGSU4uZGUuUC4uLi5TTyIsIlRJRU1QTy4uQ0FMSURBRCIsCiAgICAgICAgICAgICJUSUVNUE8uTUFURVJJQUxFUyIsIk1FUk1BUy5NYXF1aW5hcy4iLCJEYXRlIikKClR5cGU8LWMoIkN1YW50aXRhdGl2YSAoRGlzY3JldGEpIiwgIkN1YWxpdGF0aXZhIiwgIkN1YW50aXRhdGl2YSAoRGlzY3JldGEpIiwgIkN1YWxpdGF0aXZhIiwgCiAgICAgICAgIkN1YW50aXRhdGl2YSAoRGlzY3JldGEpIiwiQ3VhbnRpdGF0aXZhIChEaXNjcmV0YSkiLCJDdWFudGl0YXRpdmEgKERpc2NyZXRhKSIsIkN1YWxpdGF0aXZhIiwKICAgICAgICAiQ3VhbnRpdGF0aXZhIChEaXNjcmV0YSkiLCJDdWFudGl0YXRpdmEgKERpc2NyZXRhKSIsIkN1YW50aXRhdGl2YSAoRGlzY3JldGEpIiwiQ3VhbnRpdGF0aXZhIChEaXNjcmV0YSkiLAogICAgICAgICJDdWFudGl0YXRpdmEgKERpc2NyZXRhKSIsIkN1YW50aXRhdGl2YSAoRGlzY3JldGEpIiwiQ3VhbnRpdGF0aXZhIChEaXNjcmV0YSkiLCJDdWFudGl0YXRpdmEgKERpc2NyZXRhKSIsCiAgICAgICAgIkN1YW50aXRhdGl2YSAoRGlzY3JldGEpIikKCnRhYmxlPC1kYXRhLmZyYW1lKFZhcmlhYmxlLFR5cGUpCmtuaXRyOjprYWJsZSh0YWJsZSkKCgoKRXNjYWxhX2RlX01lZGljacOzbiA8LSBjKCJOdW1lcm8iLCAiRW1wcmVzYSIsICJJRCIsIkNhdGVnb3JpYSIsICJQaWV6YXMiLCAiTWludXRvcyIsIlRpZW1wbyIsIk1hcXVpbmEiLCJTb2JyYW50ZSIsIkhvcmEiLCJIb3JhIiwiSG9yYSIsIkhvcmEiLCJUaWVtcG8iLCJUaWVtcG8iLCJNZXJtYXMiLCJGZWNoYSIpCgoKYGBgCgojIyAgVMOpY25pY2FzIGRlIGxpbXBpZXphCgoKIyMjICBFbGltaW5hciBjb2x1bW5hcyAKCmBgYHtyfQoKCmJkMSA8LSBiZApiZDE8LXN1YnNldChiZDEsc2VsZWN0PS1jKE5vLixJRC5GT1JNLCBIUi4uRklOLCBFU1RBQ0lPTi5BUlJBTlFVRSwgSU5JQ0lPLlNFUC5VUCwgZmluLmRlLnNldC51cCwgSU5JQ0lPLlNFUC5VUCxJTklDSU8uZGUuUFJPQ0VTTywgRklOLmRlLlBST0NFU08sIFRJRU1QTy5NQVRFUklBTEVTLCBNRVJNQVMuTWFxdWluYXMuKSkKc3RyKGJkMSkKCmBgYAoKIyMjICBDYW1iaWFhcmxvcyAgTkEgY29uIGNlcm9zCgpgYGB7cn0KCnN1bShpcy5uYShiZDEpKQoKYmQxW2lzLm5hKGJkMSldPC0wCnN1bW1hcnkoYmQxKQoKYmQxIDwtIG5hLm9taXQoYmQxKQpzdW1tYXJ5KGJkMSkgIAoKc3RyKGJkMSkKCmBgYAoKCiMjICBUYWJsYSBkZSBGcmVjdWVuY2lhIAoKCmBgYHtyfQoKCgojaW5zdGFsbC5wYWNrYWdlcygiZXBpRGlzcGxheSIpCmxpYnJhcnkoZXBpRGlzcGxheSkKdGFiMTwtdGFibGUoYmQxJENMSUVOVEUsIGJkMSRUSUVNUE8uQ0FMSURBRCkgIyBBIHdpbGwgYmUgcm93cywgQiB3aWxsIGJlIGNvbHVtbnMKdGFiMQpwcm9wLnRhYmxlKHRhYjEsIDIpIAoKCmBgYAoKCiMjICBHcmFmaWNhIEN1YWxpdGF0aXZhCgoKYGBge3J9CgoKCmJkMiA8LSB0YWJsZShiZDEkVE1PLi5NSU4uKQpiZDIgPC0gcHJvcC50YWJsZShiZDIpCmJkMgoKCmJhcnBsb3QoYmQyLCB4bGFiPSdUTU8uLk1JTi4nLAogICAgICAgIHlsYWI9J0ZyZWN1ZW5jaWEgUmVsYXRpdmEnLCBsYXM9MywgY29sPSJyZWQxIikKCmBgYAoKCiMjICBHcmFmaWNhIEN1YW50aXRhdGl2YQoKYGBge3J9CgoKYmQzPC1zdWJzZXQoYmQxLHNlbGVjdD0tYyhMYW1pbmFzLnByb2Nlc2FkYXMsRkVDSEEsIFRNTy4uTUlOLiwgUElFWkFTLlBST0cuICkpCnN0cihiZDMpCgoKYGBgCgojIyAgR3JhZmljYSBEaXNwZXJzacOzbgpgYGB7cn0KCgpsaWJyYXJ5KGdncGxvdDIpCmdncGxvdChiZDEsIGFlcyh4PVRJRU1QTy5DQUxJREFEICwgeT1DTElFTlRFKSkgKyAKICBnZW9tX3BvaW50KHNoYXBlPTE5LCBzaXplPTMpICsgbGFicyh0aXRsZSA9ICJSZWxhY2nDs24gZW50cmUgVGllbXBvIENhbGlkYWQgeSBDbGllbnRlIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICxjYXB0aW9uID0iRk9STSBQcm9kdWNjacOzbiIseD0iVGllbXBvIENhbGlkYWQiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5PSJDTGllbnRlIikgKyB0aGVtZV9jbGFzc2ljKCkKCmBgYAoKIyMgIEdyYWZpY2EgcmVsYWNpw7NuIGVudHJlIGNsaWVudGUgeSBlbCB0aWVtcG8gZGUgY2FsaWRhZAoKYGBge3J9CgpnZ3Bsb3QoYmQxLCBhZXMoeD1DTElFTlRFLCB5PVRJRU1QTy5DQUxJREFEKSkgKwogIGdlb21fYmFyKHN0YXQ9ImlkZW50aXR5IiwgZmlsbD0icmVkIikgKyBzY2FsZV9maWxsX2dyZXkoKSArICMgQWRkIGJhcnMgdG8gdGhlIHBsb3QKICBsYWJzKHRpdGxlID0gIlJlbGFjacOzbiBlbnRyZSBjbGllbnRlIHkgZWwgdGllbXBvIGRlIGNhbGlkYWQiLCAjIEFkZCBhIHRpdGxlCiAgICAgICBzdWJ0aXRsZSA9ICJSSCBkZSBGT1JNIiwgIyBBZGQgYSBzdWJ0aXRsZQogICAgICAgY2FwdGlvbiA9ICJSZWxhY2nDs24iLCAjIEFkZCBhIGNhcHRpb24KICAgICAgIHggPSAiQ2xpZW50ZSIpCgpgYGAKCgo8aW1nIHNyYz0gIi9Vc2Vycy9qb3NlcmFtb252YXpxdWV6Z3V6bWFuL0RvY3VtZW50cy9XaGF0c0FwcCBJbWFnZSAyMDIyLTA5LTI4IGF0IDEuMTYuMDYgUE0uanBlZyI+CgoKIyMgIFByb3B1ZXN0YSAKCiMjIyAgTWVqb3JhciBsb3MgdGllbXBvcyBkZSBzZXQgdXAsIHNpZW5kbyBlc3RvcyB5YSBjb3J0b3MgZW50cmUgcGF1c2EgeSBwYXVzYSBwdWVkZSBzZXIgbcOhcyBjb21wbGljYWRvIGJhamFyIGVsIHBvcmNlbnRhamUsIHBlcm8gZGUgaWd1YWwgbWFuZXJhIHNlIHB1ZWRlIGhhY2VyIG3DoXMgZWZlY3Rpdm8gZWwgYXByb3ZlY2FoYW1pZW50byBkZWwgdGllbXBvIHBvciBsbyBxdWUgc2UgcHJvcG9uZSByZWR1Y2lyIHVuIDE1JS0yMCUgbcOhcyBlbCB0aWVtcG8gcXVlIGhheSBlbnRyZSBlc3RlIHNldCB1cCBtZWRpYW50ZSBlbCBtYW50ZW5pbWllbnRvIHkgY3VpZGFkbyBkZSBsYSBtYXF1aW5hcmlhIHkgY29tcHJvbWlzbyB5IGF0ZW5jacOzbiBkZSBsb3MgY29sYWJvcmFkb3Jlcy4gCgoKIyMgIDxzcGFuIHN0eWxlPSJjb2xvcjpyZWQiPk1lcm1hPC9zcGFuPgoKCgojIyAgSW1wb3J0YXIgYmFzZSBkZSBkYXRvcwpgYGB7cn0KCiNmaWxlLmNob29zZSgpCmJkIDwtcmVhZC5jc3YoIi9Vc2Vycy9qb3NlcmFtb252YXpxdWV6Z3V6bWFuL0RvY3VtZW50cy9UZWNub2xvzIFnaWNvIGRlIE1vbnRlcnJleS9TZXB0aW1vIHNlbWVzdHJlL0FuYWxpzIF0aWNhIGRlIGRhdG9zIC9SRVRPL0Jhc2VzIGRlIGRhdG9zIChsaW1waWFzKSBDU1YgL0ZPUk0gLSBNZXJtYSBsaW1waWEuY3N2IikKYGBgCgojIyAgQW5hbGl6YXIgYmFzZSBkZSBkYXRvcwoKYGBge3J9CgoKc3VtbWFyeShiZCkKc3RyKGJkKQoKIyBpbnN0YWxsLnBhY2thZ2VzKCJ0aWR5dmVyc2UiKQpsaWJyYXJ5KHRpZHl2ZXJzZSkKIyBpbnN0YWxsLnBhY2thZ2VzKCJqYW5pdG9yIikKbGlicmFyeShqYW5pdG9yKQoKCmBgYAoKIyMgIFRpcG9zIGRlIFZhcmlhYmxlcyAKCgpgYGB7cn0KClZhcmlhYmxlPC1jKCJgRmVjaGHCtCIsImBNZXPCtCIsImBLaWxvc2AiKQpUeXBlPC1jKCJxdWFubGl0YXRpdmUgKG5vbWluYWwpIiwgInF1YW50aWF0aXZlIChkaXNjcmV0ZSkiLCAicXVhbnRpdGF0aXZlIChkaXNjcmV0ZSkiKQp0YWJsZTwtZGF0YS5mcmFtZShWYXJpYWJsZSxUeXBlKQprbml0cjo6a2FibGUodGFibGUpCgoKRXNjYWxhX2RlX01lZGljacOzbiA8LSBjKCJNZXJtYXMiLCJGZWNoYSIpCgoKYGBgCgoKIyMgTGltcGllemEgZGUgZGF0b3MgCmBgYHtyfQoKI0VsaW1pbmFyIGR1cGxpY2Fkb3MKCmJkW2R1cGxpY2F0ZWQoYmQpLCBdCnN1bShkdXBsaWNhdGVkKGJkKSkKCiNFbGltaW5hciBuZWdhdGl2b3MgY29uIGNlcm8KCmJkMTwtYmQKYmQxW2JkMSA8MF0gPC0wCnN1bW1hcnkoYmQxKQoKIyMgRWxpbWluYXIgY29sdW1uYXMgcXVlIG5vIHNlIHVzYXJhbiAKCiMjIyAgRXN0YXMgc2UgZWxpbWluYXJvbiBkaXJlY3JhbWVudGUgZW4gZXhjZWwsIHNlIGVsaW1pbsOzIGxhIGNvbHVtbmEgTUVTCmBgYAoKIyMgIEFuw6FsaXNpcyBCYXNlIGRlIERhdG9zCmBgYHtyfQoKbWVkaWFfYmQgPC0gbWVhbihiZCRLaWxvcykKbWVkaWFfYmQKCm1lZGlhbl9iZCA8LSBtZWRpYW4oYmQkS2lsb3MpCm1lZGlhbl9iZAoKbW9kZV9iZCA8LSBtb2RlKGJkJEtpbG9zKQptb2RlX2JkCgpoaXN0KGJkJEtpbG9zKQoKYmQkRmVjaGE8LSBhcy5EYXRlKGJkJEZlY2hhLGZvcm1hdCA9ICIlZC8lbS8lWSIpCnBsb3QoYmQkRmVjaGEsIGJkJEtpbG9zKQoKYGBgCgoKIyMgR3JhZmljYXMKCmBgYHtyfQoKCiNDb250YXIgVmFyaWFibGVzCmNvdW50KGJkLEtpbG9zLCBzb3J0ID0gVFJVRSkKY291bnQoYmQsRmVjaGEsIHNvcnQgPSBUUlVFKQoKCmBgYAoKCiMjIFByb3B1ZXN0YSAKCgojIyMgIEltcGxlbWVudGFyIEtQSSdzIGVzcGVjw61maWNvcyBjb24gbG9zIGNvbGFib3JhZG9yZXMgcXVlIHNlIGVuY2FyZ2FuIGRlIGxhIHByb2R1Y2Npw7NuIGNvbiB1bmEgbWVkaWRhIGRlIHRpZW1wbyBtZXMgY29uIG1lcyBkb25kZSBzZSByZWR1emNhIGxhIG1lcm1hIHByb2R1Y2lkYSB5IGVzdGEgYmFqZSBlbiB1biAxNSUgYSAyMCUgYWxhIHRlcm1pbm8gZGVsIHByaW1lciBtZXMgZGUgZXN0YWJsZWNlciBsb3MgS1BJwrRzLgoKIyMjIFRhbWJpw6luIHNlIHN1Z2llcmUgbWFudGVuZXIgZWwgbml2ZWwgZGUgY2FsaWRhZCBzaWVtcHJlIGVuIGVzZSBlc3TDoW5kYXIgZGUgZXhjZWxlbmNpYSBwYXJhIG5vIHRlbmVyIHByb2R1Y3RvcyByZWdyZXNhZG9zLCBjb250cmF0aWVtcG9zIGNvbiBlc2FzIGVudHJlZ2FzIG8gcXVlIHNlIHJldHJhc2VuIG90cmFzIHBvciBjdWxwYSBkZSB0ZW5lciBxdWUgcHJvZHVjaXIgbyBhcnJlZ2xhciBjaWVydG8gZW1wYXF1ZS4gCgoK