library(tidyverse)
library(openintro)
download.file("http://www.openintro.org/stat/data/ames.RData", destfile = "ames.RData")
load("ames.RData")

Exercise 1

Describe:
Shape: The shape seems fairly skew right (there is a long right tail)
Center: The mean area of the houses sold is at 1500 square feet Spread: The standard deviation is 505.509 square feet

area <- ames$Gr.Liv.Area
price <- ames$SalePrice

summary(area)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##     334    1126    1442    1500    1743    5642
sd(area)
## [1] 505.5089
hist(area)

# area is the living area of the house in sq. ft.
# price is the sale price of the house

Exercise 2

This distribution has a similar shape, a mean of 1455, and a sd of 516.833, which are all very similar.

set.seed(27)
samp1 <- sample(area, 50)
summary(samp1)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##     672    1041    1394    1455    1678    2978
sd(samp1)
## [1] 516.8332
hist(samp1)

Exercise 3

The mean of samp2 is 1432, which is different, but still pretty close to samp1. I believe that the samples would provide estimates of the population mean with increasing accuracy as the sample size increases due to Bernoulli’s weak law of large numbers.

set.seed(36)
samp2 <- sample(area,50)
summary(samp2)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##     800    1155    1380    1432    1621    3082
sd(samp2)
## [1] 423.2572
hist(samp2)

Exercise 4

I believe that there are 5000 “num” elements in the variable sample_means50 as shown in the global environment.

Interestingly, the sampling distribution has a mean of exactly 1500, which is the exact same as the population mean. The shape is approximately normal, which the Q-Q plot confirms, but I’m not sure how to interpret the Shapiro-Wilk test results. The standard error is 70.773 square feet.

set.seed(64)
sample_means50 <- rep(NA, 5000)

for(i in 1:5000){
   samp <- sample(area, 50)
   sample_means50[i] <- mean(samp)
   }

hist(sample_means50, breaks = 25)

summary(sample_means50)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##    1240    1452    1498    1500    1546    1807
sd(sample_means50)
## [1] 70.77322
qqnorm(sample_means50)
qqline(sample_means50)

shapiro.test(sample_means50)
## 
##  Shapiro-Wilk normality test
## 
## data:  sample_means50
## W = 0.99785, p-value = 1.894e-06

Exercise 5

There are 100 elements in the object sample_means_small. Each element is a sample mean for one of the repeated samples. I’m really loving this because now I can see how we use for loops similarly with Matlab and get similar outputs in the console (they have almost the exact same syntax)! Also the Shapiro-Wilk test is a lot easier to interpret here because p is clearly greater than .1 and theres no confusing exponents.

set.seed(81)
sample_means_small <- rep(NA, 100)

for(i in 1:100){
  samp_small <- sample(area, 50)
  sample_means_small[i] <- mean(samp_small)
}

hist(sample_means_small)

summary(sample_means_small)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##    1311    1451    1498    1503    1543    1690
sd(sample_means_small)
## [1] 73.74528
qqnorm(sample_means_small)
qqline(sample_means_small)

shapiro.test(sample_means_small)
## 
##  Shapiro-Wilk normality test
## 
## data:  sample_means_small
## W = 0.98353, p-value = 0.2475
sample_means_small
##   [1] 1486.88 1540.52 1489.26 1632.34 1451.76 1604.18 1503.50 1506.98 1514.54
##  [10] 1311.80 1558.92 1571.30 1445.48 1605.98 1480.08 1413.84 1490.52 1537.26
##  [19] 1502.78 1512.12 1470.42 1412.34 1438.30 1431.26 1525.14 1676.58 1528.06
##  [28] 1624.14 1379.60 1444.98 1547.58 1534.58 1415.74 1446.96 1463.58 1520.32
##  [37] 1531.34 1377.74 1534.64 1479.54 1618.58 1588.56 1440.40 1494.06 1451.64
##  [46] 1377.28 1490.90 1518.68 1392.26 1543.64 1551.36 1450.10 1450.92 1472.82
##  [55] 1447.52 1494.48 1642.68 1689.90 1447.24 1506.62 1418.18 1498.94 1496.38
##  [64] 1520.06 1461.86 1517.52 1499.44 1504.64 1455.50 1459.68 1518.86 1687.42
##  [73] 1443.04 1496.46 1559.64 1466.38 1434.30 1506.20 1442.78 1634.88 1470.22
##  [82] 1604.10 1513.72 1484.30 1473.96 1546.74 1570.26 1467.96 1472.14 1591.70
##  [91] 1311.40 1586.04 1435.74 1512.52 1472.14 1542.28 1609.42 1577.94 1403.20
## [100] 1583.56

