download.file("http://www.apradie.com/ec2004/salesbrands3.xlsx", "salesbrands3.xlsx", mode="wb")
trying URL 'http://www.apradie.com/ec2004/salesbrands3.xlsx'
Content type 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' length 18194 bytes (17 KB)
==================================================
downloaded 17 KB
library(readxl)
sales_brands <- read_excel("salesbrands3.xlsx", sheet = "Resultado")

# Always familiarize with the data
head(sales_brands, 5)
# Load library xts. Install the package if you haven't already.
library(xts)

# We save the date column in a new dataset:
month <- sales_brands$date

# We delete the date column from the sales data. The date is the column 1 of the dataset: 
sales_brands <- sales_brands[,c(-1)]
# As you see, when you specify c(-1) in the column index that means that you do not want column 1! 

# Now we create an xts dataset using the previous datasets: 
sales.xts <- xts(x = sales_brands, order.by = month)

head(sales.xts, 5)
Warning: object timezone ('UTC') is different from system timezone ('')
           qbrand1tons salesbrand1 qbrand2tons salesbrand2 qbrand3tons salesbrand3 qbrand4tons salesbrand4 qbrand5tons
2015-01-01      106.62    60780.72      195.46    60700.51      293.10    75196.35      185.91    48228.51       28.94
2015-02-01      105.82    60411.47      216.09    68289.15      494.46   105010.90      149.30    39922.14       24.66
2015-03-01       88.82    53174.89      220.15    62529.54      356.88    90902.84      144.65    39788.22       23.75
2015-04-01       86.69    50861.69      170.74    50575.68      291.07    72853.34      161.43    42692.59       21.00
2015-05-01       87.23    51014.23      177.17    54327.48      318.09    75277.10      141.09    37167.52       23.44
           salesbrand5 qbrand6tons salesbrand6 tonstotal salestotal
2015-01-01     2295.50      338.38    55561.26   1148.41   302762.8
2015-02-01     1973.43      284.52    51469.74   1274.85   327076.8
2015-03-01     1903.24      251.34    50395.48   1085.59   298694.2
2015-04-01     1684.28      230.29    49124.61    961.22   267792.2
2015-05-01     1883.41      250.45    46906.63    997.47   266576.4
# Do you notice any difference between data frames and xts objects?

#delete month variable
rm(month)
plot(sales.xts$qbrand2tons)

plot(sales.xts$qbrand6tons)

ln_sales <- log(sales.xts)
sales_monthly_growth_q2 = diff(ln_sales$qbrand2tons)
sales_monthly_growth_q6 = diff(ln_sales$qbrand6tons)

plot(sales_monthly_growth_q2, type = "l", col = "blue")

lines(sales_monthly_growth_q6, type = "l", col = "red")

sales_annual_growth_q2 = diff(ln_sales$qbrand2tons,lag = 12)
sales_annual_growth_q6 = diff(ln_sales$qbrand6tons,lag = 12)

plot(sales_annual_growth_q2, type = "l", col = "red")

lines(sales_annual_growth_q6, type = "l", col = "black")

library(tseries)

adf.test(na.omit(sales_annual_growth_q2), alternative = "stationary")

    Augmented Dickey-Fuller Test

data:  na.omit(sales_annual_growth_q2)
Dickey-Fuller = -3.574, Lag order = 3, p-value = 0.04701
alternative hypothesis: stationary

#Challenge 1: RUN AND INTERPRET A DICKY-FULLER TEST FOR THE ANNUAL % DIFFERENCE OF BRAND 6, AND PROVIDE AN INTERPRETATION

library(tseries)

adf.test(na.omit(sales_annual_growth_q6), alternative = "stationary")

    Augmented Dickey-Fuller Test

data:  na.omit(sales_annual_growth_q6)
Dickey-Fuller = -2.3423, Lag order = 3, p-value = 0.4387
alternative hypothesis: stationary

#Podemos observar que esta serie es una serie estacionaria, de acuerdo, al p-value es mayor al 0.05, siendo un valor de 0.4387 aceptando la hipotesis alternativa.

library(wbstats)
# Mexico - Infant mortality
infantm<-wb_data(indicator = c("SP.DYN.IMRT.IN"), 
      country="MEX", start_date = 1980, end_date = 2020)

# Mexico - Export value
exports<-wb_data(indicator = c("TX.VAL.MRCH.XD.WD"), 
      country="MEX", start_date = 1980, end_date = 2020)
