Tarea Unidad 02

2023-17-4

Tarea Unidad 2

Al comienzo de cada semana, el estado de una máquina se determina midiendo la cantidad de corriente eléctrica que utiliza. En función de su lectura de amperaje, la máquina se clasifica en uno de los cuatro estados siguientes: bajo, medio, alto o fallido. Una máquina en estado bajo tiene una probabilidad de \(a\), \(b\) y \(c\) de estar en el estado medio, alto o fallido, respectivamente, al comienzo de la siguiente semana. Una máquina en estado medio tiene una probabilidad de \(d\) y \(e\) de estar en estado alta o fallida, respectivamente, al inicio de la siguiente semana; no puede, por sí sola, pasar al estado bajo. Una máquina en estado alto tiene una probabilidad de \(f\) de estar en el estado fallido al comienzo de la siguiente semana; no puede, por sí misma, pasar al estado bajo o medio. Si una máquina se encuentra en estado de fallo al comienzo de la semana, se inicia inmediatamente la reparación de la máquina para que (con probabilidad 1) esté en el estado bajo al comienzo de la semana siguiente. La máquina funciona 24x7.

IMPORTANTE: Los datos que tienes que utilizar son:

probabilidades: (a=0.1;b=0.06;c=0.04;d=0.19;e=0.06;f=0.2) y n=2

Ejercicio 1:

Modeliza este proceso como una CMTD y obtén la matriz de transición (de 1 paso). Responde con la suma de los elementos de la diagonal de dicha matriz.

Solución:

  • La suma de los elementos de la diagonal es 2.35 en la matriz de transición de primer paso
estados=c("B","M","A","F")
p1=matrix(c(0.8,0,0,1,0.1,0.75,0,0,0.06,0.19,0.8,0,0.04,0.06,0.2,0),nrow=4,dimnames=list(estados,estados))
proceso <- new("markovchain", states = estados, 
                 byrow = TRUE, transitionMatrix = p1, 
                 name = "misil")

ptran.n=function(p,n){
  # ptran es la matriz de transición de 1 paso
  # n son los pasos a dar
  i=1
  ptran=p
  while(i<n){
    p=p%*%ptran
    i=i+1
  }
return(p)  
}
ptran.n(p1,1)
##     B    M    A    F
## B 0.8 0.10 0.06 0.04
## M 0.0 0.75 0.19 0.06
## A 0.0 0.00 0.80 0.20
## F 1.0 0.00 0.00 0.00
# Suma de elementos de la diagonal
sum(diag(p1))
## [1] 2.35

Ejercicio 2:

Si una máquina nueva siempre comienza en el estado bajo, ¿cuál es la probabilidad de que la máquina esté en estado de fallo después de tres semanas?

Solución:

  • La probabilidad de que comience en “bajo” y al cabo de tres semanas esté en estado de fallo es de 0.0595
ini=c(1,0,0,0)
ini*proceso^3
##          B       M       A      F
## [1,] 0.594 0.18425 0.16225 0.0595
ini%*%ptran.n(p1,3)
##          B       M       A      F
## [1,] 0.594 0.18425 0.16225 0.0595

Ejercicio 3:

Y si hoy arranca en estado bajo, ¿cuántas horas (en promedio) transcurrirán hasta que dé un fallo?

Solución:

  • Tardaríamos 1747.2 horas en pasar de estado “bajo” a “fallo”
mfpt1=meanFirstPassageTime(proceso,"F");mfpt1
##    B    M    A 
## 10.4  7.8  5.0
# El sistema tiene en cuenta los tiempos en semanas, por lo que deberemos pasarlo a horas
# El resultado es el siguiente:
mfpt1["B"]*7*24
##      B 
## 1747.2

Ejercicio 4:

Si hoy está en modo fallo, ¿cuántas horas (en promedio) transcurrirán hasta que vuelva a dar un fallo?

