Giới thiệu về dữ liệu

Dữ liệu về tất cả các vụ tai nạn máy bay thương mại gây tử vong từ năm 1993–2015. Không bao gồm máy bay nhỏ (dưới 6 hành khách) và máy bay phi thương mại (chở hàng, quân sự, tư nhân). Nguồn lấy từ trang web https://vincentarelbundock.github.io/Rdatasets/articles/data.html của tác giả David McCandless.

Khung dữ liệu bao gồm 439 quan sát về 5 biến như sau:

Phase - Giai đoạn: dữ liệu về giai đoạn xảy ra tai nạn của chuyến bay,gồm 4 yếu tố (en route - giai đoạn máy bay đang bay trong lộ trình, landing - giai đoạn máy bay hạ cánh, standing - giai đoạn máy bay đứng yên, take-off - giai đoạn máy bay cất cánh, unknow - không xác định được giai đoạn xảy ra tai nạn)

Cause - Gây ra: dữ liệu về nguyên nhân của tại nạn, gồm 5 yếu tố (criminal - tội phạm, human error - lỗi nhân viên, mechanical - lỗi kỹ thuật, unknown - không xác định được nguyên nhân)

Date - ngày: Thời điểm xảy ra sự cố

Fatalities - tử vong: Số người tử vong, là một vectơ số

Year - Năm: Năm xảy ra tai nạn, là một vectơ số

library(tidyverse)
## ── 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.3     ✔ 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()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
library(readxl)
data <- readxl::read_excel("aircrash.xlsx")

Thống kê và phân tích các biến

Biến Cause

# Bảng tần số của biến nguyên nhân 
table(data$Cause)
## 
##    criminal human error  mechanical     unknown     weather 
##          23         207          74          52          83
# Đồ thị biến nguyên nhân
barplot(table(data$Cause))

Kết quả: Có 23 tai nạn do tội phạm gây ra, 207 tai nạn do lỗi của nhân viên, 74 tai nạn do lỗi kỹ thuật máy bay, 83 tai nạn do thời tiết và 52 tai nạn chưa rõ nguyên nhân. Số tai nạn nguyên nhân do lỗi của nhân viên là nhiều nhất và số tai nạn nguyên nhân do tội phạm là ít nhất.

Biến Phase

# Bảng tần số của biến giai đoạn xảy ra tai nạn
table(data$Phase)
## 
## en route  landing standing take-off  unknown 
##      157      210        4       65        3
# Đồ thị
barplot(table(data$Phase))

Kết quả: Giai đoạn hạ cánh là giai đoạn xảy ra tai nạn nhiều nhất với 210 tai nạn và có 3 tai nạn không xác định được giai đoạn xảy ra sự cố. Tai nạn xảy ra khi máy bay đứng yên là 4 tai nạn, 65 tai nạn xảy ra khi máy bay cất cánh và 157 tai nạn xảy ra trên lộ trình đi của máy bay.

Biến Fatalities

# Bảng tần số của số người tử vong
table(data$Fatalities)
## 
##    1    2    3    4    5    6    7    8    9   10   11   12   13   14   15   16 
##   28   22   18   13   10   12   11    9   11   12    5    6    6   11    8   11 
##   17   18   19   20   21   22   23   24   25   26   27   28   29   30   31   32 
##    8   12   11    5    6    6    3    6    3    1    4    7    1    2    1    3 
##   33   34   35   36   37   38   39   40   41   42   43   44   45   46   47   48 
##    3    1    3    2    3    1    1    2    3    1    2    8    2    3    1    1 
##   49   50   51   52   53   55   57   60   61   65   66   68   69   70   71   74 
##    4    3    1    1    3    4    3    3    1    4    1    3    1    2    1    1 
##   75   77   78   80   82   83   85   88   90   94   96   98  101  102  103  104 
##    4    2    1    2    1    2    1    2    2    1    1    1    1    2    2    3 
##  108  110  112  113  114  116  117  119  121  123  125  127  129  131  132  141 
##    2    1    1    2    2    3    1    1    1    1    3    1    1    2    2    3 
##  143  144  145  148  149  150  152  154  158  159  160  162  163  168  169  170 
##    1    1    1    1    2    1    2    2    1    1    2    1    1    1    1    1 
##  189  199  202  217  225  228  229  230  234  237  239  264  265  298  312  965 
##    2    1    1    1    1    2    1    1    1    1    1    1    1    1    1    1 
## 1692 
##    1
# Đồ thị 
barplot(table(data$Fatalities))

# Số ca trung bình tử vong 
summary(data$Fatalities)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##    1.00    7.00   19.00   50.68   60.00 1692.00

Kết quả: Số ca tử vong nhiều nhất được ghi nhận là 1692 ca, thấp nhất là 1 ca tử vong. Từ năm 1993-2015, số người tử vong trung bình khi xảy ra tai nạn máy bay là 50 người.

Biến Year

# Bảng tần số của năm xảy ra tai nạn 
table(data$Year)
## 
## 1993 1994 1995 1996 1997 1998 1999 2000 2001 2002 2003 2004 2005 2006 2007 2008 
##   35   34   32   29   27   25   25   27   22   23   14   16   23   16   12   14 
## 2009 2010 2011 2012 2013 2014 2015 
##   10   10   18   11    7    7    2
# Đồ thị 
barplot(table(data$Year))

Kết quả: Trong năm 1993 xảy ra nhiều tai nạn nhất trong thời gian quan sát là 35 tai nạn, năm 2015 xảy ra ít tai nạn nhất với 2 tai nạn. Nhìn đồ thị có thể thấy được trung bình xảy ra tai nạn nhiều nhất là từ năm 1993 đến năm 2002, từ năm 2002 đến 2015, tai nạn máy bay giảm đi và được kiểm soát hơn.

Kết hợp các biến

Phase và Cause

Đầu tiên, mã hoá dữ liệu của 2 biến: Giai đoạn xảy ra tai nạn và Nguyên nhân xảy ra tai nạn

Biến Phase - giai đoạn xảy ra tai nạn: mã hoá thành 2 yếu tố gồm (1) giai đoạn máy bay chuyển động (en route, landing, take-off) và (2) giai đoạn máy bay không chuyển động hay không xác định được (standing, unknown), sau đó gán vào tên mới phase1

Biến Cause - nguyên nhân xảy ra tai nạn: mã hoá thành 2 yếu tố gồm (human) nguyên nhân xảy ra tai nạn là do con người (criminal, human error) và (non-human) nguyên nhân xảy ra tai nạn không phải do con người và không xác định được (mechanical, weather, unknown), sau đó gán vào tên mới cause1

# Mã hoá biến Phase
data$phase_1 <- factor(NA, levels = c("1", "2"))
data$phase_1[data$Phase %in% c("en route", "landing", "take-off")] <- "1"
data$phase_1[data$Phase %in% c("standing", "unknown")] <- "2"
table(data$phase_1)
## 
##   1   2 
## 432   7
# Mã hoá biến Cause
data$cause_1 <- factor(NA, levels = c("human", "non-human"))
data$cause_1[data$Cause %in% c("mechanical", "weather", "unknown")] <- "non-human"
data$cause_1[data$Cause %in% c("criminal", "human error")] <- "human"
table(data$cause_1)
## 
##     human non-human 
##       230       209
# Bảng tần số của 2 biến mã hoá 
table(data$phase_1,data$cause_1)
##    
##     human non-human
##   1   227       205
##   2     3         4
# Đồ thị 2 biến mã hoá 
barplot(table(data$phase_1,data$cause_1))

Kết quả: Những tai nạn nguyên nhân do con người (tội phạm, lỗi nhân viên) có 227 tai nạn xảy ra trong giai đoạn máy bay chuyển động (đang bay, đang hạ cánh, đang cất cánh) và 3 tai nạn xảy ra trong giai đoạn máy bay đứng yên, không xác định được giai đoạn. Những tai nạn nguyên nhân không phải do con người (lỗi kỹ thuật, thời tiết, không xác định được) có 205 tai nạn xảy ra khi máy bay trong giai đoạn chuyển động và 4 tai nạn xảy ra trong khi máy bay đứng yên. Tổng quan hơn là tai nạn máy bay xảy ra nhiều hơn là do con người và giai đoạn máy bay đang chuyển động sẽ dễ xảy ra tai nạn hơn.

Fatilities

Biến Fatilities - tử vong: Biến thu thập số ca tử vong của các tai nạn từ ít nhất là 1 ca tử vong trong 1 tai nạn đến nhiều nhất là 1692 ca tử vong trong 1 tai nạn. Mã hoá thành 2 yếu tố: high (có số ca tử vong >=100) và low (có số ca tử vong <100).

