Phần 1: Tìm hiểu và chuẩn bị dữ liệu

library(tidyverse)
library(DT)
library(scales)
library(psych)
library(knitr)
library(kableExtra)

1.1 Đọc dữ liệu

Bộ dữ liệu Supermarket Transactions gồm 14059 quan sát, mỗi số liệu đại diện cho một giao dịch tại siêu thị. Dữ liệu bao gồm 16 cột với thông tin như sau: PurchaseDate (Ngày mua hàng), CustomerID (Mã khách hàng), Gender (Giới tính), MaritalStatus (Tình trạng hôn nhân), Homeowner (Tình trạng sở hữu nhà), Children (Số con), AnnualIncome (Thu nhập hàng năm), City (Thành phố), StateorProvince (Bang hoặc tỉnh), Country (Quốc gia), ProductFamily (Nhóm sản phẩm), ProductDepartment (Bộ phận sản phẩm), ProductCategory (Danh mục sản phẩm), UnitsSold (Số lượng bán ra), và Revenue (Doanh thu).

d<- read.csv("D:/HK2_PTDLDT_TMT/Supermarket Transactions.csv", header=T)
datatable(d,options = list(scrollX = TRUE))
names(d)
##  [1] "X"                 "PurchaseDate"      "CustomerID"       
##  [4] "Gender"            "MaritalStatus"     "Homeowner"        
##  [7] "Children"          "AnnualIncome"      "City"             
## [10] "StateorProvince"   "Country"           "ProductFamily"    
## [13] "ProductDepartment" "ProductCategory"   "UnitsSold"        
## [16] "Revenue"

Bộ dữ liệu với các biến định tính

Ta thực hiện tạo1 dataframe mới chỉ chứa các biến định tính, ta gán data mới này vào object với tên d_cat.

cat<- c("Gender", "MaritalStatus", "Homeowner", "AnnualIncome", "City", "StateorProvince", "Country", "ProductFamily", "ProductDepartment", "ProductCategory")
d_cat<-d[, cat]
datatable(d_cat,options = list(scrollX = TRUE))

1.2 Cấu trúc của dữ liệu

Để có cái nhìn tổng quan về cấu trúc của bộ dữ liệu, bao gồm số lượng quan sát, số lượng biến, kiểu dữ liệu của từng biến và một số giá trị điển hình, ta sử dụng hàm str() như sau:

str(d) #Cấu trúc trong dữ liệu
## 'data.frame':    14059 obs. of  16 variables:
##  $ X                : int  1 2 3 4 5 6 7 8 9 10 ...
##  $ PurchaseDate     : chr  "2007-12-18" "2007-12-20" "2007-12-21" "2007-12-21" ...
##  $ CustomerID       : int  7223 7841 8374 9619 1900 6696 9673 354 1293 7938 ...
##  $ Gender           : chr  "F" "M" "F" "M" ...
##  $ MaritalStatus    : chr  "S" "M" "M" "M" ...
##  $ Homeowner        : chr  "Y" "Y" "N" "Y" ...
##  $ Children         : int  2 5 2 3 3 3 2 2 3 1 ...
##  $ AnnualIncome     : chr  "$30K - $50K" "$70K - $90K" "$50K - $70K" "$30K - $50K" ...
##  $ City             : chr  "Los Angeles" "Los Angeles" "Bremerton" "Portland" ...
##  $ StateorProvince  : chr  "CA" "CA" "WA" "OR" ...
##  $ Country          : chr  "USA" "USA" "USA" "USA" ...
##  $ ProductFamily    : chr  "Food" "Food" "Food" "Food" ...
##  $ ProductDepartment: chr  "Snack Foods" "Produce" "Snack Foods" "Snacks" ...
##  $ ProductCategory  : chr  "Snack Foods" "Vegetables" "Snack Foods" "Candy" ...
##  $ UnitsSold        : int  5 5 3 4 4 3 4 6 1 2 ...
##  $ Revenue          : num  27.38 14.9 5.52 4.44 14 ...

Qua kết quả của hàm str(), ta thấy bộ dữ liệu bao gồm 14059 dòng dữ liệu tương ứng với các quan sát và 16 cột thông tin tương ứng với các biến. Mục đích của phân tích là sử dụng các phương pháp thống kê mô tả và thống kê suy diễn để tìm hiểu đặc điểm khách hàng và hành vi mua sắm của họ. Phân tích sẽ tập trung vào các biến định tính, bao gồm:

  • Gender: Giới tính (F – Nữ, M – Nam)

  • MaritalStatus: Tình trạng hôn nhân (S – Độc thân, M – Đã kết hôn)

  • Homeowner: Sở hữu nhà (Y – Có nhà, N – Không có nhà)

  • AnnualIncome: Thu nhập hàng năm (dạng phân loại theo khoảng)

  • City, StateorProvince, Country: Thông tin địa lý nơi cư trú của khách hàng

  • ProductFamily, ProductDepartment, ProductCategory: Các mức phân loại sản phẩm mà khách hàng đã mua

1.3 Hiển thị một vài dòng đầu và cuối của dữ liệu

Nhằm có được cái nhòn tổng quan vvềbooj dữ liệu ta sử dụng hàm head() và taid() để xem một số dòng đầu và dòng cuối của bộ dữ liệu Supermarket Transactions:

head(d) #hiển thị vài dòng đầu
##   X PurchaseDate CustomerID Gender MaritalStatus Homeowner Children
## 1 1   2007-12-18       7223      F             S         Y        2
## 2 2   2007-12-20       7841      M             M         Y        5
## 3 3   2007-12-21       8374      F             M         N        2
## 4 4   2007-12-21       9619      M             M         Y        3
## 5 5   2007-12-22       1900      F             S         Y        3
## 6 6   2007-12-22       6696      F             M         Y        3
##    AnnualIncome          City StateorProvince Country ProductFamily
## 1   $30K - $50K   Los Angeles              CA     USA          Food
## 2   $70K - $90K   Los Angeles              CA     USA          Food
## 3   $50K - $70K     Bremerton              WA     USA          Food
## 4   $30K - $50K      Portland              OR     USA          Food
## 5 $130K - $150K Beverly Hills              CA     USA         Drink
## 6   $10K - $30K Beverly Hills              CA     USA          Food
##   ProductDepartment      ProductCategory UnitsSold Revenue
## 1       Snack Foods          Snack Foods         5   27.38
## 2           Produce           Vegetables         5   14.90
## 3       Snack Foods          Snack Foods         3    5.52
## 4            Snacks                Candy         4    4.44
## 5         Beverages Carbonated Beverages         4   14.00
## 6              Deli          Side Dishes         3    4.37
tail(d) #hiển thị vào dòng cuối 
##           X PurchaseDate CustomerID Gender MaritalStatus Homeowner Children
## 14054 14054   2009-12-29       2032      F             M         N        3
## 14055 14055   2009-12-29       9102      F             M         Y        2
## 14056 14056   2009-12-29       4822      F             M         Y        3
## 14057 14057   2009-12-31        250      M             S         Y        1
## 14058 14058   2009-12-31       6153      F             S         N        4
## 14059 14059   2009-12-31       3656      M             S         N        3
##       AnnualIncome        City StateorProvince Country  ProductFamily
## 14054  $10K - $30K      Yakima              WA     USA Non-Consumable
## 14055  $10K - $30K   Bremerton              WA     USA           Food
## 14056  $10K - $30K Walla Walla              WA     USA           Food
## 14057  $30K - $50K    Portland              OR     USA          Drink
## 14058  $50K - $70K     Spokane              WA     USA          Drink
## 14059  $50K - $70K    Portland              OR     USA Non-Consumable
##       ProductDepartment      ProductCategory UnitsSold Revenue
## 14054         Household       Paper Products         5   14.50
## 14055      Baking Goods         Baking Goods         3    9.64
## 14056      Frozen Foods           Vegetables         3    7.45
## 14057         Beverages Pure Juice Beverages         4    3.24
## 14058             Dairy                Dairy         2    4.00
## 14059         Household           Electrical         5   25.53

1.4 Kiểm tra giá trị thiếu

Nhằm đảm bảo chất lượng dữ liệu và tránh sai lệch trong quá trình phân tích, ta cần kiểm tra xem bộ dữ liệu có chứa giá trị thiếu (NA) hay không. Điều này giúp xác định liệu có cần xử lý hoặc làm sạch dữ liệu trước khi tiếp tục phân tích:

if (any(is.na(d))) {
  cat("Có giá trị thiếu trong dữ liệu.\n")
} else {
  cat("Không có giá trị thiếu trong dữ liệu.\n")
}
## Không có giá trị thiếu trong dữ liệu.

Với đoạn code trên nếu trong bộ dữ liệu có bất kì ddữlieuej nnàobij thiếu tthìkeets quả sẽ nhận được là có giá trị thiếu trong dữ liệu và ngược lại.

Với bộ dữ liệu được gán cho d nhận được kết quả là Không có giá trị thiếu trong dữ liệu. Điều này cho thấy dữ liệu không có ô trống hay giá trị bị thiếu trong toàn bộ bộ dữ liệu. Đây là điều kiện để tiến hành các phân tích tiếp theo mà không cần thực hiện bước xử lý giá trị thiếu.

1.5 Chuyển đổi các biến định tính sang kiểu factor

Sau khi tìm hiểu sơ bộ về bộ dữ liệu, bước tiếp theo là chuyển các biến định tính sang kiểu dữ liệu factor. Việc này giúp các công cụ phân tích trong R hiểu rõ hơn về bản chất phân loại của các biến này, đồng thời hỗ trợ thực hiện các phân tích thống kê phù hợp.

d[cat] <- lapply(d_cat, factor) #Đưa dữ liệu về dạng factor
factor_check<-sapply(d[cat], is.factor) # Kiểm tra từng cột có phải là factor hay không

# Tạo bảng kết quả
factor_table <- data.frame(
  Biến = names(factor_check),
  Factor = as.logical(factor_check)
)

# Hiển thị bảng căn giữa
kable(factor_table, caption = "Kiểm tra kiểu Factor cho các biến định tính", align = "c") %>%
kable_styling(position = "center", full_width = FALSE)
Kiểm tra kiểu Factor cho các biến định tính
Biến Factor
Gender TRUE
MaritalStatus TRUE
Homeowner TRUE
AnnualIncome TRUE
City TRUE
StateorProvince TRUE
Country TRUE
ProductFamily TRUE
ProductDepartment TRUE
ProductCategory TRUE

Trong bảng trên ta nhận thấy các biến định tính đều đưa ra kết quả là TRUE tức là đều đã được chuyển đổi thành công sang kiểu dữ liệu factor.

Phần 2: Phân tích mô tả biến định tính (Univariate Descriptive Analysis)

2.1 Biến Gender

Thống kê tần suất

Ta thực hiện thống kê tần số và tần suất cho biến Gender được kết quả như sau

Gender_1<-table(d_cat$Gender)
Gender_1
## 
##    F    M 
## 7170 6889
Gender_2<-table(d_cat$Gender)/sum(nrow(d_cat))*100 #tần suất
Gender_2
## 
##        F        M 
## 50.99936 49.00064

Trực quan hóa dữ liệu

c <- as.data.frame(table(d_cat$Gender))
colnames(c) <- c("Gender", "Count")
ggplot(c, aes(x = Gender, y = Count, fill = Gender)) +
  geom_bar(stat = "identity") +
  labs(title = "Biểu đồ biểu thị giới tính khách hàng", x = "Giới tính", y = "Số lượng") +
  theme_minimal() +  
  theme(text = element_text(family = "sans"))

pie(Gender_2,
labels = paste(names(Gender_2), round(Gender_2, 2), "%"),
main = "Tỷ lệ giới tính")

Nhận xét

  • Biểu đồ thể hiện số lượng khách hàng theo giới tính gồm hai nhóm: F (nữ) và M (nam).

  • Số lượng khách hàng nữ (F) nhỉnh hơn so với khách hàng nam (M), tuy nhiên sự chênh lệch không lớn cho thấy siêu thị thu hút khách hàng từ cả hai nhóm giới tính.Điều này cho thấy dữ liệu có tính đại diện giới tương đối tốt, tránh được thiên lệch giới tính.

2.2 Biến MaritalStatus

Thống kê tần suất

Ta thực hiện thống kê tần số và tần suất cho biến MaritalStatus được kết quả như sau:

MaritalStatusr_1<-table(d_cat$MaritalStatus)
MaritalStatusr_1
## 
##    M    S 
## 6866 7193
MaritalStatus_2<-table(d_cat$MaritalStatus)/sum(nrow(d_cat))*100 
MaritalStatus_2
## 
##        M        S 
## 48.83704 51.16296

Trực quan hóa dữ liệu

c1 <- as.data.frame(table(d_cat$MaritalStatus))
colnames(c1) <- c("MaritalStatus", "Count")
ggplot(c1, aes(x = MaritalStatus, y = Count, fill = MaritalStatus)) +
geom_bar(stat = "identity") +
labs(title = "Biểu đồ biểu thị tình trạng hôn nhân khách hàng", x = "Tinh trạng hôn nhân", y = "Số lượng") +
theme_minimal()

Nhận xét

Kết quả cho thấy biến MaritalStatus có trạng thái hôn nhân độc thân (S) chiếm tỷ lệ cao hơn một chút với 51.16% tổng thể, tương ứng 7193 người. Trong khi đó, nhóm đã kết hôn (M) chiếm 48.84%, tương ứng 6866 người. Như vậy, dân số trong mẫu được phân bố tương đối đều giữa hai nhóm độc thân và đã kết hôn, với số người độc thân nhỉnh hơn một chút. Điều này giúp cân bằng trong các phân tích liên quan đến trạng thái hôn nhân.

2.3 Biến Homeowner

Thống kê tần suất

Ta thực hiện thống kê tần số và tần suất cho biến Homeowner được kết quả như sau:

Homeowner_1<-table(d_cat$Homeowner)
Homeowner_1
## 
##    N    Y 
## 5615 8444
Homeowner_2<-table(d_cat$Homeowner)/sum(nrow(d_cat))*100#tần suất
Homeowner_2
## 
##        N        Y 
## 39.93883 60.06117

Trực quan hóa dữ liệu

pie(Homeowner_2,
labels = paste(names(Homeowner_2), round(Homeowner_2, 2), "%"),
main = "Tỷ lệ có hoặc không sở hữu nhà")

Nhận xét

Dựa vào kết quả thống kê, trong tổng số quan sát, có 8,444 người là chủ sở hữu nhà (Homeowner = Y) chiếm khoảng 60.06% tổng thể, trong khi 5,615 người không phải là chủ sở hữu nhà chiếm khoảng 39.94%. Điều này cho thấy đa số khách hàng trong dữ liệu là những người sở hữu nhà, điều này có thể ảnh hưởng tích cực đến hành vi tiêu dùng hoặc khả năng chi trả của họ trong các phân tích tiếp theo.

2.4 Biến AnnualIncome

Thống kê tần suất

Ta thực hiện thống kê tần số và tần suất cho biến AnnualIncome được kết quả như sau:

AnnualIncome_1<-table(d_cat$AnnualIncome)
AnnualIncome_1
## 
##   $10K - $30K $110K - $130K $130K - $150K       $150K +   $30K - $50K 
##          3090           643           760           273          4601 
##   $50K - $70K   $70K - $90K  $90K - $110K 
##          2370          1709           613
AnnualIncome_2<-table(d_cat$AnnualIncome)/sum(nrow(d_cat))*100#tần suất
AnnualIncome_2
## 
##   $10K - $30K $110K - $130K $130K - $150K       $150K +   $30K - $50K 
##     21.978804      4.573583      5.405790      1.941817     32.726367 
##   $50K - $70K   $70K - $90K  $90K - $110K 
##     16.857529     12.155914      4.360196

Trực quan hóa dữ liệu

c4_1 <- d_cat |>
  group_by(AnnualIncome) |>
  summarise(freq = n()) |>
  mutate(per = freq / sum(freq),
         label = paste0(freq, " (", round(per * 100, 1), "%)"))

ggplot(c4_1 , aes(x = "", y = per, fill = AnnualIncome)) +
  geom_col(width = 1, color = "white") +
  coord_polar("y") +
  geom_text(aes(label = paste0(round(per*100, 2), "%")),
            position = position_stack(vjust = 0.5),
            size = 2.5) +
  scale_fill_brewer(palette = "Pastel2") +  # Bạn có thể chọn Set1, Set2...
  labs(title = "Tỷ lệ thu nhập hằng năm của khách hàng", fill = "Thu nhập") +
  theme_void()

Nhận xét

Nhóm thu nhập $30K - $50K chiếm hơn 1/3 tổng số quan sát với 32.73%, là nhóm đông nhất trong dữ liệu. Khi kết hợp với nhóm $10K - $30K, tổng tỷ lệ lên đến khoảng 55%, cho thấy đa số khách hàng thuộc nhóm có thu nhập trung bình hoặc thấp, phản ánh mức thu nhập phổ biến trong mẫu. Ngược lại, nhóm thu nhập cao trên $90K, bao gồm các khoảng $90K - $110K, $110K - $130K, $130K - $150K và $150K+, chỉ chiếm khoảng 16.28% tổng số, thể hiện nhóm thu nhập cao tương đối nhỏ. Kết quả này cho thấy phần lớn các đơn mua hàng được thực hiện bởi khách hàng có mức thu nhập trung bình hoặc thấp.

2.5 Biến City

Thống kê tần suất

Ta thực hiện thống kê tần số và tần suất cho biến City được kết quả như sau:

City_1<-table(d$City)
City_1
## 
##      Acapulco    Bellingham Beverly Hills     Bremerton       Camacho 
##           383           143           811           834           452 
##   Guadalajara       Hidalgo   Los Angeles        Merida   Mexico City 
##            75           845           926           654           194 
##       Orizaba      Portland         Salem    San Andres     San Diego 
##           464           876          1386           621           866 
## San Francisco       Seattle       Spokane        Tacoma     Vancouver 
##           130           922           875          1257           633 
##      Victoria   Walla Walla        Yakima 
##           176           160           376
City_2<-table(d$City)/sum(nrow(d))*100#tần suất
City_2
## 
##      Acapulco    Bellingham Beverly Hills     Bremerton       Camacho 
##     2.7242336     1.0171420     5.7685468     5.9321431     3.2150224 
##   Guadalajara       Hidalgo   Los Angeles        Merida   Mexico City 
##     0.5334661     6.0103848     6.5865282     4.6518245     1.3798990 
##       Orizaba      Portland         Salem    San Andres     San Diego 
##     3.3003770     6.2308841     9.8584537     4.4170994     6.1597553 
## San Francisco       Seattle       Spokane        Tacoma     Vancouver 
##     0.9246746     6.5580767     6.2237712     8.9408920     4.5024539 
##      Victoria   Walla Walla        Yakima 
##     1.2518671     1.1380610     2.6744434

Trực quan hóa dữ liệu

c5 <- as.data.frame(City_1)
colnames(c5) <- c("City", "Count")
ggplot(c5, aes(x = City, y = Count, fill = City)) +
  geom_col(fill = "lightgreen", color = "black") +
  labs(x = "Thành phố", y = "Tần số", title = "Biểu đồ tần số khách hàng ở các thành phố") +
  theme(axis.text.x = element_text(angle = 45, hjust = 1))

Nhận xét

Dựa trên dữ liệu, địa điểm Salem có tần số cao nhất với 1386 với 9.86% tổng thể, tiếp theo là Tacoma và Los Angeles cũng có chỉ số rất lớn, lần lượt nằm trong nhóm cao nhì. Ngược lại, các thành phố như Mexico City, Guadalajara và San Francisco có số lượng khách thấp nhất, cho thấy sự khác biệt rõ rệt về mức độ hoặc chỉ số giữa các khu vực. Nhìn chung, có sự phân bố không đồng đều của các các thành phố.

2.6 Biến StateorProvince

Thống kê tần suất

Ta thực hiện thống kê tần số và tần suất cho biến StateorProvince được kết quả như sau:

StateorProvince_1<- table(d_cat$StateorProvince)
StateorProvince_1
## 
##        BC        CA        DF  Guerrero   Jalisco        OR  Veracruz        WA 
##       809      2733       815       383        75      2262       464      4567 
##   Yucatan Zacatecas 
##       654      1297
StateorProvince_2<-table(d_cat$StateorProvince)/sum(nrow(d_cat))*100 #tần suất
StateorProvince_2
## 
##         BC         CA         DF   Guerrero    Jalisco         OR   Veracruz 
##  5.7543211 19.4395049  5.7969984  2.7242336  0.5334661 16.0893378  3.3003770 
##         WA    Yucatan  Zacatecas 
## 32.4845295  4.6518245  9.2254072

Trực quan hóa dữ liệu

c6 <- as.data.frame(StateorProvince_1)
colnames(c6) <- c("StateorProvince", "Count")
ggplot(c6, aes(x = StateorProvince, y = Count, fill = City)) +
  geom_col(fill = "skyblue", color = "black") +
  labs(x = "Bang", y = "Tần số", title = "Biểu đồ tần số khách hàng ở các bang") +
  theme(axis.text.x = element_text(angle = 45, hjust = 1))

c6_1 <- d_cat |>
  group_by(StateorProvince) |>
  summarise(freq = n()) |>
  mutate(per = freq / sum(freq),
         label = paste0(freq, " (", round(per * 100, 1), "%)"))

ggplot(c6_1 , aes(x = "", y = per, fill = StateorProvince)) +
  geom_col(width = 1, color = "white") +
  coord_polar("y") +
  geom_text(aes(label = paste0(round(per*100, 2), "%")),
            position = position_stack(vjust = 0.5),
            size = 2.5) +
  scale_fill_brewer(palette = "Pastel1") +  # Bạn có thể chọn Set1, Set2...
  labs(title = "Tỷ lệ mua hàng ở các ban", fill = "Bang") +
  theme_void()

Nhận xét

Dữ liệu này cho thấy sự phân bố địa lý rất rõ ràng, với ba bang WA (Washington), CA (California) và OR (Oregon) thống trị tuyệt đối – lần lượt chiếm 32.48%, 19.44% và 16.09%. Ba bang này, đều nằm ở khu vực Tây Bắc Thái Bình Dương của Hoa Kỳ, cộng lại chiếm tới 68.01% tổng dữ liệu.

Trong khi đó, các bang của Mexico như DF, Guerrero, Jalisco, Veracruz, Yucatan và Zacatecas chỉ chiếm tỷ trọng nhỏ hơn, tổng cộng chỉ chiếm khoảng 26.23% dữ liệu.

Như vậy, dữ liệu cho thấy sự thiên lệch mạnh mẽ về mặt địa lý, chủ yếu tập trung vào ba bang phía Tây Bắc Hoa Kỳ, trong khi các tỉnh của Mexico chỉ góp phần khiêm tốn.

2.7 Biến Country

Thống kê tần suất

Ta thực hiện thống kê tần số và tần suất cho biến Country được kết quả như sau:

Country_1<- table(d_cat$Country)
Country_1
## 
## Canada Mexico    USA 
##    809   3688   9562
Country_2<-table(d_cat$Country)/sum(nrow(d_cat))*100
Country_2
## 
##    Canada    Mexico       USA 
##  5.754321 26.232307 68.013372

Trực quan hóa dữ liệu

c7 <- as.data.frame(Country_1)
colnames(c7) <- c("Country", "Count")
ggplot(c7, aes(x = Country, y = Count, fill = Country)) +
  geom_col(fill = "#07575B", color = "black") +
  labs(x = "Quốc gia", y = "Tần số", title = "Biểu đồ tần số khách hàng ở các quốc gia") +
  theme(axis.text.x = element_text(angle = 0, hjust = 1))

c7_1 <- d_cat |>
  group_by(Country) |>
  summarise(freq = n()) |>
  mutate(per = freq / sum(freq),
         label = paste0(freq, " (", round(per * 100, 1), "%)"))

ggplot(c7_1 , aes(x = "", y = per, fill = Country)) +
  geom_col(width = 1, color = "white") +
  coord_polar("y") +
  geom_text(aes(label = paste0(round(per*100, 2), "%")),
            position = position_stack(vjust = 0.5),
            size = 2.5) +
  scale_fill_brewer(palette = "Spectral") +  # Bạn có thể chọn Set1, Set2...
  labs(title = "Tỷ lệ ở các quốc gia", fill = "Quốc gia") +
  theme_void()

Nhận xét

Kết quả tần số cho biến Country cho thấy rằng phần lớn khách hàng (68%) đến từ Mỹ (USA), trong khi Canada và Mexico chiếm tỷ lệ lần lượt là khoảng 5.75% và 26.23%. Điều này cho thấy sự phân bổ không đồng đều của dữ liệu giữa ba quốc gia, với Mỹ là thị trường trọng tâm.

2.8 Biến ProductFamily

Thống kê tần suất

Ta thực hiện thống kê tần số và tần suất cho biến ProductFamily được kết quả như sau:

ProductFamily_1<- table(d_cat$ProductFamily)
ProductFamily_1
## 
##          Drink           Food Non-Consumable 
##           1250          10153           2656
ProductFamily_2<-table(d_cat$ProductFamily)/sum(nrow(d_cat))*100
ProductFamily_2
## 
##          Drink           Food Non-Consumable 
##       8.891102      72.217085      18.891813

Trực quan hóa dữ liệu

c8 <- as.data.frame(ProductFamily_1)
colnames(c8) <- c("ProductFamily", "Count")
ggplot(c8, aes(x = ProductFamily, y = Count, fill = ProductFamily)) +
  geom_col(fill = "lightpink", color = "black") +
  labs(x = "Sản phẩm gia đình", y = "Tần số", title = "Biểu đồ biểu thị nhóm sản phẩm khách hàng mua") +
  theme(axis.text.x = element_text(angle = 0, hjust = 1))

Nhận xét

Kết quả tần số cho thấy nhóm thực phẩm (Food) chiếm áp đảo với hơn 72% tổng số mặt hàng, trong khi đồ uống (Drink) chỉ chiếm gần 9% và các mặt hàng phi thực phẩm (Non-Consumable) chiếm khoảng 19%. Sự chênh lệch này phản ánh rõ tầm quan trọng và nhu cầu cao của thực phẩm trong danh sách mua sắm hàng ngày, so với các loại đồ uống và sản phẩm phi thực phẩm khác.

2.9 Biến ProductDepartment

Thống kê tần suất

Ta thực hiện thống kê tần số và tần suất cho biến ProductDepartment được kết quả như sau:

ProductDepartment_1<- table(d_cat$ProductDepartment)
ProductDepartment_1
## 
## Alcoholic Beverages         Baked Goods        Baking Goods           Beverages 
##                 356                 425                1072                 680 
##     Breakfast Foods        Canned Foods     Canned Products            Carousel 
##                 188                 977                 109                  59 
##            Checkout               Dairy                Deli                Eggs 
##                  82                 903                 699                 198 
##        Frozen Foods  Health and Hygiene           Household                Meat 
##                1382                 893                1420                  89 
##         Periodicals             Produce             Seafood         Snack Foods 
##                 202                1994                 102                1600 
##              Snacks       Starchy Foods 
##                 352                 277
ProductDepartment_2<-table(d_cat$ProductDepartment)/sum(nrow(d_cat))*100
ProductDepartment_2
## 
## Alcoholic Beverages         Baked Goods        Baking Goods           Beverages 
##           2.5321858           3.0229746           7.6250089           4.8367594 
##     Breakfast Foods        Canned Foods     Canned Products            Carousel 
##           1.3372217           6.9492852           0.7753041           0.4196600 
##            Checkout               Dairy                Deli                Eggs 
##           0.5832563           6.4229319           4.9719041           1.4083505 
##        Frozen Foods  Health and Hygiene           Household                Meat 
##           9.8300021           6.3518031          10.1002916           0.6330464 
##         Periodicals             Produce             Seafood         Snack Foods 
##           1.4368020          14.1830856           0.7255139          11.3806103 
##              Snacks       Starchy Foods 
##           2.5037343           1.9702682

Trực quan hóa dữ liệu

c9 <- as.data.frame(ProductDepartment_1)
colnames(c9) <- c("ProductDepartment", "Count")
ggplot(c9, aes(x = ProductDepartment, y = Count, fill = ProductDepartment)) +
  geom_col(fill = "lightpink", color = "black") +
  labs(x = "Sản phẩm", y = "Tần số", title = "Bộ phận sản phẩm khách hàng mua") +
  theme(axis.text.x = element_text(angle = 45, hjust = 1))

Nhận xét

Dữ liệu cho thấy sự phân bổ rõ rệt trong thói quen mua sắm: các mặt hàng tươi sống và đồ gia dụng chiếm phần lớn, với Produce (14.18%) và Household (10.1%) cộng lại gần 25% tổng số mặt hàng. Điều này phản ánh sự ưu tiên tiêu dùng các sản phẩm thiết yếu hàng ngày.

Ngược lại, sự thiếu cân đối thể hiện ở các nhóm như Meat và Seafood, khi chỉ chiếm chưa tới 1% tổng số mặt hàng, cho thấy nhu cầu của các mặt hàng này ít hơn đáng kể so với các nhóm khác. Điều này có thể xuất phát từ thói quen ăn uống hoặc đặc điểm nguồn cung cấp của cửa hàng.

2.10 Biến ProductCategory

Thống tần suất

Ta thực hiện thống kê tần số và tần suất cho biến ProductCategory được kết quả như sau:

ProductCategory_1<- table(d_cat$ProductCategory)
ProductCategory_1
## 
##         Baking Goods    Bathroom Products        Beer and Wine 
##                  484                  365                  356 
##                Bread      Breakfast Foods              Candles 
##                  425                  417                   45 
##                Candy     Canned Anchovies         Canned Clams 
##                  352                   44                   53 
##       Canned Oysters      Canned Sardines        Canned Shrimp 
##                   35                   40                   38 
##          Canned Soup          Canned Tuna Carbonated Beverages 
##                  404                   87                  154 
##    Cleaning Supplies        Cold Remedies                Dairy 
##                  189                   93                  903 
##        Decongestants               Drinks                 Eggs 
##                   85                  135                  198 
##           Electrical      Frozen Desserts       Frozen Entrees 
##                  355                  323                  118 
##                Fruit             Hardware        Hot Beverages 
##                  765                  129                  226 
##              Hygiene     Jams and Jellies     Kitchen Products 
##                  197                  588                  217 
##            Magazines                 Meat        Miscellaneous 
##                  202                  761                   42 
##  Packaged Vegetables       Pain Relievers       Paper Products 
##                   48                  192                  345 
##                Pizza     Plastic Products Pure Juice Beverages 
##                  194                  141                  165 
##              Seafood          Side Dishes          Snack Foods 
##                  102                  153                 1600 
##            Specialty        Starchy Foods           Vegetables 
##                  289                  277                 1728
ProductCategory_2<-table(d_cat$ProductCategory)/sum(nrow(d_cat))*100
ProductCategory_2
## 
##         Baking Goods    Bathroom Products        Beer and Wine 
##            3.4426346            2.5962017            2.5321858 
##                Bread      Breakfast Foods              Candles 
##            3.0229746            2.9660716            0.3200797 
##                Candy     Canned Anchovies         Canned Clams 
##            2.5037343            0.3129668            0.3769827 
##       Canned Oysters      Canned Sardines        Canned Shrimp 
##            0.2489508            0.2845153            0.2702895 
##          Canned Soup          Canned Tuna Carbonated Beverages 
##            2.8736041            0.6188207            1.0953837 
##    Cleaning Supplies        Cold Remedies                Dairy 
##            1.3443346            0.6614980            6.4229319 
##        Decongestants               Drinks                 Eggs 
##            0.6045949            0.9602390            1.4083505 
##           Electrical      Frozen Desserts       Frozen Entrees 
##            2.5250729            2.2974607            0.8393200 
##                Fruit             Hardware        Hot Beverages 
##            5.4413543            0.9175617            1.6075112 
##              Hygiene     Jams and Jellies     Kitchen Products 
##            1.4012376            4.1823743            1.5434953 
##            Magazines                 Meat        Miscellaneous 
##            1.4368020            5.4129028            0.2987410 
##  Packaged Vegetables       Pain Relievers       Paper Products 
##            0.3414183            1.3656732            2.4539441 
##                Pizza     Plastic Products Pure Juice Beverages 
##            1.3798990            1.0029163            1.1736254 
##              Seafood          Side Dishes          Snack Foods 
##            0.7255139            1.0882709           11.3806103 
##            Specialty        Starchy Foods           Vegetables 
##            2.0556227            1.9702682           12.2910591

Trực quan hóa dữ liệu

c10 <- as.data.frame(ProductCategory_1)
colnames(c10) <- c("ProductCategory", "Count")

ggplot(c10, aes(x = ProductCategory, y = Count, fill = ProductCategory)) +
  geom_col(fill = "lightblue", color = "black") +
  labs(x = "Sản phẩm", y = "Tần số", title = "Danh mục sản phẩm khách hàng mua") +
  theme(axis.text.x = element_text(angle = 45, hjust = 1))

Nhận xét

Dữ liệu tần số của các danh mục sản phẩm cho thấy rằng các mặt hàng thiết yếu và phổ biến nhất như rau củ (1.728), đồ ăn vặt (1.600), sữa (903), trái cây (765) và thịt (761) có tần suất cao nhất. Điều này phản ánh nhu cầu sử dụng hằng ngày của các gia đình. Ngược lại, các sản phẩm như cá cơm đóng hộp (44), hàu đóng hộp (35), tôm đóng hộp (38) và nến (45) lại có tần suất thấp nhất, cho thấy đây là những mặt hàng ít phổ biến hoặc chỉ được sử dụng trong những trường hợp nhất định. Tóm lại, sự phân bố tần số này phản ánh rõ ràng xu hướng tiêu dùng và mức độ phổ biến của từng loại sản phẩm.

Phần 3: Ước lượng khoảng và kiểm định giả thuyết cho tỷ lệ

3.1 Biến Gender

Xác định hạng mục quan tâm

Hạng mục được quan tâm ở đây là giới tính nữ (Female) trong biến giới tính (Gender).

x1 <- sum(d_cat$Gender == "F")     # Số lượng Female
n1<- length(d_cat$Gender)              # Tổng số mẫu

Ước lượng Khoảng Tin cậy

Ta ước lượng khoảng tin cậy 95% cho tỷ lệ nữ trong tổng thể bằng:

prop.test(x1, n1, conf.level = 0.95)
## 
##  1-sample proportions test with continuity correction
## 
## data:  x1 out of n1, null probability 0.5
## X-squared = 5.5765, df = 1, p-value = 0.0182
## alternative hypothesis: true p is not equal to 0.5
## 95 percent confidence interval:
##  0.5016931 0.5182886
## sample estimates:
##         p 
## 0.5099936

Kết quả nhận được với mức tin cậy 95%, tỷ lệ của giới tính nữ của tổng thể nằm trong khoảng [50.17%, 51.83%].

