Código R para los incisos:
- Generar un arreglo aleatorio de 250 elementos con colores
primarios:
colores <- c("rojo", "verde", "azul")
aleatorio <- sample(colores, 250, replace = TRUE)
aleatorio
[1] "azul" "rojo" "rojo" "rojo" "verde" "rojo" "rojo" "azul" "verde" "azul" "azul" "verde"
[13] "azul" "verde" "verde" "rojo" "rojo" "azul" "rojo" "rojo" "rojo" "verde" "rojo" "azul"
[25] "rojo" "verde" "azul" "rojo" "rojo" "rojo" "rojo" "azul" "rojo" "azul" "azul" "rojo"
[37] "azul" "rojo" "azul" "rojo" "verde" "azul" "verde" "rojo" "verde" "azul" "verde" "verde"
[49] "verde" "rojo" "rojo" "azul" "verde" "rojo" "rojo" "rojo" "azul" "azul" "azul" "rojo"
[61] "verde" "verde" "azul" "azul" "verde" "verde" "rojo" "azul" "azul" "verde" "rojo" "azul"
[73] "verde" "verde" "verde" "rojo" "verde" "rojo" "rojo" "azul" "rojo" "rojo" "azul" "verde"
[85] "rojo" "rojo" "verde" "rojo" "azul" "rojo" "verde" "azul" "azul" "verde" "rojo" "azul"
[97] "azul" "rojo" "verde" "azul" "azul" "azul" "rojo" "verde" "rojo" "verde" "rojo" "rojo"
[109] "rojo" "azul" "azul" "rojo" "azul" "verde" "rojo" "verde" "verde" "rojo" "rojo" "rojo"
[121] "azul" "verde" "verde" "verde" "azul" "azul" "azul" "azul" "rojo" "rojo" "verde" "verde"
[133] "rojo" "rojo" "azul" "azul" "verde" "rojo" "rojo" "rojo" "azul" "azul" "rojo" "rojo"
[145] "azul" "rojo" "azul" "verde" "azul" "verde" "rojo" "azul" "verde" "azul" "azul" "rojo"
[157] "verde" "verde" "rojo" "verde" "rojo" "verde" "azul" "rojo" "rojo" "verde" "rojo" "verde"
[169] "azul" "rojo" "azul" "azul" "rojo" "azul" "azul" "rojo" "azul" "verde" "azul" "azul"
[181] "rojo" "verde" "verde" "azul" "rojo" "rojo" "verde" "azul" "verde" "verde" "azul" "rojo"
[193] "rojo" "rojo" "verde" "azul" "rojo" "azul" "verde" "verde" "rojo" "azul" "azul" "azul"
[205] "rojo" "rojo" "verde" "rojo" "azul" "azul" "azul" "verde" "rojo" "azul" "azul" "verde"
[217] "azul" "rojo" "rojo" "verde" "rojo" "verde" "rojo" "verde" "azul" "azul" "azul" "verde"
[229] "azul" "azul" "rojo" "azul" "verde" "rojo" "verde" "azul" "azul" "rojo" "verde" "rojo"
[241] "rojo" "azul" "verde" "azul" "rojo" "rojo" "rojo" "rojo" "rojo" "rojo"
- Dado un arreglo de 120000 elementos de números enteros entre 40 y
70, ¿Cómo haría para obtener la desviación estándar de aquellos números
que son mayores a 55 y menores a 64?
datos <- rnorm(120000, mean = 55, sd = 5)
subconjunto <- datos[datos > 55 & datos < 64]
desviacion_estandar <- sd(subconjunto)
desviacion_estandar
[1] 2.335266
- Suponga que se almacena en una variable un arreglo con todos los
números de carnet de los estudiantes del Instituto de Investigación de
Operaciones de la universidad en forma de string, los carnets tiene al
inicio dos caracteres que identifican el año en el que la persona entró
a la universidad por ejemplo: 19004528 hacer referencia a una persona
que ingreso en el año 2019, 06009878 hace referencia a una persona que
ingreso que el año 2006, ¿Cómo haría para contar la cantidad de alumnos
por año?
carnets <- c("19004528", "06009878", "18012345", "21007654")
anio_ingreso <- as.numeric(substr(carnets, 1, 2))
tabla_frecuencias <- table(anio_ingreso)
tabla_frecuencias
anio_ingreso
6 18 19 21
1 1 1 1
- Define el vector y = (1, 3, 5, 7) utilizando la función c(). ¿Cómo
lo harías con la función seq()?
y <- c(1, 3, 5, 7)
y
[1] 1 3 5 7
y <- seq(1, 7, 2)
y
[1] 1 3 5 7
- Si b <- list(a=1:10, c=“Hola”, d=“XX”), escriba una expresión en
R que devuelva todos los elementos de la lista excepto los elementos
4,6,7,8 del vector a.
b <- list(a = 1:10, c = "Hola", d = "XX")
elementos_seleccionados <- c(b$a[-c(4, 6, 7, 8)], b$c, b$d)
elementos_seleccionados
[1] "1" "2" "3" "5" "9" "10" "Hola" "XX"
- Dado los siguientes vectores, muestre el código en R necesario para
declarar y calcular el promedio, deviación estándar, mediana, moda y
sumatoria total para los siguientes vectores: a.x=(8,7,6,5)
- y = (3,3, 3, 3, 3, 3, 3, 3, 2, 2)
- z = (1, 1.75, 2.5, 3.25, 4)
# Vector a
a <- c(8, 7, 6, 5)
mean_a <- mean(a)
sd_a <- sd(a)
median_a <- median(a)
mode_a <- mode(a)
sum_a <- sum(a)
# Vector b
b <- c(3, 3, 3, 3, 3, 3, 3, 3, 2, 2)
mean_b <- mean(b)
sd_b <- sd(b)
median_b <- median(b)
mode_b <- mode(b)
sum_b <- sum(b)
# Vector c
c <- c(1, 1.75, 2.5, 3.25, 4)
mean_c <- mean(c)
sd_c <- sd(c)
median_c <- median(c)
mode_c <- mode(c)
sum_c <- sum(c)
mean_a
[1] 6.5
sd_a
[1] 1.290994
median_a
[1] 6.5
mode_a
[1] "numeric"
sum_a
[1] 26
mean_b
[1] 2.8
sd_b
[1] 0.421637
median_b
[1] 3
mode_b
[1] "numeric"
sum_b
[1] 28
mean_c
[1] 2.5
sd_c
[1] 1.185854
median_c
[1] 2.5
mode_c
[1] "numeric"
sum_c
[1] 12.5
- Sabemos que para sumar vectores estos deben tener la misma longitud.
Sin embargo R trabaja de manera distinta. Defina los vectores x = (1, 2,
3, 4, 5, 6), y = (7, 8), z = (9, 10, 11, 12). Calcula:
- x + x
- x + y.
- Responda ¿Qué ha hecho R?
x <- c(1, 2, 3, 4, 5, 6)
y <- c(7, 8)
z <- c(9, 10, 11, 12)
# Suma de x con x
x_mas_x <- x + x
# Suma de x con y
x_mas_y <- c(x, y)
# Explicación del comportamiento de R:
# R recicla el vector más corto para que coincida con la longitud del vector más largo.
# En x + x, R repite x dos veces, lo que resulta en un vector de longitud 12.
# En x + y, R repite y seis veces (la longitud de x) para que coincida con la longitud de x.
x_mas_x
[1] 2 4 6 8 10 12
x_mas_y
[1] 1 2 3 4 5 6 7 8
- Dada la variable string <- “Hola Mundo”, escriba una instrucción
en R que devuelva la siguiente salida: [[1]] [1] “Hola” [[2]] [1]
“Mundo”
string <- "Hola Mundo"
lista_palabras <- strsplit(string, " ")
lapply(lista_palabras, function(x) cat(paste0("[[]", "]]\n[1] ", x, "\n")))
[[]]]
[1] Hola
[[]]]
[1] Mundo
[[1]]
NULL
Problema 2:
Lee la RData del archivo enviado
datalab <- "C:/rdata/data.RData"
load(datalab)
- ¿Qué tipo de dato es info_estudiantes?
class(info_estudiantes)
[1] "list"
- ¿Cuantos elementos tiene info_estudiantes?
length(info_estudiantes)
[1] 3
- ¿Qué representa cada uno de los elementos de info_estudiantes?
names(info_estudiantes)
[1] "carnet" "promedio" "tipo"
- ¿Cuál es la media de los estudiantes ingresados en el año 2019?
anio_ingreso <- substr(info_estudiantes$carnet, 1, 2)
promedio_2019 <- info_estudiantes$promedio[anio_ingreso == "19"]
mean_2019 <- mean(promedio_2019)
print(mean_2019)
[1] 70.85942
- ¿Cuál es la suma de desviación estándar de los estudiantes que
ingresaron en el año 2016 y 2018?
anio_ingreso <- substr(info_estudiantes$carnet, 1, 2)
# se filtran estudiantes de 2016 y 2018
estudiantes_2016 <- info_estudiantes$promedio[anio_ingreso == "16"]
estudiantes_2018 <- info_estudiantes$promedio[anio_ingreso == "18"]
# Calcula standard deviation para cada año
sd_2016 <- sd(estudiantes_2016)
sd_2018 <- sd(estudiantes_2018)
# Suma de las standard deviations
suma_sd <- sd_2016 + sd_2018
print(suma_sd)
[1] 35.13241
- ¿Cuál es el mínimo de notas de aquellos estudiantes donde su carnet
termina con los números 45 a 48?
termina_carnet <- substr(info_estudiantes$carnet, 7, 8)
estudiantes_carnet <- info_estudiantes$promedio[termina_carnet == "45" | termina_carnet == "48"]
# Busca la nota minima
min_nota <- min(estudiantes_carnet)
print(min_nota)
[1] 40
- ¿Cuál es la probabilidad de que un estudiante tipo A tenga una nota
mayor a 85?
tipo_estudiante <- substr(info_estudiantes$tipo, 1, 1)
# Filtro estudiante tipo "A"
estudiantes_tipo_a <- info_estudiantes$promedio[tipo_estudiante == "A"]
# Promedio mayor que 85
notas_mayores_85 <- sum(estudiantes_tipo_a > 85)
# Calcular la probabilidad
probabilidad <- notas_mayores_85 / length(estudiantes_tipo_a)
print(paste("Probabilidad:", round(probabilidad,4)))
[1] "Probabilidad: 0.2461"
- ¿Cuál es la probabilidad de que un estudiante tipo C haya ingresado
en el año 2017 o 2019?
tipo_estudiante <- substr(info_estudiantes$tipo, 1, 1)
# Filtro carnet = "C"
estudiantes_tipo_c <- info_estudiantes$carnet[tipo_estudiante == "C"]
# Filtro carnet = 17 o 19
estudiantes_filtro <- estudiantes_tipo_c[substr(estudiantes_tipo_c , 1, 2) == "17" | substr(estudiantes_tipo_c, 1, 2) == "19"]
# Conteo de estudiantes del 2017 o 2019
n_estudiantes_filtro <- length(estudiantes_filtro)
# Conteo de estudiantes carnet tipo "C"
n_estudiantes_tipo_c <- length(estudiantes_tipo_c)
# Calculado la probabilidad
probabilidad <- n_estudiantes_filtro / n_estudiantes_tipo_c
print(paste("Probabilidad:", round(probabilidad,4)))
[1] "Probabilidad: 0.4972"
LS0tDQp0aXRsZTogIkxhYm9yYXRvcmlvcyAjMSAtIEJhc2ljcyBlbiBSIg0Kb3V0cHV0OiBodG1sX25vdGVib29rDQotLS0NCg0KDQojIyMgQ8OzZGlnbyBSIHBhcmEgbG9zIGluY2lzb3M6DQoxLiBHZW5lcmFyIHVuIGFycmVnbG8gYWxlYXRvcmlvIGRlIDI1MCBlbGVtZW50b3MgY29uIGNvbG9yZXMgcHJpbWFyaW9zOg0KDQpgYGB7cn0NCmNvbG9yZXMgPC0gYygicm9qbyIsICJ2ZXJkZSIsICJhenVsIikNCmFsZWF0b3JpbyA8LSBzYW1wbGUoY29sb3JlcywgMjUwLCByZXBsYWNlID0gVFJVRSkNCmFsZWF0b3Jpbw0KYGBgDQoyLiBEYWRvIHVuIGFycmVnbG8gZGUgMTIwMDAwIGVsZW1lbnRvcyBkZSBuw7ptZXJvcyBlbnRlcm9zIGVudHJlIDQwIHkgNzAsIMK/Q8OzbW8gaGFyw61hIHBhcmEgb2J0ZW5lciBsYSBkZXN2aWFjacOzbiBlc3TDoW5kYXIgZGUgYXF1ZWxsb3MgbsO6bWVyb3MgcXVlIHNvbiBtYXlvcmVzIGEgNTUgeSBtZW5vcmVzIGEgNjQ/DQpgYGB7cn0NCmRhdG9zIDwtIHJub3JtKDEyMDAwMCwgbWVhbiA9IDU1LCBzZCA9IDUpDQpzdWJjb25qdW50byA8LSBkYXRvc1tkYXRvcyA+IDU1ICYgZGF0b3MgPCA2NF0NCmRlc3ZpYWNpb25fZXN0YW5kYXIgPC0gc2Qoc3ViY29uanVudG8pDQpkZXN2aWFjaW9uX2VzdGFuZGFyDQpgYGANCjMuIFN1cG9uZ2EgcXVlIHNlIGFsbWFjZW5hIGVuIHVuYSB2YXJpYWJsZSB1biBhcnJlZ2xvIGNvbiB0b2Rvcw0KbG9zIG7Dum1lcm9zIGRlIGNhcm5ldCBkZSBsb3MgZXN0dWRpYW50ZXMgZGVsIEluc3RpdHV0byBkZQ0KSW52ZXN0aWdhY2nDs24gZGUgT3BlcmFjaW9uZXMgZGUgbGEgdW5pdmVyc2lkYWQgZW4gZm9ybWEgZGUNCnN0cmluZywgbG9zIGNhcm5ldHMgdGllbmUgYWwgaW5pY2lvIGRvcyBjYXJhY3RlcmVzIHF1ZQ0KaWRlbnRpZmljYW4gZWwgYcOxbyBlbiBlbCBxdWUgbGEgcGVyc29uYSBlbnRyw7MgYSBsYSB1bml2ZXJzaWRhZA0KcG9yIGVqZW1wbG86IDE5MDA0NTI4IGhhY2VyIHJlZmVyZW5jaWEgYSB1bmEgcGVyc29uYSBxdWUNCmluZ3Jlc28gZW4gZWwgYcOxbyAyMDE5LCAwNjAwOTg3OCBoYWNlIHJlZmVyZW5jaWEgYSB1bmEgcGVyc29uYQ0KcXVlIGluZ3Jlc28gcXVlIGVsIGHDsW8gMjAwNiwgwr9Dw7NtbyBoYXLDrWEgcGFyYSBjb250YXIgbGEgY2FudGlkYWQNCmRlIGFsdW1ub3MgcG9yIGHDsW8/DQpgYGB7cn0NCmNhcm5ldHMgPC0gYygiMTkwMDQ1MjgiLCAiMDYwMDk4NzgiLCAiMTgwMTIzNDUiLCAiMjEwMDc2NTQiKQ0KYW5pb19pbmdyZXNvIDwtIGFzLm51bWVyaWMoc3Vic3RyKGNhcm5ldHMsIDEsIDIpKQ0KdGFibGFfZnJlY3VlbmNpYXMgPC0gdGFibGUoYW5pb19pbmdyZXNvKQ0KdGFibGFfZnJlY3VlbmNpYXMNCmBgYA0KNC4gRGVmaW5lIGVsIHZlY3RvciB5ID0gKDEsIDMsIDUsIDcpIHV0aWxpemFuZG8gbGEgZnVuY2nDs24gYygpLg0Kwr9Dw7NtbyBsbyBoYXLDrWFzIGNvbiBsYSBmdW5jacOzbiBzZXEoKT8NCmBgYHtyfQ0KeSA8LSBjKDEsIDMsIDUsIDcpDQp5DQp5IDwtIHNlcSgxLCA3LCAyKQ0KeQ0KYGBgDQo1LiBTaSBiIDwtIGxpc3QoYT0xOjEwLCBjPSJIb2xhIiwgZD0iWFgiKSwgZXNjcmliYSB1bmEgZXhwcmVzacOzbg0KZW4gUiBxdWUgZGV2dWVsdmEgdG9kb3MgbG9zIGVsZW1lbnRvcyBkZSBsYSBsaXN0YSBleGNlcHRvIGxvcw0KZWxlbWVudG9zIDQsNiw3LDggZGVsIHZlY3RvciBhLg0KDQpgYGB7cn0NCmIgPC0gbGlzdChhID0gMToxMCwgYyA9ICJIb2xhIiwgZCA9ICJYWCIpDQplbGVtZW50b3Nfc2VsZWNjaW9uYWRvcyA8LSBjKGIkYVstYyg0LCA2LCA3LCA4KV0sIGIkYywgYiRkKQ0KZWxlbWVudG9zX3NlbGVjY2lvbmFkb3MNCmBgYA0KNi4gRGFkbyBsb3Mgc2lndWllbnRlcyB2ZWN0b3JlcywgbXVlc3RyZSBlbCBjw7NkaWdvIGVuIFIgbmVjZXNhcmlvDQpwYXJhIGRlY2xhcmFyIHkgY2FsY3VsYXIgZWwgcHJvbWVkaW8sIGRldmlhY2nDs24gZXN0w6FuZGFyLA0KbWVkaWFuYSwgbW9kYSB5IHN1bWF0b3JpYSB0b3RhbCBwYXJhIGxvcyBzaWd1aWVudGVzIHZlY3RvcmVzOg0KYS54PSg4LDcsNiw1KQ0KYi4geSA9ICgzLDMsIDMsIDMsIDMsIDMsIDMsIDMsIDIsIDIpDQpjLiB6ID0gKDEsIDEuNzUsIDIuNSwgMy4yNSwgNCkNCg0KYGBge3J9DQojIFZlY3RvciBhDQphIDwtIGMoOCwgNywgNiwgNSkNCm1lYW5fYSA8LSBtZWFuKGEpDQpzZF9hIDwtIHNkKGEpDQptZWRpYW5fYSA8LSBtZWRpYW4oYSkNCm1vZGVfYSA8LSBtb2RlKGEpDQpzdW1fYSA8LSBzdW0oYSkNCg0KIyBWZWN0b3IgYg0KYiA8LSBjKDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDIsIDIpDQptZWFuX2IgPC0gbWVhbihiKQ0Kc2RfYiA8LSBzZChiKQ0KbWVkaWFuX2IgPC0gbWVkaWFuKGIpDQptb2RlX2IgPC0gbW9kZShiKQ0Kc3VtX2IgPC0gc3VtKGIpDQoNCiMgVmVjdG9yIGMNCmMgPC0gYygxLCAxLjc1LCAyLjUsIDMuMjUsIDQpDQptZWFuX2MgPC0gbWVhbihjKQ0Kc2RfYyA8LSBzZChjKQ0KbWVkaWFuX2MgPC0gbWVkaWFuKGMpDQptb2RlX2MgPC0gbW9kZShjKQ0Kc3VtX2MgPC0gc3VtKGMpDQoNCm1lYW5fYQ0Kc2RfYQ0KbWVkaWFuX2ENCm1vZGVfYQ0Kc3VtX2ENCg0KbWVhbl9iDQpzZF9iDQptZWRpYW5fYg0KbW9kZV9iDQpzdW1fYg0KDQptZWFuX2MNCnNkX2MNCm1lZGlhbl9jDQptb2RlX2MNCnN1bV9jDQoNCmBgYA0KNy4gU2FiZW1vcyBxdWUgcGFyYSBzdW1hciB2ZWN0b3JlcyBlc3RvcyBkZWJlbiB0ZW5lciBsYSBtaXNtYQ0KbG9uZ2l0dWQuIFNpbiBlbWJhcmdvIFIgdHJhYmFqYSBkZSBtYW5lcmEgZGlzdGludGEuIERlZmluYSBsb3MNCnZlY3RvcmVzIHggPSAoMSwgMiwgMywgNCwgNSwgNiksIHkgPSAoNywgOCksIHogPSAoOSwgMTAsIDExLA0KMTIpLiBDYWxjdWxhOg0KYS4geCArIHgNCmIuIHggKyB5Lg0KYy4gUmVzcG9uZGEgwr9RdcOpIGhhIGhlY2hvIFI/DQoNCmBgYHtyfQ0KeCA8LSBjKDEsIDIsIDMsIDQsIDUsIDYpDQp5IDwtIGMoNywgOCkNCnogPC0gYyg5LCAxMCwgMTEsIDEyKQ0KDQojIFN1bWEgZGUgeCBjb24geA0KeF9tYXNfeCA8LSB4ICsgeA0KDQojIFN1bWEgZGUgeCBjb24geQ0KeF9tYXNfeSA8LSBjKHgsIHkpDQoNCiMgRXhwbGljYWNpw7NuIGRlbCBjb21wb3J0YW1pZW50byBkZSBSOg0KIyBSIHJlY2ljbGEgZWwgdmVjdG9yIG3DoXMgY29ydG8gcGFyYSBxdWUgY29pbmNpZGEgY29uIGxhIGxvbmdpdHVkIGRlbCB2ZWN0b3IgbcOhcyBsYXJnby4NCiMgRW4geCArIHgsIFIgcmVwaXRlIHggZG9zIHZlY2VzLCBsbyBxdWUgcmVzdWx0YSBlbiB1biB2ZWN0b3IgZGUgbG9uZ2l0dWQgMTIuDQojIEVuIHggKyB5LCBSIHJlcGl0ZSB5IHNlaXMgdmVjZXMgKGxhIGxvbmdpdHVkIGRlIHgpIHBhcmEgcXVlIGNvaW5jaWRhIGNvbiBsYSBsb25naXR1ZCBkZSB4Lg0KDQp4X21hc194DQp4X21hc195DQpgYGANCjguIERhZGEgbGEgdmFyaWFibGUgc3RyaW5nIDwtICJIb2xhIE11bmRvIiwgZXNjcmliYSB1bmEgaW5zdHJ1Y2Npw7NuDQplbiBSIHF1ZSBkZXZ1ZWx2YSBsYSBzaWd1aWVudGUgc2FsaWRhOg0KW1sxXV0NClsxXSAiSG9sYSINCltbMl1dDQpbMV0gIk11bmRvIg0KDQpgYGB7cn0NCnN0cmluZyA8LSAiSG9sYSBNdW5kbyINCmxpc3RhX3BhbGFicmFzIDwtIHN0cnNwbGl0KHN0cmluZywgIiAiKQ0KbGFwcGx5KGxpc3RhX3BhbGFicmFzLCBmdW5jdGlvbih4KSBjYXQocGFzdGUwKCJbW10iLCAgIl1dXG5bMV0gIiwgeCwgIlxuIikpKQ0KYGBgDQojIFByb2JsZW1hIDI6DQoNCkxlZSBsYSBSRGF0YSBkZWwgYXJjaGl2byBlbnZpYWRvDQoNCmBgYHtyfQ0KZGF0YWxhYiA8LSAiQzovcmRhdGEvZGF0YS5SRGF0YSINCmxvYWQoZGF0YWxhYikNCmBgYA0KDQoxLiDCv1F1w6kgdGlwbyBkZSBkYXRvIGVzIGluZm9fZXN0dWRpYW50ZXM/DQpgYGB7cn0NCmNsYXNzKGluZm9fZXN0dWRpYW50ZXMpDQpgYGANCjIuIMK/Q3VhbnRvcyBlbGVtZW50b3MgdGllbmUgaW5mb19lc3R1ZGlhbnRlcz8NCmBgYHtyfQ0KbGVuZ3RoKGluZm9fZXN0dWRpYW50ZXMpDQoNCmBgYA0KMy4gwr9RdcOpIHJlcHJlc2VudGEgY2FkYSB1bm8gZGUgbG9zIGVsZW1lbnRvcyBkZSBpbmZvX2VzdHVkaWFudGVzPw0KYGBge3J9DQpuYW1lcyhpbmZvX2VzdHVkaWFudGVzKQ0KYGBgDQo0LiDCv0N1w6FsIGVzIGxhIG1lZGlhIGRlIGxvcyBlc3R1ZGlhbnRlcyBpbmdyZXNhZG9zIGVuIGVsIGHDsW8gMjAxOT8NCmBgYHtyfQ0KDQphbmlvX2luZ3Jlc28gPC0gc3Vic3RyKGluZm9fZXN0dWRpYW50ZXMkY2FybmV0LCAxLCAyKQ0KcHJvbWVkaW9fMjAxOSA8LSBpbmZvX2VzdHVkaWFudGVzJHByb21lZGlvW2FuaW9faW5ncmVzbyA9PSAiMTkiXQ0KbWVhbl8yMDE5IDwtIG1lYW4ocHJvbWVkaW9fMjAxOSkNCg0KcHJpbnQobWVhbl8yMDE5KQ0KYGBgDQo1LiDCv0N1w6FsIGVzIGxhIHN1bWEgZGUgZGVzdmlhY2nDs24gZXN0w6FuZGFyIGRlIGxvcyBlc3R1ZGlhbnRlcyBxdWUNCmluZ3Jlc2Fyb24gZW4gZWwgYcOxbyAyMDE2IHkgMjAxOD8NCmBgYHtyfQ0KDQphbmlvX2luZ3Jlc28gPC0gc3Vic3RyKGluZm9fZXN0dWRpYW50ZXMkY2FybmV0LCAxLCAyKQ0KDQojIHNlIGZpbHRyYW4gZXN0dWRpYW50ZXMgZGUgMjAxNiB5IDIwMTgNCmVzdHVkaWFudGVzXzIwMTYgPC0gaW5mb19lc3R1ZGlhbnRlcyRwcm9tZWRpb1thbmlvX2luZ3Jlc28gPT0gIjE2Il0NCmVzdHVkaWFudGVzXzIwMTggPC0gaW5mb19lc3R1ZGlhbnRlcyRwcm9tZWRpb1thbmlvX2luZ3Jlc28gPT0gIjE4Il0NCg0KIyBDYWxjdWxhIHN0YW5kYXJkIGRldmlhdGlvbiBwYXJhIGNhZGEgYcOxbw0Kc2RfMjAxNiA8LSBzZChlc3R1ZGlhbnRlc18yMDE2KQ0Kc2RfMjAxOCA8LSBzZChlc3R1ZGlhbnRlc18yMDE4KQ0KDQojIFN1bWEgZGUgbGFzIHN0YW5kYXJkIGRldmlhdGlvbnMNCnN1bWFfc2QgPC0gc2RfMjAxNiArIHNkXzIwMTgNCg0KcHJpbnQoc3VtYV9zZCkNCmBgYA0KNi4gwr9DdcOhbCBlcyBlbCBtw61uaW1vIGRlIG5vdGFzIGRlIGFxdWVsbG9zIGVzdHVkaWFudGVzIGRvbmRlIHN1DQpjYXJuZXQgdGVybWluYSBjb24gbG9zIG7Dum1lcm9zIDQ1IGEgNDg/DQoNCmBgYHtyfQ0KdGVybWluYV9jYXJuZXQgPC0gc3Vic3RyKGluZm9fZXN0dWRpYW50ZXMkY2FybmV0LCA3LCA4KQ0KDQplc3R1ZGlhbnRlc19jYXJuZXQgPC0gaW5mb19lc3R1ZGlhbnRlcyRwcm9tZWRpb1t0ZXJtaW5hX2Nhcm5ldCA9PSAiNDUiIHwgdGVybWluYV9jYXJuZXQgPT0gIjQ4Il0NCg0KIyBCdXNjYSBsYSBub3RhIG1pbmltYQ0KbWluX25vdGEgPC0gbWluKGVzdHVkaWFudGVzX2Nhcm5ldCkNCg0KcHJpbnQobWluX25vdGEpDQpgYGANCjcuIMK/Q3XDoWwgZXMgbGEgcHJvYmFiaWxpZGFkIGRlIHF1ZSB1biBlc3R1ZGlhbnRlIHRpcG8gQSB0ZW5nYSB1bmENCm5vdGEgbWF5b3IgYSA4NT8NCg0KYGBge3J9DQoNCnRpcG9fZXN0dWRpYW50ZSA8LSBzdWJzdHIoaW5mb19lc3R1ZGlhbnRlcyR0aXBvLCAxLCAxKQ0KDQojIEZpbHRybyBlc3R1ZGlhbnRlIHRpcG8gIkEiDQplc3R1ZGlhbnRlc190aXBvX2EgPC0gaW5mb19lc3R1ZGlhbnRlcyRwcm9tZWRpb1t0aXBvX2VzdHVkaWFudGUgPT0gIkEiXQ0KDQojIFByb21lZGlvIG1heW9yIHF1ZSA4NQ0Kbm90YXNfbWF5b3Jlc184NSA8LSBzdW0oZXN0dWRpYW50ZXNfdGlwb19hID4gODUpDQoNCg0KIyBDYWxjdWxhciBsYSBwcm9iYWJpbGlkYWQNCnByb2JhYmlsaWRhZCA8LSBub3Rhc19tYXlvcmVzXzg1IC8gbGVuZ3RoKGVzdHVkaWFudGVzX3RpcG9fYSkNCg0KcHJpbnQocGFzdGUoIlByb2JhYmlsaWRhZDoiLCByb3VuZChwcm9iYWJpbGlkYWQsNCkpKQ0KYGBgDQoNCjguIMK/Q3XDoWwgZXMgbGEgcHJvYmFiaWxpZGFkIGRlIHF1ZSB1biBlc3R1ZGlhbnRlIHRpcG8gQyBoYXlhDQppbmdyZXNhZG8gZW4gZWwgYcOxbyAyMDE3IG8gMjAxOT8NCg0KYGBge3J9DQoNCnRpcG9fZXN0dWRpYW50ZSA8LSBzdWJzdHIoaW5mb19lc3R1ZGlhbnRlcyR0aXBvLCAxLCAxKQ0KDQojIEZpbHRybyBjYXJuZXQgPSAiQyINCmVzdHVkaWFudGVzX3RpcG9fYyA8LSBpbmZvX2VzdHVkaWFudGVzJGNhcm5ldFt0aXBvX2VzdHVkaWFudGUgPT0gIkMiXQ0KDQojIEZpbHRybyBjYXJuZXQgPSAxNyBvIDE5DQplc3R1ZGlhbnRlc19maWx0cm8gPC0gZXN0dWRpYW50ZXNfdGlwb19jW3N1YnN0cihlc3R1ZGlhbnRlc190aXBvX2MgLCAxLCAyKSA9PSAiMTciIHwgc3Vic3RyKGVzdHVkaWFudGVzX3RpcG9fYywgMSwgMikgPT0gIjE5Il0NCg0KIyBDb250ZW8gZGUgZXN0dWRpYW50ZXMgZGVsIDIwMTcgbyAyMDE5DQpuX2VzdHVkaWFudGVzX2ZpbHRybyA8LSBsZW5ndGgoZXN0dWRpYW50ZXNfZmlsdHJvKQ0KDQojIENvbnRlbyBkZSBlc3R1ZGlhbnRlcyBjYXJuZXQgdGlwbyAiQyINCm5fZXN0dWRpYW50ZXNfdGlwb19jIDwtIGxlbmd0aChlc3R1ZGlhbnRlc190aXBvX2MpDQoNCiMgQ2FsY3VsYWRvIGxhIHByb2JhYmlsaWRhZA0KcHJvYmFiaWxpZGFkIDwtIG5fZXN0dWRpYW50ZXNfZmlsdHJvIC8gbl9lc3R1ZGlhbnRlc190aXBvX2MNCg0KcHJpbnQocGFzdGUoIlByb2JhYmlsaWRhZDoiLCByb3VuZChwcm9iYWJpbGlkYWQsNCkpKQ0KDQpgYGANCg0KDQoNCg0KDQoNCg0KDQoNCg0K