# Mã hoá biến tử vong 
data$fatilities_1 <- cut(data$Fatalities, breaks = c(0,100,1692), labels=c("low","high"))
table(data$fatilities_1)
## 
##  low high 
##  365   74
# Kết hợp với biến cause_1
addmargins(table(data$fatilities_1,data$cause_1))
##       
##        human non-human Sum
##   low    180       185 365
##   high    50        24  74
##   Sum    230       209 439
# Kết hợp với biến phase_1
addmargins(table(data$fatilities_1,data$phase_1))
##       
##          1   2 Sum
##   low  359   6 365
##   high  73   1  74
##   Sum  432   7 439

Kết quả:

Trong khoảng thời từ năm 1993-2015: đa số các tai nạn máy bay có số ca tử vong dưới 100 ca chiếm 83.14% với 365 tai nạn và 74 tai nạn có số ca tử vong lớn hơn 100 ca chiếm 16.86%.

Trong số những tai nạn do con người gây ra có 180 tai nạn có số ca tử vong dưới 100 ca là 180 ca chiếm 78.26% và 50 tai nạn có số ca tử vong hơn 100 ca chiếm 21.74%. Mặt khác, trong số những tai nạn không do con người gây ra có 185 tai nạn có số ca tử vong thấp dưới 100 ca chiếm 88.52% và 11.48% còn lại là số tai nạn có ca tử vong cao hơn 100 ca.

Giai đoạn xảy ra tai nạn khi máy bay đang chuyển động có 359 tai nạn có số tử vong thấp hơn 100 ca chiếm 83.1%, số tai nạn có ca tử vong cao hơn 100 là 73 tai nạn chiếm 16.9%. Trong giai đoạn máy bay đứng yên xảy ra tai nạn, 1 trường hợp có số ca tử vong lớn hơn 100 chiếm 14.29% và 6 tai nạn còn lại có số ca tử vong thấp hơn 100 chiếm 85.71%.

Kết luận rằng từ năm 1993 đến năm 2015 tai nạn máy bay xảy ra do con người chiếm 52.39% và không do con người chiếm 47.61%. Giai đoạn xảy ra tai nạn nhiều nhất là khi máy bay đang chuyển động chiếm 98.41% và giai đoạn máy bay đứng yên không xảy ra nhiều tai nạn chỉ chiếm 1.59%. Số ca tử vong được ghi nhận dưới 100 ca là nhiều nhất với 337 tai nạn, 74 tai nạn còn lại có số ca tử vong được ghi nhận trên 100 ca.

Tính độc lập của 2 biến

1) Giả thuyết H0: biến Cause, Phase là 2 biến độc lập. Với mức ý nghĩa 5%

a <- table(data$Cause,data$Phase)
chisq.test(a)
## Warning in chisq.test(a): Chi-squared approximation may be incorrect
## 
##  Pearson's Chi-squared test
## 
## data:  a
## X-squared = 82.291, df = 16, p-value = 6.413e-11

Kết quả kiểm định:

p-value = 6.413e-11 < 0.05

-> Bác bỏ H0

-> Nguyên nhân xảy ra tai nạn và giai đoạn xảy ra tai nạn là có liên quan với nhau.

2) Đặt giả thuyết H0: biến Cause, Fatalities là 2 biến độc lập. Với mức ý nghĩa 5%

b <- table(data$Cause,data$Fatalities)
chisq.test(b)
## Warning in chisq.test(b): Chi-squared approximation may be incorrect
## 
##  Pearson's Chi-squared test
## 
## data:  b
## X-squared = 535.02, df = 512, p-value = 0.2328

Kết quả kiểm định:

p-value = 0.2328 > 0.05

-> Chưa đủ cơ sở bác bỏ H0

-> Nguyên nhân xảy ra tai nạn và số ca tử vong là 2 biến độc lập, không phụ thuộc nhau.

3) Đặt giả thuyết H0: biến Phase, Fatalities là 2 biến độc lập. Với mức ý nghĩa 5%

c <- table(data$Phase,data$Fatalities)
chisq.test(c)
## Warning in chisq.test(c): Chi-squared approximation may be incorrect
## 
##  Pearson's Chi-squared test
## 
## data:  c
## X-squared = 391.73, df = 512, p-value = 1

Kết quả kiểm định:

p-value = 1 > 0.05

-> Chưa đủ cơ sở bác bỏ H0

-> Giai đoạn xảy ra tai nạn và số ca tử vong là 2 biến độc lập, không phụ thuộc nhau.

Ước lượng tỷ lệ

Ước lượng tỷ lệ tai nạn có số người tử vong nhiều hơn 100 người trong những tai nạn có nguyên nhân từ con người

Đặt giả thuyết H0: Tỷ lệ tai nạn có số ca tử vong > 100 trong những tai nạn có nguyên nhân từ con người là 70%

tmq <- table(data[data$cause_1 == "human", ]$fatilities_1)
tmq
## 
##  low high 
##  180   50
prop.test(tmq["high"], sum(tmq), p = 0.7)
## 
##  1-sample proportions test with continuity correction
## 
## data:  tmq["high"] out of sum(tmq), null probability 0.7
## X-squared = 252.8, df = 1, p-value < 2.2e-16
## alternative hypothesis: true p is not equal to 0.7
## 95 percent confidence interval:
##  0.1670138 0.2774281
## sample estimates:
##         p 
## 0.2173913

Kết quả ước lượng cho thấy p-value = 2.2e-16 nhỏ hơn giá trị \(\alpha = 0,05\)

-> Đủ cơ sở bác bỏ H0. Cho thấy được tỷ lệ tai nạn có số người tử vong cao hơn 100 người trong những tai nạn do con người gây ra không phải là 70%.

Ước lượng tỷ lệ tai nạn có số người tử vong ít hơn 100 người trong những tai nạn có nguyên nhân từ con người

Đặt giả thuyết H0: Tỷ lệ tai nạn có số ca tử vong < 100 ca trong những tai nạn có nguyên nhân từ con người là 60%

prop.test(tmq["low"], sum(tmq), p = 0.6)
## 
##  1-sample proportions test with continuity correction
## 
## data:  tmq["low"] out of sum(tmq), null probability 0.6
## X-squared = 31.2, df = 1, p-value = 2.327e-08
## alternative hypothesis: true p is not equal to 0.6
## 95 percent confidence interval:
##  0.7225719 0.8329862
## sample estimates:
##         p 
## 0.7826087

Kết quả ước lượng cho thấy p-value = 2.327e-08 nhỏ hơn giá trị \(\alpha = 0,05\)

-> Đủ cơ sở bác bỏ H0. Cho thấy được tỷ lệ tai nạn có số người tử vong ít hơn 100 người trong những tai nạn do con người gây ra không phải là 60%.

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

  • Ước lượng khoảng chênh lệch tỷ lệ giữa tai nạn có số ca tử vong nhiều hơn 100 ca và tai nạn có số ca tử vong ít hơn 100 ca trong những tai nạn xảy ra do con người.

Đặt giả thuyết H0: Tỷ lệ tai nạn có số ca tử vong > 100 và tỷ lệ tai nạn có số ca tử vong < 100 ca trong những tai nạn có nguyên nhân từ con người là bằng nhau

thap <- data[data$fatilities_1 == 'low',]
cao <- data[data$fatilities_1 == 'high',]

low_human <- thap[thap$cause_1 == 'human',]
high_human <- cao[cao$cause_1 == 'human' ,]

m <- c(nrow(thap), nrow(cao))
m
## [1] 365  74
n <- c(nrow(low_human), nrow(high_human))
n
## [1] 180  50
prop.test(n,m)
## 
##  2-sample test for equality of proportions with continuity correction
## 
## data:  n out of m
## X-squared = 7.5024, df = 1, p-value = 0.006162
## alternative hypothesis: two.sided
## 95 percent confidence interval:
##  -0.30900046 -0.05604952
## sample estimates:
##    prop 1    prop 2 
## 0.4931507 0.6756757

Kết quả ước lượng cho thấy p-value = 0.006162 nhỏ hơn giá trị \(\alpha = 0,05\)

-> Đủ cơ sở bác bỏ H0. Cho thấy được tỷ lệ tai nạn có số ca tử vong > 100 và tỷ lệ tai nạn có số ca tử vong < 100 ca trong những tai nạn có nguyên nhân từ con người là không bằng nhau.

Relative Risk

Hai biến phụ thuộc: biến nguyên nhân và biến giai đoạn

library(DescTools)
data1 <- table(data$cause_1,data$phase_1)
addmargins(data1)
##            
##               1   2 Sum
##   human     227   3 230
##   non-human 205   4 209
##   Sum       432   7 439
RelRisk(data1)
## [1] 1.006214

Kết quả: RR > 1 cho thấy tai nạn xảy ra trong giai đoạn chuyển động do con người gây ra có mức độ rủi ro cao hơn các tai nạn từ các nguyên nhân khác.