plot.ts(infantm$SP.DYN.IMRT.IN)

plot.ts(exports$TX.VAL.MRCH.XD.WD)

#Now run a regression using these series. Report the result of the regression. Did you find significant relationship? is your result what you expected?

m1 <- lm(exports$TX.VAL.MRCH.XD.WD ~ infantm$SP.DYN.IMRT.IN)
summary(m1)

Call:
lm(formula = exports$TX.VAL.MRCH.XD.WD ~ infantm$SP.DYN.IMRT.IN)

Residuals:
    Min      1Q  Median      3Q     Max 
-21.942 -18.107  -2.227  16.959  32.253 

Coefficients:
                       Estimate Std. Error t value Pr(>|t|)    
(Intercept)            122.4937     6.8165   17.97  < 2e-16 ***
infantm$SP.DYN.IMRT.IN  -2.7632     0.2286  -12.09 9.25e-15 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 18.19 on 39 degrees of freedom
Multiple R-squared:  0.7892,    Adjusted R-squared:  0.7838 
F-statistic:   146 on 1 and 39 DF,  p-value: 9.245e-15

#Si se encontro una relación significativa entre la mortalidad infantil y las exportaciones, dado que, el coeficiente de la mortalidad infantil es significativo con un valor de p de 9.25e-15, que es mucho menor que 0.05, lo que significa que tiene una relación significativa, además, se puede observar que las series no estan cointegrada se esperaba que se encontrara una relacion en la serie para que pudiera ser espuria.

#Challenge 2: RESEARCH ABOUT SPURIOUS REGRESSION. With your words briefly explain in which cases you can end up with a spurious regression #La spurious regression ocurre cuando 2 o más variables de series temporales sin relación parecen estar relacionadas debido a la influencia de tendencias comuner o comportamientos no estacionarios en los datos, existen casos que pueden terminar en esta regresión siendo: Datos no estacionarios, raíces unitarias, ausencia de cointegración y r^2 alto y T-statistics significativas.

#COINTEGRACION #Are the infant mortality and export series cointegrated? Is the regression spurious or valid?

library(tseries)
# The errors/residual of the regression are stored in the residuals
#   attribute of the m1 model:
adf.test(m1$residuals, alternative = "stationary")

    Augmented Dickey-Fuller Test

data:  m1$residuals
Dickey-Fuller = -2.5852, Lag order = 3, p-value = 0.3434
alternative hypothesis: stationary

#Las series de mortalidad infantil y exportaciones no están cointegradas, es por esto, que se considera una regresión espuria, dado que, una regresión lineal entre dos series no serña confiable ni válida

#Challenge 3

library(quantmod)
getSymbols(Symbols=c("^MXX","^GSPC"), peridiocity = "daily",
                     from="2015-01-01", to="2017-10-02")
[1] "MXX"  "GSPC"
#Putting the adjusted prices into one dataset:
data = Ad(merge(MXX,GSPC))
data = na.omit(data)
firstmxx = as.numeric(MXX$MXX.Adjusted[1])
firstus = as.numeric(GSPC$GSPC.Adjusted[1])
invmxx = data$MXX.Adjusted / firstmxx
invus = data$GSPC.Adjusted / firstus 
inv <- merge(invus,invmxx)
plot(inv)

library(tseries)
# The errors/residual of the regression are stored in the residuals
#   attribute of the period 2:
adf.test(invmxx, alternative = "stationary")

    Augmented Dickey-Fuller Test

data:  invmxx
Dickey-Fuller = -2.5648, Lag order = 8, p-value = 0.3392
alternative hypothesis: stationary
library(tseries)
# The errors/residual of the regression are stored in the residuals
#   attribute of the period 2:
adf.test(invus, alternative = "stationary")

    Augmented Dickey-Fuller Test

data:  invus
Dickey-Fuller = -1.6933, Lag order = 8, p-value = 0.7081
alternative hypothesis: stationary

#Se puede observar que las p-value tiene un resultado de 0.3392 y 0.7081 mostrando que son mayores que 0.05, lo que signifiva que no se puede rechazar la hiposis nula de que los residuales no son estacionarios, lo cual indica que no hay suficiente prueba para considerar que estas series no estacionarias están cointegradas. En conclusión, estas series no estan cointegradas, por lo tanto, cualquier regresión lineal realizada estre estas dos series será una regresión espuria.