Solución:

  • Vemos que si comenzamos en el fallo, tardamos 1915.2 horas en volver a este
recurrencia=meanRecurrenceTime(proceso)
recurrencia
##         B         M         A         F 
##  2.280000  5.700000  3.352941 11.400000
recurrencia["F"]*7*24
##      F 
## 1915.2

Ejercicio 5:

Si durante esta semana la máquina trabaja en estado bajo, transcurridas \(n\) semanas más, ¿cuántos días habrá estado funcionando la máquina? (Ayuda: Verifica que el número total de semanas en funcionamiento va ser de \(n+1\)).

Solución:

  • La máquina estará 20,37 días operativa
mocupa.proceso <- function(proceso, n)
{
  # Número de estados del proceso
  nestat <- dim(proceso)
  # Estados
  nombres<- names(proceso)
  # Generamos la matriz de ocupaciones
  mocupa <- diag(nestat)
  dimnames(mocupa) <- list(nombres, nombres)
#  mocupa <- matrix(rep(0, nestat*nestat),
#                 nrow = nestat, dimnames = list(nombres, nombres))
  # Bucle de cálculo de los tiempos de ocupación
  P=proceso[1:nestat,1:nestat]
  for (i in 1:n)
   mocupa <- mocupa + ptran.n(P,i)
  return(mocupa)
}
n=2
mocupa1=mocupa.proceso(proceso,n);mocupa1
##      B      M      A     F
## B 2.48 0.2550 0.1750 0.090
## M 0.06 2.3125 0.4845 0.143
## A 0.20 0.0000 2.4400 0.360
## F 1.80 0.1000 0.0600 1.040
# Días operativa 
(mocupa1["B","B"]+mocupa1["B","M"]+mocupa1["B","A"])*7
## [1] 20.37

Ejercicio 6:

A lo largo de un año, ¿cuánto tiempo, en porcentaje, estará funcionando la máquina?

Solución:

  • El 91,22% de los días estará operativa la máquina
pi1=steadyStates(proceso);pi1
##              B         M         A         F
## [1,] 0.4385965 0.1754386 0.2982456 0.0877193
prob=sum(pi1[,"B"]+pi1[,"M"]+pi1[,"A"]);prob
## [1] 0.9122807
# Días operativa 

Ejercicio 7:

A lo largo de un año, ¿cuántas semanas estará operativa la máquina (recuerda que un año tiene 52 semanas)?

Solución:

  • Hablando en días, 47.4386 semanas de 52 disponibles estará en funcionamiento
prob*52
## [1] 47.4386

Ejercicio 8:

Cada semana que la máquina está en estado bajo, se obtiene un beneficio de 1.000 euros; cada semana que la máquina está en el estado medio, se obtiene un beneficio de 500 euros; cada semana que la máquina está en estado alto, se obtiene un beneficio de 400 euros; y la semana en la que hay un fallo, se incurre en un coste de 700 euros por la reparación. ¿Cuál es el beneficio semanal a largo plazo?

  • Estado Bajo = 1000€ Beneficio
  • Estado Medio = 500€ Beneficio
  • Estado Alto = 400€ Beneficio
  • Estado Fallo = 700€ Pérdida

Solución:

beneficios=c(1000,500,400,-700)
cat("\n Beneficios semanales:", sum(pi1*beneficios))
## 
##  Beneficios semanales: 584.2105

Ejercicio 9:

Se ha sugerido cambiar la política de mantenimiento de la máquina. Si al comienzo de una semana la máquina está en estado alto, la máquina se deja fuera de servicio y es reparada para que al inicio de la siguiente semana vuelva a estar en el estado bajo. Cuando se realiza una reparación se incurre en un coste de 600 euros. ¿Merece la pena esta nueva política de mantenimiento en términos de beneficios esperados (sí/no)? Registra además, cuál es el beneficio semanal que se conseguiría.

