De cada uno de los siguientes ejercicios, determinar cĂ³mo estarĂ¡ la subpoblaciĂ³n en 50 generaciones. AdemĂ¡s, deben realizar un grĂ¡fico para visualizar el comportamiento de la poblaciĂ³n de cada organismo.

Ejercicio 1

En un parche de bosque hĂºmedo de SarapiquĂ­ crece una poblaciĂ³n de 300 plantas de Heliconia latispatha. Las brĂ¡cteas son hojas modificadas de color vistoso que rodean las pequeñas flores verdaderas de la inflorescencia. En esta poblaciĂ³n, el 75 % de las plantas tiene brĂ¡cteas rojas, con genotipos RR o Rr, por lo que el alelo R es dominante. El 25 % restante tiene brĂ¡cteas amarillas, con genotipo rr, y el alelo r es recesivo.

La reproducciĂ³n de estas plantas depende de la polinizaciĂ³n. Los colibrĂ­es visitan las inflorescencias para alimentarse del nĂ©ctar, y el color de las brĂ¡cteas es la principal señal que los atrae. Cuando un colibrĂ­ se posa y luego vuela a otra planta, transporta polen de una inflorescencia a otra, lo que permite la formaciĂ³n de frutos. Una inflorescencia visitada con frecuencia produce mĂ¡s frutos y, por lo tanto, mĂ¡s semillas que pueden dar origen a nuevas plantas.

Durante una temporada de floraciĂ³n se contĂ³ el nĂºmero de frutos por inflorescencia. Las plantas de brĂ¡cteas rojas produjeron en promedio 14 frutos, mientras que las de brĂ¡cteas amarillas produjeron 11.

Supuesto de tiempo: una generaciĂ³n equivale a 4 años.

FitnessAA <- 14/225
FitnessAA
[1] 0.06222222
Fitnessaa <- 11/75
Fitnessaa
[1] 0.1466667
FitnessAA/Fitnessaa
[1] 0.4242424
library(deSolve)
library(ggplot2)
modelo <- function(time, state, parameters) {
  with(as.list(c(state, parameters)),{

    # ParĂ¡metros de fitness

    w_AA <- 0.06  # Fitness relativo de AA
    w_aa <- 0.14 # Fitness relativo de aa
    
      # Frecuencias alélicas
    p <- A  # Frecuencia de A
    q <- a  # Frecuencia de a
    
    # Fitness promedio poblacional
    w_prom <- p^2 * w_AA + q^2 * w_aa  
    
    # Tasa de cambio en la frecuencia del alelo A
    dp <- (p * q * (w_AA - w_aa)) / w_prom
    dq <- -dp  # La suma de frecuencias debe ser 1
    
    return(list(c(dp, dq)))
  })
}
# Condiciones iniciales
estado_inicial <- c(A = 0.75, a = 0.25)
# ParĂ¡metros
parametros <- NULL
# Tiempo
tiempo <- seq(0, 50, by = 0.5)
sol <- ode(y = estado_inicial, times = tiempo, func = modelo, parms = parametros)
head(sol)
     time         A         a
[1,]  0.0 0.7500000 0.2500000
[2,]  0.5 0.5430438 0.4569562
[3,]  1.0 0.3641180 0.6358820
[4,]  1.5 0.2493685 0.7506315
[5,]  2.0 0.1755574 0.8244426
[6,]  2.5 0.1260270 0.8739730
tail(sol)
       time            A a
 [96,] 47.5 2.518551e-12 1
 [97,] 48.0 1.958873e-12 1
 [98,] 48.5 1.523568e-12 1
 [99,] 49.0 1.184997e-12 1
[100,] 49.5 9.216644e-13 1
[101,] 50.0 7.168501e-13 1
# Graficar los resultados
plot(sol,
     xlab = "Tiempo", ylab = "Frecuencia de alelos",
     col = c("blue", "yellow"), lwd = 2)

library(ggplot2)
df <- as.data.frame(sol)
df <- cbind(tiempo = tiempo, df)
 
df_largo <- data.frame(
  tiempo     = rep(df$tiempo, 2),
  Alelo      = rep(c("Alelo A (rojo)", "Alelo a (amarillo)"), each = nrow(df)),
  Frecuencia = c(df$A, df$a)
)
ggplot(df_largo, aes(x = tiempo, y = Frecuencia, color = Alelo)) +
  geom_line(linewidth = 1.5) +
  scale_color_manual(values = c("Alelo A (rojo)"     = "#87CEFA",
                                "Alelo a (amarillo)" = "#FF69B4")) +
  scale_y_continuous(limits = c(0, 1), breaks = seq(0, 1, 0.25),
                     labels = scales::percent) +
  labs(title = "EvoluciĂ³n de los alelos del color de brĂ¡cteas",
       subtitle = expression(italic("Heliconia latispatha")),
       x = "Tiempo (generaciones)", y = "Frecuencia de alelos", color = NULL) +
  theme_minimal(base_size = 14) +
  theme(plot.title = element_text(face = "bold"),
        plot.subtitle = element_text(color = "gray40"),
        panel.grid.minor = element_blank(),
        legend.position = "top")

Ejercicio 2

En una finca de Upala se estudian 200 Ă¡rboles de cacao criollo. El color de la mazorca estĂ¡ controlado por un gen con dos alelos: R, que produce mazorca roja y es dominante, y r, que produce mazorca verde y es recesivo. El 60 % de los Ă¡rboles tiene mazorca roja, con genotipos RR o Rr, y el 40 % tiene mazorca verde, con genotipo rr.

