Myra Hallman Mini Project 3

library(dplyr)
library(caret)
library(ggplot2)
library(forecast)
options(scipen=999)
historical.df <- read.csv("historical_data.csv")
historical.df <-na.omit(historical.df)
new.df <- read.csv("new_data.csv")
new.df <-na.omit(new.df)
purchase.df<- read.csv("historical_data.csv")
purchase.df <- na.omit(purchase.df) 

1 Each catalog costs approximately $2 to mail (including printing, postage, and mailing costs). Estimate the gross profit that the firm could expect from the remaining 199,000 names if it selects them randomly from the pool. (note from class:get response rate and expected profit and use excel if you want)

199000 * (14407 / 500 - 2) 
[1] 5335986
  1. Develop a model for classifying a customer as a purchaser or non-purchaser using historical data. 2.a. Pre-process the data to make sure that the binary outcome is recorded as a “factor”.
historical.df$purchase <- factor(
  historical.df$purchase,
  levels = c(1, 0),
  labels = c("purchaser", "non_purchaser")
  )
historical.df$web <- factor(
  historical.df$web,
  levels = c(1, 0),
  labels = c("Yes", "No")
)
historical.df$gender <- factor(
  historical.df$gender,
  levels = c(1, 0),
  labels = c("Male", "Female")
)
historical.df$res <- factor(
  historical.df$res,
  levels = c(1, 0),
  labels = c("Residential", "Commercial")
)
historical.df$us <- factor(
  historical.df$us,
  levels = c(1, 0),
  labels = c("US", "Non.US")
)
new.df$web <- factor(
  new.df$web,
  levels = c(1, 0),
  labels = c("Yes", "No")
)
new.df$gender <- factor(
  new.df$gender,
  levels = c(1, 0),
  labels = c("Male", "Female")
)
new.df$res <- factor(
  new.df$res,
  levels = c(1, 0),
  labels = c("Residential", "Commercial")
)
new.df$us <- factor(
  new.df$us,
  levels = c(1, 0),
  labels = c("US", "Non.US")
)

2.b. Run 2 logistic regression by choosing 2 subsets of the predictors. You can choose any 2 subsets that you want. Make sure that you set up your model to generate predicted probabilities. Use leave one group out cross validation allocating 70% of the data to training.

historical.logit.reg.fit <- train(
  purchase ~ web + gender,
  data = historical.df,
  method = "glm",
  family = "binomial",
  metric = "ROC",
  trControl = trainControl("LGOCV", number=1, p=.7, 
                           classProbs=TRUE, savePredictions=TRUE, 
                           summaryFunction = twoClassSummary))
historical2.logit.reg.fit <- train(
  purchase ~ gender + res,
  data = historical.df,
  method = "glm",
  family = "binomial",
  metric = "ROC",
  trControl = trainControl("LGOCV", number=1, p=.7, 
                           classProbs=TRUE, savePredictions=TRUE, 
                           summaryFunction = twoClassSummary))

2.c Compare the results of the models you estimated in 2.b, and select the better model using area under ROC curve as the decision criteria.

historical.logit.reg.fit$results
  parameter       ROC Sens Spec ROCSD SensSD SpecSD
1      none 0.7474555    0    1    NA     NA     NA
historical2.logit.reg.fit$results
  parameter       ROC Sens Spec ROCSD SensSD SpecSD
1      none 0.5159033    0    1    NA     NA     NA
  1. Develop a model for predicting purchase amount using historical data. 3.a. Create a data frame containing a subset of rows in historical data containing only the cases (rows) of the customers who made a purchase (hint: you can use filter function from dplyr package)
purchase.df <- read.csv("historical_data.csv")
purchase.df <- filter(purchase.df, purchase==1)
head(purchase.df)
  us feq last_update first_update web gender res purchase spending
1  1   5        2081         2438   0      1   0        1     1416
2  1   2         490         2829   0      0   0        1      204
3  1   2        2802         2834   1      0   0        1      130
4  1   5         542         3125   0      0   0        1      578
5  1   1        2158         2158   1      0   0        1       10
6  1   2        4005         4127   0      1   0        1      141
purchase.df$purchase <- factor(
  purchase.df$purchase,
  levels = c(1, 0),
  labels = c("purchaser", "non_purchaser")
  )
