Question 1

A company is considering whether to do a test on its marketing campaign. Direct marketing costs €2.00 to send. The company sells a product for €50 and 34% of that remains after taking costs and other items into account.

What’s the breakeven response rate threshold, i.e., the response probability this company needs for its mailing to be profitable?

\[ \pi\hat{p}-c>0 \]

Provide your answer with three decimals separated by a dot, not a comma (e.g. 0.123).

m <- 50*0.34
c <- 2
brk <- c/m
## Breakeven Response Rate Threshold: 0.118

Question 2

A company is considering whether to do a test on its marketing campaign. Direct marketing costs €2.00 to send. The company sells a product for €50 and 34% of that remains after taking costs and other items into account.

Using the ebeer data set, estimate the response rate.

Provide your answer with three decimals separated by a dot, not a comma (e.g. 0.123).

The data:

ebeer <- read_sav("C:/Users/danny/OneDrive/Análisis Cuantitativo y Econometría/Marketing Analytics/Customer Analytics/Quizes/1 Uncertainty/E-Beer.sav")

# Eliminate NA's
ebeer <- ebeer[!is.na(ebeer$respmail),]
# Response is numeric and 0/1
ebeer$respmail <- as.numeric(ebeer$respmail)

Response Rate:

p_hat <- round(mean(ebeer$respmail, na.rm=TRUE),3)
p_hat_se <- sqrt(p_hat*(1-p_hat)/nrow(ebeer))
## The mean response rate is 0.124 and it's standard deviation is 0.005

Assuming a normal distribution, we can estimate the probability that our estimated response rate is below the breakeven point:

B <- 10000
set.seed(19103)
post_draws <- rnorm(B, mean = p_hat, sd = p_hat_se) # random deviates
prob <- sum(post_draws<brk)/B
## The probability of being below the breakeven point is 0.088

We can plot these results:

xx <- seq(.107,.14,length=1000)

par(mai=c(.9,.8,.2,.2))
plot(xx, dnorm(xx, p_hat, p_hat_se), main="Distribution of Sample Mean", 
     type="l", col="royalblue", lwd=1.5,
     xlab="average monetary value", ylab="density")
abline(v=brk)
text(x = .115,y= 68, paste("P(p < 0.118) = ", round(prob,3) ))

Question 3

A company is considering whether to do a test on its marketing campaign. Direct marketing costs €2.00 to send. The company sells a product for €50 and 34% of that remains after taking costs and other items into account.

If they decide to roll it out to the population, what’s the probability that we make a mistake, i.e., the true response rate is lower than the breakeven response rate? Use a bootstrap with the same seed and number of draws we did in the R notebook. 

Provide your answer with three decimals separated by a dot, not a comma (e.g. 0.123).

The bootstrap code:

B <- 10000 
mub <- c() 
set.seed(19103)
for (b in 1:B){
  samp_b = sample.int(nrow(ebeer), replace=TRUE) 
  mub <- c(mub, mean(ebeer$respmail[samp_b])) # RESPONSE RATE
}

Probability that True Response Rate is lower than Breakeven Response Rate:

B <- 10000
set.seed(19103)
post_draws <- rnorm(B,mean(mub),sd(mub)) # random deviates
prob <- round(sum(post_draws<brk)/B, 3)
## The probability of being below the breakeven point is 0.076

We can plot this:

xx <- seq(.11,.14,length=1000)

par(mai=c(.8,.8,.2,.2))
hist(mub, main="", xlab="average response rate",
     col=8, border="grey90", freq=FALSE)
abline(v=brk)
text(x = .115,y= 68, paste("P(p < 0.118) = ", round(prob,3) ))

Question 4

A company wants to calculate the value of testing. They have a margin of 25, a marketing cost of 0.40, and a total customer base of 50000. Their sample is 5000 customers. In the past, campaigns have either been a success, with a response rate of .05, or a failure, with a response rate of 0.001. Historically, 80% of past mailings have been a failure.

Would the company decide to send without a test?

Our data:

m <- 25
c <- 0.40
N <- 50000
n <- 5000

p_s <- 0.05  # with P(Success)=0.2
p_f <- 0.001 # with P(Failure)=0.8

Option Value (Without Test):

(0.2)*N*(p_s*m-c)+(0.8)*N*(p_f*m-c)
## [1] -6500

Question 5

