Importar base de datos

El primer paso de todo archivo es importar una base de datos en CSV.

#file.choose() 

bd <- read.csv("C:\\Users\\danyc\\OneDrive - Instituto Tecnologico y de Estudios Superiores de Monterrey\\Desktop\\Excel y CSV\\rentadebicis (2).csv")  

Herramienta “El Generador de Valor de Datos”

Paso 1. Definir el área del negocio que buscamos impactar o mejorar y su KPI

Dentro de las rentas de bicis, buscamos mejorar o impactar las rentas al aumentarlas y de la misma manera los KPI´s a impactar son:

a. Permanencia del cliente b. Eficiencia del Stock c. Ventas mensuales

Paso 2. Seleccionar plantilla(-s) para crear valor a partir de los datos de los clientes.

Visión / Segmentación / Personalización / Contextualización

Paso 3. Generar ideas o conceptos específicos.

Generar un modelo de negocios predictivo anual/mensual que englobe los KPI´s elegidos en nuestra base de datos enfocandose en mejorar las rentas mensuales.

Paso 4. Reunir los datos requeridos.

Necesito:
Locación de rentas, numero de bicis rentadas, temporada en donde se rentó la bici.

Paso 5. Plan de ejecución.

La ejecución sería el trabajar junto con el área de mercadotecnía y business development para generar planes de aumento en rentas dentro de los días soleados y ofrecer un valor agregado a los clientes para seguir manteniendolos durante todo el año.

Entender base de datos

Aquí se pueden visualizar todos los datos dentro de nuestra base de datos

resumen <- summary(bd) 
resumen 
##       hora            dia              mes              año      
##  Min.   : 0.00   Min.   : 1.000   Min.   : 1.000   Min.   :2011  
##  1st Qu.: 6.00   1st Qu.: 5.000   1st Qu.: 4.000   1st Qu.:2011  
##  Median :12.00   Median :10.000   Median : 7.000   Median :2012  
##  Mean   :11.54   Mean   : 9.993   Mean   : 6.521   Mean   :2012  
##  3rd Qu.:18.00   3rd Qu.:15.000   3rd Qu.:10.000   3rd Qu.:2012  
##  Max.   :23.00   Max.   :19.000   Max.   :12.000   Max.   :2012  
##     estacion     dia_de_la_semana     asueto         temperatura   
##  Min.   :1.000   Min.   :1.000    Min.   :0.00000   Min.   : 0.82  
##  1st Qu.:2.000   1st Qu.:2.000    1st Qu.:0.00000   1st Qu.:13.94  
##  Median :3.000   Median :4.000    Median :0.00000   Median :20.50  
##  Mean   :2.507   Mean   :4.014    Mean   :0.02857   Mean   :20.23  
##  3rd Qu.:4.000   3rd Qu.:6.000    3rd Qu.:0.00000   3rd Qu.:26.24  
##  Max.   :4.000   Max.   :7.000    Max.   :1.00000   Max.   :41.00  
##  sensacion_termica    humedad       velocidad_del_viento
##  Min.   : 0.76     Min.   :  0.00   Min.   : 0.000      
##  1st Qu.:16.66     1st Qu.: 47.00   1st Qu.: 7.002      
##  Median :24.24     Median : 62.00   Median :12.998      
##  Mean   :23.66     Mean   : 61.89   Mean   :12.799      
##  3rd Qu.:31.06     3rd Qu.: 77.00   3rd Qu.:16.998      
##  Max.   :45.45     Max.   :100.00   Max.   :56.997      
##  rentas_de_no_registrados rentas_de_registrados rentas_totales 
##  Min.   :  0.00           Min.   :  0.0         Min.   :  1.0  
##  1st Qu.:  4.00           1st Qu.: 36.0         1st Qu.: 42.0  
##  Median : 17.00           Median :118.0         Median :145.0  
##  Mean   : 36.02           Mean   :155.6         Mean   :191.6  
##  3rd Qu.: 49.00           3rd Qu.:222.0         3rd Qu.:284.0  
##  Max.   :367.00           Max.   :886.0         Max.   :977.0
plot(bd$temperatura,bd$rentas_totales, main="Influencia de la Temperatura sobre las Rentas Totales", xlab="Temperatura", ylab="Cantidad", col="green") 