Exercise 6

The means weren’t significantly different between the distributions: at 1502 ft^2, then 1500 ft^2, then 1499 ft^2. It actually was less accurate on the final larger sample size. I believe this is because regardless of the sample size, the mean of a sampling distribution (sampling mean) is relatively close to the population mean when iterated sufficiently (and each of theses were iterated 5000 times).

The spreads, however, do drastically decrease, and clearly the standard error is decreasing as the sample size is increasing.

set.seed(121)

sample_means10 <- rep(NA, 5000)
sample_means100 <- rep(NA, 5000)

for(i in 1:5000){
  samp <- sample(area, 10)
  sample_means10[i] <- mean(samp)
  samp <- sample(area, 100)
  sample_means100[i] <- mean(samp)
}

par(mfrow = c(3, 1))

xlimits <- range(sample_means10)

hist(sample_means10, breaks = 20, xlim = xlimits)
hist(sample_means50, breaks = 20, xlim = xlimits)
hist(sample_means100, breaks = 20, xlim = xlimits)

summary(sample_means10)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##    1018    1390    1493    1502    1600    2190
summary(sample_means50)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##    1240    1452    1498    1500    1546    1807
summary(sample_means100)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##    1329    1466    1498    1499    1533    1723

On Your Own

  1. The best estimate I have is $180,043 for the mean sale price.
set.seed(144)
samp_price <- sample(price, 50)
mean(samp_price)
## [1] 180042.5
  1. The sampling mean (which estimates the population mean) is $180,994. The true population mean is $180,796, which is really close to our estimate!
set.seed(169)

sample_means_again <- rep(NA, 5000)

for(i in 1:5000){
  samp_price_again <- sample(price, 50)
  sample_means_again[i] <- mean(samp_price_again)
}

hist(sample_means_again)

mean(sample_means_again)
## [1] 180993.5
mean(price)
## [1] 180796.1
sd(sample_means_again)
## [1] 11069.74
  1. This sampling distribution predicts the mean price to be $180,650, which is even closer than time, but not by a significant margin. I suppose this illustrates why once you reach a “sufficiently large” sample size, you don’t need to take samples of any larger size, otherwise it may either be more effort than its worth, or mess up your data by being non-random.
set.seed(196)

sample_means_again_again <- rep(NA, 5000)

for(i in 1:5000){
  samp_price_again_again <- sample(price, 150)
  sample_means_again_again[i] <- mean(samp_price_again_again)
}

hist(sample_means_again_again)

mean(sample_means_again_again)
## [1] 180649.6
mean(price)
## [1] 180796.1
sd(sample_means_again_again)
## [1] 6274.747
  1. The sampling distribution with n=150 has sd = 6274.747, whereas the sampling distribution with n=50 has sd = 11069.74, and therefore the sampling distribution with the larger sample size has the smaller spread. If we want to make estimates that are more often close to the true value, we prefer a sampling distribution with a smaller spread, because that means that the likelihood that we will be farther away from the true population mean is less.
