#install.packages("dplyr")
library(dplyr)
##
## Adjuntando el paquete: 'dplyr'
## The following objects are masked from 'package:stats':
##
## filter, lag
## The following objects are masked from 'package:base':
##
## intersect, setdiff, setequal, union
#install.packages("stringr")
library(stringr)
#install.packages("assertr")
library(assertr)
#install.packages("ggplot2")
library(ggplot2)
#install.packages("lubridate")
library(lubridate)
##
## Adjuntando el paquete: 'lubridate'
## The following objects are masked from 'package:base':
##
## date, intersect, setdiff, union
#install.packages("readxl")
library(readxl)
#install.packages("forcats")
library(forcats)
#install.packages("visdat")
library(visdat)
#install.packages("stringdist")
library(stringdist)
#install.packages("fuzzyjoin")
library(fuzzyjoin)
#install.packages("gapminder")
library(gapminder)
#install.packages("e1071")
library(e1071)
#install.packages("datasets")
library(datasets)
1. The following table contains the ages
of people who are frequent customers of a vegetarian restaurant. With
this data, calculate::
- The mean
- The median
- The mode
- The frequency histogram
| 30 |
28 |
23 |
29 |
36 |
| 36 |
31 |
28 |
28 |
40 |
| 22 |
21 |
28 |
28 |
31 |
# Datos de la tabla de arriba
ages <- c(28, 23, 31, 31, 21, 30, 28, 23, 29, 36, 36, 31, 28, 28, 40, 22, 21, 28, 28, 31)
a) The mean
mean <- mean(ages)
print(mean)
## [1] 28.65
c) The mode
modo <- ages %>%
table() %>%
which.max() %>%
names() %>%
as.numeric()
print(modo)
## [1] 28
d) The frequency histogram
ggplot(data.frame(ages), aes(x = ages)) +
geom_histogram(binwidth = 2, fill = "blue", color = "black", alpha = 0.7) +
labs(title = "frequency histogram", x = "ages", y = "frequency") +
theme_minimal()

