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

Tập dữ liệu “SmokeBan” trong gói AER của R là một tập dữ liệu nghiên cứu về tác động của việc áp đặt lệnh cấm hút thuốc tại nơi làm việc đối với việc hút thuốc của những người làm việc. Dưới đây là mô tả và định dạng của tập dữ liệu này:

smoker: cá nhân có phải là người hút thuốc hiện tại hay không.

ban: có áp dụng lệnh cấm hút thuốc tại nơi làm việc hay không.

age: Tuổi của cá nhân

education: cho biết trình độ giáo dục cao nhất đã đạt được: bỏ học trung học (hs), tốt nghiệp trung học, một số đại học, tốt nghiệp đại học, thạc sĩ (hoặc cao hơn).

afam: cho biết liệu cá nhân có phải là người Mỹ gốc Phi-Ameirca hay không.

hispanic: cá nhân có phải là người Mỹ gốc Tây Ban Nha hay không.

gender: giới tính của cá nhân.

library(readxl)
## Warning: package 'readxl' was built under R version 4.2.3
data1 <- read_excel("C:/Users/dell/Downloads/SmokeBan.xlsx")
View(data1)
library(AER)
## Warning: package 'AER' was built under R version 4.2.3
## Loading required package: car
## Warning: package 'car' was built under R version 4.2.3
## Loading required package: carData
## Warning: package 'carData' was built under R version 4.2.3
## Loading required package: lmtest
## Warning: package 'lmtest' was built under R version 4.2.3
## Loading required package: zoo
## Warning: package 'zoo' was built under R version 4.2.3
## 
## Attaching package: 'zoo'
## The following objects are masked from 'package:base':
## 
##     as.Date, as.Date.numeric
## Loading required package: sandwich
## Warning: package 'sandwich' was built under R version 4.2.3
## Loading required package: survival
library(tidyverse)
## Warning: package 'tidyverse' was built under R version 4.2.3
## Warning: package 'ggplot2' was built under R version 4.2.3
## Warning: package 'tibble' was built under R version 4.2.3
## Warning: package 'tidyr' was built under R version 4.2.3
## Warning: package 'readr' was built under R version 4.2.3
## Warning: package 'purrr' was built under R version 4.2.3
## Warning: package 'dplyr' was built under R version 4.2.3
## Warning: package 'stringr' was built under R version 4.2.3
## Warning: package 'forcats' was built under R version 4.2.3
## Warning: package 'lubridate' was built under R version 4.2.3
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ dplyr     1.1.2     ✔ readr     2.1.4
## ✔ forcats   1.0.0     ✔ stringr   1.5.0
## ✔ ggplot2   3.4.2     ✔ tibble    3.2.1
## ✔ lubridate 1.9.2     ✔ tidyr     1.3.0
## ✔ purrr     1.0.1
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag()    masks stats::lag()
## ✖ dplyr::recode() masks car::recode()
## ✖ purrr::some()   masks car::some()
## ℹ Use the ]8;;http://conflicted.r-lib.org/conflicted package]8;; to force all conflicts to become errors
library(DT)
## Warning: package 'DT' was built under R version 4.2.3
library(DescTools)
## Warning: package 'DescTools' was built under R version 4.2.3
## 
## Attaching package: 'DescTools'
## 
## The following object is masked from 'package:car':
## 
##     Recode
library(ggplot2)

Lập bảng tần số

# Thay đổi giá trị của biến 
data1$smoker<- recode(data1$smoker, "yes" = "có hút", "no" = "không hút")
data1$ban <- recode(data1$ban, "yes" = "cấm", "no" = "không cấm")

Bảng tần số biến ban

table(data1$ban)
## 
##       cấm không cấm 
##      6098      3902

Bảng tần suất

table(data1$ban)/sum(table(data1$ban))
## 
##       cấm không cấm 
##    0.6098    0.3902

Bảng tần số số người hút thuốc

table(data1$smoker)
## 
##    có hút không hút 
##      2423      7577

Bảng tần suất

table(data1$smoker)/sum(table(data1$smoker))
## 
##    có hút không hút 
##    0.2423    0.7577