Observaciones

  1. ¿Porqué los días llegan hasta el 19 y no hasta el 31?

  2. ¿Las estaciones son 4? Si 1. Invierno, 2. Primavera, 3.Verano y 4. Otoño.

Generar regresión líneal

La regresión líneal en este caso es para revisar como son dependientes algunas variables para las rentas totales.

 regresion <- lm (rentas_totales ~  hora + dia +mes + año + estacion + dia_de_la_semana + asueto + temperatura + sensacion_termica + humedad + velocidad_del_viento, data= bd)
summary (regresion)
## 
## Call:
## lm(formula = rentas_totales ~ hora + dia + mes + año + estacion + 
##     dia_de_la_semana + asueto + temperatura + sensacion_termica + 
##     humedad + velocidad_del_viento, data = bd)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -305.52  -93.64  -27.70   61.85  649.10 
## 
## Coefficients:
##                        Estimate Std. Error t value Pr(>|t|)    
## (Intercept)          -1.661e+05  5.496e+03 -30.217  < 2e-16 ***
## hora                  7.735e+00  2.070e-01  37.368  < 2e-16 ***
## dia                   3.844e-01  2.482e-01   1.549  0.12150    
## mes                   9.996e+00  1.682e+00   5.943 2.89e-09 ***
## año                   8.258e+01  2.732e+00  30.225  < 2e-16 ***
## estacion             -7.774e+00  5.177e+00  -1.502  0.13324    
## dia_de_la_semana      4.393e-01  6.918e-01   0.635  0.52545    
## asueto               -4.864e+00  8.365e+00  -0.582  0.56089    
## temperatura           1.582e+00  1.038e+00   1.524  0.12752    
## sensacion_termica     4.748e+00  9.552e-01   4.971 6.76e-07 ***
## humedad              -2.115e+00  7.884e-02 -26.827  < 2e-16 ***
## velocidad_del_viento  5.582e-01  1.809e-01   3.086  0.00203 ** 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 141.7 on 10874 degrees of freedom
## Multiple R-squared:  0.3891, Adjusted R-squared:  0.3885 
## F-statistic: 629.6 on 11 and 10874 DF,  p-value: < 2.2e-16

Evaluar y en caso necesario ajustar la regresión líneal

En este ajuste, se vió que muchos de las variables puestas en la regresión pasada, no erán servibles para nuestro propósito y se filtraron para tener una regresión más acertada.

regresion<- lm (rentas_totales ~hora + mes + año + sensacion_termica + humedad + velocidad_del_viento, data= bd)
summary (regresion) 
## 
## Call:
## lm(formula = rentas_totales ~ hora + mes + año + sensacion_termica + 
##     humedad + velocidad_del_viento, data = bd)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -308.60  -93.85  -28.34   61.05  648.09 
## 
## Coefficients:
##                        Estimate Std. Error t value Pr(>|t|)    
## (Intercept)          -1.662e+05  5.496e+03 -30.250  < 2e-16 ***
## hora                  7.734e+00  2.070e-01  37.364  < 2e-16 ***
## mes                   7.574e+00  4.207e-01  18.002  < 2e-16 ***
## año                   8.266e+01  2.732e+00  30.258  < 2e-16 ***
## sensacion_termica     6.172e+00  1.689e-01  36.539  < 2e-16 ***
## humedad              -2.121e+00  7.858e-02 -26.988  < 2e-16 ***
## velocidad_del_viento  6.208e-01  1.771e-01   3.506 0.000457 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 141.7 on 10879 degrees of freedom
## Multiple R-squared:  0.3886, Adjusted R-squared:  0.3883 
## F-statistic:  1153 on 6 and 10879 DF,  p-value: < 2.2e-16