2. With the data in the table above,
determine the variance and standard deviation.
# variance
varianza <- var(ages)
print(varianza)
## [1] 25.71316
# standard deviation
desviacion_estandar <- sd(ages)
print(desviacion_estandar)
## [1] 5.070814
3. Using the mean and two standard
deviation, determine the Chebyshev interval and interpret its meaning in
the context of the problem.
k <- 2
limite_inferior <- median - k * desviacion_estandar
limite_superior <- median + k * desviacion_estandar
print(paste("El intervalo de Chebyshev para k=2 es:", limite_inferior, "a", limite_superior))
## [1] "El intervalo de Chebyshev para k=2 es: 17.858371354711 a 38.141628645289"
This means that, according to Chebyshev’s theorem, at least 75% of
the age values will fall within this range of 13.03 to 43.27 years.
4. Explain what the Central Tendency
measures indicate and what the dispersion measures indicate.
Measures of Central Tendency: Mean: It’s the average. It tells you
the “typical” or most common value of the data.
Median: It’s the middle value when the data is sorted. It splits the
data into two equal parts.
Mode: It’s the value that appears the most in the data.
What do they indicate?: These measures give you an idea of what the
most typical or common value in the data set is.
Measures of Dispersion: Variance: It measures how spread out the data
is. If it’s high, the data points are far apart.
Standard Deviation: It’s the square root of the variance and also
measures how spread out the data is, but in the same units as the
data.
What do they indicate?: These measures show you how “spread out” or
“grouped together” the data is around the mean. If they’re low, the data
is close to the mean; if they’re high, the data is more spread out.
5. Using the data from the database
titled POP BEVERAGES CONSUMPTION SURVEY, use EXCEL to determine, for
each age category of consumers, the following about the Glasses of soft
drink per day:
ruta_archivo <- file.choose()
pop<- read_excel(ruta_archivo)
## New names:
## • `` -> `...2`
## • `` -> `...3`
## • `` -> `...4`
## • `` -> `...5`
## • `` -> `...6`
pop<- as.data.frame(pop)
youth_rural <- read_excel(ruta_archivo, sheet = "Youth Rural", skip = 2)
## New names:
## • `` -> `...5`
youth_urban <- read_excel(ruta_archivo, sheet = "Youth Urban", skip = 2)
## New names:
## • `` -> `...5`
adults_rural <- read_excel(ruta_archivo, sheet = "20-40 Rural", skip = 2)
## New names:
## • `` -> `...5`
adults_urban <- read_excel(ruta_archivo, sheet = "20-40 Urban", skip = 2)
## New names:
## • `` -> `...5`
seniors_rural <- read_excel(ruta_archivo, sheet = "40-60 Rural", skip = 2)
## New names:
## • `` -> `...5`
seniors_urban <- read_excel(ruta_archivo, sheet = "40-60 Urban", skip = 2)
## New names:
## • `` -> `...5`
LS0tDQp0aXRsZTogIkJ1c2luZXNzX0FuYWx5dGljc19HcG9fMjAxX01UWV8yNTExLlJtZCINCmF1dGhvcjogIk1hcmlhbm8gQmF1dGlzdGEgQTAxNjU2OTA0Ig0KZGF0ZTogIjIwMjUtMDMtMjgiDQpvdXRwdXQ6IA0KICBodG1sX2RvY3VtZW50OiANCiAgICB0b2M6IFRSVUUNCiAgICB0b2NfZmxvYXQ6IFRSVUUNCiAgICBjb2RlX2Rvd25sb2FkOiBUUlVFDQogICAgdGhlbWU6IGpvdXJuYWwNCiAgICBoaWdobGlnaHQ6IHRhbmdvDQotLS0NCg0KDQpgYGB7cn0NCiNpbnN0YWxsLnBhY2thZ2VzKCJkcGx5ciIpDQpsaWJyYXJ5KGRwbHlyKQ0KDQojaW5zdGFsbC5wYWNrYWdlcygic3RyaW5nciIpDQpsaWJyYXJ5KHN0cmluZ3IpDQoNCiNpbnN0YWxsLnBhY2thZ2VzKCJhc3NlcnRyIikNCmxpYnJhcnkoYXNzZXJ0cikNCg0KI2luc3RhbGwucGFja2FnZXMoImdncGxvdDIiKQ0KbGlicmFyeShnZ3Bsb3QyKQ0KDQojaW5zdGFsbC5wYWNrYWdlcygibHVicmlkYXRlIikNCmxpYnJhcnkobHVicmlkYXRlKQ0KDQojaW5zdGFsbC5wYWNrYWdlcygicmVhZHhsIikNCmxpYnJhcnkocmVhZHhsKQ0KDQojaW5zdGFsbC5wYWNrYWdlcygiZm9yY2F0cyIpDQpsaWJyYXJ5KGZvcmNhdHMpDQoNCiNpbnN0YWxsLnBhY2thZ2VzKCJ2aXNkYXQiKQ0KbGlicmFyeSh2aXNkYXQpDQoNCiNpbnN0YWxsLnBhY2thZ2VzKCJzdHJpbmdkaXN0IikNCmxpYnJhcnkoc3RyaW5nZGlzdCkNCg0KI2luc3RhbGwucGFja2FnZXMoImZ1enp5am9pbiIpDQpsaWJyYXJ5KGZ1enp5am9pbikNCg0KI2luc3RhbGwucGFja2FnZXMoImdhcG1pbmRlciIpDQpsaWJyYXJ5KGdhcG1pbmRlcikNCg0KI2luc3RhbGwucGFja2FnZXMoImUxMDcxIikNCmxpYnJhcnkoZTEwNzEpDQoNCiNpbnN0YWxsLnBhY2thZ2VzKCJkYXRhc2V0cyIpDQpsaWJyYXJ5KGRhdGFzZXRzKQ0KDQpgYGANCg0KDQoNCiMgPHNwYW4gc3R5bGU9ImNvbG9yOiBEYXJrOyI+MS4JVGhlIGZvbGxvd2luZyB0YWJsZSBjb250YWlucyB0aGUgYWdlcyBvZiBwZW9wbGUgd2hvIGFyZSBmcmVxdWVudCBjdXN0b21lcnMgb2YgYSB2ZWdldGFyaWFuIHJlc3RhdXJhbnQuIFdpdGggdGhpcyBkYXRhLCBjYWxjdWxhdGU6Ojwvc3Bhbj4NCmEpCVRoZSBtZWFuDQpiKQlUaGUgbWVkaWFuDQpjKQlUaGUgbW9kZQ0KZCkJVGhlIGZyZXF1ZW5jeSBoaXN0b2dyYW0NCg0KDQp8IDI4IHwgMjMgfCAzMSB8IDMxIHwgMjEgfA0KfC0tLS18LS0tLXwtLS0tfC0tLS18LS0tLXwNCnwgMzAgfCAyOCB8IDIzIHwgMjkgfCAzNiB8DQp8IDM2IHwgMzEgfCAyOCB8IDI4IHwgNDAgfA0KfCAyMiB8IDIxIHwgMjggfCAyOCB8IDMxIHwNCg0KDQpgYGB7cn0NCiMgRGF0b3MgZGUgbGEgdGFibGEgZGUgYXJyaWJhDQphZ2VzIDwtIGMoMjgsIDIzLCAzMSwgMzEsIDIxLCAzMCwgMjgsIDIzLCAyOSwgMzYsIDM2LCAzMSwgMjgsIDI4LCA0MCwgMjIsIDIxLCAyOCwgMjgsIDMxKQ0KDQpgYGANCiMjIDxzcGFuIHN0eWxlPSJjb2xvcjogZGFyazsiPmEpCVRoZSBtZWFuPC9zcGFuPg0KYGBge3J9DQptZWFuIDwtIG1lYW4oYWdlcykNCnByaW50KG1lYW4pDQpgYGANCiMjIDxzcGFuIHN0eWxlPSJjb2xvcjogZGFyazsiPmIpCVRoZSBtZWRpYW48L3NwYW4+DQpgYGB7cn0NCm1lZGlhbiA8LSBtZWRpYW4oYWdlcykNCnByaW50KG1lZGlhbikNCmBgYA0KIyMgPHNwYW4gc3R5bGU9ImNvbG9yOiBkYXJrOyI+YykJVGhlIG1vZGU8L3NwYW4+DQpgYGB7cn0NCm1vZG8gPC0gYWdlcyAlPiUNCiAgdGFibGUoKSAlPiUNCiAgd2hpY2gubWF4KCkgJT4lDQogIG5hbWVzKCkgJT4lDQogIGFzLm51bWVyaWMoKQ0KcHJpbnQobW9kbykNCmBgYA0KIyMgPHNwYW4gc3R5bGU9ImNvbG9yOiBkYXJrOyI+ZCkJVGhlIGZyZXF1ZW5jeSBoaXN0b2dyYW08L3NwYW4+IA0KDQpgYGB7cn0NCmdncGxvdChkYXRhLmZyYW1lKGFnZXMpLCBhZXMoeCA9IGFnZXMpKSArDQogIGdlb21faGlzdG9ncmFtKGJpbndpZHRoID0gMiwgZmlsbCA9ICJibHVlIiwgY29sb3IgPSAiYmxhY2siLCBhbHBoYSA9IDAuNykgKw0KICBsYWJzKHRpdGxlID0gImZyZXF1ZW5jeSBoaXN0b2dyYW0iLCB4ID0gImFnZXMiLCB5ID0gImZyZXF1ZW5jeSIpICsNCiAgdGhlbWVfbWluaW1hbCgpDQpgYGANCg0KIyA8c3BhbiBzdHlsZT0iY29sb3I6IERhcms7Ij4yLglXaXRoIHRoZSBkYXRhIGluIHRoZSB0YWJsZSBhYm92ZSwgZGV0ZXJtaW5lIHRoZSB2YXJpYW5jZSBhbmQgc3RhbmRhcmQgZGV2aWF0aW9uLjwvc3Bhbj4NCg0KYGBge3J9DQojIHZhcmlhbmNlDQp2YXJpYW56YSA8LSB2YXIoYWdlcykNCnByaW50KHZhcmlhbnphKQ0KDQojIHN0YW5kYXJkIGRldmlhdGlvbg0KZGVzdmlhY2lvbl9lc3RhbmRhciA8LSBzZChhZ2VzKQ0KcHJpbnQoZGVzdmlhY2lvbl9lc3RhbmRhcikNCg0KYGBgDQoNCg0KDQojIDxzcGFuIHN0eWxlPSJjb2xvcjogRGFyazsiPjMuCVVzaW5nIHRoZSBtZWFuIGFuZCB0d28gc3RhbmRhcmQgZGV2aWF0aW9uLCBkZXRlcm1pbmUgdGhlIENoZWJ5c2hldiBpbnRlcnZhbCBhbmQgaW50ZXJwcmV0IGl0cyBtZWFuaW5nIGluIHRoZSBjb250ZXh0IG9mIHRoZSBwcm9ibGVtLiA8L3NwYW4+DQoNCmBgYHtyfQ0KayA8LSAyDQpsaW1pdGVfaW5mZXJpb3IgPC0gbWVkaWFuIC0gayAqIGRlc3ZpYWNpb25fZXN0YW5kYXINCmxpbWl0ZV9zdXBlcmlvciA8LSBtZWRpYW4gKyBrICogZGVzdmlhY2lvbl9lc3RhbmRhcg0KcHJpbnQocGFzdGUoIkVsIGludGVydmFsbyBkZSBDaGVieXNoZXYgcGFyYSBrPTIgZXM6IiwgbGltaXRlX2luZmVyaW9yLCAiYSIsIGxpbWl0ZV9zdXBlcmlvcikpDQpgYGANClRoaXMgbWVhbnMgdGhhdCwgYWNjb3JkaW5nIHRvIENoZWJ5c2hldidzIHRoZW9yZW0sIGF0IGxlYXN0IDc1JSBvZiB0aGUgYWdlIHZhbHVlcyB3aWxsIGZhbGwgd2l0aGluIHRoaXMgcmFuZ2Ugb2YgMTMuMDMgdG8gNDMuMjcgeWVhcnMuDQoNCg0KIyA8c3BhbiBzdHlsZT0iY29sb3I6IERhcms7Ij40LglFeHBsYWluIHdoYXQgdGhlIENlbnRyYWwgVGVuZGVuY3kgbWVhc3VyZXMgaW5kaWNhdGUgYW5kIHdoYXQgdGhlIGRpc3BlcnNpb24gbWVhc3VyZXMgaW5kaWNhdGUuPC9zcGFuPg0KDQpNZWFzdXJlcyBvZiBDZW50cmFsIFRlbmRlbmN5Og0KTWVhbjogSXQncyB0aGUgYXZlcmFnZS4gSXQgdGVsbHMgeW91IHRoZSAidHlwaWNhbCIgb3IgbW9zdCBjb21tb24gdmFsdWUgb2YgdGhlIGRhdGEuDQoNCk1lZGlhbjogSXQncyB0aGUgbWlkZGxlIHZhbHVlIHdoZW4gdGhlIGRhdGEgaXMgc29ydGVkLiBJdCBzcGxpdHMgdGhlIGRhdGEgaW50byB0d28gZXF1YWwgcGFydHMuDQoNCk1vZGU6IEl0J3MgdGhlIHZhbHVlIHRoYXQgYXBwZWFycyB0aGUgbW9zdCBpbiB0aGUgZGF0YS4NCg0KV2hhdCBkbyB0aGV5IGluZGljYXRlPzogVGhlc2UgbWVhc3VyZXMgZ2l2ZSB5b3UgYW4gaWRlYSBvZiB3aGF0IHRoZSBtb3N0IHR5cGljYWwgb3IgY29tbW9uIHZhbHVlIGluIHRoZSBkYXRhIHNldCBpcy4NCg0KTWVhc3VyZXMgb2YgRGlzcGVyc2lvbjoNClZhcmlhbmNlOiBJdCBtZWFzdXJlcyBob3cgc3ByZWFkIG91dCB0aGUgZGF0YSBpcy4gSWYgaXTigJlzIGhpZ2gsIHRoZSBkYXRhIHBvaW50cyBhcmUgZmFyIGFwYXJ0Lg0KDQpTdGFuZGFyZCBEZXZpYXRpb246IEl04oCZcyB0aGUgc3F1YXJlIHJvb3Qgb2YgdGhlIHZhcmlhbmNlIGFuZCBhbHNvIG1lYXN1cmVzIGhvdyBzcHJlYWQgb3V0IHRoZSBkYXRhIGlzLCBidXQgaW4gdGhlIHNhbWUgdW5pdHMgYXMgdGhlIGRhdGEuDQoNCldoYXQgZG8gdGhleSBpbmRpY2F0ZT86IFRoZXNlIG1lYXN1cmVzIHNob3cgeW91IGhvdyAic3ByZWFkIG91dCIgb3IgImdyb3VwZWQgdG9nZXRoZXIiIHRoZSBkYXRhIGlzIGFyb3VuZCB0aGUgbWVhbi4gSWYgdGhleeKAmXJlIGxvdywgdGhlIGRhdGEgaXMgY2xvc2UgdG8gdGhlIG1lYW47IGlmIHRoZXnigJlyZSBoaWdoLCB0aGUgZGF0YSBpcyBtb3JlIHNwcmVhZCBvdXQuDQoNCg0KIyA8c3BhbiBzdHlsZT0iY29sb3I6IERhcms7Ij41LglVc2luZyB0aGUgZGF0YSBmcm9tIHRoZSBkYXRhYmFzZSB0aXRsZWQgUE9QIEJFVkVSQUdFUyBDT05TVU1QVElPTiBTVVJWRVksIHVzZSBFWENFTCB0byBkZXRlcm1pbmUsIGZvciBlYWNoIGFnZSBjYXRlZ29yeSBvZiBjb25zdW1lcnMsIHRoZSBmb2xsb3dpbmcgYWJvdXQgdGhlIEdsYXNzZXMgb2Ygc29mdCBkcmluayBwZXIgZGF5Ojwvc3Bhbj4NCg0KYGBge3J9DQpydXRhX2FyY2hpdm8gPC0gZmlsZS5jaG9vc2UoKQ0KcG9wPC0gcmVhZF9leGNlbChydXRhX2FyY2hpdm8pDQpwb3A8LSBhcy5kYXRhLmZyYW1lKHBvcCkNCg0KeW91dGhfcnVyYWwgPC0gcmVhZF9leGNlbChydXRhX2FyY2hpdm8sIHNoZWV0ID0gIllvdXRoIFJ1cmFsIiwgc2tpcCA9IDIpDQp5b3V0aF91cmJhbiA8LSByZWFkX2V4Y2VsKHJ1dGFfYXJjaGl2bywgc2hlZXQgPSAiWW91dGggVXJiYW4iLCBza2lwID0gMikNCmFkdWx0c19ydXJhbCA8LSByZWFkX2V4Y2VsKHJ1dGFfYXJjaGl2bywgc2hlZXQgPSAiMjAtNDAgUnVyYWwiLCBza2lwID0gMikNCmFkdWx0c191cmJhbiA8LSByZWFkX2V4Y2VsKHJ1dGFfYXJjaGl2bywgc2hlZXQgPSAiMjAtNDAgVXJiYW4iLCBza2lwID0gMikNCnNlbmlvcnNfcnVyYWwgPC0gcmVhZF9leGNlbChydXRhX2FyY2hpdm8sIHNoZWV0ID0gIjQwLTYwIFJ1cmFsIiwgc2tpcCA9IDIpDQpzZW5pb3JzX3VyYmFuIDwtIHJlYWRfZXhjZWwocnV0YV9hcmNoaXZvLCBzaGVldCA9ICI0MC02MCBVcmJhbiIsIHNraXAgPSAyKQ0KYGBgDQojIyA8c3BhbiBzdHlsZT0iY29sb3I6IERhcms7Ij5hKQlUaGUgaGlzdG9ncmFtIGZyZXF1ZW5jeSBmb3IgZWFjaCBhZ2UgY2F0ZWdvcnkgaW4gcnVyYWwgYXJlYSBhbmQgdGhlIGJpYXMgcHJlc2VudGVkIGJ5IHRoZSBkYXRhIGZyb20gdGhlIGdyYXBoIGNvbXBhcmluZyB0aGUgbWVhbiB0byB0aGUgbWVkaWFuPC9zcGFuPg0KDQoNCmBgYHtyfQ0KcGxvdF9oaXN0b2dyYW0gPC0gZnVuY3Rpb24oZGYsIHRpdGxlKSB7DQogIG1lYW5fdmFsdWUgPC0gbWVhbihkZiRgR2xhc3NlcyBvZiBzb2Z0IGRyaW5rIGEgZGF5YCwgbmEucm0gPSBUUlVFKQ0KICBtZWRpYW5fdmFsdWUgPC0gbWVkaWFuKGRmJGBHbGFzc2VzIG9mIHNvZnQgZHJpbmsgYSBkYXlgLCBuYS5ybSA9IFRSVUUpDQogIHNrZXduZXNzIDwtIG1lYW5fdmFsdWUgLSBtZWRpYW5fdmFsdWUNCiAgDQogIHAgPC0gZ2dwbG90KGRmLCBhZXMoeCA9IGBHbGFzc2VzIG9mIHNvZnQgZHJpbmsgYSBkYXlgKSkgKw0KICAgIGdlb21faGlzdG9ncmFtKGJpbndpZHRoID0gMSwgZmlsbCA9ICJibHVlIiwgYWxwaGEgPSAwLjcsIGNvbG9yID0gImJsYWNrIikgKw0KICAgIGdlb21fdmxpbmUoYWVzKHhpbnRlcmNlcHQgPSBtZWFuX3ZhbHVlKSwgY29sb3IgPSAicmVkIiwgbGluZXR5cGUgPSAiZGFzaGVkIiwgc2l6ZSA9IDEpICsNCiAgICBnZW9tX3ZsaW5lKGFlcyh4aW50ZXJjZXB0ID0gbWVkaWFuX3ZhbHVlKSwgY29sb3IgPSAiZ3JlZW4iLCBsaW5ldHlwZSA9ICJkYXNoZWQiLCBzaXplID0gMSkgKw0KICAgIGxhYnModGl0bGUgPSB0aXRsZSwgeCA9ICJTb2Z0IGRyaW5rIGdsYXNzZXMgcGVyIGRheSIsIHkgPSAiRnJlcXVlbmN5IikgKw0KICAgIHRoZW1lX21pbmltYWwoKQ0KICANCiAgcmV0dXJuKGxpc3QocGxvdCA9IHAsIHNrZXduZXNzID0gc2tld25lc3MpKQ0KfQ0KYGBgDQoNCmBgYHtyfQ0KaGlzdF95b3V0aF9ydXJhbCA8LSBwbG90X2hpc3RvZ3JhbSh5b3V0aF9ydXJhbCwgIkNvbnN1bW8gZGUgcmVmcmVzY28gLSBKw7N2ZW5lcyAoUnVyYWwpIikNCmhpc3RfYWR1bHRzX3J1cmFsIDwtIHBsb3RfaGlzdG9ncmFtKGFkdWx0c19ydXJhbCwgIkNvbnN1bW8gZGUgcmVmcmVzY28gLSBBZHVsdG9zIChSdXJhbCkiKQ0KaGlzdF9zZW5pb3JzX3J1cmFsIDwtIHBsb3RfaGlzdG9ncmFtKHNlbmlvcnNfcnVyYWwsICJDb25zdW1vIGRlIHJlZnJlc2NvIC0gTWF5b3JlcyAoUnVyYWwpIikNCg0KcHJpbnQoaGlzdF95b3V0aF9ydXJhbCRwbG90KQ0KcHJpbnQoaGlzdF9hZHVsdHNfcnVyYWwkcGxvdCkNCnByaW50KGhpc3Rfc2VuaW9yc19ydXJhbCRwbG90KQ0KYGBgDQoNCiMjIDxzcGFuIHN0eWxlPSJjb2xvcjogRGFyazsiPmIpCVRoZSBoaXN0b2dyYW0gZnJlcXVlbmN5IGZvciBlYWNoIGFnZSBjYXRlZ29yeSBpbiB1cmJhbiBhcmVhIGFuZCB0aGUgYmlhcyBwcmVzZW50ZWQgYnkgdGhlIGRhdGEgZnJvbSB0aGUgZ3JhcGggY29tcGFyaW5nIHRoZSBtZWFuIHRvIHRoZSBtZWRpYW48L3NwYW4+DQoNCmBgYHtyfQ0KaGlzdF95b3V0aF91cmJhbiA8LSBwbG90X2hpc3RvZ3JhbSh5b3V0aF91cmJhbiwgIlNvZnQgRHJpbmsgQ29uc3VtcHRpb24gLSBZb3V0aCAoVXJiYW4pIikNCmhpc3RfYWR1bHRzX3VyYmFuIDwtIHBsb3RfaGlzdG9ncmFtKGFkdWx0c191cmJhbiwgIlNvZnQgRHJpbmsgQ29uc3VtcHRpb24gLSBBZHVsdHMgKFVyYmFuKSIpDQpoaXN0X3NlbmlvcnNfdXJiYW4gPC0gcGxvdF9oaXN0b2dyYW0oc2VuaW9yc191cmJhbiwgIlNvZnQgRHJpbmsgQ29uc3VtcHRpb24gLSBTZW5pb3JzIChVcmJhbikiKQ0KDQpgYGANCg0KDQoNCmBgYHtyfQ0KcHJpbnQoaGlzdF95b3V0aF91cmJhbiRwbG90KQ0KcHJpbnQoaGlzdF9hZHVsdHNfdXJiYW4kcGxvdCkNCnByaW50KGhpc3Rfc2VuaW9yc191cmJhbiRwbG90KQ0KYGBgDQoNCmBgYHtyfQ0Kc2tld25lc3NfY29tcGFyaXNvbiA8LSBkYXRhLmZyYW1lKA0KICBDYXRlZ29yeSA9IGMoIllvdXRoIiwgIllvdXRoIiwgIkFkdWx0cyIsICJBZHVsdHMiLCAiU2VuaW9ycyIsICJTZW5pb3JzIiksDQogIEFyZWEgPSBjKCJSdXJhbCIsICJVcmJhbiIsICJSdXJhbCIsICJVcmJhbiIsICJSdXJhbCIsICJVcmJhbiIpLA0KICBTa2V3bmVzcyA9IGMoaGlzdF95b3V0aF9ydXJhbCRza2V3bmVzcywgaGlzdF95b3V0aF91cmJhbiRza2V3bmVzcywgDQogICAgICAgICAgICAgICBoaXN0X2FkdWx0c19ydXJhbCRza2V3bmVzcywgaGlzdF9hZHVsdHNfdXJiYW4kc2tld25lc3MsIA0KICAgICAgICAgICAgICAgaGlzdF9zZW5pb3JzX3J1cmFsJHNrZXduZXNzLCBoaXN0X3NlbmlvcnNfdXJiYW4kc2tld25lc3MpDQopDQoNCnByaW50KHNrZXduZXNzX2NvbXBhcmlzb24pDQpgYGANCiMgPHNwYW4gc3R5bGU9ImNvbG9yOiBEYXJrOyI+Ni4JV2l0aCBhbGwgdGhlIGRhdGEgcmVsYXRlZCB0byB0aGUgY29uc3VtcHRpb24gaW4gcnVyYWwgYXJlYSBhbmQgaW4gdXJiYW4gYXJlYSwgZmluZDo8L3NwYW4+DQojIyA8c3BhbiBzdHlsZT0iY29sb3I6IERhcms7Ij5hKQlUaGUgZnJlcXVlbmN5IGhpc3RvZ3JhbSBvZiB0aGUgcnVyYWwgYXJlYS4gPC9zcGFuPg0KDQpgYGB7cn0NCnJ1cmFsX2RhdGEgPC0gYmluZF9yb3dzKHlvdXRoX3J1cmFsLCBhZHVsdHNfcnVyYWwsIHNlbmlvcnNfcnVyYWwpDQpoaXN0X3J1cmFsIDwtIHBsb3RfaGlzdG9ncmFtKHJ1cmFsX2RhdGEsICJTb2Z0IERyaW5rIENvbnN1bXB0aW9uIC0gUnVyYWwgQXJlYSIpDQpwcmludChoaXN0X3J1cmFsJHBsb3QpDQpgYGANCg0KIyMgPHNwYW4gc3R5bGU9ImNvbG9yOiBEYXJrOyI+YikJVGhlIGZyZXF1ZW5jeSBoaXN0b2dyYW0gb2YgdGhlIHVyYmFuIGFyZWEuIDwvc3Bhbj4NCmBgYHtyfQ0KDQp1cmJhbl9kYXRhIDwtIGJpbmRfcm93cyh5b3V0aF91cmJhbiwgYWR1bHRzX3VyYmFuLCBzZW5pb3JzX3VyYmFuKQ0KaGlzdF91cmJhbiA8LSBwbG90X2hpc3RvZ3JhbSh1cmJhbl9kYXRhLCAiU29mdCBEcmluayBDb25zdW1wdGlvbiAtIFVyYmFuIEFyZWEiKQ0KcHJpbnQoaGlzdF91cmJhbiRwbG90KQ0KYGBgDQoNCg0KIyMgPHNwYW4gc3R5bGU9ImNvbG9yOiBEYXJrOyI+YykJV2hhdCBhcmUgdGhlIG1haW4gZGlmZmVyZW5jZXMgYmV0d2VlbiB0aGUgdXJiYW4gYW5kIHJ1cmFsIGFyZWE/PC9zcGFuPg0KDQpgYGB7cn0NCmRpZmZfbWVhbiA8LSBtZWFuKHVyYmFuX2RhdGEkYEdsYXNzZXMgb2Ygc29mdCBkcmluayBhIGRheWAsIG5hLnJtID0gVFJVRSkgLSBtZWFuKHJ1cmFsX2RhdGEkYEdsYXNzZXMgb2Ygc29mdCBkcmluayBhIGRheWAsIG5hLnJtID0gVFJVRSkNCmRpZmZfbWVkaWFuIDwtIG1lZGlhbih1cmJhbl9kYXRhJGBHbGFzc2VzIG9mIHNvZnQgZHJpbmsgYSBkYXlgLCBuYS5ybSA9IFRSVUUpIC0gbWVkaWFuKHJ1cmFsX2RhdGEkYEdsYXNzZXMgb2Ygc29mdCBkcmluayBhIGRheWAsIG5hLnJtID0gVFJVRSkNCg0KZGlmZl9zdW1tYXJ5IDwtIGRhdGEuZnJhbWUoDQogIE1ldHJpYyA9IGMoIk1lYW4gRGlmZmVyZW5jZSIsICJNZWRpYW4gRGlmZmVyZW5jZSIpLA0KICBWYWx1ZSA9IGMoZGlmZl9tZWFuLCBkaWZmX21lZGlhbikNCikNCg0KcHJpbnQoZGlmZl9zdW1tYXJ5KQ0KDQpgYGANCg0KDQoNCg0K