El cacao se reproduce mediante flores que aparecen directamente sobre el tronco y las ramas gruesas. Estas flores son polinizadas principalmente por pequeños insectos, como los mosquitos del gĂ©nero Forcipomyia, que se desplazan entre flores buscando alimento. Para que una flor se convierta en mazorca, el polen debe llegar a su estigma y la planta debe ser compatible con ese polen, ya que el cacao tiene un sistema de autoincompatibilidad que favorece el cruce entre Ă¡rboles distintos. Una flor bien polinizada se transforma en una mazorca que contiene semillas, y las semillas son el producto que el agricultor cosecha. El color de la mazorca depende del genotipo de la planta que la produce, asĂ­ que la cantidad de mazorcas sanas que produce cada Ă¡rbol se relaciona directamente con su Ă©xito reproductivo.

Durante tres años se registrĂ³ el promedio anual de mazorcas sanas por Ă¡rbol. Los Ă¡rboles de mazorca roja produjeron 22 mazorcas por año, y los de mazorca verde produjeron 18.

Supuesto de tiempo: una generaciĂ³n equivale a 10 años.

FitnessGG
[1] 0.225
Fitnessgg
[1] 0.275
FitnessGG/Fitnessgg
[1] 0.8181818
# Condiciones iniciales
estado_inicial <- c(A = 0.60, a = 0.40)
# ParĂ¡metros
parametros <- NULL
# Tiempo
tiempo <- seq(0, 10, by = 0.5)
sol <- ode(y = estado_inicial, times = tiempo, func = modelo, parms = parametros)
head(sol)
     time         A         a
[1,]  0.0 0.6000000 0.4000000
[2,]  0.5 0.5498074 0.4501926
[3,]  1.0 0.4986099 0.5013901
[4,]  1.5 0.4484970 0.5515030
[5,]  2.0 0.4012255 0.5987745
[6,]  2.5 0.3578880 0.6421120
tail(sol)
      time          A         a
[16,]  7.5 0.11891388 0.8810861
[17,]  8.0 0.10727274 0.8927273
[18,]  8.5 0.09686706 0.9031329
[19,]  9.0 0.08754920 0.9124508
[20,]  9.5 0.07919164 0.9208084
[21,] 10.0 0.07168417 0.9283158
plot(sol,
     xlab = "Tiempo", ylab = "Frecuencia de alelos",
     col = c("lightblue", "pink"), lwd = 2)

library(ggplot2)
df <- as.data.frame(sol)
df <- cbind(tiempo = tiempo, df)
ggplot(df_largo, aes(x = tiempo, y = Frecuencia, color = Alelo)) +
  geom_line(linewidth = 1.5) +
  scale_color_manual(values = c("Alelo R (rojo)"  = "#C0392B",
                                "Alelo r (verde)" = "#4C9A52")) +
  scale_y_continuous(limits = c(0, 1), breaks = seq(0, 1, 0.25),
                     labels = scales::percent) +
  scale_x_continuous(breaks = seq(0, 10, 2)) +
  labs(title = "EvoluciĂ³n de los alelos del color de mazorca",
       subtitle = expression(italic("Theobroma cacao") ~ "criollo, Upala"),
       x = "Tiempo (generaciones)", y = "Frecuencia de alelos", color = NULL) +
  theme_minimal(base_size = 14) +
  theme(plot.title = element_text(face = "bold"),
        plot.subtitle = element_text(color = "gray40"),
        panel.grid.minor = element_blank(),
        legend.position = "top")

Ejercicio 3

En un embalse de la vertiente del PacĂ­fico vive una poblaciĂ³n de 500 individuos de guapote. Esta especie de cĂ­clido presenta dos morfos de coloraciĂ³n que dependen de un gen con dos alelos. El morfo dominante tiene coloraciĂ³n oscura con franjas laterales, con genotipos AA o Aa. El morfo recesivo tiene coloraciĂ³n clara y uniforme, con genotipo aa. En la poblaciĂ³n, el 84 % pertenece al morfo dominante y el 16 % al morfo recesivo.

El guapote tiene cuidado parental biparental. DespuĂ©s de la reproducciĂ³n, la pareja construye un nido, defiende los huevos y luego protege a las crĂ­as durante sus primeras semanas. Esta defensa reduce la depredaciĂ³n, pero las crĂ­as siguen enfrentando riesgos como la competencia por alimento, los depredadores de mayor tamaño y los cambios en la calidad del agua. La supervivencia de las crĂ­as hasta los 6 meses de edad determina cuĂ¡ntos individuos llegan a reproducirse. En este caso, sobreviviĂ³ el 92 % de las crĂ­as del morfo dominante y el 78 % de las del morfo recesivo.

Supuesto de tiempo: una generaciĂ³n equivale a 3 años.

FitnessAA
[1] 0.84
Fitnessaa
[1] 0.78
FitnessAA/Fitnessaa
[1] 1.076923
library(deSolve)
library(ggplot2)
tail(sol)
      time         A          a
[36,] 17.5 0.9587807 0.04121929
[37,] 18.0 0.9602843 0.03971573
[38,] 18.5 0.9617310 0.03826903
[39,] 19.0 0.9631231 0.03687689
[40,] 19.5 0.9644629 0.03553712
[41,] 20.0 0.9657524 0.03424762
# Graficar los resultados
plot(sol,
     xlab = "Tiempo", ylab = "Frecuencia de alelos",
     col = c("lightblue", "pink"), lwd = 2)