Vẽ đồ thị

library(ggplot2)

Biến ban

data1 |> ggplot(aes(x = ban, y = after_stat(count))) +
geom_bar(fill = 'red') +geom_text(aes(label = scales::percent(after_stat(count/sum(count)))), stat ='count', color = 'blue', vjust = - .5) +labs(x = 'Ban', y = 'Số nơi cấm')

Nhận xét: Trong tổng số 10000 quan sát:

Số nơi làm việc cấm hút thuốc là 61%

Số nơi làm việc cho hút thuốc là 39%

Biến Smoker

data1 |> ggplot(aes(x = smoker, y = after_stat(count))) +
geom_bar(fill = 'blue') +geom_text(aes(label = scales::percent(after_stat(count/sum(count)))), stat ='count', color = 'purple', vjust = - .5) +labs(x = 'Số người hút thuốc', y = 'số người')

Nhận xét:

Số người đang hút thuốc là 24%

Số người không hút thuốc là 76%

Ước lượng tỷ lệ

Ước lượng tỷ lệ cá nhân hút thuốc ở nơi làm việc cấm hút

smoke<- table(data1[data1$smoker == "có hút",]$ban)
smoke
## 
##       cấm không cấm 
##      1293      1130
prop.test(smoke["cấm"], sum(smoke), p = 0.4)
## 
##  1-sample proportions test with continuity correction
## 
## data:  smoke["cấm"] out of sum(smoke), null probability 0.4
## X-squared = 179.74, df = 1, p-value < 2.2e-16
## alternative hypothesis: true p is not equal to 0.4
## 95 percent confidence interval:
##  0.5135283 0.5536361
## sample estimates:
##        p 
## 0.533636

Ta ước lượng tỷ lệ với giả thuyết (HO): Tỷ lệ người hút thuốc ở nơi cấm hút là 40%

Kết quả cho p - value là 2.2e-16. Ta bác bỏ giả thuyết tỷ lệ người hút thuốc ở nơi cấm hút là 40%

Ước lượng tỷ lệ cá nhân không hút thuốc ở nơi làm việc cấm hút thuốc

nosmoke<- table(data1[data1$smoker == "không hút",]$ban)
nosmoke
## 
##       cấm không cấm 
##      4805      2772
prop.test(nosmoke["cấm"], sum(nosmoke), p = 0.6)
## 
##  1-sample proportions test with continuity correction
## 
## data:  nosmoke["cấm"] out of sum(nosmoke), null probability 0.6
## X-squared = 36.689, df = 1, p-value = 1.385e-09
## alternative hypothesis: true p is not equal to 0.6
## 95 percent confidence interval:
##  0.6231788 0.6449964
## sample estimates:
##        p 
## 0.634156

Ta ước lượng tỷ lệ với giả thuyết (HO): Tỷ lệ người không hút thuốc ở nơi cấm hút là 40%

Kết quả cho p - value là 1.385e-09-16. Ta bác bỏ giả thuyết tỷ lệ người không hút thuốc ở nơi làm việ c cấm hút là 60%

Ước lượng chênh lệch tỷ lệ

da_hut <- data1[data1$smoker == 'có hút',]
da_khonghut <- data1[data1$smoker == 'không hút',]

hut_cam <- da_hut[da_hut$ban == 'cấm',]
khonghut_cam <- da_khonghut[da_khonghut$ban == 'cấm',]

a <- c(nrow(da_hut), nrow(da_khonghut))
a
## [1] 2423 7577
b <- c(nrow(hut_cam), nrow(khonghut_cam))
b
## [1] 1293 4805
prop.test(b,a)
## 
##  2-sample test for equality of proportions with continuity correction
## 
## data:  b out of a
## X-squared = 77.54, df = 1, p-value < 2.2e-16
## alternative hypothesis: two.sided
## 95 percent confidence interval:
##  -0.12342380 -0.07761622
## sample estimates:
##   prop 1   prop 2 
## 0.533636 0.634156

