library("tidyverse")
library("DT")
library("ggplot2")
library("scales")
library("rvest")
library("netstat")
library("stringr")
library("epitools")
library("caret")
library("DescTools")

1 Giới thiệu bộ dữ liệu

Dataset: HousePrices - Package AER. Bộ dữ liệu “HousePrices” được lấy từ gói AER. Trong bộ dữ trên liên quan đến giá bán của 546 căn nhà ở thành phố Windsor, Canada trong tháng 7,8,9 của năm 1987.

Dữ liệu trên bao gồm 12 biến: 6 biến định lượng và 6 biến định tính.

  • Price: Giá bán của ngôi nhà (nghìn đô)
  • Lotsize: Diện tích của ngôi nhà là bao nhiêu mét vuông
  • Bedrooms: Số phòng ngủ của ngôi nhà
  • Bathrooms: Số phòng tắm của ngôi nhà
  • Stories: Nhà có bao nhiêu tầng(không tính tầng hầm)
  • Garage: Số gara trong nhà
  • Driveway: Nhà có chỗ đậu xe riêng hay không?
  • Recreation: Trong nhà có phòng giải trí không?
  • Fullbase: Tầng hầm của ngôi nhà đã được hoàn thiện hay chưa?
  • Gasheat: Nhà có sử dụng gas để đun nước nóng không?
  • Aircon: Nhà có sử dụng máy điều hòa không?
  • Prefer: Ngôi nhà có nằm trong trung tâm của thành phố hay không?
nmk <- read.csv("C:/Users/VIP/Downloads/HousePrices.csv")
str(nmk)
## 'data.frame':    546 obs. of  13 variables:
##  $ rownames  : int  1 2 3 4 5 6 7 8 9 10 ...
##  $ price     : int  42000 38500 49500 60500 61000 66000 66000 69000 83800 88500 ...
##  $ lotsize   : int  5850 4000 3060 6650 6360 4160 3880 4160 4800 5500 ...
##  $ bedrooms  : int  3 2 3 3 2 3 3 3 3 3 ...
##  $ bathrooms : int  1 1 1 1 1 1 2 1 1 2 ...
##  $ stories   : int  2 1 1 2 1 1 2 3 1 4 ...
##  $ driveway  : chr  "yes" "yes" "yes" "yes" ...
##  $ recreation: chr  "no" "no" "no" "yes" ...
##  $ fullbase  : chr  "yes" "no" "no" "no" ...
##  $ gasheat   : chr  "no" "no" "no" "no" ...
##  $ aircon    : chr  "no" "no" "no" "no" ...
##  $ garage    : int  1 0 0 0 0 0 2 0 0 1 ...
##  $ prefer    : chr  "no" "no" "no" "no" ...

2 Lập bảng tần số

2.1 Bảng tần số

datatable(nmk)

2.2 Thống kê mô tả giữa biến Fullbase và biến Driveway

  • Giải thích: Lập bảng tần số giữa hai biến trên cho chúng ta biết mối liên hệ giữa 2 biến trên là như thế nào?
mk <- table(nmk$fullbase, nmk$driveway)
addmargins(mk)
##      
##        no yes Sum
##   no   54 301 355
##   yes  23 168 191
##   Sum  77 469 546

Nhận xét:

  • Có 54 người trong cuộc khảo sát nhà không có khu vực đậu xe riêng và không có tầng hầm được trang bị hoàn thiện.

  • Có 301 người trong cuộc khảo sát nhà có khu vực đậu xe riêng nhưng không có tầng hầm được trang bị hoàn thiện.

  • Có 34 người trong cuộc khảo sát nhà không có khu vực đậu xe riêng nhưng có tầng hầm được trang bị hoàn thiện.

  • Có 168 người trong cuộc khảo sát nhà có khu vực đậu xe riêng và có tầng hầm được trang bị hoàn thiện.

2.3 Thống kê mô tả giữa biến fullbase và biến prefer

mk1 <- table(nmk$fullbase, nmk$prefer)
addmargins(mk1)
##      
##        no yes Sum
##   no  297  58 355
##   yes 121  70 191
##   Sum 418 128 546

Nhận xét:

  • Có 297 người có nhà không nằm trong khu vực trung tâm thành phố và không có tầng hầm được trang bị hoàn thiện.

  • Có 121 người có nhà không nằm trong khu vực trung tâm thành phố nhưng có tầng hầm được trang bị hoàn thiện.

  • Có 58 người có nhà nằm trong khu vực trung tâm thành phố nhưng không có tầng hầm được trang bị hoàn thiện.

  • Có 70 người có nhà nằm trong khu vực trung tâm thành phố và có tầng hầm được trang bị hoàn thiện.

3 Vẽ đồ thị

3.1 Đồ thị giữa biến Fullbase và biến Driveway