Construir modelo predictivo

datos_nuevos <- data.frame(hora=12, mes=1:12, año=2013, sensacion_termica=24, humedad=62, velocidad_del_viento=13) 

predict(regresion, datos_nuevos)
##        1        2        3        4        5        6        7        8 
## 279.1478 286.7215 294.2952 301.8690 309.4427 317.0164 324.5901 332.1638 
##        9       10       11       12 
## 339.7375 347.3112 354.8849 362.4587

Limpieza de Nombre

Se utiliza esta biblioteca y función para limpiar los nombres y corregir errores que puedan tener.

library("janitor") 
## 
## Attaching package: 'janitor'
## The following objects are masked from 'package:stats':
## 
##     chisq.test, fisher.test
bd<-clean_names(bd) 

Conclusión y Aprendizajes

Dentro del modelo predictivo de renta de bicis se pudo observar que al realizar la regresión líneal se van aumentando las rentas de bicis en los últimos meses del año, esto en relación a nuestras variables utilizadas con más imponencia ante otras para hacer la predicción, como lo fueron la sensación térmica, viento, hora, mes, etc.

Es importante que para el modelo de negocios de renta de bicis, se mantenga un análisis cercano que se vaya retroalimentando con los años debido a que con el paso de los años cambian las tendencias y los cambios climáticos serían algo que se tendría que identificar con predicciónes para generar distintos escenarios posibles y ver en dónde caerían en cada año. Otra propuesta sería el generar una aplicacion de e-commerce para la renta de las bicis y así satisfacer las necesidades del consumidor con más facilidad en cuanto a la rapidez y disponibilidad de las bicis.

Personalmente pienso que un análisis de regresión lineal es importante ya que te informa acerca de una variable y sus movimientos segun los valores de otras, esto nos ayuda a determinar ciertos comportamientos en un periodo determinado de tiempo.

