Se presenta un análisis preliminar de correlación de la Dextrana (mg/kg) de PSA para la Zafra 2023-2024.

Nota: No es un análisis de causalidad. Este se proveerá al discutir los resultados con expertos del proceso, pero se presentan preliminarmente algunas hipótesis.

Librerías

library(dplyr)
library(magrittr)
library(mlbench)
library(caret)
library(ggplot2)
library(plotly)
library(hrbrthemes)
library(lares)

Dataset de Variables Industriales del Sistema de Control y Laboratorio

El conjunto de datos analizados contiene 239 variables del Sistema de Control (Procesos de Fabricación) y Laboratorio Industrial.

dataset_indeterminadas <- read.csv(file = 'c:/users/100346/OneDrive - Pantaleon. S.A/Desktop/DataScience/Perdidas Indeterminadas/Perdidas Indeterminadas 2024.csv')
df <- dataset_indeterminadas[-c(239)]
dataset_indeterminadas

El dataset incluye 24 días de operación.

Función de Densidad: Dextrana Total Pantaleon (mg/kg)

distr(dataset_indeterminadas,Total.Dextrana)

Basado en las muestras colectadas, la acumulación de total de dextrana en los procesos se concentró mayormente en valores entre 10,000 y 30,000 mg/kg de sólidos.

Análisis de Correlación Dextrana en Materiales

Dextrana Total

corr_var(dataset_indeterminadas, # nombre del dataframe
  Total.Dextrana, # variable objetivo
  max_pvalue = 0.05, # nivel de significancia para la región de rechazo en las pruebas de hipótesis
  top = 30, # despliegue de las 30 variables más correlacionadas con la variable objetivo
  plot = T
)
New names:

La variable calculada de Total de Dextrana (suma de la dextrana del día en los distintos puntos de muestreo) muestra una correlación directa con las mediciones de purezas de materiales. Adicional, existe una correlación directa con la Cantidad de Paros por Día.

Dextrana Jugo Primario TA

corr_var(df, # nombre del dataframe
  Dextrana.Primario.A, # variable objetivo
  max_pvalue = 0.05, # nivel de significancia para la región de rechazo en las pruebas de hipótesis
  top = 30, # despliegue de las 30 variables más correlacionadas con la variable objetivo
  plot = T
)
New names:

Dextrana Jugo Primario TB

corr_var(df, # nombre del dataframe
  Dextrana.Primario.B, # variable objetivo
  max_pvalue = 0.05, # nivel de significancia para la región de rechazo en las pruebas de hipótesis
  top = 30, # despliegue de las 30 variables más correlacionadas con la variable objetivo
  plot = T
)
New names:

La dextrana en el jugo primario del TA parece tener mayor correlación con la dextrana que se mide al interior del proceso. Este es un dato relevante considerando que las medias de las dextranas en ambos tándems es bastante similar. Las variaciones de dextrana medidas al interior del proceso parecen tener más relación con las variaciones de la dextrana del TA que con las variaciones de dextrana del TB. En un análisis posterior se investigará la relación con el tipo de caña que ingresa en este tándem.

Dextrana Jugo Diluido TA

corr_var(df, # nombre del dataframe
  Dextrana.Diluido.A, # variable objetivo
  max_pvalue = 0.05, # nivel de significancia para la región de rechazo en las pruebas de hipótesis
  top = 30, # despliegue de las 30 variables más correlacionadas con la variable objetivo
  plot = T
)
New names:

Dextrana Jugo Diluido TB

corr_var(df, # nombre del dataframe
  Dextrana.Diluido.B, # variable objetivo
  max_pvalue = 0.05, # nivel de significancia para la región de rechazo en las pruebas de hipótesis
  top = 30, # despliegue de las 30 variables más correlacionadas con la variable objetivo
  plot = T
)
New names:

En los jugos diluidos, el efecto parece ser similar sobre las purezas y el tiempo perdido. En el tándem “B” sin embargo, aparecen más correlaciones con variables relacionadas a la calidad de caña, específicamente en el peso de caña acorchada y lalas. Observe que la tierra y los cogollos parecen no contribuir a la dextrana. Las variables del proceso de fábrica podrían estar afectadas por la correlación con el tiempo perdido y la frecuencia de paros.

Dextrana Jugo Claro

corr_var(df, # nombre del dataframe
  Dextrana.Jugo.Claro, # variable objetivo
  max_pvalue = 0.05, # nivel de significancia para la región de rechazo en las pruebas de hipótesis
  top = 30, # despliegue de las 30 variables más correlacionadas con la variable objetivo
  plot = T
)
New names:

En el Jugo claro, se observa una correlación negativa con la extracción de los tándems,