Ta kiểm định giả thuyết H0: Không có sự khác biệt đáng kể giữa tỉ lệ người hút thuốc và người không ở hút thuốc ở nơi làm việc cấm hút thuốc

Vì p-value = 2.2e-16 < 0.05. Vì vậy bác bỏ giả thuyết H0. Nghĩa là có sự khác biệt đáng kể giữa tỉ lệ người hút thuốc và người không ở hút thuốc ở nơi làm việc cấm hút thuốc

Với độ tin cậy 95%, khoảng chênh lệch giữa tỉ ̣lệ người hút thuốc và người không ở hút thuốc ở nơi làm việc cấm hút thuộc trong khoảng từ 0.533636 đến 0.63415

Ước lượng Relative Risk và Odd Ratio

library(DescTools)
library(epitools)
## 
## Attaching package: 'epitools'
## The following object is masked from 'package:survival':
## 
##     ratetable
da <- table(data1$smoker, data1$ban)
addmargins(da)
##            
##               cấm không cấm   Sum
##   có hút     1293      1130  2423
##   không hút  4805      2772  7577
##   Sum        6098      3902 10000
RelRisk(da)
## [1] 0.8414901
da <- table(data1$smoker, data1$ban)
riskratio(da)
## $data
##            
##              cấm không cấm Total
##   có hút    1293      1130  2423
##   không hút 4805      2772  7577
##   Total     6098      3902 10000
## 
## $measure
##            risk ratio with 95% C.I.
##              estimate     lower     upper
##   có hút    1.0000000        NA        NA
##   không hút 0.7844602 0.7447901 0.8262433
## 
## $p.value
##            two-sided
##             midp.exact fisher.exact   chi.square
##   có hút            NA           NA           NA
##   không hút          0 1.795861e-18 1.050602e-18
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "Unconditional MLE & normal approximation (Wald) CI"

Nhận xét: Kết quả trên cho ta thấy tỉ lệ rủi ro tương đối (risk ratio) của những người được hút thuốc ở những nơi làm việc cho phép hút là 0.8413901 tức là tỷ lệ những người được hút thuốc ở những nơi làm việc cho phép gấp 0.8414901 lần tỷ lệ những người không được hút thuốc ở những nơi làm việc không cho phép

epitab(da, method = 'oddsratio')
## $tab
##            
##              cấm        p0 không cấm        p1 oddsratio     lower     upper
##   có hút    1293 0.2120367      1130 0.2895951 1.0000000        NA        NA
##   không hút 4805 0.7879633      2772 0.7104049 0.6601155 0.6017953 0.7240874
##            
##                  p.value
##   có hút              NA
##   không hút 1.795861e-18
## 
## $measure
## [1] "wald"
## 
## $conf.level
## [1] 0.95
## 
## $pvalue
## [1] "fisher.exact"

Kết quả tỷ lệ chênh lệch (Oddsratio) là 0.6601155 tức tỉ lệ những người hút thuốc ở nơi làm việc cho phép hút thuốc bé hơn khoảng 33.98% so với tỉ lệ những người không hút thuốc ở nơi không cho phép hút thuốc