r = getOption("repos")
r["CRAN"] = "http://cran.us.r-project.org"
options(repos = r)
install.packages("epitools")
## 
## The downloaded binary packages are in
##  /var/folders/ph/8pctdw413fv1n37td3zcx97c0000gn/T//Rtmpe0d3fV/downloaded_packages
library(epitools)
riskratio(data1)
## Warning in chisq.test(xx, correct = correction): Chi-squared approximation may
## be incorrect
## $data
##            
##               1 2 Total
##   human     227 3   230
##   non-human 205 4   209
##   Total     432 7   439
## 
## $measure
##            risk ratio with 95% C.I.
##             estimate     lower    upper
##   human     1.000000        NA       NA
##   non-human 1.467305 0.3322871 6.479285
## 
## $p.value
##            two-sided
##             midp.exact fisher.exact chi.square
##   human             NA           NA         NA
##   non-human  0.6347193    0.7133192  0.6106256
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "Unconditional MLE & normal approximation (Wald) CI"

Kết quả

Tai nạn nguyên nhân do con người có tỷ số rủi ro là 1.000000, tai nạn máy báy do nguyên nhân khác số rủi ro là 1.204181, với khoảng tin cậy 95% từ 0.629115 đến 2.304762.

Điều này có nghĩa là tai nạn nguyên nhân không phải do con người có tỷ lệ không xảy ra cao hơn 20.418% khi máy bay chuyển động xảy ra tai nạn do con người gây ra.

Giá trị p.value lớn hơn 0.05, chấp nhận việc có sự khác biệt về tỷ lệ tai nạn xảy ra trong giai đoạn chuyển động máy bay của 2 nhóm nguyên nhân là khác nhau.

epitab(data1, method = 'riskratio', rev = 'c')
## Warning in chisq.test(xx, correct = correction): Chi-squared approximation may
## be incorrect
## $tab
##            
##             2         p0   1        p1 riskratio     lower    upper   p.value
##   human     3 0.01304348 227 0.9869565 1.0000000        NA       NA        NA
##   non-human 4 0.01913876 205 0.9808612 0.9938242 0.9701883 1.018036 0.7133192
## 
## $measure
## [1] "wald"
## 
## $conf.level
## [1] 0.95
## 
## $pvalue
## [1] "fisher.exact"
riskratio(data1, rev = 'c')
## Warning in chisq.test(xx, correct = correction): Chi-squared approximation may
## be incorrect
## $data
##            
##             2   1 Total
##   human     3 227   230
##   non-human 4 205   209
##   Total     7 432   439
## 
## $measure
##            risk ratio with 95% C.I.
##              estimate     lower    upper
##   human     1.0000000        NA       NA
##   non-human 0.9938242 0.9701883 1.018036
## 
## $p.value
##            two-sided
##             midp.exact fisher.exact chi.square
##   human             NA           NA         NA
##   non-human  0.6347193    0.7133192  0.6106256
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "Unconditional MLE & normal approximation (Wald) CI"

Kết quả

Tai nạn không do con người gây ra có tỷ số rủi ro là 0.9938242, với khoảng tin cậy 95% từ 0.9701883 đến 1.018036.

Điều này có nghĩa là tai nạn không do con người gây ra có nguy cơ xảy ra tai nạn khi máy bay đứng yên thấp hơn 0.61758% so với tai nạn do con người gây ra.

Giá trị p lớn hơn 0.05, chấp nhận việc có sự khác biệt về tỷ lệ tai nạn xảy ra trong giai đoạn máy bay đứng yên của 2 nhóm nguyên nhân là khác nhau.

Khoảng ước lượng cho Relative Risk

tmp <- matrix(c(227 ,205 ,3 ,4),nrow = 2)
RelRisk(tmp, conf.level = .95)
## rel. risk    lwr.ci    upr.ci 
## 1.0062142 0.9787295 1.0384171

Kết quả

Ước lượng cho Tỷ lệ Rủi ro Tương đối giữa nhóm nguyên nhân do con người và nhóm nguyên nhân không do con người là khoảng 1.006

Khoảng tin cậy 95% cho ước lượng này là từ khoảng 0.98 đến 1.04. Điều này cho rằng có 95% khả năng rằng giá trị thực sự của Tỷ lệ Rủi ro Tương đối nằm trong khoảng từ 0.98 đến 1.04.

Odd ratio

OddsRatio(data1)
## [1] 1.476423
oddsratio(data1)
## Warning in chisq.test(xx, correct = correction): Chi-squared approximation may
## be incorrect
## $data
##            
##               1 2 Total
##   human     227 3   230
##   non-human 205 4   209
##   Total     432 7   439
## 
## $measure
##            odds ratio with 95% C.I.
##             estimate     lower    upper
##   human     1.000000        NA       NA
##   non-human 1.457371 0.3014272 7.990943
## 
## $p.value
##            two-sided
##             midp.exact fisher.exact chi.square
##   human             NA           NA         NA
##   non-human  0.6347193    0.7133192  0.6106256
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "median-unbiased estimate & mid-p exact CI"

Kết quả

Odds Ratio: Tỷ lệ tai nạn xảy ra giữa tai nạn có nguyên nhân từ con người và tai nạn có nguyên nhân khác là 1.46

R Markdown

This is an R Markdown document. Markdown is a simple formatting syntax for authoring HTML, PDF, and MS Word documents. For more details on using R Markdown see http://rmarkdown.rstudio.com.

When you click the Knit button a document will be generated that includes both content as well as the output of any embedded R code chunks within the document. You can embed an R code chunk like this:

summary(cars)
##      speed           dist       
##  Min.   : 4.0   Min.   :  2.00  
##  1st Qu.:12.0   1st Qu.: 26.00  
##  Median :15.0   Median : 36.00  
##  Mean   :15.4   Mean   : 42.98  
##  3rd Qu.:19.0   3rd Qu.: 56.00  
##  Max.   :25.0   Max.   :120.00

Including Plots

You can also embed plots, for example:

Note that the echo = FALSE parameter was added to the code chunk to prevent printing of the R code that generated the plot.