Kiểm định giả thuyết

Giả thuyết:

\[ \left\{ \begin{array}{ll} H_0: & \text{Tỷ lệ nữ trong tổng thể là bằng 50%} \\\\ H_1: & \text{Tỷ lệ nữ trong tổng thể là khác 50%} \ \end{array} \right. \]

prop.test(x1, n1, p = 0.5, alternative = "two.sided")
## 
##  1-sample proportions test with continuity correction
## 
## data:  x1 out of n1, null probability 0.5
## X-squared = 5.5765, df = 1, p-value = 0.0182
## alternative hypothesis: true p is not equal to 0.5
## 95 percent confidence interval:
##  0.5016931 0.5182886
## sample estimates:
##         p 
## 0.5099936

Với mức ý nghĩa 5% p_value = 2.2e-16 < 0.05, ta bác bỏ giả thuyết không (\(H_0\)).Như vậy, có bằng chứng thống kê cho thấy tỷ lệ khách hàng nữ khác 50% trong tổng thể.

3.2 Biến Homeowner

Xác định hạng mục quan tâm

Hạng mục được quan tâm ở đây là việc có sở hữu nhà (Y) trong biến sở hữu nhà (Homeowner).

x2 <- sum(d_cat$Homeowner == "Y")     
n2 <- length(d_cat$Homeowner)              

Ước lượng Khoảng Tin cậy và kiểm định giả thuyết

Ta ước lượng khoảng tin cậy 95% cho tỷ lệ nữ trong tổng thể bằng:

prop.test(x2, n2, conf.level = 0.95)
## 
##  1-sample proportions test with continuity correction
## 
## data:  x2 out of n2, null probability 0.5
## X-squared = 568.86, df = 1, p-value < 2.2e-16
## alternative hypothesis: true p is not equal to 0.5
## 95 percent confidence interval:
##  0.5924537 0.6087145
## sample estimates:
##         p 
## 0.6006117

Kết quả nhận được với mức tin cậy 95%, tỷ lệ sở hữu nhà của tổng thể nằm trong khoảng [59.25%, 60.87%].

Kiểm định giả thuyết

Giả thuyết:

\[ \left\{ \begin{array}{ll} H_0: & \text{Tỷ lệ sở hữu nhà trong tổng thể là bằng 50%} \\\\ H_1: & \text{Tỷ lệ sở hữu nhà trong tổng thể là khác 50%} \ \end{array} \right. \]

prop.test(x2, n2, p = 0.5, alternative = "two.sided", conf.level = 0.95)
## 
##  1-sample proportions test with continuity correction
## 
## data:  x2 out of n2, null probability 0.5
## X-squared = 568.86, df = 1, p-value < 2.2e-16
## alternative hypothesis: true p is not equal to 0.5
## 95 percent confidence interval:
##  0.5924537 0.6087145
## sample estimates:
##         p 
## 0.6006117

Với mức ý nghĩa 5% p_value = 0.8891 > 0.05, ta bác bỏ giả thuyết không (\(H_0\)). Như vậy, có bằng chứng thống kê cho thấy tỷ lệ sở hữu nhà khác 50% trong tổng thể.

3.3 Biến ProductFamily

Xác định hạng mục quan tâm

Hạng mục được quan tâm ở đây là nhóm thức ăn (Food) trong biến sở hữu nhà (ProductFamily).

x3 <- sum(d_cat$ProductFamily == "Food")     # Số lượng Female
n3 <- length(d_cat$ProductFamil)              # Tổng số mẫu

Ước lượng Khoảng Tin cậy

Ta ước lượng khoảng tin cậy 95% cho tỷ lệ nữ trong tổng thể bằng:

prop.test(x3, n3, conf.level = 0.95)
## 
##  1-sample proportions test with continuity correction
## 
## data:  x3 out of n3, null probability 0.5
## X-squared = 2774.9, df = 1, p-value < 2.2e-16
## alternative hypothesis: true p is not equal to 0.5
## 95 percent confidence interval:
##  0.7146709 0.7295489
## sample estimates:
##         p 
## 0.7221709

Kết quả nhận được với mức tin cậy 95%, tỷ lệ nhóm Food của tổng thể nằm trong khoảng [71.47%, 72.95%]

kiểm định giả thuyết

Giả thuyết:

\[ \left\{ \begin{array}{ll} H_0: & \text{Tỷ lệ nhóm Food trong tổng thể là bằng 50%} \\\\ H_1: & \text{Tỷ lệ nhóm Food trong tổng thể là khác 50%} \ \end{array} \right. \]

prop.test(x3, n3, p = 0.5, alternative = "two.sided", conf.level = 0.95)
## 
##  1-sample proportions test with continuity correction
## 
## data:  x3 out of n3, null probability 0.5
## X-squared = 2774.9, df = 1, p-value < 2.2e-16
## alternative hypothesis: true p is not equal to 0.5
## 95 percent confidence interval:
##  0.7146709 0.7295489
## sample estimates:
##         p 
## 0.7221709

Với mức ý nghĩa 5% p_value = 2.2e-16 < 0.05, ta bác bỏ giả thuyết không (\(H_0\)). Như vậy, có bằng chứng thống kê cho thấy tỷ lệ nhóm Food khác 50% trong tổng thể.

Bảng tổng hợp kết quả trên

Kết quả kiểm định giả thuyết về tỷ lệ
Biến Hạng_mục Tỷ_lệ_quan_sát CI_95 H_0 p_value Kết_luận
Gender Female 0.50999 [ 0.5017, 0.5183] p = 0.5 0 Bác bỏ \(H_0\)
Homeowner Y 0.60060 [0.5925, 0.6087] p = 0.5 0 Bác bỏ \(H_0\)
ProductFamily Food 0.72220 [0.7147, 0.7295] p = 0.5 0 Bác bỏ \(H_0\)

Phần 4: Phân tích mối quan hệ giữa Hai biến định tính (Bivariate Analysis)

4.1 Biến Gender và ProductFamily

Để hiểu rõ hơn mối quan hệ giữa giới tính (Gender) và nhóm sản phẩm (ProductFamily), chúng ta sẽ xây dựng bảng tần suất chéo thể hiện số lượng từng kết hợp giữa hai biến này. Sau đó, biểu đồ cột sẽ được sử dụng để trực quan hóa sự phân bố của các nhóm sản phẩm theo từng giới tính, giúp quan sát dễ dàng sự khác biệt và xu hướng tiêu dùng giữa các nhóm.

Bảng tần suất chéo và trực quan hóa

Bảng tần suất chéo

d1 <- table(d_cat$Gender,d_cat$ProductFamily) #tạo bảng chéo đếm số lần xuất hiện của từng kết hợp giữa  (Gender) và (ProductFamily).
addmargins(d1) #Thêm tổng hàng và tổng cột vào bảng
##      
##       Drink  Food Non-Consumable   Sum
##   F     669  5149           1352  7170
##   M     581  5004           1304  6889
##   Sum  1250 10153           2656 14059

Bảng tần suất chéo theo tỷ lệ hàng

prop.table(d1, margin = 1)
##    
##          Drink       Food Non-Consumable
##   F 0.09330544 0.71813110     0.18856346
##   M 0.08433735 0.72637538     0.18928727

Trực quan hóa

barplot(d1, beside = TRUE, legend = TRUE, #Vẽ các cột cạnh nhau
        col = c("skyblue", "lightgreen"),
        main = "Biểu đồ tần suất giữa Gender và ProductFamily",
        xlab = "Gender",
        ylab = "Tần suất",
        names.arg = c("Drink", "Food", "Non-Consumable"))

Nhận xét

Dựa vào kết quả trên ta nhận thấy trong nhóm giới tính nữ có 669 (9.33%) người mua nước, 5149 (71.81%) người mua thức ăn và 1352 (18.86%) hàng hóa không tiêu thụ nhanh; có 581 (8.43%) người mua nước, 5004 (72.64%) người mua thức ăn và 1304 (18.93%) hàng hóa không tiêu thụ nhanh là nam.

  • Cả nữ (F) và nam (M) đều dành phần lớn ngân sách mua hàng cho nhóm Food, chiếm lần lượt 71.81% và 72.64% tổng số mặt hàng mua của mỗi giới tính. Điều này cho thấy nhóm Food là nhóm sản phẩm chủ lực, rất quan trọng và phổ biến trong thói quen tiêu dùng của cả hai giới.

  • Nhóm hàng hóa Non-Consumable chiếm khoảng 18.86% ở nữ và 18.93% ở nam. Tỷ lệ rất gần nhau, cho thấy cả hai giới đều quan tâm đến việc mua sắm các sản phẩm lâu bền hoặc sử dụng lâu dài.

  • Nhóm Drink chỉ chiếm dưới 10% trong tổng số hàng mua của mỗi giới, cụ thể là 9.33% ở nữ và 8.43% ở nam.Nữ mua nhóm này nhiều hơn nam một chút, có thể do sở thích hoặc thói quen tiêu dùng đồ uống khác nhau giữa hai giới.

Qua đó ta nhận thấy mối quan hệ giữa 2 biến Gender và ProductFamily là không mạnh vì sự phân bố tỷ lệ mua hàng khá giống nhau giữa nam và nữ, có thể kết luận rằng giới tính không phải là yếu tố quyết định mạnh mẽ trong việc lựa chọn nhóm sản phẩm.

Kiểm định thống kê (Kiểm định Chi-bình phương)

Để đánh giá xem có mối liên hệ có ý nghĩa thống kê giữa hai biến phân loại là Gender và ProductFamily hay không, sẽ sử dụng kiểm định Chi-bình phương (Chi-square test).

# Kiểm định
chisq_result <- chisq.test(d1)
# In kết quả
chisq_result
## 
##  Pearson's Chi-squared test
## 
## data:  d1
## X-squared = 3.5185, df = 2, p-value = 0.1722

Giả thuyết:

\[ \left\{ \begin{array}{ll} H_0: & \text{Biến Gender và biến ProductFamily không có mối quan hệ.} \\\\ H_1: & \text{Biến Gender và biến ProductFamily có mối quan hệ.} \ \end{array} \right. \]

Kết quả kiểm định: Với mức ý nghĩa 0.05, vì p-value = 0.1722 > 0.05, không đủ bằng chứng để bác bỏ giả thuyết \(H_0\). Vậy giữa biến Gender và biến ProductFamily không tồn tại mối quan hệ.

4.2 Biến MaritalStatus và Homeowner

Nhằm hiểu rõ hơn mối quan hệ giữa tình trạng hôn nhân (MaritalStatus) và việc sở hữu nhà (Homeowner), chúng ta sẽ xây dựng bảng tần suất chéo thể hiện số lượng từng kết hợp giữa hai biến này. Sau đó, biểu đồ cột sẽ được sử dụng để trực quan hóa sự phân bố của việc sở hữu nhà theo tình trạng hôn nhân, giúp quan sát dễ dàng sự khác biệt.

Bảng tần suất chéo và trực quan hóa

Bảng tần suất chéo

d2 <- table(d_cat$MaritalStatus,d_cat$Homeowner)
addmargins(d2)
##      
##           N     Y   Sum
##   M    1719  5147  6866
##   S    3896  3297  7193
##   Sum  5615  8444 14059

Bảng tần suất chéo theo tỷ lệ hàng

prop.table(d2, margin = 1)
##    
##             N         Y
##   M 0.2503641 0.7496359
##   S 0.5416377 0.4583623

Trực quan hóa

# Chuyển sang data frame
d2_df <- as.data.frame(d2)
colnames(d2_df) <- c("MaritalStatus", "Homeowner", "Frequency")
# Vẽ biểu đồ từ bảng tần suất
ggplot(d2_df, aes(x = MaritalStatus, y = Frequency, fill = Homeowner)) +
  geom_bar(stat = "identity", position = "dodge") +
  labs(
    title = "Biểu đồ tần suất giữa MaritalStatus và Homeowner",
    x = "MaritalStatus",
    y = "Tần suất"
  ) +
  theme_minimal()

Nhận xét

  • Dựa vào kết quả trên, ta nhận thấy trong nhóm người đã kết hôn (M) có 1719 người (25.04%) không sở hữu nhà và 5147 người (74.96%) sở hữu nhà. Còn nhóm người độc thân (S) có 3896 người (54.16%) không sở hữu nhà và 3297 người (45.84%) sở hữu nhà.

  • Qua đó ta nhận thấy mối quan hệ tích cực giữa việc kết hôn và sở hữu nhà. Người đã kết hôn có xu hướng ổn định hơn về mặt chỗ ở, có thể do điều kiện tài chính hoặc ưu tiên đầu tư lâu dài hơn so với người độc thân.

  • Xu hướng chung là kết hôn thường đi kèm với khả năng sở hữu nhà cao hơn, phản ánh mức độ ổn định và cam kết tài chính lâu dài hơn trong cuộc sống.

Kiểm định thống kê (Kiểm định Chi-bình phương)

Để đánh giá xem có mối liên hệ có ý nghĩa thống kê giữa hai biến phân loại là MaritalStatus và Homeowner hay không, sẽ sử dụng kiểm định Chi-bình phương (Chi-square test).

# Kiểm định
chisq_result <- chisq.test(d2)

# In kết quả
chisq_result
## 
##  Pearson's Chi-squared test with Yates' continuity correction
## 
## data:  d2
## X-squared = 1241.2, df = 1, p-value < 2.2e-16

Giả thuyết:

\[ \left\{ \begin{array}{ll} H_0: & \text{Biến MaritalStatus và biến Homeowner không có mối quan hệ.} \\\\ H_1: & \text{ Biến MaritalStatus và biến Homeowner có mối quan hệ.} \ \end{array} \right. \]

Kết quả kiểm định: Với mức ý nghĩa 0.0 với p-value = 2.2e-16 < 0.05, bác bỏ giả thuyết \(H_0\) tức là chấp nhận giả thuyết \(H_1\). Vậy giữa biến MaritalStatus và biến Homeowner có tồn tại mối quan hệ.

4.3 Biến ProductFamily và AnnualIncome

Nhằm hiểu rõ hơn mối quan hệ giữa nhóm sản phẩm (ProductFamily) và thu nhập hằng năm (AnnualIncome), chúng ta sẽ xây dựng bảng tần suất chéo thể hiện số lượng từng kết hợp giữa hai biến này. Sau đó, biểu đồ cột sẽ được sử dụng để trực quan hóa sự phân bố của danh mục sản phẩm theo thu nhập hằng năm, giúp quan sát dễ dàng sự khác biệt.

Bảng tần suất chéo

d3 <- table(d_cat$ProductFamily, d_cat$AnnualIncome)
addmargins(d3)
##                 
##                  $10K - $30K $110K - $130K $130K - $150K $150K + $30K - $50K
##   Drink                  267            59            56      25         421
##   Food                  2232           468           556     199        3340
##   Non-Consumable         591           116           148      49         840
##   Sum                   3090           643           760     273        4601
##                 
##                  $50K - $70K $70K - $90K $90K - $110K   Sum
##   Drink                  193         156           73  1250
##   Food                  1705        1221          432 10153
##   Non-Consumable         472         332          108  2656
##   Sum                   2370        1709          613 14059

Bảng tần suất chéo theo tỷ lệ hàng

prop.table(d3, margin = 1)
##                 
##                  $10K - $30K $110K - $130K $130K - $150K    $150K + $30K - $50K
##   Drink           0.21360000    0.04720000    0.04480000 0.02000000  0.33680000
##   Food            0.21983650    0.04609475    0.05476214 0.01960012  0.32896681
##   Non-Consumable  0.22251506    0.04367470    0.05572289 0.01844880  0.31626506
##                 
##                  $50K - $70K $70K - $90K $90K - $110K
##   Drink           0.15440000  0.12480000   0.05840000
##   Food            0.16793066  0.12026002   0.04254900
##   Non-Consumable  0.17771084  0.12500000   0.04066265

Trực quan hóa

# Chuyển sang data frame
d3_df <- as.data.frame(d3)
colnames(d3_df) <- c("AnnualIncome", "ProductFamily", "Frequency")
# Vẽ biểu đồ từ bảng tần suất
ggplot(d3_df, aes(x = AnnualIncome, y = Frequency, fill = ProductFamily)) +
  geom_bar(stat = "identity", position = "dodge") +
  labs(
    title = "Biểu đồ tần suất giữa ProductFamily và AnnualIncome",
    x = "ProductFamily",
    y = "Tần suất"
  ) +
  theme_minimal()

Nhận xét

  • Dựa vào kết quả trên ta nhận thấy nhóm Food chiếm có tần suất lớn nhất ở tất cả các nhóm thu nhập, chiếm phần lớn trong tổng số cho thấy đây là nhóm sản phẩm phổ biến nhất. Còn lại nhóm Drink và Non-Consumable có tần suất thấp hơn, nhưng phân bố khá đồng đều qua các nhóm thu nhập.

  • Dựa trên số liệu tỷ lệ phần trăm khá đồng đều qua các nhóm thu nhập, dường như không có sự liên kết mạnh mẽ giữa nhóm thu nhập và loại sản phẩm được lựa chọn.Các nhóm sản phẩm được mua tương đối đồng đều trên các nhóm thu nhập khác nhau.

  • Xu hướng nhóm Food luôn chiếm phần lớn trong mọi nhóm thu nhập, cho thấy đây là nhóm được ưu tiên mua nhiều nhất bất kể mức thu nhập.

Kiểm định thống kê (Kiểm định Chi-bình phương)

Để đánh giá xem có mối liên hệ có ý nghĩa thống kê giữa hai biến phân loại là ProductFamily và AnnualIncome hay không, sẽ sử dụng kiểm định Chi-bình phương (Chi-square test).

# Kiểm định
chisq_result <- chisq.test(d3)

# In kết quả
chisq_result
## 
##  Pearson's Chi-squared test
## 
## data:  d3
## X-squared = 14.84, df = 14, p-value = 0.3892

Giả thuyết:

\[ \left\{ \begin{array}{ll} H_0: & \text{Biến ProductFamily và biến AnnualIncome không có mối quan hệ.} \\\\ H_1: & \text{Biến ProductFamily và biến AnnualIncome có mối quan hệ. } \ \end{array} \right. \]

Kết quả kiểm định: Với mức ý nghĩa 0.05, vì p-value = 0.3892 > 0.05, không đủ bằng chứng để bác bỏ giả thuyết \(H_0\). Vậy giữa biến ProductFamily và biến AnnualIncome không tồn tại mối quan hệ.

4.4 Biến StateorProvince và ProductFamily

Để hiểu rõ hơn mối quan hệ giữa các bang (StateorProvince) và nhóm sản phẩm (ProductFamily), chúng ta sẽ xây dựng bảng tần suất chéo thể hiện số lượng từng kết hợp giữa hai biến này. Sau đó, biểu đồ cột sẽ được sử dụng để trực quan hóa sự phân bố của nhóm sản phẩm theo các bang, giúp quan sát dễ dàng sự khác biệt.

Bảng tần suất chéo

d4 <- table(d_cat$StateorProvince,d_cat$ProductFamily)
addmargins(d4)
##            
##             Drink  Food Non-Consumable   Sum
##   BC           69   580            160   809
##   CA          258  1974            501  2733
##   DF           65   598            152   815
##   Guerrero     41   272             70   383
##   Jalisco       5    57             13    75
##   OR          199  1629            434  2262
##   Veracruz     44   322             98   464
##   WA          399  3287            881  4567
##   Yucatan      48   494            112   654
##   Zacatecas   122   940            235  1297
##   Sum        1250 10153           2656 14059

Bảng tần suất chéo theo tỷ lệ hàng

prop.table(d4, margin = 1)
##            
##                  Drink       Food Non-Consumable
##   BC        0.08529048 0.71693449     0.19777503
##   CA        0.09440176 0.72228321     0.18331504
##   DF        0.07975460 0.73374233     0.18650307
##   Guerrero  0.10704961 0.71018277     0.18276762
##   Jalisco   0.06666667 0.76000000     0.17333333
##   OR        0.08797524 0.72015915     0.19186561
##   Veracruz  0.09482759 0.69396552     0.21120690
##   WA        0.08736589 0.71972849     0.19290563
##   Yucatan   0.07339450 0.75535168     0.17125382
##   Zacatecas 0.09406322 0.72474942     0.18118736

Trực quan hóa

# Chuyển sang data frame
d4_df <- as.data.frame(d4)
colnames(d4_df) <- c("StateorProvince", "ProductFamily", "Frequency")
# Vẽ biểu đồ từ bảng tần suất
ggplot(d4_df, aes(x = StateorProvince, y = Frequency, fill = ProductFamily)) +
  geom_bar(stat = "identity", position = "dodge") +
  labs(
    title = "Biểu đồ tần suất giữa StateorProvince và ProductFamily",
    x = "StateorProvince",
    y = "Tần suất"
  ) +
  theme_minimal()

Nhận xét

  • Dựa vào kết quả trên ta nhận thấy Food luôn là nhóm sản phẩm được mua nhiều nhất luốn chiếm hơn 70%, tiếp theo là nhóm sản phẩm Non-Consumable dao động từ 17%-20% và cuối cùng là nhóm Drink chiếm 6-10%.

  • Đặc biệt là đối với bang WA (Washington) có tần suất cao đối với 3 nhóm sản phẩm này và Jalisco thì ngược lại có tần suất thấp nhất trong các bang.

  • Mối quan hệ giữa bang và nhóm sản phẩm được mua cho thấy sự phân bố tỷ lệ khá ổn định, với nhóm Food chiếm ưu thế ở tất cả các bang. Mặc dù có một số biến động nhẹ ở tỷ lệ mua nhóm Drink và Non-Consumable giữa các khu vực, nhưng xu hướng chung cho thấy khu vực ảnh hưởng nhẹ đến lựa chọn nhóm sản phẩm của khách hàng.

  • Xu hướng chính là sự ưu tiên chọn mua nhóm Food ở mọi khu vực, chiếm phần lớn tỷ lệ tiêu dùng.

Kiểm định thống kê (Kiểm định Chi-bình phương)

Để đánh giá xem có mối liên hệ có ý nghĩa thống kê giữa hai biến phân loại là StateorProvince và ProductFamily không, sẽ sử dụng kiểm định Chi-bình phương (Chi-square test).

# Kiểm định
chisq_result <- chisq.test(d4)

# In kết quả
chisq_result
## 
##  Pearson's Chi-squared test
## 
## data:  d4
## X-squared = 12.3, df = 18, p-value = 0.8314

Giả thuyết:

\[ \left\{ \begin{array}{ll} H_0: & \text{Biến ProductFamily và biến StateorProvince không có mối quan hệ.} \\\\ H_1: & \text{Biến ProductFamily và biến StateorProvince có mối quan hệ. } \ \end{array} \right. \]

Kết quả kiểm định: Với mức ý nghĩa 0.05, vì p-value = 0.8314 > 0.05, không đủ bằng chứng để bác bỏ giả thuyết \(H_0\). Vậy giữa Biến ProductFamily và biến StateorProvince không có mối quan hệ.

Phần 5: Tổng kết và thảo luận

5.1 Tóm tắt những phát hiện chính

Phát hiện về mối quan hệ giữa 2 biến Gender và ProductFamily

Kết quả phân tích cho thấy nam và nữ đều chủ yếu mua sản phẩm thuộc nhóm Food (trên 70%), tiếp đến là Non-Consumable (khoảng 18-19%), và cuối cùng là Drink (dưới 10%). Tỷ lệ mua Drink của nữ cao hơn nam một chút. Nhìn vào kết quả này, có vẻ như nam và nữ có xu hướng mua sắm khá giống nhau, không có sự khác biệt rõ rệt về sở thích sản phẩm. Tuy nhiên, kiểm định Chi-bình phương cho thấy p-value = 0.1722 (> 0.05), không đủ bằng chứng để kết luận rằng có mối quan hệ có ý nghĩa thống kê giữa giới tính và nhóm sản phẩm.

Suy ra: Mặc dù có sự khác biệt nhỏ trong tỷ lệ, kết luận cuối cùng là không có mối liên hệ thống kê đáng kể giữa hai biến này.

Phát hiện về mối quan hệ giữa 2 biến MaritalStatus và Homeowner

Kết quả cho thấy người đã kết hôn có tỷ lệ sở hữu nhà lên đến 75%, trong khi người độc thân chỉ khoảng 46%. Con số này phản ánh một xu hướng rõ rệt: người đã kết hôn có xu hướng ổn định tài chính hơn, dễ sở hữu nhà hơn so với người độc thân. Kiểm định Chi-bình phương cho mối quan hệ này cho kết quả p-value < 2.2e-16, nhỏ hơn rất nhiều so với mức ý nghĩa 0.05.

Suy ra: có thể khẳng định mối quan hệ giữa tình trạng hôn nhân và việc sở hữu nhà có ý nghĩa thống kê.

Phát hiện về mối quan hệ giữa 2 biến ProductFamily và AnnualIncome

Phân tích phân bố nhóm sản phẩm theo các mức thu nhập cho thấy nhóm Food luôn chiếm tỷ lệ cao nhất (hơn 70%) ở mọi mức thu nhập, còn nhóm Drink và Non-Consumable có phân bố khá tương đồng và không có chênh lệch đáng kể. Dựa vào kết quả này, có thể suy ra rằng mức thu nhập không phải là yếu tố quyết định rõ ràng cho việc mua loại sản phẩm nào.

Phát hiện về mối quan hệ giữa 2 biến StateorProvince và ProductFamily

Nhóm sản phẩm Food luôn chiếm tỷ lệ cao nhất ở tất cả các bang, dao động trên 70%. Tiếp theo là nhóm Non-Consumable, dao động khoảng 17-20%, và nhóm Drink chiếm tỷ lệ thấp nhất, khoảng 6-10%. Đáng chú ý, bang Washington (WA) có tần suất mua cao nhất ở cả ba nhóm sản phẩm, trong khi bang Jalisco có tần suất thấp nhất. Mặc dù có sự khác biệt nhỏ giữa các bang, xu hướng chung cho thấy tỷ lệ ưu tiên chọn mua nhóm Food luôn vượt trội, còn tỷ lệ của các nhóm còn lại khá ổn định giữa các khu vực. Tuy nhiên, kiểm định Chi-bình phương cho kết quả p-value = 0.8314 (> 0.05).

Suy ra: dù có sự biến động nhỏ trong tỷ lệ mua sắm giữa các bang, nhưng không có mối quan hệ thống kê đáng kể giữa hai biến này.

Tóm lại: qua phân tích thì chỉ có MaritalStatus và Homeowner cho thấy mối quan hệ, các cặp biến còn lại thì không tồn tttạimooisquan hệ giữa các biến.

5.2 Hạn chế của phân tích

Đầu tiên, phân tích chỉ giới hạn ở biến định tính: Phân tích hiện tại chủ yếu tập trung vào các biến định tính như Gender, MaritalStatus, Homeowner, AnnualIncome và v.v. Các biến định lượng quan trọng như Revenue, UnitsSold hoặc số lượng Children chưa được phân tích sâu, dẫn đến các phát hiện mới chỉ mô tả đặc điểm phân loại của khách hàng mà chưa phản ánh được giá trị kinh tế hay mức độ tiêu dùng thực tế.

Ngoài ra, hiện nay phân tích chỉ dừng lại ở mức quan hệ đơn giản giữa hai biến không thể hiện được sự khách quan bởi vì không phải chỉ có 2 biến tác đọng lẫn nhau mà còn phụ thuộc vào nhiều biến khác nhau.

5.3 Đề xuất

Để khắc phục các hạn chế trên, nghiên cứu trong tương lai nên mở rộng phân tích sang các biến định lượng quan trọng như Doanh thu (Revenue), số lượng sản phẩm bán ra (UnitsSold) và số lượng con cái (Children) nhằm cung cấp cái nhìn toàn diện và sâu sắc hơn về giá trị kinh tế và hành vi tiêu dùng thực tế của khách hàng.

Bên cạnh đó, nên áp dụng các phương pháp phân tích đa biến (multivariate analysis) để đồng thời xem xét ảnh hưởng tương tác giữa nhiều yếu tố, thay vì chỉ phân tích quan hệ giữa hai biến. Điều này giúp phát hiện các mối quan hệ phức tạp và sự tác động qua lại giữa các đặc điểm khách hàng như giới tính, thu nhập, quốc gia và các yếu tố khác đến hành vi mua sắm, từ đó nâng cao độ chính xác và tính khách quan của kết quả nghiên cứu.

Ngoài ra, cần mở rộng quy mô mẫu nghiên cứu để đảm bảo tính đại diện và giảm thiểu sai lệch do các nhóm con có kích thước nhỏ, qua đó cải thiện khả năng khái quát hóa kết quả ra toàn bộ tập khách hàng mục tiêu.

5.4 Câu hỏi mở/Hướng nghiên cứu tiếp theo

Mở rộng phạm vi phân tích bằng cách kết hợp cả các biến định lượng như doanh thu, số lượng sản phẩm bán ra và số lượng con cái để đánh giá sâu hơn về giá trị kinh tế cũng như mức độ tiêu dùng thực tế của khách hàng.

Ngoài ra, nghiên cứu cũng có thể mở rộng xem xét các yếu tố môi trường bên ngoài như xu hướng thị trường, ảnh hưởng văn hóa hay các chiến dịch marketing để đánh giá toàn diện hơn về hành vi mua sắm.

Nhiệm vụ 3

A. Đọc và Chuẩn bị trước buổi học

library(tidyverse)
library(DT)
library(scales)
library(psych)
library(knitr)
library(kableExtra)
library(DescTools)
library(epitools)
library(AER)

1. Ôn lại kiến thức Tuần 2

d<- read.csv("D:/HK2_PTDLDT_TMT/Supermarket Transactions.csv", header=T)
cat<- c("Gender", "MaritalStatus", "Homeowner", "AnnualIncome", "City", "StateorProvince", "Country", "ProductFamily", "ProductDepartment", "ProductCategory")
d_cat<-d[, cat]
datatable(d_cat,options = list(scrollX = TRUE))

1.1 Bảng tần số chéo

Bảng tần suất chéo

d2 <- table(d_cat$MaritalStatus,d_cat$Homeowner)
addmargins(d2)
##      
##           N     Y   Sum
##   M    1719  5147  6866
##   S    3896  3297  7193
##   Sum  5615  8444 14059

Bảng tần suất chéo theo tỷ lệ hàng

prop.table(d2, margin = 1)
##    
##             N         Y
##   M 0.2503641 0.7496359
##   S 0.5416377 0.4583623

Nhận xét

  • Dựa vào kết quả trên, ta nhận thấy trong nhóm người đã kết hôn (M) có 1719 người (25.04%) không sở hữu nhà và 5147 người (74.96%) sở hữu nhà. Còn nhóm người độc thân (S) có 3896 người (54.16%) không sở hữu nhà và 3297 người (45.84%) sở hữu nhà.

  • Qua đó ta nhận thấy mối quan hệ tích cực giữa việc kết hôn và sở hữu nhà. Người đã kết hôn có xu hướng ổn định hơn về mặt chỗ ở, có thể do điều kiện tài chính hoặc ưu tiên đầu tư lâu dài hơn so với người độc thân.

  • Xu hướng chung là kết hôn thường đi kèm với khả năng sở hữu nhà cao hơn, phản ánh mức độ ổn định và cam kết tài chính lâu dài hơn trong cuộc sống.

1.2 Kiểm định thống kê (Kiểm định Chi-bình phương)

Để đánh giá xem có mối liên hệ có ý nghĩa thống kê giữa hai biến phân loại là MaritalStatus và Homeowner hay không, sẽ sử dụng kiểm định Chi-bình phương (Chi-square test).

# Kiểm định
chisq_result <- chisq.test(d2)

# In kết quả
chisq_result
## 
##  Pearson's Chi-squared test with Yates' continuity correction
## 
## data:  d2
## X-squared = 1241.2, df = 1, p-value < 2.2e-16

Giả thuyết:

\[ \left\{ \begin{array}{ll} H_0: & \text{Biến MaritalStatus và biến Homeowner không có mối quan hệ.} \\\\ H_1: & \text{ Biến MaritalStatus và biến Homeowner có mối quan hệ.} \ \end{array} \right. \]

Kết quả kiểm định: Với mức ý nghĩa 0.0 với p-value = 2.2e-16 < 0.05, bác bỏ giả thuyết \(H_0\) tức là chấp nhận giả thuyết \(H_1\). Vậy giữa biến MaritalStatus và biến Homeowner có tồn tại mối quan hệ.

1.3 Relative Risk

e1 <- table(d_cat$Homeowner, d_cat$MaritalStatus)
addmargins(e1)
##      
##           M     S   Sum
##   N    1719  3896  5615
##   Y    5147  3297  8444
##   Sum  6866  7193 14059
RelRisk(e1)
## [1] 0.5022503
table(d$Homeowner,d$MaritalStatus)
##    
##        M    S
##   N 1719 3896
##   Y 5147 3297
m <- matrix(c(1719,5147,3896,3297),nrow = 2)
RelRisk(m, conf.level = .95)
## rel. risk    lwr.ci    upr.ci 
## 0.5022503 0.4810315 0.5241410
riskratio(e1, rev = 'b') #đưa chữ y lên trên
## $data
##        
##            S    M Total
##   Y     3297 5147  8444
##   N     3896 1719  5615
##   Total 7193 6866 14059
## 
## $measure
##    risk ratio with 95% C.I.
##      estimate     lower     upper
##   Y 1.0000000        NA        NA
##   N 0.5022503 0.4811506 0.5242752
## 
## $p.value
##    two-sided
##     midp.exact  fisher.exact    chi.square
##   Y         NA            NA            NA
##   N          0 1.822183e-277 3.663022e-272
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "Unconditional MLE & normal approximation (Wald) CI"

Tỷ số rủi ro (Relative Risk) được ước tính là 0.5023, với khoảng tin cậy 95% từ 0.4810 đến 0.5241. Điều này cho thấy những người không sở hữu nhà có khả năng đã kết hôn thấp hơn khoảng 50% so với những người có sở hữu nhà. Khoảng tin cậy 95% cho biết rằng, với độ tin cậy 95%, giá trị thực của tỷ số rủi ro nằm trong khoảng từ 0.4810 đến 0.5241. Vì khoảng này không chứa giá trị 1, sự khác biệt giữa hai nhóm được xem là có ý nghĩa thống kê.

2. Tìm hiểu về các nội dung của chương 2

2.1 Cấu trúc xác suất của bảng ngẫu nhiên

Phân phối Poisson

Phân phối Poisson là một xác suất rời rạc lý thuyết và cũng được gọi là hàm khối lượng xác suất phân phối Poisson. Nó được sử dụng để tìm xác suất của một sự kiện độc lập xảy ra trong một khoảng thời gian cố định và có tỷ lệ trung bình không đổi.

Ký hiệu: X∼Poisson(λ)

Hàm xác suất:Xác suất để có đúng \(k\) sự kiện xảy ra trong một khoảng thời gian (hoặc không gian) nhất định được cho bởi:

\[ P(X = k) = \frac{\lambda^k e^{-\lambda}}{k!} \]

Trong đó:

  • \(k\): số lần sự kiện xảy ra ( \(k = 0, 1, 2, \dots\) )
  • \(\lambda\): số lần xảy ra trung bình của sự kiện (tham số của phân phối Poisson)
  • \(e\): hằng số Euler, cơ số của logarit tự nhiên, \(e \approx 2.71828\)
  • \(k!\): giai thừa của \(k\), tức là \(k! = k \times (k-1) \times \dots \times 1\), và \(0! = 1\)

Đặc điểm quan trọng của phân phối Poisson

  • Kỳ vọng (Mean):

    \[ \mathbb{E}(X) = \lambda \]

  • Phương sai (Variance):

    \[ \mathrm{Var}(X) = \lambda \]

  • Khi \(\lambda\) nhỏ (ví dụ: λ < 5), phân phối bị lệch phải, tập trung nhiều ở phía trái.

  • Khi \(\lambda\) tăng lên (đặc biệt \(\lambda \geq 20\)), phân phối Poisson có thể được xấp xỉ tốt bằng phân phối Chuẩn:

    \[ X \sim \mathcal{N}(\lambda, \lambda) \] Phân phối Muultinomial

Phân phối Multinomial là một mở rộng của phân phối nhị thức (Bernoulli) cho nhiều hơn hai kết quả. Phân phối này mô tả xác suất của các kết quả đếm được trong \(n\) lần thử, trong đó mỗi lần thử có thể rơi vào một trong \(k\) loại (categories) với xác suất tương ứng.

Phân phối được ký hiệu là:

\[ \mathbf{Y} \sim \text{Multinomial}(n, \mathbf{p}) \]

Trong đó:

  • \(\mathbf{Y} = (Y_1, Y_2, \dots, Y_k)\) là vector số đếm cho từng loại.

  • \(n\) là tổng số lần thử (hay tổng số đếm): \(n = \sum_{i=1}^{k} Y_i\).

  • \(\mathbf{p} = (p_1, p_2, \dots, p_k)\) là vector xác suất, với \(p_i \ge 0\)\(\sum_{i=1}^{k} p_i = 1\).

Hàm xác suất được xác định như sau:

\[ P(Y_1 = y_1, \dots, Y_k = y_k) = \frac{n!}{y_1! \cdots y_k!} \cdot p_1^{y_1} \cdots p_k^{y_k} \]

2.2 So sánh 2 tỷ lệ trong bảng ngẫu nhiên 2x2

Risk Difference - RD

Risk Difference là mức chênh lệch tuyệt đối giữa xác suất xảy ra sự kiện ở hai nhóm.

Cách tính:

\[ RD = \frac{a}{a + b} - \frac{c}{c + d} \]

Ý nghĩa:

  • RD phản ánh sự khác biệt tuyệt đối giữa nguy cơ xảy ra sự kiện ở hai nhóm.

  • Nếu:

    • \(RD > 0\): Nhóm A có nguy cơ cao hơn nhóm B

    • \(RD < 0\): Nhóm A có nguy cơ thấp hơn nhóm B

Relative Risk - RR

Tỷ số rủi ro (RR) là tỷ lệ giữa xác suất xảy ra sự kiện ở nhóm phơi nhiễm so với nhóm không phơi nhiễm. Nó thể hiện mức tăng (hoặc giảm) tương đối về nguy cơ.

Cách tính:

\[ RR = \frac{a / (a + b)}{c / (c + d)} \]

Ý nghĩa:

  • \(RR = 1\): Không có sự khác biệt nguy cơ giữa hai nhóm

  • \(RR > 1\): Nhóm A có nguy cơ cao hơn

  • \(RR < 1\): Nhóm A có nguy cơ thấp hơn

Odds Ratio - OR

Odd Ratio (Tỷ số chênh) là một thước đo được sử dụng phổ biến trong thống kê, đặc biệt là trong nghiên cứu dịch tễ học, để đánh giá mối liên hệ giữa phơi nhiễm và kết quả.

Cách tính:

\[ OR = \frac{a/b}{c/d} = \frac{a \cdot d}{b \cdot c} \]

Ý nghĩa:

  • \(OR = 1\): Không có sự khác biệt odds giữa hai nhóm

  • \(OR > 1\): Odds xảy ra sự kiện ở nhóm A cao hơn

  • \(OR < 1\): Odds ở nhóm A thấp hơn

2.3 Khoảng tin cậy cho các tham số đo mối liên hệ

Khi ước lượng Odds Ratio (OR) do OR không phân bố chuẩn ta thường biến đổi logarit để làm việc trên thang log(OR), sau đó tính khoảng tin cậy (CI) và lấy mũ để chuyển về thang OR.

Sai số chuẩn (Standard Error - SE)

Công thức:

\[ SE(\log(\hat{\theta})) = \sqrt{ \frac{1}{n_{11}} + \frac{1}{n_{12}} + \frac{1}{n_{21}} + \frac{1}{n_{22}} } \]

Trong đó:

  • \(n_{11}, n_{12}, n_{21}, n_{22}\) là các ô trong bảng 2x2:
Sự kiện (+) Không sự kiện (−)
Nhóm 1 \(n_{11}\) \(n_{12}\)
Nhóm 2 \(n_{21}\) \(n_{22}\)

Khoảng tin cậy 95% cho log(OR)

\[ \log(\hat{\theta}) \pm z_{1 - \alpha/2} \cdot SE(\log(\hat{\theta})) \]

Với \(z_{1 - \alpha/2} = 1.96\) cho mức tin cậy 95%.

Khoảng tin cậy 95% cho OR

Chuyển về thang OR:

\[ CI_{OR} = \left[ \exp \left( \log(\hat{\theta}) - 1.96 \cdot SE \right),\ \exp \left( \log(\hat{\theta}) + 1.96 \cdot SE \right) \right] \]

Nhận xét

  • Nếu khoảng tin cậy không chứa 1, OR có ý nghĩa thống kê.

  • Nếu khoảng CI chứa 1 là không đủ bằng chứng thống kê để kết luận khác biệt.

2.4 Ví dụ

Trong ví dụ này, chúng ta sử dụng bộ dữ liệu CreditCard thuộc gói AER để phân tích mối liên hệ giữa tình trạng sở hữu nhà (owner) và quyết định cấp thẻ tín dụng (card). Dữ liệu này bao gồm thông tin về việc một cá nhân có được chấp nhận cấp thẻ tín dụng hay không, cùng với các đặc điểm cá nhân như có sở hữu nhà, thu nhập, trình độ học vấn, Chúng ta sẽ tập trung vào hai biến phân loại owner và card, từ đó xây dựng bảng 2×2 và tính tỷ số chênh Odds Ratio (OR) để đánh giá xem sở hữu nhà có ảnh hưởng đến khả năng được cấp thẻ hay không.

# Tải dữ liệu
data("CreditCard")
h1<- CreditCard
# Thay đổi giá trị của biến `card`và owner
library(dplyr)
h1$card <- dplyr::recode(h1$card, "yes" = "chapnhan", "no" = "tuchoi")
h1$owner <-  dplyr::recode(h1$owner, "yes" = "conha", "no" = "khongconha")
h2 <- table(h1$card,h1$owner) #tạo bảng chéo đếm số lần xuất hiện của từng kết hợp giữa  (Gender) và (ProductFamily).
addmargins(h2)#Thêm tổng hàng và tổng cột vào bảng
##           
##            khongconha conha  Sum
##   tuchoi          206    90  296
##   chapnhan        532   491 1023
##   Sum             738   581 1319
prop.table(h2, margin = 1)
##           
##            khongconha     conha
##   tuchoi    0.6959459 0.3040541
##   chapnhan  0.5200391 0.4799609
library(epitools)
OddsRatio(h2)
## [1] 2.11249
oddsratio(h2)
## $data
##           
##            khongconha conha Total
##   tuchoi          206    90   296
##   chapnhan        532   491  1023
##   Total           738   581  1319
## 
## $measure
##           odds ratio with 95% C.I.
##            estimate   lower    upper
##   tuchoi    1.00000      NA       NA
##   chapnhan  2.10957 1.60448 2.791356
## 
## $p.value
##           two-sided
##              midp.exact fisher.exact   chi.square
##   tuchoi             NA           NA           NA
##   chapnhan 5.738991e-08 6.417142e-08 7.928759e-08
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "median-unbiased estimate & mid-p exact CI"

Dựa vào kết quả trên ta thấy những người có nhà có tỷ lệ được chấp nhận thẻ tín dụng cao hơn 2.11 lần so với những người không có nhà. Khoảng tin cậy 95% là (1.60; 2.79), không chứa giá trị 1 cho thấy sự khác biệt là có ý nghĩa thống kê. Giá trị p rất nhỏ (< 0.005), cho thấy chúng ta bác bỏ giả thuyết không rằng khả năng được cấp thẻ là như nhau giữa người có nhà và không có nhà.

3. Suy nghĩ về bộ dữ liệu

d5 <- table(d_cat$Gender,d_cat$Homeowner) #tạo bảng chéo đếm số lần xuất hiện của từng kết hợp giữa  (Gender) và (ProductFamily).
addmargins(d5) #Thêm tổng hàng và tổng cột vào bảng
##      
##           N     Y   Sum
##   F    2826  4344  7170
##   M    2789  4100  6889
##   Sum  5615  8444 14059
prop.table(d5, margin = 1)
##    
##             N         Y
##   F 0.3941423 0.6058577
##   M 0.4048483 0.5951517
OddsRatio(d5,conf.level = .95)
## odds ratio     lwr.ci     upr.ci 
##  0.9563518  0.8939173  1.0231469
oddsratio(d5)
## $data
##        
##            N    Y Total
##   F     2826 4344  7170
##   M     2789 4100  6889
##   Total 5615 8444 14059
## 
## $measure
##    odds ratio with 95% C.I.
##     estimate     lower    upper
##   F 1.000000        NA       NA
##   M 0.956381 0.8938974 1.023169
## 
## $p.value
##    two-sided
##     midp.exact fisher.exact chi.square
##   F         NA           NA         NA
##   M   0.195158    0.1964833  0.1950884
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "median-unbiased estimate & mid-p exact CI"

Nhận xét

Nam giới có odds ratio là 0.9564, với khoảng tin cậy 95% từ 0.8939 đến 1.0232. Điều này có nghĩa là nam giới có odds sở hữu nhà thấp hơn một chút so với nữ giới, tức là tỷ lệ sở hữu nhà ở nam có xu hướng thấp hơn so với nữ, nhưng sự khác biệt là rất nhỏ.

Tuy nhiên, khoảng tin cậy 95% có chứa giá trị 1, cho thấy rằng khác biệt này không có ý nghĩa thống kê. Ngoài ra, các giá trị p tương ứng (midp.exact = 0.1952, fisher.exact = 0.1965, chi.square = 0.1951) đều lớn hơn 0.05, cho thấy không có bằng chứng thống kê đủ mạnh để bác bỏ giả thuyết không.

Việc là Nữ (so với Nam) không làm tăng hay giảm đáng kể odds sở hữu nhà. Mặc dù nữ giới có odds sở hữu nhà cao hơn một chút, nhưng khác biệt này không có ý nghĩa thống kê, nên chúng ta không thể kết luận có mối liên hệ rõ ràng giữa giới tính và khả năng sở hữu nhà trong dữ liệu này.

B. Hoạt động trên lớp

1. Ôn tập và thảo luận phân tích chéo và RR

Khi nhìn vào bảng chéo và chỉ số Relative Risk (RR), chúng ta có thể có cái nhìn đầu tiên về mối liên hệ giữa hai nhóm biến phân loại. RR cho biết khả năng một nhóm có xu hướng xảy ra sự kiện nhiều hay ít hơn nhóm còn lại, nên thường được dùng để so sánh mức độ “nguy cơ” giữa hai nhóm.

Tuy nhiên, việc sử dụng bảng chéo và RR cũng có những mặt hạn chế. Trước hết, bảng chéo chỉ cho thấy số liệu đếm và tỷ lệ đơn giản — nó không cung cấp thông tin về độ chắc chắn của kết quả hay xem xét đến ảnh hưởng của các yếu tố khác. RR thì chỉ thực sự phù hợp nếu dữ liệu được thu thập từ nghiên cứu dọc, tức là theo dõi các nhóm theo thời gian. Trong trường hợp dữ liệu được lấy theo cách ngẫu nhiên hay điều tra cắt ngang, RR đôi khi có thể gây hiểu nhầm.

Ngoài ra, nếu sự kiện đang xét là hiếm, RR và Odds Ratio (OR) sẽ khá giống nhau. Nhưng nếu không hiếm, sự khác biệt giữa hai chỉ số này có thể lớn, dẫn đến kết luận không chính xác nếu không chú ý. Đặc biệt, cả hai cách làm này chưa kiểm soát được những yếu tố khác có thể ảnh hưởng đến mối liên hệ giữa hai biến chính, nên nếu muốn phân tích sâu và chính xác hơn, chúng ta cần dùng đến các phương pháp hồi quy như hồi quy logistic.

2. Đào sâu về Suy diễn trong Bảng Ngẫu nhiên 2x2

Khi tạo bảng ngẫu nhiên (ví dụ: bảng 2x2), thực chất là chúng ta đang mô tả phân bố xác suất của hai biến phân loại. Mỗi ô trong bảng thể hiện xác suất chung (joint probability) của hai biến cùng xảy ra. Chẳng hạn, trong bảng 2x2 với biến A (có/không) và biến B (nam/nữ), thì ô ở hàng “có” và cột “nam” cho biết xác suất (hoặc tần suất quan sát được) của những người vừa có đặc điểm A, vừa là nam.

Mục tiêu:

  • Hiểu rằng những con số trong bảng không chỉ là đếm đơn thuần, mà có thể xem như kết quả của một quá trình ngẫu nhiên có quy luật xác suất. Dựa vào đó, chúng ta có thể:

  • Tính các xác suất biên (xác suất xảy ra của từng biến riêng lẻ),

  • Tính xác suất có điều kiện (xác suất xảy ra của một biến khi biết biến còn lại),

  • Và từ đó phát triển các chỉ số như Tỷ số rủi ro (Relative Risk) hay Tỷ số chênh (Odds Ratio).

3. Thực hành trên R

Chọn một cặp MaritalStatus và Homeowner biến nhị phân khác từ bộ dữ liệu Supermarket Transactions

r1 <- table(d_cat$MaritalStatus,d_cat$Homeowner)
r1
##    
##        N    Y
##   M 1719 5147
##   S 3896 3297
prop_table <- prop.table(r1, margin = 1)
prop_table
##    
##             N         Y
##   M 0.2503641 0.7496359
##   S 0.5416377 0.4583623

Nhận xét: Dựa vào kết quả trên, ta nhận thấy trong nhóm người đã kết hôn (M) có 1719 người (25.04%) không sở hữu nhà và 5147 người (74.96%) sở hữu nhà. Còn nhóm người độc thân (S) có 3896 người (54.16%) không sở hữu nhà và 3297 người (45.84%) sở hữu nhà.

RD<- prop_table[1, "Y"] - prop_table[2, "N"]
RD
## [1] 0.2079982

Tỷ lệ những người đã kết hôn (M) sở hữu nhà là cao hơn so với tỷ lệ người độc thân (S) không sở hữu nhà, với chênh lệch khoảng 20.8%.

RR <- riskratio(r1)
RR
## $data
##        
##            N    Y Total
##   M     1719 5147  6866
##   S     3896 3297  7193
##   Total 5615 8444 14059
## 
## $measure
##    risk ratio with 95% C.I.
##      estimate     lower     upper
##   M 1.0000000        NA        NA
##   S 0.6114466 0.5942071 0.6291862
## 
## $p.value
##    two-sided
##     midp.exact  fisher.exact    chi.square
##   M         NA            NA            NA
##   S          0 1.822183e-277 3.663022e-272
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "Unconditional MLE & normal approximation (Wald) CI"

Nhận xét: Kết quả phân tích Relative Risk (RR) cho thấy tỷ lệ người độc thân sở hữu nhà khoảng 61.1% so với người đã kết hôn avf sở hữu nahf, với khoảng tin cậy 95% từ 59.4% đến 62.9%. Khoảng tin cậy không chứa giá trị 1, cho thấy sự khác biệt này có ý nghĩa thống kê rất rõ ràng. Giá trị p rất nhỏ (gần bằng 0) khẳng định mối liên hệ giữa tình trạng hôn nhân và khả năng sở hữu nhà không phải do ngẫu nhiên. Điều này cho thấy người đã kết hôn có khả năng sở hữu nhà cao hơn đáng kể so với người độc thân trong dữ liệu khảo sát.

or <- oddsratio(r1)
or
## $data
##        
##            N    Y Total
##   M     1719 5147  6866
##   S     3896 3297  7193
##   Total 5615 8444 14059
## 
## $measure
##    odds ratio with 95% C.I.
##     estimate     lower     upper
##   M 1.000000        NA        NA
##   S 0.282673 0.2630995 0.3036164
## 
## $p.value
##    two-sided
##     midp.exact  fisher.exact    chi.square
##   M         NA            NA            NA
##   S          0 1.822183e-277 3.663022e-272
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "median-unbiased estimate & mid-p exact CI"

Nhận xét: Kết quả phân tích Odds Ratio (OR) cho thấy nhóm người độc thân có tỷ số chênh lệch odds sở hữu nhà chỉ bằng khoảng 0.28 lần so với nhóm người đã kết hôn, với khoảng tin cậy 95% từ 0.26 đến 0.30. Khoảng tin cậy này không bao gồm giá trị 1, chứng tỏ sự khác biệt là có ý nghĩa thống kê rất mạnh. Giá trị p gần bằng 0 cũng cho thấy mối liên hệ này không phải do ngẫu nhiên. Điều này đồng nghĩa với việc người đã kết hôn có odds sở hữu nhà cao hơn đáng kể so với người độc thân, phản ánh rõ sự khác biệt về khả năng sở hữu nhà giữa hai nhóm.

LS0tDQp0aXRsZTogIk5oaeG7h20gduG7pSBUdeG6p24gMiINCmF1dGhvcjogIlF14buzbmggSMawxqFuZyINCmRhdGU6ICJgciBmb3JtYXQoU3lzLnRpbWUoKSwgJyVIOiVNOiVTLCAlZCAtICVtIC0gJVknKWAiDQpvdXRwdXQ6DQogIGh0bWxfZG9jdW1lbnQ6DQogICAgY29kZV9mb2xkaW5nOiBoaWRlDQogICAgY29kZV9kb3dubG9hZDogdHJ1ZQ0KICAgIG51bWJlcl9zZWN0aW9uczogZmFsc2UgIA0KICAgIHRvYzogdHJ1ZQ0KICAgIHRvY19kZXB0aDogNQ0KICAgIHRvY19mbG9hdDoNCiAgICAgIGNvbGxhcHNlZDogdHJ1ZQ0KICAgICAgc21vb3RoX3Njcm9sbDogdHJ1ZQ0KICB3b3JkX2RvY3VtZW50Og0KICAgIHRvYzogdHJ1ZQ0KLS0tDQoNCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQ0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBUUlVFKQ0KYGBgDQoNCmBgYHtjc3MsZWNobyA9IEZBTFNFfQ0KaDEgew0KICBmb250LWZhbWlseTogIlRpbWVzIE5ldyBSb21hbiIsIFRpbWVzLCBzZXJpZjsNCiAgZm9udC1zaXplOiAzMnB4Ow0KICBmb250LXdlaWdodDogYm9sZA0KICB9DQoNCmgyIHsNCiAgZm9udC1mYW1pbHk6ICJUaW1lcyBOZXcgUm9tYW4iLCBUaW1lcywgc2VyaWY7DQogIGZvbnQtc2l6ZTogMjhweDsNCiAgZm9udC13ZWlnaHQ6IGJvbGQ7DQogDQp9DQoNCmgzIHsNCiAgZm9udC1mYW1pbHk6ICJUaW1lcyBOZXcgUm9tYW4iLCBUaW1lcywgc2VyaWY7DQogIGZvbnQtc2l6ZTogMjRweDsNCiAgZm9udC13ZWlnaHQ6IGJvbGQ7DQogIGZvbnQtc3R5bGU6IGl0YWxpYzsNCn0NCg0KaDQge2ZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIiwgVGltZXMsIHNlcmlmOw0KICBmb250LXNpemU6IDIwcHg7DQogIGZvbnQtc3R5bGU6IGl0YWxpY30NCg0KYm9keSB7DQogIGZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIiwgVGltZXMsIHNlcmlmOw0KICBmb250LXNpemU6IDE4cHg7DQogIA0KfQ0KcDpub3QoaDEpOm5vdChoMik6bm90KGgzKTpub3QoaDQpOm5vdChoNSkgew0KICB0ZXh0LWluZGVudDogMmVtO30NCnAgew0KICB0ZXh0LWFsaWduOiBqdXN0aWZ5Ow0KICB9DQoudG9jaWZ5LWhlYWRlciB7DQogIGZvbnQtd2VpZ2h0OiBib2xkOw0KfQ0KDQpgYGANCg0KIyAqKlBo4bqnbiAxOiBUw6xtIGhp4buDdSB2w6AgY2h14bqpbiBi4buLIGThu68gbGnhu4d1KioNCg0KYGBge3IsbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCmxpYnJhcnkodGlkeXZlcnNlKQ0KbGlicmFyeShEVCkNCmxpYnJhcnkoc2NhbGVzKQ0KbGlicmFyeShwc3ljaCkNCmxpYnJhcnkoa25pdHIpDQpsaWJyYXJ5KGthYmxlRXh0cmEpDQpgYGANCg0KIyMgKioxLjEgxJDhu41jIGThu68gbGnhu4d1KioNCg0KQuG7mSBk4buvIGxp4buHdSBTdXBlcm1hcmtldCBUcmFuc2FjdGlvbnMgZ+G7k20gMTQwNTkgcXVhbiBzw6F0LCBt4buXaSBz4buRIGxp4buHdSDEkeG6oWkgZGnhu4duIGNobyBt4buZdCBnaWFvIGThu4tjaCB04bqhaSBzacOqdSB0aOG7iy4gROG7ryBsaeG7h3UgYmFvIGfhu5NtIDE2IGPhu5l0IHbhu5tpIHRow7RuZyB0aW4gbmjGsCBzYXU6IFB1cmNoYXNlRGF0ZSAoTmfDoHkgbXVhIGjDoG5nKSwgQ3VzdG9tZXJJRCAoTcOjIGtow6FjaCBow6BuZyksIEdlbmRlciAoR2nhu5tpIHTDrW5oKSwgTWFyaXRhbFN0YXR1cyAoVMOsbmggdHLhuqFuZyBow7RuIG5ow6JuKSwgSG9tZW93bmVyIChUw6xuaCB0cuG6oW5nIHPhu58gaOG7r3UgbmjDoCksIENoaWxkcmVuIChT4buRIGNvbiksIEFubnVhbEluY29tZSAoVGh1IG5o4bqtcCBow6BuZyBuxINtKSwgQ2l0eSAoVGjDoG5oIHBo4buRKSwgU3RhdGVvclByb3ZpbmNlIChCYW5nIGhv4bq3YyB04buJbmgpLCBDb3VudHJ5IChRdeG7kWMgZ2lhKSwgUHJvZHVjdEZhbWlseSAoTmjDs20gc+G6o24gcGjhuqltKSwgUHJvZHVjdERlcGFydG1lbnQgKELhu5kgcGjhuq1uIHPhuqNuIHBo4bqpbSksIFByb2R1Y3RDYXRlZ29yeSAoRGFuaCBt4bulYyBz4bqjbiBwaOG6qW0pLCBVbml0c1NvbGQgKFPhu5EgbMaw4bujbmcgYsOhbiByYSksIHbDoCBSZXZlbnVlIChEb2FuaCB0aHUpLiANCg0KYGBge3IsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQpkPC0gcmVhZC5jc3YoIkQ6L0hLMl9QVERMRFRfVE1UL1N1cGVybWFya2V0IFRyYW5zYWN0aW9ucy5jc3YiLCBoZWFkZXI9VCkNCmRhdGF0YWJsZShkLG9wdGlvbnMgPSBsaXN0KHNjcm9sbFggPSBUUlVFKSkNCmBgYA0KDQpgYGB7cn0NCm5hbWVzKGQpDQpgYGANCipC4buZIGThu68gbGnhu4d1IHbhu5tpIGPDoWMgYmnhur9uIMSR4buLbmggdMOtbmgqDQogDQpUYSB0aOG7sWMgaGnhu4duIHThuqFvMSBkYXRhZnJhbWUgbeG7m2kgY2jhu4kgY2jhu6lhIGPDoWMgYmnhur9uIMSR4buLbmggdMOtbmgsIHRhIGfDoW4gZGF0YSBt4bubaSBuw6B5IHbDoG8gb2JqZWN0IHbhu5tpIHTDqm4gZF9jYXQuDQoNCmBgYHtyLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KY2F0PC0gYygiR2VuZGVyIiwgIk1hcml0YWxTdGF0dXMiLCAiSG9tZW93bmVyIiwgIkFubnVhbEluY29tZSIsICJDaXR5IiwgIlN0YXRlb3JQcm92aW5jZSIsICJDb3VudHJ5IiwgIlByb2R1Y3RGYW1pbHkiLCAiUHJvZHVjdERlcGFydG1lbnQiLCAiUHJvZHVjdENhdGVnb3J5IikNCmRfY2F0PC1kWywgY2F0XQ0KZGF0YXRhYmxlKGRfY2F0LG9wdGlvbnMgPSBsaXN0KHNjcm9sbFggPSBUUlVFKSkNCmBgYA0KDQojIyAqKjEuMiBD4bqldSB0csO6YyBj4bunYSBk4buvIGxp4buHdSoqIA0KDQrEkOG7gyBjw7MgY8OhaSBuaMOsbiB04buVbmcgcXVhbiB24buBIGPhuqV1IHRyw7pjIGPhu6dhIGLhu5kgZOG7ryBsaeG7h3UsIGJhbyBn4buTbSBz4buRIGzGsOG7o25nIHF1YW4gc8OhdCwgc+G7kSBsxrDhu6NuZyBiaeG6v24sIGtp4buDdSBk4buvIGxp4buHdSBj4bunYSB04burbmcgYmnhur9uIHbDoCBt4buZdCBz4buRIGdpw6EgdHLhu4sgxJFp4buDbiBow6xuaCwgdGEgc+G7rSBk4bulbmcgaMOgbSBzdHIoKSBuaMawIHNhdToNCg0KYGBge3J9DQpzdHIoZCkgI0PhuqV1IHRyw7pjIHRyb25nIGThu68gbGnhu4d1DQpgYGANClF1YSBr4bq/dCBxdeG6oyBj4bunYSBow6BtIHN0cigpLCB0YSB0aOG6pXkgYuG7mSBk4buvIGxp4buHdSBiYW8gZ+G7k20gMTQwNTkgZMOybmcgZOG7ryBsaeG7h3UgdMawxqFuZyDhu6luZyB24bubaSBjw6FjIHF1YW4gc8OhdCB2w6AgMTYgY+G7mXQgdGjDtG5nIHRpbiB0xrDGoW5nIOG7qW5nIHbhu5tpIGPDoWMgYmnhur9uLiBN4bulYyDEkcOtY2ggY+G7p2EgcGjDom4gdMOtY2ggbMOgIHPhu60gZOG7pW5nIGPDoWMgcGjGsMahbmcgcGjDoXAgdGjhu5FuZyBrw6ogbcO0IHThuqMgdsOgIHRo4buRbmcga8OqIHN1eSBkaeG7hW4gxJHhu4MgdMOsbSBoaeG7g3UgxJHhurdjIMSRaeG7g20ga2jDoWNoIGjDoG5nIHbDoCBow6BuaCB2aSBtdWEgc+G6r20gY+G7p2EgaOG7jS4gUGjDom4gdMOtY2ggc+G6vSB04bqtcCB0cnVuZyB2w6BvIGPDoWMgYmnhur9uIMSR4buLbmggdMOtbmgsIGJhbyBn4buTbToNCg0KIC0gR2VuZGVyOiBHaeG7m2kgdMOtbmggKEYg4oCTIE7hu68sIE0g4oCTIE5hbSkNCg0KIC0gTWFyaXRhbFN0YXR1czogVMOsbmggdHLhuqFuZyBow7RuIG5ow6JuIChTIOKAkyDEkOG7mWMgdGjDom4sIE0g4oCTIMSQw6Mga+G6v3QgaMO0bikNCg0KIC0gSG9tZW93bmVyOiBT4bufIGjhu691IG5ow6AgKFkg4oCTIEPDsyBuaMOgLCBOIOKAkyBLaMO0bmcgY8OzIG5ow6ApDQoNCiAtIEFubnVhbEluY29tZTogVGh1IG5o4bqtcCBow6BuZyBuxINtIChk4bqhbmcgcGjDom4gbG/huqFpIHRoZW8ga2hv4bqjbmcpDQoNCiAtIENpdHksIFN0YXRlb3JQcm92aW5jZSwgQ291bnRyeTogVGjDtG5nIHRpbiDEkeG7i2EgbMO9IG7GoWkgY8awIHRyw7ogY+G7p2Ega2jDoWNoIGjDoG5nDQoNCiAtIFByb2R1Y3RGYW1pbHksIFByb2R1Y3REZXBhcnRtZW50LCBQcm9kdWN0Q2F0ZWdvcnk6IEPDoWMgbeG7qWMgcGjDom4gbG/huqFpIHPhuqNuIHBo4bqpbSBtw6Aga2jDoWNoIGjDoG5nIMSRw6MgbXVhDQogDQojIyAqKjEuMyBIaeG7g24gdGjhu4sgbeG7mXQgdsOgaSBkw7JuZyDEkeG6p3UgdsOgIGN14buRaSBj4bunYSBk4buvIGxp4buHdSoqDQoNCk5o4bqxbSBjw7MgxJHGsOG7o2MgY8OhaSBuaMOybiB04buVbmcgcXVhbiB2duG7gWJvb2ogZOG7ryBsaeG7h3UgdGEgc+G7rSBk4bulbmcgaMOgbSBoZWFkKCkgdsOgIHRhaWQoKSDEkeG7gyB4ZW0gbeG7mXQgc+G7kSBkw7JuZyDEkeG6p3UgdsOgIGTDsm5nIGN14buRaSBj4bunYSBi4buZIGThu68gbGnhu4d1IFN1cGVybWFya2V0IFRyYW5zYWN0aW9uczogDQoNCmBgYHtyfQ0KaGVhZChkKSAjaGnhu4NuIHRo4buLIHbDoGkgZMOybmcgxJHhuqd1DQpgYGANCmBgYHtyfQ0KdGFpbChkKSAjaGnhu4NuIHRo4buLIHbDoG8gZMOybmcgY3Xhu5FpIA0KYGBgDQojIyAqKjEuNCBLaeG7g20gdHJhIGdpw6EgdHLhu4sgdGhp4bq/dSoqDQogDQpOaOG6sW0gxJHhuqNtIGLhuqNvIGNo4bqldCBsxrDhu6NuZyBk4buvIGxp4buHdSB2w6AgdHLDoW5oIHNhaSBs4buHY2ggdHJvbmcgcXXDoSB0csOsbmggcGjDom4gdMOtY2gsIHRhIGPhuqduIGtp4buDbSB0cmEgeGVtIGLhu5kgZOG7ryBsaeG7h3UgY8OzIGNo4bupYSBnacOhIHRy4buLIHRoaeG6v3UgKE5BKSBoYXkga2jDtG5nLiDEkGnhu4F1IG7DoHkgZ2nDunAgeMOhYyDEkeG7i25oIGxp4buHdSBjw7MgY+G6p24geOG7rSBsw70gaG/hurdjIGzDoG0gc+G6oWNoIGThu68gbGnhu4d1IHRyxrDhu5tjIGtoaSB0aeG6v3AgdOG7pWMgcGjDom4gdMOtY2g6DQoNCmBgYHtyfQ0KaWYgKGFueShpcy5uYShkKSkpIHsNCiAgY2F0KCJDw7MgZ2nDoSB0cuG7iyB0aGnhur91IHRyb25nIGThu68gbGnhu4d1LlxuIikNCn0gZWxzZSB7DQogIGNhdCgiS2jDtG5nIGPDsyBnacOhIHRy4buLIHRoaeG6v3UgdHJvbmcgZOG7ryBsaeG7h3UuXG4iKQ0KfQ0KYGBgDQpW4bubaSDEkW/huqFuIGNvZGUgdHLDqm4gbuG6v3UgdHJvbmcgYuG7mSBk4buvIGxp4buHdSBjw7MgYuG6pXQga8OsIGRk4buvbGlldWVqIG5uw6BvYmlqIHRoaeG6v3UgdHRow6xrZWV0cyBxdeG6oyBz4bq9IG5o4bqtbiDEkcaw4bujYyBsw6AgY8OzIGdpw6EgdHLhu4sgdGhp4bq/dSB0cm9uZyBk4buvIGxp4buHdSB2w6AgbmfGsOG7o2MgbOG6oWkuIA0KDQpW4bubaSBi4buZIGThu68gbGnhu4d1IMSRxrDhu6NjIGfDoW4gY2hvICoqZCoqIG5o4bqtbiDEkcaw4bujYyBr4bq/dCBxdeG6oyBsw6AgS2jDtG5nIGPDsyBnacOhIHRy4buLIHRoaeG6v3UgdHJvbmcgZOG7ryBsaeG7h3UuIMSQaeG7gXUgbsOgeSBjaG8gdGjhuqV5IGThu68gbGnhu4d1ICBraMO0bmcgY8OzIMO0IHRy4buRbmcgaGF5IGdpw6EgdHLhu4sgYuG7iyB0aGnhur91IHRyb25nIHRvw6BuIGLhu5kgYuG7mSBk4buvIGxp4buHdS4gxJDDonkgbMOgIMSRaeG7gXUga2nhu4duIMSR4buDIHRp4bq/biBow6BuaCBjw6FjIHBow6JuIHTDrWNoIHRp4bq/cCB0aGVvIG3DoCBraMO0bmcgY+G6p24gdGjhu7FjIGhp4buHbiBixrDhu5tjIHjhu60gbMO9IGdpw6EgdHLhu4sgdGhp4bq/dS4NCg0KIyMgKioxLjUgQ2h1eeG7g24gxJHhu5VpIGPDoWMgYmnhur9uIMSR4buLbmggdMOtbmggc2FuZyBraeG7g3UgZmFjdG9yKioNCg0KU2F1IGtoaSB0w6xtIGhp4buDdSBzxqEgYuG7mSB24buBIGLhu5kgIGThu68gbGnhu4d1LCBixrDhu5tjIHRp4bq/cCB0aGVvIGzDoCBjaHV54buDbiBjw6FjIGJp4bq/biDEkeG7i25oIHTDrW5oIHNhbmcga2nhu4N1IGThu68gbGnhu4d1IGZhY3Rvci4gVmnhu4djIG7DoHkgZ2nDunAgY8OhYyBjw7RuZyBj4bulIHBow6JuIHTDrWNoIHRyb25nIFIgaGnhu4N1IHLDtSBoxqFuIHbhu4EgYuG6o24gY2jhuqV0IHBow6JuIGxv4bqhaSBj4bunYSBjw6FjIGJp4bq/biBuw6B5LCDEkeG7k25nIHRo4budaSBo4buXIHRy4bujIHRo4buxYyBoaeG7h24gY8OhYyBwaMOibiB0w61jaCB0aOG7kW5nIGvDqiBwaMO5IGjhu6NwLg0KDQpgYGB7cn0NCmRbY2F0XSA8LSBsYXBwbHkoZF9jYXQsIGZhY3RvcikgI8SQxrBhIGThu68gbGnhu4d1IHbhu4EgZOG6oW5nIGZhY3Rvcg0KZmFjdG9yX2NoZWNrPC1zYXBwbHkoZFtjYXRdLCBpcy5mYWN0b3IpICMgS2nhu4NtIHRyYSB04burbmcgY+G7mXQgY8OzIHBo4bqjaSBsw6AgZmFjdG9yIGhheSBraMO0bmcNCg0KIyBU4bqhbyBi4bqjbmcga+G6v3QgcXXhuqMNCmZhY3Rvcl90YWJsZSA8LSBkYXRhLmZyYW1lKA0KICBCaeG6v24gPSBuYW1lcyhmYWN0b3JfY2hlY2spLA0KICBGYWN0b3IgPSBhcy5sb2dpY2FsKGZhY3Rvcl9jaGVjaykNCikNCg0KIyBIaeG7g24gdGjhu4sgYuG6o25nIGPEg24gZ2nhu69hDQprYWJsZShmYWN0b3JfdGFibGUsIGNhcHRpb24gPSAiS2nhu4NtIHRyYSBraeG7g3UgRmFjdG9yIGNobyBjw6FjIGJp4bq/biDEkeG7i25oIHTDrW5oIiwgYWxpZ24gPSAiYyIpICU+JQ0Ka2FibGVfc3R5bGluZyhwb3NpdGlvbiA9ICJjZW50ZXIiLCBmdWxsX3dpZHRoID0gRkFMU0UpDQpgYGANCg0KVHJvbmcgYuG6o25nIHRyw6puIHRhIG5o4bqtbiB0aOG6pXkgY8OhYyBiaeG6v24gxJHhu4tuaCB0w61uaCDEkeG7gXUgxJHGsGEgcmEga+G6v3QgcXXhuqMgbMOgIFRSVUUgdOG7qWMgbMOgIMSR4buBdSDEkcOjIMSRxrDhu6NjIGNodXnhu4NuIMSR4buVaSB0aMOgbmggY8O0bmcgc2FuZyBraeG7g3UgZOG7ryBsaeG7h3UgZmFjdG9yLg0KDQojICoqUGjhuqduIDI6ICBQaMOibiB0w61jaCBtw7QgdOG6oyBiaeG6v24gxJHhu4tuaCB0w61uaCAoVW5pdmFyaWF0ZSBEZXNjcmlwdGl2ZSBBbmFseXNpcykqKg0KDQojIyAqKjIuMSBCaeG6v24gR2VuZGVyKioNCg0KKlRo4buRbmcga8OqIHThuqduIHN14bqldCogDQogDQpUYSB0aOG7sWMgaGnhu4duIHRo4buRbmcga8OqIHThuqduIHPhu5EgdsOgIHThuqduIHN14bqldCBjaG8gYmnhur9uIEdlbmRlciDEkcaw4bujYyBr4bq/dCBxdeG6oyBuaMawIHNhdQ0KDQpgYGB7cn0NCkdlbmRlcl8xPC10YWJsZShkX2NhdCRHZW5kZXIpDQpHZW5kZXJfMQ0KYGBgDQpgYGB7cn0NCkdlbmRlcl8yPC10YWJsZShkX2NhdCRHZW5kZXIpL3N1bShucm93KGRfY2F0KSkqMTAwICN04bqnbiBzdeG6pXQNCkdlbmRlcl8yDQpgYGANCg0KKlRy4buxYyBxdWFuIGjDs2EgZOG7ryBsaeG7h3UqDQoNCmBgYHtyLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KDQpjIDwtIGFzLmRhdGEuZnJhbWUodGFibGUoZF9jYXQkR2VuZGVyKSkNCmNvbG5hbWVzKGMpIDwtIGMoIkdlbmRlciIsICJDb3VudCIpDQpnZ3Bsb3QoYywgYWVzKHggPSBHZW5kZXIsIHkgPSBDb3VudCwgZmlsbCA9IEdlbmRlcikpICsNCiAgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIpICsNCiAgbGFicyh0aXRsZSA9ICJCaeG7g3UgxJHhu5MgYmnhu4N1IHRo4buLIGdp4bubaSB0w61uaCBraMOhY2ggaMOgbmciLCB4ID0gIkdp4bubaSB0w61uaCIsIHkgPSAiU+G7kSBsxrDhu6NuZyIpICsNCiAgdGhlbWVfbWluaW1hbCgpICsgIA0KICB0aGVtZSh0ZXh0ID0gZWxlbWVudF90ZXh0KGZhbWlseSA9ICJzYW5zIikpDQpgYGANCmBgYHtyfQ0KcGllKEdlbmRlcl8yLA0KbGFiZWxzID0gcGFzdGUobmFtZXMoR2VuZGVyXzIpLCByb3VuZChHZW5kZXJfMiwgMiksICIlIiksDQptYWluID0gIlThu7cgbOG7hyBnaeG7m2kgdMOtbmgiKQ0KYGBgDQoNCipOaOG6rW4geMOpdCoNCg0KLSBCaeG7g3UgxJHhu5MgdGjhu4MgaGnhu4duIHPhu5EgbMaw4bujbmcga2jDoWNoIGjDoG5nIHRoZW8gZ2nhu5tpIHTDrW5oIGfhu5NtIGhhaSBuaMOzbTogRiAobuG7rykgdsOgIE0gKG5hbSkuDQoNCi0gU+G7kSBsxrDhu6NuZyBraMOhY2ggaMOgbmcgbuG7ryAoRikgbmjhu4luaCBoxqFuIHNvIHbhu5tpIGtow6FjaCBow6BuZyBuYW0gKE0pLCB0dXkgbmhpw6puIHPhu7EgY2jDqm5oIGzhu4djaCBraMO0bmcgbOG7m24gY2hvIHRo4bqleSBzacOqdSB0aOG7iyB0aHUgaMO6dCBraMOhY2ggaMOgbmcgdOG7qyBj4bqjIGhhaSBuaMOzbSBnaeG7m2kgdMOtbmguxJBp4buBdSBuw6B5IGNobyB0aOG6pXkgZOG7ryBsaeG7h3UgY8OzIHTDrW5oIMSR4bqhaSBkaeG7h24gZ2nhu5tpIHTGsMahbmcgxJHhu5FpIHThu5F0LCB0csOhbmggxJHGsOG7o2MgdGhpw6puIGzhu4djaCBnaeG7m2kgdMOtbmguDQoNCiMjICoqMi4yIEJp4bq/biBNYXJpdGFsU3RhdHVzKioNCg0KKlRo4buRbmcga8OqIHThuqduIHN14bqldCoNCg0KVGEgdGjhu7FjIGhp4buHbiB0aOG7kW5nIGvDqiB04bqnbiBz4buRIHbDoCB04bqnbiBzdeG6pXQgY2hvIGJp4bq/biBNYXJpdGFsU3RhdHVzIMSRxrDhu6NjIGvhur90IHF14bqjIG5oxrAgc2F1Og0KDQpgYGB7cn0NCk1hcml0YWxTdGF0dXNyXzE8LXRhYmxlKGRfY2F0JE1hcml0YWxTdGF0dXMpDQpNYXJpdGFsU3RhdHVzcl8xDQpgYGANCmBgYHtyfQ0KTWFyaXRhbFN0YXR1c18yPC10YWJsZShkX2NhdCRNYXJpdGFsU3RhdHVzKS9zdW0obnJvdyhkX2NhdCkpKjEwMCANCk1hcml0YWxTdGF0dXNfMg0KYGBgDQoNCipUcuG7sWMgcXVhbiBow7NhIGThu68gbGnhu4d1Kg0KDQpgYGB7cn0NCmMxIDwtIGFzLmRhdGEuZnJhbWUodGFibGUoZF9jYXQkTWFyaXRhbFN0YXR1cykpDQpjb2xuYW1lcyhjMSkgPC0gYygiTWFyaXRhbFN0YXR1cyIsICJDb3VudCIpDQpnZ3Bsb3QoYzEsIGFlcyh4ID0gTWFyaXRhbFN0YXR1cywgeSA9IENvdW50LCBmaWxsID0gTWFyaXRhbFN0YXR1cykpICsNCmdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiKSArDQpsYWJzKHRpdGxlID0gIkJp4buDdSDEkeG7kyBiaeG7g3UgdGjhu4sgdMOsbmggdHLhuqFuZyBow7RuIG5ow6JuIGtow6FjaCBow6BuZyIsIHggPSAiVGluaCB0cuG6oW5nIGjDtG4gbmjDom4iLCB5ID0gIlPhu5EgbMaw4bujbmciKSArDQp0aGVtZV9taW5pbWFsKCkNCmBgYA0KDQoqTmjhuq1uIHjDqXQqDQoNCkvhur90IHF14bqjIGNobyB0aOG6pXkgYmnhur9uIE1hcml0YWxTdGF0dXMgY8OzIHRy4bqhbmcgdGjDoWkgaMO0biBuaMOibiDEkeG7mWMgdGjDom4gKFMpIGNoaeG6v20gdOG7tyBs4buHIGNhbyBoxqFuIG3hu5l0IGNow7p0IHbhu5tpIDUxLjE2JSB04buVbmcgdGjhu4MsIHTGsMahbmcg4bupbmcgNzE5MyBuZ8aw4budaS4gVHJvbmcga2hpIMSRw7MsIG5ow7NtIMSRw6Mga+G6v3QgaMO0biAoTSkgY2hp4bq/bSA0OC44NCUsIHTGsMahbmcg4bupbmcgNjg2NiBuZ8aw4budaS4gTmjGsCB24bqteSwgZMOibiBz4buRIHRyb25nIG3huqt1IMSRxrDhu6NjIHBow6JuIGLhu5EgdMawxqFuZyDEkeG7kWkgxJHhu4F1IGdp4buvYSBoYWkgbmjDs20gxJHhu5ljIHRow6JuIHbDoCDEkcOjIGvhur90IGjDtG4sIHbhu5tpIHPhu5EgbmfGsOG7nWkgxJHhu5ljIHRow6JuIG5o4buJbmggaMahbiBt4buZdCBjaMO6dC4gxJBp4buBdSBuw6B5IGdpw7pwIGPDom4gYuG6sW5nIHRyb25nIGPDoWMgcGjDom4gdMOtY2ggbGnDqm4gcXVhbiDEkeG6v24gdHLhuqFuZyB0aMOhaSBow7RuIG5ow6JuLg0KDQojIyAqKjIuMyBCaeG6v24gSG9tZW93bmVyKioNCg0KKlRo4buRbmcga8OqIHThuqduIHN14bqldCoNCg0KVGEgdGjhu7FjIGhp4buHbiB0aOG7kW5nIGvDqiB04bqnbiBz4buRIHbDoCB04bqnbiBzdeG6pXQgY2hvIGJp4bq/biBIb21lb3duZXIgIMSRxrDhu6NjIGvhur90IHF14bqjIG5oxrAgc2F1Og0KDQpgYGB7cn0NCkhvbWVvd25lcl8xPC10YWJsZShkX2NhdCRIb21lb3duZXIpDQpIb21lb3duZXJfMQ0KYGBgDQoNCmBgYHtyfQ0KSG9tZW93bmVyXzI8LXRhYmxlKGRfY2F0JEhvbWVvd25lcikvc3VtKG5yb3coZF9jYXQpKSoxMDAjdOG6p24gc3XhuqV0DQpIb21lb3duZXJfMg0KYGBgDQoNCipUcuG7sWMgcXVhbiBow7NhIGThu68gbGnhu4d1Kg0KDQpgYGB7cn0NCnBpZShIb21lb3duZXJfMiwNCmxhYmVscyA9IHBhc3RlKG5hbWVzKEhvbWVvd25lcl8yKSwgcm91bmQoSG9tZW93bmVyXzIsIDIpLCAiJSIpLA0KbWFpbiA9ICJU4bu3IGzhu4cgY8OzIGhv4bq3YyBraMO0bmcgc+G7nyBo4buvdSBuaMOgIikNCmBgYA0KDQoqTmjhuq1uIHjDqXQqDQoNCkThu7FhIHbDoG8ga+G6v3QgcXXhuqMgdGjhu5FuZyBrw6osIHRyb25nIHThu5VuZyBz4buRIHF1YW4gc8OhdCwgY8OzIDgsNDQ0IG5nxrDhu51pIGzDoCBjaOG7pyBz4bufIGjhu691IG5ow6AgKEhvbWVvd25lciA9IFkpIGNoaeG6v20ga2hv4bqjbmcgNjAuMDYlIHThu5VuZyB0aOG7gywgdHJvbmcga2hpIDUsNjE1IG5nxrDhu51pIGtow7RuZyBwaOG6o2kgbMOgIGNo4bunIHPhu58gaOG7r3UgbmjDoCBjaGnhur9tIGtob+G6o25nIDM5Ljk0JS4gxJBp4buBdSBuw6B5IGNobyB0aOG6pXkgxJFhIHPhu5Ega2jDoWNoIGjDoG5nIHRyb25nIGThu68gbGnhu4d1IGzDoCBuaOG7r25nIG5nxrDhu51pIHPhu58gaOG7r3UgbmjDoCwgxJFp4buBdSBuw6B5IGPDsyB0aOG7gyDhuqNuaCBoxrDhu59uZyB0w61jaCBj4buxYyDEkeG6v24gaMOgbmggdmkgdGnDqnUgZMO5bmcgaG/hurdjIGto4bqjIG7Eg25nIGNoaSB0cuG6oyBj4bunYSBo4buNIHRyb25nIGPDoWMgcGjDom4gdMOtY2ggdGnhur9wIHRoZW8uDQoNCiMjICoqMi40IEJp4bq/biBBbm51YWxJbmNvbWUqKg0KDQoqVGjhu5FuZyBrw6ogdOG6p24gc3XhuqV0KiANCg0KVGEgdGjhu7FjIGhp4buHbiB0aOG7kW5nIGvDqiB04bqnbiBz4buRIHbDoCB04bqnbiBzdeG6pXQgY2hvIGJp4bq/biBBbm51YWxJbmNvbWUgxJHGsOG7o2Mga+G6v3QgcXXhuqMgbmjGsCBzYXU6DQoNCmBgYHtyfQ0KQW5udWFsSW5jb21lXzE8LXRhYmxlKGRfY2F0JEFubnVhbEluY29tZSkNCkFubnVhbEluY29tZV8xDQpgYGANCg0KDQpgYGB7cn0NCkFubnVhbEluY29tZV8yPC10YWJsZShkX2NhdCRBbm51YWxJbmNvbWUpL3N1bShucm93KGRfY2F0KSkqMTAwI3ThuqduIHN14bqldA0KQW5udWFsSW5jb21lXzINCmBgYA0KDQoqVHLhu7FjIHF1YW4gaMOzYSBk4buvIGxp4buHdSoNCg0KYGBge3J9DQpjNF8xIDwtIGRfY2F0IHw+DQogIGdyb3VwX2J5KEFubnVhbEluY29tZSkgfD4NCiAgc3VtbWFyaXNlKGZyZXEgPSBuKCkpIHw+DQogIG11dGF0ZShwZXIgPSBmcmVxIC8gc3VtKGZyZXEpLA0KICAgICAgICAgbGFiZWwgPSBwYXN0ZTAoZnJlcSwgIiAoIiwgcm91bmQocGVyICogMTAwLCAxKSwgIiUpIikpDQoNCmdncGxvdChjNF8xICwgYWVzKHggPSAiIiwgeSA9IHBlciwgZmlsbCA9IEFubnVhbEluY29tZSkpICsNCiAgZ2VvbV9jb2wod2lkdGggPSAxLCBjb2xvciA9ICJ3aGl0ZSIpICsNCiAgY29vcmRfcG9sYXIoInkiKSArDQogIGdlb21fdGV4dChhZXMobGFiZWwgPSBwYXN0ZTAocm91bmQocGVyKjEwMCwgMiksICIlIikpLA0KICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9zdGFjayh2anVzdCA9IDAuNSksDQogICAgICAgICAgICBzaXplID0gMi41KSArDQogIHNjYWxlX2ZpbGxfYnJld2VyKHBhbGV0dGUgPSAiUGFzdGVsMiIpICsgICMgQuG6oW4gY8OzIHRo4buDIGNo4buNbiBTZXQxLCBTZXQyLi4uDQogIGxhYnModGl0bGUgPSAiVOG7tyBs4buHIHRodSBuaOG6rXAgaOG6sW5nIG7Eg20gY+G7p2Ega2jDoWNoIGjDoG5nIiwgZmlsbCA9ICJUaHUgbmjhuq1wIikgKw0KICB0aGVtZV92b2lkKCkNCmBgYA0KDQoqTmjhuq1uIHjDqXQqDQoNCk5ow7NtIHRodSBuaOG6rXAgJDMwSyAtICQ1MEsgY2hp4bq/bSBoxqFuIDEvMyB04buVbmcgc+G7kSBxdWFuIHPDoXQgduG7m2kgMzIuNzMlLCBsw6AgbmjDs20gxJHDtG5nIG5o4bqldCB0cm9uZyBk4buvIGxp4buHdS4gS2hpIGvhur90IGjhu6NwIHbhu5tpIG5ow7NtICQxMEsgLSAkMzBLLCB04buVbmcgdOG7tyBs4buHIGzDqm4gxJHhur9uIGtob+G6o25nIDU1JSwgY2hvIHRo4bqleSDEkWEgc+G7kSBraMOhY2ggaMOgbmcgdGh14buZYyBuaMOzbSBjw7MgdGh1IG5o4bqtcCB0cnVuZyBiw6xuaCBob+G6t2MgdGjhuqVwLCBwaOG6o24gw6FuaCBt4bupYyB0aHUgbmjhuq1wIHBo4buVIGJp4bq/biB0cm9uZyBt4bqrdS4gTmfGsOG7o2MgbOG6oWksIG5ow7NtIHRodSBuaOG6rXAgY2FvIHRyw6puICQ5MEssIGJhbyBn4buTbSBjw6FjIGtob+G6o25nICQ5MEsgLSAkMTEwSywgJDExMEsgLSAkMTMwSywgJDEzMEsgLSAkMTUwSyB2w6AgJDE1MEsrLCBjaOG7iSBjaGnhur9tIGtob+G6o25nIDE2LjI4JSB04buVbmcgc+G7kSwgdGjhu4MgaGnhu4duIG5ow7NtIHRodSBuaOG6rXAgY2FvIHTGsMahbmcgxJHhu5FpIG5o4buPLiBL4bq/dCBxdeG6oyBuw6B5IGNobyB0aOG6pXkgcGjhuqduIGzhu5tuIGPDoWMgxJHGoW4gbXVhIGjDoG5nIMSRxrDhu6NjIHRo4buxYyBoaeG7h24gYuG7n2kga2jDoWNoIGjDoG5nIGPDsyBt4bupYyB0aHUgbmjhuq1wIHRydW5nIGLDrG5oIGhv4bq3YyB0aOG6pXAuDQoNCiMjICoqMi41IEJp4bq/biBDaXR5KioNCg0KKlRo4buRbmcga8OqIHThuqduIHN14bqldCogDQoNClRhIHRo4buxYyBoaeG7h24gdGjhu5FuZyBrw6ogdOG6p24gc+G7kSB2w6AgdOG6p24gc3XhuqV0IGNobyBiaeG6v24gQ2l0eSDEkcaw4bujYyBr4bq/dCBxdeG6oyBuaMawIHNhdToNCg0KYGBge3J9DQpDaXR5XzE8LXRhYmxlKGQkQ2l0eSkNCkNpdHlfMQ0KYGBgDQoNCmBgYHtyfQ0KQ2l0eV8yPC10YWJsZShkJENpdHkpL3N1bShucm93KGQpKSoxMDAjdOG6p24gc3XhuqV0DQpDaXR5XzINCmBgYA0KDQoqVHLhu7FjIHF1YW4gaMOzYSBk4buvIGxp4buHdSoNCg0KYGBge3J9DQpjNSA8LSBhcy5kYXRhLmZyYW1lKENpdHlfMSkNCmNvbG5hbWVzKGM1KSA8LSBjKCJDaXR5IiwgIkNvdW50IikNCmdncGxvdChjNSwgYWVzKHggPSBDaXR5LCB5ID0gQ291bnQsIGZpbGwgPSBDaXR5KSkgKw0KICBnZW9tX2NvbChmaWxsID0gImxpZ2h0Z3JlZW4iLCBjb2xvciA9ICJibGFjayIpICsNCiAgbGFicyh4ID0gIlRow6BuaCBwaOG7kSIsIHkgPSAiVOG6p24gc+G7kSIsIHRpdGxlID0gIkJp4buDdSDEkeG7kyB04bqnbiBz4buRIGtow6FjaCBow6BuZyDhu58gY8OhYyB0aMOgbmggcGjhu5EiKSArDQogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIGhqdXN0ID0gMSkpDQpgYGANCg0KKk5o4bqtbiB4w6l0Kg0KDQpE4buxYSB0csOqbiBk4buvIGxp4buHdSwgxJHhu4thIMSRaeG7g20gU2FsZW0gY8OzIHThuqduIHPhu5EgY2FvIG5o4bqldCB24bubaSAxMzg2IHbhu5tpIDkuODYlIHThu5VuZyB0aOG7gywgdGnhur9wIHRoZW8gbMOgIFRhY29tYSB2w6AgTG9zIEFuZ2VsZXMgY8WpbmcgY8OzIGNo4buJIHPhu5EgcuG6pXQgbOG7m24sIGzhuqduIGzGsOG7o3QgbuG6sW0gdHJvbmcgbmjDs20gY2FvIG5ow6wuIE5nxrDhu6NjIGzhuqFpLCBjw6FjIHRow6BuaCBwaOG7kSBuaMawIE1leGljbyBDaXR5LCBHdWFkYWxhamFyYSB2w6AgU2FuIEZyYW5jaXNjbyBjw7Mgc+G7kSBsxrDhu6NuZyBraMOhY2ggdGjhuqVwIG5o4bqldCwgY2hvIHRo4bqleSBz4buxIGtow6FjIGJp4buHdCByw7UgcuG7h3QgduG7gSBt4bupYyDEkeG7mSBob+G6t2MgY2jhu4kgc+G7kSBnaeG7r2EgY8OhYyBraHUgduG7sWMuIE5ow6xuIGNodW5nLCBjw7Mgc+G7sSAgcGjDom4gYuG7kSBraMO0bmcgxJHhu5NuZyDEkeG7gXUgY+G7p2EgY8OhYyBjw6FjIHRow6BuaCBwaOG7kS4NCg0KIyMgKioyLjYgQmnhur9uIFN0YXRlb3JQcm92aW5jZSoqDQoNCipUaOG7kW5nIGvDqiB04bqnbiBzdeG6pXQqIA0KDQpUYSB0aOG7sWMgaGnhu4duIHRo4buRbmcga8OqIHThuqduIHPhu5EgdsOgIHThuqduIHN14bqldCBjaG8gYmnhur9uIFN0YXRlb3JQcm92aW5jZSDEkcaw4bujYyBr4bq/dCBxdeG6oyBuaMawIHNhdToNCg0KYGBge3J9DQpTdGF0ZW9yUHJvdmluY2VfMTwtIHRhYmxlKGRfY2F0JFN0YXRlb3JQcm92aW5jZSkNClN0YXRlb3JQcm92aW5jZV8xDQpgYGANCg0KYGBge3J9DQpTdGF0ZW9yUHJvdmluY2VfMjwtdGFibGUoZF9jYXQkU3RhdGVvclByb3ZpbmNlKS9zdW0obnJvdyhkX2NhdCkpKjEwMCAjdOG6p24gc3XhuqV0DQpTdGF0ZW9yUHJvdmluY2VfMg0KYGBgDQoNCipUcuG7sWMgcXVhbiBow7NhIGThu68gbGnhu4d1Kg0KDQpgYGB7cn0NCmM2IDwtIGFzLmRhdGEuZnJhbWUoU3RhdGVvclByb3ZpbmNlXzEpDQpjb2xuYW1lcyhjNikgPC0gYygiU3RhdGVvclByb3ZpbmNlIiwgIkNvdW50IikNCmdncGxvdChjNiwgYWVzKHggPSBTdGF0ZW9yUHJvdmluY2UsIHkgPSBDb3VudCwgZmlsbCA9IENpdHkpKSArDQogIGdlb21fY29sKGZpbGwgPSAic2t5Ymx1ZSIsIGNvbG9yID0gImJsYWNrIikgKw0KICBsYWJzKHggPSAiQmFuZyIsIHkgPSAiVOG6p24gc+G7kSIsIHRpdGxlID0gIkJp4buDdSDEkeG7kyB04bqnbiBz4buRIGtow6FjaCBow6BuZyDhu58gY8OhYyBiYW5nIikgKw0KICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEpKQ0KYGBgDQoNCg0KYGBge3IsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQoNCmM2XzEgPC0gZF9jYXQgfD4NCiAgZ3JvdXBfYnkoU3RhdGVvclByb3ZpbmNlKSB8Pg0KICBzdW1tYXJpc2UoZnJlcSA9IG4oKSkgfD4NCiAgbXV0YXRlKHBlciA9IGZyZXEgLyBzdW0oZnJlcSksDQogICAgICAgICBsYWJlbCA9IHBhc3RlMChmcmVxLCAiICgiLCByb3VuZChwZXIgKiAxMDAsIDEpLCAiJSkiKSkNCg0KZ2dwbG90KGM2XzEgLCBhZXMoeCA9ICIiLCB5ID0gcGVyLCBmaWxsID0gU3RhdGVvclByb3ZpbmNlKSkgKw0KICBnZW9tX2NvbCh3aWR0aCA9IDEsIGNvbG9yID0gIndoaXRlIikgKw0KICBjb29yZF9wb2xhcigieSIpICsNCiAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IHBhc3RlMChyb3VuZChwZXIqMTAwLCAyKSwgIiUiKSksDQogICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX3N0YWNrKHZqdXN0ID0gMC41KSwNCiAgICAgICAgICAgIHNpemUgPSAyLjUpICsNCiAgc2NhbGVfZmlsbF9icmV3ZXIocGFsZXR0ZSA9ICJQYXN0ZWwxIikgKyAgIyBC4bqhbiBjw7MgdGjhu4MgY2jhu41uIFNldDEsIFNldDIuLi4NCiAgbGFicyh0aXRsZSA9ICJU4bu3IGzhu4cgbXVhIGjDoG5nIOG7nyBjw6FjIGJhbiIsIGZpbGwgPSAiQmFuZyIpICsNCiAgdGhlbWVfdm9pZCgpDQoNCmBgYA0KDQoqTmjhuq1uIHjDqXQqDQoNCkThu68gbGnhu4d1IG7DoHkgY2hvIHRo4bqleSBz4buxIHBow6JuIGLhu5EgxJHhu4thIGzDvSBy4bqldCByw7UgcsOgbmcsIHbhu5tpIGJhIGJhbmcgV0EgKFdhc2hpbmd0b24pLCBDQSAoQ2FsaWZvcm5pYSkgdsOgIE9SIChPcmVnb24pIHRo4buRbmcgdHLhu4sgdHV54buHdCDEkeG7kWkg4oCTIGzhuqduIGzGsOG7o3QgY2hp4bq/bSAzMi40OCUsIDE5LjQ0JSB2w6AgMTYuMDklLiBCYSBiYW5nIG7DoHksIMSR4buBdSBu4bqxbSDhu58ga2h1IHbhu7FjIFTDonkgQuG6r2MgVGjDoWkgQsOsbmggRMawxqFuZyBj4bunYSBIb2EgS+G7sywgY+G7mW5nIGzhuqFpIGNoaeG6v20gdOG7m2kgNjguMDElIHThu5VuZyBk4buvIGxp4buHdS4NCg0KVHJvbmcga2hpIMSRw7MsIGPDoWMgYmFuZyBj4bunYSBNZXhpY28gbmjGsCBERiwgR3VlcnJlcm8sIEphbGlzY28sIFZlcmFjcnV6LCBZdWNhdGFuIHbDoCBaYWNhdGVjYXMgY2jhu4kgY2hp4bq/bSB04bu3IHRy4buNbmcgbmjhu48gaMahbiwgdOG7lW5nIGPhu5luZyBjaOG7iSBjaGnhur9tIGtob+G6o25nIDI2LjIzJSBk4buvIGxp4buHdS4NCg0KTmjGsCB24bqteSwgZOG7ryBsaeG7h3UgY2hvIHRo4bqleSBz4buxIHRoacOqbiBs4buHY2ggbeG6oW5oIG3hur0gduG7gSBt4bq3dCDEkeG7i2EgbMO9LCBjaOG7pyB54bq/dSB04bqtcCB0cnVuZyB2w6BvIGJhIGJhbmcgcGjDrWEgVMOieSBC4bqvYyBIb2EgS+G7sywgdHJvbmcga2hpIGPDoWMgdOG7iW5oIGPhu6dhIE1leGljbyBjaOG7iSBnw7NwIHBo4bqnbiBraGnDqm0gdOG7kW4uDQoNCiMjICoqMi43IEJp4bq/biBDb3VudHJ5KioNCg0KKlRo4buRbmcga8OqIHThuqduIHN14bqldCoNCg0KVGEgdGjhu7FjIGhp4buHbiB0aOG7kW5nIGvDqiB04bqnbiBz4buRIHbDoCB04bqnbiBzdeG6pXQgY2hvIGJp4bq/biBDb3VudHJ5IMSRxrDhu6NjIGvhur90IHF14bqjIG5oxrAgc2F1Og0KDQpgYGB7cn0NCkNvdW50cnlfMTwtIHRhYmxlKGRfY2F0JENvdW50cnkpDQpDb3VudHJ5XzENCmBgYA0KYGBge3J9DQpDb3VudHJ5XzI8LXRhYmxlKGRfY2F0JENvdW50cnkpL3N1bShucm93KGRfY2F0KSkqMTAwDQpDb3VudHJ5XzINCmBgYA0KDQoqVHLhu7FjIHF1YW4gaMOzYSBk4buvIGxp4buHdSoNCg0KYGBge3J9DQpjNyA8LSBhcy5kYXRhLmZyYW1lKENvdW50cnlfMSkNCmNvbG5hbWVzKGM3KSA8LSBjKCJDb3VudHJ5IiwgIkNvdW50IikNCmdncGxvdChjNywgYWVzKHggPSBDb3VudHJ5LCB5ID0gQ291bnQsIGZpbGwgPSBDb3VudHJ5KSkgKw0KICBnZW9tX2NvbChmaWxsID0gIiMwNzU3NUIiLCBjb2xvciA9ICJibGFjayIpICsNCiAgbGFicyh4ID0gIlF14buRYyBnaWEiLCB5ID0gIlThuqduIHPhu5EiLCB0aXRsZSA9ICJCaeG7g3UgxJHhu5MgdOG6p24gc+G7kSBraMOhY2ggaMOgbmcg4bufIGPDoWMgcXXhu5FjIGdpYSIpICsNCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSAwLCBoanVzdCA9IDEpKQ0KDQpgYGANCg0KDQpgYGB7cn0NCmM3XzEgPC0gZF9jYXQgfD4NCiAgZ3JvdXBfYnkoQ291bnRyeSkgfD4NCiAgc3VtbWFyaXNlKGZyZXEgPSBuKCkpIHw+DQogIG11dGF0ZShwZXIgPSBmcmVxIC8gc3VtKGZyZXEpLA0KICAgICAgICAgbGFiZWwgPSBwYXN0ZTAoZnJlcSwgIiAoIiwgcm91bmQocGVyICogMTAwLCAxKSwgIiUpIikpDQoNCmdncGxvdChjN18xICwgYWVzKHggPSAiIiwgeSA9IHBlciwgZmlsbCA9IENvdW50cnkpKSArDQogIGdlb21fY29sKHdpZHRoID0gMSwgY29sb3IgPSAid2hpdGUiKSArDQogIGNvb3JkX3BvbGFyKCJ5IikgKw0KICBnZW9tX3RleHQoYWVzKGxhYmVsID0gcGFzdGUwKHJvdW5kKHBlcioxMDAsIDIpLCAiJSIpKSwNCiAgICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb25fc3RhY2sodmp1c3QgPSAwLjUpLA0KICAgICAgICAgICAgc2l6ZSA9IDIuNSkgKw0KICBzY2FsZV9maWxsX2JyZXdlcihwYWxldHRlID0gIlNwZWN0cmFsIikgKyAgIyBC4bqhbiBjw7MgdGjhu4MgY2jhu41uIFNldDEsIFNldDIuLi4NCiAgbGFicyh0aXRsZSA9ICJU4bu3IGzhu4cg4bufIGPDoWMgcXXhu5FjIGdpYSIsIGZpbGwgPSAiUXXhu5FjIGdpYSIpICsNCiAgdGhlbWVfdm9pZCgpDQpgYGANCg0KKk5o4bqtbiB4w6l0Kg0KDQpL4bq/dCBxdeG6oyB04bqnbiBz4buRIGNobyBiaeG6v24gQ291bnRyeSBjaG8gdGjhuqV5IHLhurFuZyBwaOG6p24gbOG7m24ga2jDoWNoIGjDoG5nICg2OCUpIMSR4bq/biB04burIE3hu7kgKFVTQSksIHRyb25nIGtoaSBDYW5hZGEgdsOgIE1leGljbyBjaGnhur9tIHThu7cgbOG7hyBs4bqnbiBsxrDhu6N0IGzDoCBraG/huqNuZyA1Ljc1JSB2w6AgMjYuMjMlLiDEkGnhu4F1IG7DoHkgY2hvIHRo4bqleSBz4buxIHBow6JuIGLhu5Uga2jDtG5nIMSR4buTbmcgxJHhu4F1IGPhu6dhIGThu68gbGnhu4d1IGdp4buvYSBiYSBxdeG7kWMgZ2lhLCB24bubaSBN4bu5IGzDoCB0aOG7iyB0csaw4budbmcgdHLhu41uZyB0w6JtLg0KDQojIyAqKjIuOCBCaeG6v24gUHJvZHVjdEZhbWlseSoqDQoNCipUaOG7kW5nIGvDqiB04bqnbiBzdeG6pXQqIA0KDQpUYSB0aOG7sWMgaGnhu4duIHRo4buRbmcga8OqIHThuqduIHPhu5EgdsOgIHThuqduIHN14bqldCBjaG8gYmnhur9uIFByb2R1Y3RGYW1pbHkgxJHGsOG7o2Mga+G6v3QgcXXhuqMgbmjGsCBzYXU6DQoNCmBgYHtyfQ0KUHJvZHVjdEZhbWlseV8xPC0gdGFibGUoZF9jYXQkUHJvZHVjdEZhbWlseSkNClByb2R1Y3RGYW1pbHlfMQ0KYGBgDQoNCmBgYHtyfQ0KUHJvZHVjdEZhbWlseV8yPC10YWJsZShkX2NhdCRQcm9kdWN0RmFtaWx5KS9zdW0obnJvdyhkX2NhdCkpKjEwMA0KUHJvZHVjdEZhbWlseV8yDQpgYGANCg0KKlRy4buxYyBxdWFuIGjDs2EgZOG7ryBsaeG7h3UqDQoNCmBgYHtyfQ0KYzggPC0gYXMuZGF0YS5mcmFtZShQcm9kdWN0RmFtaWx5XzEpDQpjb2xuYW1lcyhjOCkgPC0gYygiUHJvZHVjdEZhbWlseSIsICJDb3VudCIpDQpnZ3Bsb3QoYzgsIGFlcyh4ID0gUHJvZHVjdEZhbWlseSwgeSA9IENvdW50LCBmaWxsID0gUHJvZHVjdEZhbWlseSkpICsNCiAgZ2VvbV9jb2woZmlsbCA9ICJsaWdodHBpbmsiLCBjb2xvciA9ICJibGFjayIpICsNCiAgbGFicyh4ID0gIlPhuqNuIHBo4bqpbSBnaWEgxJHDrG5oIiwgeSA9ICJU4bqnbiBz4buRIiwgdGl0bGUgPSAiQmnhu4N1IMSR4buTIGJp4buDdSB0aOG7iyBuaMOzbSBz4bqjbiBwaOG6qW0ga2jDoWNoIGjDoG5nIG11YSIpICsNCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSAwLCBoanVzdCA9IDEpKQ0KYGBgDQoNCipOaOG6rW4geMOpdCoNCg0KS+G6v3QgcXXhuqMgdOG6p24gc+G7kSBjaG8gdGjhuqV5IG5ow7NtIHRo4buxYyBwaOG6qW0gKEZvb2QpIGNoaeG6v20gw6FwIMSR4bqjbyB24bubaSBoxqFuIDcyJSB04buVbmcgc+G7kSBt4bq3dCBow6BuZywgdHJvbmcga2hpIMSR4buTIHXhu5FuZyAoRHJpbmspIGNo4buJIGNoaeG6v20gZ+G6p24gOSUgdsOgIGPDoWMgbeG6t3QgaMOgbmcgcGhpIHRo4buxYyBwaOG6qW0gKE5vbi1Db25zdW1hYmxlKSBjaGnhur9tIGtob+G6o25nIDE5JS4gU+G7sSBjaMOqbmggbOG7h2NoIG7DoHkgcGjhuqNuIMOhbmggcsO1IHThuqdtIHF1YW4gdHLhu41uZyB2w6Agbmh1IGPhuqd1IGNhbyBj4bunYSB0aOG7sWMgcGjhuqltIHRyb25nIGRhbmggc8OhY2ggbXVhIHPhuq9tIGjDoG5nIG5nw6B5LCBzbyB24bubaSBjw6FjIGxv4bqhaSDEkeG7kyB14buRbmcgdsOgIHPhuqNuIHBo4bqpbSBwaGkgdGjhu7FjIHBo4bqpbSBraMOhYy4NCg0KIyMgKioyLjkgQmnhur9uIFByb2R1Y3REZXBhcnRtZW50KioNCg0KKlRo4buRbmcga8OqIHThuqduIHN14bqldCogDQoNClRhIHRo4buxYyBoaeG7h24gdGjhu5FuZyBrw6ogdOG6p24gc+G7kSB2w6AgdOG6p24gc3XhuqV0IGNobyBiaeG6v24gUHJvZHVjdERlcGFydG1lbnQgIMSRxrDhu6NjIGvhur90IHF14bqjIG5oxrAgc2F1Og0KDQpgYGB7cn0NClByb2R1Y3REZXBhcnRtZW50XzE8LSB0YWJsZShkX2NhdCRQcm9kdWN0RGVwYXJ0bWVudCkNClByb2R1Y3REZXBhcnRtZW50XzENCmBgYA0KDQpgYGB7cn0NClByb2R1Y3REZXBhcnRtZW50XzI8LXRhYmxlKGRfY2F0JFByb2R1Y3REZXBhcnRtZW50KS9zdW0obnJvdyhkX2NhdCkpKjEwMA0KUHJvZHVjdERlcGFydG1lbnRfMg0KYGBgDQoNCipUcuG7sWMgcXVhbiBow7NhIGThu68gbGnhu4d1Kg0KDQpgYGB7cn0NCmM5IDwtIGFzLmRhdGEuZnJhbWUoUHJvZHVjdERlcGFydG1lbnRfMSkNCmNvbG5hbWVzKGM5KSA8LSBjKCJQcm9kdWN0RGVwYXJ0bWVudCIsICJDb3VudCIpDQpnZ3Bsb3QoYzksIGFlcyh4ID0gUHJvZHVjdERlcGFydG1lbnQsIHkgPSBDb3VudCwgZmlsbCA9IFByb2R1Y3REZXBhcnRtZW50KSkgKw0KICBnZW9tX2NvbChmaWxsID0gImxpZ2h0cGluayIsIGNvbG9yID0gImJsYWNrIikgKw0KICBsYWJzKHggPSAiU+G6o24gcGjhuqltIiwgeSA9ICJU4bqnbiBz4buRIiwgdGl0bGUgPSAiQuG7mSBwaOG6rW4gc+G6o24gcGjhuqltIGtow6FjaCBow6BuZyBtdWEiKSArDQogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIGhqdXN0ID0gMSkpDQoNCmBgYA0KDQoqTmjhuq1uIHjDqXQqDQoNCkThu68gbGnhu4d1IGNobyB0aOG6pXkgc+G7sSBwaMOibiBi4buVIHLDtSBy4buHdCB0cm9uZyB0aMOzaSBxdWVuIG11YSBz4bqvbTogY8OhYyBt4bq3dCBow6BuZyB0xrDGoWkgc+G7kW5nIHbDoCDEkeG7kyBnaWEgZOG7pW5nIGNoaeG6v20gcGjhuqduIGzhu5tuLCB24bubaSBQcm9kdWNlICgxNC4xOCUpIHbDoCBIb3VzZWhvbGQgKDEwLjElKSBj4buZbmcgbOG6oWkgZ+G6p24gMjUlIHThu5VuZyBz4buRIG3hurd0IGjDoG5nLiDEkGnhu4F1IG7DoHkgcGjhuqNuIMOhbmggc+G7sSDGsHUgdGnDqm4gdGnDqnUgZMO5bmcgY8OhYyBz4bqjbiBwaOG6qW0gdGhp4bq/dCB54bq/dSBow6BuZyBuZ8OgeS4NCg0KTmfGsOG7o2MgbOG6oWksIHPhu7EgdGhp4bq/dSBjw6JuIMSR4buRaSB0aOG7gyBoaeG7h24g4bufIGPDoWMgbmjDs20gbmjGsCBNZWF0IHbDoCBTZWFmb29kLCBraGkgY2jhu4kgY2hp4bq/bSBjaMawYSB04bubaSAxJSB04buVbmcgc+G7kSBt4bq3dCBow6BuZywgY2hvIHRo4bqleSBuaHUgY+G6p3UgY+G7p2EgY8OhYyBt4bq3dCBow6BuZyBuw6B5IMOtdCBoxqFuIMSRw6FuZyBr4buDIHNvIHbhu5tpIGPDoWMgbmjDs20ga2jDoWMuIMSQaeG7gXUgbsOgeSBjw7MgdGjhu4MgeHXhuqV0IHBow6F0IHThu6sgdGjDs2kgcXVlbiDEg24gdeG7kW5nIGhv4bq3YyDEkeG6t2MgxJFp4buDbSBuZ3Xhu5NuIGN1bmcgY+G6pXAgY+G7p2EgY+G7rWEgaMOgbmcuDQoNCiMjICoqMi4xMCBCaeG6v24gUHJvZHVjdENhdGVnb3J5KioNCg0KKlRo4buRbmcgdOG6p24gc3XhuqV0Kg0KDQpUYSB0aOG7sWMgaGnhu4duIHRo4buRbmcga8OqIHThuqduIHPhu5EgdsOgIHThuqduIHN14bqldCBjaG8gYmnhur9uIFByb2R1Y3RDYXRlZ29yeSAgxJHGsOG7o2Mga+G6v3QgcXXhuqMgbmjGsCBzYXU6DQoNCmBgYHtyfQ0KUHJvZHVjdENhdGVnb3J5XzE8LSB0YWJsZShkX2NhdCRQcm9kdWN0Q2F0ZWdvcnkpDQpQcm9kdWN0Q2F0ZWdvcnlfMQ0KYGBgDQoNCmBgYHtyfQ0KUHJvZHVjdENhdGVnb3J5XzI8LXRhYmxlKGRfY2F0JFByb2R1Y3RDYXRlZ29yeSkvc3VtKG5yb3coZF9jYXQpKSoxMDANClByb2R1Y3RDYXRlZ29yeV8yDQpgYGANCg0KKlRy4buxYyBxdWFuIGjDs2EgZOG7ryBsaeG7h3UqDQoNCmBgYHtyfQ0KYzEwIDwtIGFzLmRhdGEuZnJhbWUoUHJvZHVjdENhdGVnb3J5XzEpDQpjb2xuYW1lcyhjMTApIDwtIGMoIlByb2R1Y3RDYXRlZ29yeSIsICJDb3VudCIpDQoNCmdncGxvdChjMTAsIGFlcyh4ID0gUHJvZHVjdENhdGVnb3J5LCB5ID0gQ291bnQsIGZpbGwgPSBQcm9kdWN0Q2F0ZWdvcnkpKSArDQogIGdlb21fY29sKGZpbGwgPSAibGlnaHRibHVlIiwgY29sb3IgPSAiYmxhY2siKSArDQogIGxhYnMoeCA9ICJT4bqjbiBwaOG6qW0iLCB5ID0gIlThuqduIHPhu5EiLCB0aXRsZSA9ICJEYW5oIG3hu6VjIHPhuqNuIHBo4bqpbSBraMOhY2ggaMOgbmcgbXVhIikgKw0KICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEpKQ0KYGBgDQoNCipOaOG6rW4geMOpdCoNCg0KROG7ryBsaeG7h3UgdOG6p24gc+G7kSBj4bunYSBjw6FjIGRhbmggbeG7pWMgc+G6o24gcGjhuqltIGNobyB0aOG6pXkgcuG6sW5nIGPDoWMgbeG6t3QgaMOgbmcgdGhp4bq/dCB54bq/dSB2w6AgcGjhu5UgYmnhur9uIG5o4bqldCBuaMawIHJhdSBj4bunICgxLjcyOCksIMSR4buTIMSDbiB24bq3dCAoMS42MDApLCBz4buvYSAoOTAzKSwgdHLDoWkgY8OieSAoNzY1KSB2w6AgdGjhu4t0ICg3NjEpIGPDsyB04bqnbiBzdeG6pXQgY2FvIG5o4bqldC4gxJBp4buBdSBuw6B5IHBo4bqjbiDDoW5oIG5odSBj4bqndSBz4butIGThu6VuZyBo4bqxbmcgbmfDoHkgY+G7p2EgY8OhYyBnaWEgxJHDrG5oLiBOZ8aw4bujYyBs4bqhaSwgY8OhYyBz4bqjbiBwaOG6qW0gbmjGsCBjw6EgY8ahbSDEkcOzbmcgaOG7mXAgKDQ0KSwgaMOgdSDEkcOzbmcgaOG7mXAgKDM1KSwgdMO0bSDEkcOzbmcgaOG7mXAgKDM4KSB2w6AgbuG6v24gKDQ1KSBs4bqhaSBjw7MgdOG6p24gc3XhuqV0IHRo4bqlcCBuaOG6pXQsIGNobyB0aOG6pXkgxJHDonkgbMOgIG5o4buvbmcgbeG6t3QgaMOgbmcgw610IHBo4buVIGJp4bq/biBob+G6t2MgY2jhu4kgxJHGsOG7o2Mgc+G7rSBk4bulbmcgdHJvbmcgbmjhu69uZyB0csaw4budbmcgaOG7o3AgbmjhuqV0IMSR4buLbmguIFTDs20gbOG6oWksIHPhu7EgcGjDom4gYuG7kSB04bqnbiBz4buRIG7DoHkgcGjhuqNuIMOhbmggcsO1IHLDoG5nIHh1IGjGsOG7m25nIHRpw6p1IGTDuW5nIHbDoCBt4bupYyDEkeG7mSBwaOG7lSBiaeG6v24gY+G7p2EgdOG7q25nIGxv4bqhaSBz4bqjbiBwaOG6qW0uDQoNCiMgKipQaOG6p24gMzogxq/hu5tjIGzGsOG7o25nIGtob+G6o25nIHbDoCBraeG7g20gxJHhu4tuaCBnaeG6oyB0aHV54bq/dCBjaG8gdOG7tyBs4buHKioNCg0KIyMgKiozLjEgQmnhur9uIEdlbmRlcioqDQoNCioqWMOhYyDEkeG7i25oIGjhuqFuZyBt4bulYyBxdWFuIHTDom0qKg0KDQpI4bqhbmcgbeG7pWMgxJHGsOG7o2MgcXVhbiB0w6JtIOG7nyDEkcOieSBsw6AgZ2nhu5tpIHTDrW5oIG7hu68gKEZlbWFsZSkgdHJvbmcgYmnhur9uIGdp4bubaSB0w61uaCAoR2VuZGVyKS4NCg0KYGBge3J9DQp4MSA8LSBzdW0oZF9jYXQkR2VuZGVyID09ICJGIikgICAgICMgU+G7kSBsxrDhu6NuZyBGZW1hbGUNCm4xPC0gbGVuZ3RoKGRfY2F0JEdlbmRlcikgICAgICAgICAgICAgICMgVOG7lW5nIHPhu5EgbeG6q3UNCmBgYA0KDQoqKsav4bubYyBsxrDhu6NuZyBLaG/huqNuZyBUaW4gY+G6rXkqKg0KDQpUYSDGsOG7m2MgbMaw4bujbmcga2hv4bqjbmcgdGluIGPhuq15IDk1JSBjaG8gdOG7tyBs4buHIG7hu68gdHJvbmcgdOG7lW5nIHRo4buDIGLhurFuZzoNCg0KYGBge3J9DQpwcm9wLnRlc3QoeDEsIG4xLCBjb25mLmxldmVsID0gMC45NSkNCmBgYA0KDQpL4bq/dCBxdeG6oyBuaOG6rW4gxJHGsOG7o2MgduG7m2kgbeG7qWMgdGluIGPhuq15IDk1JSwgdOG7tyBs4buHIGPhu6dhIGdp4bubaSB0w61uaCBu4buvIGPhu6dhIHThu5VuZyB0aOG7gyBu4bqxbSB0cm9uZyBraG/huqNuZyBbNTAuMTclLCA1MS44MyVdLg0KDQoqKktp4buDbSDEkeG7i25oIGdp4bqjIHRodXnhur90KioNCg0KR2nhuqMgdGh1eeG6v3Q6DQoNCiQkDQpcbGVmdFx7DQpcYmVnaW57YXJyYXl9e2xsfQ0KSF8wOiAmIFx0ZXh0e1Thu7cgbOG7hyBu4buvIHRyb25nIHThu5VuZyB0aOG7gyBsw6AgYuG6sW5nIDUwJX0gIFxcXFwNCkhfMTogJiBcdGV4dHtU4bu3IGzhu4cgbuG7ryB0cm9uZyB04buVbmcgdGjhu4MgbMOgIGtow6FjIDUwJX0gXA0KXGVuZHthcnJheX0NClxyaWdodC4NCiQkDQoNCmBgYHtyfQ0KcHJvcC50ZXN0KHgxLCBuMSwgcCA9IDAuNSwgYWx0ZXJuYXRpdmUgPSAidHdvLnNpZGVkIikNCmBgYA0KVuG7m2kgbeG7qWMgw70gbmdoxKlhIDUlIHBfdmFsdWUgPSAyLjJlLTE2IDwgMC4wNSwgdGEgYsOhYyBi4buPIGdp4bqjIHRodXnhur90IGtow7RuZyAoJEhfMCQpLk5oxrAgduG6rXksIGPDsyBi4bqxbmcgY2jhu6luZyB0aOG7kW5nIGvDqiBjaG8gdGjhuqV5IHThu7cgbOG7hyBraMOhY2ggaMOgbmcgbuG7ryBraMOhYyA1MCUgdHJvbmcgdOG7lW5nIHRo4buDLg0KDQojIyAqKjMuMiBCaeG6v24gSG9tZW93bmVyKioNCg0KKljDoWMgxJHhu4tuaCBo4bqhbmcgbeG7pWMgcXVhbiB0w6JtKg0KDQpI4bqhbmcgbeG7pWMgxJHGsOG7o2MgcXVhbiB0w6JtIOG7nyDEkcOieSBsw6Agdmnhu4djIGPDsyBz4bufIGjhu691IG5ow6AgKFkpIHRyb25nIGJp4bq/biBz4bufIGjhu691IG5ow6AgKEhvbWVvd25lcikuDQoNCmBgYHtyfQ0KeDIgPC0gc3VtKGRfY2F0JEhvbWVvd25lciA9PSAiWSIpICAgICANCm4yIDwtIGxlbmd0aChkX2NhdCRIb21lb3duZXIpICAgICAgICAgICAgICANCmBgYA0KDQoqxq/hu5tjIGzGsOG7o25nIEtob+G6o25nIFRpbiBj4bqteSB2w6Aga2nhu4NtIMSR4buLbmggZ2nhuqMgdGh1eeG6v3QqDQoNClRhIMaw4bubYyBsxrDhu6NuZyBraG/huqNuZyB0aW4gY+G6rXkgOTUlIGNobyB04bu3IGzhu4cgbuG7ryB0cm9uZyB04buVbmcgdGjhu4MgYuG6sW5nOg0KDQpgYGB7cn0NCnByb3AudGVzdCh4MiwgbjIsIGNvbmYubGV2ZWwgPSAwLjk1KQ0KYGBgDQoNCkvhur90IHF14bqjIG5o4bqtbiDEkcaw4bujYyB24bubaSBt4bupYyB0aW4gY+G6rXkgOTUlLCB04bu3IGzhu4cgc+G7nyBo4buvdSBuaMOgIGPhu6dhIHThu5VuZyB0aOG7gyBu4bqxbSB0cm9uZyBraG/huqNuZyBbNTkuMjUlLCA2MC44NyVdLg0KDQoqKktp4buDbSDEkeG7i25oIGdp4bqjIHRodXnhur90KioNCg0KR2nhuqMgdGh1eeG6v3Q6DQoNCiQkDQpcbGVmdFx7DQpcYmVnaW57YXJyYXl9e2xsfQ0KSF8wOiAmIFx0ZXh0e1Thu7cgbOG7hyBz4bufIGjhu691IG5ow6AgdHJvbmcgdOG7lW5nIHRo4buDIGzDoCBi4bqxbmcgNTAlfSAgXFxcXA0KSF8xOiAmIFx0ZXh0e1Thu7cgbOG7hyBz4bufIGjhu691IG5ow6AgdHJvbmcgdOG7lW5nIHRo4buDIGzDoCBraMOhYyA1MCV9IFwNClxlbmR7YXJyYXl9DQpccmlnaHQuDQokJA0KDQpgYGB7cn0NCnByb3AudGVzdCh4MiwgbjIsIHAgPSAwLjUsIGFsdGVybmF0aXZlID0gInR3by5zaWRlZCIsIGNvbmYubGV2ZWwgPSAwLjk1KQ0KYGBgDQoNClbhu5tpIG3hu6ljIMO9IG5naMSpYSA1JSBwX3ZhbHVlID0gMC44ODkxID4gMC4wNSwgdGEgYsOhYyBi4buPIGdp4bqjIHRodXnhur90IGtow7RuZyAoJEhfMCQpLiBOaMawIHbhuq15LCBjw7MgYuG6sW5nIGNo4bupbmcgdGjhu5FuZyBrw6ogY2hvIHRo4bqleSB04bu3IGzhu4cgc+G7nyBo4buvdSBuaMOgIGtow6FjIDUwJSB0cm9uZyB04buVbmcgdGjhu4MuIA0KDQojIyAqKjMuMyBCaeG6v24gUHJvZHVjdEZhbWlseSAqKg0KDQoqWMOhYyDEkeG7i25oIGjhuqFuZyBt4bulYyBxdWFuIHTDom0qDQoNCkjhuqFuZyBt4bulYyDEkcaw4bujYyBxdWFuIHTDom0g4bufIMSRw6J5IGzDoCBuaMOzbSB0aOG7qWMgxINuIChGb29kKSB0cm9uZyBiaeG6v24gc+G7nyBo4buvdSBuaMOgIChQcm9kdWN0RmFtaWx5KS4NCg0KYGBge3J9DQp4MyA8LSBzdW0oZF9jYXQkUHJvZHVjdEZhbWlseSA9PSAiRm9vZCIpICAgICAjIFPhu5EgbMaw4bujbmcgRmVtYWxlDQpuMyA8LSBsZW5ndGgoZF9jYXQkUHJvZHVjdEZhbWlsKSAgICAgICAgICAgICAgIyBU4buVbmcgc+G7kSBt4bqrdQ0KYGBgDQoNCirGr+G7m2MgbMaw4bujbmcgS2hv4bqjbmcgVGluIGPhuq15Kg0KDQpUYSDGsOG7m2MgbMaw4bujbmcga2hv4bqjbmcgdGluIGPhuq15IDk1JSBjaG8gdOG7tyBs4buHIG7hu68gdHJvbmcgdOG7lW5nIHRo4buDIGLhurFuZzoNCg0KYGBge3J9DQpwcm9wLnRlc3QoeDMsIG4zLCBjb25mLmxldmVsID0gMC45NSkNCmBgYA0KDQpL4bq/dCBxdeG6oyBuaOG6rW4gxJHGsOG7o2MgduG7m2kgbeG7qWMgdGluIGPhuq15IDk1JSwgdOG7tyBs4buHIG5ow7NtIEZvb2QgY+G7p2EgdOG7lW5nIHRo4buDIG7hurFtIHRyb25nIGtob+G6o25nIFs3MS40NyUsIDcyLjk1JV0NCg0KKmtp4buDbSDEkeG7i25oIGdp4bqjIHRodXnhur90Kg0KDQpHaeG6oyB0aHV54bq/dDoNCg0KJCQNClxsZWZ0XHsNClxiZWdpbnthcnJheX17bGx9DQpIXzA6ICYgXHRleHR7VOG7tyBs4buHIG5ow7NtIEZvb2QgdHJvbmcgdOG7lW5nIHRo4buDIGzDoCBi4bqxbmcgNTAlfSAgXFxcXA0KSF8xOiAmIFx0ZXh0e1Thu7cgbOG7hyBuaMOzbSBGb29kIHRyb25nIHThu5VuZyB0aOG7gyBsw6Aga2jDoWMgNTAlfSBcDQpcZW5ke2FycmF5fQ0KXHJpZ2h0Lg0KJCQNCg0KYGBge3J9DQpwcm9wLnRlc3QoeDMsIG4zLCBwID0gMC41LCBhbHRlcm5hdGl2ZSA9ICJ0d28uc2lkZWQiLCBjb25mLmxldmVsID0gMC45NSkNCmBgYA0KDQpW4bubaSBt4bupYyDDvSBuZ2jEqWEgNSUgcF92YWx1ZSA9IDIuMmUtMTYgPCAwLjA1LCB0YSBiw6FjIGLhu48gZ2nhuqMgdGh1eeG6v3Qga2jDtG5nICgkSF8wJCkuIE5oxrAgduG6rXksIGPDsyBi4bqxbmcgY2jhu6luZyB0aOG7kW5nIGvDqiBjaG8gdGjhuqV5IHThu7cgbOG7hyBuaMOzbSBGb29kIGtow6FjIDUwJSB0cm9uZyB04buVbmcgdGjhu4MuIA0KDQoqKkLhuqNuZyB04buVbmcgaOG7o3Aga+G6v3QgcXXhuqMgdHLDqm4qKg0KDQpgYGB7ciwgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCiMgVOG6oW8gYuG6o25nIGThu68gbGnhu4d1IGtp4buDbSDEkeG7i25oDQpyZXN1bHRzIDwtIGRhdGEuZnJhbWUoDQogIEJp4bq/biA9IGMoIkdlbmRlciIsICJIb21lb3duZXIiLCAiUHJvZHVjdEZhbWlseSIpLA0KICBI4bqhbmdfbeG7pWMgPSBjKCJGZW1hbGUiLCAiWSIsICJGb29kIiksDQogIFThu7dfbOG7h19xdWFuX3PDoXQgPSBjKDAuNTA5OTksIDAuNjAwNiwgMC43MjIyKSwNCiAgQ0lfOTUgPSBjKCJbIDAuNTAxNywgMC41MTgzXSIsICJbMC41OTI1LCAwLjYwODddIiwgIlswLjcxNDcsIDAuNzI5NV0iKSwNCiAgSF8wID0gYygicCA9IDAuNSIsICJwID0gMC41IiwgInAgPSAwLjUiKSwNCiAgcF92YWx1ZSA9IGMoMi4yZS0xNiwgMi4yZS0xNiwgMi4yZS0xNiksDQogIEvhur90X2x14bqtbiA9YygiQsOhYyBi4buPICRIXzAkIiwgIkLDoWMgYuG7jyAkSF8wJCIsICJCw6FjIGLhu48gJEhfMCQiKQ0KKQ0Ka2FibGUocmVzdWx0cywgY2FwdGlvbiA9ICJL4bq/dCBxdeG6oyBraeG7g20gxJHhu4tuaCBnaeG6oyB0aHV54bq/dCB24buBIHThu7cgbOG7hyIsIGFsaWduID0gImMiKQ0KYGBgDQoNCiMgKipQaOG6p24gNDogUGjDom4gdMOtY2ggbeG7kWkgcXVhbiBo4buHIGdp4buvYSBIYWkgYmnhur9uIMSR4buLbmggdMOtbmggKEJpdmFyaWF0ZSBBbmFseXNpcykqKg0KDQojIyAqKjQuMSBCaeG6v24gR2VuZGVyIHbDoCBQcm9kdWN0RmFtaWx5KioNCg0KxJDhu4MgaGnhu4N1IHLDtSBoxqFuIG3hu5FpIHF1YW4gaOG7hyBnaeG7r2EgZ2nhu5tpIHTDrW5oIChHZW5kZXIpIHbDoCBuaMOzbSBz4bqjbiBwaOG6qW0gKFByb2R1Y3RGYW1pbHkpLCBjaMO6bmcgdGEgc+G6vSB4w6J5IGThu7FuZyBi4bqjbmcgdOG6p24gc3XhuqV0IGNow6lvIHRo4buDIGhp4buHbiBz4buRIGzGsOG7o25nIHThu6tuZyBr4bq/dCBo4bujcCBnaeG7r2EgaGFpIGJp4bq/biBuw6B5LiBTYXUgxJHDsywgYmnhu4N1IMSR4buTIGPhu5l0IHPhur0gxJHGsOG7o2Mgc+G7rSBk4bulbmcgxJHhu4MgdHLhu7FjIHF1YW4gaMOzYSBz4buxIHBow6JuIGLhu5EgY+G7p2EgY8OhYyBuaMOzbSBz4bqjbiBwaOG6qW0gdGhlbyB04burbmcgZ2nhu5tpIHTDrW5oLCBnacO6cCBxdWFuIHPDoXQgZOG7hSBkw6BuZyBz4buxIGtow6FjIGJp4buHdCB2w6AgeHUgaMaw4bubbmcgdGnDqnUgZMO5bmcgZ2nhu69hIGPDoWMgbmjDs20uDQoNCioqQuG6o25nIHThuqduIHN14bqldCBjaMOpbyB2w6AgdHLhu7FjIHF1YW4gaMOzYSoqDQoNCipC4bqjbmcgdOG6p24gc3XhuqV0IGNow6lvKg0KDQpgYGB7cn0NCmQxIDwtIHRhYmxlKGRfY2F0JEdlbmRlcixkX2NhdCRQcm9kdWN0RmFtaWx5KSAjdOG6oW8gYuG6o25nIGNow6lvIMSR4bq/bSBz4buRIGzhuqduIHh14bqldCBoaeG7h24gY+G7p2EgdOG7q25nIGvhur90IGjhu6NwIGdp4buvYSAgKEdlbmRlcikgdsOgIChQcm9kdWN0RmFtaWx5KS4NCmFkZG1hcmdpbnMoZDEpICNUaMOqbSB04buVbmcgaMOgbmcgdsOgIHThu5VuZyBj4buZdCB2w6BvIGLhuqNuZw0KYGBgDQoqQuG6o25nIHThuqduIHN14bqldCBjaMOpbyB0aGVvIHThu7cgbOG7hyBow6BuZyoNCg0KYGBge3J9DQpwcm9wLnRhYmxlKGQxLCBtYXJnaW4gPSAxKQ0KYGBgDQoqVHLhu7FjIHF1YW4gaMOzYSoNCiANCmBgYHtyfQ0KDQpiYXJwbG90KGQxLCBiZXNpZGUgPSBUUlVFLCBsZWdlbmQgPSBUUlVFLCAjVuG6vSBjw6FjIGPhu5l0IGPhuqFuaCBuaGF1DQogICAgICAgIGNvbCA9IGMoInNreWJsdWUiLCAibGlnaHRncmVlbiIpLA0KICAgICAgICBtYWluID0gIkJp4buDdSDEkeG7kyB04bqnbiBzdeG6pXQgZ2nhu69hIEdlbmRlciB2w6AgUHJvZHVjdEZhbWlseSIsDQogICAgICAgIHhsYWIgPSAiR2VuZGVyIiwNCiAgICAgICAgeWxhYiA9ICJU4bqnbiBzdeG6pXQiLA0KICAgICAgICBuYW1lcy5hcmcgPSBjKCJEcmluayIsICJGb29kIiwgIk5vbi1Db25zdW1hYmxlIikpDQpgYGANCg0KDQoqTmjhuq1uIHjDqXQqDQoNCkThu7FhIHbDoG8ga+G6v3QgcXXhuqMgdHLDqm4gdGEgbmjhuq1uIHRo4bqleSB0cm9uZyBuaMOzbSBnaeG7m2kgdMOtbmggbuG7ryBjw7MgNjY5ICg5LjMzJSkgbmfGsOG7nWkgbXVhIG7GsOG7m2MsIDUxNDkgKDcxLjgxJSkgbmfGsOG7nWkgbXVhIHRo4bupYyDEg24gdsOgIDEzNTIgKDE4Ljg2JSkgaMOgbmcgaMOzYSBraMO0bmcgdGnDqnUgdGjhu6Ugbmhhbmg7IGPDsyA1ODEgKDguNDMlKSBuZ8aw4budaSBtdWEgbsaw4bubYywgNTAwNCAoNzIuNjQlKSBuZ8aw4budaSBtdWEgdGjhu6ljIMSDbiB2w6AgMTMwNCAoMTguOTMlKSBow6BuZyBow7NhIGtow7RuZyB0acOqdSB0aOG7pSBuaGFuaCBsw6AgbmFtLg0KDQotIEPhuqMgbuG7ryAoRikgdsOgIG5hbSAoTSkgxJHhu4F1IGTDoG5oIHBo4bqnbiBs4bubbiBuZ8OibiBzw6FjaCBtdWEgaMOgbmcgY2hvIG5ow7NtIEZvb2QsIGNoaeG6v20gbOG6p24gbMaw4bujdCA3MS44MSUgdsOgIDcyLjY0JSB04buVbmcgc+G7kSBt4bq3dCBow6BuZyBtdWEgY+G7p2EgbeG7l2kgZ2nhu5tpIHTDrW5oLiDEkGnhu4F1IG7DoHkgY2hvIHRo4bqleSBuaMOzbSBGb29kIGzDoCBuaMOzbSBz4bqjbiBwaOG6qW0gY2jhu6cgbOG7sWMsIHLhuqV0IHF1YW4gdHLhu41uZyB2w6AgcGjhu5UgYmnhur9uIHRyb25nIHRow7NpIHF1ZW4gdGnDqnUgZMO5bmcgY+G7p2EgY+G6oyBoYWkgZ2nhu5tpLg0KDQotIE5ow7NtIGjDoG5nIGjDs2EgTm9uLUNvbnN1bWFibGUgY2hp4bq/bSBraG/huqNuZyAxOC44NiUg4bufIG7hu68gdsOgIDE4LjkzJSDhu58gbmFtLiBU4bu3IGzhu4cgcuG6pXQgZ+G6p24gbmhhdSwgY2hvIHRo4bqleSBj4bqjIGhhaSBnaeG7m2kgxJHhu4F1IHF1YW4gdMOibSDEkeG6v24gdmnhu4djIG11YSBz4bqvbSBjw6FjIHPhuqNuIHBo4bqpbSBsw6J1IGLhu4FuIGhv4bq3YyBz4butIGThu6VuZyBsw6J1IGTDoGkuDQoNCi0gTmjDs20gRHJpbmsgY2jhu4kgY2hp4bq/bSBkxrDhu5tpIDEwJSB0cm9uZyB04buVbmcgc+G7kSBow6BuZyBtdWEgY+G7p2EgbeG7l2kgZ2nhu5tpLCBj4bulIHRo4buDIGzDoCA5LjMzJSDhu58gbuG7ryB2w6AgOC40MyUg4bufIG5hbS5O4buvIG11YSBuaMOzbSBuw6B5IG5oaeG7gXUgaMahbiBuYW0gbeG7mXQgY2jDunQsIGPDsyB0aOG7gyBkbyBz4bufIHRow61jaCBob+G6t2MgdGjDs2kgcXVlbiB0acOqdSBkw7luZyDEkeG7kyB14buRbmcga2jDoWMgbmhhdSBnaeG7r2EgaGFpIGdp4bubaS4NCg0KUXVhIMSRw7MgdGEgbmjhuq1uIHRo4bqleSBt4buRaSBxdWFuIGjhu4cgZ2nhu69hIDIgYmnhur9uIEdlbmRlciB2w6AgUHJvZHVjdEZhbWlseSBsw6Aga2jDtG5nIG3huqFuaCB2w6wgc+G7sSBwaMOibiBi4buRIHThu7cgbOG7hyBtdWEgaMOgbmcga2jDoSBnaeG7kW5nIG5oYXUgZ2nhu69hIG5hbSB2w6AgbuG7rywgY8OzIHRo4buDIGvhur90IGx14bqtbiBy4bqxbmcgZ2nhu5tpIHTDrW5oIGtow7RuZyBwaOG6o2kgbMOgIHnhur91IHThu5EgcXV54bq/dCDEkeG7i25oIG3huqFuaCBt4bq9IHRyb25nIHZp4buHYyBs4buxYSBjaOG7jW4gbmjDs20gc+G6o24gcGjhuqltLg0KDQoqS2nhu4NtIMSR4buLbmggdGjhu5FuZyBrw6ogKEtp4buDbSDEkeG7i25oIENoaS1iw6xuaCBwaMawxqFuZykqDQoNCsSQ4buDIMSRw6FuaCBnacOhIHhlbSBjw7MgbeG7kWkgbGnDqm4gaOG7hyBjw7Mgw70gbmdoxKlhIHRo4buRbmcga8OqIGdp4buvYSBoYWkgYmnhur9uIHBow6JuIGxv4bqhaSBsw6AgR2VuZGVyIHbDoCBQcm9kdWN0RmFtaWx5IGhheSBraMO0bmcsIHPhur0gc+G7rSBk4bulbmcga2nhu4NtIMSR4buLbmggQ2hpLWLDrG5oIHBoxrDGoW5nIChDaGktc3F1YXJlIHRlc3QpLiANCg0KYGBge3J9DQojIEtp4buDbSDEkeG7i25oDQpjaGlzcV9yZXN1bHQgPC0gY2hpc3EudGVzdChkMSkNCiMgSW4ga+G6v3QgcXXhuqMNCmNoaXNxX3Jlc3VsdA0KYGBgDQoNCkdp4bqjIHRodXnhur90Og0KDQokJA0KXGxlZnRcew0KXGJlZ2lue2FycmF5fXtsbH0NCkhfMDogJiBcdGV4dHtCaeG6v24gR2VuZGVyIHbDoCBiaeG6v24gUHJvZHVjdEZhbWlseSBraMO0bmcgY8OzIG3hu5FpIHF1YW4gaOG7hy59ICBcXFxcDQpIXzE6ICYgXHRleHR7Qmnhur9uIEdlbmRlciB2w6AgYmnhur9uIFByb2R1Y3RGYW1pbHkgY8OzIG3hu5FpIHF1YW4gaOG7hy59IFwNClxlbmR7YXJyYXl9DQpccmlnaHQuDQokJA0KDQpL4bq/dCBxdeG6oyBraeG7g20gxJHhu4tuaDogVuG7m2kgbeG7qWMgw70gbmdoxKlhIDAuMDUsIHbDrCBwLXZhbHVlID0gMC4xNzIyID4gMC4wNSwga2jDtG5nIMSR4bunIGLhurFuZyBjaOG7qW5nIMSR4buDIGLDoWMgYuG7jyBnaeG6oyB0aHV54bq/dCAkSF8wJC4gVuG6rXkgIGdp4buvYSBiaeG6v24gR2VuZGVyIHbDoCBiaeG6v24gUHJvZHVjdEZhbWlseSBraMO0bmcgdOG7k24gdOG6oWkgbeG7kWkgcXVhbiBo4buHLiANCg0KIyMgKio0LjIgQmnhur9uIE1hcml0YWxTdGF0dXMgdsOgIEhvbWVvd25lcioqDQoNCk5o4bqxbSBoaeG7g3UgcsO1IGjGoW4gbeG7kWkgcXVhbiBo4buHIGdp4buvYSB0w6xuaCB0cuG6oW5nIGjDtG4gbmjDom4gKE1hcml0YWxTdGF0dXMpIHbDoCB2aeG7h2Mgc+G7nyBo4buvdSBuaMOgIChIb21lb3duZXIpLCBjaMO6bmcgdGEgc+G6vSB4w6J5IGThu7FuZyBi4bqjbmcgdOG6p24gc3XhuqV0IGNow6lvIHRo4buDIGhp4buHbiBz4buRIGzGsOG7o25nIHThu6tuZyBr4bq/dCBo4bujcCBnaeG7r2EgaGFpIGJp4bq/biBuw6B5LiBTYXUgxJHDsywgYmnhu4N1IMSR4buTIGPhu5l0IHPhur0gxJHGsOG7o2Mgc+G7rSBk4bulbmcgxJHhu4MgdHLhu7FjIHF1YW4gaMOzYSBz4buxIHBow6JuIGLhu5EgY+G7p2Egdmnhu4djIHPhu58gaOG7r3UgbmjDoCB0aGVvICB0w6xuaCB0cuG6oW5nIGjDtG4gbmjDom4sIGdpw7pwIHF1YW4gc8OhdCBk4buFIGTDoG5nIHPhu7Ega2jDoWMgYmnhu4d0Lg0KDQoqKkLhuqNuZyB04bqnbiBzdeG6pXQgY2jDqW8gdsOgIHRy4buxYyBxdWFuIGjDs2EqKg0KDQoqQuG6o25nIHThuqduIHN14bqldCBjaMOpbyoNCg0KYGBge3J9DQpkMiA8LSB0YWJsZShkX2NhdCRNYXJpdGFsU3RhdHVzLGRfY2F0JEhvbWVvd25lcikNCmFkZG1hcmdpbnMoZDIpDQpgYGANCg0KKkLhuqNuZyB04bqnbiBzdeG6pXQgY2jDqW8gdGhlbyB04bu3IGzhu4cgaMOgbmcqDQoNCmBgYHtyfQ0KcHJvcC50YWJsZShkMiwgbWFyZ2luID0gMSkNCmBgYA0KKlRy4buxYyBxdWFuIGjDs2EqDQoNCmBgYHtyfQ0KIyBDaHV54buDbiBzYW5nIGRhdGEgZnJhbWUNCmQyX2RmIDwtIGFzLmRhdGEuZnJhbWUoZDIpDQpjb2xuYW1lcyhkMl9kZikgPC0gYygiTWFyaXRhbFN0YXR1cyIsICJIb21lb3duZXIiLCAiRnJlcXVlbmN5IikNCiMgVuG6vSBiaeG7g3UgxJHhu5MgdOG7qyBi4bqjbmcgdOG6p24gc3XhuqV0DQpnZ3Bsb3QoZDJfZGYsIGFlcyh4ID0gTWFyaXRhbFN0YXR1cywgeSA9IEZyZXF1ZW5jeSwgZmlsbCA9IEhvbWVvd25lcikpICsNCiAgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIsIHBvc2l0aW9uID0gImRvZGdlIikgKw0KICBsYWJzKA0KICAgIHRpdGxlID0gIkJp4buDdSDEkeG7kyB04bqnbiBzdeG6pXQgZ2nhu69hIE1hcml0YWxTdGF0dXMgdsOgIEhvbWVvd25lciIsDQogICAgeCA9ICJNYXJpdGFsU3RhdHVzIiwNCiAgICB5ID0gIlThuqduIHN14bqldCINCiAgKSArDQogIHRoZW1lX21pbmltYWwoKQ0KYGBgDQoNCipOaOG6rW4geMOpdCoNCg0KLSBE4buxYSB2w6BvIGvhur90IHF14bqjIHRyw6puLCB0YSBuaOG6rW4gdGjhuqV5IHRyb25nIG5ow7NtIG5nxrDhu51pIMSRw6Mga+G6v3QgaMO0biAoTSkgY8OzIDE3MTkgbmfGsOG7nWkgKDI1LjA0JSkga2jDtG5nIHPhu58gaOG7r3UgbmjDoCB2w6AgNTE0NyBuZ8aw4budaSAoNzQuOTYlKSBz4bufIGjhu691IG5ow6AuIEPDsm4gbmjDs20gbmfGsOG7nWkgxJHhu5ljIHRow6JuIChTKSBjw7MgMzg5NiBuZ8aw4budaSAoNTQuMTYlKSBraMO0bmcgc+G7nyBo4buvdSBuaMOgIHbDoCAzMjk3IG5nxrDhu51pICg0NS44NCUpIHPhu58gaOG7r3UgbmjDoC4NCg0KLSBRdWEgxJHDsyB0YSBuaOG6rW4gdGjhuqV5IG3hu5FpIHF1YW4gaOG7hyB0w61jaCBj4buxYyBnaeG7r2Egdmnhu4djIGvhur90IGjDtG4gdsOgIHPhu58gaOG7r3UgbmjDoC4gTmfGsOG7nWkgxJHDoyBr4bq/dCBow7RuIGPDsyB4dSBoxrDhu5tuZyDhu5VuIMSR4buLbmggaMahbiB24buBIG3hurd0IGNo4buXIOG7nywgY8OzIHRo4buDIGRvIMSRaeG7gXUga2nhu4duIHTDoGkgY2jDrW5oIGhv4bq3YyDGsHUgdGnDqm4gxJHhuqd1IHTGsCBsw6J1IGTDoGkgaMahbiBzbyB24bubaSBuZ8aw4budaSDEkeG7mWMgdGjDom4uDQoNCi0gWHUgaMaw4bubbmcgY2h1bmcgbMOgIGvhur90IGjDtG4gdGjGsOG7nW5nIMSRaSBrw6htIHbhu5tpIGto4bqjIG7Eg25nIHPhu58gaOG7r3UgbmjDoCBjYW8gaMahbiwgcGjhuqNuIMOhbmggbeG7qWMgxJHhu5kg4buVbiDEkeG7i25oIHbDoCBjYW0ga+G6v3QgdMOgaSBjaMOtbmggbMOidSBkw6BpIGjGoW4gdHJvbmcgY3Xhu5ljIHPhu5FuZy4NCg0KKktp4buDbSDEkeG7i25oIHRo4buRbmcga8OqIChLaeG7g20gxJHhu4tuaCBDaGktYsOsbmggcGjGsMahbmcpKg0KDQrEkOG7gyDEkcOhbmggZ2nDoSB4ZW0gY8OzIG3hu5FpIGxpw6puIGjhu4cgY8OzIMO9IG5naMSpYSB0aOG7kW5nIGvDqiBnaeG7r2EgaGFpIGJp4bq/biBwaMOibiBsb+G6oWkgbMOgIE1hcml0YWxTdGF0dXMgdsOgIEhvbWVvd25lciBoYXkga2jDtG5nLCBz4bq9IHPhu60gZOG7pW5nIGtp4buDbSDEkeG7i25oIENoaS1iw6xuaCBwaMawxqFuZyAoQ2hpLXNxdWFyZSB0ZXN0KS4NCg0KYGBge3J9DQojIEtp4buDbSDEkeG7i25oDQpjaGlzcV9yZXN1bHQgPC0gY2hpc3EudGVzdChkMikNCg0KIyBJbiBr4bq/dCBxdeG6ow0KY2hpc3FfcmVzdWx0DQpgYGANCg0KR2nhuqMgdGh1eeG6v3Q6DQoNCiQkDQpcbGVmdFx7DQpcYmVnaW57YXJyYXl9e2xsfQ0KSF8wOiAmIFx0ZXh0e0Jp4bq/biBNYXJpdGFsU3RhdHVzIHbDoCBiaeG6v24gSG9tZW93bmVyIGtow7RuZyBjw7MgbeG7kWkgcXVhbiBo4buHLn0gIFxcXFwNCkhfMTogJiBcdGV4dHsgQmnhur9uIE1hcml0YWxTdGF0dXMgdsOgIGJp4bq/biBIb21lb3duZXIgY8OzIG3hu5FpIHF1YW4gaOG7hy59IFwNClxlbmR7YXJyYXl9DQpccmlnaHQuDQokJA0KDQpL4bq/dCBxdeG6oyBraeG7g20gxJHhu4tuaDogVuG7m2kgbeG7qWMgw70gbmdoxKlhIDAuMCB24bubaSBwLXZhbHVlID0gMi4yZS0xNiA8IDAuMDUsIGLDoWMgYuG7jyBnaeG6oyB0aHV54bq/dCAkSF8wJCB04bupYyBsw6AgY2jhuqVwIG5o4bqtbiBnaeG6oyB0aHV54bq/dCAkSF8xJC4gVuG6rXkgZ2nhu69hIGJp4bq/biBNYXJpdGFsU3RhdHVzIHbDoCBiaeG6v24gSG9tZW93bmVyIGPDsyB04buTbiB04bqhaSBt4buRaSBxdWFuIGjhu4cuDQoNCiMjICoqNC4zIEJp4bq/biBQcm9kdWN0RmFtaWx5IHbDoCBBbm51YWxJbmNvbWUqKg0KDQpOaOG6sW0gaGnhu4N1IHLDtSBoxqFuIG3hu5FpIHF1YW4gaOG7hyBnaeG7r2EgbmjDs20gc+G6o24gcGjhuqltIChQcm9kdWN0RmFtaWx5KSB2w6AgdGh1IG5o4bqtcCBo4bqxbmcgbsSDbSAoQW5udWFsSW5jb21lKSwgY2jDum5nIHRhIHPhur0geMOieSBk4buxbmcgYuG6o25nIHThuqduIHN14bqldCBjaMOpbyB0aOG7gyBoaeG7h24gc+G7kSBsxrDhu6NuZyB04burbmcga+G6v3QgaOG7o3AgZ2nhu69hIGhhaSBiaeG6v24gbsOgeS4gU2F1IMSRw7MsIGJp4buDdSDEkeG7kyBj4buZdCBz4bq9IMSRxrDhu6NjIHPhu60gZOG7pW5nIMSR4buDIHRy4buxYyBxdWFuIGjDs2Egc+G7sSBwaMOibiBi4buRIGPhu6dhIGRhbmggbeG7pWMgc+G6o24gcGjhuqltIHRoZW8gIHRodSBuaOG6rXAgaOG6sW5nIG7Eg20sIGdpw7pwIHF1YW4gc8OhdCBk4buFIGTDoG5nIHPhu7Ega2jDoWMgYmnhu4d0Lg0KDQoqQuG6o25nIHThuqduIHN14bqldCBjaMOpbyoNCg0KYGBge3J9DQpkMyA8LSB0YWJsZShkX2NhdCRQcm9kdWN0RmFtaWx5LCBkX2NhdCRBbm51YWxJbmNvbWUpDQphZGRtYXJnaW5zKGQzKQ0KYGBgDQoqQuG6o25nIHThuqduIHN14bqldCBjaMOpbyB0aGVvIHThu7cgbOG7hyBow6BuZyoNCg0KYGBge3J9DQpwcm9wLnRhYmxlKGQzLCBtYXJnaW4gPSAxKQ0KYGBgDQoNCipUcuG7sWMgcXVhbiBow7NhKg0KDQpgYGB7cn0NCiMgQ2h1eeG7g24gc2FuZyBkYXRhIGZyYW1lDQpkM19kZiA8LSBhcy5kYXRhLmZyYW1lKGQzKQ0KY29sbmFtZXMoZDNfZGYpIDwtIGMoIkFubnVhbEluY29tZSIsICJQcm9kdWN0RmFtaWx5IiwgIkZyZXF1ZW5jeSIpDQojIFbhur0gYmnhu4N1IMSR4buTIHThu6sgYuG6o25nIHThuqduIHN14bqldA0KZ2dwbG90KGQzX2RmLCBhZXMoeCA9IEFubnVhbEluY29tZSwgeSA9IEZyZXF1ZW5jeSwgZmlsbCA9IFByb2R1Y3RGYW1pbHkpKSArDQogIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiLCBwb3NpdGlvbiA9ICJkb2RnZSIpICsNCiAgbGFicygNCiAgICB0aXRsZSA9ICJCaeG7g3UgxJHhu5MgdOG6p24gc3XhuqV0IGdp4buvYSBQcm9kdWN0RmFtaWx5IHbDoCBBbm51YWxJbmNvbWUiLA0KICAgIHggPSAiUHJvZHVjdEZhbWlseSIsDQogICAgeSA9ICJU4bqnbiBzdeG6pXQiDQogICkgKw0KICB0aGVtZV9taW5pbWFsKCkNCmBgYA0KDQoqTmjhuq1uIHjDqXQqDQoNCi0gROG7sWEgdsOgbyBr4bq/dCBxdeG6oyB0csOqbiB0YSBuaOG6rW4gdGjhuqV5IG5ow7NtIEZvb2QgY2hp4bq/bSBjw7MgdOG6p24gc3XhuqV0IGzhu5tuIG5o4bqldCDhu58gdOG6pXQgY+G6oyBjw6FjIG5ow7NtIHRodSBuaOG6rXAsIGNoaeG6v20gcGjhuqduIGzhu5tuIHRyb25nIHThu5VuZyBz4buRIGNobyB0aOG6pXkgxJHDonkgbMOgIG5ow7NtIHPhuqNuIHBo4bqpbSBwaOG7lSBiaeG6v24gbmjhuqV0LiBDw7JuIGzhuqFpIG5ow7NtIERyaW5rIHbDoCBOb24tQ29uc3VtYWJsZSBjw7MgdOG6p24gc3XhuqV0IHRo4bqlcCBoxqFuLCBuaMawbmcgcGjDom4gYuG7kSBraMOhIMSR4buTbmcgxJHhu4F1IHF1YSBjw6FjIG5ow7NtIHRodSBuaOG6rXAuDQoNCi0gROG7sWEgdHLDqm4gc+G7kSBsaeG7h3UgdOG7tyBs4buHIHBo4bqnbiB0csSDbSBraMOhIMSR4buTbmcgxJHhu4F1IHF1YSBjw6FjIG5ow7NtIHRodSBuaOG6rXAsIGTGsOG7nW5nIG5oxrAga2jDtG5nIGPDsyBz4buxIGxpw6puIGvhur90IG3huqFuaCBt4bq9ICBnaeG7r2EgbmjDs20gdGh1IG5o4bqtcCB2w6AgbG/huqFpIHPhuqNuIHBo4bqpbSDEkcaw4bujYyBs4buxYSBjaOG7jW4uQ8OhYyBuaMOzbSBz4bqjbiBwaOG6qW0gxJHGsOG7o2MgbXVhIHTGsMahbmcgxJHhu5FpIMSR4buTbmcgxJHhu4F1IHRyw6puIGPDoWMgbmjDs20gdGh1IG5o4bqtcCBraMOhYyBuaGF1Lg0KDQotIFh1IGjGsOG7m25nIG5ow7NtIEZvb2QgbHXDtG4gY2hp4bq/bSBwaOG6p24gbOG7m24gdHJvbmcgbeG7jWkgbmjDs20gdGh1IG5o4bqtcCwgY2hvIHRo4bqleSDEkcOieSBsw6AgbmjDs20gxJHGsOG7o2MgxrB1IHRpw6puIG11YSBuaGnhu4F1IG5o4bqldCBi4bqldCBr4buDIG3hu6ljIHRodSBuaOG6rXAuDQoNCipLaeG7g20gxJHhu4tuaCB0aOG7kW5nIGvDqiAoS2nhu4NtIMSR4buLbmggQ2hpLWLDrG5oIHBoxrDGoW5nKSoNCg0KxJDhu4MgxJHDoW5oIGdpw6EgeGVtIGPDsyBt4buRaSBsacOqbiBo4buHIGPDsyDDvSBuZ2jEqWEgdGjhu5FuZyBrw6ogZ2nhu69hIGhhaSBiaeG6v24gcGjDom4gbG/huqFpIGzDoCBQcm9kdWN0RmFtaWx5IHbDoCBBbm51YWxJbmNvbWUgaGF5IGtow7RuZywgc+G6vSBz4butIGThu6VuZyBraeG7g20gxJHhu4tuaCBDaGktYsOsbmggcGjGsMahbmcgKENoaS1zcXVhcmUgdGVzdCkuDQoNCmBgYHtyfQ0KIyBLaeG7g20gxJHhu4tuaA0KY2hpc3FfcmVzdWx0IDwtIGNoaXNxLnRlc3QoZDMpDQoNCiMgSW4ga+G6v3QgcXXhuqMNCmNoaXNxX3Jlc3VsdA0KYGBgDQoNCkdp4bqjIHRodXnhur90Og0KDQokJA0KXGxlZnRcew0KXGJlZ2lue2FycmF5fXtsbH0NCkhfMDogJiBcdGV4dHtCaeG6v24gUHJvZHVjdEZhbWlseSAgdsOgIGJp4bq/biBBbm51YWxJbmNvbWUga2jDtG5nIGPDsyBt4buRaSBxdWFuIGjhu4cufSAgXFxcXA0KSF8xOiAmIFx0ZXh0e0Jp4bq/biBQcm9kdWN0RmFtaWx5ICB2w6AgYmnhur9uIEFubnVhbEluY29tZSBjw7MgbeG7kWkgcXVhbiBo4buHLiB9IFwNClxlbmR7YXJyYXl9DQpccmlnaHQuDQokJA0KDQpL4bq/dCBxdeG6oyBraeG7g20gxJHhu4tuaDogVuG7m2kgbeG7qWMgw70gbmdoxKlhIDAuMDUsIHbDrCBwLXZhbHVlID0gMC4zODkyID4gMC4wNSwga2jDtG5nIMSR4bunIGLhurFuZyBjaOG7qW5nIMSR4buDIGLDoWMgYuG7jyBnaeG6oyB0aHV54bq/dCAkSF8wJC4gVuG6rXkgZ2nhu69hIGJp4bq/biBQcm9kdWN0RmFtaWx5ICB2w6AgYmnhur9uIEFubnVhbEluY29tZSBraMO0bmcgdOG7k24gdOG6oWkgbeG7kWkgcXVhbiBo4buHLiANCg0KIyMgKio0LjQgQmnhur9uIFN0YXRlb3JQcm92aW5jZSB2w6AgUHJvZHVjdEZhbWlseSoqDQoNCsSQ4buDIGhp4buDdSByw7UgaMahbiBt4buRaSBxdWFuIGjhu4cgZ2nhu69hIGPDoWMgYmFuZyAoU3RhdGVvclByb3ZpbmNlKSB2w6AgbmjDs20gc+G6o24gcGjhuqltIChQcm9kdWN0RmFtaWx5KSwgY2jDum5nIHRhIHPhur0geMOieSBk4buxbmcgYuG6o25nIHThuqduIHN14bqldCBjaMOpbyB0aOG7gyBoaeG7h24gc+G7kSBsxrDhu6NuZyB04burbmcga+G6v3QgaOG7o3AgZ2nhu69hIGhhaSBiaeG6v24gbsOgeS4gU2F1IMSRw7MsIGJp4buDdSDEkeG7kyBj4buZdCBz4bq9IMSRxrDhu6NjIHPhu60gZOG7pW5nIMSR4buDIHRy4buxYyBxdWFuIGjDs2Egc+G7sSBwaMOibiBi4buRIGPhu6dhIG5ow7NtIHPhuqNuIHBo4bqpbSB0aGVvIGPDoWMgYmFuZywgZ2nDunAgcXVhbiBzw6F0IGThu4UgZMOgbmcgc+G7sSBraMOhYyBiaeG7h3QuDQoNCipC4bqjbmcgdOG6p24gc3XhuqV0IGNow6lvKg0KDQpgYGB7cn0NCmQ0IDwtIHRhYmxlKGRfY2F0JFN0YXRlb3JQcm92aW5jZSxkX2NhdCRQcm9kdWN0RmFtaWx5KQ0KYWRkbWFyZ2lucyhkNCkNCmBgYA0KKkLhuqNuZyB04bqnbiBzdeG6pXQgY2jDqW8gdGhlbyB04bu3IGzhu4cgaMOgbmcqDQoNCmBgYHtyfQ0KcHJvcC50YWJsZShkNCwgbWFyZ2luID0gMSkNCmBgYA0KDQoqVHLhu7FjIHF1YW4gaMOzYSoNCg0KYGBge3J9DQojIENodXnhu4NuIHNhbmcgZGF0YSBmcmFtZQ0KZDRfZGYgPC0gYXMuZGF0YS5mcmFtZShkNCkNCmNvbG5hbWVzKGQ0X2RmKSA8LSBjKCJTdGF0ZW9yUHJvdmluY2UiLCAiUHJvZHVjdEZhbWlseSIsICJGcmVxdWVuY3kiKQ0KIyBW4bq9IGJp4buDdSDEkeG7kyB04burIGLhuqNuZyB04bqnbiBzdeG6pXQNCmdncGxvdChkNF9kZiwgYWVzKHggPSBTdGF0ZW9yUHJvdmluY2UsIHkgPSBGcmVxdWVuY3ksIGZpbGwgPSBQcm9kdWN0RmFtaWx5KSkgKw0KICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IiwgcG9zaXRpb24gPSAiZG9kZ2UiKSArDQogIGxhYnMoDQogICAgdGl0bGUgPSAiQmnhu4N1IMSR4buTIHThuqduIHN14bqldCBnaeG7r2EgU3RhdGVvclByb3ZpbmNlIHbDoCBQcm9kdWN0RmFtaWx5IiwNCiAgICB4ID0gIlN0YXRlb3JQcm92aW5jZSIsDQogICAgeSA9ICJU4bqnbiBzdeG6pXQiDQogICkgKw0KICB0aGVtZV9taW5pbWFsKCkNCmBgYA0KDQoqTmjhuq1uIHjDqXQqDQoNCi0gROG7sWEgdsOgbyBr4bq/dCBxdeG6oyB0csOqbiB0YSBuaOG6rW4gdGjhuqV5IEZvb2QgbHXDtG4gbMOgIG5ow7NtIHPhuqNuIHBo4bqpbSDEkcaw4bujYyBtdWEgbmhp4buBdSBuaOG6pXQgbHXhu5FuIGNoaeG6v20gaMahbiA3MCUsIHRp4bq/cCB0aGVvIGzDoCBuaMOzbSBz4bqjbiBwaOG6qW0gTm9uLUNvbnN1bWFibGUgZGFvIMSR4buZbmcgdOG7qyAxNyUtMjAlIHbDoCBjdeG7kWkgY8O5bmcgbMOgIG5ow7NtIERyaW5rIGNoaeG6v20gNi0xMCUuDQoNCi0gxJDhurdjIGJp4buHdCBsw6AgxJHhu5FpIHbhu5tpIGJhbmcgV0EgKFdhc2hpbmd0b24pIGPDsyB04bqnbiBzdeG6pXQgY2FvIMSR4buRaSB24bubaSAzIG5ow7NtIHPhuqNuIHBo4bqpbSBuw6B5IHbDoCBKYWxpc2NvIHRow6wgbmfGsOG7o2MgbOG6oWkgY8OzIHThuqduIHN14bqldCB0aOG6pXAgbmjhuqV0IHRyb25nIGPDoWMgYmFuZy4NCg0KLSBN4buRaSBxdWFuIGjhu4cgZ2nhu69hIGJhbmcgdsOgIG5ow7NtIHPhuqNuIHBo4bqpbSDEkcaw4bujYyBtdWEgY2hvIHRo4bqleSBz4buxIHBow6JuIGLhu5EgdOG7tyBs4buHIGtow6Eg4buVbiDEkeG7i25oLCB24bubaSBuaMOzbSBGb29kIGNoaeG6v20gxrB1IHRo4bq/IOG7nyB04bqldCBj4bqjIGPDoWMgYmFuZy4gTeG6t2MgZMO5IGPDsyBt4buZdCBz4buRIGJp4bq/biDEkeG7mW5nIG5o4bq5IOG7nyB04bu3IGzhu4cgbXVhIG5ow7NtIERyaW5rIHbDoCBOb24tQ29uc3VtYWJsZSBnaeG7r2EgY8OhYyBraHUgduG7sWMsIG5oxrBuZyB4dSBoxrDhu5tuZyBjaHVuZyBjaG8gdGjhuqV5IGtodSB24buxYyDhuqNuaCBoxrDhu59uZyBuaOG6uSDEkeG6v24gbOG7sWEgY2jhu41uIG5ow7NtIHPhuqNuIHBo4bqpbSBj4bunYSBraMOhY2ggaMOgbmcuDQoNCi0gWHUgaMaw4bubbmcgY2jDrW5oIGzDoCBz4buxIMawdSB0acOqbiBjaOG7jW4gbXVhIG5ow7NtIEZvb2Qg4bufIG3hu41pIGtodSB24buxYywgY2hp4bq/bSBwaOG6p24gbOG7m24gdOG7tyBs4buHIHRpw6p1IGTDuW5nLg0KDQoqS2nhu4NtIMSR4buLbmggdGjhu5FuZyBrw6ogKEtp4buDbSDEkeG7i25oIENoaS1iw6xuaCBwaMawxqFuZykqDQoNCsSQ4buDIMSRw6FuaCBnacOhIHhlbSBjw7MgbeG7kWkgbGnDqm4gaOG7hyBjw7Mgw70gbmdoxKlhIHRo4buRbmcga8OqIGdp4buvYSBoYWkgYmnhur9uIHBow6JuIGxv4bqhaSBsw6AgIFN0YXRlb3JQcm92aW5jZSAgdsOgIFByb2R1Y3RGYW1pbHkga2jDtG5nLCBz4bq9IHPhu60gZOG7pW5nIGtp4buDbSDEkeG7i25oIENoaS1iw6xuaCBwaMawxqFuZyAoQ2hpLXNxdWFyZSB0ZXN0KS4NCg0KYGBge3J9DQojIEtp4buDbSDEkeG7i25oDQpjaGlzcV9yZXN1bHQgPC0gY2hpc3EudGVzdChkNCkNCg0KIyBJbiBr4bq/dCBxdeG6ow0KY2hpc3FfcmVzdWx0DQpgYGANCkdp4bqjIHRodXnhur90Og0KDQokJA0KXGxlZnRcew0KXGJlZ2lue2FycmF5fXtsbH0NCkhfMDogJiBcdGV4dHtCaeG6v24gUHJvZHVjdEZhbWlseSB2w6AgYmnhur9uIFN0YXRlb3JQcm92aW5jZSBraMO0bmcgY8OzIG3hu5FpIHF1YW4gaOG7hy59ICBcXFxcDQpIXzE6ICYgXHRleHR7Qmnhur9uIFByb2R1Y3RGYW1pbHkgdsOgIGJp4bq/biBTdGF0ZW9yUHJvdmluY2UgY8OzIG3hu5FpIHF1YW4gaOG7hy4gfSBcDQpcZW5ke2FycmF5fQ0KXHJpZ2h0Lg0KJCQNCg0KS+G6v3QgcXXhuqMga2nhu4NtIMSR4buLbmg6IFbhu5tpIG3hu6ljIMO9IG5naMSpYSAwLjA1LCB2w6wgcC12YWx1ZSA9IDAuODMxNCA+IDAuMDUsIGtow7RuZyDEkeG7pyBi4bqxbmcgY2jhu6luZyDEkeG7gyBiw6FjIGLhu48gZ2nhuqMgdGh1eeG6v3QgJEhfMCQuIFbhuq15IGdp4buvYSBCaeG6v24gUHJvZHVjdEZhbWlseSB2w6AgYmnhur9uIFN0YXRlb3JQcm92aW5jZSBraMO0bmcgY8OzIG3hu5FpIHF1YW4gaOG7hy4gDQoNCiMgKipQaOG6p24gNTogVOG7lW5nIGvhur90IHbDoCB0aOG6o28gbHXhuq1uKioNCg0KIyMgKio1LjEgVMOzbSB04bqvdCBuaOG7r25nIHBow6F0IGhp4buHbiBjaMOtbmgqKg0KDQoqKlBow6F0IGhp4buHbiB24buBIG3hu5FpIHF1YW4gaOG7hyBnaeG7r2EgMiBiaeG6v24gR2VuZGVyIHbDoCBQcm9kdWN0RmFtaWx5KioNCg0KS+G6v3QgcXXhuqMgcGjDom4gdMOtY2ggY2hvIHRo4bqleSBuYW0gdsOgIG7hu68gxJHhu4F1IGNo4bunIHnhur91IG11YSBz4bqjbiBwaOG6qW0gdGh14buZYyBuaMOzbSBGb29kICh0csOqbiA3MCUpLCB0aeG6v3AgxJHhur9uIGzDoCBOb24tQ29uc3VtYWJsZSAoa2hv4bqjbmcgMTgtMTklKSwgdsOgIGN14buRaSBjw7luZyBsw6AgRHJpbmsgKGTGsOG7m2kgMTAlKS4gVOG7tyBs4buHIG11YSBEcmluayBj4bunYSBu4buvIGNhbyBoxqFuIG5hbSBt4buZdCBjaMO6dC4gTmjDrG4gdsOgbyBr4bq/dCBxdeG6oyBuw6B5LCBjw7MgduG6uyBuaMawIG5hbSB2w6AgbuG7ryBjw7MgeHUgaMaw4bubbmcgbXVhIHPhuq9tIGtow6EgZ2nhu5FuZyBuaGF1LCBraMO0bmcgY8OzIHPhu7Ega2jDoWMgYmnhu4d0IHLDtSBy4buHdCB24buBIHPhu58gdGjDrWNoIHPhuqNuIHBo4bqpbS4gVHV5IG5oacOqbiwga2nhu4NtIMSR4buLbmggQ2hpLWLDrG5oIHBoxrDGoW5nIGNobyB0aOG6pXkgcC12YWx1ZSA9IDAuMTcyMiAoPiAwLjA1KSwga2jDtG5nIMSR4bunIGLhurFuZyBjaOG7qW5nIMSR4buDIGvhur90IGx14bqtbiBy4bqxbmcgY8OzIG3hu5FpIHF1YW4gaOG7hyBjw7Mgw70gbmdoxKlhIHRo4buRbmcga8OqIGdp4buvYSBnaeG7m2kgdMOtbmggdsOgIG5ow7NtIHPhuqNuIHBo4bqpbS4gDQoNClN1eSByYTogTeG6t2MgZMO5IGPDsyBz4buxIGtow6FjIGJp4buHdCBuaOG7jyB0cm9uZyB04bu3IGzhu4csIGvhur90IGx14bqtbiBjdeG7kWkgY8O5bmcgbMOgIGtow7RuZyBjw7MgbeG7kWkgbGnDqm4gaOG7hyB0aOG7kW5nIGvDqiDEkcOhbmcga+G7gyBnaeG7r2EgaGFpIGJp4bq/biBuw6B5Lg0KDQoqKlBow6F0IGhp4buHbiB24buBIG3hu5FpIHF1YW4gaOG7hyBnaeG7r2EgMiBiaeG6v24gTWFyaXRhbFN0YXR1cyB2w6AgSG9tZW93bmVyKioNCg0KS+G6v3QgcXXhuqMgY2hvIHRo4bqleSBuZ8aw4budaSDEkcOjIGvhur90IGjDtG4gY8OzIHThu7cgbOG7hyBz4bufIGjhu691IG5ow6AgbMOqbiDEkeG6v24gNzUlLCB0cm9uZyBraGkgbmfGsOG7nWkgxJHhu5ljIHRow6JuIGNo4buJIGtob+G6o25nIDQ2JS4gQ29uIHPhu5EgbsOgeSBwaOG6o24gw6FuaCBt4buZdCB4dSBoxrDhu5tuZyByw7UgcuG7h3Q6IG5nxrDhu51pIMSRw6Mga+G6v3QgaMO0biBjw7MgeHUgaMaw4bubbmcg4buVbiDEkeG7i25oIHTDoGkgY2jDrW5oIGjGoW4sIGThu4Ugc+G7nyBo4buvdSBuaMOgIGjGoW4gc28gduG7m2kgbmfGsOG7nWkgxJHhu5ljIHRow6JuLiBLaeG7g20gxJHhu4tuaCBDaGktYsOsbmggcGjGsMahbmcgY2hvIG3hu5FpIHF1YW4gaOG7hyBuw6B5IGNobyBr4bq/dCBxdeG6oyBwLXZhbHVlIDwgMi4yZS0xNiwgbmjhu48gaMahbiBy4bqldCBuaGnhu4F1IHNvIHbhu5tpIG3hu6ljIMO9IG5naMSpYSAwLjA1LiANCg0KU3V5IHJhOiBjw7MgdGjhu4Mga2jhurNuZyDEkeG7i25oIG3hu5FpIHF1YW4gaOG7hyBnaeG7r2EgdMOsbmggdHLhuqFuZyBow7RuIG5ow6JuIHbDoCB2aeG7h2Mgc+G7nyBo4buvdSBuaMOgIGPDsyDDvSBuZ2jEqWEgdGjhu5FuZyBrw6ouDQoNCg0KKipQaMOhdCBoaeG7h24gduG7gSBt4buRaSBxdWFuIGjhu4cgZ2nhu69hIDIgYmnhur9uIFByb2R1Y3RGYW1pbHkgdsOgIEFubnVhbEluY29tZSoqDQoNClBow6JuIHTDrWNoIHBow6JuIGLhu5EgbmjDs20gc+G6o24gcGjhuqltIHRoZW8gY8OhYyBt4bupYyB0aHUgbmjhuq1wIGNobyB0aOG6pXkgbmjDs20gRm9vZCBsdcO0biBjaGnhur9tIHThu7cgbOG7hyBjYW8gbmjhuqV0IChoxqFuIDcwJSkg4bufIG3hu41pIG3hu6ljIHRodSBuaOG6rXAsIGPDsm4gbmjDs20gRHJpbmsgdsOgIE5vbi1Db25zdW1hYmxlIGPDsyBwaMOibiBi4buRIGtow6EgdMawxqFuZyDEkeG7k25nIHbDoCBraMO0bmcgY8OzIGNow6puaCBs4buHY2ggxJHDoW5nIGvhu4MuIEThu7FhIHbDoG8ga+G6v3QgcXXhuqMgbsOgeSwgY8OzIHRo4buDIHN1eSByYSBy4bqxbmcgbeG7qWMgdGh1IG5o4bqtcCBraMO0bmcgcGjhuqNpIGzDoCB54bq/dSB04buRIHF1eeG6v3QgxJHhu4tuaCByw7UgcsOgbmcgY2hvIHZp4buHYyBtdWEgbG/huqFpIHPhuqNuIHBo4bqpbSBuw6BvLiANCg0KKipQaMOhdCBoaeG7h24gduG7gSBt4buRaSBxdWFuIGjhu4cgZ2nhu69hIDIgYmnhur9uIFN0YXRlb3JQcm92aW5jZSB2w6AgUHJvZHVjdEZhbWlseSoqDQoNCk5ow7NtIHPhuqNuIHBo4bqpbSBGb29kIGx1w7RuIGNoaeG6v20gdOG7tyBs4buHIGNhbyBuaOG6pXQg4bufIHThuqV0IGPhuqMgY8OhYyBiYW5nLCBkYW8gxJHhu5luZyB0csOqbiA3MCUuIFRp4bq/cCB0aGVvIGzDoCBuaMOzbSBOb24tQ29uc3VtYWJsZSwgZGFvIMSR4buZbmcga2hv4bqjbmcgMTctMjAlLCB2w6AgbmjDs20gRHJpbmsgY2hp4bq/bSB04bu3IGzhu4cgdGjhuqVwIG5o4bqldCwga2hv4bqjbmcgNi0xMCUuIMSQw6FuZyBjaMO6IMO9LCBiYW5nIFdhc2hpbmd0b24gKFdBKSBjw7MgdOG6p24gc3XhuqV0IG11YSBjYW8gbmjhuqV0IOG7nyBj4bqjIGJhIG5ow7NtIHPhuqNuIHBo4bqpbSwgdHJvbmcga2hpIGJhbmcgSmFsaXNjbyBjw7MgdOG6p24gc3XhuqV0IHRo4bqlcCBuaOG6pXQuIE3hurdjIGTDuSBjw7Mgc+G7sSBraMOhYyBiaeG7h3Qgbmjhu48gZ2nhu69hIGPDoWMgYmFuZywgeHUgaMaw4bubbmcgY2h1bmcgY2hvIHRo4bqleSB04bu3IGzhu4cgxrB1IHRpw6puIGNo4buNbiBtdWEgbmjDs20gRm9vZCBsdcO0biB2xrDhu6N0IHRy4buZaSwgY8OybiB04bu3IGzhu4cgY+G7p2EgY8OhYyBuaMOzbSBjw7JuIGzhuqFpIGtow6Eg4buVbiDEkeG7i25oIGdp4buvYSBjw6FjIGtodSB24buxYy4gVHV5IG5oacOqbiwga2nhu4NtIMSR4buLbmggQ2hpLWLDrG5oIHBoxrDGoW5nIGNobyBr4bq/dCBxdeG6oyBwLXZhbHVlID0gMC44MzE0ICg+IDAuMDUpLg0KDQpTdXkgcmE6IGTDuSBjw7Mgc+G7sSBiaeG6v24gxJHhu5luZyBuaOG7jyB0cm9uZyB04bu3IGzhu4cgbXVhIHPhuq9tIGdp4buvYSBjw6FjIGJhbmcsIG5oxrBuZyBraMO0bmcgY8OzIG3hu5FpIHF1YW4gaOG7hyB0aOG7kW5nIGvDqiDEkcOhbmcga+G7gyBnaeG7r2EgaGFpIGJp4bq/biBuw6B5Lg0KDQpUw7NtIGzhuqFpOiBxdWEgcGjDom4gdMOtY2ggdGjDrCBjaOG7iSBjw7MgTWFyaXRhbFN0YXR1cyB2w6AgSG9tZW93bmVyIGNobyB0aOG6pXkgbeG7kWkgcXVhbiBo4buHLCBjw6FjIGPhurdwIGJp4bq/biBjw7JuIGzhuqFpIHRow6wga2jDtG5nIHThu5NuIHR0dOG6oWltb29pc3F1YW4gaOG7hyBnaeG7r2EgY8OhYyBiaeG6v24uDQoNCiMjICoqNS4yIEjhuqFuIGNo4bq/IGPhu6dhIHBow6JuIHTDrWNoKioNCg0KxJDhuqd1IHRpw6puLCBwaMOibiB0w61jaCBjaOG7iSBnaeG7m2kgaOG6oW4g4bufIGJp4bq/biDEkeG7i25oIHTDrW5oOiBQaMOibiB0w61jaCBoaeG7h24gdOG6oWkgY2jhu6cgeeG6v3UgdOG6rXAgdHJ1bmcgdsOgbyBjw6FjIGJp4bq/biDEkeG7i25oIHTDrW5oIG5oxrAgR2VuZGVyLCBNYXJpdGFsU3RhdHVzLCBIb21lb3duZXIsIEFubnVhbEluY29tZSB2w6Agdi52LiBDw6FjIGJp4bq/biDEkeG7i25oIGzGsOG7o25nIHF1YW4gdHLhu41uZyBuaMawIFJldmVudWUsIFVuaXRzU29sZCBob+G6t2Mgc+G7kSBsxrDhu6NuZyBDaGlsZHJlbiBjaMawYSDEkcaw4bujYyBwaMOibiB0w61jaCBzw6J1LCBk4bqrbiDEkeG6v24gY8OhYyBwaMOhdCBoaeG7h24gbeG7m2kgY2jhu4kgbcO0IHThuqMgxJHhurdjIMSRaeG7g20gcGjDom4gbG/huqFpIGPhu6dhIGtow6FjaCBow6BuZyBtw6AgY2jGsGEgcGjhuqNuIMOhbmggxJHGsOG7o2MgZ2nDoSB0cuG7iyBraW5oIHThur8gaGF5IG3hu6ljIMSR4buZIHRpw6p1IGTDuW5nIHRo4buxYyB04bq/Lg0KDQpOZ2/DoGkgcmEsIGhp4buHbiBuYXkgcGjDom4gdMOtY2ggY2jhu4kgZOG7q25nIGzhuqFpIOG7nyBt4bupYyBxdWFuIGjhu4cgxJHGoW4gZ2nhuqNuIGdp4buvYSBoYWkgYmnhur9uIGtow7RuZyB0aOG7gyBoaeG7h24gxJHGsOG7o2Mgc+G7sSBraMOhY2ggcXVhbiBi4bufaSB2w6wga2jDtG5nIHBo4bqjaSBjaOG7iSBjw7MgMiBiaeG6v24gdMOhYyDEkeG7jW5nIGzhuqtuIG5oYXUgbcOgIGPDsm4gcGjhu6UgdGh14buZYyB2w6BvIG5oaeG7gXUgYmnhur9uIGtow6FjIG5oYXUuDQoNCiMjICoqNS4zIMSQ4buBIHh14bqldCoqDQoNCsSQ4buDIGto4bqvYyBwaOG7pWMgY8OhYyBo4bqhbiBjaOG6vyB0csOqbiwgbmdoacOqbiBj4bupdSB0cm9uZyB0xrDGoW5nIGxhaSBuw6puIG3hu58gcuG7mW5nIHBow6JuIHTDrWNoIHNhbmcgY8OhYyBiaeG6v24gxJHhu4tuaCBsxrDhu6NuZyBxdWFuIHRy4buNbmcgbmjGsCBEb2FuaCB0aHUgKFJldmVudWUpLCBz4buRIGzGsOG7o25nIHPhuqNuIHBo4bqpbSBiw6FuIHJhIChVbml0c1NvbGQpIHbDoCBz4buRIGzGsOG7o25nIGNvbiBjw6FpIChDaGlsZHJlbikgbmjhurFtIGN1bmcgY+G6pXAgY8OhaSBuaMOsbiB0b8OgbiBkaeG7h24gdsOgIHPDonUgc+G6r2MgaMahbiB24buBIGdpw6EgdHLhu4sga2luaCB04bq/IHbDoCBow6BuaCB2aSB0acOqdSBkw7luZyB0aOG7sWMgdOG6vyBj4bunYSBraMOhY2ggaMOgbmcuDQoNCkLDqm4gY+G6oW5oIMSRw7MsIG7Dqm4gw6FwIGThu6VuZyBjw6FjIHBoxrDGoW5nIHBow6FwIHBow6JuIHTDrWNoIMSRYSBiaeG6v24gKG11bHRpdmFyaWF0ZSBhbmFseXNpcykgxJHhu4MgxJHhu5NuZyB0aOG7nWkgeGVtIHjDqXQg4bqjbmggaMaw4bufbmcgdMawxqFuZyB0w6FjIGdp4buvYSBuaGnhu4F1IHnhur91IHThu5EsIHRoYXkgdsOsIGNo4buJIHBow6JuIHTDrWNoIHF1YW4gaOG7hyBnaeG7r2EgaGFpIGJp4bq/bi4gxJBp4buBdSBuw6B5IGdpw7pwIHBow6F0IGhp4buHbiBjw6FjIG3hu5FpIHF1YW4gaOG7hyBwaOG7qWMgdOG6oXAgdsOgIHPhu7EgdMOhYyDEkeG7mW5nIHF1YSBs4bqhaSBnaeG7r2EgY8OhYyDEkeG6t2MgxJFp4buDbSBraMOhY2ggaMOgbmcgbmjGsCBnaeG7m2kgdMOtbmgsIHRodSBuaOG6rXAsIHF14buRYyBnaWEgdsOgIGPDoWMgeeG6v3UgdOG7kSBraMOhYyDEkeG6v24gaMOgbmggdmkgbXVhIHPhuq9tLCB04burIMSRw7MgbsOibmcgY2FvIMSR4buZIGNow61uaCB4w6FjIHbDoCB0w61uaCBraMOhY2ggcXVhbiBj4bunYSBr4bq/dCBxdeG6oyBuZ2hpw6puIGPhu6l1Lg0KDQpOZ2/DoGkgcmEsIGPhuqduIG3hu58gcuG7mW5nIHF1eSBtw7QgbeG6q3UgbmdoacOqbiBj4bupdSDEkeG7gyDEkeG6o20gYuG6o28gdMOtbmggxJHhuqFpIGRp4buHbiB2w6AgZ2nhuqNtIHRoaeG7g3Ugc2FpIGzhu4djaCBkbyBjw6FjIG5ow7NtIGNvbiBjw7Mga8OtY2ggdGjGsOG7m2Mgbmjhu48sIHF1YSDEkcOzIGPhuqNpIHRoaeG7h24ga2jhuqMgbsSDbmcga2jDoWkgcXXDoXQgaMOzYSBr4bq/dCBxdeG6oyByYSB0b8OgbiBi4buZIHThuq1wIGtow6FjaCBow6BuZyBt4bulYyB0acOqdS4NCg0KIyMgKio1LjQgQ8OidSBo4buPaSBt4bufL0jGsOG7m25nIG5naGnDqm4gY+G7qXUgdGnhur9wIHRoZW8qKg0KDQpN4bufIHLhu5luZyBwaOG6oW0gdmkgcGjDom4gdMOtY2ggYuG6sW5nIGPDoWNoIGvhur90IGjhu6NwIGPhuqMgY8OhYyBiaeG6v24gxJHhu4tuaCBsxrDhu6NuZyBuaMawIGRvYW5oIHRodSwgc+G7kSBsxrDhu6NuZyBz4bqjbiBwaOG6qW0gYsOhbiByYSB2w6Agc+G7kSBsxrDhu6NuZyBjb24gY8OhaSDEkeG7gyDEkcOhbmggZ2nDoSBzw6J1IGjGoW4gduG7gSBnacOhIHRy4buLIGtpbmggdOG6vyBjxaluZyBuaMawIG3hu6ljIMSR4buZIHRpw6p1IGTDuW5nIHRo4buxYyB04bq/IGPhu6dhIGtow6FjaCBow6BuZy4NCg0KTmdvw6BpIHJhLCBuZ2hpw6puIGPhu6l1IGPFqW5nIGPDsyB0aOG7gyBt4bufIHLhu5luZyB4ZW0geMOpdCBjw6FjIHnhur91IHThu5EgbcO0aSB0csaw4budbmcgYsOqbiBuZ2/DoGkgbmjGsCB4dSBoxrDhu5tuZyB0aOG7iyB0csaw4budbmcsIOG6o25oIGjGsOG7n25nIHbEg24gaMOzYSBoYXkgY8OhYyBjaGnhur9uIGThu4tjaCBtYXJrZXRpbmcgxJHhu4MgxJHDoW5oIGdpw6EgdG/DoG4gZGnhu4duIGjGoW4gduG7gSBow6BuaCB2aSBtdWEgc+G6r20uDQoNCiMgKipOaGnhu4dtIHbhu6UgMyoqDQoNCiMjICoqQS4gxJDhu41jIHbDoCBDaHXhuqluIGLhu4sgdHLGsOG7m2MgYnXhu5VpIGjhu41jKioNCg0KYGBge3IsbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCmxpYnJhcnkodGlkeXZlcnNlKQ0KbGlicmFyeShEVCkNCmxpYnJhcnkoc2NhbGVzKQ0KbGlicmFyeShwc3ljaCkNCmxpYnJhcnkoa25pdHIpDQpsaWJyYXJ5KGthYmxlRXh0cmEpDQpsaWJyYXJ5KERlc2NUb29scykNCmxpYnJhcnkoZXBpdG9vbHMpDQpsaWJyYXJ5KEFFUikNCmBgYA0KDQojIyMgKioxLiDDlG4gbOG6oWkga2nhur9uIHRo4bupYyBUdeG6p24gMioqDQoNCmBgYHtyLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KZDwtIHJlYWQuY3N2KCJEOi9ISzJfUFRETERUX1RNVC9TdXBlcm1hcmtldCBUcmFuc2FjdGlvbnMuY3N2IiwgaGVhZGVyPVQpDQpjYXQ8LSBjKCJHZW5kZXIiLCAiTWFyaXRhbFN0YXR1cyIsICJIb21lb3duZXIiLCAiQW5udWFsSW5jb21lIiwgIkNpdHkiLCAiU3RhdGVvclByb3ZpbmNlIiwgIkNvdW50cnkiLCAiUHJvZHVjdEZhbWlseSIsICJQcm9kdWN0RGVwYXJ0bWVudCIsICJQcm9kdWN0Q2F0ZWdvcnkiKQ0KZF9jYXQ8LWRbLCBjYXRdDQpkYXRhdGFibGUoZF9jYXQsb3B0aW9ucyA9IGxpc3Qoc2Nyb2xsWCA9IFRSVUUpKQ0KYGBgDQoNCioqMS4xIELhuqNuZyB04bqnbiBz4buRIGNow6lvKioNCg0KKkLhuqNuZyB04bqnbiBzdeG6pXQgY2jDqW8qDQoNCmBgYHtyfQ0KZDIgPC0gdGFibGUoZF9jYXQkTWFyaXRhbFN0YXR1cyxkX2NhdCRIb21lb3duZXIpDQphZGRtYXJnaW5zKGQyKQ0KYGBgDQoqQuG6o25nIHThuqduIHN14bqldCBjaMOpbyB0aGVvIHThu7cgbOG7hyBow6BuZyoNCg0KYGBge3J9DQpwcm9wLnRhYmxlKGQyLCBtYXJnaW4gPSAxKQ0KYGBgDQoNCipOaOG6rW4geMOpdCoNCg0KLSBE4buxYSB2w6BvIGvhur90IHF14bqjIHRyw6puLCB0YSBuaOG6rW4gdGjhuqV5IHRyb25nIG5ow7NtIG5nxrDhu51pIMSRw6Mga+G6v3QgaMO0biAoTSkgY8OzIDE3MTkgbmfGsOG7nWkgKDI1LjA0JSkga2jDtG5nIHPhu58gaOG7r3UgbmjDoCB2w6AgNTE0NyBuZ8aw4budaSAoNzQuOTYlKSBz4bufIGjhu691IG5ow6AuIEPDsm4gbmjDs20gbmfGsOG7nWkgxJHhu5ljIHRow6JuIChTKSBjw7MgMzg5NiBuZ8aw4budaSAoNTQuMTYlKSBraMO0bmcgc+G7nyBo4buvdSBuaMOgIHbDoCAzMjk3IG5nxrDhu51pICg0NS44NCUpIHPhu58gaOG7r3UgbmjDoC4NCg0KLSBRdWEgxJHDsyB0YSBuaOG6rW4gdGjhuqV5IG3hu5FpIHF1YW4gaOG7hyB0w61jaCBj4buxYyBnaeG7r2Egdmnhu4djIGvhur90IGjDtG4gdsOgIHPhu58gaOG7r3UgbmjDoC4gTmfGsOG7nWkgxJHDoyBr4bq/dCBow7RuIGPDsyB4dSBoxrDhu5tuZyDhu5VuIMSR4buLbmggaMahbiB24buBIG3hurd0IGNo4buXIOG7nywgY8OzIHRo4buDIGRvIMSRaeG7gXUga2nhu4duIHTDoGkgY2jDrW5oIGhv4bq3YyDGsHUgdGnDqm4gxJHhuqd1IHTGsCBsw6J1IGTDoGkgaMahbiBzbyB24bubaSBuZ8aw4budaSDEkeG7mWMgdGjDom4uDQoNCi0gWHUgaMaw4bubbmcgY2h1bmcgbMOgIGvhur90IGjDtG4gdGjGsOG7nW5nIMSRaSBrw6htIHbhu5tpIGto4bqjIG7Eg25nIHPhu58gaOG7r3UgbmjDoCBjYW8gaMahbiwgcGjhuqNuIMOhbmggbeG7qWMgxJHhu5kg4buVbiDEkeG7i25oIHbDoCBjYW0ga+G6v3QgdMOgaSBjaMOtbmggbMOidSBkw6BpIGjGoW4gdHJvbmcgY3Xhu5ljIHPhu5FuZy4NCg0KKioxLjIgS2nhu4NtIMSR4buLbmggdGjhu5FuZyBrw6ogKEtp4buDbSDEkeG7i25oIENoaS1iw6xuaCBwaMawxqFuZykqKg0KDQrEkOG7gyDEkcOhbmggZ2nDoSB4ZW0gY8OzIG3hu5FpIGxpw6puIGjhu4cgY8OzIMO9IG5naMSpYSB0aOG7kW5nIGvDqiBnaeG7r2EgaGFpIGJp4bq/biBwaMOibiBsb+G6oWkgbMOgIE1hcml0YWxTdGF0dXMgdsOgIEhvbWVvd25lciBoYXkga2jDtG5nLCBz4bq9IHPhu60gZOG7pW5nIGtp4buDbSDEkeG7i25oIENoaS1iw6xuaCBwaMawxqFuZyAoQ2hpLXNxdWFyZSB0ZXN0KS4NCg0KYGBge3J9DQojIEtp4buDbSDEkeG7i25oDQpjaGlzcV9yZXN1bHQgPC0gY2hpc3EudGVzdChkMikNCg0KIyBJbiBr4bq/dCBxdeG6ow0KY2hpc3FfcmVzdWx0DQpgYGANCg0KR2nhuqMgdGh1eeG6v3Q6DQoNCiQkDQpcbGVmdFx7DQpcYmVnaW57YXJyYXl9e2xsfQ0KSF8wOiAmIFx0ZXh0e0Jp4bq/biBNYXJpdGFsU3RhdHVzIHbDoCBiaeG6v24gSG9tZW93bmVyIGtow7RuZyBjw7MgbeG7kWkgcXVhbiBo4buHLn0gIFxcXFwNCkhfMTogJiBcdGV4dHsgQmnhur9uIE1hcml0YWxTdGF0dXMgdsOgIGJp4bq/biBIb21lb3duZXIgY8OzIG3hu5FpIHF1YW4gaOG7hy59IFwNClxlbmR7YXJyYXl9DQpccmlnaHQuDQokJA0KDQpL4bq/dCBxdeG6oyBraeG7g20gxJHhu4tuaDogVuG7m2kgbeG7qWMgw70gbmdoxKlhIDAuMCB24bubaSBwLXZhbHVlID0gMi4yZS0xNiA8IDAuMDUsIGLDoWMgYuG7jyBnaeG6oyB0aHV54bq/dCAkSF8wJCB04bupYyBsw6AgY2jhuqVwIG5o4bqtbiBnaeG6oyB0aHV54bq/dCAkSF8xJC4gVuG6rXkgZ2nhu69hIGJp4bq/biBNYXJpdGFsU3RhdHVzIHbDoCBiaeG6v24gSG9tZW93bmVyIGPDsyB04buTbiB04bqhaSBt4buRaSBxdWFuIGjhu4cuDQoNCiAqKjEuMyBSZWxhdGl2ZSBSaXNrKioNCg0KYGBge3J9DQplMSA8LSB0YWJsZShkX2NhdCRIb21lb3duZXIsIGRfY2F0JE1hcml0YWxTdGF0dXMpDQphZGRtYXJnaW5zKGUxKQ0KUmVsUmlzayhlMSkNCmBgYA0KDQpgYGB7cn0NCnRhYmxlKGQkSG9tZW93bmVyLGQkTWFyaXRhbFN0YXR1cykNCm0gPC0gbWF0cml4KGMoMTcxOSw1MTQ3LDM4OTYsMzI5NyksbnJvdyA9IDIpDQpSZWxSaXNrKG0sIGNvbmYubGV2ZWwgPSAuOTUpDQpyaXNrcmF0aW8oZTEsIHJldiA9ICdiJykgI8SRxrBhIGNo4buvIHkgbMOqbiB0csOqbg0KYGBgDQoNClThu7cgc+G7kSBy4bunaSBybyAoUmVsYXRpdmUgUmlzaykgxJHGsOG7o2MgxrDhu5tjIHTDrW5oIGzDoCAwLjUwMjMsIHbhu5tpIGtob+G6o25nIHRpbiBj4bqteSA5NSUgdOG7qyAwLjQ4MTAgxJHhur9uIDAuNTI0MS4gxJBp4buBdSBuw6B5IGNobyB0aOG6pXkgbmjhu69uZyBuZ8aw4budaSBraMO0bmcgc+G7nyBo4buvdSBuaMOgIGPDsyBraOG6oyBuxINuZyDEkcOjIGvhur90IGjDtG4gdGjhuqVwIGjGoW4ga2hv4bqjbmcgNTAlIHNvIHbhu5tpIG5o4buvbmcgbmfGsOG7nWkgY8OzIHPhu58gaOG7r3UgbmjDoC4gS2hv4bqjbmcgdGluIGPhuq15IDk1JSBjaG8gYmnhur90IHLhurFuZywgduG7m2kgxJHhu5kgdGluIGPhuq15IDk1JSwgZ2nDoSB0cuG7iyB0aOG7sWMgY+G7p2EgdOG7tyBz4buRIHLhu6dpIHJvIG7hurFtIHRyb25nIGtob+G6o25nIHThu6sgMC40ODEwIMSR4bq/biAwLjUyNDEuIFbDrCBraG/huqNuZyBuw6B5IGtow7RuZyBjaOG7qWEgZ2nDoSB0cuG7iyAxLCBz4buxIGtow6FjIGJp4buHdCBnaeG7r2EgaGFpIG5ow7NtIMSRxrDhu6NjIHhlbSBsw6AgY8OzIMO9IG5naMSpYSB0aOG7kW5nIGvDqi4NCg0KIyMjICoqMi4gVMOsbSBoaeG7g3UgduG7gSBjw6FjIG7hu5lpIGR1bmcgY+G7p2EgY2jGsMahbmcgMioqDQoNCioqMi4xIEPhuqV1IHRyw7pjIHjDoWMgc3XhuqV0IGPhu6dhIGLhuqNuZyBuZ+G6q3Ugbmhpw6puKioNCg0KKipQaMOibiBwaOG7kWkgUG9pc3NvbioqDQoNClBow6JuIHBo4buRaSBQb2lzc29uIGzDoCBt4buZdCB4w6FjIHN14bqldCBy4budaSBy4bqhYyBsw70gdGh1eeG6v3QgdsOgIGPFqW5nIMSRxrDhu6NjIGfhu41pIGzDoCBow6BtIGto4buRaSBsxrDhu6NuZyB4w6FjIHN14bqldCBwaMOibiBwaOG7kWkgUG9pc3Nvbi4gTsOzIMSRxrDhu6NjIHPhu60gZOG7pW5nIMSR4buDIHTDrG0geMOhYyBzdeG6pXQgY+G7p2EgbeG7mXQgc+G7sSBraeG7h24gxJHhu5ljIGzhuq1wIHjhuqN5IHJhIHRyb25nIG3hu5l0IGtob+G6o25nIHRo4budaSBnaWFuIGPhu5EgxJHhu4tuaCB2w6AgY8OzIHThu7cgbOG7hyB0cnVuZyBiw6xuaCBraMO0bmcgxJHhu5VpLg0KDQpLw70gaGnhu4d1OiBY4oi8UG9pc3NvbijOuykNCg0KSMOgbSB4w6FjIHN14bqldDpYw6FjIHN14bqldCDEkeG7gyBjw7MgxJHDum5nIFwoIGsgXCkgc+G7sSBraeG7h24geOG6o3kgcmEgdHJvbmcgbeG7mXQga2hv4bqjbmcgdGjhu51pIGdpYW4gKGhv4bq3YyBraMO0bmcgZ2lhbikgbmjhuqV0IMSR4buLbmggxJHGsOG7o2MgY2hvIGLhu59pOg0KDQokJA0KUChYID0gaykgPSBcZnJhY3tcbGFtYmRhXmsgZV57LVxsYW1iZGF9fXtrIX0NCiQkDQoNClRyb25nIMSRw7M6DQoNCi0gXCggayBcKTogc+G7kSBs4bqnbiBz4buxIGtp4buHbiB44bqjeSByYSAoIFwoIGsgPSAwLCAxLCAyLCBcZG90cyBcKSApDQotIFwoIFxsYW1iZGEgXCk6IHPhu5EgbOG6p24geOG6o3kgcmEgdHJ1bmcgYsOsbmggY+G7p2Egc+G7sSBraeG7h24gKHRoYW0gc+G7kSBj4bunYSBwaMOibiBwaOG7kWkgUG9pc3NvbikNCi0gXCggZSBcKTogaOG6sW5nIHPhu5EgRXVsZXIsIGPGoSBz4buRIGPhu6dhIGxvZ2FyaXQgdOG7sSBuaGnDqm4sIFwoIGUgXGFwcHJveCAyLjcxODI4IFwpDQotIFwoIGshIFwpOiBnaWFpIHRo4burYSBj4bunYSBcKCBrIFwpLCB04bupYyBsw6AgXCggayEgPSBrIFx0aW1lcyAoay0xKSBcdGltZXMgXGRvdHMgXHRpbWVzIDEgXCksIHbDoCBcKCAwISA9IDEgXCkNCg0KxJDhurdjIMSRaeG7g20gcXVhbiB0cuG7jW5nIGPhu6dhIHBow6JuIHBo4buRaSBQb2lzc29uDQoNCi0gKipL4buzIHbhu41uZyAoTWVhbik6KioNCg0KICAkJA0KICBcbWF0aGJie0V9KFgpID0gXGxhbWJkYQ0KICAkJA0KDQotICoqUGjGsMahbmcgc2FpIChWYXJpYW5jZSk6KioNCg0KICAkJA0KICBcbWF0aHJte1Zhcn0oWCkgPSBcbGFtYmRhDQogICQkDQoNCi0gS2hpIFwoIFxsYW1iZGEgXCkgbmjhu48gKHbDrSBk4bulOiDOuyA8IDUpLCBwaMOibiBwaOG7kWkgYuG7iyBs4buHY2ggcGjhuqNpLCB04bqtcCB0cnVuZyBuaGnhu4F1IOG7nyBwaMOtYSB0csOhaS4NCi0gS2hpIFwoIFxsYW1iZGEgXCkgdMSDbmcgbMOqbiAoxJHhurdjIGJp4buHdCBcKCBcbGFtYmRhIFxnZXEgMjAgXCkpLCBwaMOibiBwaOG7kWkgUG9pc3NvbiBjw7MgdGjhu4MgxJHGsOG7o2MgeOG6pXAgeOG7iSB04buRdCBi4bqxbmcgcGjDom4gcGjhu5FpIENodeG6qW46DQoNCiAgJCQNCiAgWCBcc2ltIFxtYXRoY2Fse059KFxsYW1iZGEsIFxsYW1iZGEpDQogICQkDQoqKlBow6JuIHBo4buRaSBNdXVsdGlub21pYWwqKg0KDQpQaMOibiBwaOG7kWkgTXVsdGlub21pYWwgbMOgIG3hu5l0IG3hu58gcuG7mW5nIGPhu6dhIHBow6JuIHBo4buRaSBuaOG7iyB0aOG7qWMgKEJlcm5vdWxsaSkgY2hvIG5oaeG7gXUgaMahbiBoYWkga+G6v3QgcXXhuqMuIFBow6JuIHBo4buRaSBuw6B5IG3DtCB04bqjIHjDoWMgc3XhuqV0IGPhu6dhIGPDoWMga+G6v3QgcXXhuqMgxJHhur9tIMSRxrDhu6NjIHRyb25nICRuJCBs4bqnbiB0aOG7rSwgdHJvbmcgxJHDsyBt4buXaSBs4bqnbiB0aOG7rSBjw7MgdGjhu4MgcsahaSB2w6BvIG3hu5l0IHRyb25nICRrJCBsb+G6oWkgKGNhdGVnb3JpZXMpIHbhu5tpIHjDoWMgc3XhuqV0IHTGsMahbmcg4bupbmcuDQoNClBow6JuIHBo4buRaSDEkcaw4bujYyBrw70gaGnhu4d1IGzDoDoNCg0KJCQNClxtYXRoYmZ7WX0gXHNpbSBcdGV4dHtNdWx0aW5vbWlhbH0obiwgXG1hdGhiZntwfSkNCiQkDQoNClRyb25nIMSRw7M6DQoNCi0gJFxtYXRoYmZ7WX0gPSAoWV8xLCBZXzIsIFxkb3RzLCBZX2spJCBsw6AgdmVjdG9yIHPhu5EgxJHhur9tIGNobyB04burbmcgbG/huqFpLg0KDQotICRuJCBsw6AgdOG7lW5nIHPhu5EgbOG6p24gdGjhu60gKGhheSB04buVbmcgc+G7kSDEkeG6v20pOiAkbiA9IFxzdW1fe2k9MX1ee2t9IFlfaSQuDQoNCi0gJFxtYXRoYmZ7cH0gPSAocF8xLCBwXzIsIFxkb3RzLCBwX2spJCBsw6AgdmVjdG9yIHjDoWMgc3XhuqV0LCB24bubaSAkcF9pIFxnZSAwJCB2w6AgJFxzdW1fe2k9MX1ee2t9IHBfaSA9IDEkLg0KDQpIw6BtIHjDoWMgc3XhuqV0IMSRxrDhu6NjIHjDoWMgxJHhu4tuaCBuaMawIHNhdToNCg0KJCQNClAoWV8xID0geV8xLCBcZG90cywgWV9rID0geV9rKSA9IFxmcmFje24hfXt5XzEhIFxjZG90cyB5X2shfSBcY2RvdCBwXzFee3lfMX0gXGNkb3RzIHBfa157eV9rfQ0KJCQNCg0KDQoqKjIuMiBTbyBzw6FuaCAyIHThu7cgbOG7hyB0cm9uZyBi4bqjbmcgbmfhuqt1IG5oacOqbiAyeDIqKg0KDQogKlJpc2sgRGlmZmVyZW5jZSAtIFJEKg0KDQpSaXNrIERpZmZlcmVuY2UgbMOgIG3hu6ljIGNow6puaCBs4buHY2ggdHV54buHdCDEkeG7kWkgZ2nhu69hIHjDoWMgc3XhuqV0IHjhuqN5IHJhIHPhu7Ega2nhu4duIOG7nyBoYWkgbmjDs20uDQoNCioqQ8OhY2ggdMOtbmg6KioNCg0KJCQNClJEID0gXGZyYWN7YX17YSArIGJ9IC0gXGZyYWN7Y317YyArIGR9DQokJA0KDQoNCioqw50gbmdoxKlhOioqDQoNCi0gUkQgcGjhuqNuIMOhbmggc+G7sSBraMOhYyBiaeG7h3QgdHV54buHdCDEkeG7kWkgZ2nhu69hIG5ndXkgY8ahIHjhuqN5IHJhIHPhu7Ega2nhu4duIOG7nyBoYWkgbmjDs20uDQotIE7hur91Og0KDQogICAgLSBcKCBSRCA+IDAgXCk6IE5ow7NtIEEgY8OzIG5ndXkgY8ahICoqY2FvIGjGoW4qKiBuaMOzbSBCDQogIA0KICAgIC0gXCggUkQgPCAwIFwpOiBOaMOzbSBBIGPDsyBuZ3V5IGPGoSAqKnRo4bqlcCBoxqFuKiogbmjDs20gQg0KDQoNCiAqUmVsYXRpdmUgUmlzayAtIFJSKg0KDQpU4bu3IHPhu5EgcuG7p2kgcm8gKFJSKSBsw6AgdOG7tyBs4buHIGdp4buvYSB4w6FjIHN14bqldCB44bqjeSByYSBz4buxIGtp4buHbiDhu58gbmjDs20gcGjGoWkgbmhp4buFbSBzbyB24bubaSBuaMOzbSBraMO0bmcgcGjGoWkgbmhp4buFbS4gTsOzIHRo4buDIGhp4buHbiBt4bupYyB0xINuZyAoaG/hurdjIGdp4bqjbSkgdMawxqFuZyDEkeG7kWkgduG7gSBuZ3V5IGPGoS4NCg0KKipDw6FjaCB0w61uaDoqKg0KDQokJA0KUlIgPSBcZnJhY3thIC8gKGEgKyBiKX17YyAvIChjICsgZCl9DQokJA0KDQoqKsOdIG5naMSpYToqKg0KDQotIFwoIFJSID0gMSBcKTogS2jDtG5nIGPDsyBz4buxIGtow6FjIGJp4buHdCBuZ3V5IGPGoSBnaeG7r2EgaGFpIG5ow7NtDQoNCi0gXCggUlIgPiAxIFwpOiBOaMOzbSBBIGPDsyBuZ3V5IGPGoSBjYW8gaMahbg0KDQotIFwoIFJSIDwgMSBcKTogTmjDs20gQSBjw7Mgbmd1eSBjxqEgdGjhuqVwIGjGoW4NCg0KDQoqT2RkcyBSYXRpbyAtIE9SKg0KDQpPZGQgUmF0aW8gKFThu7cgc+G7kSBjaMOqbmgpIGzDoCBt4buZdCB0aMaw4bubYyDEkW8gxJHGsOG7o2Mgc+G7rSBk4bulbmcgcGjhu5UgYmnhur9uIHRyb25nIHRo4buRbmcga8OqLCDEkeG6t2MgYmnhu4d0IGzDoCB0cm9uZyBuZ2hpw6puIGPhu6l1IGThu4tjaCB04buFIGjhu41jLCDEkeG7gyDEkcOhbmggZ2nDoSBt4buRaSBsacOqbiBo4buHIGdp4buvYSBwaMahaSBuaGnhu4VtIHbDoCBr4bq/dCBxdeG6oy4gDQoNCioqQ8OhY2ggdMOtbmg6KioNCg0KJCQNCk9SID0gXGZyYWN7YS9ifXtjL2R9ID0gXGZyYWN7YSBcY2RvdCBkfXtiIFxjZG90IGN9DQokJA0KDQoqKsOdIG5naMSpYToqKg0KDQotIFwoIE9SID0gMSBcKTogS2jDtG5nIGPDsyBz4buxIGtow6FjIGJp4buHdCBvZGRzIGdp4buvYSBoYWkgbmjDs20NCg0KLSBcKCBPUiA+IDEgXCk6IE9kZHMgeOG6o3kgcmEgc+G7sSBraeG7h24g4bufIG5ow7NtIEEgY2FvIGjGoW4NCg0KLSBcKCBPUiA8IDEgXCk6IE9kZHMg4bufIG5ow7NtIEEgdGjhuqVwIGjGoW4NCg0KDQogKioyLjMgS2hv4bqjbmcgdGluIGPhuq15IGNobyBjw6FjIHRoYW0gc+G7kSDEkW8gbeG7kWkgbGnDqm4gaOG7hyoqDQoNCktoaSDGsOG7m2MgbMaw4bujbmcgT2RkcyBSYXRpbyAoT1IpIGRvIE9SIGtow7RuZyBwaMOibiBi4buRIGNodeG6qW4gdGEgdGjGsOG7nW5nIGJp4bq/biDEkeG7lWkgbG9nYXJpdCDEkeG7gyBsw6BtIHZp4buHYyB0csOqbiB0aGFuZyBsb2coT1IpLCBzYXUgxJHDsyB0w61uaCBraG/huqNuZyB0aW4gY+G6rXkgKENJKSB2w6AgbOG6pXkgbcWpIMSR4buDIGNodXnhu4NuIHbhu4EgdGhhbmcgT1IuDQoNCipTYWkgc+G7kSBjaHXhuqluIChTdGFuZGFyZCBFcnJvciAtIFNFKSoNCg0KQ8O0bmcgdGjhu6ljOg0KDQokJA0KU0UoXGxvZyhcaGF0e1x0aGV0YX0pKSA9IFxzcXJ0eyBcZnJhY3sxfXtuX3sxMX19ICsgXGZyYWN7MX17bl97MTJ9fSArIFxmcmFjezF9e25fezIxfX0gKyBcZnJhY3sxfXtuX3syMn19IH0NCiQkDQoNClRyb25nIMSRw7M6DQoNCi0gXCggbl97MTF9LCBuX3sxMn0sIG5fezIxfSwgbl97MjJ9IFwpIGzDoCBjw6FjIMO0IHRyb25nIGLhuqNuZyAyeDI6DQoNCnwgICAgICAgICAgICAgICB8IFPhu7Ega2nhu4duICgrKSB8IEtow7RuZyBz4buxIGtp4buHbiAo4oiSKSB8DQp8LS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLXwNCnwgKipOaMOzbSAxKiogICAgfCBcKCBuX3sxMX0gXCkgfCBcKCBuX3sxMn0gXCkgICAgICAgIHwNCnwgKipOaMOzbSAyKiogICAgfCBcKCBuX3syMX0gXCkgfCBcKCBuX3syMn0gXCkgICAgICAgIHwNCg0KDQoqS2hv4bqjbmcgdGluIGPhuq15IDk1JSBjaG8gbG9nKE9SKSoNCg0KJCQNClxsb2coXGhhdHtcdGhldGF9KSBccG0gel97MSAtIFxhbHBoYS8yfSBcY2RvdCBTRShcbG9nKFxoYXR7XHRoZXRhfSkpDQokJA0KDQpW4bubaSBcKCB6X3sxIC0gXGFscGhhLzJ9ID0gMS45NiBcKSBjaG8gbeG7qWMgdGluIGPhuq15IDk1JS4NCg0KDQoqS2hv4bqjbmcgdGluIGPhuq15IDk1JSBjaG8gT1IqDQoNCkNodXnhu4NuIHbhu4EgdGhhbmcgT1I6DQoNCiQkDQpDSV97T1J9ID0gXGxlZnRbIFxleHAgXGxlZnQoIFxsb2coXGhhdHtcdGhldGF9KSAtIDEuOTYgXGNkb3QgU0UgXHJpZ2h0KSxcIFxleHAgXGxlZnQoIFxsb2coXGhhdHtcdGhldGF9KSArIDEuOTYgXGNkb3QgU0UgXHJpZ2h0KSBccmlnaHRdDQokJA0KDQoqTmjhuq1uIHjDqXQqDQoNCi0gTuG6v3Uga2hv4bqjbmcgdGluIGPhuq15IGtow7RuZyBjaOG7qWEgMSwgT1IgY8OzIMO9IG5naMSpYSB0aOG7kW5nIGvDqi4NCg0KLSBO4bq/dSBraG/huqNuZyBDSSBjaOG7qWEgMSBsw6Aga2jDtG5nIMSR4bunIGLhurFuZyBjaOG7qW5nIHRo4buRbmcga8OqIMSR4buDIGvhur90IGx14bqtbiBraMOhYyBiaeG7h3QuDQoNCiAqKjIuNCBWw60gZOG7pSoqDQoNClRyb25nIHbDrSBk4bulIG7DoHksIGNow7puZyB0YSBz4butIGThu6VuZyBi4buZIGThu68gbGnhu4d1IENyZWRpdENhcmQgdGh14buZYyBnw7NpIEFFUiDEkeG7gyBwaMOibiB0w61jaCBt4buRaSBsacOqbiBo4buHIGdp4buvYSB0w6xuaCB0cuG6oW5nIHPhu58gaOG7r3UgbmjDoCAob3duZXIpIHbDoCBxdXnhur90IMSR4buLbmggY+G6pXAgdGjhursgdMOtbiBk4bulbmcgKGNhcmQpLiBE4buvIGxp4buHdSBuw6B5IGJhbyBn4buTbSB0aMO0bmcgdGluIHbhu4Egdmnhu4djIG3hu5l0IGPDoSBuaMOibiBjw7MgxJHGsOG7o2MgY2jhuqVwIG5o4bqtbiBj4bqlcCB0aOG6uyB0w61uIGThu6VuZyBoYXkga2jDtG5nLCBjw7luZyB24bubaSBjw6FjIMSR4bq3YyDEkWnhu4NtIGPDoSBuaMOibiBuaMawIGPDsyBz4bufIGjhu691IG5ow6AsIHRodSBuaOG6rXAsIHRyw6xuaCDEkeG7mSBo4buNYyB24bqlbiwgDQpDaMO6bmcgdGEgc+G6vSB04bqtcCB0cnVuZyB2w6BvIGhhaSBiaeG6v24gcGjDom4gbG/huqFpIG93bmVyIHbDoCBjYXJkLCB04burIMSRw7MgeMOieSBk4buxbmcgYuG6o25nIDLDlzIgdsOgIHTDrW5oIHThu7cgc+G7kSBjaMOqbmggT2RkcyBSYXRpbyAoT1IpIMSR4buDIMSRw6FuaCBnacOhIHhlbSBz4bufIGjhu691IG5ow6AgY8OzIOG6o25oIGjGsOG7n25nIMSR4bq/biBraOG6oyBuxINuZyDEkcaw4bujYyBj4bqlcCB0aOG6uyBoYXkga2jDtG5nLg0KDQoNCmBgYHtyfQ0KDQojIFThuqNpIGThu68gbGnhu4d1DQpkYXRhKCJDcmVkaXRDYXJkIikNCmgxPC0gQ3JlZGl0Q2FyZA0KYGBgDQoNCmBgYHtyfQ0KIyBUaGF5IMSR4buVaSBnacOhIHRy4buLIGPhu6dhIGJp4bq/biBgY2FyZGB2w6Agb3duZXINCmxpYnJhcnkoZHBseXIpDQpoMSRjYXJkIDwtIGRwbHlyOjpyZWNvZGUoaDEkY2FyZCwgInllcyIgPSAiY2hhcG5oYW4iLCAibm8iID0gInR1Y2hvaSIpDQpoMSRvd25lciA8LSAgZHBseXI6OnJlY29kZShoMSRvd25lciwgInllcyIgPSAiY29uaGEiLCAibm8iID0gImtob25nY29uaGEiKQ0KaDIgPC0gdGFibGUoaDEkY2FyZCxoMSRvd25lcikgI3ThuqFvIGLhuqNuZyBjaMOpbyDEkeG6v20gc+G7kSBs4bqnbiB4deG6pXQgaGnhu4duIGPhu6dhIHThu6tuZyBr4bq/dCBo4bujcCBnaeG7r2EgIChHZW5kZXIpIHbDoCAoUHJvZHVjdEZhbWlseSkuDQphZGRtYXJnaW5zKGgyKSNUaMOqbSB04buVbmcgaMOgbmcgdsOgIHThu5VuZyBj4buZdCB2w6BvIGLhuqNuZw0KYGBgDQoNCmBgYHtyfQ0KcHJvcC50YWJsZShoMiwgbWFyZ2luID0gMSkNCmBgYA0KDQpgYGB7cn0NCmxpYnJhcnkoZXBpdG9vbHMpDQpPZGRzUmF0aW8oaDIpDQpgYGANCmBgYHtyfQ0Kb2Rkc3JhdGlvKGgyKQ0KYGBgDQoNCkThu7FhIHbDoG8ga+G6v3QgcXXhuqMgdHLDqm4gdGEgdGjhuqV5IG5o4buvbmcgbmfGsOG7nWkgY8OzIG5ow6AgY8OzIHThu7cgbOG7hyDEkcaw4bujYyBjaOG6pXAgbmjhuq1uIHRo4bq7IHTDrW4gZOG7pW5nIGNhbyBoxqFuIDIuMTEgbOG6p24gc28gduG7m2kgbmjhu69uZyBuZ8aw4budaSBraMO0bmcgY8OzIG5ow6AuIEtob+G6o25nIHRpbiBj4bqteSA5NSUgbMOgICgxLjYwOyAyLjc5KSwga2jDtG5nIGNo4bupYSBnacOhIHRy4buLIDEgY2hvIHRo4bqleSBz4buxIGtow6FjIGJp4buHdCBsw6AgY8OzIMO9IG5naMSpYSB0aOG7kW5nIGvDqi4gR2nDoSB0cuG7iyBwIHLhuqV0IG5o4buPICg8IDAuMDA1KSwgY2hvIHRo4bqleSBjaMO6bmcgdGEgYsOhYyBi4buPIGdp4bqjIHRodXnhur90IGtow7RuZyBy4bqxbmcga2jhuqMgbsSDbmcgxJHGsOG7o2MgY+G6pXAgdGjhursgbMOgIG5oxrAgbmhhdSBnaeG7r2EgbmfGsOG7nWkgY8OzIG5ow6AgdsOgIGtow7RuZyBjw7MgbmjDoC4NCg0KIyMjICoqMy4gU3V5IG5naMSpIHbhu4EgYuG7mSBk4buvIGxp4buHdSoqDQoNCmBgYHtyfQ0KZDUgPC0gdGFibGUoZF9jYXQkR2VuZGVyLGRfY2F0JEhvbWVvd25lcikgI3ThuqFvIGLhuqNuZyBjaMOpbyDEkeG6v20gc+G7kSBs4bqnbiB4deG6pXQgaGnhu4duIGPhu6dhIHThu6tuZyBr4bq/dCBo4bujcCBnaeG7r2EgIChHZW5kZXIpIHbDoCAoUHJvZHVjdEZhbWlseSkuDQphZGRtYXJnaW5zKGQ1KSAjVGjDqm0gdOG7lW5nIGjDoG5nIHbDoCB04buVbmcgY+G7mXQgdsOgbyBi4bqjbmcNCmBgYA0KDQpgYGB7cn0NCnByb3AudGFibGUoZDUsIG1hcmdpbiA9IDEpDQpgYGANCg0KYGBge3J9DQpPZGRzUmF0aW8oZDUsY29uZi5sZXZlbCA9IC45NSkNCmBgYA0KDQpgYGB7cn0NCm9kZHNyYXRpbyhkNSkNCmBgYA0KDQoqKk5o4bqtbiB4w6l0KioNCg0KTmFtIGdp4bubaSBjw7Mgb2RkcyByYXRpbyBsw6AgMC45NTY0LCB24bubaSBraG/huqNuZyB0aW4gY+G6rXkgOTUlIHThu6sgMC44OTM5IMSR4bq/biAxLjAyMzIuDQrEkGnhu4F1IG7DoHkgY8OzIG5naMSpYSBsw6AgbmFtIGdp4bubaSBjw7Mgb2RkcyBz4bufIGjhu691IG5ow6AgdGjhuqVwIGjGoW4gbeG7mXQgY2jDunQgc28gduG7m2kgbuG7ryBnaeG7m2ksIHThu6ljIGzDoCB04bu3IGzhu4cgc+G7nyBo4buvdSBuaMOgIOG7nyBuYW0gY8OzIHh1IGjGsOG7m25nIHRo4bqlcCBoxqFuIHNvIHbhu5tpIG7hu68sIG5oxrBuZyBz4buxIGtow6FjIGJp4buHdCBsw6AgcuG6pXQgbmjhu48uDQoNClR1eSBuaGnDqm4sIGtob+G6o25nIHRpbiBj4bqteSA5NSUgY8OzIGNo4bupYSBnacOhIHRy4buLIDEsIGNobyB0aOG6pXkgcuG6sW5nIGtow6FjIGJp4buHdCBuw6B5IGtow7RuZyBjw7Mgw70gbmdoxKlhIHRo4buRbmcga8OqLg0KTmdvw6BpIHJhLCBjw6FjIGdpw6EgdHLhu4sgcCB0xrDGoW5nIOG7qW5nIChtaWRwLmV4YWN0ID0gMC4xOTUyLCBmaXNoZXIuZXhhY3QgPSAwLjE5NjUsIGNoaS5zcXVhcmUgPSAwLjE5NTEpIMSR4buBdSBs4bubbiBoxqFuIDAuMDUsIGNobyB0aOG6pXkga2jDtG5nIGPDsyBi4bqxbmcgY2jhu6luZyB0aOG7kW5nIGvDqiDEkeG7pyBt4bqhbmggxJHhu4MgYsOhYyBi4buPIGdp4bqjIHRodXnhur90IGtow7RuZy4NCg0KVmnhu4djIGzDoCBO4buvIChzbyB24bubaSBOYW0pIGtow7RuZyBsw6BtIHTEg25nIGhheSBnaeG6o20gxJHDoW5nIGvhu4Mgb2RkcyBz4bufIGjhu691IG5ow6AuDQpN4bq3YyBkw7kgbuG7ryBnaeG7m2kgY8OzIG9kZHMgc+G7nyBo4buvdSBuaMOgIGNhbyBoxqFuIG3hu5l0IGNow7p0LCBuaMawbmcga2jDoWMgYmnhu4d0IG7DoHkga2jDtG5nIGPDsyDDvSBuZ2jEqWEgdGjhu5FuZyBrw6osIG7Dqm4gY2jDum5nIHRhIGtow7RuZyB0aOG7gyBr4bq/dCBsdeG6rW4gY8OzIG3hu5FpIGxpw6puIGjhu4cgcsO1IHLDoG5nIGdp4buvYSBnaeG7m2kgdMOtbmggdsOgIGto4bqjIG7Eg25nIHPhu58gaOG7r3UgbmjDoCB0cm9uZyBk4buvIGxp4buHdSBuw6B5Lg0KDQojIyAqKkIuIEhv4bqhdCDEkeG7mW5nIHRyw6puIGzhu5twKioNCg0KIyMjICoqMS4gw5RuIHThuq1wIHbDoCB0aOG6o28gbHXhuq1uIHBow6JuIHTDrWNoIGNow6lvIHbDoCBSUioqDQoNCktoaSBuaMOsbiB2w6BvIGLhuqNuZyBjaMOpbyB2w6AgY2jhu4kgc+G7kSBSZWxhdGl2ZSBSaXNrIChSUiksIGNow7puZyB0YSBjw7MgdGjhu4MgY8OzIGPDoWkgbmjDrG4gxJHhuqd1IHRpw6puIHbhu4EgbeG7kWkgbGnDqm4gaOG7hyBnaeG7r2EgaGFpIG5ow7NtIGJp4bq/biBwaMOibiBsb+G6oWkuIFJSIGNobyBiaeG6v3Qga2jhuqMgbsSDbmcgbeG7mXQgbmjDs20gY8OzIHh1IGjGsOG7m25nIHjhuqN5IHJhIHPhu7Ega2nhu4duIG5oaeG7gXUgaGF5IMOtdCBoxqFuIG5ow7NtIGPDsm4gbOG6oWksIG7Dqm4gdGjGsOG7nW5nIMSRxrDhu6NjIGTDuW5nIMSR4buDIHNvIHPDoW5oIG3hu6ljIMSR4buZICJuZ3V5IGPGoSIgZ2nhu69hIGhhaSBuaMOzbS4NCg0KVHV5IG5oacOqbiwgdmnhu4djIHPhu60gZOG7pW5nIGLhuqNuZyBjaMOpbyB2w6AgUlIgY8WpbmcgY8OzIG5o4buvbmcgbeG6t3QgaOG6oW4gY2jhur8uIFRyxrDhu5tjIGjhur90LCBi4bqjbmcgY2jDqW8gY2jhu4kgY2hvIHRo4bqleSBz4buRIGxp4buHdSDEkeG6v20gdsOgIHThu7cgbOG7hyDEkcahbiBnaeG6o24g4oCUIG7DsyBraMO0bmcgY3VuZyBj4bqlcCB0aMO0bmcgdGluIHbhu4EgxJHhu5kgY2jhuq9jIGNo4bqvbiBj4bunYSBr4bq/dCBxdeG6oyBoYXkgeGVtIHjDqXQgxJHhur9uIOG6o25oIGjGsOG7n25nIGPhu6dhIGPDoWMgeeG6v3UgdOG7kSBraMOhYy4gUlIgdGjDrCBjaOG7iSB0aOG7sWMgc+G7sSBwaMO5IGjhu6NwIG7hur91IGThu68gbGnhu4d1IMSRxrDhu6NjIHRodSB0aOG6rXAgdOG7qyBuZ2hpw6puIGPhu6l1IGThu41jLCB04bupYyBsw6AgdGhlbyBkw7VpIGPDoWMgbmjDs20gdGhlbyB0aOG7nWkgZ2lhbi4gVHJvbmcgdHLGsOG7nW5nIGjhu6NwIGThu68gbGnhu4d1IMSRxrDhu6NjIGzhuqV5IHRoZW8gY8OhY2ggbmfhuqt1IG5oacOqbiBoYXkgxJFp4buBdSB0cmEgY+G6r3QgbmdhbmcsIFJSIMSRw7RpIGtoaSBjw7MgdGjhu4MgZ8OieSBoaeG7g3UgbmjhuqdtLg0KDQpOZ2/DoGkgcmEsIG7hur91IHPhu7Ega2nhu4duIMSRYW5nIHjDqXQgbMOgIGhp4bq/bSwgUlIgdsOgIE9kZHMgUmF0aW8gKE9SKSBz4bq9IGtow6EgZ2nhu5FuZyBuaGF1LiBOaMawbmcgbuG6v3Uga2jDtG5nIGhp4bq/bSwgc+G7sSBraMOhYyBiaeG7h3QgZ2nhu69hIGhhaSBjaOG7iSBz4buRIG7DoHkgY8OzIHRo4buDIGzhu5tuLCBk4bqrbiDEkeG6v24ga+G6v3QgbHXhuq1uIGtow7RuZyBjaMOtbmggeMOhYyBu4bq/dSBraMO0bmcgY2jDuiDDvS4gxJDhurdjIGJp4buHdCwgY+G6oyBoYWkgY8OhY2ggbMOgbSBuw6B5IGNoxrBhIGtp4buDbSBzb8OhdCDEkcaw4bujYyBuaOG7r25nIHnhur91IHThu5Ega2jDoWMgY8OzIHRo4buDIOG6o25oIGjGsOG7n25nIMSR4bq/biBt4buRaSBsacOqbiBo4buHIGdp4buvYSBoYWkgYmnhur9uIGNow61uaCwgbsOqbiBu4bq/dSBtdeG7kW4gcGjDom4gdMOtY2ggc8OidSB2w6AgY2jDrW5oIHjDoWMgaMahbiwgY2jDum5nIHRhIGPhuqduIGTDuW5nIMSR4bq/biBjw6FjIHBoxrDGoW5nIHBow6FwIGjhu5NpIHF1eSBuaMawIGjhu5NpIHF1eSBsb2dpc3RpYy4NCg0KIyMjICoqMi4gxJDDoG8gc8OidSB24buBIFN1eSBkaeG7hW4gdHJvbmcgQuG6o25nIE5n4bqrdSBuaGnDqm4gMngyKioNCg0KS2hpIHThuqFvIGLhuqNuZyBuZ+G6q3Ugbmhpw6puICh2w60gZOG7pTogYuG6o25nIDJ4MiksIHRo4buxYyBjaOG6pXQgbMOgIGNow7puZyB0YSDEkWFuZyBtw7QgdOG6oyBwaMOibiBi4buRIHjDoWMgc3XhuqV0IGPhu6dhIGhhaSBiaeG6v24gcGjDom4gbG/huqFpLiBN4buXaSDDtCB0cm9uZyBi4bqjbmcgdGjhu4MgaGnhu4duIHjDoWMgc3XhuqV0IGNodW5nIChqb2ludCBwcm9iYWJpbGl0eSkgY+G7p2EgaGFpIGJp4bq/biBjw7luZyB44bqjeSByYS4gQ2jhurNuZyBo4bqhbiwgdHJvbmcgYuG6o25nIDJ4MiB24bubaSBiaeG6v24gQSAoY8OzL2tow7RuZykgdsOgIGJp4bq/biBCIChuYW0vbuG7ryksIHRow6wgw7Qg4bufIGjDoG5nIOKAnGPDs+KAnSB2w6AgY+G7mXQg4oCcbmFt4oCdIGNobyBiaeG6v3QgeMOhYyBzdeG6pXQgKGhv4bq3YyB04bqnbiBzdeG6pXQgcXVhbiBzw6F0IMSRxrDhu6NjKSBj4bunYSBuaOG7r25nIG5nxrDhu51pIHbhu6thIGPDsyDEkeG6t2MgxJFp4buDbSBBLCB24burYSBsw6AgbmFtLg0KDQoqKk3hu6VjIHRpw6p1OioqDQoNCi0gSGnhu4N1IHLhurFuZyBuaOG7r25nIGNvbiBz4buRIHRyb25nIGLhuqNuZyBraMO0bmcgY2jhu4kgbMOgIMSR4bq/bSDEkcahbiB0aHXhuqduLCBtw6AgY8OzIHRo4buDIHhlbSBuaMawIGvhur90IHF14bqjIGPhu6dhIG3hu5l0IHF1w6EgdHLDrG5oIG5n4bqrdSBuaGnDqm4gY8OzIHF1eSBsdeG6rXQgeMOhYyBzdeG6pXQuIEThu7FhIHbDoG8gxJHDsywgY2jDum5nIHRhIGPDsyB0aOG7gzoNCg0KLSBUw61uaCBjw6FjIHjDoWMgc3XhuqV0IGJpw6puICh4w6FjIHN14bqldCB44bqjeSByYSBj4bunYSB04burbmcgYmnhur9uIHJpw6puZyBs4bq7KSwNCg0KLSBUw61uaCB4w6FjIHN14bqldCBjw7MgxJFp4buBdSBraeG7h24gKHjDoWMgc3XhuqV0IHjhuqN5IHJhIGPhu6dhIG3hu5l0IGJp4bq/biBraGkgYmnhur90IGJp4bq/biBjw7JuIGzhuqFpKSwNCg0KLSBWw6AgdOG7qyDEkcOzIHBow6F0IHRyaeG7g24gY8OhYyBjaOG7iSBz4buRIG5oxrAgVOG7tyBz4buRIHLhu6dpIHJvIChSZWxhdGl2ZSBSaXNrKSBoYXkgVOG7tyBz4buRIGNow6puaCAoT2RkcyBSYXRpbykuDQoNCiMjIyAgKiozLiBUaOG7sWMgaMOgbmggdHLDqm4gUioqDQoNCkNo4buNbiBt4buZdCBj4bq3cCBNYXJpdGFsU3RhdHVzIHbDoCBIb21lb3duZXIgYmnhur9uIG5o4buLIHBow6JuIGtow6FjIHThu6sgYuG7mSBk4buvIGxp4buHdSBTdXBlcm1hcmtldCBUcmFuc2FjdGlvbnMNCg0KYGBge3J9DQpyMSA8LSB0YWJsZShkX2NhdCRNYXJpdGFsU3RhdHVzLGRfY2F0JEhvbWVvd25lcikNCnIxDQpgYGANCg0KDQpgYGB7cn0NCnByb3BfdGFibGUgPC0gcHJvcC50YWJsZShyMSwgbWFyZ2luID0gMSkNCnByb3BfdGFibGUNCmBgYA0KTmjhuq1uIHjDqXQ6IEThu7FhIHbDoG8ga+G6v3QgcXXhuqMgdHLDqm4sIHRhIG5o4bqtbiB0aOG6pXkgdHJvbmcgbmjDs20gbmfGsOG7nWkgxJHDoyBr4bq/dCBow7RuIChNKSBjw7MgMTcxOSBuZ8aw4budaSAoMjUuMDQlKSBraMO0bmcgc+G7nyBo4buvdSBuaMOgIHbDoCA1MTQ3IG5nxrDhu51pICg3NC45NiUpIHPhu58gaOG7r3UgbmjDoC4gQ8OybiBuaMOzbSBuZ8aw4budaSDEkeG7mWMgdGjDom4gKFMpIGPDsyAzODk2IG5nxrDhu51pICg1NC4xNiUpIGtow7RuZyBz4bufIGjhu691IG5ow6AgdsOgIDMyOTcgbmfGsOG7nWkgKDQ1Ljg0JSkgc+G7nyBo4buvdSBuaMOgLg0KDQpgYGB7cn0NClJEPC0gcHJvcF90YWJsZVsxLCAiWSJdIC0gcHJvcF90YWJsZVsyLCAiTiJdDQpSRA0KYGBgDQpU4bu3IGzhu4cgbmjhu69uZyBuZ8aw4budaSDEkcOjIGvhur90IGjDtG4gKE0pIHPhu58gaOG7r3UgbmjDoCBsw6AgY2FvIGjGoW4gc28gduG7m2kgdOG7tyBs4buHIG5nxrDhu51pIMSR4buZYyB0aMOibiAoUykga2jDtG5nIHPhu58gaOG7r3UgbmjDoCwgduG7m2kgY2jDqm5oIGzhu4djaCBraG/huqNuZyAyMC44JS4NCg0KYGBge3J9DQpSUiA8LSByaXNrcmF0aW8ocjEpDQpSUg0KYGBgDQpOaOG6rW4geMOpdDogS+G6v3QgcXXhuqMgcGjDom4gdMOtY2ggUmVsYXRpdmUgUmlzayAoUlIpIGNobyB0aOG6pXkgdOG7tyBs4buHIG5nxrDhu51pIMSR4buZYyB0aMOibiBz4bufIGjhu691IG5ow6Aga2hv4bqjbmcgNjEuMSUgc28gduG7m2kgbmfGsOG7nWkgxJHDoyBr4bq/dCBow7RuIGF2ZiBz4bufIGjhu691IG5haGYsIHbhu5tpIGtob+G6o25nIHRpbiBj4bqteSA5NSUgdOG7qyA1OS40JSDEkeG6v24gNjIuOSUuIEtob+G6o25nIHRpbiBj4bqteSBraMO0bmcgY2jhu6lhIGdpw6EgdHLhu4sgMSwgY2hvIHRo4bqleSBz4buxIGtow6FjIGJp4buHdCBuw6B5IGPDsyDDvSBuZ2jEqWEgdGjhu5FuZyBrw6ogcuG6pXQgcsO1IHLDoG5nLiBHacOhIHRy4buLIHAgcuG6pXQgbmjhu48gKGfhuqduIGLhurFuZyAwKSBraOG6s25nIMSR4buLbmggbeG7kWkgbGnDqm4gaOG7hyBnaeG7r2EgdMOsbmggdHLhuqFuZyBow7RuIG5ow6JuIHbDoCBraOG6oyBuxINuZyBz4bufIGjhu691IG5ow6Aga2jDtG5nIHBo4bqjaSBkbyBuZ+G6q3Ugbmhpw6puLiDEkGnhu4F1IG7DoHkgY2hvIHRo4bqleSBuZ8aw4budaSDEkcOjIGvhur90IGjDtG4gY8OzIGto4bqjIG7Eg25nIHPhu58gaOG7r3UgbmjDoCBjYW8gaMahbiDEkcOhbmcga+G7gyBzbyB24bubaSBuZ8aw4budaSDEkeG7mWMgdGjDom4gdHJvbmcgZOG7ryBsaeG7h3Uga2jhuqNvIHPDoXQuDQoNCmBgYHtyfQ0Kb3IgPC0gb2Rkc3JhdGlvKHIxKQ0Kb3INCmBgYA0KDQpOaOG6rW4geMOpdDogS+G6v3QgcXXhuqMgcGjDom4gdMOtY2ggT2RkcyBSYXRpbyAoT1IpIGNobyB0aOG6pXkgbmjDs20gbmfGsOG7nWkgxJHhu5ljIHRow6JuIGPDsyB04bu3IHPhu5EgY2jDqm5oIGzhu4djaCBvZGRzIHPhu58gaOG7r3UgbmjDoCBjaOG7iSBi4bqxbmcga2hv4bqjbmcgMC4yOCBs4bqnbiBzbyB24bubaSBuaMOzbSBuZ8aw4budaSDEkcOjIGvhur90IGjDtG4sIHbhu5tpIGtob+G6o25nIHRpbiBj4bqteSA5NSUgdOG7qyAwLjI2IMSR4bq/biAwLjMwLiBLaG/huqNuZyB0aW4gY+G6rXkgbsOgeSBraMO0bmcgYmFvIGfhu5NtIGdpw6EgdHLhu4sgMSwgY2jhu6luZyB04buPIHPhu7Ega2jDoWMgYmnhu4d0IGzDoCBjw7Mgw70gbmdoxKlhIHRo4buRbmcga8OqIHLhuqV0IG3huqFuaC4gR2nDoSB0cuG7iyBwIGfhuqduIGLhurFuZyAwIGPFqW5nIGNobyB0aOG6pXkgbeG7kWkgbGnDqm4gaOG7hyBuw6B5IGtow7RuZyBwaOG6o2kgZG8gbmfhuqt1IG5oacOqbi4gxJBp4buBdSBuw6B5IMSR4buTbmcgbmdoxKlhIHbhu5tpIHZp4buHYyBuZ8aw4budaSDEkcOjIGvhur90IGjDtG4gY8OzIG9kZHMgc+G7nyBo4buvdSBuaMOgIGNhbyBoxqFuIMSRw6FuZyBr4buDIHNvIHbhu5tpIG5nxrDhu51pIMSR4buZYyB0aMOibiwgcGjhuqNuIMOhbmggcsO1IHPhu7Ega2jDoWMgYmnhu4d0IHbhu4Ega2jhuqMgbsSDbmcgc+G7nyBo4buvdSBuaMOgIGdp4buvYSBoYWkgbmjDs20uDQoNCg0K