LS0tDQp0aXRsZTogIkVqZXJjaWNpb3MgQ2FtYmlvcyBHZW7DqXRpY29zIFBvYmxhY2lvbmFsZXMiDQpvdXRwdXQ6IA0KICBodG1sX25vdGVib29rOiANCiAgICB0b2M6IHRydWUNCiAgICB0aGVtZTogZmxhdGx5DQotLS0NCg0KRGUgY2FkYSB1bm8gZGUgbG9zIHNpZ3VpZW50ZXMgZWplcmNpY2lvcywgZGV0ZXJtaW5hciBjw7NtbyBlc3RhcsOhIGxhIHN1YnBvYmxhY2nDs24gZW4gNTAgZ2VuZXJhY2lvbmVzLiBBZGVtw6FzLCBkZWJlbiByZWFsaXphciB1biBncsOhZmljbyBwYXJhIHZpc3VhbGl6YXIgZWwgY29tcG9ydGFtaWVudG8gZGUgbGEgcG9ibGFjacOzbiBkZSBjYWRhIG9yZ2FuaXNtby4NCg0KIyBFamVyY2ljaW8gMQ0KDQpFbiB1biBwYXJjaGUgZGUgYm9zcXVlIGjDum1lZG8gZGUgU2FyYXBpcXXDrSBjcmVjZSB1bmEgcG9ibGFjacOzbiBkZSAzMDAgcGxhbnRhcyBkZcKgKkhlbGljb25pYSBsYXRpc3BhdGhhKi4gTGFzIGJyw6FjdGVhcyBzb24gaG9qYXMgbW9kaWZpY2FkYXMgZGUgY29sb3IgdmlzdG9zbyBxdWUgcm9kZWFuIGxhcyBwZXF1ZcOxYXMgZmxvcmVzIHZlcmRhZGVyYXMgZGUgbGEgaW5mbG9yZXNjZW5jaWEuIEVuIGVzdGEgcG9ibGFjacOzbiwgZWwgNzUgJSBkZSBsYXMgcGxhbnRhcyB0aWVuZSBicsOhY3RlYXMgcm9qYXMsIGNvbiBnZW5vdGlwb3MgUlIgbyBSciwgcG9yIGxvIHF1ZSBlbCBhbGVsbyBSIGVzIGRvbWluYW50ZS4gRWwgMjUgJSByZXN0YW50ZSB0aWVuZSBicsOhY3RlYXMgYW1hcmlsbGFzLCBjb24gZ2Vub3RpcG8gcnIsIHkgZWwgYWxlbG8gciBlcyByZWNlc2l2by4NCg0KTGEgcmVwcm9kdWNjacOzbiBkZSBlc3RhcyBwbGFudGFzIGRlcGVuZGUgZGUgbGEgcG9saW5pemFjacOzbi4gTG9zIGNvbGlicsOtZXMgdmlzaXRhbiBsYXMgaW5mbG9yZXNjZW5jaWFzIHBhcmEgYWxpbWVudGFyc2UgZGVsIG7DqWN0YXIsIHkgZWwgY29sb3IgZGUgbGFzIGJyw6FjdGVhcyBlcyBsYSBwcmluY2lwYWwgc2XDsWFsIHF1ZSBsb3MgYXRyYWUuIEN1YW5kbyB1biBjb2xpYnLDrSBzZSBwb3NhIHkgbHVlZ28gdnVlbGEgYSBvdHJhIHBsYW50YSwgdHJhbnNwb3J0YSBwb2xlbiBkZSB1bmEgaW5mbG9yZXNjZW5jaWEgYSBvdHJhLCBsbyBxdWUgcGVybWl0ZSBsYSBmb3JtYWNpw7NuIGRlIGZydXRvcy4gVW5hIGluZmxvcmVzY2VuY2lhIHZpc2l0YWRhIGNvbiBmcmVjdWVuY2lhIHByb2R1Y2UgbcOhcyBmcnV0b3MgeSwgcG9yIGxvIHRhbnRvLCBtw6FzIHNlbWlsbGFzIHF1ZSBwdWVkZW4gZGFyIG9yaWdlbiBhIG51ZXZhcyBwbGFudGFzLg0KDQpEdXJhbnRlIHVuYSB0ZW1wb3JhZGEgZGUgZmxvcmFjacOzbiBzZSBjb250w7MgZWwgbsO6bWVybyBkZSBmcnV0b3MgcG9yIGluZmxvcmVzY2VuY2lhLiBMYXMgcGxhbnRhcyBkZSBicsOhY3RlYXMgcm9qYXMgcHJvZHVqZXJvbiBlbiBwcm9tZWRpbyAxNCBmcnV0b3MsIG1pZW50cmFzIHF1ZSBsYXMgZGUgYnLDoWN0ZWFzIGFtYXJpbGxhcyBwcm9kdWplcm9uIDExLg0KDQoqKlN1cHVlc3RvIGRlIHRpZW1wbzoqKsKgdW5hIGdlbmVyYWNpw7NuIGVxdWl2YWxlIGEgNCBhw7Fvcy4NCg0KYGBge3J9DQpGaXRuZXNzQUEgPC0gMTQvMjI1DQpGaXRuZXNzQUENCmBgYA0KDQpgYGB7cn0NCkZpdG5lc3NhYSA8LSAxMS83NQ0KRml0bmVzc2FhDQpgYGANCg0KYGBge3J9DQpGaXRuZXNzQUEvRml0bmVzc2FhDQpgYGANCg0KDQpgYGB7cn0NCmxpYnJhcnkoZGVTb2x2ZSkNCmxpYnJhcnkoZ2dwbG90MikNCmBgYA0KDQpgYGB7cn0NCm1vZGVsbyA8LSBmdW5jdGlvbih0aW1lLCBzdGF0ZSwgcGFyYW1ldGVycykgew0KICB3aXRoKGFzLmxpc3QoYyhzdGF0ZSwgcGFyYW1ldGVycykpLHsNCg0KICAgICMgUGFyw6FtZXRyb3MgZGUgZml0bmVzcw0KDQogICAgd19BQSA8LSAwLjA2ICAjIEZpdG5lc3MgcmVsYXRpdm8gZGUgQUENCiAgICB3X2FhIDwtIDAuMTQgIyBGaXRuZXNzIHJlbGF0aXZvIGRlIGFhDQogICAgDQogICAgICAjIEZyZWN1ZW5jaWFzIGFsw6lsaWNhcw0KICAgIHAgPC0gQSAgIyBGcmVjdWVuY2lhIGRlIEENCiAgICBxIDwtIGEgICMgRnJlY3VlbmNpYSBkZSBhDQogICAgDQogICAgIyBGaXRuZXNzIHByb21lZGlvIHBvYmxhY2lvbmFsDQogICAgd19wcm9tIDwtIHBeMiAqIHdfQUEgKyBxXjIgKiB3X2FhICANCiAgICANCiAgICAjIFRhc2EgZGUgY2FtYmlvIGVuIGxhIGZyZWN1ZW5jaWEgZGVsIGFsZWxvIEENCiAgICBkcCA8LSAocCAqIHEgKiAod19BQSAtIHdfYWEpKSAvIHdfcHJvbQ0KICAgIGRxIDwtIC1kcCAgIyBMYSBzdW1hIGRlIGZyZWN1ZW5jaWFzIGRlYmUgc2VyIDENCiAgICANCiAgICByZXR1cm4obGlzdChjKGRwLCBkcSkpKQ0KICB9KQ0KfQ0KDQpgYGANCg0KYGBge3J9DQojIENvbmRpY2lvbmVzIGluaWNpYWxlcw0KZXN0YWRvX2luaWNpYWwgPC0gYyhBID0gMC43NSwgYSA9IDAuMjUpDQojIFBhcsOhbWV0cm9zDQpwYXJhbWV0cm9zIDwtIE5VTEwNCiMgVGllbXBvDQp0aWVtcG8gPC0gc2VxKDAsIDUwLCBieSA9IDAuNSkNCg0KYGBgDQoNCmBgYHtyfQ0Kc29sIDwtIG9kZSh5ID0gZXN0YWRvX2luaWNpYWwsIHRpbWVzID0gdGllbXBvLCBmdW5jID0gbW9kZWxvLCBwYXJtcyA9IHBhcmFtZXRyb3MpDQpgYGANCg0KYGBge3J9DQpoZWFkKHNvbCkNCmBgYA0KDQoNCmBgYHtyfQ0KdGFpbChzb2wpDQpgYGANCg0KYGBge3J9DQojIEdyYWZpY2FyIGxvcyByZXN1bHRhZG9zDQpwbG90KHNvbCwNCiAgICAgeGxhYiA9ICJUaWVtcG8iLCB5bGFiID0gIkZyZWN1ZW5jaWEgZGUgYWxlbG9zIiwNCiAgICAgY29sID0gYygiYmx1ZSIsICJ5ZWxsb3ciKSwgbHdkID0gMikNCmBgYA0KDQpgYGB7cn0NCmxpYnJhcnkoZ2dwbG90MikNCmBgYA0KDQoNCmBgYHtyfQ0KZGYgPC0gYXMuZGF0YS5mcmFtZShzb2wpDQpgYGANCg0KYGBge3J9DQpkZiA8LSBjYmluZCh0aWVtcG8gPSB0aWVtcG8sIGRmKQ0KIA0KYGBgDQoNCmBgYHtyfQ0KZGZfbGFyZ28gPC0gZGF0YS5mcmFtZSgNCiAgdGllbXBvICAgICA9IHJlcChkZiR0aWVtcG8sIDIpLA0KICBBbGVsbyAgICAgID0gcmVwKGMoIkFsZWxvIEEgKHJvam8pIiwgIkFsZWxvIGEgKGFtYXJpbGxvKSIpLCBlYWNoID0gbnJvdyhkZikpLA0KICBGcmVjdWVuY2lhID0gYyhkZiRBLCBkZiRhKQ0KKQ0KYGBgDQoNCmBgYHtyfQ0KZ2dwbG90KGRmX2xhcmdvLCBhZXMoeCA9IHRpZW1wbywgeSA9IEZyZWN1ZW5jaWEsIGNvbG9yID0gQWxlbG8pKSArDQogIGdlb21fbGluZShsaW5ld2lkdGggPSAxLjUpICsNCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGMoIkFsZWxvIEEgKHJvam8pIiAgICAgPSAiIzg3Q0VGQSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBbGVsbyBhIChhbWFyaWxsbykiID0gIiNGRjY5QjQiKSkgKw0KICBzY2FsZV95X2NvbnRpbnVvdXMobGltaXRzID0gYygwLCAxKSwgYnJlYWtzID0gc2VxKDAsIDEsIDAuMjUpLA0KICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gc2NhbGVzOjpwZXJjZW50KSArDQogIGxhYnModGl0bGUgPSAiRXZvbHVjacOzbiBkZSBsb3MgYWxlbG9zIGRlbCBjb2xvciBkZSBicsOhY3RlYXMiLA0KICAgICAgIHN1YnRpdGxlID0gZXhwcmVzc2lvbihpdGFsaWMoIkhlbGljb25pYSBsYXRpc3BhdGhhIikpLA0KICAgICAgIHggPSAiVGllbXBvIChnZW5lcmFjaW9uZXMpIiwgeSA9ICJGcmVjdWVuY2lhIGRlIGFsZWxvcyIsIGNvbG9yID0gTlVMTCkgKw0KICB0aGVtZV9taW5pbWFsKGJhc2Vfc2l6ZSA9IDE0KSArDQogIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoZmFjZSA9ICJib2xkIiksDQogICAgICAgIHBsb3Quc3VidGl0bGUgPSBlbGVtZW50X3RleHQoY29sb3IgPSAiZ3JheTQwIiksDQogICAgICAgIHBhbmVsLmdyaWQubWlub3IgPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJ0b3AiKQ0KYGBgDQoNCg0KDQojIEVqZXJjaWNpbyAyDQoNCkVuIHVuYSBmaW5jYSBkZSBVcGFsYSBzZSBlc3R1ZGlhbiAyMDAgw6FyYm9sZXMgZGUgY2FjYW8gY3Jpb2xsby4gRWwgY29sb3IgZGUgbGEgbWF6b3JjYSBlc3TDoSBjb250cm9sYWRvIHBvciB1biBnZW4gY29uIGRvcyBhbGVsb3M6IFIsIHF1ZSBwcm9kdWNlIG1hem9yY2Egcm9qYSB5IGVzIGRvbWluYW50ZSwgeSByLCBxdWUgcHJvZHVjZSBtYXpvcmNhIHZlcmRlIHkgZXMgcmVjZXNpdm8uIEVsIDYwICUgZGUgbG9zIMOhcmJvbGVzIHRpZW5lIG1hem9yY2Egcm9qYSwgY29uIGdlbm90aXBvcyBSUiBvIFJyLCB5IGVsIDQwICUgdGllbmUgbWF6b3JjYSB2ZXJkZSwgY29uIGdlbm90aXBvIHJyLg0KDQpFbCBjYWNhbyBzZSByZXByb2R1Y2UgbWVkaWFudGUgZmxvcmVzIHF1ZSBhcGFyZWNlbiBkaXJlY3RhbWVudGUgc29icmUgZWwgdHJvbmNvIHkgbGFzIHJhbWFzIGdydWVzYXMuIEVzdGFzIGZsb3JlcyBzb24gcG9saW5pemFkYXMgcHJpbmNpcGFsbWVudGUgcG9yIHBlcXVlw7FvcyBpbnNlY3RvcywgY29tbyBsb3MgbW9zcXVpdG9zIGRlbCBnw6luZXJvwqAqRm9yY2lwb215aWEqLCBxdWUgc2UgZGVzcGxhemFuIGVudHJlIGZsb3JlcyBidXNjYW5kbyBhbGltZW50by4gUGFyYSBxdWUgdW5hIGZsb3Igc2UgY29udmllcnRhIGVuIG1hem9yY2EsIGVsIHBvbGVuIGRlYmUgbGxlZ2FyIGEgc3UgZXN0aWdtYSB5IGxhIHBsYW50YSBkZWJlIHNlciBjb21wYXRpYmxlIGNvbiBlc2UgcG9sZW4sIHlhIHF1ZSBlbCBjYWNhbyB0aWVuZSB1biBzaXN0ZW1hIGRlIGF1dG9pbmNvbXBhdGliaWxpZGFkIHF1ZSBmYXZvcmVjZSBlbCBjcnVjZSBlbnRyZSDDoXJib2xlcyBkaXN0aW50b3MuIFVuYSBmbG9yIGJpZW4gcG9saW5pemFkYSBzZSB0cmFuc2Zvcm1hIGVuIHVuYSBtYXpvcmNhIHF1ZSBjb250aWVuZSBzZW1pbGxhcywgeSBsYXMgc2VtaWxsYXMgc29uIGVsIHByb2R1Y3RvIHF1ZSBlbCBhZ3JpY3VsdG9yIGNvc2VjaGEuIEVsIGNvbG9yIGRlIGxhIG1hem9yY2EgZGVwZW5kZSBkZWwgZ2Vub3RpcG8gZGUgbGEgcGxhbnRhIHF1ZSBsYSBwcm9kdWNlLCBhc8OtIHF1ZSBsYSBjYW50aWRhZCBkZSBtYXpvcmNhcyBzYW5hcyBxdWUgcHJvZHVjZSBjYWRhIMOhcmJvbCBzZSByZWxhY2lvbmEgZGlyZWN0YW1lbnRlIGNvbiBzdSDDqXhpdG8gcmVwcm9kdWN0aXZvLg0KDQpEdXJhbnRlIHRyZXMgYcOxb3Mgc2UgcmVnaXN0csOzIGVsIHByb21lZGlvIGFudWFsIGRlIG1hem9yY2FzIHNhbmFzIHBvciDDoXJib2wuIExvcyDDoXJib2xlcyBkZSBtYXpvcmNhIHJvamEgcHJvZHVqZXJvbiAyMiBtYXpvcmNhcyBwb3IgYcOxbywgeSBsb3MgZGUgbWF6b3JjYSB2ZXJkZSBwcm9kdWplcm9uIDE4Lg0KDQoqKlN1cHVlc3RvIGRlIHRpZW1wbzoqKsKgdW5hIGdlbmVyYWNpw7NuIGVxdWl2YWxlIGEgMTAgYcOxb3MuDQoNCg0KYGBge3J9DQpGaXRuZXNzR0cgPC0gMTgvODANCkZpdG5lc3NHRw0KYGBgDQpgYGB7cn0NCkZpdG5lc3NnZyA8LSAyMi84MA0KRml0bmVzc2dnDQpgYGANCg0KYGBge3J9DQpGaXRuZXNzR0cvRml0bmVzc2dnDQpgYGANCmBgYHtyfQ0KbW9kZWxvIDwtIGZ1bmN0aW9uKHRpbWUsIHN0YXRlLCBwYXJhbWV0ZXJzKSB7DQogIHdpdGgoYXMubGlzdChjKHN0YXRlLCBwYXJhbWV0ZXJzKSksew0KDQogICAgIyBQYXLDoW1ldHJvcyBkZSBmaXRuZXNzDQoNCiAgICB3X0FBIDwtIDAuMjIgICMgRml0bmVzcyByZWxhdGl2byBkZSBBQQ0KICAgIHdfYWEgPC0gMC4yNyAjIEZpdG5lc3MgcmVsYXRpdm8gZGUgYWENCiAgICANCiAgICAgICMgRnJlY3VlbmNpYXMgYWzDqWxpY2FzDQogICAgcCA8LSBBICAjIEZyZWN1ZW5jaWEgZGUgQQ0KICAgIHEgPC0gYSAgIyBGcmVjdWVuY2lhIGRlIGENCiAgICANCiAgICAjIEZpdG5lc3MgcHJvbWVkaW8gcG9ibGFjaW9uYWwNCiAgICB3X3Byb20gPC0gcF4yICogd19BQSArIHFeMiAqIHdfYWEgIA0KICAgIA0KICAgICMgVGFzYSBkZSBjYW1iaW8gZW4gbGEgZnJlY3VlbmNpYSBkZWwgYWxlbG8gQQ0KICAgIGRwIDwtIChwICogcSAqICh3X0FBIC0gd19hYSkpIC8gd19wcm9tDQogICAgZHEgPC0gLWRwICAjIExhIHN1bWEgZGUgZnJlY3VlbmNpYXMgZGViZSBzZXIgMQ0KICAgIA0KICAgIHJldHVybihsaXN0KGMoZHAsIGRxKSkpDQogIH0pDQp9DQpgYGANCg0KYGBge3J9DQojIENvbmRpY2lvbmVzIGluaWNpYWxlcw0KZXN0YWRvX2luaWNpYWwgPC0gYyhBID0gMC42MCwgYSA9IDAuNDApDQojIFBhcsOhbWV0cm9zDQpwYXJhbWV0cm9zIDwtIE5VTEwNCiMgVGllbXBvDQp0aWVtcG8gPC0gc2VxKDAsIDEwLCBieSA9IDAuNSkNCmBgYA0KDQpgYGB7cn0NCnNvbCA8LSBvZGUoeSA9IGVzdGFkb19pbmljaWFsLCB0aW1lcyA9IHRpZW1wbywgZnVuYyA9IG1vZGVsbywgcGFybXMgPSBwYXJhbWV0cm9zKQ0KYGBgDQoNCmBgYHtyfQ0KaGVhZChzb2wpDQpgYGANCmBgYHtyfQ0KdGFpbChzb2wpDQpgYGANCmBgYHtyfQ0KcGxvdChzb2wsDQogICAgIHhsYWIgPSAiVGllbXBvIiwgeWxhYiA9ICJGcmVjdWVuY2lhIGRlIGFsZWxvcyIsDQogICAgIGNvbCA9IGMoImxpZ2h0Ymx1ZSIsICJwaW5rIiksIGx3ZCA9IDIpDQoNCmBgYA0KYGBge3J9DQpsaWJyYXJ5KGdncGxvdDIpDQpgYGANCg0KYGBge3J9DQpkZiA8LSBhcy5kYXRhLmZyYW1lKHNvbCkNCmBgYA0KDQpgYGB7cn0NCmRmIDwtIGNiaW5kKHRpZW1wbyA9IHRpZW1wbywgZGYpDQpgYGANCg0KDQpgYGB7cn0NCmRmX2xhcmdvIDwtIGRhdGEuZnJhbWUoDQogIHRpZW1wbyAgICAgPSByZXAoZGYkdGllbXBvLCAyKSwNCiAgQWxlbG8gICAgICA9IHJlcChjKCJBbGVsbyBSIChyb2pvKSIsICJBbGVsbyByICh2ZXJkZSkiKSwgZWFjaCA9IG5yb3coZGYpKSwNCiAgRnJlY3VlbmNpYSA9IGMoZGYkQSwgZGYkYSkNCikNCmBgYA0KDQpgYGB7cn0NCmdncGxvdChkZl9sYXJnbywgYWVzKHggPSB0aWVtcG8sIHkgPSBGcmVjdWVuY2lhLCBjb2xvciA9IEFsZWxvKSkgKw0KICBnZW9tX2xpbmUobGluZXdpZHRoID0gMS41KSArDQogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjKCJBbGVsbyBSIChyb2pvKSIgID0gIiNDMDM5MkIiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQWxlbG8gciAodmVyZGUpIiA9ICIjNEM5QTUyIikpICsNCiAgc2NhbGVfeV9jb250aW51b3VzKGxpbWl0cyA9IGMoMCwgMSksIGJyZWFrcyA9IHNlcSgwLCAxLCAwLjI1KSwNCiAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IHNjYWxlczo6cGVyY2VudCkgKw0KICBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKDAsIDEwLCAyKSkgKw0KICBsYWJzKHRpdGxlID0gIkV2b2x1Y2nDs24gZGUgbG9zIGFsZWxvcyBkZWwgY29sb3IgZGUgbWF6b3JjYSIsDQogICAgICAgc3VidGl0bGUgPSBleHByZXNzaW9uKGl0YWxpYygiVGhlb2Jyb21hIGNhY2FvIikgfiAiY3Jpb2xsbywgVXBhbGEiKSwNCiAgICAgICB4ID0gIlRpZW1wbyAoZ2VuZXJhY2lvbmVzKSIsIHkgPSAiRnJlY3VlbmNpYSBkZSBhbGVsb3MiLCBjb2xvciA9IE5VTEwpICsNCiAgdGhlbWVfbWluaW1hbChiYXNlX3NpemUgPSAxNCkgKw0KICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGZhY2UgPSAiYm9sZCIpLA0KICAgICAgICBwbG90LnN1YnRpdGxlID0gZWxlbWVudF90ZXh0KGNvbG9yID0gImdyYXk0MCIpLA0KICAgICAgICBwYW5lbC5ncmlkLm1pbm9yID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICBsZWdlbmQucG9zaXRpb24gPSAidG9wIikNCmBgYA0KDQojIEVqZXJjaWNpbyAzDQoNCkVuIHVuIGVtYmFsc2UgZGUgbGEgdmVydGllbnRlIGRlbCBQYWPDrWZpY28gdml2ZSB1bmEgcG9ibGFjacOzbiBkZSA1MDAgaW5kaXZpZHVvcyBkZSBndWFwb3RlLiBFc3RhIGVzcGVjaWUgZGUgY8OtY2xpZG8gcHJlc2VudGEgZG9zIG1vcmZvcyBkZSBjb2xvcmFjacOzbiBxdWUgZGVwZW5kZW4gZGUgdW4gZ2VuIGNvbiBkb3MgYWxlbG9zLiBFbCBtb3JmbyBkb21pbmFudGUgdGllbmUgY29sb3JhY2nDs24gb3NjdXJhIGNvbiBmcmFuamFzIGxhdGVyYWxlcywgY29uIGdlbm90aXBvcyBBQSBvIEFhLiBFbCBtb3JmbyByZWNlc2l2byB0aWVuZSBjb2xvcmFjacOzbiBjbGFyYSB5IHVuaWZvcm1lLCBjb24gZ2Vub3RpcG8gYWEuIEVuIGxhIHBvYmxhY2nDs24sIGVsIDg0ICUgcGVydGVuZWNlIGFsIG1vcmZvIGRvbWluYW50ZSB5IGVsIDE2ICUgYWwgbW9yZm8gcmVjZXNpdm8uDQoNCkVsIGd1YXBvdGUgdGllbmUgY3VpZGFkbyBwYXJlbnRhbCBiaXBhcmVudGFsLiBEZXNwdcOpcyBkZSBsYSByZXByb2R1Y2Npw7NuLCBsYSBwYXJlamEgY29uc3RydXllIHVuIG5pZG8sIGRlZmllbmRlIGxvcyBodWV2b3MgeSBsdWVnbyBwcm90ZWdlIGEgbGFzIGNyw61hcyBkdXJhbnRlIHN1cyBwcmltZXJhcyBzZW1hbmFzLiBFc3RhIGRlZmVuc2EgcmVkdWNlIGxhIGRlcHJlZGFjacOzbiwgcGVybyBsYXMgY3LDrWFzIHNpZ3VlbiBlbmZyZW50YW5kbyByaWVzZ29zIGNvbW8gbGEgY29tcGV0ZW5jaWEgcG9yIGFsaW1lbnRvLCBsb3MgZGVwcmVkYWRvcmVzIGRlIG1heW9yIHRhbWHDsW8geSBsb3MgY2FtYmlvcyBlbiBsYSBjYWxpZGFkIGRlbCBhZ3VhLiBMYSBzdXBlcnZpdmVuY2lhIGRlIGxhcyBjcsOtYXMgaGFzdGEgbG9zIDYgbWVzZXMgZGUgZWRhZCBkZXRlcm1pbmEgY3XDoW50b3MgaW5kaXZpZHVvcyBsbGVnYW4gYSByZXByb2R1Y2lyc2UuIEVuIGVzdGUgY2Fzbywgc29icmV2aXZpw7MgZWwgOTIgJSBkZSBsYXMgY3LDrWFzIGRlbCBtb3JmbyBkb21pbmFudGUgeSBlbCA3OCAlIGRlIGxhcyBkZWwgbW9yZm8gcmVjZXNpdm8uDQoNCioqU3VwdWVzdG8gZGUgdGllbXBvOioqwqB1bmEgZ2VuZXJhY2nDs24gZXF1aXZhbGUgYSAzIGHDsW9zLg0KDQpgYGB7cn0NCkZpdG5lc3NBQSA8LSAzNTIuOC80MjANCkZpdG5lc3NBQQ0KYGBgDQpgYGB7cn0NCkZpdG5lc3NhYSA8LSA2Mi40LzgwDQpGaXRuZXNzYWENCmBgYA0KYGBge3J9DQpGaXRuZXNzQUEvRml0bmVzc2FhDQpgYGANCg0KYGBge3J9DQpsaWJyYXJ5KGRlU29sdmUpDQpsaWJyYXJ5KGdncGxvdDIpDQpgYGANCg0KYGBge3J9DQptb2RlbG8gPC0gZnVuY3Rpb24odGltZSwgc3RhdGUsIHBhcmFtZXRlcnMpIHsNCiAgd2l0aChhcy5saXN0KGMoc3RhdGUsIHBhcmFtZXRlcnMpKSwgew0KICAgICMgUGFyw6FtZXRyb3MgZGUgZml0bmVzcw0KICAgIHdfQUEgPC0gMC44NCAgIyBGaXRuZXNzIHJlbGF0aXZvIGRlIEFBDQogICAgd19hYSA8LSAwLjc4ICMgRml0bmVzcyByZWxhdGl2byBkZSBhYQ0KICAgIA0KICAgICMgRnJlY3VlbmNpYXMgYWzDqWxpY2FzDQogICAgcCA8LSBBICAjIEZyZWN1ZW5jaWEgZGUgQQ0KICAgIHEgPC0gYSAgIyBGcmVjdWVuY2lhIGRlIGENCiAgICANCiAgICAjIEZpdG5lc3MgcHJvbWVkaW8gcG9ibGFjaW9uYWwNCiAgICB3X3Byb20gPC0gcF4yICogd19BQSArIHFeMiAqIHdfYWEgIA0KICAgIA0KICAgICMgVGFzYSBkZSBjYW1iaW8gZW4gbGEgZnJlY3VlbmNpYSBkZWwgYWxlbG8gQQ0KICAgIGRwIDwtIChwICogcSAqICh3X0FBIC0gd19hYSkpIC8gd19wcm9tDQogICAgZHEgPC0gLWRwICAjIExhIHN1bWEgZGUgZnJlY3VlbmNpYXMgZGViZSBzZXIgMQ0KICAgIA0KICAgIHJldHVybihsaXN0KGMoZHAsIGRxKSkpDQogIH0pDQp9DQpgYGANCg0KDQpgYGB7cn0NCiMgQ29uZGljaW9uZXMgaW5pY2lhbGVzDQplc3RhZG9faW5pY2lhbCA8LSBjKEEgPSAwLjg0LCBhID0gMC4xNikNCiMgUGFyw6FtZXRyb3MNCnBhcmFtZXRyb3MgPC0gTlVMTA0KIyBUaWVtcG8NCnRpZW1wbyA8LSBzZXEoMCwgMjAsIGJ5ID0gMC41KQ0KDQpzb2wgPC0gb2RlKHkgPSBlc3RhZG9faW5pY2lhbCwgdGltZXMgPSB0aWVtcG8sIGZ1bmMgPSBtb2RlbG8sIHBhcm1zID0gcGFyYW1ldHJvcykNCg0KaGVhZChzb2wpDQoNCnRhaWwoc29sKQ0KYGBgDQoNCmBgYHtyfQ0KIyBHcmFmaWNhciBsb3MgcmVzdWx0YWRvcw0KcGxvdChzb2wsDQogICAgIHhsYWIgPSAiVGllbXBvIiwgeWxhYiA9ICJGcmVjdWVuY2lhIGRlIGFsZWxvcyIsDQogICAgIGNvbCA9IGMoImxpZ2h0Ymx1ZSIsICJwaW5rIiksIGx3ZCA9IDIpDQpgYGANCmBgYHtyfQ0KbGlicmFyeShnZ3Bsb3QyKQ0KDQojIENvbnZlcnRpciBsb3MgcmVzdWx0YWRvcyBkZSBsYSBzaW11bGFjacOzbiBlbiB1biBtYXJjbyBkZSBkYXRvcw0KZGYgPC0gYXMuZGF0YS5mcmFtZShzb2wpDQoNCiMgQWdyZWdhciBlbCB0aWVtcG8gY29tbyB1bmEgY29sdW1uYQ0KZGYgPC0gY2JpbmQodGllbXBvID0gdGllbXBvLCBkZikNCg0KIyBHcmFmaWNhciBjb24gZ2dwbG90MiANCmdncGxvdChkZiwgYWVzKHggPSB0aWVtcG8pKSArDQogIGdlb21fbGluZShhZXMoeSA9IGxvZyhBKSwgY29sb3IgPSAiQWxlbG8gQSIpKSArIA0KICBnZW9tX2xpbmUoYWVzKHkgPSBsb2coYSksIGNvbG9yID0gIkFsZWxvIGEiKSkgKw0KICBsYWJzKHRpdGxlID0gIkV2b2x1Y2nDs24gZGUgYWxlbG9zIGdlbsOpdGljb3MgZW4gdW5hIHBvYmxhY2nDs24iLA0KICAgICAgIHggPSAiVGllbXBvIiwgeSA9ICJGcmVjdWVuY2lhIGRlIGFsZWxvcyIpICsNCiAgc2NhbGVfY29sb3JfbWFudWFsKG5hbWUgPSAiQWxlbG9zIiwgdmFsdWVzID0gYygiYmx1ZSIsICJyZWQiKSkgKw0KICB0aGVtZV9taW5pbWFsKCkNCmBgYA0KDQoNCg0KDQoNCg0K