LS0tCnRpdGxlOiAiUGjDom4gdMOtY2ggZOG7ryBsaeG7h3UgxJHhu4tuaCB0w61uaCIKYXV0aG9yOiAibG5xdXluaCIKZGF0ZTogIjIwMjQtMDYtMDciCm91dHB1dDoKICBodG1sX2RvY3VtZW50OgogICAgdG9jOiBUUlVFCiAgICB0b2NfZmxvYXQ6IFRSVUUKICAgIGRmX3ByaW50OiBwYWdlZAogICAgY29kZV9kb3dubG9hZDogdHJ1ZQotLS0KCiMgR2nhu5tpIHRoaeG7h3UgduG7gSBk4buvIGxp4buHdQoKROG7ryBsaeG7h3UgduG7gSB04bqldCBj4bqjIGPDoWMgduG7pSB0YWkgbuG6oW4gbcOheSBiYXkgdGjGsMahbmcgbeG6oWkgZ8OieSB04butIHZvbmcgdOG7qyBuxINtIDE5OTPigJMyMDE1LiBLaMO0bmcgYmFvIGfhu5NtIG3DoXkgYmF5IG5o4buPIChkxrDhu5tpIDYgaMOgbmgga2jDoWNoKSB2w6AgbcOheSBiYXkgcGhpIHRoxrDGoW5nIG3huqFpIChjaOG7nyBow6BuZywgcXXDom4gc+G7sSwgdMawIG5ow6JuKS4KTmd14buTbiBs4bqleSB04burIHRyYW5nIHdlYiBodHRwczovL3ZpbmNlbnRhcmVsYnVuZG9jay5naXRodWIuaW8vUmRhdGFzZXRzL2FydGljbGVzL2RhdGEuaHRtbCBj4bunYSB0w6FjIGdp4bqjIERhdmlkIE1jQ2FuZGxlc3MuCgpLaHVuZyBk4buvIGxp4buHdSBiYW8gZ+G7k20gNDM5IHF1YW4gc8OhdCB24buBIDUgYmnhur9uIG5oxrAgc2F1OgoKUGhhc2UgLSBHaWFpIMSRb+G6oW46IGThu68gbGnhu4d1IHbhu4EgZ2lhaSDEkW/huqFuIHjhuqN5IHJhIHRhaSBu4bqhbiBj4bunYSBjaHV54bq/biBiYXksZ+G7k20gNCB54bq/dSB04buRIChlbiByb3V0ZSAtIGdpYWkgxJFv4bqhbiBtw6F5IGJheSDEkWFuZyBiYXkgdHJvbmcgbOG7mSB0csOsbmgsIGxhbmRpbmcgLSBnaWFpIMSRb+G6oW4gbcOheSBiYXkgaOG6oSBjw6FuaCwgc3RhbmRpbmcgLSBnaWFpIMSRb+G6oW4gbcOheSBiYXkgxJHhu6luZyB5w6puLCB0YWtlLW9mZiAtIGdpYWkgxJFv4bqhbiBtw6F5IGJheSBj4bqldCBjw6FuaCwgdW5rbm93IC0ga2jDtG5nIHjDoWMgxJHhu4tuaCDEkcaw4bujYyBnaWFpIMSRb+G6oW4geOG6o3kgcmEgdGFpIG7huqFuKQoKQ2F1c2UgLSBHw6J5IHJhOiBk4buvIGxp4buHdSB24buBIG5ndXnDqm4gbmjDom4gY+G7p2EgdOG6oWkgbuG6oW4sIGfhu5NtIDUgeeG6v3UgdOG7kSAoY3JpbWluYWwgLSB04buZaSBwaOG6oW0sIGh1bWFuIGVycm9yIC0gbOG7l2kgbmjDom4gdmnDqm4sIG1lY2hhbmljYWwgLSBs4buXaSBr4bu5IHRodeG6rXQsIHVua25vd24gLSBraMO0bmcgeMOhYyDEkeG7i25oIMSRxrDhu6NjIG5ndXnDqm4gbmjDom4pCgpEYXRlIC0gbmfDoHk6IFRo4budaSDEkWnhu4NtIHjhuqN5IHJhIHPhu7EgY+G7kQoKRmF0YWxpdGllcyAtIHThu60gdm9uZzogU+G7kSBuZ8aw4budaSB04butIHZvbmcsIGzDoCBt4buZdCB2ZWN0xqEgc+G7kQoKWWVhciAtIE7Eg206IE7Eg20geOG6o3kgcmEgdGFpIG7huqFuLCBsw6AgbeG7mXQgdmVjdMahIHPhu5EKCmBgYHtyfQpsaWJyYXJ5KHRpZHl2ZXJzZSkKbGlicmFyeShyZWFkeGwpCmRhdGEgPC0gcmVhZHhsOjpyZWFkX2V4Y2VsKCJhaXJjcmFzaC54bHN4IikKYGBgCgojIFRo4buRbmcga8OqIHbDoCBwaMOibiB0w61jaCBjw6FjIGJp4bq/biAKCiMjIEJp4bq/biBDYXVzZQpgYGB7cn0KIyBC4bqjbmcgdOG6p24gc+G7kSBj4bunYSBiaeG6v24gbmd1ecOqbiBuaMOibiAKdGFibGUoZGF0YSRDYXVzZSkKIyDEkOG7kyB0aOG7iyBiaeG6v24gbmd1ecOqbiBuaMOibgpiYXJwbG90KHRhYmxlKGRhdGEkQ2F1c2UpKQpgYGAKCioqS+G6v3QgcXXhuqM6KiogQ8OzIDIzIHRhaSBu4bqhbiBkbyB04buZaSBwaOG6oW0gZ8OieSByYSwgMjA3IHRhaSBu4bqhbiBkbyBs4buXaSBj4bunYSBuaMOibiB2acOqbiwgNzQgdGFpIG7huqFuIGRvIGzhu5dpIGvhu7kgdGh14bqtdCBtw6F5IGJheSwgODMgdGFpIG7huqFuIGRvIHRo4budaSB0aeG6v3QgdsOgIDUyIHRhaSBu4bqhbiBjaMawYSByw7Ugbmd1ecOqbiBuaMOibi4gU+G7kSB0YWkgbuG6oW4gbmd1ecOqbiBuaMOibiBkbyBs4buXaSBj4bunYSBuaMOibiB2acOqbiBsw6Agbmhp4buBdSBuaOG6pXQgdsOgIHPhu5EgdGFpIG7huqFuIG5ndXnDqm4gbmjDom4gZG8gdOG7mWkgcGjhuqFtIGzDoCDDrXQgbmjhuqV0LgoKIyMgQmnhur9uIFBoYXNlCmBgYHtyfQojIELhuqNuZyB04bqnbiBz4buRIGPhu6dhIGJp4bq/biBnaWFpIMSRb+G6oW4geOG6o3kgcmEgdGFpIG7huqFuCnRhYmxlKGRhdGEkUGhhc2UpCiMgxJDhu5MgdGjhu4sKYmFycGxvdCh0YWJsZShkYXRhJFBoYXNlKSkKYGBgCgoqKkvhur90IHF14bqjOioqIEdpYWkgxJFv4bqhbiBo4bqhIGPDoW5oIGzDoCBnaWFpIMSRb+G6oW4geOG6o3kgcmEgdGFpIG7huqFuIG5oaeG7gXUgbmjhuqV0IHbhu5tpIDIxMCB0YWkgbuG6oW4gdsOgIGPDsyAzIHRhaSBu4bqhbiBraMO0bmcgeMOhYyDEkeG7i25oIMSRxrDhu6NjIGdpYWkgxJFv4bqhbiB44bqjeSByYSBz4buxIGPhu5EuIFRhaSBu4bqhbiB44bqjeSByYSBraGkgbcOheSBiYXkgxJHhu6luZyB5w6puIGzDoCA0IHRhaSBu4bqhbiwgNjUgdGFpIG7huqFuIHjhuqN5IHJhIGtoaSBtw6F5IGJheSBj4bqldCBjw6FuaCB2w6AgMTU3IHRhaSBu4bqhbiB44bqjeSByYSB0csOqbiBs4buZIHRyw6xuaCDEkWkgY+G7p2EgbcOheSBiYXkuCgojIyBCaeG6v24gRmF0YWxpdGllcyAKYGBge3J9CiMgQuG6o25nIHThuqduIHPhu5EgY+G7p2Egc+G7kSBuZ8aw4budaSB04butIHZvbmcKdGFibGUoZGF0YSRGYXRhbGl0aWVzKQojIMSQ4buTIHRo4buLIApiYXJwbG90KHRhYmxlKGRhdGEkRmF0YWxpdGllcykpCiMgU+G7kSBjYSB0cnVuZyBiw6xuaCB04butIHZvbmcgCnN1bW1hcnkoZGF0YSRGYXRhbGl0aWVzKQpgYGAKCioqS+G6v3QgcXXhuqM6KiogU+G7kSBjYSB04butIHZvbmcgbmhp4buBdSBuaOG6pXQgxJHGsOG7o2MgZ2hpIG5o4bqtbiBsw6AgMTY5MiBjYSwgdGjhuqVwIG5o4bqldCBsw6AgMSBjYSB04butIHZvbmcuIFThu6sgbsSDbSAxOTkzLTIwMTUsIHPhu5EgbmfGsOG7nWkgdOG7rSB2b25nIHRydW5nIGLDrG5oIGtoaSB44bqjeSByYSB0YWkgbuG6oW4gbcOheSBiYXkgbMOgIDUwIG5nxrDhu51pLgoKIyMgQmnhur9uIFllYXIKYGBge3J9CiMgQuG6o25nIHThuqduIHPhu5EgY+G7p2EgbsSDbSB44bqjeSByYSB0YWkgbuG6oW4gCnRhYmxlKGRhdGEkWWVhcikKIyDEkOG7kyB0aOG7iyAKYmFycGxvdCh0YWJsZShkYXRhJFllYXIpKQpgYGAKCioqS+G6v3QgcXXhuqM6KiogVHJvbmcgbsSDbSAxOTkzIHjhuqN5IHJhIG5oaeG7gXUgdGFpIG7huqFuIG5o4bqldCB0cm9uZyB0aOG7nWkgZ2lhbiBxdWFuIHPDoXQgbMOgIDM1IHRhaSBu4bqhbiwgbsSDbSAyMDE1IHjhuqN5IHJhIMOtdCB0YWkgbuG6oW4gbmjhuqV0IHbhu5tpIDIgdGFpIG7huqFuLiBOaMOsbiDEkeG7kyB0aOG7iyBjw7MgdGjhu4MgdGjhuqV5IMSRxrDhu6NjIHRydW5nIGLDrG5oIHjhuqN5IHJhIHRhaSBu4bqhbiBuaGnhu4F1IG5o4bqldCBsw6AgdOG7qyBuxINtIDE5OTMgxJHhur9uIG7Eg20gMjAwMiwgdOG7qyBuxINtIDIwMDIgxJHhur9uIDIwMTUsIHRhaSBu4bqhbiBtw6F5IGJheSBnaeG6o20gxJFpIHbDoCDEkcaw4bujYyBraeG7g20gc2/DoXQgaMahbi4KCiMjIEvhur90IGjhu6NwIGPDoWMgYmnhur9uICAKCiMjIyBQaGFzZSB2w6AgQ2F1c2UgCgrEkOG6p3UgdGnDqm4sIG3DoyBob8OhIGThu68gbGnhu4d1IGPhu6dhIDIgYmnhur9uOiBHaWFpIMSRb+G6oW4geOG6o3kgcmEgdGFpIG7huqFuIHbDoCBOZ3V5w6puIG5ow6JuIHjhuqN5IHJhIHRhaSBu4bqhbgoKQmnhur9uIFBoYXNlIC0gZ2lhaSDEkW/huqFuIHjhuqN5IHJhIHRhaSBu4bqhbjogbcOjIGhvw6EgdGjDoG5oIDIgeeG6v3UgdOG7kSBn4buTbSAoMSkgZ2lhaSDEkW/huqFuIG3DoXkgYmF5IGNodXnhu4NuIMSR4buZbmcgKGVuIHJvdXRlLCBsYW5kaW5nLCB0YWtlLW9mZikgdsOgICgyKSBnaWFpIMSRb+G6oW4gbcOheSBiYXkga2jDtG5nIGNodXnhu4NuIMSR4buZbmcgaGF5IGtow7RuZyB4w6FjIMSR4buLbmggxJHGsOG7o2MgKHN0YW5kaW5nLCB1bmtub3duKSwgc2F1IMSRw7MgZ8OhbiB2w6BvIHTDqm4gbeG7m2kgcGhhc2UxCgpCaeG6v24gQ2F1c2UgLSBuZ3V5w6puIG5ow6JuIHjhuqN5IHJhIHRhaSBu4bqhbjogbcOjIGhvw6EgdGjDoG5oIDIgeeG6v3UgdOG7kSBn4buTbSAoaHVtYW4pIG5ndXnDqm4gbmjDom4geOG6o3kgcmEgdGFpIG7huqFuIGzDoCBkbyBjb24gbmfGsOG7nWkgKGNyaW1pbmFsLCBodW1hbiBlcnJvcikgdsOgIChub24taHVtYW4pIG5ndXnDqm4gbmjDom4geOG6o3kgcmEgdGFpIG7huqFuIGtow7RuZyBwaOG6o2kgZG8gY29uIG5nxrDhu51pIHbDoCBraMO0bmcgeMOhYyDEkeG7i25oIMSRxrDhu6NjIChtZWNoYW5pY2FsLCB3ZWF0aGVyLCB1bmtub3duKSwgc2F1IMSRw7MgZ8OhbiB2w6BvIHTDqm4gbeG7m2kgY2F1c2UxCgpgYGB7cn0KIyBNw6MgaG/DoSBiaeG6v24gUGhhc2UKZGF0YSRwaGFzZV8xIDwtIGZhY3RvcihOQSwgbGV2ZWxzID0gYygiMSIsICIyIikpCmRhdGEkcGhhc2VfMVtkYXRhJFBoYXNlICVpbiUgYygiZW4gcm91dGUiLCAibGFuZGluZyIsICJ0YWtlLW9mZiIpXSA8LSAiMSIKZGF0YSRwaGFzZV8xW2RhdGEkUGhhc2UgJWluJSBjKCJzdGFuZGluZyIsICJ1bmtub3duIildIDwtICIyIgp0YWJsZShkYXRhJHBoYXNlXzEpCiMgTcOjIGhvw6EgYmnhur9uIENhdXNlCmRhdGEkY2F1c2VfMSA8LSBmYWN0b3IoTkEsIGxldmVscyA9IGMoImh1bWFuIiwgIm5vbi1odW1hbiIpKQpkYXRhJGNhdXNlXzFbZGF0YSRDYXVzZSAlaW4lIGMoIm1lY2hhbmljYWwiLCAid2VhdGhlciIsICJ1bmtub3duIildIDwtICJub24taHVtYW4iCmRhdGEkY2F1c2VfMVtkYXRhJENhdXNlICVpbiUgYygiY3JpbWluYWwiLCAiaHVtYW4gZXJyb3IiKV0gPC0gImh1bWFuIgp0YWJsZShkYXRhJGNhdXNlXzEpCiMgQuG6o25nIHThuqduIHPhu5EgY+G7p2EgMiBiaeG6v24gbcOjIGhvw6EgCnRhYmxlKGRhdGEkcGhhc2VfMSxkYXRhJGNhdXNlXzEpCiMgxJDhu5MgdGjhu4sgMiBiaeG6v24gbcOjIGhvw6EgCmJhcnBsb3QodGFibGUoZGF0YSRwaGFzZV8xLGRhdGEkY2F1c2VfMSkpCmBgYAoKKipL4bq/dCBxdeG6ozoqKiBOaOG7r25nIHRhaSBu4bqhbiBuZ3V5w6puIG5ow6JuIGRvIGNvbiBuZ8aw4budaSAodOG7mWkgcGjhuqFtLCBs4buXaSBuaMOibiB2acOqbikgY8OzIDIyNyB0YWkgbuG6oW4geOG6o3kgcmEgdHJvbmcgZ2lhaSDEkW/huqFuIG3DoXkgYmF5IGNodXnhu4NuIMSR4buZbmcgKMSRYW5nIGJheSwgxJFhbmcgaOG6oSBjw6FuaCwgxJFhbmcgY+G6pXQgY8OhbmgpIHbDoCAzIHRhaSBu4bqhbiB44bqjeSByYSB0cm9uZyBnaWFpIMSRb+G6oW4gbcOheSBiYXkgxJHhu6luZyB5w6puLCBraMO0bmcgeMOhYyDEkeG7i25oIMSRxrDhu6NjIGdpYWkgxJFv4bqhbi4gTmjhu69uZyB0YWkgbuG6oW4gbmd1ecOqbiBuaMOibiBraMO0bmcgcGjhuqNpIGRvIGNvbiBuZ8aw4budaSAobOG7l2kga+G7uSB0aHXhuq10LCB0aOG7nWkgdGnhur90LCBraMO0bmcgeMOhYyDEkeG7i25oIMSRxrDhu6NjKSBjw7MgMjA1IHRhaSBu4bqhbiB44bqjeSByYSBraGkgbcOheSBiYXkgdHJvbmcgZ2lhaSDEkW/huqFuIGNodXnhu4NuIMSR4buZbmcgdsOgIDQgdGFpIG7huqFuIHjhuqN5IHJhIHRyb25nIGtoaSBtw6F5IGJheSDEkeG7qW5nIHnDqm4uIFThu5VuZyBxdWFuIGjGoW4gbMOgIHRhaSBu4bqhbiBtw6F5IGJheSB44bqjeSByYSBuaGnhu4F1IGjGoW4gbMOgIGRvIGNvbiBuZ8aw4budaSB2w6AgZ2lhaSDEkW/huqFuIG3DoXkgYmF5IMSRYW5nIGNodXnhu4NuIMSR4buZbmcgc+G6vSBk4buFIHjhuqN5IHJhIHRhaSBu4bqhbiBoxqFuLgoKIyMjIEZhdGlsaXRpZXMgCgpCaeG6v24gRmF0aWxpdGllcyAtIHThu60gdm9uZzogQmnhur9uIHRodSB0aOG6rXAgc+G7kSBjYSB04butIHZvbmcgY+G7p2EgY8OhYyB0YWkgbuG6oW4gdOG7qyDDrXQgbmjhuqV0IGzDoCAxIGNhIHThu60gdm9uZyB0cm9uZyAxIHRhaSBu4bqhbiDEkeG6v24gbmhp4buBdSBuaOG6pXQgbMOgIDE2OTIgY2EgdOG7rSB2b25nIHRyb25nIDEgdGFpIG7huqFuLiBNw6MgaG/DoSB0aMOgbmggMiB54bq/dSB04buROiBoaWdoIChjw7Mgc+G7kSBjYSB04butIHZvbmcgPj0xMDApIHbDoCBsb3cgKGPDsyBz4buRIGNhIHThu60gdm9uZyA8MTAwKS4KCmBgYHtyfQojIE3DoyBob8OhIGJp4bq/biB04butIHZvbmcgCmRhdGEkZmF0aWxpdGllc18xIDwtIGN1dChkYXRhJEZhdGFsaXRpZXMsIGJyZWFrcyA9IGMoMCwxMDAsMTY5MiksIGxhYmVscz1jKCJsb3ciLCJoaWdoIikpCnRhYmxlKGRhdGEkZmF0aWxpdGllc18xKQojIEvhur90IGjhu6NwIHbhu5tpIGJp4bq/biBjYXVzZV8xCmFkZG1hcmdpbnModGFibGUoZGF0YSRmYXRpbGl0aWVzXzEsZGF0YSRjYXVzZV8xKSkKIyBL4bq/dCBo4bujcCB24bubaSBiaeG6v24gcGhhc2VfMQphZGRtYXJnaW5zKHRhYmxlKGRhdGEkZmF0aWxpdGllc18xLGRhdGEkcGhhc2VfMSkpCmBgYAoKKipL4bq/dCBxdeG6ozoqKiAKClRyb25nIGtob+G6o25nIHRo4budaSB04burIG7Eg20gMTk5My0yMDE1OiDEkWEgc+G7kSBjw6FjIHRhaSBu4bqhbiBtw6F5IGJheSBjw7Mgc+G7kSBjYSB04butIHZvbmcgZMaw4bubaSAxMDAgY2EgY2hp4bq/bSA4My4xNCUgduG7m2kgMzY1IHRhaSBu4bqhbiB2w6AgNzQgdGFpIG7huqFuIGPDsyBz4buRIGNhIHThu60gdm9uZyBs4bubbiBoxqFuIDEwMCBjYSBjaGnhur9tIDE2Ljg2JS4KClRyb25nIHPhu5Egbmjhu69uZyB0YWkgbuG6oW4gZG8gY29uIG5nxrDhu51pIGfDonkgcmEgY8OzIDE4MCB0YWkgbuG6oW4gY8OzIHPhu5EgY2EgdOG7rSB2b25nIGTGsOG7m2kgMTAwIGNhIGzDoCAxODAgY2EgY2hp4bq/bSA3OC4yNiUgdsOgIDUwIHRhaSBu4bqhbiBjw7Mgc+G7kSBjYSB04butIHZvbmcgaMahbiAxMDAgY2EgY2hp4bq/bSAyMS43NCUuIE3hurd0IGtow6FjLCB0cm9uZyBz4buRIG5o4buvbmcgdGFpIG7huqFuIGtow7RuZyBkbyBjb24gbmfGsOG7nWkgZ8OieSByYSBjw7MgMTg1IHRhaSBu4bqhbiBjw7Mgc+G7kSBjYSB04butIHZvbmcgdGjhuqVwIGTGsOG7m2kgMTAwIGNhIGNoaeG6v20gODguNTIlIHbDoCAxMS40OCUgY8OybiBs4bqhaSBsw6Agc+G7kSB0YWkgbuG6oW4gY8OzIGNhIHThu60gdm9uZyBjYW8gaMahbiAxMDAgY2EuCgpHaWFpIMSRb+G6oW4geOG6o3kgcmEgdGFpIG7huqFuIGtoaSBtw6F5IGJheSDEkWFuZyBjaHV54buDbiDEkeG7mW5nIGPDsyAzNTkgdGFpIG7huqFuIGPDsyBz4buRIHThu60gdm9uZyB0aOG6pXAgaMahbiAxMDAgY2EgY2hp4bq/bSA4My4xJSwgc+G7kSB0YWkgbuG6oW4gY8OzIGNhIHThu60gdm9uZyBjYW8gaMahbiAxMDAgbMOgIDczIHRhaSBu4bqhbiBjaGnhur9tIDE2LjklLiBUcm9uZyBnaWFpIMSRb+G6oW4gbcOheSBiYXkgxJHhu6luZyB5w6puIHjhuqN5IHJhIHRhaSBu4bqhbiwgMSB0csaw4budbmcgaOG7o3AgY8OzIHPhu5EgY2EgdOG7rSB2b25nIGzhu5tuIGjGoW4gMTAwIGNoaeG6v20gMTQuMjklIHbDoCA2IHRhaSBu4bqhbiBjw7JuIGzhuqFpIGPDsyBz4buRIGNhIHThu60gdm9uZyB0aOG6pXAgaMahbiAxMDAgY2hp4bq/bSA4NS43MSUuCgoqKkvhur90IGx14bqtbiBy4bqxbmcgdOG7qyBuxINtIDE5OTMgxJHhur9uIG7Eg20gMjAxNSB0YWkgbuG6oW4gbcOheSBiYXkgeOG6o3kgcmEgZG8gY29uIG5nxrDhu51pIGNoaeG6v20gNTIuMzklIHbDoCBraMO0bmcgZG8gY29uIG5nxrDhu51pIGNoaeG6v20gNDcuNjElLiBHaWFpIMSRb+G6oW4geOG6o3kgcmEgdGFpIG7huqFuIG5oaeG7gXUgbmjhuqV0IGzDoCBraGkgbcOheSBiYXkgxJFhbmcgY2h1eeG7g24gxJHhu5luZyBjaGnhur9tIDk4LjQxJSB2w6AgZ2lhaSDEkW/huqFuIG3DoXkgYmF5IMSR4bupbmcgecOqbiBraMO0bmcgeOG6o3kgcmEgbmhp4buBdSB0YWkgbuG6oW4gY2jhu4kgY2hp4bq/bSAxLjU5JS4gU+G7kSBjYSB04butIHZvbmcgxJHGsOG7o2MgZ2hpIG5o4bqtbiBkxrDhu5tpIDEwMCBjYSBsw6Agbmhp4buBdSBuaOG6pXQgduG7m2kgMzM3IHRhaSBu4bqhbiwgNzQgdGFpIG7huqFuIGPDsm4gbOG6oWkgY8OzIHPhu5EgY2EgdOG7rSB2b25nIMSRxrDhu6NjIGdoaSBuaOG6rW4gdHLDqm4gMTAwIGNhLiAqKgoKIyBUw61uaCDEkeG7mWMgbOG6rXAgY+G7p2EgMiBiaeG6v24gCgoqKjEpIEdp4bqjIHRodXnhur90IEgwOiBiaeG6v24gQ2F1c2UsIFBoYXNlIGzDoCAyIGJp4bq/biDEkeG7mWMgbOG6rXAuIFbhu5tpIG3hu6ljIMO9IG5naMSpYSA1JSoqCgpgYGB7cn0KYSA8LSB0YWJsZShkYXRhJENhdXNlLGRhdGEkUGhhc2UpCmNoaXNxLnRlc3QoYSkKYGBgCkvhur90IHF14bqjIGtp4buDbSDEkeG7i25oOiAKCnAtdmFsdWUgPSA2LjQxM2UtMTEgPCAwLjA1IAoKLT4gQsOhYyBi4buPIEgwIAoKLT4gTmd1ecOqbiBuaMOibiB44bqjeSByYSB0YWkgbuG6oW4gdsOgIGdpYWkgxJFv4bqhbiB44bqjeSByYSB0YWkgbuG6oW4gbMOgIGPDsyBsacOqbiBxdWFuIHbhu5tpIG5oYXUuCgoqKjIpIMSQ4bq3dCBnaeG6oyB0aHV54bq/dCBIMDogYmnhur9uIENhdXNlLCBGYXRhbGl0aWVzIGzDoCAyIGJp4bq/biDEkeG7mWMgbOG6rXAuIFbhu5tpIG3hu6ljIMO9IG5naMSpYSA1JSoqCgpgYGB7cn0KYiA8LSB0YWJsZShkYXRhJENhdXNlLGRhdGEkRmF0YWxpdGllcykKY2hpc3EudGVzdChiKQpgYGAKS+G6v3QgcXXhuqMga2nhu4NtIMSR4buLbmg6IAoKcC12YWx1ZSA9IDAuMjMyOCA+IDAuMDUgCgotPiBDaMawYSDEkeG7pyBjxqEgc+G7nyBiw6FjIGLhu48gSDAgCgotPiBOZ3V5w6puIG5ow6JuIHjhuqN5IHJhIHRhaSBu4bqhbiB2w6Agc+G7kSBjYSB04butIHZvbmcgbMOgIDIgYmnhur9uIMSR4buZYyBs4bqtcCwga2jDtG5nIHBo4bulIHRodeG7mWMgbmhhdS4KCioqMykgxJDhurd0IGdp4bqjIHRodXnhur90IEgwOiBiaeG6v24gUGhhc2UsIEZhdGFsaXRpZXMgbMOgIDIgYmnhur9uIMSR4buZYyBs4bqtcC4gVuG7m2kgbeG7qWMgw70gbmdoxKlhIDUlKioKCmBgYHtyfQpjIDwtIHRhYmxlKGRhdGEkUGhhc2UsZGF0YSRGYXRhbGl0aWVzKQpjaGlzcS50ZXN0KGMpCmBgYApL4bq/dCBxdeG6oyBraeG7g20gxJHhu4tuaDogCgpwLXZhbHVlID0gMSA+IDAuMDUgCgotPiBDaMawYSDEkeG7pyBjxqEgc+G7nyBiw6FjIGLhu48gSDAgCgotPiBHaWFpIMSRb+G6oW4geOG6o3kgcmEgdGFpIG7huqFuIHbDoCBz4buRIGNhIHThu60gdm9uZyBsw6AgMiBiaeG6v24gxJHhu5ljIGzhuq1wLCBraMO0bmcgcGjhu6UgdGh14buZYyBuaGF1LgoKIyDGr+G7m2MgbMaw4bujbmcgdOG7tyBs4buHCgoqKsav4bubYyBsxrDhu6NuZyB04bu3IGzhu4cgdGFpIG7huqFuIGPDsyBz4buRIG5nxrDhu51pIHThu60gdm9uZyBuaGnhu4F1IGjGoW4gMTAwIG5nxrDhu51pIHRyb25nIG5o4buvbmcgdGFpIG7huqFuIGPDsyBuZ3V5w6puIG5ow6JuIHThu6sgY29uIG5nxrDhu51pKioKCirEkOG6t3QgZ2nhuqMgdGh1eeG6v3QgSDA6IFThu7cgbOG7hyB0YWkgbuG6oW4gY8OzIHPhu5EgY2EgdOG7rSB2b25nID4gMTAwIHRyb25nIG5o4buvbmcgdGFpIG7huqFuIGPDsyBuZ3V5w6puIG5ow6JuIHThu6sgY29uIG5nxrDhu51pIGzDoCA3MCUqCgpgYGB7cn0KdG1xIDwtIHRhYmxlKGRhdGFbZGF0YSRjYXVzZV8xID09ICJodW1hbiIsIF0kZmF0aWxpdGllc18xKQp0bXEKcHJvcC50ZXN0KHRtcVsiaGlnaCJdLCBzdW0odG1xKSwgcCA9IDAuNykKYGBgCkvhur90IHF14bqjIMaw4bubYyBsxrDhu6NuZyBjaG8gdGjhuqV5IHAtdmFsdWUgPSAyLjJlLTE2IG5o4buPIGjGoW4gZ2nDoSB0cuG7iyAkXGFscGhhID0gMCwwNSQgCgotPiDEkOG7pyBjxqEgc+G7nyBiw6FjIGLhu48gSDAuIENobyB0aOG6pXkgxJHGsOG7o2MgdOG7tyBs4buHIHRhaSBu4bqhbiBjw7Mgc+G7kSBuZ8aw4budaSB04butIHZvbmcgY2FvIGjGoW4gMTAwIG5nxrDhu51pIHRyb25nIG5o4buvbmcgdGFpIG7huqFuIGRvIGNvbiBuZ8aw4budaSBnw6J5IHJhIGtow7RuZyBwaOG6o2kgbMOgIDcwJS4KCioqxq/hu5tjIGzGsOG7o25nIHThu7cgbOG7hyB0YWkgbuG6oW4gY8OzIHPhu5EgbmfGsOG7nWkgdOG7rSB2b25nIMOtdCBoxqFuIDEwMCBuZ8aw4budaSB0cm9uZyBuaOG7r25nIHRhaSBu4bqhbiBjw7Mgbmd1ecOqbiBuaMOibiB04burIGNvbiBuZ8aw4budaSoqCgoqxJDhurd0IGdp4bqjIHRodXnhur90IEgwOiBU4bu3IGzhu4cgdGFpIG7huqFuIGPDsyBz4buRIGNhIHThu60gdm9uZyA8IDEwMCBjYSB0cm9uZyBuaOG7r25nIHRhaSBu4bqhbiBjw7Mgbmd1ecOqbiBuaMOibiB04burIGNvbiBuZ8aw4budaSBsw6AgNjAlKgoKYGBge3J9CnByb3AudGVzdCh0bXFbImxvdyJdLCBzdW0odG1xKSwgcCA9IDAuNikKYGBgCkvhur90IHF14bqjIMaw4bubYyBsxrDhu6NuZyBjaG8gdGjhuqV5IHAtdmFsdWUgPSAyLjMyN2UtMDggbmjhu48gaMahbiBnacOhIHRy4buLICRcYWxwaGEgPSAwLDA1JCAKCi0+IMSQ4bunIGPGoSBz4bufIGLDoWMgYuG7jyBIMC4gQ2hvIHRo4bqleSDEkcaw4bujYyB04bu3IGzhu4cgdGFpIG7huqFuIGPDsyBz4buRIG5nxrDhu51pIHThu60gdm9uZyDDrXQgaMahbiAxMDAgbmfGsOG7nWkgdHJvbmcgbmjhu69uZyB0YWkgbuG6oW4gZG8gY29uIG5nxrDhu51pIGfDonkgcmEga2jDtG5nIHBo4bqjaSBsw6AgNjAlLgoKIyDGr+G7m2MgbMaw4bujbmcgY2jDqm5oIGzhu4djaCB04bu3IGzhu4cgCgoqIMav4bubYyBsxrDhu6NuZyBraG/huqNuZyBjaMOqbmggbOG7h2NoIHThu7cgbOG7hyBnaeG7r2EgdGFpIG7huqFuIGPDsyBz4buRIGNhIHThu60gdm9uZyBuaGnhu4F1IGjGoW4gMTAwIGNhIHbDoCB0YWkgbuG6oW4gY8OzIHPhu5EgY2EgdOG7rSB2b25nIMOtdCBoxqFuIDEwMCBjYSB0cm9uZyBuaOG7r25nIHRhaSBu4bqhbiB44bqjeSByYSBkbyBjb24gbmfGsOG7nWkuCgoqxJDhurd0IGdp4bqjIHRodXnhur90IEgwOiBU4bu3IGzhu4cgdGFpIG7huqFuIGPDsyBz4buRIGNhIHThu60gdm9uZyA+IDEwMCB2w6AgdOG7tyBs4buHIHRhaSBu4bqhbiBjw7Mgc+G7kSBjYSB04butIHZvbmcgPCAxMDAgY2EgdHJvbmcgbmjhu69uZyB0YWkgbuG6oW4gY8OzIG5ndXnDqm4gbmjDom4gdOG7qyBjb24gbmfGsOG7nWkgbMOgIGLhurFuZyBuaGF1KgoKYGBge3J9CnRoYXAgPC0gZGF0YVtkYXRhJGZhdGlsaXRpZXNfMSA9PSAnbG93JyxdCmNhbyA8LSBkYXRhW2RhdGEkZmF0aWxpdGllc18xID09ICdoaWdoJyxdCgpsb3dfaHVtYW4gPC0gdGhhcFt0aGFwJGNhdXNlXzEgPT0gJ2h1bWFuJyxdCmhpZ2hfaHVtYW4gPC0gY2FvW2NhbyRjYXVzZV8xID09ICdodW1hbicgLF0KCm0gPC0gYyhucm93KHRoYXApLCBucm93KGNhbykpCm0KYGBgCgpgYGB7cn0KbiA8LSBjKG5yb3cobG93X2h1bWFuKSwgbnJvdyhoaWdoX2h1bWFuKSkKbgpgYGAKCmBgYHtyfQpwcm9wLnRlc3QobixtKQpgYGAKS+G6v3QgcXXhuqMgxrDhu5tjIGzGsOG7o25nIGNobyB0aOG6pXkgcC12YWx1ZSA9IDAuMDA2MTYyIG5o4buPIGjGoW4gZ2nDoSB0cuG7iyAkXGFscGhhID0gMCwwNSQgCgotPiDEkOG7pyBjxqEgc+G7nyBiw6FjIGLhu48gSDAuIENobyB0aOG6pXkgxJHGsOG7o2MgdOG7tyBs4buHIHRhaSBu4bqhbiBjw7Mgc+G7kSBjYSB04butIHZvbmcgPiAxMDAgdsOgIHThu7cgbOG7hyB0YWkgbuG6oW4gY8OzIHPhu5EgY2EgdOG7rSB2b25nIDwgMTAwIGNhIHRyb25nIG5o4buvbmcgdGFpIG7huqFuIGPDsyBuZ3V5w6puIG5ow6JuIHThu6sgY29uIG5nxrDhu51pIGzDoCBraMO0bmcgYuG6sW5nIG5oYXUuCgojIFJlbGF0aXZlIFJpc2sgCgoqKkhhaSBiaeG6v24gcGjhu6UgdGh14buZYzogYmnhur9uIG5ndXnDqm4gbmjDom4gdsOgIGJp4bq/biBnaWFpIMSRb+G6oW4qKgoKYGBge3J9CmxpYnJhcnkoRGVzY1Rvb2xzKQpkYXRhMSA8LSB0YWJsZShkYXRhJGNhdXNlXzEsZGF0YSRwaGFzZV8xKQphZGRtYXJnaW5zKGRhdGExKQpSZWxSaXNrKGRhdGExKQpgYGAKCipL4bq/dCBxdeG6ozoqIFJSID4gMSBjaG8gdGjhuqV5IHRhaSBu4bqhbiB44bqjeSByYSB0cm9uZyBnaWFpIMSRb+G6oW4gY2h1eeG7g24gxJHhu5luZyBkbyBjb24gbmfGsOG7nWkgZ8OieSByYSBjw7MgbeG7qWMgxJHhu5kgcuG7p2kgcm8gY2FvIGjGoW4gY8OhYyB0YWkgbuG6oW4gdOG7qyBjw6FjIG5ndXnDqm4gbmjDom4ga2jDoWMuCgpgYGB7cn0KciA9IGdldE9wdGlvbigicmVwb3MiKQpyWyJDUkFOIl0gPSAiaHR0cDovL2NyYW4udXMuci1wcm9qZWN0Lm9yZyIKb3B0aW9ucyhyZXBvcyA9IHIpCmluc3RhbGwucGFja2FnZXMoImVwaXRvb2xzIikKbGlicmFyeShlcGl0b29scykKcmlza3JhdGlvKGRhdGExKQpgYGAKKkvhur90IHF14bqjKgoKVGFpIG7huqFuIG5ndXnDqm4gbmjDom4gZG8gY29uIG5nxrDhu51pIGPDsyB04bu3IHPhu5EgcuG7p2kgcm8gbMOgIDEuMDAwMDAwLCB0YWkgbuG6oW4gbcOheSBiw6F5IGRvIG5ndXnDqm4gbmjDom4ga2jDoWMgc+G7kSBy4bunaSBybyBsw6AgMS4yMDQxODEsIHbhu5tpIGtob+G6o25nIHRpbiBj4bqteSA5NSUgdOG7qyAwLjYyOTExNSDEkeG6v24gMi4zMDQ3NjIuCgrEkGnhu4F1IG7DoHkgY8OzIG5naMSpYSBsw6AgdGFpIG7huqFuIG5ndXnDqm4gbmjDom4ga2jDtG5nIHBo4bqjaSBkbyBjb24gbmfGsOG7nWkgY8OzIHThu7cgbOG7hyBraMO0bmcgeOG6o3kgcmEgY2FvIGjGoW4gMjAuNDE4JSBraGkgbcOheSBiYXkgY2h1eeG7g24gxJHhu5luZyB44bqjeSByYSB0YWkgbuG6oW4gZG8gY29uIG5nxrDhu51pIGfDonkgcmEuCgpHacOhIHRy4buLIHAudmFsdWUgbOG7m24gaMahbiAwLjA1LCBjaOG6pXAgbmjhuq1uIHZp4buHYyBjw7Mgc+G7sSBraMOhYyBiaeG7h3QgduG7gSB04bu3IGzhu4cgdGFpIG7huqFuIHjhuqN5IHJhIHRyb25nIGdpYWkgxJFv4bqhbiBjaHV54buDbiDEkeG7mW5nIG3DoXkgYmF5IGPhu6dhIDIgbmjDs20gbmd1ecOqbiBuaMOibiBsw6Aga2jDoWMgbmhhdS4KCmBgYHtyfQplcGl0YWIoZGF0YTEsIG1ldGhvZCA9ICdyaXNrcmF0aW8nLCByZXYgPSAnYycpCmBgYAoKYGBge3J9CnJpc2tyYXRpbyhkYXRhMSwgcmV2ID0gJ2MnKQpgYGAKKkvhur90IHF14bqjKgoKVGFpIG7huqFuIGtow7RuZyBkbyBjb24gbmfGsOG7nWkgZ8OieSByYSBjw7MgdOG7tyBz4buRIHLhu6dpIHJvIGzDoCAwLjk5MzgyNDIsIHbhu5tpIGtob+G6o25nIHRpbiBj4bqteSA5NSUgdOG7qyAwLjk3MDE4ODMgxJHhur9uIDEuMDE4MDM2LgoKxJBp4buBdSBuw6B5IGPDsyBuZ2jEqWEgbMOgIHRhaSBu4bqhbiBraMO0bmcgZG8gY29uIG5nxrDhu51pIGfDonkgcmEgY8OzIG5ndXkgY8ahIHjhuqN5IHJhIHRhaSBu4bqhbiBraGkgbcOheSBiYXkgxJHhu6luZyB5w6puIHRo4bqlcCBoxqFuIDAuNjE3NTglIHNvIHbhu5tpIHRhaSBu4bqhbiBkbyBjb24gbmfGsOG7nWkgZ8OieSByYS4KCkdpw6EgdHLhu4sgcCBs4bubbiBoxqFuIDAuMDUsIGNo4bqlcCBuaOG6rW4gdmnhu4djIGPDsyBz4buxIGtow6FjIGJp4buHdCB24buBIHThu7cgbOG7hyB0YWkgbuG6oW4geOG6o3kgcmEgdHJvbmcgZ2lhaSDEkW/huqFuIG3DoXkgYmF5IMSR4bupbmcgecOqbiBj4bunYSAyIG5ow7NtIG5ndXnDqm4gbmjDom4gbMOgIGtow6FjIG5oYXUuCgoqKktob+G6o25nIMaw4bubYyBsxrDhu6NuZyBjaG8gUmVsYXRpdmUgUmlzayoqCgpgYGB7cn0KdG1wIDwtIG1hdHJpeChjKDIyNyAsMjA1ICwzICw0KSxucm93ID0gMikKUmVsUmlzayh0bXAsIGNvbmYubGV2ZWwgPSAuOTUpCmBgYAoqS+G6v3QgcXXhuqMqCgrGr+G7m2MgbMaw4bujbmcgY2hvIFThu7cgbOG7hyBS4bunaSBybyBUxrDGoW5nIMSR4buRaSBnaeG7r2EgbmjDs20gbmd1ecOqbiBuaMOibiBkbyBjb24gbmfGsOG7nWkgdsOgIG5ow7NtIG5ndXnDqm4gbmjDom4ga2jDtG5nIGRvIGNvbiBuZ8aw4budaSBsw6Aga2hv4bqjbmcgMS4wMDYKCktob+G6o25nIHRpbiBj4bqteSA5NSUgY2hvIMaw4bubYyBsxrDhu6NuZyBuw6B5IGzDoCB04burIGtob+G6o25nIDAuOTggxJHhur9uIDEuMDQuIMSQaeG7gXUgbsOgeSBjaG8gcuG6sW5nIGPDsyA5NSUga2jhuqMgbsSDbmcgcuG6sW5nIGdpw6EgdHLhu4sgdGjhu7FjIHPhu7EgY+G7p2EgVOG7tyBs4buHIFLhu6dpIHJvIFTGsMahbmcgxJHhu5FpIG7hurFtIHRyb25nIGtob+G6o25nIHThu6sgMC45OCDEkeG6v24gMS4wNC4KCiMgT2RkIHJhdGlvIAoKYGBge3J9Ck9kZHNSYXRpbyhkYXRhMSkKYGBgCgpgYGB7cn0Kb2Rkc3JhdGlvKGRhdGExKQpgYGAKKkvhur90IHF14bqjKgoKT2RkcyBSYXRpbzogVOG7tyBs4buHIHRhaSBu4bqhbiB44bqjeSByYSBnaeG7r2EgdGFpIG7huqFuIGPDsyBuZ3V5w6puIG5ow6JuIHThu6sgY29uIG5nxrDhu51pIHbDoCB0YWkgbuG6oW4gY8OzIG5ndXnDqm4gbmjDom4ga2jDoWMgbMOgIDEuNDYKCgoKCgoKCiMjIFIgTWFya2Rvd24KCgpUaGlzIGlzIGFuIFIgTWFya2Rvd24gZG9jdW1lbnQuIE1hcmtkb3duIGlzIGEgc2ltcGxlIGZvcm1hdHRpbmcgc3ludGF4IGZvciBhdXRob3JpbmcgSFRNTCwgUERGLCBhbmQgTVMgV29yZCBkb2N1bWVudHMuIEZvciBtb3JlIGRldGFpbHMgb24gdXNpbmcgUiBNYXJrZG93biBzZWUgPGh0dHA6Ly9ybWFya2Rvd24ucnN0dWRpby5jb20+LgoKV2hlbiB5b3UgY2xpY2sgdGhlICoqS25pdCoqIGJ1dHRvbiBhIGRvY3VtZW50IHdpbGwgYmUgZ2VuZXJhdGVkIHRoYXQgaW5jbHVkZXMgYm90aCBjb250ZW50IGFzIHdlbGwgYXMgdGhlIG91dHB1dCBvZiBhbnkgZW1iZWRkZWQgUiBjb2RlIGNodW5rcyB3aXRoaW4gdGhlIGRvY3VtZW50LiBZb3UgY2FuIGVtYmVkIGFuIFIgY29kZSBjaHVuayBsaWtlIHRoaXM6CgpgYGB7ciBjYXJzfQpzdW1tYXJ5KGNhcnMpCmBgYAoKIyMgSW5jbHVkaW5nIFBsb3RzCgpZb3UgY2FuIGFsc28gZW1iZWQgcGxvdHMsIGZvciBleGFtcGxlOgoKYGBge3IgcHJlc3N1cmUsIGVjaG89RkFMU0V9CnBsb3QocHJlc3N1cmUpCmBgYAoKTm90ZSB0aGF0IHRoZSBgZWNobyA9IEZBTFNFYCBwYXJhbWV0ZXIgd2FzIGFkZGVkIHRvIHRoZSBjb2RlIGNodW5rIHRvIHByZXZlbnQgcHJpbnRpbmcgb2YgdGhlIFIgY29kZSB0aGF0IGdlbmVyYXRlZCB0aGUgcGxvdC4K