A company wants to calculate the value of testing. They have a margin of 25, a marketing cost of 0.40, and a total customer base of 50000. Their sample is 5000 customers. In the past, campaigns have either been a success, with a response rate of .05, or a failure, with a response rate of 0.001. Historically, 80% of past mailings have been a failure.

What is the profit if the company tests and it is a failure?

Option Value (Failure Case Only):

n*(p_f*m-c)
## [1] -1875

Question 6

A company wants to calculate the value of testing. They have a margin of 25, a marketing cost of 0.40, and a total customer base of 50000. Their sample is 5000 customers. In the past, campaigns have either been a success, with a response rate of .05, or a failure, with a response rate of 0.001. Historically, 80% of past mailings have been a failure.

What’s the expected profit with a test?

Option Value (Total Expected):

cat("$",(0.2)*N*(p_s*m-c)+(0.8)*n*(p_f*m-c))
## $ 7000

Question 7

A company wants to calculate the value of testing. They have a margin of 25, a marketing cost of 0.40, and a total customer base of 50000. Their sample is 5000 customers. In the past, campaigns have either been a success, with a response rate of .05, or a failure, with a response rate of 0.001.  Historically, 80% of past mailings have been a failure.

If running a test costs 5000, should the company do it?

(0.2)*N*(p_s*m-c) + (0.8)*(n*(p_f*m-c)) - 5000
## [1] 2000
LS0tDQp0aXRsZTogIlF1aXogMTogVGVzdCAmIFJvbGwiDQphdXRob3I6ICJEYW5pZWwgUmVkZWwiDQpkYXRlOiAiMjAyMy0wMS0yNCINCm91dHB1dDogDQogIGh0bWxfZG9jdW1lbnQ6DQogICAgdG9jOiBUUlVFDQogICAgdG9jX2Zsb2F0OiBUUlVFDQogICAgY29kZV9kb3dubG9hZDogVFJVRQ0KLS0tDQoNCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQ0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBUUlVFKQ0Kcm0obGlzdCA9IGxzKCkpDQojIFBBQ0tBR0VTDQpsaWJyYXJ5KHRpZHl2ZXJzZSkNCmxpYnJhcnkoa2FibGVFeHRyYSkNCmxpYnJhcnkocmVhZHIpDQpsaWJyYXJ5KGhhdmVuKQ0KYGBgDQoNCiMgUXVlc3Rpb24gMQ0KDQpBIGNvbXBhbnkgaXMgY29uc2lkZXJpbmcgd2hldGhlciB0byBkbyBhIHRlc3Qgb24gaXRzIG1hcmtldGluZyBjYW1wYWlnbi4gRGlyZWN0IG1hcmtldGluZyBjb3N0cyDigqwyLjAwIHRvIHNlbmQuIFRoZSBjb21wYW55IHNlbGxzIGEgcHJvZHVjdCBmb3Ig4oKsNTAgYW5kIDM0JSBvZiB0aGF0IHJlbWFpbnMgYWZ0ZXIgdGFraW5nIGNvc3RzIGFuZCBvdGhlciBpdGVtcyBpbnRvIGFjY291bnQuDQoNCioqV2hhdCdzIHRoZSBicmVha2V2ZW4gcmVzcG9uc2UgcmF0ZSB0aHJlc2hvbGQsIGkuZS4sIHRoZSByZXNwb25zZSBwcm9iYWJpbGl0eSB0aGlzIGNvbXBhbnkgbmVlZHMgZm9yIGl0cyBtYWlsaW5nIHRvIGJlIHByb2ZpdGFibGU/KioNCg0KJCQNClxwaVxoYXR7cH0tYz4wDQokJA0KDQoqUHJvdmlkZSB5b3VyIGFuc3dlciB3aXRoIHRocmVlIGRlY2ltYWxzIHNlcGFyYXRlZCBieSBhIGRvdCwgbm90IGEgY29tbWEgKGUuZy4gMC4xMjMpLioNCg0KYGBge3J9DQptIDwtIDUwKjAuMzQNCmMgPC0gMg0KYnJrIDwtIGMvbQ0KYGBgDQoNCmBgYHtyLCBlY2hvPUZBTFNFfQ0KY2F0KCJCcmVha2V2ZW4gUmVzcG9uc2UgUmF0ZSBUaHJlc2hvbGQ6Iiwgcm91bmQoYnJrLDMpICkNCmBgYA0KDQojIFF1ZXN0aW9uIDINCg0KQSBjb21wYW55IGlzIGNvbnNpZGVyaW5nIHdoZXRoZXIgdG8gZG8gYSB0ZXN0IG9uIGl0cyBtYXJrZXRpbmcgY2FtcGFpZ24uIERpcmVjdCBtYXJrZXRpbmcgY29zdHMg4oKsMi4wMCB0byBzZW5kLiBUaGUgY29tcGFueSBzZWxscyBhIHByb2R1Y3QgZm9yIOKCrDUwIGFuZCAzNCUgb2YgdGhhdCByZW1haW5zIGFmdGVyIHRha2luZyBjb3N0cyBhbmQgb3RoZXIgaXRlbXMgaW50byBhY2NvdW50Lg0KDQoqKlVzaW5nIHRoZSAqYGViZWVyYCogZGF0YSBzZXQsIGVzdGltYXRlIHRoZSByZXNwb25zZSByYXRlLioqDQoNCipQcm92aWRlIHlvdXIgYW5zd2VyIHdpdGggdGhyZWUgZGVjaW1hbHMgc2VwYXJhdGVkIGJ5IGEgZG90LCBub3QgYSBjb21tYSAoZS5nLiAwLjEyMykuKg0KDQpUaGUgZGF0YToNCg0KYGBge3IsIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0V9DQplYmVlciA8LSByZWFkX3NhdigiQzovVXNlcnMvZGFubnkvT25lRHJpdmUvQW7DoWxpc2lzIEN1YW50aXRhdGl2byB5IEVjb25vbWV0csOtYS9NYXJrZXRpbmcgQW5hbHl0aWNzL0N1c3RvbWVyIEFuYWx5dGljcy9RdWl6ZXMvMSBVbmNlcnRhaW50eS9FLUJlZXIuc2F2IikNCg0KIyBFbGltaW5hdGUgTkEncw0KZWJlZXIgPC0gZWJlZXJbIWlzLm5hKGViZWVyJHJlc3BtYWlsKSxdDQojIFJlc3BvbnNlIGlzIG51bWVyaWMgYW5kIDAvMQ0KZWJlZXIkcmVzcG1haWwgPC0gYXMubnVtZXJpYyhlYmVlciRyZXNwbWFpbCkNCmBgYA0KDQoqKlJlc3BvbnNlIFJhdGUqKjoNCg0KYGBge3J9DQpwX2hhdCA8LSByb3VuZChtZWFuKGViZWVyJHJlc3BtYWlsLCBuYS5ybT1UUlVFKSwzKQ0KcF9oYXRfc2UgPC0gc3FydChwX2hhdCooMS1wX2hhdCkvbnJvdyhlYmVlcikpDQpgYGANCg0KYGBge3IsIGVjaG89RkFMU0V9DQpjYXQoIlRoZSBtZWFuIHJlc3BvbnNlIHJhdGUgaXMiLCByb3VuZChwX2hhdCwzKSwgImFuZCBpdCdzIHN0YW5kYXJkIGRldmlhdGlvbiBpcyIsIHJvdW5kKHBfaGF0X3NlLCAzKSkNCmBgYA0KDQpBc3N1bWluZyBhICpub3JtYWwgZGlzdHJpYnV0aW9uKiwgd2UgY2FuIGVzdGltYXRlIHRoZSBwcm9iYWJpbGl0eSB0aGF0IG91ciBlc3RpbWF0ZWQgcmVzcG9uc2UgcmF0ZSBpcyBiZWxvdyB0aGUgYnJlYWtldmVuIHBvaW50Og0KDQpgYGB7cn0NCkIgPC0gMTAwMDANCnNldC5zZWVkKDE5MTAzKQ0KcG9zdF9kcmF3cyA8LSBybm9ybShCLCBtZWFuID0gcF9oYXQsIHNkID0gcF9oYXRfc2UpICMgcmFuZG9tIGRldmlhdGVzDQpwcm9iIDwtIHN1bShwb3N0X2RyYXdzPGJyaykvQg0KYGBgDQoNCmBgYHtyLCBlY2hvPUZBTFNFfQ0KY2F0KCJUaGUgcHJvYmFiaWxpdHkgb2YgYmVpbmcgYmVsb3cgdGhlIGJyZWFrZXZlbiBwb2ludCBpcyIsIHJvdW5kKHByb2IsIDMpKQ0KYGBgDQoNCldlIGNhbiBwbG90IHRoZXNlIHJlc3VsdHM6DQoNCmBgYHtyfQ0KeHggPC0gc2VxKC4xMDcsLjE0LGxlbmd0aD0xMDAwKQ0KDQpwYXIobWFpPWMoLjksLjgsLjIsLjIpKQ0KcGxvdCh4eCwgZG5vcm0oeHgsIHBfaGF0LCBwX2hhdF9zZSksIG1haW49IkRpc3RyaWJ1dGlvbiBvZiBTYW1wbGUgTWVhbiIsIA0KICAgICB0eXBlPSJsIiwgY29sPSJyb3lhbGJsdWUiLCBsd2Q9MS41LA0KICAgICB4bGFiPSJhdmVyYWdlIG1vbmV0YXJ5IHZhbHVlIiwgeWxhYj0iZGVuc2l0eSIpDQphYmxpbmUodj1icmspDQp0ZXh0KHggPSAuMTE1LHk9IDY4LCBwYXN0ZSgiUChwIDwgMC4xMTgpID0gIiwgcm91bmQocHJvYiwzKSApKQ0KYGBgDQoNCiMgDQoNCiMgUXVlc3Rpb24gMw0KDQpBIGNvbXBhbnkgaXMgY29uc2lkZXJpbmcgd2hldGhlciB0byBkbyBhIHRlc3Qgb24gaXRzIG1hcmtldGluZyBjYW1wYWlnbi4gRGlyZWN0IG1hcmtldGluZyBjb3N0cyDigqwyLjAwIHRvIHNlbmQuIFRoZSBjb21wYW55IHNlbGxzIGEgcHJvZHVjdCBmb3Ig4oKsNTAgYW5kIDM0JSBvZiB0aGF0IHJlbWFpbnMgYWZ0ZXIgdGFraW5nIGNvc3RzIGFuZCBvdGhlciBpdGVtcyBpbnRvIGFjY291bnQuXA0KXA0KKipJZiB0aGV5IGRlY2lkZSB0byByb2xsIGl0IG91dCB0byB0aGUgcG9wdWxhdGlvbiwgd2hhdCdzIHRoZSBwcm9iYWJpbGl0eSB0aGF0IHdlIG1ha2UgYSBtaXN0YWtlLCBpLmUuLCB0aGUgdHJ1ZSByZXNwb25zZSByYXRlIGlzIGxvd2VyIHRoYW4gdGhlIGJyZWFrZXZlbiByZXNwb25zZSByYXRlPyBVc2UgYSBib290c3RyYXAgd2l0aCB0aGUgc2FtZSBzZWVkIGFuZCBudW1iZXIgb2YgZHJhd3Mgd2UgZGlkIGluIHRoZSBSIG5vdGVib29rLioqwqANCg0KKlByb3ZpZGUgeW91ciBhbnN3ZXIgd2l0aCB0aHJlZSBkZWNpbWFscyBzZXBhcmF0ZWQgYnkgYSBkb3QsIG5vdCBhIGNvbW1hIChlLmcuIDAuMTIzKS4qDQoNClRoZSBib290c3RyYXAgY29kZToNCg0KYGBge3IsIGNhY2hlPVRSVUV9DQpCIDwtIDEwMDAwIA0KbXViIDwtIGMoKSANCnNldC5zZWVkKDE5MTAzKQ0KZm9yIChiIGluIDE6Qil7DQogIHNhbXBfYiA9IHNhbXBsZS5pbnQobnJvdyhlYmVlciksIHJlcGxhY2U9VFJVRSkgDQogIG11YiA8LSBjKG11YiwgbWVhbihlYmVlciRyZXNwbWFpbFtzYW1wX2JdKSkgIyBSRVNQT05TRSBSQVRFDQp9DQpgYGANCg0KUHJvYmFiaWxpdHkgdGhhdCBUcnVlIFJlc3BvbnNlIFJhdGUgaXMgbG93ZXIgdGhhbiBCcmVha2V2ZW4gUmVzcG9uc2UgUmF0ZToNCg0KYGBge3J9DQpCIDwtIDEwMDAwDQpzZXQuc2VlZCgxOTEwMykNCnBvc3RfZHJhd3MgPC0gcm5vcm0oQixtZWFuKG11Yiksc2QobXViKSkgIyByYW5kb20gZGV2aWF0ZXMNCnByb2IgPC0gcm91bmQoc3VtKHBvc3RfZHJhd3M8YnJrKS9CLCAzKQ0KYGBgDQoNCmBgYHtyLCBlY2hvPUZBTFNFfQ0KY2F0KCJUaGUgcHJvYmFiaWxpdHkgb2YgYmVpbmcgYmVsb3cgdGhlIGJyZWFrZXZlbiBwb2ludCBpcyIsIHJvdW5kKHByb2IsIDMpKQ0KYGBgDQoNCldlIGNhbiBwbG90IHRoaXM6DQoNCmBgYHtyfQ0KeHggPC0gc2VxKC4xMSwuMTQsbGVuZ3RoPTEwMDApDQoNCnBhcihtYWk9YyguOCwuOCwuMiwuMikpDQpoaXN0KG11YiwgbWFpbj0iIiwgeGxhYj0iYXZlcmFnZSByZXNwb25zZSByYXRlIiwNCiAgICAgY29sPTgsIGJvcmRlcj0iZ3JleTkwIiwgZnJlcT1GQUxTRSkNCmFibGluZSh2PWJyaykNCnRleHQoeCA9IC4xMTUseT0gNjgsIHBhc3RlKCJQKHAgPCAwLjExOCkgPSAiLCByb3VuZChwcm9iLDMpICkpDQpgYGANCg0KIyBRdWVzdGlvbiA0DQoNCkEgY29tcGFueSB3YW50cyB0byBjYWxjdWxhdGUgdGhlIHZhbHVlIG9mIHRlc3RpbmcuIFRoZXkgaGF2ZSBhIG1hcmdpbiBvZiAyNSwgYSBtYXJrZXRpbmcgY29zdCBvZiAwLjQwLCBhbmQgYSB0b3RhbCBjdXN0b21lciBiYXNlIG9mIDUwMDAwLiBUaGVpciBzYW1wbGUgaXMgNTAwMCBjdXN0b21lcnMuIEluIHRoZSBwYXN0LCBjYW1wYWlnbnMgaGF2ZSBlaXRoZXIgYmVlbiBhIHN1Y2Nlc3MsIHdpdGggYSByZXNwb25zZSByYXRlIG9mIC4wNSwgb3IgYSBmYWlsdXJlLCB3aXRoIGEgcmVzcG9uc2UgcmF0ZSBvZiAwLjAwMS4gSGlzdG9yaWNhbGx5LCA4MCUgb2YgcGFzdCBtYWlsaW5ncyBoYXZlIGJlZW4gYSBmYWlsdXJlLg0KDQoqKldvdWxkIHRoZSBjb21wYW55IGRlY2lkZSB0byBzZW5kIHdpdGhvdXQgYSB0ZXN0PyoqDQoNCk91ciBkYXRhOg0KDQpgYGB7cn0NCm0gPC0gMjUNCmMgPC0gMC40MA0KTiA8LSA1MDAwMA0KbiA8LSA1MDAwDQoNCnBfcyA8LSAwLjA1ICAjIHdpdGggUChTdWNjZXNzKT0wLjINCnBfZiA8LSAwLjAwMSAjIHdpdGggUChGYWlsdXJlKT0wLjgNCg0KYGBgDQoNCioqT3B0aW9uIFZhbHVlIChXaXRob3V0IFRlc3QpKio6DQoNCmBgYHtyfQ0KKDAuMikqTioocF9zKm0tYykrKDAuOCkqTioocF9mKm0tYykNCmBgYA0KDQojIFF1ZXN0aW9uIDUNCg0KQSBjb21wYW55IHdhbnRzIHRvIGNhbGN1bGF0ZSB0aGUgdmFsdWUgb2YgdGVzdGluZy4gVGhleSBoYXZlIGEgbWFyZ2luIG9mIDI1LCBhIG1hcmtldGluZyBjb3N0IG9mIDAuNDAsIGFuZCBhIHRvdGFsIGN1c3RvbWVyIGJhc2Ugb2YgNTAwMDAuIFRoZWlyIHNhbXBsZSBpcyA1MDAwIGN1c3RvbWVycy4gSW4gdGhlIHBhc3QsIGNhbXBhaWducyBoYXZlIGVpdGhlciBiZWVuIGEgc3VjY2Vzcywgd2l0aCBhIHJlc3BvbnNlIHJhdGUgb2YgLjA1LCBvciBhIGZhaWx1cmUsIHdpdGggYSByZXNwb25zZSByYXRlIG9mIDAuMDAxLiBIaXN0b3JpY2FsbHksIDgwJSBvZiBwYXN0IG1haWxpbmdzIGhhdmUgYmVlbiBhIGZhaWx1cmUuDQoNCioqV2hhdCBpcyB0aGUgcHJvZml0IGlmIHRoZSBjb21wYW55IHRlc3RzIGFuZCBpdCBpcyBhIGZhaWx1cmU/KioNCg0KKipPcHRpb24gVmFsdWUgKEZhaWx1cmUgQ2FzZSBPbmx5KSoqOg0KDQpgYGB7cn0NCm4qKHBfZiptLWMpDQpgYGANCg0KIyBRdWVzdGlvbiA2DQoNCkEgY29tcGFueSB3YW50cyB0byBjYWxjdWxhdGUgdGhlIHZhbHVlIG9mIHRlc3RpbmcuIFRoZXkgaGF2ZSBhIG1hcmdpbiBvZiAyNSwgYSBtYXJrZXRpbmcgY29zdCBvZiAwLjQwLCBhbmQgYSB0b3RhbCBjdXN0b21lciBiYXNlIG9mIDUwMDAwLiBUaGVpciBzYW1wbGUgaXMgNTAwMCBjdXN0b21lcnMuIEluIHRoZSBwYXN0LCBjYW1wYWlnbnMgaGF2ZSBlaXRoZXIgYmVlbiBhIHN1Y2Nlc3MsIHdpdGggYSByZXNwb25zZSByYXRlIG9mIC4wNSwgb3IgYSBmYWlsdXJlLCB3aXRoIGEgcmVzcG9uc2UgcmF0ZSBvZiAwLjAwMS4gSGlzdG9yaWNhbGx5LCA4MCUgb2YgcGFzdCBtYWlsaW5ncyBoYXZlIGJlZW4gYSBmYWlsdXJlLg0KDQoqKldoYXQncyB0aGUgZXhwZWN0ZWQgcHJvZml0IHdpdGggYSB0ZXN0PyoqDQoNCioqT3B0aW9uIFZhbHVlIChUb3RhbCBFeHBlY3RlZCkqKjoNCg0KYGBge3J9DQpjYXQoIiQiLCgwLjIpKk4qKHBfcyptLWMpKygwLjgpKm4qKHBfZiptLWMpKQ0KYGBgDQoNCiMgUXVlc3Rpb24gNw0KDQpBIGNvbXBhbnkgd2FudHMgdG8gY2FsY3VsYXRlIHRoZSB2YWx1ZSBvZiB0ZXN0aW5nLiBUaGV5IGhhdmUgYSBtYXJnaW4gb2YgMjUsIGEgbWFya2V0aW5nIGNvc3Qgb2YgMC40MCwgYW5kIGEgdG90YWwgY3VzdG9tZXIgYmFzZSBvZiA1MDAwMC4gVGhlaXIgc2FtcGxlIGlzIDUwMDAgY3VzdG9tZXJzLiBJbiB0aGUgcGFzdCwgY2FtcGFpZ25zIGhhdmUgZWl0aGVyIGJlZW4gYSBzdWNjZXNzLCB3aXRoIGEgcmVzcG9uc2UgcmF0ZSBvZiAuMDUsIG9yIGEgZmFpbHVyZSwgd2l0aCBhIHJlc3BvbnNlIHJhdGUgb2YgMC4wMDEuIMKgSGlzdG9yaWNhbGx5LCA4MCUgb2YgcGFzdCBtYWlsaW5ncyBoYXZlIGJlZW4gYSBmYWlsdXJlLg0KDQoqKklmIHJ1bm5pbmcgYSB0ZXN0IGNvc3RzIDUwMDAsIHNob3VsZCB0aGUgY29tcGFueSBkbyBpdD8qKg0KDQpgYGB7cn0NCigwLjIpKk4qKHBfcyptLWMpICsgKDAuOCkqKG4qKHBfZiptLWMpKSAtIDUwMDANCmBgYA0K