LS0tCnRpdGxlOiDigJxSIE5vdGVib29rMiIKYXV0aG9yOiBBbmEgVGVyZXNhIENhc3RpbGxvIEJsYW5jbwpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sgCi0tLQoKYGBge3J9CmRvd25sb2FkLmZpbGUoImh0dHA6Ly93d3cuYXByYWRpZS5jb20vZWMyMDA0L3NhbGVzYnJhbmRzMy54bHN4IiwgInNhbGVzYnJhbmRzMy54bHN4IiwgbW9kZT0id2IiKQpsaWJyYXJ5KHJlYWR4bCkKYGBgCgpgYGB7cn0Kc2FsZXNfYnJhbmRzIDwtIHJlYWRfZXhjZWwoInNhbGVzYnJhbmRzMy54bHN4Iiwgc2hlZXQgPSAiUmVzdWx0YWRvIikKCiMgQWx3YXlzIGZhbWlsaWFyaXplIHdpdGggdGhlIGRhdGEKaGVhZChzYWxlc19icmFuZHMsIDUpCmBgYApgYGB7cn0KIyBMb2FkIGxpYnJhcnkgeHRzLiBJbnN0YWxsIHRoZSBwYWNrYWdlIGlmIHlvdSBoYXZlbid0IGFscmVhZHkuCmxpYnJhcnkoeHRzKQoKIyBXZSBzYXZlIHRoZSBkYXRlIGNvbHVtbiBpbiBhIG5ldyBkYXRhc2V0Ogptb250aCA8LSBzYWxlc19icmFuZHMkZGF0ZQoKIyBXZSBkZWxldGUgdGhlIGRhdGUgY29sdW1uIGZyb20gdGhlIHNhbGVzIGRhdGEuIFRoZSBkYXRlIGlzIHRoZSBjb2x1bW4gMSBvZiB0aGUgZGF0YXNldDogCnNhbGVzX2JyYW5kcyA8LSBzYWxlc19icmFuZHNbLGMoLTEpXQojIEFzIHlvdSBzZWUsIHdoZW4geW91IHNwZWNpZnkgYygtMSkgaW4gdGhlIGNvbHVtbiBpbmRleCB0aGF0IG1lYW5zIHRoYXQgeW91IGRvIG5vdCB3YW50IGNvbHVtbiAxISAKCiMgTm93IHdlIGNyZWF0ZSBhbiB4dHMgZGF0YXNldCB1c2luZyB0aGUgcHJldmlvdXMgZGF0YXNldHM6IApzYWxlcy54dHMgPC0geHRzKHggPSBzYWxlc19icmFuZHMsIG9yZGVyLmJ5ID0gbW9udGgpCgpoZWFkKHNhbGVzLnh0cywgNSkKYGBgCgpgYGB7cn0KIyBEbyB5b3Ugbm90aWNlIGFueSBkaWZmZXJlbmNlIGJldHdlZW4gZGF0YSBmcmFtZXMgYW5kIHh0cyBvYmplY3RzPwoKI2RlbGV0ZSBtb250aCB2YXJpYWJsZQpybShtb250aCkKYGBgCgpgYGB7cn0KcGxvdChzYWxlcy54dHMkcWJyYW5kMnRvbnMpCmBgYAoKYGBge3J9CnBsb3Qoc2FsZXMueHRzJHFicmFuZDZ0b25zKQpgYGAKCmBgYHtyfQpsbl9zYWxlcyA8LSBsb2coc2FsZXMueHRzKQpgYGAKCmBgYHtyfQpzYWxlc19tb250aGx5X2dyb3d0aF9xMiA9IGRpZmYobG5fc2FsZXMkcWJyYW5kMnRvbnMpCnNhbGVzX21vbnRobHlfZ3Jvd3RoX3E2ID0gZGlmZihsbl9zYWxlcyRxYnJhbmQ2dG9ucykKCnBsb3Qoc2FsZXNfbW9udGhseV9ncm93dGhfcTIsIHR5cGUgPSAibCIsIGNvbCA9ICJibHVlIikKYGBgCgpgYGB7cn0KbGluZXMoc2FsZXNfbW9udGhseV9ncm93dGhfcTYsIHR5cGUgPSAibCIsIGNvbCA9ICJyZWQiKQpgYGAKCmBgYHtyfQpzYWxlc19hbm51YWxfZ3Jvd3RoX3EyID0gZGlmZihsbl9zYWxlcyRxYnJhbmQydG9ucyxsYWcgPSAxMikKc2FsZXNfYW5udWFsX2dyb3d0aF9xNiA9IGRpZmYobG5fc2FsZXMkcWJyYW5kNnRvbnMsbGFnID0gMTIpCgpwbG90KHNhbGVzX2FubnVhbF9ncm93dGhfcTIsIHR5cGUgPSAibCIsIGNvbCA9ICJyZWQiKQpgYGAKCmBgYHtyfQpsaW5lcyhzYWxlc19hbm51YWxfZ3Jvd3RoX3E2LCB0eXBlID0gImwiLCBjb2wgPSAiYmxhY2siKQpgYGAKCmBgYHtyfQpsaWJyYXJ5KHRzZXJpZXMpCgphZGYudGVzdChuYS5vbWl0KHNhbGVzX2FubnVhbF9ncm93dGhfcTIpLCBhbHRlcm5hdGl2ZSA9ICJzdGF0aW9uYXJ5IikKYGBgCiNDaGFsbGVuZ2UgMTogUlVOIEFORCBJTlRFUlBSRVQgQSBESUNLWS1GVUxMRVIgVEVTVCBGT1IgVEhFIEFOTlVBTCAlIERJRkZFUkVOQ0UgT0YgQlJBTkQgNiwgQU5EIFBST1ZJREUgQU4gSU5URVJQUkVUQVRJT04KCmBgYHtyfQpsaWJyYXJ5KHRzZXJpZXMpCgphZGYudGVzdChuYS5vbWl0KHNhbGVzX2FubnVhbF9ncm93dGhfcTYpLCBhbHRlcm5hdGl2ZSA9ICJzdGF0aW9uYXJ5IikKYGBgCiNQb2RlbW9zIG9ic2VydmFyIHF1ZSBlc3RhIHNlcmllIGVzIHVuYSBzZXJpZSBlc3RhY2lvbmFyaWEsIGRlIGFjdWVyZG8sIGFsIHAtdmFsdWUgZXMgbWF5b3IgYWwgMC4wNSwgc2llbmRvIHVuIHZhbG9yIGRlIDAuNDM4NyBhY2VwdGFuZG8gbGEgaGlwb3Rlc2lzIGFsdGVybmF0aXZhLgoKYGBge3J9CmxpYnJhcnkod2JzdGF0cykKYGBgCgpgYGB7cn0KIyBNZXhpY28gLSBJbmZhbnQgbW9ydGFsaXR5CmluZmFudG08LXdiX2RhdGEoaW5kaWNhdG9yID0gYygiU1AuRFlOLklNUlQuSU4iKSwgCiAgICAgIGNvdW50cnk9Ik1FWCIsIHN0YXJ0X2RhdGUgPSAxOTgwLCBlbmRfZGF0ZSA9IDIwMjApCgojIE1leGljbyAtIEV4cG9ydCB2YWx1ZQpleHBvcnRzPC13Yl9kYXRhKGluZGljYXRvciA9IGMoIlRYLlZBTC5NUkNILlhELldEIiksIAogICAgICBjb3VudHJ5PSJNRVgiLCBzdGFydF9kYXRlID0gMTk4MCwgZW5kX2RhdGUgPSAyMDIwKQpgYGAKCmBgYHtyfQpwbG90LnRzKGluZmFudG0kU1AuRFlOLklNUlQuSU4pCmBgYApgYGB7cn0KcGxvdC50cyhleHBvcnRzJFRYLlZBTC5NUkNILlhELldEKQpgYGAKCiNOb3cgcnVuIGEgcmVncmVzc2lvbiB1c2luZyB0aGVzZSBzZXJpZXMuIFJlcG9ydCB0aGUgcmVzdWx0IG9mIHRoZSByZWdyZXNzaW9uLiBEaWQgeW91IGZpbmQgc2lnbmlmaWNhbnQgcmVsYXRpb25zaGlwPyBpcyB5b3VyIHJlc3VsdCB3aGF0IHlvdSBleHBlY3RlZD8KCmBgYHtyfQptMSA8LSBsbShleHBvcnRzJFRYLlZBTC5NUkNILlhELldEIH4gaW5mYW50bSRTUC5EWU4uSU1SVC5JTikKc3VtbWFyeShtMSkKYGBgCiNTaSBzZSBlbmNvbnRybyB1bmEgcmVsYWNpw7NuIHNpZ25pZmljYXRpdmEgZW50cmUgbGEgbW9ydGFsaWRhZCBpbmZhbnRpbCB5IGxhcyBleHBvcnRhY2lvbmVzLCBkYWRvIHF1ZSwgZWwgY29lZmljaWVudGUgZGUgbGEgbW9ydGFsaWRhZCBpbmZhbnRpbCBlcyBzaWduaWZpY2F0aXZvIGNvbiB1biB2YWxvciBkZSBwIGRlIDkuMjVlLTE1LCBxdWUgZXMgbXVjaG8gbWVub3IgcXVlIDAuMDUsIGxvIHF1ZSBzaWduaWZpY2EgcXVlIHRpZW5lIHVuYSByZWxhY2nDs24gc2lnbmlmaWNhdGl2YSwgYWRlbcOhcywgc2UgcHVlZGUgb2JzZXJ2YXIgcXVlIGxhcyBzZXJpZXMgbm8gZXN0YW4gY29pbnRlZ3JhZGEgc2UgZXNwZXJhYmEgcXVlIHNlIGVuY29udHJhcmEgdW5hIHJlbGFjaW9uIGVuIGxhIHNlcmllIHBhcmEgcXVlIHB1ZGllcmEgc2VyIGVzcHVyaWEuCgojQ2hhbGxlbmdlIDI6IFJFU0VBUkNIIEFCT1VUIFNQVVJJT1VTIFJFR1JFU1NJT04uIFdpdGggeW91ciB3b3JkcyBicmllZmx5IGV4cGxhaW4gaW4gd2hpY2ggY2FzZXMgeW91IGNhbiBlbmQgdXAgd2l0aCBhIHNwdXJpb3VzIHJlZ3Jlc3Npb24KI0xhIHNwdXJpb3VzIHJlZ3Jlc3Npb24gb2N1cnJlIGN1YW5kbyAyIG8gbcOhcyB2YXJpYWJsZXMgZGUgc2VyaWVzIHRlbXBvcmFsZXMgc2luIHJlbGFjacOzbiBwYXJlY2VuIGVzdGFyIHJlbGFjaW9uYWRhcyBkZWJpZG8gYSBsYSBpbmZsdWVuY2lhIGRlIHRlbmRlbmNpYXMgY29tdW5lciBvIGNvbXBvcnRhbWllbnRvcyBubyBlc3RhY2lvbmFyaW9zIGVuIGxvcyBkYXRvcywgZXhpc3RlbiBjYXNvcyBxdWUgcHVlZGVuIHRlcm1pbmFyIGVuIGVzdGEgcmVncmVzacOzbiBzaWVuZG86IERhdG9zIG5vIGVzdGFjaW9uYXJpb3MsIHJhw61jZXMgdW5pdGFyaWFzLCBhdXNlbmNpYSBkZSBjb2ludGVncmFjacOzbiB5IHJeMiBhbHRvIHkgVC1zdGF0aXN0aWNzIHNpZ25pZmljYXRpdmFzLgoKI0NPSU5URUdSQUNJT04KI0FyZSB0aGUgaW5mYW50IG1vcnRhbGl0eSBhbmQgZXhwb3J0IHNlcmllcyBjb2ludGVncmF0ZWQ/IElzIHRoZSByZWdyZXNzaW9uIHNwdXJpb3VzIG9yIHZhbGlkPwpgYGB7cn0KbGlicmFyeSh0c2VyaWVzKQojIFRoZSBlcnJvcnMvcmVzaWR1YWwgb2YgdGhlIHJlZ3Jlc3Npb24gYXJlIHN0b3JlZCBpbiB0aGUgcmVzaWR1YWxzCiMgICBhdHRyaWJ1dGUgb2YgdGhlIG0xIG1vZGVsOgphZGYudGVzdChtMSRyZXNpZHVhbHMsIGFsdGVybmF0aXZlID0gInN0YXRpb25hcnkiKQpgYGAKI0xhcyBzZXJpZXMgZGUgbW9ydGFsaWRhZCBpbmZhbnRpbCB5IGV4cG9ydGFjaW9uZXMgbm8gZXN0w6FuIGNvaW50ZWdyYWRhcywgZXMgcG9yIGVzdG8sIHF1ZSBzZSBjb25zaWRlcmEgdW5hIHJlZ3Jlc2nDs24gZXNwdXJpYSwgZGFkbyBxdWUsIHVuYSByZWdyZXNpw7NuIGxpbmVhbCBlbnRyZSBkb3Mgc2VyaWVzIG5vIHNlcsOxYSBjb25maWFibGUgbmkgdsOhbGlkYQoKI0NoYWxsZW5nZSAzCmBgYHtyfQpsaWJyYXJ5KHF1YW50bW9kKQpnZXRTeW1ib2xzKFN5bWJvbHM9YygiXk1YWCIsIl5HU1BDIiksIHBlcmlkaW9jaXR5ID0gImRhaWx5IiwKICAgICAgICAgICAgICAgICAgICAgZnJvbT0iMjAxNS0wMS0wMSIsIHRvPSIyMDE3LTEwLTAyIikKYGBgCgpgYGB7cn0KI1B1dHRpbmcgdGhlIGFkanVzdGVkIHByaWNlcyBpbnRvIG9uZSBkYXRhc2V0OgpkYXRhID0gQWQobWVyZ2UoTVhYLEdTUEMpKQpkYXRhID0gbmEub21pdChkYXRhKQpgYGAKCmBgYHtyfQpmaXJzdG14eCA9IGFzLm51bWVyaWMoTVhYJE1YWC5BZGp1c3RlZFsxXSkKZmlyc3R1cyA9IGFzLm51bWVyaWMoR1NQQyRHU1BDLkFkanVzdGVkWzFdKQpgYGAKCmBgYHtyfQppbnZteHggPSBkYXRhJE1YWC5BZGp1c3RlZCAvIGZpcnN0bXh4CmludnVzID0gZGF0YSRHU1BDLkFkanVzdGVkIC8gZmlyc3R1cyAKYGBgCgpgYGB7cn0KaW52IDwtIG1lcmdlKGludnVzLGludm14eCkKcGxvdChpbnYpCmBgYAoKYGBge3J9CmxpYnJhcnkodHNlcmllcykKIyBUaGUgZXJyb3JzL3Jlc2lkdWFsIG9mIHRoZSByZWdyZXNzaW9uIGFyZSBzdG9yZWQgaW4gdGhlIHJlc2lkdWFscwojICAgYXR0cmlidXRlIG9mIHRoZSBwZXJpb2QgMjoKYWRmLnRlc3QoaW52bXh4LCBhbHRlcm5hdGl2ZSA9ICJzdGF0aW9uYXJ5IikKYGBgCgpgYGB7cn0KbGlicmFyeSh0c2VyaWVzKQojIFRoZSBlcnJvcnMvcmVzaWR1YWwgb2YgdGhlIHJlZ3Jlc3Npb24gYXJlIHN0b3JlZCBpbiB0aGUgcmVzaWR1YWxzCiMgICBhdHRyaWJ1dGUgb2YgdGhlIHBlcmlvZCAyOgphZGYudGVzdChpbnZ1cywgYWx0ZXJuYXRpdmUgPSAic3RhdGlvbmFyeSIpCmBgYAojU2UgcHVlZGUgb2JzZXJ2YXIgcXVlIGxhcyBwLXZhbHVlIHRpZW5lIHVuIHJlc3VsdGFkbyBkZSAwLjMzOTIgeSAwLjcwODEgbW9zdHJhbmRvIHF1ZSBzb24gbWF5b3JlcyBxdWUgMC4wNSwgbG8gcXVlIHNpZ25pZml2YSBxdWUgbm8gc2UgcHVlZGUgcmVjaGF6YXIgbGEgaGlwb3NpcyBudWxhIGRlIHF1ZSBsb3MgcmVzaWR1YWxlcyBubyBzb24gZXN0YWNpb25hcmlvcywgbG8gY3VhbCBpbmRpY2EgcXVlIG5vIGhheSBzdWZpY2llbnRlIHBydWViYSBwYXJhIGNvbnNpZGVyYXIgcXVlIGVzdGFzIHNlcmllcyBubyBlc3RhY2lvbmFyaWFzIGVzdMOhbiBjb2ludGVncmFkYXMuIEVuIGNvbmNsdXNpw7NuLCBlc3RhcyBzZXJpZXMgbm8gZXN0YW4gY29pbnRlZ3JhZGFzLCBwb3IgbG8gdGFudG8sIGN1YWxxdWllciByZWdyZXNpw7NuIGxpbmVhbCByZWFsaXphZGEgZXN0cmUgZXN0YXMgZG9zIHNlcmllcyBzZXLDoSB1bmEgcmVncmVzacOzbiBlc3B1cmlhLiAK