nmk |> count(fullbase, driveway) |>
  group_by(fullbase) |>
  mutate(pH = n/sum(n)) |>
  ggplot(aes(x = fullbase, y = n, fill = driveway)) +
  geom_col() +
  geom_text(aes(label = percent(pH, accuracy = .01)), position = position_stack(vjust = 0.5), size = 4) +
  ylab('driveway') +
  xlab('fullbase')

Nhận xét:

  • Trong số những ngôi nhà không có tầng hầm được trang bị hoàn thiện thì có 84,79% là nhà có khu vực đậu xe riêng và 15,21% là nhà không có khu vực đậu xe riêng.

-Trong số những ngôi nhà có tầng hầm được trang bị hoàn thiện thì có 87,96% là nhà có khu vực đậu xe riêng và 12,04% là nhà không có khu vực đậu xe riêng.

3.2 Đồ thị giữa biến Fullbase và biến Prerfer

nmk |> count(fullbase, prefer) |>
  group_by(fullbase) |>
  mutate(pH = n/sum(n)) |>
  ggplot(aes(x = fullbase, y = n, fill = prefer)) +
  geom_col() +
  geom_text(aes(label = percent(pH, accuracy = .01)), position = position_stack(vjust = 0.5), size = 4) +
  ylab('prefer') +
  xlab('fullbase')

NHận xét:

  • Trong số những ngôi nhà không có tầng hầm được trang bị hoàn thiện thì có 83,66% không nằm trong khu vực trung tâm thành phố và 16,34% nằm trong khu vực trung tâm thành phố.

  • Trong số những ngôi nhà có tầng hầm được trang bị hoàn thiện thì có 63,35% không nằm trong khu vực trung tâm thành phố và 36,65% nằm trong khu vực trung tâm thành phố.

4 ƯỚc lượng tỷ lệ

4.1 Ước lượng tỷ lệ biến Fullbase

mkk <- nmk[nmk$fullbase == 'yes',]
prop.test( length(mkk$fullbase), length(nmk$fullbase))
## 
##  1-sample proportions test with continuity correction
## 
## data:  length(mkk$fullbase) out of length(nmk$fullbase), null probability 0.5
## X-squared = 48.661, df = 1, p-value = 3.042e-12
## alternative hypothesis: true p is not equal to 0.5
## 95 percent confidence interval:
##  0.3101042 0.3916759
## sample estimates:
##         p 
## 0.3498168

Nhận xét: Với độ tin cậy 95% ta có tỷ lệ người bán nhà có tầng hầm được trang bị hoàn thiện trong cuộc khảo sát nằm trong khoảng từ 31,01% đến 39,2%.

4.2 Ước lượng tỷ lệ biến Prerfer

mkkk <- nmk[nmk$prefer =='yes',]
prop.test( length(mkkk$prefer), length(nmk$prefer))
## 
##  1-sample proportions test with continuity correction
## 
## data:  length(mkkk$prefer) out of length(nmk$prefer), null probability 0.5
## X-squared = 152.97, df = 1, p-value < 2.2e-16
## alternative hypothesis: true p is not equal to 0.5
## 95 percent confidence interval:
##  0.1999671 0.2727033
## sample estimates:
##         p 
## 0.2344322

Nhận xét: Với độ tin cậy 95% ta có tỷ lệ những ngôi nhà đó nằm trong khu vực trung tâm thành phố trong cuộc khảo sát nằm trong khoảng từ 20% đến 27,27%.

5 Ước lượng Relative risk và Odd risk

5.1 Fullbase và Driveway

RelRisk(mk)
## [1] 1.263197
riskratio(mk)
## $data
##        
##         no yes Total
##   no    54 301   355
##   yes   23 168   191
##   Total 77 469   546
## 
## $measure
##      risk ratio with 95% C.I.
##       estimate     lower    upper
##   no   1.00000        NA       NA
##   yes  1.03738 0.9686805 1.110951
## 
## $p.value
##      two-sided
##       midp.exact fisher.exact chi.square
##   no          NA           NA         NA
##   yes  0.3141123     0.367124  0.3102127
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "Unconditional MLE & normal approximation (Wald) CI"

Nhận xét:

  • Tỷ lệ người có nhà không có khu vực đậu xe riêng và không có tầng hầm được trang bị hoàn thiện nhiều hơn 26% so với tỷ lệ người có nhà không có khu vực đậu xe riêng nhưng có tầng hầm được trang bị hoàn thiện.

  • Tỷ lệ người có nhà có khu vực đậu xe riêng và có tầng hầm được trang bị hoàn thiện nhiều hơn 3,7% so với tỷ lệ người có nhà có khu vực đậu xe riêng nhưng không có tầng hầm được trang bị hoàn thiện.

oddsratio(mk)
## $data
##        
##         no yes Total
##   no    54 301   355
##   yes   23 168   191
##   Total 77 469   546
## 
## $measure
##      odds ratio with 95% C.I.
##       estimate     lower   upper
##   no  1.000000        NA      NA
##   yes 1.305199 0.7811282 2.24292
## 
## $p.value
##      two-sided
##       midp.exact fisher.exact chi.square
##   no          NA           NA         NA
##   yes  0.3141123     0.367124  0.3102127
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "median-unbiased estimate & mid-p exact CI"