ggplot(df, aes(x=Dextrana.Jugo.Claro, y=Extracción.Fibra.12.5)) + 
    geom_point(
        color="orange",
        fill="#69b3a2",
        shape=21,
        alpha=0.5,
        size=6,
        stroke = 2
        ) +
    geom_smooth(method=lm , color="blue", fill="#69b3a2", se=TRUE) +
 ggtitle("Extracción Fibra 12.5 vrs. Dextrana Jugo Claro") +
  xlab("Dextrana Jugo Claro (mg/kg)") + ylab("Extracción Fibra 12.5 (%)")

y adicionalmente una correlación negativa con la pérdida indeterminada. Este resultado se debe corroborar con más muestras.

ggplot(df, aes(x=Dextrana.Jugo.Claro, y=Pérdidas.indeterminadas..Kg.t..6028)) + 
    geom_point(
        color="orange",
        fill="#69b3a2",
        shape=21,
        alpha=0.5,
        size=6,
        stroke = 2
        ) +
    geom_smooth(method=lm , color="blue", fill="#69b3a2", se=TRUE) +
 ggtitle("Perdida Indeterminada vrs. Dextrana Jugo Claro") +
  xlab("Dextrana Jugo Claro (mg/kg)") + ylab("Pérdida Indeterminada (kg/t)")

Dextrana Jugo Filtrado

corr_var(df, # nombre del dataframe
  Dextrana.Jugo.Filtrado, # variable objetivo
  max_pvalue = 0.05, # nivel de significancia para la región de rechazo en las pruebas de hipótesis
  top = 30, # despliegue de las 30 variables más correlacionadas con la variable objetivo
  plot = T
)
New names:

La dextrana en el jugo filtrado muestra una correlación con la variación en la granulometría, las cenizas y la humedad del azúcar. Esto puede verse en los retenidos del azúcar blanco, para distintas aperturas de malla. Es importante notar que esta medición de dextrana en jugo filtrado es la que muestra mayor impacto sobre la calidad del azúcar.

ggplot(df, aes(x=Dextrana.Jugo.Filtrado, y=Retenido.malla.35.Azúcar.Blanco.total)) + 
    geom_point(
        color="orange",
        fill="#69b3a2",
        shape=21,
        alpha=0.5,
        size=6,
        stroke = 2
        ) +
    geom_smooth(method=lm , color="blue", fill="#69b3a2", se=TRUE) +
 ggtitle("Retenido Malla 35 Blanco vrs. Dextrana Jugo Filtrado") +
  xlab("Dextrana Jugo Filtrado (mg/kg)") + ylab("Retenido Malla 35 Blanco (%)")

Así mismo aparece una correlación positiva con la Pérdida en Molienda (Entre el Core y el Pol en Caña Industrial).

ggplot(df, aes(x=Dextrana.Jugo.Filtrado, y=Pérdidas.Molienda..Kg.t..5767)) + 
    geom_point(
        color="orange",
        fill="#69b3a2",
        shape=21,
        alpha=0.5,
        size=6,
        stroke = 2
        ) +
    geom_smooth(method=lm , color="blue", fill="#69b3a2", se=TRUE) +
 ggtitle("Perdidas en Molienda vrs. Dextrana Jugo Filtrado") +
  xlab("Dextrana Jugo Filtrado (mg/kg)") + ylab("Pérdidas en Molienda (kg/t)")

Finalmente, en el Jugo Filtrado puede observarse una correlación con el Trash de la Caña de Cosecha Manual.

ggplot(df, aes(x=Dextrana.Jugo.Filtrado, y=Trash.de.caña.manual)) + 
    geom_point(
        color="orange",
        fill="#69b3a2",
        shape=21,
        alpha=0.5,
        size=6,
        stroke = 2
        ) +
    geom_smooth(method=lm , color="blue", fill="#69b3a2", se=TRUE) +
 ggtitle("Trash Caña Manual vrs. Dextrana Jugo Filtrado") +
  xlab("Dextrana Jugo Filtrado (mg/kg)") + ylab("Trash Caña Manual (%)")

Dextrana Melaza

corr_var(df, # nombre del dataframe
  Dextrana.Melaza, # variable objetivo
  max_pvalue = 0.05, # nivel de significancia para la región de rechazo en las pruebas de hipótesis
  top = 30, # despliegue de las 30 variables más correlacionadas con la variable objetivo
  plot = T
)
New names:

Finalmente la dextrana en la melaza está correlacionada con la cantidad de paros por día. También se puede ver una correlación negativa con el Trash de la Caña Mecanizada Quemada, la tierra y la masa de cogollos.

En estos resultados preliminares, parece haber un efecto proveniente de la caña del tándem A principalmente, con cosecha manual. Esto se investigará en el análisis de variables agrícolas. En cuanto al proceso interno, la dextrana está correlacionada positivamente con las mediciones de pureza de materiales y la pérdida en molienda.