LS0tDQp0aXRsZTogIkJUVk4gUFRETMSQVCINCmF1dGhvcjogIlBoYcyjbSBUcsOizIBuIFBodcyBYyDDgm4iDQpkYXRlOiAiMjAyNC0wNi0wMSINCm91dHB1dDoNCiAgaHRtbF9kb2N1bWVudDoNCiAgICB0b2M6IFRSVUUNCiAgICB0b2NfZmxvYXQ6IFRSVUUNCiAgICBkZl9wcmludDogcGFnZWQNCiAgICBjb2RlX2Rvd25sb2FkOiB0cnVlDQogICAgY29kZV9mb2xkaW5nOiBoaWRlDQogIHBkZl9kb2N1bWVudDoNCiAgICBleHRyYV9kZXBlbmRlbmNpZXM6DQogICAgICB2aWV0bmFtOiB1dGY4DQogICAgdG9jOiB5ZXMNCiAgICBudW1iZXJfc2VjdGlvbnM6IHllcw0KICB3b3JkX2RvY3VtZW50Og0KICAgIHRvYzogeWVzDQogICAgbnVtYmVyX3NlY3Rpb25zOiB5ZXMNCmdlb21ldHJ5Og0KICAgICAgLSBpbm5lcj0zY20NCiAgICAgIC0gb3V0ZXI9NGNtDQogICAgICAtIHRvcD0zY20NCiAgICAgIC0gYm90dG9tPTRjbQ0KICAgICAgLSBoZWFkc2VwPTIycHQNCiAgICAgIC0gaGVhZGhlaWdodD0xMXB0DQogICAgICAtIGZvb3Rza2lwPTMzcHQNCiAgICAgIC0gaWdub3JlaGVhZA0KICAgICAgLSBpZ25vcmVmb290DQogICAgICAtIGhlaWdodHJvdW5kZWQNCi0tLQ0KDQojIEdpxqHMgWkgdGhpw6rMo3UgYsO0zKMgZMawzIMgbGnDqsyjdQ0KDQpU4bqtcCBk4buvIGxp4buHdSAiU21va2VCYW4iIHRyb25nIGfDs2kgQUVSIGPhu6dhIFIgbMOgIG3hu5l0IHThuq1wIGThu68gbGnhu4d1IG5naGnDqm4gY+G7qXUgduG7gSB0w6FjIMSR4buZbmcgY+G7p2Egdmnhu4djIMOhcCDEkeG6t3QgbOG7h25oIGPhuqVtIGjDunQgdGh14buRYyB04bqhaSBuxqFpIGzDoG0gdmnhu4djIMSR4buRaSB24bubaSB2acOqzKNjIGjDunQgdGh14buRYyBj4bunYSBuaOG7r25nIG5nxrDhu51pIGzDoG0gdmnhu4djLiBExrDhu5tpIMSRw6J5IGzDoCBtw7QgdOG6oyB2w6AgxJHhu4tuaCBk4bqhbmcgY+G7p2EgdOG6rXAgZOG7ryBsaeG7h3UgbsOgeToNCg0Kc21va2VyOiBjw6EgbmjDom4gY8OzIHBoYcyJaSBsw6AgbmfGsOG7nWkgaMO6dCB0aHXhu5FjIGhp4buHbiB04bqhaSBoYXkga2jDtG5nLg0KDQpiYW46IGPDsyDDoXAgZOG7pW5nIGzhu4duaCBj4bqlbSBow7p0IHRodeG7kWMgdOG6oWkgbsahaSBsw6BtIHZp4buHYyBoYXkga2jDtG5nLg0KDQphZ2U6IFR14buVaSBj4bunYSBjw6EgbmjDom4gDQoNCmVkdWNhdGlvbjogY2hvIGJp4bq/dCB0csOsbmggxJHhu5kgZ2nDoW8gZOG7pWMgY2FvIG5o4bqldCDEkcOjIMSR4bqhdCDEkcaw4bujYzogYuG7jyBo4buNYyB0cnVuZyBo4buNYyAoaHMpLCB04buRdCBuZ2hp4buHcCB0cnVuZyBo4buNYywgbeG7mXQgc+G7kSDEkeG6oWkgaOG7jWMsIHThu5F0IG5naGnhu4dwIMSR4bqhaSBo4buNYywgdGjhuqFjIHPEqSAoaG/hurdjIGNhbyBoxqFuKS4NCg0KYWZhbTogY2hvIGJp4bq/dCBsaeG7h3UgY8OhIG5ow6JuIGPDsyBwaOG6o2kgbMOgIG5nxrDhu51pIE3hu7kgZ+G7kWMgUGhpLUFtZWlyY2EgaGF5IGtow7RuZy4NCg0KaGlzcGFuaWM6IGPDoSBuaMOibiBjw7MgcGjhuqNpIGzDoCBuZ8aw4budaSBN4bu5IGfhu5FjIFTDonkgQmFuIE5oYSBoYXkga2jDtG5nLg0KDQpnZW5kZXI6IGdp4bubaSB0w61uaCBj4bunYSBjw6EgbmjDom4uDQoNCg0KYGBge3J9DQpsaWJyYXJ5KHJlYWR4bCkNCmRhdGExIDwtIHJlYWRfZXhjZWwoIkM6L1VzZXJzL2RlbGwvRG93bmxvYWRzL1Ntb2tlQmFuLnhsc3giKQ0KVmlldyhkYXRhMSkNCmBgYA0KDQpgYGB7cn0NCmxpYnJhcnkoQUVSKQ0KbGlicmFyeSh0aWR5dmVyc2UpDQpsaWJyYXJ5KERUKQ0KbGlicmFyeShEZXNjVG9vbHMpDQpsaWJyYXJ5KGdncGxvdDIpDQpgYGANCg0KIyBMw6LMo3AgYmHMiW5nIHTDosyAbiBzw7TMgQ0KDQpgYGB7cn0NCiMgVGhheSDEkeG7lWkgZ2nDoSB0cuG7iyBj4bunYSBiaeG6v24gDQpkYXRhMSRzbW9rZXI8LSByZWNvZGUoZGF0YTEkc21va2VyLCAieWVzIiA9ICJjb8yBIGh1zIF0IiwgIm5vIiA9ICJraMO0bmcgaHXMgXQiKQ0KZGF0YTEkYmFuIDwtIHJlY29kZShkYXRhMSRiYW4sICJ5ZXMiID0gImPDosyBbSIsICJubyIgPSAia2jDtG5nIGPDosyBbSIpDQpgYGANCg0KQmHMiW5nIHTDosyAbiBzw7TMgSBiacOqzIFuIGJhbg0KDQpgYGB7cn0NCnRhYmxlKGRhdGExJGJhbikNCmBgYA0KDQpCYcyJbmcgdMOizIBuIHN1w6LMgXQNCg0KYGBge3J9DQp0YWJsZShkYXRhMSRiYW4pL3N1bSh0YWJsZShkYXRhMSRiYW4pKQ0KYGBgDQoNCkJhzIluZyB0w6LMgG4gc8O0zIEgc8O0zIEgbmfGsMahzIBpIGh1zIF0IHRodcO0zIFjDQoNCmBgYHtyfQ0KdGFibGUoZGF0YTEkc21va2VyKQ0KYGBgDQoNCkJhzIluZyB0w6LMgG4gc3XDosyBdA0KDQpgYGB7cn0NCnRhYmxlKGRhdGExJHNtb2tlcikvc3VtKHRhYmxlKGRhdGExJHNtb2tlcikpDQpgYGANCg0KIyBWZcyDIMSRw7TMgCB0aGnMow0KDQpgYGB7cn0NCmxpYnJhcnkoZ2dwbG90MikNCmBgYA0KQmnDqsyBbiBiYW4NCg0KYGBge3J9DQpkYXRhMSB8PiBnZ3Bsb3QoYWVzKHggPSBiYW4sIHkgPSBhZnRlcl9zdGF0KGNvdW50KSkpICsNCmdlb21fYmFyKGZpbGwgPSAncmVkJykgK2dlb21fdGV4dChhZXMobGFiZWwgPSBzY2FsZXM6OnBlcmNlbnQoYWZ0ZXJfc3RhdChjb3VudC9zdW0oY291bnQpKSkpLCBzdGF0ID0nY291bnQnLCBjb2xvciA9ICdibHVlJywgdmp1c3QgPSAtIC41KSArbGFicyh4ID0gJ0JhbicsIHkgPSAnU8O0zIEgbsahaSBjw6LMgW0nKQ0KYGBgDQoNCk5ow6LMo24geGXMgXQ6IFRyb25nIHTDtMyJbmcgc8O0zIEgMTAwMDAgcXVhbiBzYcyBdDoNCg0KU8O0zIEgbsahaSBsYcyAbSB2acOqzKNjIGPDosyBbSBodcyBdCB0aHXDtMyBYyBsYcyAIDYxJSANCg0KU8O0zIEgbsahaSBsYcyAbSB2acOqzKNjIGNobyBodcyBdCB0aHXDtMyBYyBsYcyAIDM5JQ0KDQpCacOqzIFuIFNtb2tlcg0KDQpgYGB7cn0NCmRhdGExIHw+IGdncGxvdChhZXMoeCA9IHNtb2tlciwgeSA9IGFmdGVyX3N0YXQoY291bnQpKSkgKw0KZ2VvbV9iYXIoZmlsbCA9ICdibHVlJykgK2dlb21fdGV4dChhZXMobGFiZWwgPSBzY2FsZXM6OnBlcmNlbnQoYWZ0ZXJfc3RhdChjb3VudC9zdW0oY291bnQpKSkpLCBzdGF0ID0nY291bnQnLCBjb2xvciA9ICdwdXJwbGUnLCB2anVzdCA9IC0gLjUpICtsYWJzKHggPSAnU8O0zIEgbmfGsMahzIBpIGh1zIF0IHRodcO0zIFjJywgeSA9ICdz4buRIG5nxrDhu51pJykNCmBgYA0KDQoNCk5ow6LMo24geGXMgXQ6DQoNClPDtMyBIG5nxrDGocyAaSDEkWFuZyBodcyBdCB0aHXDtMyBYyBsYcyAIDI0JQ0KDQpTw7TMgSBuZ8awxqHMgGkga2jDtG5nIGh1zIF0IHRodcO0zIFjIGxhzIAgNzYlDQoNCiMgxq/GocyBYyBsxrDGocyjbmcgdHnMiSBsw6rMow0KDQrGr8ahzIFjIGzGsMahzKNuZyB0ecyJIGzDqsyjIGNhzIEgbmjDom4gaHXMgXQgdGh1w7TMgWMgxqHMiSBuxqFpIGxhzIBtIHZpw6rMo2MgY8OizIFtIGh1zIF0IA0KDQpgYGB7cn0NCnNtb2tlPC0gdGFibGUoZGF0YTFbZGF0YTEkc21va2VyID09ICJjb8yBIGh1zIF0IixdJGJhbikNCnNtb2tlDQpgYGANCg0KYGBge3J9DQpwcm9wLnRlc3Qoc21va2VbImPDosyBbSJdLCBzdW0oc21va2UpLCBwID0gMC40KQ0KYGBgDQoNClRhIMawxqHMgWMgbMawxqHMo25nIHR5zIkgbMOqzKMgdsahzIFpIGdpYcyJIHRodXnDqsyBdCAoSE8pOiBUecyJIGzDqsyjIG5nxrDGocyAaSBodcyBdCB0aHXDtMyBYyDGocyJICBuxqFpIGPDosyBbSBodcyBdCBsYcyAIDQwJQ0KDQpLw6rMgXQgcXVhzIkgY2hvIHAgLSB2YWx1ZSBsYcyAIDIuMmUtMTYuIFRhIGJhzIFjIGJvzIkgZ2lhzIkgdGh1ecOqzIF0ICB0ecyJIGzDqsyjIG5nxrDGocyAaSBodcyBdCB0aHXDtMyBYyDGocyJIG7GoWkgY8OizIFtIGh1zIF0IGxhzIAgNDAlDQoNCsavxqHMgWMgbMawxqHMo25nIHR5zIkgbMOqzKMgY2HMgSBuaMOibiBraMO0bmcgaHXMgXQgdGh1w7TMgWMgxqHMiSBuxqFpIGxhzIBtIHZpw6rMo2MgY8OizIFtIGh1zIF0IHRodcO0zIFjDQoNCmBgYHtyfQ0Kbm9zbW9rZTwtIHRhYmxlKGRhdGExW2RhdGExJHNtb2tlciA9PSAia2jDtG5nIGh1zIF0IixdJGJhbikNCm5vc21va2UNCmBgYA0KDQpgYGB7cn0NCnByb3AudGVzdChub3Ntb2tlWyJjw6LMgW0iXSwgc3VtKG5vc21va2UpLCBwID0gMC42KQ0KYGBgDQoNClRhIMawxqHMgWMgbMawxqHMo25nIHR5zIkgbMOqzKMgdsahzIFpIGdpYcyJIHRodXnDqsyBdCAoSE8pOiBUecyJIGzDqsyjIG5nxrDGocyAaSBraMO0bmcgaHXMgXQgdGh1w7TMgWMgxqHMiSAgbsahaSBjw6LMgW0gaHXMgXQgbGHMgCA0MCUNCg0KS8OqzIF0IHF1YcyJIGNobyBwIC0gdmFsdWUgbGHMgCAxLjM4NWUtMDktMTYuIFRhIGJhzIFjIGJvzIkgZ2lhzIkgdGh1ecOqzIF0ICB0ecyJIGzDqsyjIG5nxrDGocyAaSBraMO0bmcgaHXMgXQgdGh1w7TMgWMgxqHMiSBuxqFpIGxhzIBtIHZpw6rMoyBjIGPDosyBbSBodcyBdCBsYcyAIDYwJQ0KDQrGr8ahzIFjIGzGsMahzKNuZyBjaMOqbmggbMOqzKNjaCB0ecyJIGzDqsyjDQoNCmBgYHtyfQ0KZGFfaHV0IDwtIGRhdGExW2RhdGExJHNtb2tlciA9PSAnY2/MgSBodcyBdCcsXQ0KZGFfa2hvbmdodXQgPC0gZGF0YTFbZGF0YTEkc21va2VyID09ICdraMO0bmcgaHXMgXQnLF0NCg0KaHV0X2NhbSA8LSBkYV9odXRbZGFfaHV0JGJhbiA9PSAnY8OizIFtJyxdDQpraG9uZ2h1dF9jYW0gPC0gZGFfa2hvbmdodXRbZGFfa2hvbmdodXQkYmFuID09ICdjw6LMgW0nLF0NCg0KYSA8LSBjKG5yb3coZGFfaHV0KSwgbnJvdyhkYV9raG9uZ2h1dCkpDQphDQpgYGANCg0KYGBge3J9DQpiIDwtIGMobnJvdyhodXRfY2FtKSwgbnJvdyhraG9uZ2h1dF9jYW0pKQ0KYg0KYGBgDQoNCmBgYHtyfQ0KcHJvcC50ZXN0KGIsYSkNCmBgYA0KDQpUYSBracOqzIltIMSRacyjbmggZ2lhzIkgdGh1ecOqzIF0IEgwOiBLaMO0bmcgY2/MgSBzxrDMoyBraGHMgWMgYmnDqsyjdCDEkWHMgW5nIGvDqsyJIGdpxrDMg2EgdGnMiSBsw6rMoyBuZ8awxqHMgGkgaHXMgXQgdGh1w7TMgWMgdmHMgCBuZ8awxqHMgGkga2jDtG5nIMahzIkgaHXMgXQgdGh1w7TMgWMgxqHMiSBuxqFpIGxhzIBtIHZpw6rMo2MgY8OizIFtIGh1zIF0IHRodcO0zIFjDQoNClZpzIAgcC12YWx1ZSA9IDIuMmUtMTYgPCAwLjA1LiBWacyAIHbDosyjeSBiYcyBYyBib8yJIGdpYcyJIHRodXnDqsyBdCBIMC4gTmdoacyDYSBsYcyAIGNvzIEgc8awzKMga2hhzIFjIGJpw6rMo3QgxJFhzIFuZyBrw6rMiSBnacawzINhIHRpzIkgbMOqzKMgbmfGsMahzIBpIGh1zIF0IHRodcO0zIFjIHZhzIAgbmfGsMahzIBpIGtow7RuZyDGocyJIGh1zIF0IHRodcO0zIFjIMahzIkgbsahaSBsYcyAbSB2acOqzKNjIGPDosyBbSBodcyBdCB0aHXDtMyBYw0KDQpWxqHMgWkgxJHDtMyjIHRpbiBjw6LMo3kgOTUlLCBraG9hzIluZyBjaMOqbmggbMOqzKNjaCBnacawzINhIHRpzIkgzKNsw6rMoyAgbmfGsMahzIBpIGh1zIF0IHRodcO0zIFjIHZhzIAgbmfGsMahzIBpIGtow7RuZyDGocyJIGh1zIF0IHRodcO0zIFjIMahzIkgbsahaSBsYcyAbSB2acOqzKNjIGPDosyBbSBodcyBdCB0aHXDtMyjYyB0cm9uZyBraG9hzIluZyB0xrDMgCAwLjUzMzYzNiDEkcOqzIFuIDAuNjM0MTUNCg0KIyDGr8ahzIFjIGzGsMahzKNuZyBSZWxhdGl2ZSBSaXNrIHZhzIAgT2RkIFJhdGlvDQoNCmBgYHtyfQ0KbGlicmFyeShEZXNjVG9vbHMpDQpsaWJyYXJ5KGVwaXRvb2xzKQ0KYGBgDQoNCg0KYGBge3J9DQpkYSA8LSB0YWJsZShkYXRhMSRzbW9rZXIsIGRhdGExJGJhbikNCmFkZG1hcmdpbnMoZGEpDQpgYGANCmBgYHtyfQ0KUmVsUmlzayhkYSkNCmBgYA0KYGBge3J9DQpkYSA8LSB0YWJsZShkYXRhMSRzbW9rZXIsIGRhdGExJGJhbikNCnJpc2tyYXRpbyhkYSkNCmBgYA0KDQpOaMOizKNuIHhlzIF0OiBLw6rMgXQgcXVhzIkgdHLDqm4gY2hvIHRhIHRow6LMgXkgdGnMiSBsw6rMoyBydcyJaSBybyB0xrDGoW5nIMSRw7TMgWkgKHJpc2sgcmF0aW8pIGN1zIlhIG5oxrDMg25nIG5nxrDGocyAaSDEkcawxqHMo2MgaHXMgXQgdGh1w7TMgWMgxqHMiSBuaMawzINuZyBuxqFpIGxhzIBtICB2acOqzKNjIGNobyBwaGXMgXAgaHXMgXQgbGHMgCAwLjg0MTM5MDEgdMawzIFjIGxhzIAgdHnMiSBsw6rMoyBuaMawzINuZyBuZ8awxqHMgGkgxJHGsMahzKNjIGh1zIF0IHRodcO0zIFjIMahzIkgbmjGsMyDbmcgbsahaSBsYcyAbSAgdmnDqsyjYyBjaG8gcGhlzIFwIGfDosyBcCAwLjg0MTQ5MDEgbMOizIBuIHR5zIkgbMOqzKMgbmjGsMyDbmcgbmfGsMahzIBpIGtow7RuZyDEkcawxqHMo2MgaHXMgXQgdGh1w7TMgWMgxqHMiSBuaMawzINuZyBuxqFpIGxhzIBtICB2acOqzKNjIGtow7RuZyBjaG8gcGhlzIFwIA0KDQpgYGB7cn0NCmVwaXRhYihkYSwgbWV0aG9kID0gJ29kZHNyYXRpbycpDQpgYGANCg0KS8OqzIF0IHF1YcyJIHR5zIkgbMOqzKMgY2jDqm5oIGzDqsyjY2ggKE9kZHNyYXRpbykgbGHMgCAwLjY2MDExNTUgdMawzIFjIHRpzIkgbMOqzKMgbmjGsMyDbmcgbmfGsMahzIBpIGh1zIF0IHRodcO0zIFjIMahzIkgbsahaSBsYcyAbSB2acOqzKNjIGNobyBwaGXMgXAgaHXMgXQgdGh1w7TMgWMgYmXMgSBoxqFuIGtob2HMiW5nIDMzLjk4JSBzbyB2xqHMgWkgIHRpzIkgbMOqzKMgbmjGsMyDbmcgbmfGsMahzIBpIGtow7RuZyBodcyBdCB0aHXDtMyBYyDGocyJIG7GoWkga2jDtG5nIGNobyBwaGXMgXAgaHXMgXQgdGh1w7TMgWMg