NHận xét: Tỷ lệ những người có nhà có khu vực đậu xe riêng trên những người có nhà không có khu vực đậu xe riêng trong số những người có nhà không có tầng hầm được trang bị hoàn thiện nhiều hơn 30,5% so với tỷ lệ những người có nhà có khu vực đậu xe riêng trên những người có nhà không có khu vực đậu xe riêng trong số những người có nhà có tầng hầm được trang bị hoàn thiện.

5.2 Fullbase và Prefer

RelRisk(mk1)
## [1] 1.320615
riskratio(mk1)
## $data
##        
##          no yes Total
##   no    297  58   355
##   yes   121  70   191
##   Total 418 128   546
## 
## $measure
##      risk ratio with 95% C.I.
##       estimate    lower    upper
##   no  1.000000       NA       NA
##   yes 2.243185 1.661303 3.028874
## 
## $p.value
##      two-sided
##         midp.exact fisher.exact   chi.square
##   no            NA           NA           NA
##   yes 1.724756e-07 1.669965e-07 9.151904e-08
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "Unconditional MLE & normal approximation (Wald) CI"

Nhận xét:

  • Tỷ lệ những người nhà không có tầng hầm được trang bị hoàn thiện không nằm trong khu vực trung thành phố nhiều hơn 32% so với tỷ lệ những người nhà có tầng hầm được trang bị hoàn thiện không nằm trong khu vực trung thành phố.

  • Tỷ lệ những người có nhà nằm trong khu vực trung tâm thành phố có tầng hầm được trang bị hoàn thiện bằng 2,24 lần tỷ lệ những người có nhà nằm trong khu vực trung tâm thành phố không có tầng được trang bị hoàn thiện.

oddsratio(mk1)
## $data
##        
##          no yes Total
##   no    297  58   355
##   yes   121  70   191
##   Total 418 128   546
## 
## $measure
##      odds ratio with 95% C.I.
##       estimate    lower    upper
##   no   1.00000       NA       NA
##   yes  2.95422 1.967706 4.455468
## 
## $p.value
##      two-sided
##         midp.exact fisher.exact   chi.square
##   no            NA           NA           NA
##   yes 1.724756e-07 1.669965e-07 9.151904e-08
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "median-unbiased estimate & mid-p exact CI"

Nhận xét: Tỷ lệ những người có nhà nằm trong khu vực trung tâm thành phố trên những người không có nhà trong khu vực trung tâm thành phố của những ngôi nhà không có tầng hầm được trang bị hoàn thiện bằng 2,95 lần tỷ lệ những người có nhà nằm trong khu vực trung tâm thành phố trên những người có nhà không nằm trong khu vực trung tâm thành phố của những ngôi nhà có tầng hầm được trang bị hoàn thiện