purchase.df$web <- factor(
  purchase.df$web,
  levels = c(1, 0),
  labels = c("Yes", "No")
)
purchase.df$gender <- factor(
  purchase.df$gender,
  levels = c(1, 0),
  labels = c("Male", "Female")
)
purchase.df$res <- factor(
  purchase.df$res,
  levels = c(1, 0),
  labels = c("Residential", "Commercial")
)
purchase.df$us <- factor(
  purchase.df$us,
  levels = c(1, 0),
  labels = c("US", "Non.US")
)

3.b. Use the subset of the data created in step 3. Run 2 multiple linear regression by choosing 2 subsets of the predictors. You can choose any 2 subsets that you want. Use leave one group out cross validation allocating 70% of the data to training.

linear.reg.fit <- train(
  spending ~ web + gender,
  data = purchase.df,
  method = "lm",
  trControl = trainControl("LGOCV", number=1, p=.7, 
                          savePredictions=TRUE))
linear2.reg.fit<- train(
  spending ~ gender + res,
  data = purchase.df,
  method = "lm",
  trControl = trainControl("LGOCV", number=1, p=.7, 
                           savePredictions=TRUE))

3.c. Compare the results of the models you estimated in 3.b, and select the better model using RMSE (root mean square error).

linear.reg.fit$results
  intercept     RMSE   Rsquared      MAE RMSESD RsquaredSD MAESD
1      TRUE 349.6288 0.06974091 174.5637     NA         NA    NA
linear2.reg.fit$results
  intercept     RMSE   Rsquared      MAE RMSESD RsquaredSD MAESD
1      TRUE 315.9691 0.01705332 187.4861     NA         NA    NA
  1. For the new data predict whether the customers will make a purchase and if so, predict the purchase amount. 4.a. Add a column to the new data with predicted probabilities of purchase from the selected logistic regression. (hint from class, one will come from log reg, one from lin reg) (p*Spend-2)
pred.probs <- predict(
historical.logit.reg.fit,
newdata = new.df,
type = "prob"
)
new.df$pred.purchase.prob <- pred.probs$purchaser

4.b. Add a column to the new data with predicted spending from the selected multiple linear regression.

new.df$spending <- predict(linear2.reg.fit,
          newdata=new.df)

4.c. Assuming that each catalog costs $2 what is the expected profit if you mail the catalog to everyone in the new dataset?

sum(new.df$expected.value)-(500 * 2)
[1] -1000

4.d Assuming that each catalog costs $2 what is the expected profit if you mail the catalog to everyone whose predicted probability of purchase is greater than 50%? What if you mail the catalog to everyone whose predicted probability of purchase is greater than 70%?