LS0tDQp0aXRsZTogIkFuw6FsaXNpcyBEZXh0cmFuYSBQU0EgMjAyNCINCm91dHB1dDogaHRtbF9ub3RlYm9vaw0KLS0tDQoNClNlIHByZXNlbnRhIHVuIGFuw6FsaXNpcyBwcmVsaW1pbmFyIGRlIGNvcnJlbGFjacOzbiBkZSBsYSBEZXh0cmFuYSAobWcva2cpIGRlIFBTQSBwYXJhIGxhICoqWmFmcmEgMjAyMy0yMDI0KiouDQoNCipOb3RhOiBObyBlcyB1biBhbsOhbGlzaXMgZGUgY2F1c2FsaWRhZC4gRXN0ZSBzZSBwcm92ZWVyw6EgYWwgZGlzY3V0aXIgbG9zIHJlc3VsdGFkb3MgY29uIGV4cGVydG9zIGRlbCBwcm9jZXNvLCBwZXJvIHNlIHByZXNlbnRhbiBwcmVsaW1pbmFybWVudGUgYWxndW5hcyBoaXDDs3Rlc2lzLioNCg0KKipMaWJyZXLDrWFzKioNCmBgYHtyfQ0KbGlicmFyeShkcGx5cikNCmxpYnJhcnkobWFncml0dHIpDQpsaWJyYXJ5KG1sYmVuY2gpDQpsaWJyYXJ5KGNhcmV0KQ0KbGlicmFyeShnZ3Bsb3QyKQ0KbGlicmFyeShwbG90bHkpDQpsaWJyYXJ5KGhyYnJ0aGVtZXMpDQpsaWJyYXJ5KGxhcmVzKQ0KYGBgDQoNCiMjIyBEYXRhc2V0IGRlIFZhcmlhYmxlcyBJbmR1c3RyaWFsZXMgZGVsIFNpc3RlbWEgZGUgQ29udHJvbCB5IExhYm9yYXRvcmlvDQoNCkVsIGNvbmp1bnRvIGRlIGRhdG9zIGFuYWxpemFkb3MgY29udGllbmUgKioqMjM5IHZhcmlhYmxlcyoqKiBkZWwgU2lzdGVtYSBkZSBDb250cm9sIChQcm9jZXNvcyBkZSBGYWJyaWNhY2nDs24pIHkgTGFib3JhdG9yaW8gSW5kdXN0cmlhbC4NCg0KYGBge3J9DQpkYXRhc2V0X2luZGV0ZXJtaW5hZGFzIDwtIHJlYWQuY3N2KGZpbGUgPSAnYzovdXNlcnMvMTAwMzQ2L09uZURyaXZlIC0gUGFudGFsZW9uLiBTLkEvRGVza3RvcC9EYXRhU2NpZW5jZS9QZXJkaWRhcyBJbmRldGVybWluYWRhcy9QZXJkaWRhcyBJbmRldGVybWluYWRhcyAyMDI0LmNzdicpDQpkZiA8LSBkYXRhc2V0X2luZGV0ZXJtaW5hZGFzWy1jKDIzOSldDQpkYXRhc2V0X2luZGV0ZXJtaW5hZGFzDQpgYGANCg0KRWwgZGF0YXNldCBpbmNsdXllICoqMjQgZMOtYXMgZGUgb3BlcmFjacOzbioqLg0KDQoNCiMjIyBGdW5jacOzbiBkZSBEZW5zaWRhZDogRGV4dHJhbmEgVG90YWwgUGFudGFsZW9uIChtZy9rZykNCmBgYHtyfQ0KZGlzdHIoZGF0YXNldF9pbmRldGVybWluYWRhcyxUb3RhbC5EZXh0cmFuYSkNCmBgYA0KQmFzYWRvIGVuIGxhcyBtdWVzdHJhcyBjb2xlY3RhZGFzLCBsYSBhY3VtdWxhY2nDs24gZGUgdG90YWwgZGUgZGV4dHJhbmEgZW4gbG9zIHByb2Nlc29zIHNlIGNvbmNlbnRyw7MgbWF5b3JtZW50ZSBlbiB2YWxvcmVzIGVudHJlIDEwLDAwMCB5IDMwLDAwMCBtZy9rZyBkZSBzw7NsaWRvcy4NCg0KIyMjIEFuw6FsaXNpcyBkZSBDb3JyZWxhY2nDs24gRGV4dHJhbmEgZW4gTWF0ZXJpYWxlcw0KDQoNCioqRGV4dHJhbmEgVG90YWwqKg0KYGBge3J9DQpjb3JyX3ZhcihkYXRhc2V0X2luZGV0ZXJtaW5hZGFzLCAjIG5vbWJyZSBkZWwgZGF0YWZyYW1lDQogIFRvdGFsLkRleHRyYW5hLCAjIHZhcmlhYmxlIG9iamV0aXZvDQogIG1heF9wdmFsdWUgPSAwLjA1LCAjIG5pdmVsIGRlIHNpZ25pZmljYW5jaWEgcGFyYSBsYSByZWdpw7NuIGRlIHJlY2hhem8gZW4gbGFzIHBydWViYXMgZGUgaGlww7N0ZXNpcw0KICB0b3AgPSAzMCwgIyBkZXNwbGllZ3VlIGRlIGxhcyAzMCB2YXJpYWJsZXMgbcOhcyBjb3JyZWxhY2lvbmFkYXMgY29uIGxhIHZhcmlhYmxlIG9iamV0aXZvDQogIHBsb3QgPSBUDQopDQpgYGANCkxhIHZhcmlhYmxlIGNhbGN1bGFkYSBkZSBUb3RhbCBkZSBEZXh0cmFuYSAoc3VtYSBkZSBsYSBkZXh0cmFuYSBkZWwgZMOtYSBlbiBsb3MgZGlzdGludG9zIHB1bnRvcyBkZSBtdWVzdHJlbykgbXVlc3RyYSB1bmEgY29ycmVsYWNpw7NuIGRpcmVjdGEgY29uIGxhcyBtZWRpY2lvbmVzIGRlICoqcHVyZXphcyBkZSBtYXRlcmlhbGVzKiouIEFkaWNpb25hbCwgZXhpc3RlIHVuYSBjb3JyZWxhY2nDs24gZGlyZWN0YSBjb24gbGEgKipDYW50aWRhZCBkZSBQYXJvcyBwb3IgRMOtYSoqLg0KDQoNCioqRGV4dHJhbmEgSnVnbyBQcmltYXJpbyBUQSoqDQpgYGB7cn0NCmNvcnJfdmFyKGRmLCAjIG5vbWJyZSBkZWwgZGF0YWZyYW1lDQogIERleHRyYW5hLlByaW1hcmlvLkEsICMgdmFyaWFibGUgb2JqZXRpdm8NCiAgbWF4X3B2YWx1ZSA9IDAuMDUsICMgbml2ZWwgZGUgc2lnbmlmaWNhbmNpYSBwYXJhIGxhIHJlZ2nDs24gZGUgcmVjaGF6byBlbiBsYXMgcHJ1ZWJhcyBkZSBoaXDDs3Rlc2lzDQogIHRvcCA9IDMwLCAjIGRlc3BsaWVndWUgZGUgbGFzIDMwIHZhcmlhYmxlcyBtw6FzIGNvcnJlbGFjaW9uYWRhcyBjb24gbGEgdmFyaWFibGUgb2JqZXRpdm8NCiAgcGxvdCA9IFQNCikNCmBgYA0KDQoqKkRleHRyYW5hIEp1Z28gUHJpbWFyaW8gVEIqKg0KYGBge3J9DQpjb3JyX3ZhcihkZiwgIyBub21icmUgZGVsIGRhdGFmcmFtZQ0KICBEZXh0cmFuYS5QcmltYXJpby5CLCAjIHZhcmlhYmxlIG9iamV0aXZvDQogIG1heF9wdmFsdWUgPSAwLjA1LCAjIG5pdmVsIGRlIHNpZ25pZmljYW5jaWEgcGFyYSBsYSByZWdpw7NuIGRlIHJlY2hhem8gZW4gbGFzIHBydWViYXMgZGUgaGlww7N0ZXNpcw0KICB0b3AgPSAzMCwgIyBkZXNwbGllZ3VlIGRlIGxhcyAzMCB2YXJpYWJsZXMgbcOhcyBjb3JyZWxhY2lvbmFkYXMgY29uIGxhIHZhcmlhYmxlIG9iamV0aXZvDQogIHBsb3QgPSBUDQopDQpgYGANCg0KTGEgZGV4dHJhbmEgZW4gZWwganVnbyBwcmltYXJpbyBkZWwgVEEgcGFyZWNlIHRlbmVyIG1heW9yIGNvcnJlbGFjacOzbiBjb24gbGEgZGV4dHJhbmEgcXVlIHNlIG1pZGUgYWwgaW50ZXJpb3IgZGVsIHByb2Nlc28uIEVzdGUgZXMgdW4gZGF0byByZWxldmFudGUgY29uc2lkZXJhbmRvIHF1ZSBsYXMgbWVkaWFzIGRlIGxhcyBkZXh0cmFuYXMgZW4gYW1ib3MgdMOhbmRlbXMgZXMgYmFzdGFudGUgc2ltaWxhci4gTGFzICoqdmFyaWFjaW9uZXMgZGUgZGV4dHJhbmEgbWVkaWRhcyBhbCBpbnRlcmlvciBkZWwgcHJvY2VzbyBwYXJlY2VuIHRlbmVyIG3DoXMgcmVsYWNpw7NuIGNvbiBsYXMgdmFyaWFjaW9uZXMgZGUgbGEgZGV4dHJhbmEgZGVsIFRBIHF1ZSBjb24gbGFzIHZhcmlhY2lvbmVzIGRlIGRleHRyYW5hIGRlbCBUQioqLiBFbiB1biBhbsOhbGlzaXMgcG9zdGVyaW9yIHNlIGludmVzdGlnYXLDoSBsYSByZWxhY2nDs24gY29uIGVsIHRpcG8gZGUgY2HDsWEgcXVlIGluZ3Jlc2EgZW4gZXN0ZSB0w6FuZGVtLg0KDQoqKkRleHRyYW5hIEp1Z28gRGlsdWlkbyBUQSoqDQpgYGB7cn0NCmNvcnJfdmFyKGRmLCAjIG5vbWJyZSBkZWwgZGF0YWZyYW1lDQogIERleHRyYW5hLkRpbHVpZG8uQSwgIyB2YXJpYWJsZSBvYmpldGl2bw0KICBtYXhfcHZhbHVlID0gMC4wNSwgIyBuaXZlbCBkZSBzaWduaWZpY2FuY2lhIHBhcmEgbGEgcmVnacOzbiBkZSByZWNoYXpvIGVuIGxhcyBwcnVlYmFzIGRlIGhpcMOzdGVzaXMNCiAgdG9wID0gMzAsICMgZGVzcGxpZWd1ZSBkZSBsYXMgMzAgdmFyaWFibGVzIG3DoXMgY29ycmVsYWNpb25hZGFzIGNvbiBsYSB2YXJpYWJsZSBvYmpldGl2bw0KICBwbG90ID0gVA0KKQ0KYGBgDQoNCioqRGV4dHJhbmEgSnVnbyBEaWx1aWRvIFRCKioNCmBgYHtyfQ0KY29ycl92YXIoZGYsICMgbm9tYnJlIGRlbCBkYXRhZnJhbWUNCiAgRGV4dHJhbmEuRGlsdWlkby5CLCAjIHZhcmlhYmxlIG9iamV0aXZvDQogIG1heF9wdmFsdWUgPSAwLjA1LCAjIG5pdmVsIGRlIHNpZ25pZmljYW5jaWEgcGFyYSBsYSByZWdpw7NuIGRlIHJlY2hhem8gZW4gbGFzIHBydWViYXMgZGUgaGlww7N0ZXNpcw0KICB0b3AgPSAzMCwgIyBkZXNwbGllZ3VlIGRlIGxhcyAzMCB2YXJpYWJsZXMgbcOhcyBjb3JyZWxhY2lvbmFkYXMgY29uIGxhIHZhcmlhYmxlIG9iamV0aXZvDQogIHBsb3QgPSBUDQopDQpgYGANCg0KRW4gbG9zIGp1Z29zIGRpbHVpZG9zLCBlbCBlZmVjdG8gcGFyZWNlIHNlciBzaW1pbGFyIHNvYnJlIGxhcyBwdXJlemFzIHkgZWwgdGllbXBvIHBlcmRpZG8uIEVuIGVsIHTDoW5kZW0gIkIiIHNpbiBlbWJhcmdvLCBhcGFyZWNlbiBtw6FzIGNvcnJlbGFjaW9uZXMgY29uIHZhcmlhYmxlcyByZWxhY2lvbmFkYXMgYSAqbGEgY2FsaWRhZCBkZSBjYcOxYSosIGVzcGVjw61maWNhbWVudGUgZW4gZWwgcGVzbyBkZSAqY2HDsWEgYWNvcmNoYWRhIHkgbGFsYXMqLiBPYnNlcnZlIHF1ZSBsYSB0aWVycmEgeSBsb3MgY29nb2xsb3MgcGFyZWNlbiBubyBjb250cmlidWlyIGEgbGEgZGV4dHJhbmEuIA0KTGFzIHZhcmlhYmxlcyBkZWwgcHJvY2VzbyBkZSBmw6FicmljYSBwb2Ryw61hbiBlc3RhciBhZmVjdGFkYXMgcG9yIGxhIGNvcnJlbGFjacOzbiBjb24gZWwgdGllbXBvIHBlcmRpZG8geSBsYSBmcmVjdWVuY2lhIGRlIHBhcm9zLg0KDQoqKkRleHRyYW5hIEp1Z28gQ2xhcm8qKg0KYGBge3J9DQpjb3JyX3ZhcihkZiwgIyBub21icmUgZGVsIGRhdGFmcmFtZQ0KICBEZXh0cmFuYS5KdWdvLkNsYXJvLCAjIHZhcmlhYmxlIG9iamV0aXZvDQogIG1heF9wdmFsdWUgPSAwLjA1LCAjIG5pdmVsIGRlIHNpZ25pZmljYW5jaWEgcGFyYSBsYSByZWdpw7NuIGRlIHJlY2hhem8gZW4gbGFzIHBydWViYXMgZGUgaGlww7N0ZXNpcw0KICB0b3AgPSAzMCwgIyBkZXNwbGllZ3VlIGRlIGxhcyAzMCB2YXJpYWJsZXMgbcOhcyBjb3JyZWxhY2lvbmFkYXMgY29uIGxhIHZhcmlhYmxlIG9iamV0aXZvDQogIHBsb3QgPSBUDQopDQpgYGANCkVuIGVsIEp1Z28gY2xhcm8sIHNlIG9ic2VydmEgdW5hIGNvcnJlbGFjacOzbiBuZWdhdGl2YSBjb24gbGEgZXh0cmFjY2nDs24gZGUgbG9zIHTDoW5kZW1zLCANCg0KYGBge3J9DQpnZ3Bsb3QoZGYsIGFlcyh4PURleHRyYW5hLkp1Z28uQ2xhcm8sIHk9RXh0cmFjY2nDs24uRmlicmEuMTIuNSkpICsgDQogICAgZ2VvbV9wb2ludCgNCiAgICAgICAgY29sb3I9Im9yYW5nZSIsDQogICAgICAgIGZpbGw9IiM2OWIzYTIiLA0KICAgICAgICBzaGFwZT0yMSwNCiAgICAgICAgYWxwaGE9MC41LA0KICAgICAgICBzaXplPTYsDQogICAgICAgIHN0cm9rZSA9IDINCiAgICAgICAgKSArDQogICAgZ2VvbV9zbW9vdGgobWV0aG9kPWxtICwgY29sb3I9ImJsdWUiLCBmaWxsPSIjNjliM2EyIiwgc2U9VFJVRSkgKw0KIGdndGl0bGUoIkV4dHJhY2Npw7NuIEZpYnJhIDEyLjUgdnJzLiBEZXh0cmFuYSBKdWdvIENsYXJvIikgKw0KICB4bGFiKCJEZXh0cmFuYSBKdWdvIENsYXJvIChtZy9rZykiKSArIHlsYWIoIkV4dHJhY2Npw7NuIEZpYnJhIDEyLjUgKCUpIikNCmBgYA0KDQp5IGFkaWNpb25hbG1lbnRlIHVuYSAqKmNvcnJlbGFjacOzbiBuZWdhdGl2YSBjb24gbGEgcMOpcmRpZGEgaW5kZXRlcm1pbmFkYSoqLiBFc3RlIHJlc3VsdGFkbyBzZSBkZWJlIGNvcnJvYm9yYXIgY29uIG3DoXMgbXVlc3RyYXMuDQoNCmBgYHtyfQ0KZ2dwbG90KGRmLCBhZXMoeD1EZXh0cmFuYS5KdWdvLkNsYXJvLCB5PVDDqXJkaWRhcy5pbmRldGVybWluYWRhcy4uS2cudC4uNjAyOCkpICsgDQogICAgZ2VvbV9wb2ludCgNCiAgICAgICAgY29sb3I9Im9yYW5nZSIsDQogICAgICAgIGZpbGw9IiM2OWIzYTIiLA0KICAgICAgICBzaGFwZT0yMSwNCiAgICAgICAgYWxwaGE9MC41LA0KICAgICAgICBzaXplPTYsDQogICAgICAgIHN0cm9rZSA9IDINCiAgICAgICAgKSArDQogICAgZ2VvbV9zbW9vdGgobWV0aG9kPWxtICwgY29sb3I9ImJsdWUiLCBmaWxsPSIjNjliM2EyIiwgc2U9VFJVRSkgKw0KIGdndGl0bGUoIlBlcmRpZGEgSW5kZXRlcm1pbmFkYSB2cnMuIERleHRyYW5hIEp1Z28gQ2xhcm8iKSArDQogIHhsYWIoIkRleHRyYW5hIEp1Z28gQ2xhcm8gKG1nL2tnKSIpICsgeWxhYigiUMOpcmRpZGEgSW5kZXRlcm1pbmFkYSAoa2cvdCkiKQ0KYGBgDQoNCioqRGV4dHJhbmEgSnVnbyBGaWx0cmFkbyoqDQpgYGB7cn0NCmNvcnJfdmFyKGRmLCAjIG5vbWJyZSBkZWwgZGF0YWZyYW1lDQogIERleHRyYW5hLkp1Z28uRmlsdHJhZG8sICMgdmFyaWFibGUgb2JqZXRpdm8NCiAgbWF4X3B2YWx1ZSA9IDAuMDUsICMgbml2ZWwgZGUgc2lnbmlmaWNhbmNpYSBwYXJhIGxhIHJlZ2nDs24gZGUgcmVjaGF6byBlbiBsYXMgcHJ1ZWJhcyBkZSBoaXDDs3Rlc2lzDQogIHRvcCA9IDMwLCAjIGRlc3BsaWVndWUgZGUgbGFzIDMwIHZhcmlhYmxlcyBtw6FzIGNvcnJlbGFjaW9uYWRhcyBjb24gbGEgdmFyaWFibGUgb2JqZXRpdm8NCiAgcGxvdCA9IFQNCikNCmBgYA0KTGEgZGV4dHJhbmEgZW4gZWwganVnbyBmaWx0cmFkbyBtdWVzdHJhIHVuYSBjb3JyZWxhY2nDs24gY29uIGxhICoqdmFyaWFjacOzbiBlbiBsYSBncmFudWxvbWV0csOtYSwgbGFzIGNlbml6YXMgeSBsYSBodW1lZGFkIGRlbCBhesO6Y2FyKiouIEVzdG8gcHVlZGUgdmVyc2UgZW4gbG9zIHJldGVuaWRvcyBkZWwgYXrDumNhciBibGFuY28sIHBhcmEgZGlzdGludGFzIGFwZXJ0dXJhcyBkZSBtYWxsYS4gKipFcyBpbXBvcnRhbnRlIG5vdGFyIHF1ZSBlc3RhIG1lZGljacOzbiBkZSBkZXh0cmFuYSBlbiBqdWdvIGZpbHRyYWRvIGVzIGxhIHF1ZSBtdWVzdHJhIG1heW9yIGltcGFjdG8gc29icmUgbGEgY2FsaWRhZCBkZWwgYXrDumNhci4qKg0KDQpgYGB7cn0NCmdncGxvdChkZiwgYWVzKHg9RGV4dHJhbmEuSnVnby5GaWx0cmFkbywgeT1SZXRlbmlkby5tYWxsYS4zNS5BesO6Y2FyLkJsYW5jby50b3RhbCkpICsgDQogICAgZ2VvbV9wb2ludCgNCiAgICAgICAgY29sb3I9Im9yYW5nZSIsDQogICAgICAgIGZpbGw9IiM2OWIzYTIiLA0KICAgICAgICBzaGFwZT0yMSwNCiAgICAgICAgYWxwaGE9MC41LA0KICAgICAgICBzaXplPTYsDQogICAgICAgIHN0cm9rZSA9IDINCiAgICAgICAgKSArDQogICAgZ2VvbV9zbW9vdGgobWV0aG9kPWxtICwgY29sb3I9ImJsdWUiLCBmaWxsPSIjNjliM2EyIiwgc2U9VFJVRSkgKw0KIGdndGl0bGUoIlJldGVuaWRvIE1hbGxhIDM1IEJsYW5jbyB2cnMuIERleHRyYW5hIEp1Z28gRmlsdHJhZG8iKSArDQogIHhsYWIoIkRleHRyYW5hIEp1Z28gRmlsdHJhZG8gKG1nL2tnKSIpICsgeWxhYigiUmV0ZW5pZG8gTWFsbGEgMzUgQmxhbmNvICglKSIpDQpgYGANCkFzw60gbWlzbW8gYXBhcmVjZSB1bmEgY29ycmVsYWNpw7NuIHBvc2l0aXZhIGNvbiBsYSAqKlDDqXJkaWRhIGVuIE1vbGllbmRhKiogKEVudHJlIGVsIENvcmUgeSBlbCBQb2wgZW4gQ2HDsWEgSW5kdXN0cmlhbCkuDQoNCmBgYHtyfQ0KZ2dwbG90KGRmLCBhZXMoeD1EZXh0cmFuYS5KdWdvLkZpbHRyYWRvLCB5PVDDqXJkaWRhcy5Nb2xpZW5kYS4uS2cudC4uNTc2NykpICsgDQogICAgZ2VvbV9wb2ludCgNCiAgICAgICAgY29sb3I9Im9yYW5nZSIsDQogICAgICAgIGZpbGw9IiM2OWIzYTIiLA0KICAgICAgICBzaGFwZT0yMSwNCiAgICAgICAgYWxwaGE9MC41LA0KICAgICAgICBzaXplPTYsDQogICAgICAgIHN0cm9rZSA9IDINCiAgICAgICAgKSArDQogICAgZ2VvbV9zbW9vdGgobWV0aG9kPWxtICwgY29sb3I9ImJsdWUiLCBmaWxsPSIjNjliM2EyIiwgc2U9VFJVRSkgKw0KIGdndGl0bGUoIlBlcmRpZGFzIGVuIE1vbGllbmRhIHZycy4gRGV4dHJhbmEgSnVnbyBGaWx0cmFkbyIpICsNCiAgeGxhYigiRGV4dHJhbmEgSnVnbyBGaWx0cmFkbyAobWcva2cpIikgKyB5bGFiKCJQw6lyZGlkYXMgZW4gTW9saWVuZGEgKGtnL3QpIikNCmBgYA0KRmluYWxtZW50ZSwgZW4gZWwgSnVnbyBGaWx0cmFkbyBwdWVkZSBvYnNlcnZhcnNlIHVuYSBjb3JyZWxhY2nDs24gY29uIGVsICoqVHJhc2ggZGUgbGEgQ2HDsWEgZGUgQ29zZWNoYSBNYW51YWwqKi4NCg0KYGBge3J9DQpnZ3Bsb3QoZGYsIGFlcyh4PURleHRyYW5hLkp1Z28uRmlsdHJhZG8sIHk9VHJhc2guZGUuY2HDsWEubWFudWFsKSkgKyANCiAgICBnZW9tX3BvaW50KA0KICAgICAgICBjb2xvcj0ib3JhbmdlIiwNCiAgICAgICAgZmlsbD0iIzY5YjNhMiIsDQogICAgICAgIHNoYXBlPTIxLA0KICAgICAgICBhbHBoYT0wLjUsDQogICAgICAgIHNpemU9NiwNCiAgICAgICAgc3Ryb2tlID0gMg0KICAgICAgICApICsNCiAgICBnZW9tX3Ntb290aChtZXRob2Q9bG0gLCBjb2xvcj0iYmx1ZSIsIGZpbGw9IiM2OWIzYTIiLCBzZT1UUlVFKSArDQogZ2d0aXRsZSgiVHJhc2ggQ2HDsWEgTWFudWFsIHZycy4gRGV4dHJhbmEgSnVnbyBGaWx0cmFkbyIpICsNCiAgeGxhYigiRGV4dHJhbmEgSnVnbyBGaWx0cmFkbyAobWcva2cpIikgKyB5bGFiKCJUcmFzaCBDYcOxYSBNYW51YWwgKCUpIikNCmBgYA0KDQoNCioqRGV4dHJhbmEgTWVsYXphKioNCmBgYHtyfQ0KY29ycl92YXIoZGYsICMgbm9tYnJlIGRlbCBkYXRhZnJhbWUNCiAgRGV4dHJhbmEuTWVsYXphLCAjIHZhcmlhYmxlIG9iamV0aXZvDQogIG1heF9wdmFsdWUgPSAwLjA1LCAjIG5pdmVsIGRlIHNpZ25pZmljYW5jaWEgcGFyYSBsYSByZWdpw7NuIGRlIHJlY2hhem8gZW4gbGFzIHBydWViYXMgZGUgaGlww7N0ZXNpcw0KICB0b3AgPSAzMCwgIyBkZXNwbGllZ3VlIGRlIGxhcyAzMCB2YXJpYWJsZXMgbcOhcyBjb3JyZWxhY2lvbmFkYXMgY29uIGxhIHZhcmlhYmxlIG9iamV0aXZvDQogIHBsb3QgPSBUDQopDQpgYGANCkZpbmFsbWVudGUgbGEgZGV4dHJhbmEgZW4gbGEgbWVsYXphIGVzdMOhIGNvcnJlbGFjaW9uYWRhIGNvbiBsYSAqKmNhbnRpZGFkIGRlIHBhcm9zIHBvciBkw61hKiouIFRhbWJpw6luIHNlIHB1ZWRlIHZlciB1bmEgY29ycmVsYWNpw7NuIG5lZ2F0aXZhIGNvbiBlbCBUcmFzaCBkZSBsYSBDYcOxYSBNZWNhbml6YWRhIFF1ZW1hZGEsIGxhIHRpZXJyYSB5IGxhIG1hc2EgZGUgY29nb2xsb3MuDQoNCkVuIGVzdG9zIHJlc3VsdGFkb3MgcHJlbGltaW5hcmVzLCAqKnBhcmVjZSBoYWJlciB1biBlZmVjdG8gcHJvdmVuaWVudGUgZGUgbGEgY2HDsWEgZGVsIHTDoW5kZW0gQSBwcmluY2lwYWxtZW50ZSwgY29uIGNvc2VjaGEgbWFudWFsKiouIEVzdG8gc2UgaW52ZXN0aWdhcsOhIGVuIGVsIGFuw6FsaXNpcyBkZSB2YXJpYWJsZXMgYWdyw61jb2xhcy4gRW4gY3VhbnRvIGFsIHByb2Nlc28gaW50ZXJubywgbGEgZGV4dHJhbmEgZXN0w6EgKipjb3JyZWxhY2lvbmFkYSBwb3NpdGl2YW1lbnRlIGNvbiBsYXMgbWVkaWNpb25lcyBkZSBwdXJlemEgZGUgbWF0ZXJpYWxlcyB5IGxhIHDDqXJkaWRhIGVuIG1vbGllbmRhKiouDQo=