LS0tDQp0aXRsZTogPHNwYW4gc3R5bGU9IkNvbG9yOnJlZCI+IE1vZGVsbyBQcmVkaWN0aXZvICJSZW50YSBkZSBCaWNpcyI8L3NwYW4+DQphdXRob3I6ICJEYW5pZWxhIEPDoXJkZW5hcyBaIC8vIEEwMTcyMDUzNSINCmRhdGU6ICIyMDIyLTA5LTA4Ig0Kb3V0cHV0OiANCiAgICBodG1sX2RvY3VtZW50Og0KICAgICAgICB0b2M6IHRydWUNCiAgICAgICAgdG9jX2Zsb2F0OiB0cnVlDQogICAgICAgIGNvZGVfZm9sZGluZzogImhpZGUiDQogICAgICAgIGNvZGVfZG93bmxvYWQ6IHRydWUNCi0tLQ0KKioqIA0KDQojIDxpbWcgc3JjPSAiQzpcXFVzZXJzXFxkYW55Y1xcRG93bmxvYWRzXFwxLnBuZyIgLz4gIA0KDQojIDxzcGFuIHN0eWxlPSJDb2xvcjpnb2xkIj4gSW1wb3J0YXIgYmFzZSBkZSBkYXRvcyA8L3NwYW4+DQpFbCBwcmltZXIgcGFzbyBkZSB0b2RvIGFyY2hpdm8gZXMgaW1wb3J0YXIgdW5hIGJhc2UgZGUgZGF0b3MgZW4gQ1NWLg0KYGBge3J9DQojZmlsZS5jaG9vc2UoKSANCg0KYmQgPC0gcmVhZC5jc3YoIkM6XFxVc2Vyc1xcZGFueWNcXE9uZURyaXZlIC0gSW5zdGl0dXRvIFRlY25vbG9naWNvIHkgZGUgRXN0dWRpb3MgU3VwZXJpb3JlcyBkZSBNb250ZXJyZXlcXERlc2t0b3BcXEV4Y2VsIHkgQ1NWXFxyZW50YWRlYmljaXMgKDIpLmNzdiIpICANCg0KYGBgDQoNCiMgPHNwYW4gc3R5bGU9IkNvbG9yOmdvbGQiPiBIZXJyYW1pZW50YSDigJxFbCBHZW5lcmFkb3IgZGUgVmFsb3IgZGUgRGF0b3PigJ0gPC9zcGFuPg0KPHN0eWxlPg0KZGl2LmJsdWUgeyBiYWNrZ3JvdW5kLWNvbG9yOiM1ODk4MWY7IGJvcmRlci1yYWRpdXM6IDVweDsgcGFkZGluZzogMjBweDt9DQo8L3N0eWxlPg0KPGRpdiBjbGFzcyA9ICJibHVlIj4NCg0KKlBhc28gMS4qIERlZmluaXIgZWwgw6FyZWEgZGVsIG5lZ29jaW8gcXVlIGJ1c2NhbW9zIGltcGFjdGFyIG8gbWVqb3JhciB5IHN1IEtQSSANCg0KRGVudHJvIGRlIGxhcyByZW50YXMgZGUgYmljaXMsIGJ1c2NhbW9zIG1lam9yYXIgbyBpbXBhY3RhciBsYXMgcmVudGFzIGFsIGF1bWVudGFybGFzIHkgZGUgbGEgbWlzbWEgbWFuZXJhIGxvcyBLUEnCtHMgYSBpbXBhY3RhciBzb246ICANCg0KKiphLiBQZXJtYW5lbmNpYSBkZWwgY2xpZW50ZSANCiAgYi4gRWZpY2llbmNpYSBkZWwgU3RvY2sgDQogIGMuIFZlbnRhcyBtZW5zdWFsZXMgKioNCg0KKlBhc28gMi4qIFNlbGVjY2lvbmFyIHBsYW50aWxsYSgtcykgcGFyYSBjcmVhciB2YWxvciBhIHBhcnRpciBkZSBsb3MgZGF0b3MgZGUgbG9zIGNsaWVudGVzLiANCg0KKipWaXNpw7NuKiogLyBTZWdtZW50YWNpw7NuIC8gUGVyc29uYWxpemFjacOzbiAvIENvbnRleHR1YWxpemFjacOzbg0KDQoqUGFzbyAzLiogR2VuZXJhciBpZGVhcyBvIGNvbmNlcHRvcyBlc3BlY8OtZmljb3MuIA0KDQpHZW5lcmFyIHVuIG1vZGVsbyBkZSBuZWdvY2lvcyBwcmVkaWN0aXZvIGFudWFsL21lbnN1YWwgcXVlIGVuZ2xvYmUgbG9zIEtQScK0cyBlbGVnaWRvcyBlbiBudWVzdHJhIGJhc2UgZGUgZGF0b3MgZW5mb2NhbmRvc2UgZW4gbWVqb3JhciBsYXMgcmVudGFzIG1lbnN1YWxlcy4gDQoNCipQYXNvIDQuKiBSZXVuaXIgbG9zIGRhdG9zIHJlcXVlcmlkb3MuICANCg0KTmVjZXNpdG86ICANCkxvY2FjacOzbiBkZSByZW50YXMsIG51bWVybyBkZSBiaWNpcyByZW50YWRhcywgdGVtcG9yYWRhIGVuIGRvbmRlIHNlIHJlbnTDsyBsYSBiaWNpLg0KDQoqUGFzbyA1LiogUGxhbiBkZSBlamVjdWNpw7NuLiANCg0KTGEgZWplY3VjacOzbiBzZXLDrWEgZWwgdHJhYmFqYXIganVudG8gY29uIGVsIMOhcmVhIGRlIG1lcmNhZG90ZWNuw61hIHkgYnVzaW5lc3MgZGV2ZWxvcG1lbnQgcGFyYSBnZW5lcmFyIHBsYW5lcyBkZSBhdW1lbnRvIGVuIHJlbnRhcyBkZW50cm8gZGUgbG9zIGTDrWFzIHNvbGVhZG9zIHkgb2ZyZWNlciB1biB2YWxvciBhZ3JlZ2FkbyBhIGxvcyBjbGllbnRlcyBwYXJhIHNlZ3VpciBtYW50ZW5pZW5kb2xvcyBkdXJhbnRlIHRvZG8gZWwgYcOxby4NCg0KPC9kaXY+DQoNCiMjIDxzcGFuIHN0eWxlPSJDb2xvcjpnb2xkIj4gRW50ZW5kZXIgYmFzZSBkZSBkYXRvcyA8L3NwYW4+DQpBcXXDrSBzZSBwdWVkZW4gdmlzdWFsaXphciB0b2RvcyBsb3MgZGF0b3MgZGVudHJvIGRlIG51ZXN0cmEgYmFzZSBkZSBkYXRvcyANCmBgYHtyfQ0KcmVzdW1lbiA8LSBzdW1tYXJ5KGJkKSANCnJlc3VtZW4gDQoNCnBsb3QoYmQkdGVtcGVyYXR1cmEsYmQkcmVudGFzX3RvdGFsZXMsIG1haW49IkluZmx1ZW5jaWEgZGUgbGEgVGVtcGVyYXR1cmEgc29icmUgbGFzIFJlbnRhcyBUb3RhbGVzIiwgeGxhYj0iVGVtcGVyYXR1cmEiLCB5bGFiPSJDYW50aWRhZCIsIGNvbD0iZ3JlZW4iKSANCg0KYGBgDQoNCg0KIyMjIDxzcGFuIHN0eWxlPSJDb2xvcjpvcmFuZ2UiPiBPYnNlcnZhY2lvbmVzIDwvc3Bhbj4gICANCjxzdHlsZT4NCmRpdi5ibHVlIHsgYmFja2dyb3VuZC1jb2xvcjojNTg5ODFmOyBib3JkZXItcmFkaXVzOiA1cHg7IHBhZGRpbmc6IDIwcHg7fQ0KPC9zdHlsZT4NCjxkaXYgY2xhc3MgPSAiYmx1ZSI+DQoxLiDCv1BvcnF1w6kgbG9zIGTDrWFzIGxsZWdhbiBoYXN0YSBlbCAxOSB5IG5vIGhhc3RhIGVsIDMxPyANCg0KMi4gwr9MYXMgZXN0YWNpb25lcyBzb24gND8gU2kgMS4gSW52aWVybm8sIDIuIFByaW1hdmVyYSwgMy5WZXJhbm8geSA0LiBPdG/DsW8uICANCjwvZGl2Pg0KDQojIDxzcGFuIHN0eWxlPSJDb2xvcjpnb2xkIj4gR2VuZXJhciByZWdyZXNpw7NuIGzDrW5lYWwgPC9zcGFuPg0KTGEgcmVncmVzacOzbiBsw61uZWFsIGVuIGVzdGUgY2FzbyBlcyBwYXJhIHJldmlzYXIgY29tbyBzb24gZGVwZW5kaWVudGVzIGFsZ3VuYXMgdmFyaWFibGVzIHBhcmEgbGFzIHJlbnRhcyB0b3RhbGVzLiANCmBgYHtyfQ0KIHJlZ3Jlc2lvbiA8LSBsbSAocmVudGFzX3RvdGFsZXMgfiAgaG9yYSArIGRpYSArbWVzICsgYcOxbyArIGVzdGFjaW9uICsgZGlhX2RlX2xhX3NlbWFuYSArIGFzdWV0byArIHRlbXBlcmF0dXJhICsgc2Vuc2FjaW9uX3Rlcm1pY2EgKyBodW1lZGFkICsgdmVsb2NpZGFkX2RlbF92aWVudG8sIGRhdGE9IGJkKQ0Kc3VtbWFyeSAocmVncmVzaW9uKQ0KYGBgDQoNCiANCg0KIyMjIDxzcGFuIHN0eWxlPSJDb2xvcjpvcmFuZ2UiPiBFdmFsdWFyIHkgZW4gY2FzbyBuZWNlc2FyaW8gYWp1c3RhciBsYSByZWdyZXNpw7NuIGzDrW5lYWwgIDwvc3Bhbj4gIA0KRW4gZXN0ZSBhanVzdGUsIHNlIHZpw7MgcXVlIG11Y2hvcyBkZSBsYXMgdmFyaWFibGVzIHB1ZXN0YXMgZW4gbGEgcmVncmVzacOzbiBwYXNhZGEsIG5vIGVyw6FuIHNlcnZpYmxlcyBwYXJhIG51ZXN0cm8gcHJvcMOzc2l0byB5IHNlIGZpbHRyYXJvbiBwYXJhIHRlbmVyIHVuYSByZWdyZXNpw7NuIG3DoXMgYWNlcnRhZGEuDQpgYGB7cn0NCnJlZ3Jlc2lvbjwtIGxtIChyZW50YXNfdG90YWxlcyB+aG9yYSArIG1lcyArIGHDsW8gKyBzZW5zYWNpb25fdGVybWljYSArIGh1bWVkYWQgKyB2ZWxvY2lkYWRfZGVsX3ZpZW50bywgZGF0YT0gYmQpDQpzdW1tYXJ5IChyZWdyZXNpb24pIA0KYGBgDQoNCg0KDQojIDxzcGFuIHN0eWxlPSJDb2xvcjpnb2xkIj4gQ29uc3RydWlyIG1vZGVsbyBwcmVkaWN0aXZvIDwvc3Bhbj4NCg0KYGBge3J9DQpkYXRvc19udWV2b3MgPC0gZGF0YS5mcmFtZShob3JhPTEyLCBtZXM9MToxMiwgYcOxbz0yMDEzLCBzZW5zYWNpb25fdGVybWljYT0yNCwgaHVtZWRhZD02MiwgdmVsb2NpZGFkX2RlbF92aWVudG89MTMpIA0KDQpwcmVkaWN0KHJlZ3Jlc2lvbiwgZGF0b3NfbnVldm9zKQ0KYGBgDQoNCiMjICA8c3BhbiBzdHlsZT0iQ29sb3I6b3JhbmdlIj4gTGltcGllemEgZGUgTm9tYnJlICA8L3NwYW4+IA0KU2UgdXRpbGl6YSBlc3RhIGJpYmxpb3RlY2EgeSBmdW5jacOzbiBwYXJhIGxpbXBpYXIgbG9zIG5vbWJyZXMgeSBjb3JyZWdpciBlcnJvcmVzIHF1ZSBwdWVkYW4gdGVuZXIuDQpgYGB7cn0NCmxpYnJhcnkoImphbml0b3IiKSANCmJkPC1jbGVhbl9uYW1lcyhiZCkgDQpgYGANCg0KIyA8c3BhbiBzdHlsZT0iQ29sb3I6R29sZCI+IENvbmNsdXNpw7NuIHkgQXByZW5kaXphamVzIDwvc3Bhbj4gDQoNCjxzdHlsZT4NCmRpdi5ibHVlIHsgYmFja2dyb3VuZC1jb2xvcjojbGlnaHRncmVlbjsgYm9yZGVyLXJhZGl1czogNXB4OyBwYWRkaW5nOiAyMHB4O30NCjwvc3R5bGU+DQo8ZGl2IGNsYXNzID0gImJsdWUiPg0KDQpEZW50cm8gZGVsIG1vZGVsbyBwcmVkaWN0aXZvIGRlICoqcmVudGEgZGUgYmljaXMqKiBzZSBwdWRvIG9ic2VydmFyIHF1ZSBhbCByZWFsaXphciBsYSAgcmVncmVzacOzbiBsw61uZWFsIHNlIHZhbiBhdW1lbnRhbmRvIGxhcyByZW50YXMgZGUgYmljaXMgZW4gbG9zIMO6bHRpbW9zIG1lc2VzIGRlbCBhw7FvLCBlc3RvIGVuIHJlbGFjacOzbiBhIG51ZXN0cmFzIHZhcmlhYmxlcyB1dGlsaXphZGFzIGNvbiBtw6FzIGltcG9uZW5jaWEgYW50ZSBvdHJhcyBwYXJhIGhhY2VyIGxhIHByZWRpY2Npw7NuLCBjb21vIGxvIGZ1ZXJvbiBsYSBzZW5zYWNpw7NuIHTDqXJtaWNhLCB2aWVudG8sIGhvcmEsIG1lcywgZXRjLiAgDQoNCkVzIGltcG9ydGFudGUgcXVlIHBhcmEgZWwgbW9kZWxvIGRlIG5lZ29jaW9zIGRlIHJlbnRhIGRlIGJpY2lzLCBzZSBtYW50ZW5nYSB1biBhbsOhbGlzaXMgY2VyY2FubyBxdWUgc2UgdmF5YSByZXRyb2FsaW1lbnRhbmRvIGNvbiBsb3MgYcOxb3MgZGViaWRvIGEgcXVlIGNvbiBlbCBwYXNvIGRlIGxvcyBhw7FvcyBjYW1iaWFuIGxhcyB0ZW5kZW5jaWFzIHkgbG9zICpjYW1iaW9zIGNsaW3DoXRpY29zKiBzZXLDrWFuIGFsZ28gcXVlIHNlIHRlbmRyw61hIHF1ZSBpZGVudGlmaWNhciBjb24gcHJlZGljY2nDs25lcyBwYXJhIGdlbmVyYXIgZGlzdGludG9zIGVzY2VuYXJpb3MgcG9zaWJsZXMgeSB2ZXIgZW4gZMOzbmRlIGNhZXLDrWFuIGVuIGNhZGEgYcOxby4gDQpPdHJhIHByb3B1ZXN0YSBzZXLDrWEgZWwgZ2VuZXJhciB1bmEgYXBsaWNhY2lvbiBkZSBlLWNvbW1lcmNlIHBhcmEgbGEgcmVudGEgZGUgbGFzIGJpY2lzIHkgYXPDrSBzYXRpc2ZhY2VyIGxhcyBuZWNlc2lkYWRlcyBkZWwgY29uc3VtaWRvciBjb24gbcOhcyBmYWNpbGlkYWQgZW4gY3VhbnRvIGEgbGEgcmFwaWRleiB5IGRpc3BvbmliaWxpZGFkIGRlIGxhcyBiaWNpcy4NCg0KUGVyc29uYWxtZW50ZSBwaWVuc28gcXVlIHVuIGFuw6FsaXNpcyBkZSByZWdyZXNpw7NuIGxpbmVhbCBlcyBpbXBvcnRhbnRlIHlhIHF1ZSB0ZSBpbmZvcm1hIGFjZXJjYSBkZSB1bmEgdmFyaWFibGUgeSBzdXMgbW92aW1pZW50b3Mgc2VndW4gbG9zIHZhbG9yZXMgZGUgb3RyYXMsIGVzdG8gbm9zIGF5dWRhIGEgZGV0ZXJtaW5hciBjaWVydG9zIGNvbXBvcnRhbWllbnRvcyBlbiB1biBwZXJpb2RvIGRldGVybWluYWRvIGRlIHRpZW1wby4gDQo8L2Rpdj4NCg0KDQo8aW1nIHNyYz0gIkM6XFxVc2Vyc1xcZGFueWNcXERvd25sb2Fkc1xcMS5naWYiIC8+IA0K