LS0tDQp0aXRsZTogIkLDoGkgdOG6rXAgduG7gSBuaMOgIg0KYXV0aG9yOiAiTmd1eeG7hW4gTWluaCBLaGFuZyINCmRhdGU6ICIyMDI0LTA2LTAxIg0Kb3V0cHV0OiANCiAgaHRtbF9kb2N1bWVudDoNCiAgICBjb2RlX2ZvbGRpbmc6IGhpZGUNCiAgICBjb2RlX2Rvd25sb2FkOiB0cnVlDQogICAgbnVtYmVyX3NlY3Rpb25zOiB5ZXMNCiAgICB0b2NfZGVwdGg6IDUNCiAgICB0b2M6IHllcw0KICAgIHRvY19mbG9hdDoNCiAgICAgIGNvbGxhcHNlZDogeWVzDQogICAgICBzbW9vdGhfc2Nyb2xsOiB5ZXMNCiAgICANCg0KICB3b3JkX2RvY3VtZW50Og0KICAgIHRvYzogeWVzDQogICAgICANCi0tLQ0KDQpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRX0NCmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gVFJVRSkNCmBgYA0KDQo8c3R5bGU+DQogIGJvZHkgew0KICAgIGZvbnQtc2l6ZTogMjJweDt9DQo8L3N0eWxlPg0KDQpgYGB7cixtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KbGlicmFyeSgidGlkeXZlcnNlIikNCmxpYnJhcnkoIkRUIikNCmxpYnJhcnkoImdncGxvdDIiKQ0KbGlicmFyeSgic2NhbGVzIikNCmxpYnJhcnkoInJ2ZXN0IikNCmxpYnJhcnkoIm5ldHN0YXQiKQ0KbGlicmFyeSgic3RyaW5nciIpDQpsaWJyYXJ5KCJlcGl0b29scyIpDQpsaWJyYXJ5KCJjYXJldCIpDQpsaWJyYXJ5KCJEZXNjVG9vbHMiKQ0KYGBgDQoNCiMgR2nhu5tpIHRoaeG7h3UgYuG7mSBk4buvIGxp4buHdQ0KDQoqKkRhdGFzZXQ6IEhvdXNlUHJpY2VzIC0gUGFja2FnZSBBRVIuKiogQuG7mSBk4buvIGxp4buHdSAiSG91c2VQcmljZXMiIMSRxrDhu6NjIGzhuqV5IHThu6sgZ8OzaSBBRVIuDQpUcm9uZyBi4buZIGThu68gdHLDqm4gbGnDqm4gcXVhbiDEkeG6v24gZ2nDoSBiw6FuIGPhu6dhIDU0NiBjxINuIG5ow6Ag4bufIHRow6BuaCBwaOG7kSBXaW5kc29yLCBDYW5hZGEgdHJvbmcgdGjDoW5nIDcsOCw5IGPhu6dhIG7Eg20gMTk4Ny4NCg0KROG7ryBsaeG7h3UgdHLDqm4gYmFvIGfhu5NtIDEyIGJp4bq/bjogNiBiaeG6v24gxJHhu4tuaCBsxrDhu6NuZyB2w6AgNiBiaeG6v24gxJHhu4tuaCB0w61uaC4NCg0KLSAgIFByaWNlOiBHacOhIGLDoW4gY+G7p2EgbmfDtGkgbmjDoCAobmdow6xuIMSRw7QpDQotICAgTG90c2l6ZTogRGnhu4duIHTDrWNoIGPhu6dhIG5nw7RpIG5ow6AgbMOgIGJhbyBuaGnDqnUgbcOpdCB2dcO0bmcNCi0gICBCZWRyb29tczogU+G7kSBwaMOybmcgbmfhu6cgY+G7p2EgbmfDtGkgbmjDoA0KLSAgIEJhdGhyb29tczogU+G7kSBwaMOybmcgdOG6r20gY+G7p2EgbmfDtGkgbmjDoA0KLSAgIFN0b3JpZXM6IE5ow6AgY8OzIGJhbyBuaGnDqnUgdOG6p25nKGtow7RuZyB0w61uaCB04bqnbmcgaOG6p20pDQotICAgR2FyYWdlOiBT4buRIGdhcmEgdHJvbmcgbmjDoA0KLSAgIERyaXZld2F5OiBOaMOgIGPDsyBjaOG7lyDEkeG6rXUgeGUgcmnDqm5nIGhheSBraMO0bmc/DQotICAgUmVjcmVhdGlvbjogVHJvbmcgbmjDoCBjw7MgcGjDsm5nIGdp4bqjaSB0csOtIGtow7RuZz8NCi0gICBGdWxsYmFzZTogVOG6p25nIGjhuqdtIGPhu6dhIG5nw7RpIG5ow6AgxJHDoyDEkcaw4bujYyBob8OgbiB0aGnhu4duIGhheSBjaMawYT8NCi0gICBHYXNoZWF0OiBOaMOgIGPDsyBz4butIGThu6VuZyBnYXMgxJHhu4MgxJF1biBuxrDhu5tjIG7Ds25nIGtow7RuZz8NCi0gICBBaXJjb246IE5ow6AgY8OzIHPhu60gZOG7pW5nIG3DoXkgxJFp4buBdSBow7JhIGtow7RuZz8NCi0gICBQcmVmZXI6IE5nw7RpIG5ow6AgY8OzIG7hurFtIHRyb25nIHRydW5nIHTDom0gY+G7p2EgdGjDoG5oIHBo4buRIGhheSBraMO0bmc/DQoNCiANCmBgYHtyfQ0Kbm1rIDwtIHJlYWQuY3N2KCJDOi9Vc2Vycy9WSVAvRG93bmxvYWRzL0hvdXNlUHJpY2VzLmNzdiIpDQpzdHIobm1rKQ0KYGBgDQoNCiMgTOG6rXAgYuG6o25nIHThuqduIHPhu5ENCg0KIyMgIELhuqNuZyB04bqnbiBz4buRIA0KDQoNCmBgYHtyfQ0KZGF0YXRhYmxlKG5taykNCmBgYA0KDQojIyBUaOG7kW5nIGvDqiBtw7QgdOG6oyBnaeG7r2EgYmnhur9uIEZ1bGxiYXNlIHbDoCBiaeG6v24gRHJpdmV3YXkNCg0KLSBHaeG6o2kgdGjDrWNoOiBM4bqtcCBi4bqjbmcgdOG6p24gc+G7kSBnaeG7r2EgaGFpIGJp4bq/biB0csOqbiBjaG8gY2jDum5nIHRhIGJp4bq/dCBt4buRaSBsacOqbiBo4buHIGdp4buvYSAyIGJp4bq/biB0csOqbiBsw6AgbmjGsCB0aOG6vyBuw6BvPw0KDQpgYGB7cn0NCm1rIDwtIHRhYmxlKG5tayRmdWxsYmFzZSwgbm1rJGRyaXZld2F5KQ0KYWRkbWFyZ2lucyhtaykNCmBgYA0KDQpOaOG6rW4geMOpdDogDQoNCi0gQ8OzIDU0IG5nxrDhu51pIHRyb25nIGN14buZYyBraOG6o28gc8OhdCBuaMOgIGtow7RuZyBjw7Mga2h1IHbhu7FjIMSR4bqtdSB4ZSByacOqbmcgdsOgIGtow7RuZyBjw7MgdOG6p25nIGjhuqdtIMSRxrDhu6NjIHRyYW5nIGLhu4sgaG/DoG4gdGhp4buHbi4NCg0KLSBDw7MgMzAxIG5nxrDhu51pIHRyb25nIGN14buZYyBraOG6o28gc8OhdCBuaMOgIGPDsyBraHUgduG7sWMgxJHhuq11IHhlIHJpw6puZyBuaMawbmcga2jDtG5nIGPDsyB04bqnbmcgaOG6p20gxJHGsOG7o2MgdHJhbmcgYuG7iyBob8OgbiB0aGnhu4duLg0KDQotIEPDsyAzNCBuZ8aw4budaSB0cm9uZyBjdeG7mWMga2jhuqNvIHPDoXQgbmjDoCBraMO0bmcgY8OzIGtodSB24buxYyDEkeG6rXUgeGUgcmnDqm5nIG5oxrBuZyBjw7MgdOG6p25nIGjhuqdtIMSRxrDhu6NjIHRyYW5nIGLhu4sgaG/DoG4gdGhp4buHbi4NCg0KLSBDw7MgMTY4IG5nxrDhu51pIHRyb25nIGN14buZYyBraOG6o28gc8OhdCBuaMOgIGPDsyBraHUgduG7sWMgxJHhuq11IHhlIHJpw6puZyB2w6AgY8OzIHThuqduZyBo4bqnbSDEkcaw4bujYyB0cmFuZyBi4buLIGhvw6BuIHRoaeG7h24uDQoNCiMjIFRo4buRbmcga8OqIG3DtCB04bqjIGdp4buvYSBiaeG6v24gZnVsbGJhc2UgdsOgIGJp4bq/biBwcmVmZXINCg0KYGBge3J9DQptazEgPC0gdGFibGUobm1rJGZ1bGxiYXNlLCBubWskcHJlZmVyKQ0KYWRkbWFyZ2lucyhtazEpDQpgYGANCg0KTmjhuq1uIHjDqXQ6IA0KDQotIEPDsyAyOTcgbmfGsOG7nWkgY8OzIG5ow6Aga2jDtG5nIG7hurFtIHRyb25nIGtodSB24buxYyB0cnVuZyB0w6JtIHRow6BuaCBwaOG7kSB2w6Aga2jDtG5nIGPDsyB04bqnbmcgaOG6p20gxJHGsOG7o2MgdHJhbmcgYuG7iyBob8OgbiB0aGnhu4duLg0KDQotIEPDsyAxMjEgbmfGsOG7nWkgY8OzIG5ow6Aga2jDtG5nIG7hurFtIHRyb25nIGtodSB24buxYyB0cnVuZyB0w6JtIHRow6BuaCBwaOG7kSBuaMawbmcgY8OzIHThuqduZyBo4bqnbSDEkcaw4bujYyB0cmFuZyBi4buLIGhvw6BuIHRoaeG7h24uDQoNCi0gQ8OzIDU4IG5nxrDhu51pIGPDsyBuaMOgIG7hurFtIHRyb25nIGtodSB24buxYyB0cnVuZyB0w6JtIHRow6BuaCBwaOG7kSBuaMawbmcga2jDtG5nIGPDsyB04bqnbmcgaOG6p20gxJHGsOG7o2MgdHJhbmcgYuG7iyBob8OgbiB0aGnhu4duLg0KDQotIEPDsyA3MCBuZ8aw4budaSBjw7MgbmjDoCBu4bqxbSB0cm9uZyBraHUgduG7sWMgdHJ1bmcgdMOibSB0aMOgbmggcGjhu5EgdsOgIGPDsyB04bqnbmcgaOG6p20gxJHGsOG7o2MgdHJhbmcgYuG7iyBob8OgbiB0aGnhu4duLg0KDQojIFbhur0gxJHhu5MgdGjhu4sgDQoNCiMjIMSQ4buTIHRo4buLIGdp4buvYSBiaeG6v24gKkZ1bGxiYXNlKiB2w6AgYmnhur9uICpEcml2ZXdheSoNCg0KYGBge3J9DQpubWsgfD4gY291bnQoZnVsbGJhc2UsIGRyaXZld2F5KSB8Pg0KICBncm91cF9ieShmdWxsYmFzZSkgfD4NCiAgbXV0YXRlKHBIID0gbi9zdW0obikpIHw+DQogIGdncGxvdChhZXMoeCA9IGZ1bGxiYXNlLCB5ID0gbiwgZmlsbCA9IGRyaXZld2F5KSkgKw0KICBnZW9tX2NvbCgpICsNCiAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IHBlcmNlbnQocEgsIGFjY3VyYWN5ID0gLjAxKSksIHBvc2l0aW9uID0gcG9zaXRpb25fc3RhY2sodmp1c3QgPSAwLjUpLCBzaXplID0gNCkgKw0KICB5bGFiKCdkcml2ZXdheScpICsNCiAgeGxhYignZnVsbGJhc2UnKQ0KYGBgDQpOaOG6rW4geMOpdDogDQoNCi0gVHJvbmcgc+G7kSBuaOG7r25nIG5nw7RpIG5ow6Aga2jDtG5nIGPDsyB04bqnbmcgaOG6p20gxJHGsOG7o2MgdHJhbmcgYuG7iyBob8OgbiB0aGnhu4duIHRow6wgY8OzIDg0LDc5JSBsw6AgbmjDoCBjw7Mga2h1IHbhu7FjIMSR4bqtdSB4ZSByacOqbmcgdsOgIDE1LDIxJSBsw6AgbmjDoCBraMO0bmcgY8OzIGtodSB24buxYyDEkeG6rXUgeGUgcmnDqm5nLg0KDQotVHJvbmcgc+G7kSBuaOG7r25nIG5nw7RpIG5ow6AgY8OzIHThuqduZyBo4bqnbSDEkcaw4bujYyB0cmFuZyBi4buLIGhvw6BuIHRoaeG7h24gdGjDrCBjw7MgODcsOTYlIGzDoCBuaMOgIGPDsyBraHUgduG7sWMgxJHhuq11IHhlIHJpw6puZyB2w6AgMTIsMDQlIGzDoCBuaMOgIGtow7RuZyBjw7Mga2h1IHbhu7FjIMSR4bqtdSB4ZSByacOqbmcuDQoNCiMjIMSQ4buTIHRo4buLIGdp4buvYSBiaeG6v24gKkZ1bGxiYXNlKiB2w6AgYmnhur9uICpQcmVyZmVyKg0KDQpgYGB7cn0NCm5tayB8PiBjb3VudChmdWxsYmFzZSwgcHJlZmVyKSB8Pg0KICBncm91cF9ieShmdWxsYmFzZSkgfD4NCiAgbXV0YXRlKHBIID0gbi9zdW0obikpIHw+DQogIGdncGxvdChhZXMoeCA9IGZ1bGxiYXNlLCB5ID0gbiwgZmlsbCA9IHByZWZlcikpICsNCiAgZ2VvbV9jb2woKSArDQogIGdlb21fdGV4dChhZXMobGFiZWwgPSBwZXJjZW50KHBILCBhY2N1cmFjeSA9IC4wMSkpLCBwb3NpdGlvbiA9IHBvc2l0aW9uX3N0YWNrKHZqdXN0ID0gMC41KSwgc2l6ZSA9IDQpICsNCiAgeWxhYigncHJlZmVyJykgKw0KICB4bGFiKCdmdWxsYmFzZScpDQpgYGANCk5I4bqtbiB4w6l0OiANCg0KLSBUcm9uZyBz4buRIG5o4buvbmcgbmfDtGkgbmjDoCBraMO0bmcgY8OzIHThuqduZyBo4bqnbSDEkcaw4bujYyB0cmFuZyBi4buLIGhvw6BuIHRoaeG7h24gdGjDrCBjw7MgODMsNjYlIGtow7RuZyBu4bqxbSB0cm9uZyBraHUgduG7sWMgdHJ1bmcgdMOibSB0aMOgbmggcGjhu5EgdsOgIDE2LDM0JSBu4bqxbSB0cm9uZyBraHUgduG7sWMgdHJ1bmcgdMOibSB0aMOgbmggcGjhu5EuDQoNCi0gVHJvbmcgc+G7kSBuaOG7r25nIG5nw7RpIG5ow6AgY8OzIHThuqduZyBo4bqnbSDEkcaw4bujYyB0cmFuZyBi4buLIGhvw6BuIHRoaeG7h24gdGjDrCBjw7MgNjMsMzUlIGtow7RuZyBu4bqxbSB0cm9uZyBraHUgduG7sWMgdHJ1bmcgdMOibSB0aMOgbmggcGjhu5EgdsOgIDM2LDY1JSBu4bqxbSB0cm9uZyBraHUgduG7sWMgdHJ1bmcgdMOibSB0aMOgbmggcGjhu5EuDQoNCg0KIyDGr+G7mmMgbMaw4bujbmcgdOG7tyBs4buHIA0KDQojIyDGr+G7m2MgbMaw4bujbmcgdOG7tyBs4buHIGJp4bq/biAqRnVsbGJhc2UqDQoNCmBgYHtyfQ0KbWtrIDwtIG5ta1tubWskZnVsbGJhc2UgPT0gJ3llcycsXQ0KcHJvcC50ZXN0KCBsZW5ndGgobWtrJGZ1bGxiYXNlKSwgbGVuZ3RoKG5tayRmdWxsYmFzZSkpDQpgYGANCg0KTmjhuq1uIHjDqXQ6IFbhu5tpIMSR4buZIHRpbiBj4bqteSA5NSUgdGEgY8OzIHThu7cgbOG7hyBuZ8aw4budaSBiw6FuIG5ow6AgY8OzIHThuqduZyBo4bqnbSDEkcaw4bujYyB0cmFuZyBi4buLIGhvw6BuIHRoaeG7h24gdHJvbmcgY3Xhu5ljIGto4bqjbyBzw6F0IG7hurFtIHRyb25nIGtob+G6o25nIHThu6sgMzEsMDElIMSR4bq/biAzOSwyJS4NCg0KIyMgxq/hu5tjIGzGsOG7o25nIHThu7cgbOG7hyBiaeG6v24gKlByZXJmZXIqDQoNCmBgYHtyfQ0KbWtrayA8LSBubWtbbm1rJHByZWZlciA9PSd5ZXMnLF0NCnByb3AudGVzdCggbGVuZ3RoKG1ra2skcHJlZmVyKSwgbGVuZ3RoKG5tayRwcmVmZXIpKQ0KYGBgDQoNCk5o4bqtbiB4w6l0OiBW4bubaSDEkeG7mSB0aW4gY+G6rXkgOTUlIHRhIGPDsyB04bu3IGzhu4cgbmjhu69uZyBuZ8O0aSBuaMOgIMSRw7MgbuG6sW0gdHJvbmcga2h1IHbhu7FjIHRydW5nIHTDom0gdGjDoG5oIHBo4buRIHRyb25nIGN14buZYyBraOG6o28gc8OhdCBu4bqxbSB0cm9uZyBraG/huqNuZyB04burIDIwJSDEkeG6v24gMjcsMjclLg0KDQoNCiMgxq/hu5tjIGzGsOG7o25nIFJlbGF0aXZlIHJpc2sgdsOgIE9kZCByaXNrDQoNCiMjIEZ1bGxiYXNlIHbDoCBEcml2ZXdheQ0KDQpgYGB7cn0NClJlbFJpc2sobWspDQpgYGANCmBgYHtyfQ0Kcmlza3JhdGlvKG1rKQ0KYGBgDQpOaOG6rW4geMOpdDogDQoNCi0gVOG7tyBs4buHIG5nxrDhu51pIGPDsyBuaMOgIGtow7RuZyBjw7Mga2h1IHbhu7FjIMSR4bqtdSB4ZSByacOqbmcgdsOgIGtow7RuZyBjw7MgdOG6p25nIGjhuqdtIMSRxrDhu6NjIHRyYW5nIGLhu4sgaG/DoG4gdGhp4buHbiBuaGnhu4F1IGjGoW4gMjYlIHNvIHbhu5tpIHThu7cgbOG7hyBuZ8aw4budaSBjw7MgbmjDoCBraMO0bmcgY8OzIGtodSB24buxYyDEkeG6rXUgeGUgcmnDqm5nIG5oxrBuZyBjw7MgdOG6p25nIGjhuqdtIMSRxrDhu6NjIHRyYW5nIGLhu4sgaG/DoG4gdGhp4buHbi4NCg0KLSBU4bu3IGzhu4cgbmfGsOG7nWkgY8OzIG5ow6AgY8OzIGtodSB24buxYyDEkeG6rXUgeGUgcmnDqm5nIHbDoCBjw7MgdOG6p25nIGjhuqdtIMSRxrDhu6NjIHRyYW5nIGLhu4sgaG/DoG4gdGhp4buHbiBuaGnhu4F1IGjGoW4gMyw3JSBzbyB24bubaSB04bu3IGzhu4cgbmfGsOG7nWkgY8OzIG5ow6AgY8OzIGtodSB24buxYyDEkeG6rXUgeGUgcmnDqm5nIG5oxrBuZyBraMO0bmcgY8OzIHThuqduZyBo4bqnbSDEkcaw4bujYyB0cmFuZyBi4buLIGhvw6BuIHRoaeG7h24uDQoNCmBgYHtyfQ0Kb2Rkc3JhdGlvKG1rKQ0KYGBgDQpOSOG6rW4geMOpdDogVOG7tyBs4buHIG5o4buvbmcgbmfGsOG7nWkgY8OzIG5ow6AgY8OzIGtodSB24buxYyDEkeG6rXUgeGUgcmnDqm5nIHRyw6puIG5o4buvbmcgbmfGsOG7nWkgY8OzIG5ow6Aga2jDtG5nIGPDsyBraHUgduG7sWMgxJHhuq11IHhlIHJpw6puZyB0cm9uZyBz4buRIG5o4buvbmcgbmfGsOG7nWkgY8OzIG5ow6Aga2jDtG5nIGPDsyB04bqnbmcgaOG6p20gxJHGsOG7o2MgdHJhbmcgYuG7iyBob8OgbiB0aGnhu4duIG5oaeG7gXUgaMahbiAzMCw1JSBzbyB24bubaSB04bu3IGzhu4cgbmjhu69uZyBuZ8aw4budaSBjw7MgbmjDoCBjw7Mga2h1IHbhu7FjIMSR4bqtdSB4ZSByacOqbmcgdHLDqm4gbmjhu69uZyBuZ8aw4budaSBjw7MgbmjDoCBraMO0bmcgY8OzIGtodSB24buxYyDEkeG6rXUgeGUgcmnDqm5nIHRyb25nIHPhu5Egbmjhu69uZyBuZ8aw4budaSBjw7MgbmjDoCBjw7MgdOG6p25nIGjhuqdtIMSRxrDhu6NjIHRyYW5nIGLhu4sgaG/DoG4gdGhp4buHbi4NCg0KIyMgRnVsbGJhc2UgdsOgIFByZWZlcg0KDQpgYGB7cn0NClJlbFJpc2sobWsxKQ0KYGBgDQpgYGB7cn0NCnJpc2tyYXRpbyhtazEpDQpgYGANCk5o4bqtbiB4w6l0OiANCg0KLSBU4bu3IGzhu4cgbmjhu69uZyBuZ8aw4budaSBuaMOgIGtow7RuZyBjw7MgdOG6p25nIGjhuqdtIMSRxrDhu6NjIHRyYW5nIGLhu4sgaG/DoG4gdGhp4buHbiBraMO0bmcgbuG6sW0gdHJvbmcga2h1IHbhu7FjIHRydW5nIHRow6BuaCBwaOG7kSBuaGnhu4F1IGjGoW4gMzIlIHNvIHbhu5tpIHThu7cgbOG7hyBuaOG7r25nIG5nxrDhu51pIG5ow6AgY8OzIHThuqduZyBo4bqnbSDEkcaw4bujYyB0cmFuZyBi4buLIGhvw6BuIHRoaeG7h24ga2jDtG5nIG7hurFtIHRyb25nIGtodSB24buxYyB0cnVuZyB0aMOgbmggcGjhu5EuDQoNCi0gVOG7tyBs4buHIG5o4buvbmcgbmfGsOG7nWkgY8OzIG5ow6AgbuG6sW0gdHJvbmcga2h1IHbhu7FjIHRydW5nIHTDom0gdGjDoG5oIHBo4buRIGPDsyB04bqnbmcgaOG6p20gxJHGsOG7o2MgdHJhbmcgYuG7iyBob8OgbiB0aGnhu4duIGLhurFuZyAyLDI0IGzhuqduIHThu7cgbOG7hyBuaOG7r25nIG5nxrDhu51pIGPDsyBuaMOgIG7hurFtIHRyb25nIGtodSB24buxYyB0cnVuZyB0w6JtIHRow6BuaCBwaOG7kSBraMO0bmcgY8OzIHThuqduZyDEkcaw4bujYyB0cmFuZyBi4buLIGhvw6BuIHRoaeG7h24uDQoNCmBgYHtyfQ0Kb2Rkc3JhdGlvKG1rMSkNCg0KYGBgDQpOaOG6rW4geMOpdDogVOG7tyBs4buHIG5o4buvbmcgbmfGsOG7nWkgY8OzIG5ow6AgbuG6sW0gdHJvbmcga2h1IHbhu7FjIHRydW5nIHTDom0gdGjDoG5oIHBo4buRIHRyw6puIG5o4buvbmcgbmfGsOG7nWkga2jDtG5nIGPDsyBuaMOgIHRyb25nIGtodSB24buxYyB0cnVuZyB0w6JtIHRow6BuaCBwaOG7kSBj4bunYSBuaOG7r25nIG5nw7RpIG5ow6Aga2jDtG5nIGPDsyB04bqnbmcgaOG6p20gxJHGsOG7o2MgdHJhbmcgYuG7iyBob8OgbiB0aGnhu4duIGLhurFuZyAyLDk1IGzhuqduIHThu7cgbOG7hyBuaOG7r25nIG5nxrDhu51pIGPDsyBuaMOgIG7hurFtIHRyb25nIGtodSB24buxYyB0cnVuZyB0w6JtIHRow6BuaCBwaOG7kSB0csOqbiBuaOG7r25nIG5nxrDhu51pIGPDsyBuaMOgIGtow7RuZyBu4bqxbSB0cm9uZyBraHUgduG7sWMgdHJ1bmcgdMOibSB0aMOgbmggcGjhu5EgY+G7p2Egbmjhu69uZyBuZ8O0aSBuaMOgIGPDsyB04bqnbmcgaOG6p20gxJHGsOG7o2MgdHJhbmcgYuG7iyBob8OgbiB0aGnhu4duDQoNCg0KDQoNCg0KDQoNCg0KDQo=