Solución:

  • Con esta nueva política, se obtendrá un mayor beneficio, pasando de 584.2105€ semanales a 675€
estados=c("B","M","A","F")
p2=matrix(c(0.8,0,1,1,0.1,0.75,0,0,0.06,0.19,0,0,0.04,0.06,0,0),nrow=4,dimnames=list(estados,estados))
proceso2 <- new("markovchain", states = estados, 
                 byrow = TRUE, transitionMatrix = p2, 
                 name = "misil")
beneficios2=c(1000,500,-600,-600)
pi2=steadyStates(proceso2);pi2
##          B    M     A    F
## [1,] 0.625 0.25 0.085 0.04
cat("\n Beneficios semanales:", sum(pi2*beneficios2))
## 
##  Beneficios semanales: 675
LS0tDQp0aXRsZTogIlRhcmVhIFVuaWRhZCAwMiINCmRhdGU6ICIyMDIzLTE3LTQiDQpvdXRwdXQ6IA0KICBybWRmb3JtYXRzOjpkb3duY3V0ZSA6DQogICAgY29kZV9kb3dubG9hZDogVFJVRQ0KICAgIGhpZ2hsaWd0aDogImthdGUiDQogICAgc2VsZl9jb250YWluZWQ6IHRydWUNCiAgICBjb2RlX2ZvbGRpbmc6ICJoaWRlIg0KICAgIHRodW1ibmFpbHM6IHRydWUNCiAgICBnYWxsZXJ5OiB0cnVlDQogICAgZmlnX3dpZHRoOiA0DQogICAgZmlnX2hlaWdodDogNA0KICAgIGRmX3ByaW50OiBrYWJsZQ0KcGtnZG93bjoNCiAgYXNfaXM6dHJ1ZQ0KLS0tDQoNCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQ0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBUUlVFKQ0KbGlicmFyeShtYXJrb3ZjaGFpbikNCmBgYA0KIyMgVGFyZWEgVW5pZGFkIDINCiMjIyMgQWwgY29taWVuem8gZGUgY2FkYSBzZW1hbmEsIGVsIGVzdGFkbyBkZSB1bmEgbcOhcXVpbmEgc2UgZGV0ZXJtaW5hIG1pZGllbmRvIGxhIGNhbnRpZGFkIGRlIGNvcnJpZW50ZSBlbMOpY3RyaWNhIHF1ZSB1dGlsaXphLiBFbiBmdW5jacOzbiBkZSBzdSBsZWN0dXJhIGRlIGFtcGVyYWplLCBsYSBtw6FxdWluYSBzZSBjbGFzaWZpY2EgZW4gdW5vIGRlIGxvcyBjdWF0cm8gZXN0YWRvcyBzaWd1aWVudGVzOiBiYWpvLCBtZWRpbywgYWx0byBvIGZhbGxpZG8uIFVuYSBtw6FxdWluYSBlbiBlc3RhZG8gYmFqbyB0aWVuZSB1bmEgcHJvYmFiaWxpZGFkIGRlICRhJCwgJGIkIHkgJGMkIGRlIGVzdGFyIGVuIGVsIGVzdGFkbyBtZWRpbywgYWx0byBvIGZhbGxpZG8sIHJlc3BlY3RpdmFtZW50ZSwgYWwgY29taWVuem8gZGUgbGEgc2lndWllbnRlIHNlbWFuYS4gVW5hIG3DoXF1aW5hIGVuIGVzdGFkbyBtZWRpbyB0aWVuZSB1bmEgcHJvYmFiaWxpZGFkIGRlICRkJCB5ICRlJCBkZSBlc3RhciBlbiBlc3RhZG8gYWx0YSBvIGZhbGxpZGEsIHJlc3BlY3RpdmFtZW50ZSwgYWwgaW5pY2lvIGRlIGxhIHNpZ3VpZW50ZSBzZW1hbmE7IG5vIHB1ZWRlLCBwb3Igc8OtIHNvbGEsIHBhc2FyIGFsIGVzdGFkbyBiYWpvLiBVbmEgbcOhcXVpbmEgZW4gZXN0YWRvIGFsdG8gdGllbmUgdW5hIHByb2JhYmlsaWRhZCBkZSAkZiQgZGUgZXN0YXIgZW4gZWwgZXN0YWRvIGZhbGxpZG8gYWwgY29taWVuem8gZGUgbGEgc2lndWllbnRlIHNlbWFuYTsgbm8gcHVlZGUsIHBvciBzw60gbWlzbWEsIHBhc2FyIGFsIGVzdGFkbyBiYWpvIG8gbWVkaW8uIFNpIHVuYSBtw6FxdWluYSBzZSBlbmN1ZW50cmEgZW4gZXN0YWRvIGRlIGZhbGxvIGFsIGNvbWllbnpvIGRlIGxhIHNlbWFuYSwgc2UgaW5pY2lhIGlubWVkaWF0YW1lbnRlIGxhIHJlcGFyYWNpw7NuIGRlIGxhIG3DoXF1aW5hIHBhcmEgcXVlIChjb24gcHJvYmFiaWxpZGFkIDEpIGVzdMOpIGVuIGVsIGVzdGFkbyBiYWpvIGFsIGNvbWllbnpvIGRlIGxhIHNlbWFuYSBzaWd1aWVudGUuIExhIG3DoXF1aW5hIGZ1bmNpb25hIDI0eDcuDQoNCiMjIyMgKipJTVBPUlRBTlRFKio6IExvcyBkYXRvcyBxdWUgdGllbmVzIHF1ZSB1dGlsaXphciBzb246DQoNCiMjIyMgKipwcm9iYWJpbGlkYWRlcyoqOiAoYT0wLjE7Yj0wLjA2O2M9MC4wNDtkPTAuMTk7ZT0wLjA2O2Y9MC4yKSB5ICoqbioqPTINCg0KDQojIyMgKipFamVyY2ljaW8gMToqKg0KIyMjIyBNb2RlbGl6YSBlc3RlIHByb2Nlc28gY29tbyB1bmEgQ01URCB5IG9idMOpbiBsYSBtYXRyaXogZGUgdHJhbnNpY2nDs24gKGRlIDEgcGFzbykuIFJlc3BvbmRlIGNvbiBsYSBzdW1hIGRlIGxvcyBlbGVtZW50b3MgZGUgbGEgZGlhZ29uYWwgZGUgZGljaGEgbWF0cml6Lg0KDQojIyMjICoqU29sdWNpw7NuOioqDQotICAgTGEgc3VtYSBkZSBsb3MgZWxlbWVudG9zIGRlIGxhIGRpYWdvbmFsIGVzIDIuMzUgZW4gbGEgbWF0cml6IGRlIHRyYW5zaWNpw7NuIGRlIHByaW1lciBwYXNvDQoNCmBgYHtyfQ0KZXN0YWRvcz1jKCJCIiwiTSIsIkEiLCJGIikNCnAxPW1hdHJpeChjKDAuOCwwLDAsMSwwLjEsMC43NSwwLDAsMC4wNiwwLjE5LDAuOCwwLDAuMDQsMC4wNiwwLjIsMCksbnJvdz00LGRpbW5hbWVzPWxpc3QoZXN0YWRvcyxlc3RhZG9zKSkNCnByb2Nlc28gPC0gbmV3KCJtYXJrb3ZjaGFpbiIsIHN0YXRlcyA9IGVzdGFkb3MsIA0KICAgICAgICAgICAgICAgICBieXJvdyA9IFRSVUUsIHRyYW5zaXRpb25NYXRyaXggPSBwMSwgDQogICAgICAgICAgICAgICAgIG5hbWUgPSAibWlzaWwiKQ0KDQpwdHJhbi5uPWZ1bmN0aW9uKHAsbil7DQogICMgcHRyYW4gZXMgbGEgbWF0cml6IGRlIHRyYW5zaWNpw7NuIGRlIDEgcGFzbw0KICAjIG4gc29uIGxvcyBwYXNvcyBhIGRhcg0KICBpPTENCiAgcHRyYW49cA0KICB3aGlsZShpPG4pew0KICAgIHA9cCUqJXB0cmFuDQogICAgaT1pKzENCiAgfQ0KcmV0dXJuKHApICANCn0NCnB0cmFuLm4ocDEsMSkNCg0KIyBTdW1hIGRlIGVsZW1lbnRvcyBkZSBsYSBkaWFnb25hbA0Kc3VtKGRpYWcocDEpKQ0KYGBgDQoNCiMjIyAqKkVqZXJjaWNpbyAyOioqDQojIyMjIFNpIHVuYSBtw6FxdWluYSBudWV2YSBzaWVtcHJlIGNvbWllbnphIGVuIGVsIGVzdGFkbyBiYWpvLCDCv2N1w6FsIGVzIGxhIHByb2JhYmlsaWRhZCBkZSBxdWUgbGEgbcOhcXVpbmEgZXN0w6kgZW4gZXN0YWRvIGRlIGZhbGxvIGRlc3B1w6lzIGRlIHRyZXMgc2VtYW5hcz8NCg0KIyMjIyAqKlNvbHVjacOzbjoqKg0KLSAgIExhIHByb2JhYmlsaWRhZCBkZSBxdWUgY29taWVuY2UgZW4gImJham8iIHkgYWwgY2FibyBkZSB0cmVzIHNlbWFuYXMgZXN0w6kgZW4gZXN0YWRvIGRlIGZhbGxvIGVzIGRlIDAuMDU5NQ0KDQpgYGB7cn0NCmluaT1jKDEsMCwwLDApDQppbmkqcHJvY2Vzb14zDQppbmklKiVwdHJhbi5uKHAxLDMpDQpgYGANCg0KIyMjICoqRWplcmNpY2lvIDM6KioNCiMjIyMgWSBzaSBob3kgYXJyYW5jYSBlbiBlc3RhZG8gYmFqbywgwr9jdcOhbnRhcyBob3JhcyAoZW4gcHJvbWVkaW8pIHRyYW5zY3Vycmlyw6FuIGhhc3RhIHF1ZSBkw6kgdW4gZmFsbG8/IA0KDQojIyMjICoqU29sdWNpw7NuOioqDQotICAgVGFyZGFyw61hbW9zIDE3NDcuMiBob3JhcyBlbiBwYXNhciBkZSBlc3RhZG8gImJham8iIGEgImZhbGxvIg0KDQpgYGB7cn0NCm1mcHQxPW1lYW5GaXJzdFBhc3NhZ2VUaW1lKHByb2Nlc28sIkYiKTttZnB0MQ0KIyBFbCBzaXN0ZW1hIHRpZW5lIGVuIGN1ZW50YSBsb3MgdGllbXBvcyBlbiBzZW1hbmFzLCBwb3IgbG8gcXVlIGRlYmVyZW1vcyBwYXNhcmxvIGEgaG9yYXMNCiMgRWwgcmVzdWx0YWRvIGVzIGVsIHNpZ3VpZW50ZToNCm1mcHQxWyJCIl0qNyoyNA0KDQpgYGANCg0KIyMjICoqRWplcmNpY2lvIDQ6KioNCiMjIyMgU2kgaG95IGVzdMOhIGVuIG1vZG8gZmFsbG8sIMK/Y3XDoW50YXMgaG9yYXMgKGVuIHByb21lZGlvKSB0cmFuc2N1cnJpcsOhbiBoYXN0YSBxdWUgdnVlbHZhIGEgZGFyIHVuIGZhbGxvPyANCg0KIyMjIyAqKlNvbHVjacOzbjoqKg0KLSAgIFZlbW9zIHF1ZSBzaSBjb21lbnphbW9zIGVuIGVsIGZhbGxvLCB0YXJkYW1vcyAxOTE1LjIgaG9yYXMgZW4gdm9sdmVyIGEgZXN0ZQ0KDQpgYGB7cn0NCg0KcmVjdXJyZW5jaWE9bWVhblJlY3VycmVuY2VUaW1lKHByb2Nlc28pDQpyZWN1cnJlbmNpYQ0KcmVjdXJyZW5jaWFbIkYiXSo3KjI0DQpgYGANCg0KIyMjICoqRWplcmNpY2lvIDU6KioNCiMjIyMgU2kgZHVyYW50ZSBlc3RhIHNlbWFuYSBsYSBtw6FxdWluYSB0cmFiYWphIGVuIGVzdGFkbyBiYWpvLCB0cmFuc2N1cnJpZGFzICRuJCBzZW1hbmFzIG3DoXMsIMK/Y3XDoW50b3MgZMOtYXMgaGFicsOhIGVzdGFkbyBmdW5jaW9uYW5kbyBsYSBtw6FxdWluYT8gKEF5dWRhOiBWZXJpZmljYSBxdWUgZWwgbsO6bWVybyB0b3RhbCBkZSBzZW1hbmFzIGVuIGZ1bmNpb25hbWllbnRvIHZhIHNlciBkZSAkbisxJCkuIA0KDQojIyMjICoqU29sdWNpw7NuOioqDQotICAgTGEgbcOhcXVpbmEgZXN0YXLDoSAyMCwzNyBkw61hcyBvcGVyYXRpdmENCg0KYGBge3J9DQptb2N1cGEucHJvY2VzbyA8LSBmdW5jdGlvbihwcm9jZXNvLCBuKQ0Kew0KICAjIE7Dum1lcm8gZGUgZXN0YWRvcyBkZWwgcHJvY2Vzbw0KICBuZXN0YXQgPC0gZGltKHByb2Nlc28pDQogICMgRXN0YWRvcw0KICBub21icmVzPC0gbmFtZXMocHJvY2VzbykNCiAgIyBHZW5lcmFtb3MgbGEgbWF0cml6IGRlIG9jdXBhY2lvbmVzDQogIG1vY3VwYSA8LSBkaWFnKG5lc3RhdCkNCiAgZGltbmFtZXMobW9jdXBhKSA8LSBsaXN0KG5vbWJyZXMsIG5vbWJyZXMpDQojICBtb2N1cGEgPC0gbWF0cml4KHJlcCgwLCBuZXN0YXQqbmVzdGF0KSwNCiMgICAgICAgICAgICAgICAgIG5yb3cgPSBuZXN0YXQsIGRpbW5hbWVzID0gbGlzdChub21icmVzLCBub21icmVzKSkNCiAgIyBCdWNsZSBkZSBjw6FsY3VsbyBkZSBsb3MgdGllbXBvcyBkZSBvY3VwYWNpw7NuDQogIFA9cHJvY2Vzb1sxOm5lc3RhdCwxOm5lc3RhdF0NCiAgZm9yIChpIGluIDE6bikNCiAgIG1vY3VwYSA8LSBtb2N1cGEgKyBwdHJhbi5uKFAsaSkNCiAgcmV0dXJuKG1vY3VwYSkNCn0NCm49Mg0KbW9jdXBhMT1tb2N1cGEucHJvY2Vzbyhwcm9jZXNvLG4pO21vY3VwYTENCg0KIyBEw61hcyBvcGVyYXRpdmEgDQoobW9jdXBhMVsiQiIsIkIiXSttb2N1cGExWyJCIiwiTSJdK21vY3VwYTFbIkIiLCJBIl0pKjcNCmBgYA0KDQojIyMgKipFamVyY2ljaW8gNjoqKg0KIyMjIyBBIGxvIGxhcmdvIGRlIHVuIGHDsW8sIMK/Y3XDoW50byB0aWVtcG8sIGVuIHBvcmNlbnRhamUsIGVzdGFyw6EgZnVuY2lvbmFuZG8gbGEgbcOhcXVpbmE/DQoNCiMjIyMgKipTb2x1Y2nDs246KioNCi0gICBFbCA5MSwyMiUgZGUgbG9zIGTDrWFzIGVzdGFyw6Egb3BlcmF0aXZhIGxhIG3DoXF1aW5hDQoNCmBgYHtyfQ0KcGkxPXN0ZWFkeVN0YXRlcyhwcm9jZXNvKTtwaTENCnByb2I9c3VtKHBpMVssIkIiXStwaTFbLCJNIl0rcGkxWywiQSJdKTtwcm9iDQojIETDrWFzIG9wZXJhdGl2YSANCg0KYGBgDQoNCiMjIyAqKkVqZXJjaWNpbyA3OioqDQojIyMjIEEgbG8gbGFyZ28gZGUgdW4gYcOxbywgwr9jdcOhbnRhcyBzZW1hbmFzIGVzdGFyw6Egb3BlcmF0aXZhIGxhIG3DoXF1aW5hIChyZWN1ZXJkYSBxdWUgdW4gYcOxbyB0aWVuZSA1MiBzZW1hbmFzKT8NCg0KIyMjIyAqKlNvbHVjacOzbjoqKg0KLSAgIEhhYmxhbmRvIGVuIGTDrWFzLCA0Ny40Mzg2IHNlbWFuYXMgZGUgNTIgZGlzcG9uaWJsZXMgZXN0YXLDoSBlbiBmdW5jaW9uYW1pZW50byANCg0KYGBge3J9DQpwcm9iKjUyDQpgYGANCg0KIyMjICoqRWplcmNpY2lvIDg6KioNCiMjIyMgQ2FkYSBzZW1hbmEgcXVlIGxhIG3DoXF1aW5hIGVzdMOhIGVuIGVzdGFkbyBiYWpvLCBzZSBvYnRpZW5lIHVuIGJlbmVmaWNpbyBkZSAxLjAwMCBldXJvczsgY2FkYSBzZW1hbmEgcXVlIGxhIG3DoXF1aW5hIGVzdMOhIGVuIGVsIGVzdGFkbyBtZWRpbywgc2Ugb2J0aWVuZSB1biBiZW5lZmljaW8gZGUgNTAwIGV1cm9zOyBjYWRhIHNlbWFuYSBxdWUgbGEgbcOhcXVpbmEgZXN0w6EgZW4gZXN0YWRvIGFsdG8sIHNlIG9idGllbmUgdW4gYmVuZWZpY2lvIGRlIDQwMCBldXJvczsgeSBsYSBzZW1hbmEgZW4gbGEgcXVlIGhheSB1biBmYWxsbywgc2UgaW5jdXJyZSBlbiB1biBjb3N0ZSBkZSA3MDAgZXVyb3MgcG9yIGxhIHJlcGFyYWNpw7NuLiDCv0N1w6FsIGVzIGVsIGJlbmVmaWNpbyBzZW1hbmFsIGEgbGFyZ28gcGxhem8/DQoNCg0KLSAgICAgRXN0YWRvIEJham8gPSAxMDAw4oKsIEJlbmVmaWNpbw0KLSAgICAgRXN0YWRvIE1lZGlvID0gNTAw4oKsIEJlbmVmaWNpbw0KLSAgICAgRXN0YWRvIEFsdG8gPSA0MDDigqwgQmVuZWZpY2lvDQotICAgICBFc3RhZG8gRmFsbG8gPSA3MDDigqwgUMOpcmRpZGENCg0KIyMjIyAqKlNvbHVjacOzbjoqKg0KDQpgYGB7cn0NCmJlbmVmaWNpb3M9YygxMDAwLDUwMCw0MDAsLTcwMCkNCmNhdCgiXG4gQmVuZWZpY2lvcyBzZW1hbmFsZXM6Iiwgc3VtKHBpMSpiZW5lZmljaW9zKSkNCmBgYA0KDQojIyMgKipFamVyY2ljaW8gOToqKg0KIyMjIyBTZSBoYSBzdWdlcmlkbyBjYW1iaWFyIGxhIHBvbMOtdGljYSBkZSBtYW50ZW5pbWllbnRvIGRlIGxhIG3DoXF1aW5hLiBTaSBhbCBjb21pZW56byBkZSB1bmEgc2VtYW5hIGxhIG3DoXF1aW5hIGVzdMOhIGVuIGVzdGFkbyBhbHRvLCBsYSBtw6FxdWluYSBzZSBkZWphIGZ1ZXJhIGRlIHNlcnZpY2lvIHkgZXMgcmVwYXJhZGEgcGFyYSBxdWUgYWwgaW5pY2lvIGRlIGxhIHNpZ3VpZW50ZSBzZW1hbmEgdnVlbHZhIGEgZXN0YXIgZW4gZWwgZXN0YWRvIGJham8uIEN1YW5kbyBzZSByZWFsaXphIHVuYSByZXBhcmFjacOzbiBzZSBpbmN1cnJlIGVuIHVuIGNvc3RlIGRlIDYwMCBldXJvcy4gwr9NZXJlY2UgbGEgcGVuYSBlc3RhIG51ZXZhIHBvbMOtdGljYSBkZSBtYW50ZW5pbWllbnRvIGVuIHTDqXJtaW5vcyBkZSBiZW5lZmljaW9zIGVzcGVyYWRvcyAoc8OtL25vKT8gUmVnaXN0cmEgYWRlbcOhcywgY3XDoWwgZXMgZWwgYmVuZWZpY2lvIHNlbWFuYWwgcXVlIHNlIGNvbnNlZ3VpcsOtYS4NCg0KDQojIyMjICoqU29sdWNpw7NuOioqDQotICAgQ29uIGVzdGEgbnVldmEgcG9sw610aWNhLCBzZSBvYnRlbmRyw6EgdW4gbWF5b3IgYmVuZWZpY2lvLCBwYXNhbmRvIGRlIDU4NC4yMTA14oKsIHNlbWFuYWxlcyBhIDY3NeKCrA0KYGBge3J9DQplc3RhZG9zPWMoIkIiLCJNIiwiQSIsIkYiKQ0KcDI9bWF0cml4KGMoMC44LDAsMSwxLDAuMSwwLjc1LDAsMCwwLjA2LDAuMTksMCwwLDAuMDQsMC4wNiwwLDApLG5yb3c9NCxkaW1uYW1lcz1saXN0KGVzdGFkb3MsZXN0YWRvcykpDQpwcm9jZXNvMiA8LSBuZXcoIm1hcmtvdmNoYWluIiwgc3RhdGVzID0gZXN0YWRvcywgDQogICAgICAgICAgICAgICAgIGJ5cm93ID0gVFJVRSwgdHJhbnNpdGlvbk1hdHJpeCA9IHAyLCANCiAgICAgICAgICAgICAgICAgbmFtZSA9ICJtaXNpbCIpDQpiZW5lZmljaW9zMj1jKDEwMDAsNTAwLC02MDAsLTYwMCkNCnBpMj1zdGVhZHlTdGF0ZXMocHJvY2VzbzIpO3BpMg0KY2F0KCJcbiBCZW5lZmljaW9zIHNlbWFuYWxlczoiLCBzdW0ocGkyKmJlbmVmaWNpb3MyKSkNCmBgYA0KDQo=