LS0tDQp0aXRsZTogIk9wZW5JbnRybyBCYXNlIFIgTGFiIDUiDQphdXRob3I6ICJBZGkgVmVybWEiDQpkYXRlOiAiYHIgU3lzLkRhdGUoKWAiDQpvdXRwdXQ6IG9wZW5pbnRybzo6bGFiX3JlcG9ydA0KLS0tDQoNCmBgYHtyIGxvYWQtcGFja2FnZXMsIG1lc3NhZ2U9RkFMU0V9DQpsaWJyYXJ5KHRpZHl2ZXJzZSkNCmxpYnJhcnkob3BlbmludHJvKQ0KZG93bmxvYWQuZmlsZSgiaHR0cDovL3d3dy5vcGVuaW50cm8ub3JnL3N0YXQvZGF0YS9hbWVzLlJEYXRhIiwgZGVzdGZpbGUgPSAiYW1lcy5SRGF0YSIpDQpsb2FkKCJhbWVzLlJEYXRhIikNCmBgYA0KDQojIyMgRXhlcmNpc2UgMQ0KDQpEZXNjcmliZTogIA0KU2hhcGU6IFRoZSBzaGFwZSBzZWVtcyBmYWlybHkgc2tldyByaWdodCAodGhlcmUgaXMgYSBsb25nIHJpZ2h0IHRhaWwpICANCkNlbnRlcjogVGhlIG1lYW4gYXJlYSBvZiB0aGUgaG91c2VzIHNvbGQgaXMgYXQgMTUwMCBzcXVhcmUgZmVldA0KU3ByZWFkOiBUaGUgc3RhbmRhcmQgZGV2aWF0aW9uIGlzIDUwNS41MDkgc3F1YXJlIGZlZXQNCg0KYGBge3IgY29kZS1jaHVuay0xfQ0KYXJlYSA8LSBhbWVzJEdyLkxpdi5BcmVhDQpwcmljZSA8LSBhbWVzJFNhbGVQcmljZQ0KDQpzdW1tYXJ5KGFyZWEpDQpzZChhcmVhKQ0KaGlzdChhcmVhKQ0KDQojIGFyZWEgaXMgdGhlIGxpdmluZyBhcmVhIG9mIHRoZSBob3VzZSBpbiBzcS4gZnQuDQojIHByaWNlIGlzIHRoZSBzYWxlIHByaWNlIG9mIHRoZSBob3VzZQ0KYGBgDQoNCiMjIyBFeGVyY2lzZSAyDQoNClRoaXMgZGlzdHJpYnV0aW9uIGhhcyBhIHNpbWlsYXIgc2hhcGUsIGEgbWVhbiBvZiAxNDU1LCBhbmQgYSBzZCBvZiA1MTYuODMzLA0Kd2hpY2ggYXJlIGFsbCB2ZXJ5IHNpbWlsYXIuDQoNCmBgYHtyIGNvZGUtY2h1bmstMn0NCnNldC5zZWVkKDI3KQ0Kc2FtcDEgPC0gc2FtcGxlKGFyZWEsIDUwKQ0Kc3VtbWFyeShzYW1wMSkNCnNkKHNhbXAxKQ0KaGlzdChzYW1wMSkNCmBgYA0KDQojIyMgRXhlcmNpc2UgMw0KDQpUaGUgbWVhbiBvZiBzYW1wMiBpcyAxNDMyLCB3aGljaCBpcyBkaWZmZXJlbnQsIGJ1dCBzdGlsbCBwcmV0dHkgY2xvc2UgdG8gc2FtcDEuDQpJIGJlbGlldmUgdGhhdCB0aGUgc2FtcGxlcyB3b3VsZCBwcm92aWRlIGVzdGltYXRlcyBvZiB0aGUgcG9wdWxhdGlvbiBtZWFuDQp3aXRoIGluY3JlYXNpbmcgYWNjdXJhY3kgYXMgdGhlIHNhbXBsZSBzaXplIGluY3JlYXNlcyBkdWUgdG8gQmVybm91bGxpJ3Mgd2Vhaw0KbGF3IG9mIGxhcmdlIG51bWJlcnMuDQoNCmBgYHtyIGNvZGUtY2h1bmstM30NCnNldC5zZWVkKDM2KQ0Kc2FtcDIgPC0gc2FtcGxlKGFyZWEsNTApDQpzdW1tYXJ5KHNhbXAyKQ0Kc2Qoc2FtcDIpDQpoaXN0KHNhbXAyKQ0KYGBgDQoNCiMjIyBFeGVyY2lzZSA0DQoNCkkgYmVsaWV2ZSB0aGF0IHRoZXJlIGFyZSA1MDAwICJudW0iIGVsZW1lbnRzIGluIHRoZSB2YXJpYWJsZSBzYW1wbGVfbWVhbnM1MA0KYXMgc2hvd24gaW4gdGhlIGdsb2JhbCBlbnZpcm9ubWVudC4NCg0KSW50ZXJlc3RpbmdseSwgdGhlIHNhbXBsaW5nIGRpc3RyaWJ1dGlvbiBoYXMgYSBtZWFuIG9mIGV4YWN0bHkgMTUwMCwgd2hpY2ggaXMNCnRoZSBleGFjdCBzYW1lIGFzIHRoZSBwb3B1bGF0aW9uIG1lYW4uIFRoZSBzaGFwZSBpcyBhcHByb3hpbWF0ZWx5IG5vcm1hbCwgd2hpY2gNCnRoZSBRLVEgcGxvdCBjb25maXJtcywgYnV0IEknbSBub3Qgc3VyZSBob3cgdG8gaW50ZXJwcmV0IHRoZSBTaGFwaXJvLVdpbGsgdGVzdA0KcmVzdWx0cy4gVGhlIHN0YW5kYXJkIGVycm9yIGlzIDcwLjc3MyBzcXVhcmUgZmVldC4NCg0KYGBge3IgY29kZS1jaHVuay00fQ0Kc2V0LnNlZWQoNjQpDQpzYW1wbGVfbWVhbnM1MCA8LSByZXAoTkEsIDUwMDApDQoNCmZvcihpIGluIDE6NTAwMCl7DQogICBzYW1wIDwtIHNhbXBsZShhcmVhLCA1MCkNCiAgIHNhbXBsZV9tZWFuczUwW2ldIDwtIG1lYW4oc2FtcCkNCiAgIH0NCg0KaGlzdChzYW1wbGVfbWVhbnM1MCwgYnJlYWtzID0gMjUpDQoNCnN1bW1hcnkoc2FtcGxlX21lYW5zNTApDQpzZChzYW1wbGVfbWVhbnM1MCkNCnFxbm9ybShzYW1wbGVfbWVhbnM1MCkNCnFxbGluZShzYW1wbGVfbWVhbnM1MCkNCnNoYXBpcm8udGVzdChzYW1wbGVfbWVhbnM1MCkNCmBgYA0KDQojIyMgRXhlcmNpc2UgNQ0KDQpUaGVyZSBhcmUgMTAwIGVsZW1lbnRzIGluIHRoZSBvYmplY3Qgc2FtcGxlX21lYW5zX3NtYWxsLiBFYWNoDQplbGVtZW50IGlzIGEgc2FtcGxlIG1lYW4gZm9yIG9uZSBvZiB0aGUgcmVwZWF0ZWQgc2FtcGxlcy4gSSdtIHJlYWxseSBsb3ZpbmcNCnRoaXMgYmVjYXVzZSBub3cgSSBjYW4gc2VlIGhvdyB3ZSB1c2UgZm9yIGxvb3BzIHNpbWlsYXJseSB3aXRoIE1hdGxhYiBhbmQNCmdldCBzaW1pbGFyIG91dHB1dHMgaW4gdGhlIGNvbnNvbGUgKHRoZXkgaGF2ZSBhbG1vc3QgdGhlIGV4YWN0IHNhbWUgc3ludGF4KSENCkFsc28gdGhlIFNoYXBpcm8tV2lsayB0ZXN0IGlzIGEgbG90IGVhc2llciB0byBpbnRlcnByZXQgaGVyZSBiZWNhdXNlIHAgaXMNCmNsZWFybHkgZ3JlYXRlciB0aGFuIC4xIGFuZCB0aGVyZXMgbm8gY29uZnVzaW5nIGV4cG9uZW50cy4NCg0KYGBge3IgY29kZS1jaHVuay01fQ0Kc2V0LnNlZWQoODEpDQpzYW1wbGVfbWVhbnNfc21hbGwgPC0gcmVwKE5BLCAxMDApDQoNCmZvcihpIGluIDE6MTAwKXsNCiAgc2FtcF9zbWFsbCA8LSBzYW1wbGUoYXJlYSwgNTApDQogIHNhbXBsZV9tZWFuc19zbWFsbFtpXSA8LSBtZWFuKHNhbXBfc21hbGwpDQp9DQoNCmhpc3Qoc2FtcGxlX21lYW5zX3NtYWxsKQ0KDQpzdW1tYXJ5KHNhbXBsZV9tZWFuc19zbWFsbCkNCnNkKHNhbXBsZV9tZWFuc19zbWFsbCkNCnFxbm9ybShzYW1wbGVfbWVhbnNfc21hbGwpDQpxcWxpbmUoc2FtcGxlX21lYW5zX3NtYWxsKQ0Kc2hhcGlyby50ZXN0KHNhbXBsZV9tZWFuc19zbWFsbCkNCg0Kc2FtcGxlX21lYW5zX3NtYWxsDQpgYGANCg0KIyMjIEV4ZXJjaXNlIDYNCg0KVGhlIG1lYW5zIHdlcmVuJ3Qgc2lnbmlmaWNhbnRseSBkaWZmZXJlbnQgYmV0d2VlbiB0aGUgZGlzdHJpYnV0aW9uczogYXQgMTUwMiBmdF4yLA0KdGhlbiAxNTAwIGZ0XjIsIHRoZW4gMTQ5OSBmdF4yLiBJdCBhY3R1YWxseSB3YXMgbGVzcyBhY2N1cmF0ZSBvbiB0aGUgZmluYWwgbGFyZ2VyIHNhbXBsZQ0Kc2l6ZS4gSSBiZWxpZXZlIHRoaXMgaXMgYmVjYXVzZSByZWdhcmRsZXNzIG9mIHRoZSBzYW1wbGUgc2l6ZSwgdGhlIG1lYW4gb2YNCmEgc2FtcGxpbmcgZGlzdHJpYnV0aW9uIChzYW1wbGluZyBtZWFuKSBpcyByZWxhdGl2ZWx5IGNsb3NlIHRvIHRoZSBwb3B1bGF0aW9uIA0KbWVhbiB3aGVuIGl0ZXJhdGVkIHN1ZmZpY2llbnRseSAoYW5kIGVhY2ggb2YgdGhlc2VzIHdlcmUgaXRlcmF0ZWQgNTAwMCB0aW1lcykuICANCg0KVGhlIHNwcmVhZHMsIGhvd2V2ZXIsIGRvIGRyYXN0aWNhbGx5IGRlY3JlYXNlLCBhbmQgY2xlYXJseSB0aGUgc3RhbmRhcmQNCmVycm9yIGlzIGRlY3JlYXNpbmcgYXMgdGhlIHNhbXBsZSBzaXplIGlzIGluY3JlYXNpbmcuDQoNCmBgYHtyIGNvZGUtY2h1bmstNn0NCnNldC5zZWVkKDEyMSkNCg0Kc2FtcGxlX21lYW5zMTAgPC0gcmVwKE5BLCA1MDAwKQ0Kc2FtcGxlX21lYW5zMTAwIDwtIHJlcChOQSwgNTAwMCkNCg0KZm9yKGkgaW4gMTo1MDAwKXsNCiAgc2FtcCA8LSBzYW1wbGUoYXJlYSwgMTApDQogIHNhbXBsZV9tZWFuczEwW2ldIDwtIG1lYW4oc2FtcCkNCiAgc2FtcCA8LSBzYW1wbGUoYXJlYSwgMTAwKQ0KICBzYW1wbGVfbWVhbnMxMDBbaV0gPC0gbWVhbihzYW1wKQ0KfQ0KDQpwYXIobWZyb3cgPSBjKDMsIDEpKQ0KDQp4bGltaXRzIDwtIHJhbmdlKHNhbXBsZV9tZWFuczEwKQ0KDQpoaXN0KHNhbXBsZV9tZWFuczEwLCBicmVha3MgPSAyMCwgeGxpbSA9IHhsaW1pdHMpDQpoaXN0KHNhbXBsZV9tZWFuczUwLCBicmVha3MgPSAyMCwgeGxpbSA9IHhsaW1pdHMpDQpoaXN0KHNhbXBsZV9tZWFuczEwMCwgYnJlYWtzID0gMjAsIHhsaW0gPSB4bGltaXRzKQ0KDQpzdW1tYXJ5KHNhbXBsZV9tZWFuczEwKQ0Kc3VtbWFyeShzYW1wbGVfbWVhbnM1MCkNCnN1bW1hcnkoc2FtcGxlX21lYW5zMTAwKQ0KYGBgDQoNCiMjIyBPbiBZb3VyIE93bg0KDQoxLiBUaGUgYmVzdCBlc3RpbWF0ZSBJIGhhdmUgaXMgJDE4MCwwNDMgZm9yIHRoZSBtZWFuIHNhbGUgcHJpY2UuDQoNCmBgYHtyIGNvZGUtY2h1bmstb3lvMX0NCnNldC5zZWVkKDE0NCkNCnNhbXBfcHJpY2UgPC0gc2FtcGxlKHByaWNlLCA1MCkNCm1lYW4oc2FtcF9wcmljZSkNCmBgYA0KDQoyLiBUaGUgc2FtcGxpbmcgbWVhbiAod2hpY2ggZXN0aW1hdGVzIHRoZSBwb3B1bGF0aW9uIG1lYW4pIGlzICQxODAsOTk0Lg0KICAgIFRoZSB0cnVlIHBvcHVsYXRpb24gbWVhbiBpcyAkMTgwLDc5Niwgd2hpY2ggaXMgcmVhbGx5IGNsb3NlIHRvIG91ciBlc3RpbWF0ZSENCg0KYGBge3IgY29kZS1jaHVuay1veW8yfQ0Kc2V0LnNlZWQoMTY5KQ0KDQpzYW1wbGVfbWVhbnNfYWdhaW4gPC0gcmVwKE5BLCA1MDAwKQ0KDQpmb3IoaSBpbiAxOjUwMDApew0KICBzYW1wX3ByaWNlX2FnYWluIDwtIHNhbXBsZShwcmljZSwgNTApDQogIHNhbXBsZV9tZWFuc19hZ2FpbltpXSA8LSBtZWFuKHNhbXBfcHJpY2VfYWdhaW4pDQp9DQoNCmhpc3Qoc2FtcGxlX21lYW5zX2FnYWluKQ0KbWVhbihzYW1wbGVfbWVhbnNfYWdhaW4pDQptZWFuKHByaWNlKQ0Kc2Qoc2FtcGxlX21lYW5zX2FnYWluKQ0KYGBgDQoNCjMuIFRoaXMgc2FtcGxpbmcgZGlzdHJpYnV0aW9uIHByZWRpY3RzIHRoZSBtZWFuIHByaWNlIHRvIGJlICQxODAsNjUwLCB3aGljaA0KICAgIGlzIGV2ZW4gY2xvc2VyIHRoYW4gdGltZSwgYnV0IG5vdCBieSBhIHNpZ25pZmljYW50IG1hcmdpbi4gSSBzdXBwb3NlIHRoaXMNCiAgICBpbGx1c3RyYXRlcyB3aHkgb25jZSB5b3UgcmVhY2ggYSAic3VmZmljaWVudGx5IGxhcmdlIiBzYW1wbGUgc2l6ZSwgeW91DQogICAgZG9uJ3QgbmVlZCB0byB0YWtlIHNhbXBsZXMgb2YgYW55IGxhcmdlciBzaXplLCBvdGhlcndpc2UgaXQgbWF5IGVpdGhlcg0KICAgIGJlIG1vcmUgZWZmb3J0IHRoYW4gaXRzIHdvcnRoLCBvciBtZXNzIHVwIHlvdXIgZGF0YSBieSBiZWluZyBub24tcmFuZG9tLg0KDQpgYGB7ciBjb2RlLWNodW5rLW95bzN9DQpzZXQuc2VlZCgxOTYpDQoNCnNhbXBsZV9tZWFuc19hZ2Fpbl9hZ2FpbiA8LSByZXAoTkEsIDUwMDApDQoNCmZvcihpIGluIDE6NTAwMCl7DQogIHNhbXBfcHJpY2VfYWdhaW5fYWdhaW4gPC0gc2FtcGxlKHByaWNlLCAxNTApDQogIHNhbXBsZV9tZWFuc19hZ2Fpbl9hZ2FpbltpXSA8LSBtZWFuKHNhbXBfcHJpY2VfYWdhaW5fYWdhaW4pDQp9DQoNCmhpc3Qoc2FtcGxlX21lYW5zX2FnYWluX2FnYWluKQ0KbWVhbihzYW1wbGVfbWVhbnNfYWdhaW5fYWdhaW4pDQptZWFuKHByaWNlKQ0Kc2Qoc2FtcGxlX21lYW5zX2FnYWluX2FnYWluKQ0KYGBgDQoNCjQuIFRoZSBzYW1wbGluZyBkaXN0cmlidXRpb24gd2l0aCBuPTE1MCBoYXMgc2QgPSA2Mjc0Ljc0Nywgd2hlcmVhcyB0aGUgc2FtcGxpbmcNCiAgICBkaXN0cmlidXRpb24gd2l0aCBuPTUwIGhhcyBzZCA9IDExMDY5Ljc0LCBhbmQgdGhlcmVmb3JlIHRoZSBzYW1wbGluZw0KICAgIGRpc3RyaWJ1dGlvbiB3aXRoIHRoZSBsYXJnZXIgc2FtcGxlIHNpemUgaGFzIHRoZSBzbWFsbGVyIHNwcmVhZC4gSWYgd2Ugd2FudA0KICAgIHRvIG1ha2UgZXN0aW1hdGVzIHRoYXQgYXJlIG1vcmUgb2Z0ZW4gY2xvc2UgdG8gdGhlIHRydWUgdmFsdWUsIHdlIHByZWZlcg0KICAgIGEgc2FtcGxpbmcgZGlzdHJpYnV0aW9uIHdpdGggYSBzbWFsbGVyIHNwcmVhZCwgYmVjYXVzZSB0aGF0IG1lYW5zIHRoYXQgdGhlDQogICAgbGlrZWxpaG9vZCB0aGF0IHdlIHdpbGwgYmUgZmFydGhlciBhd2F5IGZyb20gdGhlIHRydWUgcG9wdWxhdGlvbiBtZWFuIGlzIGxlc3Mu