#install.packages("tidyverse")
library(tidyverse)
[30m-- [1mAttaching packages[22m --------------------------------------- tidyverse 1.2.1 --[39m
[30m[32mv[30m [34mggplot2[30m 3.1.0 [32mv[30m [34mpurrr [30m 0.2.5
[32mv[30m [34mtibble [30m 1.4.2 [32mv[30m [34mdplyr [30m 0.7.8
[32mv[30m [34mtidyr [30m 0.8.2 [32mv[30m [34mstringr[30m 1.3.1
[32mv[30m [34mreadr [30m 1.1.1 [32mv[30m [34mforcats[30m 0.3.0[39m
[30m-- [1mConflicts[22m ------------------------------------------ tidyverse_conflicts() --
[31mx[30m [34mdplyr[30m::[32mfilter()[30m masks [34mstats[30m::filter()
[31mx[30m [34mdplyr[30m::[32mlag()[30m masks [34mstats[30m::lag()[39m
3.2.4 Exercises
- 1.Run ggplot(data = mpg). What do you see?
- 2.How many rows are in mpg? How many columns?
- 3.What does the drv variable describe? Read the help for ?mpg to find out.
- 4.Make a scatterplot of hwy vs cyl.
- What happens if you make a scatterplot of class vs drv? Why is the plot not useful?
3.2.4.1 No muestra NAda
ggplot(data = mpg)

3.2.4.2
print( c("Row:",nrow(mpg),"Cols:",ncol(mpg)) )
[1] "Row:" "234" "Cols:" "11"
3.2.4.3
print("rvf = front-wheel drive, r = rear wheel drive, 4 = 4wd")
[1] "rvf = front-wheel drive, r = rear wheel drive, 4 = 4wd"
3.2.4.4
ggplot(mpg, aes(x = hwy, y = cyl)) + geom_point()

3.2.4.5 No genera suficientes valores
ggplot(mpg, aes(x = class, y = drv)) + geom_point()

3.3.1 Exercises
3.3.1.1 What’s gone wrong with this code? Why are the points not blue? Por que los colores son asignados por etiquetas en este caso todo tiene la etiqueta azul
ggplot(data = mpg) +
geom_point(mapping = aes(x = displ, y = hwy, color = "blue"))

3.3.1.2 Which variables in mpg are categorical? Which variables are continuous? (Hint: type ?mpg to read the documentation for the dataset). How can you see this information when you run mpg? la variable Class es categorica
ggplot(data = mpg) +
geom_point(mapping = aes(x = displ, y = hwy, color = class))

3.3.1.3 Map a continuous variable to color, size, and shape. How do these aesthetics behave differently for categorical vs. continuous variables? La forma(shape) se visualiza mejor con variables categoricas, el tama?o se aprecia de mejor forma en variables continuas
ggplot(data = mpg) +
geom_point(mapping = aes(x = displ, y = hwy, color = class, size = hwy, shapes=class))
Ignoring unknown aesthetics: shapes

3.3.1.4 What happens if you map the same variable to multiple aesthetics? Categoriza el tama?o de la figura en el eje X, pero este cambia de color segun su valor
ggplot(mpg, aes(x = displ, y = hwy, colour = displ, size = displ)) +
geom_point()

3.3.1.5 What does the stroke aesthetic do? What shapes does it work with? (Hint: use ?geom_point) Crea contorno de un grosor
ggplot(mpg, aes(x = displ, y = hwy, colour = displ)) +
geom_point(colour = "black", fill = "white", stroke = 3, shape=25)

3.3.1.6 What happens if you map an aesthetic to something other than a variable name, like aes(colour = displ < 5)? Note, you’ll also need to specify x and y. vuelve discreto las posibilidades, es como estar creando una funcion que solo retornar? dos posibles valores
ggplot(mpg, aes(x = displ<5, y = hwy, colour = displ)) +
geom_point(colour = "black", fill = "white", stroke = 3, shape=25)

3.5.1 Exercises
3.5.1.1 What happens if you facet on a continuous variable? categoriza todos los valores continuos que existen en el dataset
ggplot(mpg, aes(x = displ, y = hwy)) + geom_point() + facet_grid( ~ hwy)

3.5.1.2 What do the empty cells in plot with facet_grid(drv ~ cyl) mean? How do they relate to this plot? basicamente todos los putos en el eje x corresponden a ciertas categorias eso hace que los puntos se agrupen,

3.5.1.3 What plots does the following code make? What does . do? la grafica se genera partiendo por filas las categorias del drv esto implica que el valor del eje vertical se repitirá en cada faceta

Pero si el punto le antecede se categoriza por columna, esto implica que el eje x se repite por cada faceta

3.5.1.4 Take the first faceted plot in this section: What are the advantages to using faceting instead of the colour aesthetic? What are the disadvantages? How might the balance change if you had a larger dataset? El primer punto positivo es que puedo ver la data con mas de una dimension, la segunda es que el comportamiento de cada categoria es analizada por separado mientras que el color no me lo permite distinguir facilmente

3.5.1.5 Read ?facet_wrap. What does nrow do? What does ncol do? What other options control the layout of the individual panels? Why doesn’t facet_grid() have nrow and ncol arguments? nrow cuenta el numero de filas que tiene el dataset ncol cuenta el numero de columnas con relacion a Face grid no se necesitan por que se parte en terminos de la segmentacion hecha por las dimensiones utilizadas
3.5.1.6 When using facet_grid() you should usually put the variable with more unique levels in the columns. Why? Depende de la necesidad de información si la segmentacion es mayor sobre el eje horizontal , es mejor facetar filas y el mismo caso ocurre si la segmentacion es mayor sobre el eje vertical es mejor facetar columanas
3.6.1 Exercises
3.6.1.1 What geom would you use to draw a line chart? A boxplot? A histogram? An area chart?




3.6.1.2 Run this code in your head and predict what the output will look like. Then, run the code in R and check your predictions. el color se va categorizar, y smooth probablemetne va a a suavizar la data (no esperaba las lines, creo que es una tendencia)

3.6.1.3 What does show.legend = FALSE do? What happens if you remove it? Why do you think I used it earlier in the chapter? la leyenda es suprimida

3.6.1.4 What does the se argument to geom_smooth() do? Genera una una region sombreada, creo que es el posible error de algun tipo de regresión

3.6.1.5 Will these two graphs look different? Why/why not? No veo diferencia parece que es solo las etiquetas
ggplot(data = mpg, mapping = aes(x = displ, y = hwy)) +
geom_point() +
geom_smooth()

ggplot() +
geom_point(data = mpg, mapping = aes(x = displ, y = hwy)) +
geom_smooth(data = mpg, mapping = aes(x = displ, y = hwy))

3.6.1.6 Recreate the R code necessary to generate the following graphs.
ggplot(mpg, aes(x = displ, y = hwy)) +
geom_point() +
geom_smooth(se = FALSE)

ggplot(mpg, aes(x = displ, y = hwy, group=drv)) +
geom_point() +
geom_smooth(se = FALSE )

ggplot(mpg, aes(x = displ, y = hwy, group=drv, color=drv)) +
geom_point() +
geom_smooth(se = FALSE )

ggplot(mpg, aes(x = displ, y = hwy, group=drv, color=drv,linetype = drv)) +
geom_point() +
geom_smooth(se = FALSE )

NA
3.7.1 Exercises
3.7.1.1 What is the default geom associated with stat_summary()? How could you rewrite the previous plot to use that geom function instead of the stat function? Por default tiene la mediana y la SE, se utilizan

3.7.1.2 What does geom_col() do? How is it different to geom_bar()? geom_col se grafica basado en ejes coordenados, mientras que geombar solo con la incidencia de uno de sus ejes basicamente el eje vertical depende del parametro
ggplot(data = diamonds) +
geom_col(
mapping = aes(x = cut, y = depth)
)
ggplot(data = diamonds) +
geom_bar(mapping = aes(x = cut)
)
3.7.1.3 Most geoms and stats come in pairs that are almost always used in concert. Read through the documentation and make a list of all the pairs. What do they have in common? 1. geom_hex() stat_bin_hex() 2. geom_path() geom_line() 3. geom_smooth() stat_smooth() etc
3.7.1.4 What variables does stat_smooth() compute? What parameters control its behaviour? Formula usada para computar y ~ x, y ~ poly(x, 2), y ~ log(x)
3.7.1.5 In our proportion bar chart, we need to set group = 1. Why? In other words what is the problem with these two graphs? El problema es la proporcion por que el grupo es proporcional

3.8.1 Exercises
3.8.1.1 What is the problem with this plot? How could you improve it? Al introducir ruido hace que tenga un mejor ajuste

3.8.1.2 What parameters to geom_jitter() control the amount of jittering? width = NULL cuanto ruido agregar sobre el eje horizontal, height cuanto ruido vertical aplicar , seed = un valor random que hace que sea reproducible el ejecto de distorcion
3.8.1.3 Compare and contrast geom_jitter() with geom_count(). Jitter genera distorcion, mientras geo_count solo agranda el tamaño sin alterar la posicion del centro de cada uno de los eventos

3.8.1.4 What’s the default position adjustment for geom_boxplot()? Create a visualisation of the mpg dataset that demonstrates it.

LS0tDQp0aXRsZTogIkhvamE0IGNhcDMgIg0Kb3V0cHV0OiBodG1sX25vdGVib29rDQotLS0NCmBgYHtyfQ0KI2luc3RhbGwucGFja2FnZXMoInRpZHl2ZXJzZSIpDQpsaWJyYXJ5KHRpZHl2ZXJzZSkNCmBgYA0KDQojMy4yLjQgRXhlcmNpc2VzDQoNCiAtIDEuUnVuIGdncGxvdChkYXRhID0gbXBnKS4gV2hhdCBkbyB5b3Ugc2VlPw0KIC0gMi5Ib3cgbWFueSByb3dzIGFyZSBpbiBtcGc/IEhvdyBtYW55IGNvbHVtbnM/DQogLSAzLldoYXQgZG9lcyB0aGUgZHJ2IHZhcmlhYmxlIGRlc2NyaWJlPyBSZWFkIHRoZSBoZWxwIGZvciA/bXBnIHRvIGZpbmQgb3V0Lg0KIC0gNC5NYWtlIGEgc2NhdHRlcnBsb3Qgb2YgaHd5IHZzIGN5bC4NCiAtIFdoYXQgaGFwcGVucyBpZiB5b3UgbWFrZSBhIHNjYXR0ZXJwbG90IG9mIGNsYXNzIHZzIGRydj8gV2h5IGlzIHRoZSBwbG90IG5vdCB1c2VmdWw/DQoNCjMuMi40LjEgTm8gbXVlc3RyYSBOQWRhDQpgYGB7cn0NCmdncGxvdChkYXRhID0gbXBnKQ0KYGBgDQoNCjMuMi40LjIgDQpgYGB7cn0NCnByaW50KCBjKCJSb3c6Iixucm93KG1wZyksIkNvbHM6IixuY29sKG1wZykpICkNCmBgYA0KMy4yLjQuMyANCmBgYHtyfQ0KcHJpbnQoInJ2ZiA9IGZyb250LXdoZWVsIGRyaXZlLCByID0gcmVhciB3aGVlbCBkcml2ZSwgNCA9IDR3ZCIpDQpgYGANCjMuMi40LjQNCg0KYGBge3J9DQpnZ3Bsb3QobXBnLCBhZXMoeCA9IGh3eSwgeSA9IGN5bCkpICsgIGdlb21fcG9pbnQoKQ0KYGBgDQoNCjMuMi40LjUNCk5vIGdlbmVyYSBzdWZpY2llbnRlcyB2YWxvcmVzDQpgYGB7cn0NCmdncGxvdChtcGcsIGFlcyh4ID0gY2xhc3MsIHkgPSBkcnYpKSArICBnZW9tX3BvaW50KCkNCmBgYA0KDQojMy4zLjEgRXhlcmNpc2VzDQozLjMuMS4xIFdoYXQncyBnb25lIHdyb25nIHdpdGggdGhpcyBjb2RlPyBXaHkgYXJlIHRoZSBwb2ludHMgbm90IGJsdWU/DQpQb3IgcXVlIGxvcyBjb2xvcmVzIHNvbiBhc2lnbmFkb3MgcG9yIGV0aXF1ZXRhcyBlbiBlc3RlIGNhc28gdG9kbyB0aWVuZSBsYSBldGlxdWV0YSBhenVsDQpgYGB7cn0NCmdncGxvdChkYXRhID0gbXBnKSArICANCiAgZ2VvbV9wb2ludChtYXBwaW5nID0gYWVzKHggPSBkaXNwbCwgeSA9IGh3eSwgY29sb3IgPSAiYmx1ZSIpKQ0KYGBgDQozLjMuMS4yDQpXaGljaCB2YXJpYWJsZXMgaW4gbXBnIGFyZSBjYXRlZ29yaWNhbD8gV2hpY2ggdmFyaWFibGVzIGFyZSBjb250aW51b3VzPyAoSGludDogdHlwZSA/bXBnIHRvIHJlYWQgdGhlIGRvY3VtZW50YXRpb24gZm9yIHRoZSBkYXRhc2V0KS4gSG93IGNhbiB5b3Ugc2VlIHRoaXMgaW5mb3JtYXRpb24gd2hlbiB5b3UgcnVuIG1wZz8NCmxhIHZhcmlhYmxlIENsYXNzIGVzIGNhdGVnb3JpY2ENCmBgYHtyfQ0KZ2dwbG90KGRhdGEgPSBtcGcpICsgIA0KICBnZW9tX3BvaW50KG1hcHBpbmcgPSBhZXMoeCA9IGRpc3BsLCB5ID0gaHd5LCBjb2xvciA9IGNsYXNzKSkNCmBgYA0KMy4zLjEuMyANCk1hcCBhIGNvbnRpbnVvdXMgdmFyaWFibGUgdG8gY29sb3IsIHNpemUsIGFuZCBzaGFwZS4gSG93IGRvIHRoZXNlIGFlc3RoZXRpY3MgYmVoYXZlIGRpZmZlcmVudGx5IGZvciBjYXRlZ29yaWNhbCB2cy4gY29udGludW91cyB2YXJpYWJsZXM/DQpMYSBmb3JtYShzaGFwZSkgc2UgdmlzdWFsaXphIG1lam9yIGNvbiB2YXJpYWJsZXMgY2F0ZWdvcmljYXMsIGVsIHRhbWE/byBzZSBhcHJlY2lhIGRlIG1lam9yIGZvcm1hIGVuIHZhcmlhYmxlcyBjb250aW51YXMgDQpgYGB7cn0NCmdncGxvdChkYXRhID0gbXBnKSArICANCiAgZ2VvbV9wb2ludChtYXBwaW5nID0gYWVzKHggPSBkaXNwbCwgeSA9IGh3eSwgY29sb3IgPSBjbGFzcywgc2l6ZSA9IGh3eSwgc2hhcGVzPWNsYXNzKSkNCmBgYA0KMy4zLjEuNCBXaGF0IGhhcHBlbnMgaWYgeW91IG1hcCB0aGUgc2FtZSB2YXJpYWJsZSB0byBtdWx0aXBsZSBhZXN0aGV0aWNzPw0KQ2F0ZWdvcml6YSBlbCB0YW1hP28gZGUgbGEgZmlndXJhIGVuIGVsIGVqZSBYLCBwZXJvIGVzdGUgY2FtYmlhIGRlIGNvbG9yIHNlZ3VuIHN1IHZhbG9yDQpgYGB7cn0NCmdncGxvdChtcGcsIGFlcyh4ID0gZGlzcGwsIHkgPSBod3ksIGNvbG91ciA9IGRpc3BsLCBzaXplID0gZGlzcGwpKSArDQogIGdlb21fcG9pbnQoKQ0KYGBgDQozLjMuMS41DQpXaGF0IGRvZXMgdGhlIHN0cm9rZSBhZXN0aGV0aWMgZG8/IFdoYXQgc2hhcGVzIGRvZXMgaXQgd29yayB3aXRoPyAoSGludDogdXNlID9nZW9tX3BvaW50KQ0KQ3JlYSBjb250b3JubyBkZSB1biBncm9zb3INCg0KYGBge3J9DQpnZ3Bsb3QobXBnLCBhZXMoeCA9IGRpc3BsLCB5ID0gaHd5LCBjb2xvdXIgPSBkaXNwbCkpICsNCiAgZ2VvbV9wb2ludChjb2xvdXIgPSAiYmxhY2siLCBmaWxsID0gIndoaXRlIiwgc3Ryb2tlID0gMywgc2hhcGU9MjUpDQpgYGANCjMuMy4xLjYNCldoYXQgaGFwcGVucyBpZiB5b3UgbWFwIGFuIGFlc3RoZXRpYyB0byBzb21ldGhpbmcgb3RoZXIgdGhhbiBhIHZhcmlhYmxlIG5hbWUsIGxpa2UgYWVzKGNvbG91ciA9IGRpc3BsIDwgNSk/IE5vdGUsIHlvdSdsbCBhbHNvIG5lZWQgdG8gc3BlY2lmeSB4IGFuZCB5Lg0KdnVlbHZlIGRpc2NyZXRvIGxhcyBwb3NpYmlsaWRhZGVzLCBlcyBjb21vIGVzdGFyIGNyZWFuZG8gdW5hIGZ1bmNpb24gcXVlIHNvbG8gcmV0b3JuYXI/IGRvcyBwb3NpYmxlcyB2YWxvcmVzDQpgYGB7cn0NCmdncGxvdChtcGcsIGFlcyh4ID0gZGlzcGw8NSwgeSA9IGh3eSwgY29sb3VyID0gZGlzcGwpKSArDQogIGdlb21fcG9pbnQoY29sb3VyID0gImJsYWNrIiwgZmlsbCA9ICJ3aGl0ZSIsIHN0cm9rZSA9IDMsIHNoYXBlPTI1KQ0KYGBgDQoNCiMzLjUuMSBFeGVyY2lzZXMNCg0KMy41LjEuMSBXaGF0IGhhcHBlbnMgaWYgeW91IGZhY2V0IG9uIGEgY29udGludW91cyB2YXJpYWJsZT8NCmNhdGVnb3JpemEgdG9kb3MgbG9zIHZhbG9yZXMgY29udGludW9zIHF1ZSBleGlzdGVuIGVuIGVsIGRhdGFzZXQNCmBgYHtyfQ0KZ2dwbG90KG1wZywgYWVzKHggPSBkaXNwbCwgeSA9IGh3eSkpICsgIGdlb21fcG9pbnQoKSArICBmYWNldF9ncmlkKCB+IGh3eSkNCmBgYA0KDQoNCjMuNS4xLjIgV2hhdCBkbyB0aGUgZW1wdHkgY2VsbHMgaW4gcGxvdCB3aXRoIGZhY2V0X2dyaWQoZHJ2IH4gY3lsKSBtZWFuPyBIb3cgZG8gdGhleSByZWxhdGUgdG8gdGhpcyBwbG90Pw0KYmFzaWNhbWVudGUgdG9kb3MgbG9zIHB1dG9zIGVuIGVsIGVqZSB4IGNvcnJlc3BvbmRlbiBhIGNpZXJ0YXMgY2F0ZWdvcmlhcyBlc28gaGFjZSBxdWUgbG9zIHB1bnRvcyBzZSBhZ3J1cGVuLCANCmBgYHtyfQ0KZ2dwbG90KGRhdGEgPSBtcGcpICsgDQogIGdlb21fcG9pbnQobWFwcGluZyA9IGFlcyh4ID0gZHJ2LCB5ID0gY3lsKSkNCmBgYA0KDQozLjUuMS4zIFdoYXQgcGxvdHMgZG9lcyB0aGUgZm9sbG93aW5nIGNvZGUgbWFrZT8gV2hhdCBkb2VzIC4gZG8/DQpsYSBncmFmaWNhIHNlIGdlbmVyYSBwYXJ0aWVuZG8gcG9yIGZpbGFzIGxhcyBjYXRlZ29yaWFzIGRlbCBkcnYgZXN0byBpbXBsaWNhIHF1ZSBlbCB2YWxvciBkZWwgZWplIHZlcnRpY2FsIHNlIHJlcGl0aXLDoSBlbiBjYWRhIGZhY2V0YQ0KYGBge3J9DQpnZ3Bsb3QoZGF0YSA9IG1wZykgKyANCiAgZ2VvbV9wb2ludChtYXBwaW5nID0gYWVzKHggPSBkaXNwbCwgeSA9IGh3eSkpICsNCiAgZmFjZXRfZ3JpZChkcnYgfiAuKQ0KYGBgDQpQZXJvIHNpIGVsIHB1bnRvIGxlIGFudGVjZWRlIHNlIGNhdGVnb3JpemEgcG9yIGNvbHVtbmEsIGVzdG8gaW1wbGljYSBxdWUgZWwgZWplIHggc2UgcmVwaXRlIHBvciBjYWRhIGZhY2V0YQ0KYGBge3J9DQpnZ3Bsb3QoZGF0YSA9IG1wZykgKyANCiAgZ2VvbV9wb2ludChtYXBwaW5nID0gYWVzKHggPSBkaXNwbCwgeSA9IGh3eSkpICsNCiAgZmFjZXRfZ3JpZCguIH4gY3lsKQ0KYGBgDQozLjUuMS40IFRha2UgdGhlIGZpcnN0IGZhY2V0ZWQgcGxvdCBpbiB0aGlzIHNlY3Rpb246DQpXaGF0IGFyZSB0aGUgYWR2YW50YWdlcyB0byB1c2luZyBmYWNldGluZyBpbnN0ZWFkIG9mIHRoZSBjb2xvdXIgYWVzdGhldGljPyBXaGF0IGFyZSB0aGUgZGlzYWR2YW50YWdlcz8gSG93IG1pZ2h0IHRoZSBiYWxhbmNlIGNoYW5nZSBpZiB5b3UgaGFkIGEgbGFyZ2VyIGRhdGFzZXQ/DQpFbCBwcmltZXIgcHVudG8gcG9zaXRpdm8gZXMgcXVlIHB1ZWRvIHZlciBsYSBkYXRhIGNvbiBtYXMgZGUgdW5hIGRpbWVuc2lvbiwgbGEgc2VndW5kYSBlcyBxdWUgZWwgY29tcG9ydGFtaWVudG8gZGUgY2FkYSBjYXRlZ29yaWEgZXMgYW5hbGl6YWRhIHBvciBzZXBhcmFkbyBtaWVudHJhcyBxdWUgZWwgY29sb3Igbm8gbWUgbG8gcGVybWl0ZSBkaXN0aW5ndWlyIGZhY2lsbWVudGUNCmBgYHtyfQ0KZ2dwbG90KGRhdGEgPSBtcGcpICsgDQogIGdlb21fcG9pbnQobWFwcGluZyA9IGFlcyh4ID0gZGlzcGwsIHkgPSBod3kpKSArIA0KICBmYWNldF93cmFwKH4gY2xhc3MsIG5yb3cgPSAyKQ0KYGBgDQoNCg0KMy41LjEuNSBSZWFkID9mYWNldF93cmFwLiBXaGF0IGRvZXMgbnJvdyBkbz8gV2hhdCBkb2VzIG5jb2wgZG8/IFdoYXQgb3RoZXIgb3B0aW9ucyBjb250cm9sIHRoZSBsYXlvdXQgb2YgdGhlIGluZGl2aWR1YWwgcGFuZWxzPyBXaHkgZG9lc24ndCBmYWNldF9ncmlkKCkgaGF2ZSBucm93IGFuZCBuY29sIGFyZ3VtZW50cz8NCm5yb3cgY3VlbnRhIGVsIG51bWVybyBkZSBmaWxhcyBxdWUgdGllbmUgZWwgZGF0YXNldA0KbmNvbCBjdWVudGEgZWwgbnVtZXJvIGRlIGNvbHVtbmFzIA0KY29uIHJlbGFjaW9uIGEgRmFjZSBncmlkIG5vIHNlIG5lY2VzaXRhbiBwb3IgcXVlIHNlIHBhcnRlIGVuIHRlcm1pbm9zIGRlIGxhIHNlZ21lbnRhY2lvbiBoZWNoYSBwb3IgbGFzIGRpbWVuc2lvbmVzIHV0aWxpemFkYXMNCg0KDQozLjUuMS42IFdoZW4gdXNpbmcgZmFjZXRfZ3JpZCgpIHlvdSBzaG91bGQgdXN1YWxseSBwdXQgdGhlIHZhcmlhYmxlIHdpdGggbW9yZSB1bmlxdWUgbGV2ZWxzIGluIHRoZSBjb2x1bW5zLiBXaHk/DQpEZXBlbmRlIGRlIGxhIG5lY2VzaWRhZCBkZSBpbmZvcm1hY2nDs24gc2kgbGEgc2VnbWVudGFjaW9uIGVzIG1heW9yIHNvYnJlIGVsIGVqZSBob3Jpem9udGFsICwgZXMgbWVqb3IgZmFjZXRhciBmaWxhcyB5IGVsIG1pc21vIGNhc28gb2N1cnJlIHNpIGxhIHNlZ21lbnRhY2lvbiBlcyBtYXlvciBzb2JyZSBlbCBlamUgdmVydGljYWwgZXMgbWVqb3IgZmFjZXRhciBjb2x1bWFuYXMNCg0KDQojMy42LjEgRXhlcmNpc2VzDQoNCjMuNi4xLjEgV2hhdCBnZW9tIHdvdWxkIHlvdSB1c2UgdG8gZHJhdyBhIGxpbmUgY2hhcnQ/IEEgYm94cGxvdD8gQSBoaXN0b2dyYW0/IEFuIGFyZWEgY2hhcnQ/DQpgYGB7cn0NCmdncGxvdChkYXRhID0gbXBnKSArIA0KICBnZW9tX2xpbmUobWFwcGluZyA9IGFlcyh4ID0gZGlzcGwsIHkgPSBod3kpKSANCiAgIA0KYGBgDQpgYGB7cn0NCmdncGxvdChkYXRhID0gbXBnKSArIA0KICBnZW9tX2JveHBsb3QobWFwcGluZyA9IGFlcyh4ID0gZGlzcGwsIHkgPSBod3ksIGdyb3VwPWNsYXNzKSkgDQogICANCmBgYA0KYGBge3J9DQpnZ3Bsb3QoZGF0YSA9IG1wZykgKyANCiBnZW9tX2hpc3RvZ3JhbShtYXBwaW5nID0gYWVzKCBod3kpKSANCiANCmBgYA0KYGBge3J9DQpnZ3Bsb3QoZGF0YSA9IG1wZykgKyANCiBnZW9tX2FyZWEobWFwcGluZyA9IGFlcyhkaXNwbCwgaHd5KSkgDQogDQpgYGANCg0KMy42LjEuMiBSdW4gdGhpcyBjb2RlIGluIHlvdXIgaGVhZCBhbmQgcHJlZGljdCB3aGF0IHRoZSBvdXRwdXQgd2lsbCBsb29rIGxpa2UuIFRoZW4sIHJ1biB0aGUgY29kZSBpbiBSIGFuZCBjaGVjayB5b3VyIHByZWRpY3Rpb25zLg0KZWwgY29sb3Igc2UgdmEgY2F0ZWdvcml6YXIsIHkgc21vb3RoIHByb2JhYmxlbWV0bmUgdmEgYSBhIHN1YXZpemFyIGxhIGRhdGEgKG5vIGVzcGVyYWJhIGxhcyBsaW5lcywgY3JlbyBxdWUgZXMgdW5hIHRlbmRlbmNpYSkNCmBgYHtyfQ0KZ2dwbG90KGRhdGEgPSBtcGcsIG1hcHBpbmcgPSBhZXMoeCA9IGRpc3BsLCB5ID0gaHd5LCBjb2xvciA9IGRydikpICsgDQogIGdlb21fcG9pbnQoKSArIA0KICBnZW9tX3Ntb290aChzZSA9IEZBTFNFKQ0KYGBgDQoNCjMuNi4xLjMgV2hhdCBkb2VzIHNob3cubGVnZW5kID0gRkFMU0UgZG8/IFdoYXQgaGFwcGVucyBpZiB5b3UgcmVtb3ZlIGl0Pw0KV2h5IGRvIHlvdSB0aGluayBJIHVzZWQgaXQgZWFybGllciBpbiB0aGUgY2hhcHRlcj8NCmxhIGxleWVuZGEgZXMgc3VwcmltaWRhIA0KYGBge3J9DQpnZ3Bsb3QoZGF0YSA9IG1wZyxtYXBwaW5nID0gYWVzKHggPSBkaXNwbCwgeSA9IGh3eSwgY29sb3IgPSBkcnYpLHNob3cubGVnZW5kID0gRkFMU0UpICsgDQogZ2VvbV9wb2ludChzaG93LmxlZ2VuZCA9IEZBTFNFKSArDQogIGdlb21fc21vb3RoKHNob3cubGVnZW5kID0gRkFMU0Usc2UgPSBGQUxTRSApDQpgYGANCiAgMy42LjEuNCBXaGF0IGRvZXMgdGhlIHNlIGFyZ3VtZW50IHRvIGdlb21fc21vb3RoKCkgZG8/DQogIEdlbmVyYSB1bmEgdW5hIHJlZ2lvbiBzb21icmVhZGEsIGNyZW8gcXVlIGVzIGVsIHBvc2libGUgZXJyb3IgZGUgYWxndW4gdGlwbyBkZSByZWdyZXNpw7NuDQpgYGB7cn0NCmdncGxvdChkYXRhID0gbXBnLG1hcHBpbmcgPSBhZXMoeCA9IGRpc3BsLCB5ID0gaHd5LCBjb2xvciA9IGRydiksc2hvdy5sZWdlbmQgPSBGQUxTRSkgKyANCiBnZW9tX3BvaW50KHNob3cubGVnZW5kID0gRkFMU0UpICsNCiAgZ2VvbV9zbW9vdGgoc2hvdy5sZWdlbmQgPSBGQUxTRSxzZSA9IFRSVUUgKQ0KYGBgDQoNCjMuNi4xLjUgV2lsbCB0aGVzZSB0d28gZ3JhcGhzIGxvb2sgZGlmZmVyZW50PyBXaHkvd2h5IG5vdD8NCk5vIHZlbyBkaWZlcmVuY2lhIHBhcmVjZSBxdWUgZXMgc29sbyBsYXMgZXRpcXVldGFzDQpgYGB7cn0NCmdncGxvdChkYXRhID0gbXBnLCBtYXBwaW5nID0gYWVzKHggPSBkaXNwbCwgeSA9IGh3eSkpICsgDQogIGdlb21fcG9pbnQoKSArIA0KICBnZW9tX3Ntb290aCgpDQoNCmdncGxvdCgpICsgDQogIGdlb21fcG9pbnQoZGF0YSA9IG1wZywgbWFwcGluZyA9IGFlcyh4ID0gZGlzcGwsIHkgPSBod3kpKSArIA0KICBnZW9tX3Ntb290aChkYXRhID0gbXBnLCBtYXBwaW5nID0gYWVzKHggPSBkaXNwbCwgeSA9IGh3eSkpDQpgYGANCjMuNi4xLjYgUmVjcmVhdGUgdGhlIFIgY29kZSBuZWNlc3NhcnkgdG8gZ2VuZXJhdGUgdGhlIGZvbGxvd2luZyBncmFwaHMuDQpgYGB7cn0NCmdncGxvdChtcGcsIGFlcyh4ID0gZGlzcGwsIHkgPSBod3kpKSArDQogIGdlb21fcG9pbnQoKSArDQogIGdlb21fc21vb3RoKHNlID0gRkFMU0UpDQoNCg0KZ2dwbG90KG1wZywgYWVzKHggPSBkaXNwbCwgeSA9IGh3eSwgZ3JvdXA9ZHJ2KSkgKw0KICBnZW9tX3BvaW50KCkgICsNCiAgZ2VvbV9zbW9vdGgoc2UgPSBGQUxTRSApDQoNCg0KZ2dwbG90KG1wZywgYWVzKHggPSBkaXNwbCwgeSA9IGh3eSwgZ3JvdXA9ZHJ2LCBjb2xvcj1kcnYpKSArDQogIGdlb21fcG9pbnQoKSAgKw0KICBnZW9tX3Ntb290aChzZSA9IEZBTFNFICkNCg0KZ2dwbG90KG1wZywgYWVzKHggPSBkaXNwbCwgeSA9IGh3eSwgZ3JvdXA9ZHJ2LCBjb2xvcj1kcnYsbGluZXR5cGUgPSBkcnYpKSArDQogIGdlb21fcG9pbnQoKSAgKw0KICBnZW9tX3Ntb290aChzZSA9IEZBTFNFICkNCiAgICANCmBgYA0KDQoNCiMzLjcuMSBFeGVyY2lzZXMNCg0KMy43LjEuMSBXaGF0IGlzIHRoZSBkZWZhdWx0IGdlb20gYXNzb2NpYXRlZCB3aXRoIHN0YXRfc3VtbWFyeSgpPyBIb3cgY291bGQgeW91IHJld3JpdGUgdGhlIHByZXZpb3VzIHBsb3QgdG8gdXNlIHRoYXQgZ2VvbSBmdW5jdGlvbiBpbnN0ZWFkIG9mIHRoZSBzdGF0IGZ1bmN0aW9uPw0KUG9yIGRlZmF1bHQgdGllbmUgbGEgbWVkaWFuYSB5IGxhIFNFLCBzZSB1dGlsaXphbiANCmBgYHtyfQ0KZ2dwbG90KGRhdGEgPSBkaWFtb25kcykgKw0KICBnZW9tX3BvaW50cmFuZ2UoDQogICAgbWFwcGluZyA9IGFlcyh4ID0gY3V0LCB5ID0gZGVwdGgpLA0KICAgIHN0YXQgPSAic3VtbWFyeSIsDQogICAgZnVuLnkgPSBtZWRpYW4gICAgLA0KICAgIGZ1bi55bWluID0gbWluLA0KICAgIGZ1bi55bWF4ID0gbWF4DQogICkNCmBgYA0KDQozLjcuMS4yIFdoYXQgZG9lcyBnZW9tX2NvbCgpIGRvPyBIb3cgaXMgaXQgZGlmZmVyZW50IHRvIGdlb21fYmFyKCk/DQpnZW9tX2NvbCBzZSBncmFmaWNhIGJhc2FkbyBlbiBlamVzIGNvb3JkZW5hZG9zLCBtaWVudHJhcyBxdWUgZ2VvbWJhciBzb2xvIGNvbiBsYSBpbmNpZGVuY2lhIGRlIHVubyBkZSBzdXMgZWplcw0KYmFzaWNhbWVudGUgZWwgZWplIHZlcnRpY2FsIGRlcGVuZGUgZGVsIHBhcmFtZXRybw0KYGBge3J9DQpnZ3Bsb3QoZGF0YSA9IGRpYW1vbmRzKSArDQogIGdlb21fY29sKA0KICAgIG1hcHBpbmcgPSBhZXMoeCA9IGN1dCwgeSA9IGRlcHRoKQ0KDQogICkNCg0KZ2dwbG90KGRhdGEgPSBkaWFtb25kcykgKw0KIGdlb21fYmFyKG1hcHBpbmcgPSBhZXMoeCA9IGN1dCkNCg0KICApDQoNCg0KYGBgDQoNCjMuNy4xLjMgTW9zdCBnZW9tcyBhbmQgc3RhdHMgY29tZSBpbiBwYWlycyB0aGF0IGFyZSBhbG1vc3QgYWx3YXlzIHVzZWQgaW4gY29uY2VydC4gUmVhZCB0aHJvdWdoIHRoZSBkb2N1bWVudGF0aW9uIGFuZCBtYWtlIGEgbGlzdCBvZiBhbGwgdGhlIHBhaXJzLiBXaGF0IGRvIHRoZXkgaGF2ZSBpbiBjb21tb24/DQoxLiBnZW9tX2hleCgpIHN0YXRfYmluX2hleCgpDQoyLiBnZW9tX3BhdGgoKSBnZW9tX2xpbmUoKQ0KMy4gZ2VvbV9zbW9vdGgoKSBzdGF0X3Ntb290aCgpDQpldGMNCg0KMy43LjEuNCBXaGF0IHZhcmlhYmxlcyBkb2VzIHN0YXRfc21vb3RoKCkgY29tcHV0ZT8gV2hhdCBwYXJhbWV0ZXJzIGNvbnRyb2wgaXRzIGJlaGF2aW91cj8NCkZvcm11bGEgdXNhZGEgcGFyYSBjb21wdXRhciB5IH4geCwgeSB+IHBvbHkoeCwgMiksIHkgfiBsb2coeCkNCg0KDQozLjcuMS41IEluIG91ciBwcm9wb3J0aW9uIGJhciBjaGFydCwgd2UgbmVlZCB0byBzZXQgZ3JvdXAgPSAxLiBXaHk/IEluIG90aGVyIHdvcmRzIHdoYXQgaXMgdGhlIHByb2JsZW0gd2l0aCB0aGVzZSB0d28gZ3JhcGhzPw0KRWwgcHJvYmxlbWEgZXMgbGEgcHJvcG9yY2lvbiBwb3IgcXVlIGVsIGdydXBvIGVzIHByb3BvcmNpb25hbA0KYGBge3J9DQpnZ3Bsb3QoZGF0YSA9IGRpYW1vbmRzKSArIA0KICBnZW9tX2JhcihtYXBwaW5nID0gYWVzKHggPSBjdXQsIHkgPSAuLnByb3AuLikpDQpnZ3Bsb3QoZGF0YSA9IGRpYW1vbmRzKSArIA0KICBnZW9tX2JhcihtYXBwaW5nID0gYWVzKHggPSBjdXQsIGZpbGwgPSBjb2xvciwgeSA9IC4ucHJvcC4uKSkNCg0KDQpnZ3Bsb3QoZGF0YSA9IGRpYW1vbmRzKSArIA0KICBnZW9tX2JhcihtYXBwaW5nID0gYWVzKHggPSBjdXQsIGZpbGwgPSBjb2xvciwgeSA9IC4ucHJvcC4uLCBncm91cD1jb2xvcikpDQpgYGANCiMzLjguMSBFeGVyY2lzZXMNCg0KMy44LjEuMSBXaGF0IGlzIHRoZSBwcm9ibGVtIHdpdGggdGhpcyBwbG90PyBIb3cgY291bGQgeW91IGltcHJvdmUgaXQ/DQpBbCBpbnRyb2R1Y2lyIHJ1aWRvIGhhY2UgcXVlIHRlbmdhIHVuIG1lam9yIGFqdXN0ZQ0KYGBge3J9DQpnZ3Bsb3QoZGF0YSA9IG1wZywgbWFwcGluZyA9IGFlcyh4ID0gY3R5LCB5ID0gaHd5KSkgKyANCiAgZ2VvbV9wb2ludChwb3NpdGlvbj1wb3NpdGlvbl9qaXR0ZXIoKSkNCg0KYGBgDQozLjguMS4yIFdoYXQgcGFyYW1ldGVycyB0byBnZW9tX2ppdHRlcigpIGNvbnRyb2wgdGhlIGFtb3VudCBvZiBqaXR0ZXJpbmc/DQp3aWR0aCA9IE5VTEwgY3VhbnRvIHJ1aWRvIGFncmVnYXIgc29icmUgZWwgZWplIGhvcml6b250YWwsIGhlaWdodCBjdWFudG8gcnVpZG8gdmVydGljYWwgYXBsaWNhciAsIHNlZWQgPSB1biB2YWxvciByYW5kb20gcXVlIGhhY2UgcXVlIHNlYSByZXByb2R1Y2libGUgZWwgZWplY3RvIGRlIGRpc3RvcmNpb24NCg0KMy44LjEuMyBDb21wYXJlIGFuZCBjb250cmFzdCBnZW9tX2ppdHRlcigpIHdpdGggZ2VvbV9jb3VudCgpLg0KSml0dGVyIGdlbmVyYSBkaXN0b3JjaW9uLCBtaWVudHJhcyBnZW9fY291bnQgc29sbyBhZ3JhbmRhIGVsIHRhbWHDsW8gc2luIGFsdGVyYXIgbGEgcG9zaWNpb24gZGVsIGNlbnRybyBkZSBjYWRhIHVubyBkZSBsb3MgZXZlbnRvcw0KDQpgYGB7cn0NCmdncGxvdChkYXRhID0gbXBnLCBtYXBwaW5nID0gYWVzKHggPSBjdHksIHkgPSBod3kpKSArIA0KICBnZW9tX2NvdW50KCkNCg0KYGBgDQoNCjMuOC4xLjQgV2hhdOKAmXMgdGhlIGRlZmF1bHQgcG9zaXRpb24gYWRqdXN0bWVudCBmb3IgZ2VvbV9ib3hwbG90KCk/IENyZWF0ZSBhIHZpc3VhbGlzYXRpb24gb2YgdGhlIG1wZyBkYXRhc2V0IHRoYXQgZGVtb25zdHJhdGVzIGl0Lg0KDQpgYGB7cn0NCmdncGxvdChkYXRhID0gbXBnLCBtYXBwaW5nID0gYWVzKHggPSBjdHksIHkgPSBod3ksIGdyb3VwPWNsYXNzKSkgKyANCiAgZ2VvbV9ib3hwbG90KCkNCg0KYGBg