LS0tDQp0aXRsZTogIk1pbmkgUHJvamVjdCAzIg0Kb3V0cHV0OiBodG1sX25vdGVib29rDQotLS0NCk15cmEgSGFsbG1hbg0KTWluaSBQcm9qZWN0IDMNCg0KIA0KDQpgYGB7cn0NCmxpYnJhcnkoZHBseXIpDQpsaWJyYXJ5KGNhcmV0KQ0KbGlicmFyeShnZ3Bsb3QyKQ0KbGlicmFyeShmb3JlY2FzdCkNCg0Kb3B0aW9ucyhzY2lwZW49OTk5KQ0KDQpoaXN0b3JpY2FsLmRmIDwtIHJlYWQuY3N2KCJoaXN0b3JpY2FsX2RhdGEuY3N2IikNCmhpc3RvcmljYWwuZGYgPC1uYS5vbWl0KGhpc3RvcmljYWwuZGYpDQoNCm5ldy5kZiA8LSByZWFkLmNzdigibmV3X2RhdGEuY3N2IikNCm5ldy5kZiA8LW5hLm9taXQobmV3LmRmKQ0KDQpwdXJjaGFzZS5kZjwtIHJlYWQuY3N2KCJoaXN0b3JpY2FsX2RhdGEuY3N2IikNCg0KcHVyY2hhc2UuZGYgPC0gbmEub21pdChwdXJjaGFzZS5kZikgDQoNCmBgYA0KDQoNCjEgRWFjaCBjYXRhbG9nIGNvc3RzIGFwcHJveGltYXRlbHkgJDIgdG8gbWFpbCANCihpbmNsdWRpbmcgcHJpbnRpbmcsIHBvc3RhZ2UsIGFuZCBtYWlsaW5nIGNvc3RzKS4gDQpFc3RpbWF0ZSB0aGUgZ3Jvc3MgcHJvZml0IHRoYXQgdGhlIGZpcm0gY291bGQgZXhwZWN0IGZyb20gdGhlIA0KcmVtYWluaW5nIDE5OSwwMDAgbmFtZXMgaWYgaXQgc2VsZWN0cyB0aGVtIHJhbmRvbWx5IGZyb20gdGhlIHBvb2wuDQoobm90ZSBmcm9tIGNsYXNzOmdldCByZXNwb25zZSByYXRlIGFuZCBleHBlY3RlZCBwcm9maXQgYW5kIHVzZSBleGNlbCBpZiB5b3Ugd2FudCkNCmBgYHtyfQ0KMTk5MDAwICogKDE0NDA3IC8gNTAwIC0gMikgDQpgYGANCg0KMi4gRGV2ZWxvcCBhIG1vZGVsIGZvciBjbGFzc2lmeWluZyBhIGN1c3RvbWVyIGFzIGEgcHVyY2hhc2VyIG9yIA0Kbm9uLXB1cmNoYXNlciB1c2luZyBoaXN0b3JpY2FsIGRhdGEuDQoyLmEuIFByZS1wcm9jZXNzIHRoZSBkYXRhIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSBiaW5hcnkgb3V0Y29tZSBpcyANCnJlY29yZGVkIGFzIGEg4oCcZmFjdG9y4oCdLg0KYGBge3J9DQoNCg0KaGlzdG9yaWNhbC5kZiRwdXJjaGFzZSA8LSBmYWN0b3IoDQogIGhpc3RvcmljYWwuZGYkcHVyY2hhc2UsDQogIGxldmVscyA9IGMoMSwgMCksDQogIGxhYmVscyA9IGMoInB1cmNoYXNlciIsICJub25fcHVyY2hhc2VyIikNCiAgKQ0KDQpoaXN0b3JpY2FsLmRmJHdlYiA8LSBmYWN0b3IoDQogIGhpc3RvcmljYWwuZGYkd2ViLA0KICBsZXZlbHMgPSBjKDEsIDApLA0KICBsYWJlbHMgPSBjKCJZZXMiLCAiTm8iKQ0KKQ0KDQpoaXN0b3JpY2FsLmRmJGdlbmRlciA8LSBmYWN0b3IoDQogIGhpc3RvcmljYWwuZGYkZ2VuZGVyLA0KICBsZXZlbHMgPSBjKDEsIDApLA0KICBsYWJlbHMgPSBjKCJNYWxlIiwgIkZlbWFsZSIpDQopDQoNCmhpc3RvcmljYWwuZGYkcmVzIDwtIGZhY3RvcigNCiAgaGlzdG9yaWNhbC5kZiRyZXMsDQogIGxldmVscyA9IGMoMSwgMCksDQogIGxhYmVscyA9IGMoIlJlc2lkZW50aWFsIiwgIkNvbW1lcmNpYWwiKQ0KKQ0KDQpoaXN0b3JpY2FsLmRmJHVzIDwtIGZhY3RvcigNCiAgaGlzdG9yaWNhbC5kZiR1cywNCiAgbGV2ZWxzID0gYygxLCAwKSwNCiAgbGFiZWxzID0gYygiVVMiLCAiTm9uLlVTIikNCikNCg0KDQoNCg0KbmV3LmRmJHdlYiA8LSBmYWN0b3IoDQogIG5ldy5kZiR3ZWIsDQogIGxldmVscyA9IGMoMSwgMCksDQogIGxhYmVscyA9IGMoIlllcyIsICJObyIpDQopDQoNCm5ldy5kZiRnZW5kZXIgPC0gZmFjdG9yKA0KICBuZXcuZGYkZ2VuZGVyLA0KICBsZXZlbHMgPSBjKDEsIDApLA0KICBsYWJlbHMgPSBjKCJNYWxlIiwgIkZlbWFsZSIpDQopDQoNCm5ldy5kZiRyZXMgPC0gZmFjdG9yKA0KICBuZXcuZGYkcmVzLA0KICBsZXZlbHMgPSBjKDEsIDApLA0KICBsYWJlbHMgPSBjKCJSZXNpZGVudGlhbCIsICJDb21tZXJjaWFsIikNCikNCg0KbmV3LmRmJHVzIDwtIGZhY3RvcigNCiAgbmV3LmRmJHVzLA0KICBsZXZlbHMgPSBjKDEsIDApLA0KICBsYWJlbHMgPSBjKCJVUyIsICJOb24uVVMiKQ0KKQ0KDQoNCg0KYGBgDQoNCjIuYi4gUnVuIDIgbG9naXN0aWMgcmVncmVzc2lvbiBieSBjaG9vc2luZyAyIHN1YnNldHMgb2YgdGhlIHByZWRpY3RvcnMuIA0KWW91IGNhbiBjaG9vc2UgYW55IDIgc3Vic2V0cyB0aGF0IHlvdSB3YW50LiBNYWtlIHN1cmUgdGhhdCB5b3Ugc2V0IHVwIA0KeW91ciBtb2RlbCB0byBnZW5lcmF0ZSBwcmVkaWN0ZWQgcHJvYmFiaWxpdGllcy4gVXNlIGxlYXZlIG9uZSBncm91cCBvdXQgDQpjcm9zcyB2YWxpZGF0aW9uIGFsbG9jYXRpbmcgNzAlIG9mIHRoZSBkYXRhIHRvIHRyYWluaW5nLg0KDQpgYGB7cn0NCmhpc3RvcmljYWwubG9naXQucmVnLmZpdCA8LSB0cmFpbigNCiAgcHVyY2hhc2UgfiB3ZWIgKyBnZW5kZXIsDQogIGRhdGEgPSBoaXN0b3JpY2FsLmRmLA0KICBtZXRob2QgPSAiZ2xtIiwNCiAgZmFtaWx5ID0gImJpbm9taWFsIiwNCiAgbWV0cmljID0gIlJPQyIsDQogIHRyQ29udHJvbCA9IHRyYWluQ29udHJvbCgiTEdPQ1YiLCBudW1iZXI9MSwgcD0uNywgDQogICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc1Byb2JzPVRSVUUsIHNhdmVQcmVkaWN0aW9ucz1UUlVFLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1bW1hcnlGdW5jdGlvbiA9IHR3b0NsYXNzU3VtbWFyeSkpDQoNCmhpc3RvcmljYWwyLmxvZ2l0LnJlZy5maXQgPC0gdHJhaW4oDQogIHB1cmNoYXNlIH4gZ2VuZGVyICsgcmVzLA0KICBkYXRhID0gaGlzdG9yaWNhbC5kZiwNCiAgbWV0aG9kID0gImdsbSIsDQogIGZhbWlseSA9ICJiaW5vbWlhbCIsDQogIG1ldHJpYyA9ICJST0MiLA0KICB0ckNvbnRyb2wgPSB0cmFpbkNvbnRyb2woIkxHT0NWIiwgbnVtYmVyPTEsIHA9LjcsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NQcm9icz1UUlVFLCBzYXZlUHJlZGljdGlvbnM9VFJVRSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICBzdW1tYXJ5RnVuY3Rpb24gPSB0d29DbGFzc1N1bW1hcnkpKQ0KDQpgYGANCg0KMi5jIENvbXBhcmUgdGhlIHJlc3VsdHMgb2YgdGhlIG1vZGVscyB5b3UgZXN0aW1hdGVkIGluIDIuYiwgYW5kIHNlbGVjdCANCnRoZSBiZXR0ZXIgbW9kZWwgdXNpbmcgYXJlYSB1bmRlciBST0MgY3VydmUgYXMgdGhlIGRlY2lzaW9uIGNyaXRlcmlhLg0KDQpgYGB7cn0NCmhpc3RvcmljYWwubG9naXQucmVnLmZpdCRyZXN1bHRzDQpoaXN0b3JpY2FsMi5sb2dpdC5yZWcuZml0JHJlc3VsdHMNCmBgYA0KDQozLiBEZXZlbG9wIGEgbW9kZWwgZm9yIHByZWRpY3RpbmcgcHVyY2hhc2UgYW1vdW50IHVzaW5nIGhpc3RvcmljYWwgZGF0YS4NCjMuYS4gQ3JlYXRlIGEgZGF0YSBmcmFtZSBjb250YWluaW5nIGEgc3Vic2V0IG9mIHJvd3MgaW4gaGlzdG9yaWNhbCBkYXRhIA0KY29udGFpbmluZyBvbmx5IHRoZSBjYXNlcyAocm93cykgb2YgdGhlIGN1c3RvbWVycyB3aG8gbWFkZSBhIHB1cmNoYXNlIA0KKGhpbnQ6IHlvdSBjYW4gdXNlIGZpbHRlciBmdW5jdGlvbiBmcm9tIGRwbHlyIHBhY2thZ2UpDQoNCmBgYHtyfQ0KcHVyY2hhc2UuZGYgPC0gcmVhZC5jc3YoImhpc3RvcmljYWxfZGF0YS5jc3YiKQ0KDQpwdXJjaGFzZS5kZiA8LSBmaWx0ZXIocHVyY2hhc2UuZGYsIHB1cmNoYXNlPT0xKQ0KaGVhZChwdXJjaGFzZS5kZikNCg0KcHVyY2hhc2UuZGYkcHVyY2hhc2UgPC0gZmFjdG9yKA0KICBwdXJjaGFzZS5kZiRwdXJjaGFzZSwNCiAgbGV2ZWxzID0gYygxLCAwKSwNCiAgbGFiZWxzID0gYygicHVyY2hhc2VyIiwgIm5vbl9wdXJjaGFzZXIiKQ0KICApDQoNCnB1cmNoYXNlLmRmJHdlYiA8LSBmYWN0b3IoDQogIHB1cmNoYXNlLmRmJHdlYiwNCiAgbGV2ZWxzID0gYygxLCAwKSwNCiAgbGFiZWxzID0gYygiWWVzIiwgIk5vIikNCikNCg0KcHVyY2hhc2UuZGYkZ2VuZGVyIDwtIGZhY3RvcigNCiAgcHVyY2hhc2UuZGYkZ2VuZGVyLA0KICBsZXZlbHMgPSBjKDEsIDApLA0KICBsYWJlbHMgPSBjKCJNYWxlIiwgIkZlbWFsZSIpDQopDQoNCnB1cmNoYXNlLmRmJHJlcyA8LSBmYWN0b3IoDQogIHB1cmNoYXNlLmRmJHJlcywNCiAgbGV2ZWxzID0gYygxLCAwKSwNCiAgbGFiZWxzID0gYygiUmVzaWRlbnRpYWwiLCAiQ29tbWVyY2lhbCIpDQopDQoNCnB1cmNoYXNlLmRmJHVzIDwtIGZhY3RvcigNCiAgcHVyY2hhc2UuZGYkdXMsDQogIGxldmVscyA9IGMoMSwgMCksDQogIGxhYmVscyA9IGMoIlVTIiwgIk5vbi5VUyIpDQopDQpgYGANCg0KMy5iLiBVc2UgdGhlIHN1YnNldCBvZiB0aGUgZGF0YSBjcmVhdGVkIGluIHN0ZXAgMy4gUnVuIDIgbXVsdGlwbGUgbGluZWFyIA0KcmVncmVzc2lvbiBieSBjaG9vc2luZyAyIHN1YnNldHMgb2YgdGhlIHByZWRpY3RvcnMuIFlvdSBjYW4gY2hvb3NlIGFueSAyIA0Kc3Vic2V0cyB0aGF0IHlvdSB3YW50LiBVc2UgbGVhdmUgb25lIGdyb3VwIG91dCBjcm9zcyB2YWxpZGF0aW9uIGFsbG9jYXRpbmcgDQo3MCUgb2YgdGhlIGRhdGEgdG8gdHJhaW5pbmcuDQoNCmBgYHtyfQ0KbGluZWFyLnJlZy5maXQgPC0gdHJhaW4oDQogIHNwZW5kaW5nIH4gd2ViICsgZ2VuZGVyLA0KICBkYXRhID0gcHVyY2hhc2UuZGYsDQogIG1ldGhvZCA9ICJsbSIsDQogIHRyQ29udHJvbCA9IHRyYWluQ29udHJvbCgiTEdPQ1YiLCBudW1iZXI9MSwgcD0uNywgDQogICAgICAgICAgICAgICAgICAgICAgICAgIHNhdmVQcmVkaWN0aW9ucz1UUlVFKSkNCg0KbGluZWFyMi5yZWcuZml0PC0gdHJhaW4oDQogIHNwZW5kaW5nIH4gZ2VuZGVyICsgcmVzLA0KICBkYXRhID0gcHVyY2hhc2UuZGYsDQogIG1ldGhvZCA9ICJsbSIsDQogIHRyQ29udHJvbCA9IHRyYWluQ29udHJvbCgiTEdPQ1YiLCBudW1iZXI9MSwgcD0uNywgDQogICAgICAgICAgICAgICAgICAgICAgICAgICBzYXZlUHJlZGljdGlvbnM9VFJVRSkpDQpgYGANCg0KMy5jLiBDb21wYXJlIHRoZSByZXN1bHRzIG9mIHRoZSBtb2RlbHMgeW91IGVzdGltYXRlZCBpbiAzLmIsIGFuZCBzZWxlY3QgdGhlIA0KYmV0dGVyIG1vZGVsIHVzaW5nIFJNU0UgKHJvb3QgbWVhbiBzcXVhcmUgZXJyb3IpLg0KDQpgYGB7cn0NCmxpbmVhci5yZWcuZml0JHJlc3VsdHMNCmxpbmVhcjIucmVnLmZpdCRyZXN1bHRzDQpgYGANCg0KNC4gRm9yIHRoZSBuZXcgZGF0YSBwcmVkaWN0IHdoZXRoZXIgdGhlIGN1c3RvbWVycyB3aWxsIG1ha2UgYSBwdXJjaGFzZSBhbmQgaWYgc28sDQpwcmVkaWN0IHRoZSBwdXJjaGFzZSBhbW91bnQuDQo0LmEuIEFkZCBhIGNvbHVtbiB0byB0aGUgbmV3IGRhdGEgd2l0aCBwcmVkaWN0ZWQgcHJvYmFiaWxpdGllcyBvZiBwdXJjaGFzZSBmcm9tIHRoZSANCnNlbGVjdGVkIGxvZ2lzdGljIHJlZ3Jlc3Npb24uDQooaGludCBmcm9tIGNsYXNzLCBvbmUgd2lsbCBjb21lIGZyb20gbG9nIHJlZywgb25lIGZyb20gbGluIHJlZykgKHAqU3BlbmQtMikNCmBgYHtyfQ0KcHJlZC5wcm9icyA8LSBwcmVkaWN0KA0KaGlzdG9yaWNhbC5sb2dpdC5yZWcuZml0LA0KbmV3ZGF0YSA9IG5ldy5kZiwNCnR5cGUgPSAicHJvYiINCikNCm5ldy5kZiRwcmVkLnB1cmNoYXNlLnByb2IgPC0gcHJlZC5wcm9icyRwdXJjaGFzZXINCg0KDQoNCg0KYGBgDQoNCg0KNC5iLiBBZGQgYSBjb2x1bW4gdG8gdGhlIG5ldyBkYXRhIHdpdGggcHJlZGljdGVkIHNwZW5kaW5nIGZyb20gdGhlIHNlbGVjdGVkIG11bHRpcGxlIA0KbGluZWFyIHJlZ3Jlc3Npb24uDQpgYGB7cn0NCm5ldy5kZiRzcGVuZGluZyA8LSBwcmVkaWN0KGxpbmVhcjIucmVnLmZpdCwNCiAgICAgICAgICBuZXdkYXRhPW5ldy5kZikNCg0KDQpgYGANCg0KDQo0LmMuIEFzc3VtaW5nIHRoYXQgZWFjaCBjYXRhbG9nIGNvc3RzICQyIHdoYXQgaXMgdGhlIGV4cGVjdGVkIHByb2ZpdCBpZiB5b3UgbWFpbCB0aGUgDQpjYXRhbG9nIHRvIGV2ZXJ5b25lIGluIHRoZSBuZXcgZGF0YXNldD8NCg0KDQpgYGB7cn0NCnN1bShuZXcuZGYkZXhwZWN0ZWQudmFsdWUpLSg1MDAgKiAyKQ0KYGBgDQoNCjQuZCBBc3N1bWluZyB0aGF0IGVhY2ggY2F0YWxvZyBjb3N0cyAkMiB3aGF0IGlzIHRoZSBleHBlY3RlZCBwcm9maXQgaWYgeW91IG1haWwgdGhlIA0KY2F0YWxvZyB0byBldmVyeW9uZSB3aG9zZSBwcmVkaWN0ZWQgcHJvYmFiaWxpdHkgb2YgcHVyY2hhc2UgaXMgZ3JlYXRlciB0aGFuIDUwJT8gDQpXaGF0IGlmIHlvdSBtYWlsIHRoZSBjYXRhbG9nIHRvIGV2ZXJ5b25lIHdob3NlIHByZWRpY3RlZCBwcm9iYWJpbGl0eSBvZiBwdXJjaGFzZSBpcyANCmdyZWF0ZXIgdGhhbiA3MCU/DQoNCmBgYHtyfQ0KDQpgYGANCg0KDQoNCg0KDQoNCg0KDQoNCg==