library(DT)
library(dplyr)
## 
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
library(ggplot2)
## Warning: package 'ggplot2' was built under R version 4.3.3
library(stats)
library(psych)
## Warning: package 'psych' was built under R version 4.3.3
## 
## Attaching package: 'psych'
## The following objects are masked from 'package:ggplot2':
## 
##     %+%, alpha

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

1.1 Đọc dữ liệu

Bộ dữ liệu giao dịch siêu thị gồm 14059 quan sát và 10 biến định tính, cung cấp thông tin chi tiết về giao dịch (ngày mua, sản phẩm) và nhân khẩu học khách hàng (giới tính, thu nhập, địa lý). Đây là nguồn dữ liệu lớn, đa dạng cho phân tích hành vi khách hàng và sản phẩm.

d <- read.csv('F:/R/data1/Supermarket Transactions.csv',header=T)

# Lọc dữ liệu (chỉ giữ các biến định tính)
d1 <- subset(d, select=-c(UnitsSold,Revenue,Children,CustomerID))

# Hiển thị cấu trúc dữ liệu
str(d1)
## 'data.frame':    14059 obs. of  12 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" ...
##  $ Gender           : chr  "F" "M" "F" "M" ...
##  $ MaritalStatus    : chr  "S" "M" "M" "M" ...
##  $ Homeowner        : chr  "Y" "Y" "N" "Y" ...
##  $ 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" ...

Qua việc xem xét kiểu dữ liệu của từng biến, có thể thấy rằng bộ dữ liệu này cần một bước tiền xử lý đáng kể để các biến được gán kiểu dữ liệu phù hợp với nội dung và mục đích phân tích.

Cụ thể, các biến X và CustomerID hiện đang ở kiểu integer (số nguyên) và đây là kiểu dữ liệu phù hợp cho các biến chỉ mục hoặc định danh.

Tuy nhiên, phần lớn các biến còn lại đang ở kiểu character (chuỗi ký tự) nhưng lại đại diện cho thông tin định tính hoặc ngày tháng, cần được chuyển đổi sang các kiểu phù hợp hơn.


  • Quan sát dữ liệu
# Hiển thị 10 dòng đầu dữ liệu
print("10 dòng đầu của bộ dữ liệu")
## [1] "10 dòng đầu của bộ dữ liệu"
z <- head(d1,10)
datatable(z)
# Hiển thị 10 dòng cuối dữ liệu
print("10 dòng cuối của bộ dữ liệu")
## [1] "10 dòng cuối của bộ dữ liệu"
z1 <- tail(d1,10)
datatable(z1)

  • Kiểm tra và xử lý dữ liệu thiếu
# Kiểm tra bộ dữ liệu có giá trị thiếu (NA) hay không.
print("Kiểm tra bộ dữ liệu có các giá trị thiếu hay không:")
## [1] "Kiểm tra bộ dữ liệu có các giá trị thiếu hay không:"
z2 <- is.na(d1)
datatable(z2)
## Warning in instance$preRenderHook(instance): It seems your data is too big for
## client-side DataTables. You may consider server-side processing:
## https://rstudio.github.io/DT/server.html
# Đếm tổng số lượng giá trị thiếu (NA)
print("Tổng số lượng các giá trị thiếu:")
## [1] "Tổng số lượng các giá trị thiếu:"
sum(is.na(d1))
## [1] 0
# Tìm ra các vị trí của các giá trị thiếu (NA)
print("Vị trị của các giá trị thiếu:")
## [1] "Vị trị của các giá trị thiếu:"
which(is.na(d1))
## integer(0)

Kết quả cho thấy rằng bộ dữ liệu không chứa bất kỳ giá trị thiếu (NA) nào.

  • Chuyển đổi các biến cần thiết sang kiểu factor

Ở phần đọc dữ liệu, khi thực hiện hàm str() kết quả thu được cho ta thấy hầu hết các biến định tính đang ở kiểu dữ liệu character (chuỗi ký tự) nhưng lại đại diện cho thông tin định tính, cho thấy được các biến cần được chuyển đổi sang kiểu dữ liệu phù hợp hơn như factor.

# Lưu danh sách các biến cần chuyển đổi vào một vector riêng
z3 <- c("Gender", "MaritalStatus", "Homeowner","AnnualIncome", "City", "StateorProvince", "Country", "ProductFamily", "ProductDepartment", "ProductCategory")

# Chuyển đổi kiểu dữ liệu
d1 <- d1 %>% mutate(across(all_of(z3), as.factor))
 # toán tử %>% : truyền d1 vào hàm mutate
 # mutate(): thay đổi biến hiện có bằng cách áp dụng một hàm và kết quả đè lên chính cột đó.
 # across(): dùng để áp dụng hàm as.factor cho nhiều cột.
 #all_of(): chỉ định các cột bằng tên được lưu trữ trong vector.

# Hiển thị cấu trúc dữ liệu
print("Cấu trúc dữ liệu:")
## [1] "Cấu trúc dữ liệu:"
str(d1)
## 'data.frame':    14059 obs. of  12 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" ...
##  $ Gender           : Factor w/ 2 levels "F","M": 1 2 1 2 1 1 2 1 2 2 ...
##  $ MaritalStatus    : Factor w/ 2 levels "M","S": 2 1 1 1 2 1 2 1 1 2 ...
##  $ Homeowner        : Factor w/ 2 levels "N","Y": 2 2 1 2 2 2 2 2 2 1 ...
##  $ AnnualIncome     : Factor w/ 8 levels "$10K - $30K",..: 5 7 6 5 3 1 5 4 1 6 ...
##  $ City             : Factor w/ 23 levels "Acapulco","Bellingham",..: 8 8 4 12 3 3 13 23 2 15 ...
##  $ StateorProvince  : Factor w/ 10 levels "BC","CA","DF",..: 2 2 8 6 2 2 6 8 8 2 ...
##  $ Country          : Factor w/ 3 levels "Canada","Mexico",..: 3 3 3 3 3 3 3 3 3 3 ...
##  $ ProductFamily    : Factor w/ 3 levels "Drink","Food",..: 2 2 2 2 1 2 2 2 3 3 ...
##  $ ProductDepartment: Factor w/ 22 levels "Alcoholic Beverages",..: 20 18 20 21 4 11 13 6 15 14 ...
##  $ ProductCategory  : Factor w/ 45 levels "Baking Goods",..: 42 45 42 7 15 41 5 13 16 35 ...

Sau khi chuyển đổi từ character sang factor, cấu trúc dữ liệu đã được cải thiện đáng kể. Hầu hết các biến định tính đã đúng kiểu, tối ưu bộ nhớ và sẵn sàng cho phân tích.

2 Phần 2: Phân tích Mô tả Một biến Định tính (Univaruate Descriptive Analysis)

2.1 Biến Homeowner

  • Bảng tần số:
table(d1$Homeowner)
## 
##    N    Y 
## 5615 8444
  • Bảng tần suất:
f <- table(d1$Homeowner)/sum(nrow(d1))
print(f)
## 
##         N         Y 
## 0.3993883 0.6006117

Vậy trong bộ dữ liệu này có 39.9388292% không sở hữu nhà và 60.0611708% có sở hữu nhà.

  • Biểu đồ:
pie(f,
    labels = paste(names(f), round(f, 2), "%"),
    main = "Biểu đồ tròn: Tỷ lệ Homeowne") 

# * pie(): hàm vẽ biểu đồ tròn thể hiện tỷ lệ của các thành phần so với tổng thể  
# f: vector muốn thể hiện dưới dạng biểu đồ.   
# labels: chỉ định các nhãn được hiển thị.   
# paste (): hàm ghép các chuỗi ký tự lại với nhau.   
# names(f): trả về tên của các thành phần trong f.   
# round(f): làm tròn các giá trị trong vector f đến một chữ số thập phân nhất định. round(f,2): làm tròn các tỷ lệ trong f đến 2 chữ số thập phân.   
# main: tên của biểu đồ.

Dựa trên phân tích biến “Homeowner”, chúng ta có thể rút ra một số nhận xét quan trọng về đặc điểm của bộ dữ liệu. Biến này phân loại các cá nhân dựa trên tình trạng sở hữu nhà, với hai nhóm chính là “N” (không sở hữu nhà) và “Y” (có sở hữu nhà).

Quan sát từ bảng tần số, có 5615 cá nhân thuộc nhóm “N” và 8444 cá nhân thuộc nhóm “Y”. Khi chuyển sang tỷ lệ, bảng tần suất cho thấy nhóm “N” chiếm khoảng 39.94% tổng số quan sát, trong khi nhóm “Y” chiếm phần lớn hơn với khoảng 60.06%. Biểu đồ tròn “Tỷ lệ Homeowne” cũng minh họa rõ ràng tỷ lệ này với 0.4% (hoặc 40%) cho “N” và 0.6% (hoặc 60%) cho “Y”, xác nhận sự phân bổ dữ liệu.

Rõ ràng, hạng mục “Y” (có sở hữu nhà) chiếm ưu thế đáng kể trong bộ dữ liệu này. Có một sự chênh lệch lớn giữa hai hạng mục, khi số lượng và tỷ lệ người sở hữu nhà cao hơn rõ rệt so với người không sở hữu nhà. Điều này cho thấy rằng phần lớn các cá nhân được ghi nhận trong bộ dữ liệu này là những người đã có tài sản nhà ở.


2.2 Biến Gender

  • Bảng tần số:
table(d1$Gender)
## 
##    F    M 
## 7170 6889
  • Bảng tần suất:
a <- table(d1$Gender)/sum(nrow(d1))
print(a)
## 
##         F         M 
## 0.5099936 0.4900064

Vậy trong bộ dữ liệu này có 50.9993598% nữ và 49.0006402% nam.

  • Biểu đồ:
pie(a,
    labels = paste(names(a), round(a, 2), "%"),
    main = "Biểu đồ tròn: Tỷ lệ Gender") 

Dựa trên phân tích biến “Gender”, chúng ta có thể nhận xét về phân bổ giới tính trong bộ dữ liệu. Biến này phân loại các cá nhân thành hai nhóm chính là “F” (Nữ) và “M” (Nam).

Từ bảng tần số, có 7170 cá nhân là nữ và 6889 cá nhân là nam. Khi chuyển sang tỷ lệ, bảng tần suất cho thấy nữ giới (F) chiếm khoảng 51.00% tổng số quan sát, trong khi nam giới (M) chiếm khoảng 49.00%. Biểu đồ tròn “Tỷ lệ Gender” cũng minh họa rõ ràng tỷ lệ này với 0.51% (hoặc 51%) cho nữ và 0.49% (hoặc 49%) cho nam, thể hiện sự nhất quán giữa các hình thức trình bày dữ liệu.

Nhìn chung, đặc điểm chính bạn quan sát được là sự phân bổ giới tính tương đối cân bằng trong bộ dữ liệu. Mặc dù hạng mục “F” (Nữ) có một chút ưu thế về số lượng và tỷ lệ so với hạng mục “M” (Nam), nhưng sự chênh lệch này không đáng kể. Tỷ lệ giữa nữ và nam gần như 1:1, cho thấy bộ dữ liệu này có sự đại diện khá đồng đều của cả hai giới tính. Điều này rất thuận lợi cho các phân tích tiếp theo, đảm bảo rằng không có sự mất cân bằng đáng kể về giới tính có thể làm sai lệch kết quả.


2.3 Biến MaritalStatus

  • Bảng tần số:
table(d1$MaritalStatus)
## 
##    M    S 
## 6866 7193
  • Bảng tần suất:
b <- table(d1$MaritalStatus)/sum(nrow(d1))
print(b)
## 
##         M         S 
## 0.4883704 0.5116296

Vậy trong bộ dữ liệu này có 48.8370439% đã kết hôn và 51.1629561% độc thân.

  • Biểu đồ:
pie(b,
    labels = paste(names(b), round(b, 2), "%"),
    main = "Biểu đồ tròn: Tỷ lệ MaritalStatus") 

Biến “MaritalStatus” (Tình trạng hôn nhân) trong bộ dữ liệu phân loại các cá nhân thành hai nhóm chính là “M” (Đã kết hôn) và “S” (Độc thân).

Từ bảng tần số, có 6866 cá nhân đã kết hôn (M) và 7193 cá nhân độc thân (S). Khi xem xét tỷ lệ, bảng tần suất cho thấy nhóm “M” chiếm khoảng 48.83% tổng số quan sát, trong khi nhóm “S” chiếm tỷ lệ lớn hơn một chút với khoảng 51.17%. Biểu đồ tròn “Tỷ lệ MaritalStatus” cũng minh họa rõ ràng sự phân bổ này, với 0.49% (hoặc 49%) cho “M” và 0.51% (hoặc 51%) cho “S”, xác nhận sự nhất quán giữa các hình thức trình bày dữ liệu.

Đặc điểm chính quan sát được là sự cân bằng tương đối giữa hai tình trạng hôn nhân trong bộ dữ liệu. Mặc dù hạng mục “S” (Độc thân) có một chút ưu thế về số lượng và tỷ lệ so với hạng mục “M” (Đã kết hôn), nhưng sự chênh lệch này không đáng kể. Tỷ lệ giữa người độc thân và người đã kết hôn gần như 1:1, cho thấy bộ dữ liệu này có sự đại diện khá đồng đều của cả hai nhóm. Điều này có lợi cho các phân tích sau này, vì nó tránh được tình trạng mất cân bằng dữ liệu có thể ảnh hưởng đến kết quả mô hình hoặc thống kê liên quan đến tình trạng hôn nhân.


2.4 Biến AnnualIncome

  • Bảng tần số:
 table(d1$AnnualIncome)
## 
##   $10K - $30K $110K - $130K $130K - $150K       $150K +   $30K - $50K 
##          3090           643           760           273          4601 
##   $50K - $70K   $70K - $90K  $90K - $110K 
##          2370          1709           613
  • Bảng tần suất:
l <- table(d1$AnnualIncome)/sum(nrow(d1))
print(l)
## 
##   $10K - $30K $110K - $130K $130K - $150K       $150K +   $30K - $50K 
##    0.21978804    0.04573583    0.05405790    0.01941817    0.32726367 
##   $50K - $70K   $70K - $90K  $90K - $110K 
##    0.16857529    0.12155914    0.04360196

Vậy trong bộ dữ liệu này có:
21.9788036% cá nhân có thu nhập thuộc khoảng $10K - $30K ;
4.5735828% cá nhân có thu nhập thuộc khoảng $110K - $130K;
5.4057899% cá nhân có thu nhập thuộc khoảng $130K - $150K;
1.9418166% cá nhân có thu nhập thuộc khoảng $150K +;
32.7263675% cá nhân có thu nhập thuộc khoảng $50K - $70K ;
16.857529% cá nhân có thu nhập thuộc khoảng $70K - $90K;
4.3601963% cá nhân có thu nhập thuộc khoảng $90K - $110K;

  • Biểu đồ:
pie(l,
    labels = paste(names(l), round(l, 2), "%"),
    main = "Biểu đồ tròn: Tỷ lệ AnnualIncome") 

Biến “AnnualIncome” (Thu nhập hàng năm) trong bộ dữ liệu được phân loại thành nhiều khoảng khác nhau, cho phép chúng ta phân tích sự phân bổ thu nhập của các cá nhân. Các khoảng thu nhập bao gồm từ thấp nhất ($10K - $30K) đến cao nhất ($150K +).

Từ bảng tần số, chúng ta có thể thấy số lượng cá nhân trong từng khoảng thu nhập. Cụ thể, khoảng thu nhập phổ biến nhất là $30K - $50K với 4601 cá nhân, tiếp theo là khoảng $10K - $30K với 3090 cá nhân. Các khoảng thu nhập cao hơn như $110K - $130K, $130K - $150K, và $150K + có số lượng cá nhân ít hơn đáng kể.

Khi xem xét tỷ lệ, bảng tần suất cho thấy khoảng $30K - $50K chiếm tỷ lệ lớn nhất với khoảng 32.73%. Khoảng $10K - $30K đứng thứ hai với khoảng 21.98%. Các khoảng thu nhập còn lại có tỷ lệ thấp hơn nhiều, đặc biệt là khoảng $150K + chỉ chiếm khoảng 1.94%. Biểu đồ tròn “Tỷ lệ AnnualIncome” cũng minh họa rõ ràng sự phân bổ này, với 0.33% (hoặc 33%) cho $30K - $50K và 0.22% (hoặc 22%) cho $10K - $30K.

Đặc điểm chính quan sát được là sự phân bổ thu nhập lệch về phía các khoảng thu nhập thấp và trung bình. Hạng mục $30K - $50K chiếm ưu thế rõ rệt nhất trong bộ dữ liệu, cho thấy đây là nhóm thu nhập phổ biến nhất. Có sự chênh lệch lớn giữa các hạng mục thu nhập, với phần lớn các cá nhân tập trung ở các khoảng thu nhập dưới $70K, và một tỷ lệ rất nhỏ ở các khoảng thu nhập cao hơn $110K. Điều này ngụ ý rằng bộ dữ liệu chủ yếu tập trung vào các cá nhân có mức thu nhập thấp và trung bình.


2.5 Biến City

  • Bảng tần số:
 table(d1$City)
## 
##      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
  • Bảng tần suất:
k <- table(d1$City)/sum(nrow(d1))
print(k)
## 
##      Acapulco    Bellingham Beverly Hills     Bremerton       Camacho 
##   0.027242336   0.010171420   0.057685468   0.059321431   0.032150224 
##   Guadalajara       Hidalgo   Los Angeles        Merida   Mexico City 
##   0.005334661   0.060103848   0.065865282   0.046518245   0.013798990 
##       Orizaba      Portland         Salem    San Andres     San Diego 
##   0.033003770   0.062308841   0.098584537   0.044170994   0.061597553 
## San Francisco       Seattle       Spokane        Tacoma     Vancouver 
##   0.009246746   0.065580767   0.062237712   0.089408920   0.045024539 
##      Victoria   Walla Walla        Yakima 
##   0.012518671   0.011380610   0.026744434

Vậy trong bộ dữ liệu này có:
2.7242336% cá nhân sinh sống ở Acapulco;
1.017142% cá nhân sinh sống ở Bellingham;
5.7685468% cá nhân sinh sống ở Beverly Hills;
5.9321431% cá nhân sinh sống ở Bremerton;
3.2150224% cá nhân sinh sống ở Camacho;
0.5334661% cá nhân sinh sống ở Guadalajara;
6.0103848% cá nhân sinh sống ở Hidalgo;
6.5865282% cá nhân sinh sống ở Los Angeles;
4.6518245% cá nhân sinh sống ở Merida;
1.379899% cá nhân sinh sống ở Mexico City;
3.300377% cá nhân sinh sống ở Orizaba;
6.2308841% cá nhân sinh sống ở Portland;
9.8584537% cá nhân sinh sống ở Salem;
4.4170994% cá nhân sinh sống ở San Andres;
6.1597553% cá nhân sinh sống ở San Diego;
0.9246746% cá nhân sinh sống ở San Francisco;
6.5580767% cá nhân sinh sống ở Seattle;
6.2237712% cá nhân sinh sống ở Spokane;
8.940892% cá nhân sinh sống ở Tacoma;
4.5024539% cá nhân sinh sống ở Vancouver;
1.2518671% cá nhân sinh sống ở Victoria;
1.138061% cá nhân sinh sống ở Walla Walla;
2.6744434% cá nhân sinh sống ở Yakima.


  • Biểu đồ:
table(d1$City) %>% as.data.frame() ->o2
colnames(o2)<-c("value","count")

ggplot(o2, aes(x = value, y = count, fill = value)) +
  geom_bar(stat = "identity") +  coord_flip() +
  geom_text(aes(label = count), vjust = -0.3, size = 2.5) +
  labs(title = "Biểu đồ City ", x = "City", y = "Số lượng") +
  theme_minimal()

Biến “City” trong bộ dữ liệu thể hiện thành phố nơi các cá nhân sinh sống. Có rất nhiều thành phố khác nhau được liệt kê, cho thấy sự phân bổ địa lý rộng của tập khách hàng.

Từ bảng tần số, chúng ta có thể thấy số lượng cá nhân ở mỗi thành phố. Quan sát nhanh cho thấy một số thành phố có tần số xuất hiện cao hơn đáng kể so với những thành phố khác. Ví dụ, Los Angeles có 926 cá nhân, Tacoma có 1257 cá nhân, Seattle có 922 cá nhân, Portland có 876 cá nhân, và San Diego có 866 cá nhân. Ngược lại, một số thành phố như Guadalajara (75 cá nhân) hoặc Victoria (176 cá nhân) có số lượng ít hơn nhiều.

Khi xem xét tỷ lệ (tần suất), các thành phố có số lượng cá nhân cao nhất cũng có tỷ lệ phần trăm lớn nhất. Ví dụ, Tacoma chiếm khoảng 8.94% tổng số quan sát, Los Angeles khoảng 6.58%, Seattle khoảng 6.56%, và Portland khoảng 6.23%. Các thành phố khác có tỷ lệ thấp hơn nhiều, một số chỉ chiếm dưới 1% (ví dụ: Guadalajara chỉ 0.53%).

Đặc điểm chính quan sát được là sự phân bổ cá nhân không đồng đều giữa các thành phố. Hạng mục Tacoma và Los Angeles cùng với một số thành phố lớn khác như Seattle, Portland, San Diego, Bellingham, và Bremerton (khi tổng hợp) chiếm ưu thế đáng kể về số lượng và tỷ lệ. Có sự chênh lệch rất lớn giữa các hạng mục: trong khi một số thành phố tập trung đông đảo dân cư trong bộ dữ liệu, nhiều thành phố khác chỉ có rất ít đại diện. Điều này cho thấy bộ dữ liệu có thể tập trung vào một số khu vực đô thị lớn nhất định, với ít dữ liệu từ các khu vực nhỏ hơn.


2.6 Biến StateorProvince

  • Bảng tần số:
 table(d1$StateorProvince)
## 
##        BC        CA        DF  Guerrero   Jalisco        OR  Veracruz        WA 
##       809      2733       815       383        75      2262       464      4567 
##   Yucatan Zacatecas 
##       654      1297
  • Bảng tần suất:
s <- table(d1$StateorProvince)/sum(nrow(d1))
print(s)
## 
##          BC          CA          DF    Guerrero     Jalisco          OR 
## 0.057543211 0.194395049 0.057969984 0.027242336 0.005334661 0.160893378 
##    Veracruz          WA     Yucatan   Zacatecas 
## 0.033003770 0.324845295 0.046518245 0.092254072

vậy trong bộ dữ liệu này có:
5.7543211% cá nhân sinh sống ở bang WA;
19.4395049% cá nhân sinh sống ở bang CA;
5.7969984% cá nhân sinh sống ở bang OR;
2.7242336% cá nhân sinh sống ở bang BC;
0.5334661% cá nhân sinh sống ở bang DF;
16.0893378% cá nhân sinh sống ở bang Guerrero;
3.300377% cá nhân sinh sống ở bang Jalisco;
32.4845295% cá nhân sinh sống ở bang Veracruz;
4.6518245% cá nhân sinh sống ở bang Yucatan;
9.2254072% cá nhân sinh sống ở bang Zâctecas.

  • Biểu đồ:
pie(s,
    labels = paste(names(s), round(s, 2), "%"),
    main = "Biểu đồ tròn: Tỷ lệ StateorProvince") 

Biến StateorProvince (Bang/Tỉnh) trong bộ dữ liệu phân loại các cá nhân thành nhiều nhóm chính, ví dụ như “WA”, “CA”, “OR”, “BC”, “DF”, “Guerrero”, “Jalisco”, “Veracruz”, “Yucatan” và “Zacatecas”.

Từ bảng tần số, WA có số lượng quan sát cao nhất với 4567 cá nhân, tiếp theo là CA với 2733 cá nhân và OR với 2262 cá nhân. Ngược lại, Jalisco là hạng mục có số lượng quan sát thấp nhất chỉ với 75 cá nhân. Khi xem xét tỷ lệ, bảng tần suất cho thấy nhóm “WA” chiếm khoảng 32.48% tổng số quan sát, “CA” chiếm 19.44%, và “OR” chiếm 16.09%. Biểu đồ tròn “Tỷ lệ StateorProvince” cũng minh họa rõ ràng sự phân bố này, với 32.48% cho “WA”, 19.44% cho “CA”, 16.09% cho “OR”, và các tỷ lệ rất nhỏ cho các hạng mục khác, xác nhận sự nhất quán giữa các hình thức trình bày dữ liệu.

Đặc điểm chính quan sát được là sự mất cân bằng rõ rệt giữa các bang/tỉnh trong bộ dữ liệu. Hạng mục “WA” chiếm ưu thế vượt trội về số lượng và tỷ lệ, theo sau là “CA” và “OR”. Có sự chênh lệch rất lớn giữa các hạng mục, khi một vài bang/tỉnh (như WA, CA, OR) chiếm phần lớn đáng kể dữ liệu, trong khi các bang/tỉnh khác (ví dụ Jalisco, Guerrero, Veracruz) chỉ có sự đại diện rất nhỏ. Điều này có thể ảnh hưởng đến các phân tích sau này, vì nó cho thấy dữ liệu có sự tập trung mạnh vào một số khu vực nhất định, có khả năng gây ra sai lệch hoặc giảm độ tin cậy của mô hình đối với các nhóm có ít dữ liệu.


2.7 Biến Country

  • Bảng tần số:
 table(d1$Country)
## 
## Canada Mexico    USA 
##    809   3688   9562
  • Bảng tần suất:
c <- table(d1$Country)/sum(nrow(d1))
print(c)
## 
##     Canada     Mexico        USA 
## 0.05754321 0.26232307 0.68013372

vậy trong bộ dữ liệu này có:
5.7543211% cá nhân sinh sống ở Canada;
26.2323067% cá nhân sinh sống ở Mexico;
68.0133722% cá nhân sinh sống ở USA.

  • Biểu đồ:
pie(c,
    labels = paste(names(c), round(c, 2), "%"),
    main = "Biểu đồ tròn: Tỷ lệ Country") 

Từ bảng tần số, biến Country cho thấy có ba quốc gia chính trong bộ dữ liệu là Canada, Mexico và USA. Trong đó, USA là quốc gia có số lượng quan sát cao nhất với 9562 bản ghi, Mexico đứng thứ hai với 3688 bản ghi, và Canada có số lượng thấp nhất với 809 bản ghi. Phân tích bảng tần suất và biểu đồ tròn xác nhận sự phân bố này: USA chiếm tỷ lệ áp đảo với 0.68013372 (tức khoảng 68.01%), Mexico chiếm 0.26232307 (khoảng 26.23%), và Canada chiếm 0.05754321 (khoảng 5.75%). USA rõ ràng là hạng mục chiếm ưu thế vượt trội trong bộ dữ liệu. Có sự chênh lệch rất lớn giữa các hạng mục, khi tỷ lệ của USA lớn hơn gấp đôi so với Mexico và lớn hơn khoảng 10 lần so với Canada. Điều này cho thấy dữ liệu trong tập này chủ yếu đến từ Hoa Kỳ, và các phân tích sau này có thể bị ảnh hưởng bởi sự đại diện không đồng đều này, đặc biệt khi suy luận về các quốc gia có tỷ lệ thấp hơn.


2.8 Biến ProductFamily

  • Bảng tần số:
 table(d1$ProductFamily)
## 
##          Drink           Food Non-Consumable 
##           1250          10153           2656
  • Bảng tần suất:
v <- table(d1$ProductFamily)/sum(nrow(d1))
print(v)
## 
##          Drink           Food Non-Consumable 
##     0.08891102     0.72217085     0.18891813

vậy trong bộ dữ liệu này có:
8.8911018% sản phẩm thuộc nhóm Drink;
72.2170851% sản phẩm thuộc nhóm Food;
18.8918131% sản phẩm thuộc nhóm Non-Consumable.

  • Biểu đồ:
pie(v,
    labels = paste(names(v), round(v, 2), "%"),
    main = "Biểu đồ tròn: Tỷ lệ ProductFamily ") 

Biến ProductFamily (Nhóm sản phẩm) trong bộ dữ liệu phân loại các sản phẩm thành ba nhóm chính là “Drink” (Đồ uống), “Food” (Thực phẩm), và “Non-Consumable” (Không tiêu dùng).

Từ bảng tần số, có 10153 sản phẩm thuộc nhóm “Food”, 2656 sản phẩm thuộc nhóm “Non-Consumable”, và 1250 sản phẩm thuộc nhóm “Drink”. Khi xem xét tỷ lệ, bảng tần suất cho thấy nhóm “Food” chiếm tỷ lệ áp đảo với 0.72217085 (tức 72.22%) tổng số quan sát. Nhóm “Non-Consumable” đứng thứ hai với 0.18891813 (tức 18.89%), và nhóm “Drink” chiếm tỷ lệ thấp nhất với 0.08891102 (tức 8.89%). Biểu đồ tròn (dù nhãn là “Country” nhưng dữ liệu phản ánh “ProductFamily”) cũng minh họa rõ ràng sự phân bố này, với 0.72% (hoặc 72%) cho “Food”, 0.19% (hoặc 19%) cho “Non-Consumable”, và 0.09% (hoặc 9%) cho “Drink”, xác nhận sự nhất quán giữa các hình thức trình bày dữ liệu.

Đặc điểm chính quan sát được là sự mất cân bằng rất lớn giữa các nhóm sản phẩm trong bộ dữ liệu. Hạng mục “Food” chiếm ưu thế vượt trội về số lượng và tỷ lệ, đại diện cho gần ba phần tư tổng số sản phẩm. Có sự chênh lệch đáng kể giữa các hạng mục, khi nhóm “Food” lớn hơn rất nhiều so với “Non-Consumable” và “Drink”, vốn chỉ chiếm một phần nhỏ. Điều này cho thấy hoạt động kinh doanh hoặc dữ liệu thu thập đang tập trung mạnh vào các sản phẩm thuộc nhóm Thực phẩm, điều này có thể ảnh hưởng đến các phân tích về xu hướng mua sắm, hiệu suất sản phẩm, hoặc chiến lược marketing nếu không được xem xét kỹ lưỡng.


2.9 Biến ProductCategory

  • Bảng tần số:
 table(d1$ProductCategory)
## 
##         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
  • Bảng tần suất:
v1 <- table(d1$ProductCategory)/sum(nrow(d1))
print(v1)
## 
##         Baking Goods    Bathroom Products        Beer and Wine 
##          0.034426346          0.025962017          0.025321858 
##                Bread      Breakfast Foods              Candles 
##          0.030229746          0.029660716          0.003200797 
##                Candy     Canned Anchovies         Canned Clams 
##          0.025037343          0.003129668          0.003769827 
##       Canned Oysters      Canned Sardines        Canned Shrimp 
##          0.002489508          0.002845153          0.002702895 
##          Canned Soup          Canned Tuna Carbonated Beverages 
##          0.028736041          0.006188207          0.010953837 
##    Cleaning Supplies        Cold Remedies                Dairy 
##          0.013443346          0.006614980          0.064229319 
##        Decongestants               Drinks                 Eggs 
##          0.006045949          0.009602390          0.014083505 
##           Electrical      Frozen Desserts       Frozen Entrees 
##          0.025250729          0.022974607          0.008393200 
##                Fruit             Hardware        Hot Beverages 
##          0.054413543          0.009175617          0.016075112 
##              Hygiene     Jams and Jellies     Kitchen Products 
##          0.014012376          0.041823743          0.015434953 
##            Magazines                 Meat        Miscellaneous 
##          0.014368020          0.054129028          0.002987410 
##  Packaged Vegetables       Pain Relievers       Paper Products 
##          0.003414183          0.013656732          0.024539441 
##                Pizza     Plastic Products Pure Juice Beverages 
##          0.013798990          0.010029163          0.011736254 
##              Seafood          Side Dishes          Snack Foods 
##          0.007255139          0.010882709          0.113806103 
##            Specialty        Starchy Foods           Vegetables 
##          0.020556227          0.019702682          0.122910591
  • Biểu đồ:
table(d1$ProductCategory) %>% as.data.frame() ->o3
colnames(o3)<-c("value","count")

ggplot(o3, aes(x = value, y = count, fill = value)) +
  geom_bar(stat = "identity")+  coord_flip() +  
  geom_text(aes(label = count), vjust = -0.3, size = 2.5) +
  labs(title = "Biểu đồ ProductCategory ", x = "ProductCategory", y = "Số lượng") +
  theme_minimal()+theme(
    plot.title = element_text(hjust = 0.5, face = "bold", size = 14),
    legend.position = "none"  # Ẩn chú thích màu nếu không cần
  )

Từ bảng tần số, “Vegetables” và “Snack Foods” là hai hạng mục có số lượng quan sát cao nhất lần lượt là 1728 và 1600 bản ghi. Theo sau là “Dairy” với 903 bản ghi và “Fruit” với 765 bản ghi. Ngược lại, nhiều hạng mục có số lượng quan sát rất thấp, ví dụ như “Miscellaneous” (42), “Canned Anchovies” (44), “Candles” (45), “Packaged Vegetables” (48), và “Canned Clams” (53). Khi xem xét tỷ lệ, bảng tần suất cho thấy “Vegetables” chiếm tỷ lệ cao nhất với 0.122910591 (tức khoảng 12.29%) tổng số quan sát, và “Snack Foods” chiếm 0.113806103 (tức khoảng 11.38%). Ngược lại, “Miscellaneous” chỉ chiếm 0.002987410 (khoảng 0.30%) và “Canned Anchovies” là 0.003129668 (khoảng 0.31%). Biểu đồ cột “Biểu đồ ProductCategory” minh họa rõ ràng sự phân bố này, với các cột “Vegetables” và “Snack Foods” nổi bật với chiều cao vượt trội, trong khi nhiều cột khác gần như không đáng kể, xác nhận sự nhất quán giữa các hình thức trình bày dữ liệu.

Đặc điểm chính quan sát được là sự mất cân bằng rất lớn giữa các danh mục sản phẩm trong bộ dữ liệu. Các hạng mục “Vegetables” và “Snack Foods” chiếm ưu thế rõ rệt về số lượng và tỷ lệ. Có sự chênh lệch cực kỳ lớn giữa các hạng mục, khi hai nhóm đứng đầu chiếm tỷ trọng đáng kể, trong khi một lượng lớn các danh mục khác (như “Miscellaneous”, “Canned Clams”, “Candles”) có số lượng và tỷ lệ rất nhỏ, thậm chí chỉ chiếm chưa đến 1% tổng số. Điều này cho thấy dữ liệu mua sắm hoặc tồn kho đang tập trung mạnh vào một số ít danh mục sản phẩm nhất định, điều này có thể ảnh hưởng đến các phân tích thị trường, chiến lược sản phẩm hoặc dự báo doanh số nếu không được xem xét kỹ lưỡng.


2.10 Biến ProductDepartment

  • Bảng tần số:
 table(d1$ProductDepartment)
## 
## 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
  • Bảng tần suất:
v2 <- table(d1$ProductDepartment)/sum(nrow(d1))
print(v2)
## 
## Alcoholic Beverages         Baked Goods        Baking Goods           Beverages 
##         0.025321858         0.030229746         0.076250089         0.048367594 
##     Breakfast Foods        Canned Foods     Canned Products            Carousel 
##         0.013372217         0.069492852         0.007753041         0.004196600 
##            Checkout               Dairy                Deli                Eggs 
##         0.005832563         0.064229319         0.049719041         0.014083505 
##        Frozen Foods  Health and Hygiene           Household                Meat 
##         0.098300021         0.063518031         0.101002916         0.006330464 
##         Periodicals             Produce             Seafood         Snack Foods 
##         0.014368020         0.141830856         0.007255139         0.113806103 
##              Snacks       Starchy Foods 
##         0.025037343         0.019702682
  • Biểu đồ:
table(d1$ProductDepartment) %>% as.data.frame() ->o4
colnames(o4)<-c("value","count")

ggplot(o4, aes(x = value, y = count, fill = value)) +
  geom_bar(stat = "identity")+  
  geom_text(aes(label = count), vjust = -0.3, size = 2.5) +
  labs(title = "Biểu đồ ProductDepartment ", x = "ProductDepartment", y = "Số lượng") +  theme_minimal() +
  theme(
    plot.title = element_text(hjust = 0.5, face = "bold", size = 14),
    axis.text.x = element_blank(), # Ẩn nhãn dưới trục X nếu cần
    legend.position = "bottom"
  ) 

Phân bố của các loại sản phẩm không đồng đều. “Produce” (1994 mẫu, chiếm khoảng 14.26%) và “Snack Foods” (1600 mẫu, chiếm khoảng 11.44%) là hai loại sản phẩm có số lượng mẫu được phân tích nhiều nhất, cho thấy đây là những ngành hàng chiếm tỷ trọng lớn trong dữ liệu. Ngược lại, các ngành hàng như “Checkout” (82 mẫu, chiếm khoảng 0.59%), “Meat” (89 mẫu, chiếm khoảng 0.63%) và “Canned Products” (109 mẫu, chiếm khoảng 0.78%) có số lượng mẫu rất thấp, có thể là những ngành hàng ít phổ biến hơn hoặc ít được quan tâm trong quá trình phân tích dữ liệu này.

Sự chênh lệch lớn giữa các ngành hàng cho thấy rằng doanh nghiệp hoặc tổ chức đang tập trung vào một số lĩnh vực sản phẩm nhất định (“Produce”, “Snack Foods”, “Household”, “Frozen Foods”) trong khi một số ngành hàng khác đang bị bỏ ngỏ hoặc không được ưu tiên. Điều này có thể ảnh hưởng đến hiệu quả kinh doanh tổng thể nếu không có sự phân bổ hợp lý hoặc nếu các ngành hàng ít phổ biến có tiềm năng tăng trưởng nhưng chưa được khai thác. Để hiểu rõ hơn về lý do của sự phân bố này, cần có thêm thông tin về bối cảnh thu thập dữ liệu và mục tiêu phân tích.

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

  • Các biến được lựa chọn bao gồm: Homeowner; Gender; Country.

3.1 Biến Homeowner

1.Xác định hạng mục quan tâm: hạng mục N (không có sở hữu nhà) của biến Homeowner.

2.Ước lượng khoảng tin cây:
Ước lượng khoảng tin cậy cho tỷ lệ của hạng mục N với khoảng tin cậy 95%.

# Đếm số lượng quan sát của hạng mục N
count_N <- sum(d1$Homeowner == "N")
print("Số lượng quan sát của hạng mục N:")
## [1] "Số lượng quan sát của hạng mục N:"
count_N
## [1] 5615
# Đếm số tổng quan sát.
total <- nrow(d1)
print("Số tổng quan sát:")
## [1] "Số tổng quan sát:"
total
## [1] 14059
# Tính khoảng tin cây
result <- prop.test(x = count_N, n = total, conf.level = 0.95)

# Hiển thị kết quả
print("Khoảng tin cậy:")
## [1] "Khoảng tin cậy:"
result
## 
##  1-sample proportions test with continuity correction
## 
## data:  count_N out of total, 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.3912855 0.4075463
## sample estimates:
##         p 
## 0.3993883

Diễn giải
* Tỷ lệ người không sở hữu nhà trong mẫu khảo sát là 39,94%.
* Khoảng tin cậy 95% cho tỷ lệ người không sở hữu nhà (‘N’) là từ 39,13% đến 40,75%.
* Tức là: Chúng ta tự tin 95% rằng tỷ lệ thực sự của những người không sở hữu nhà trong tổng thể nằm trong khoảng từ 39,13% đến 40,75%.

Giải thích
Ước lượng khoảng tin cậy cho tỷ lệ người không sở hữu nhà trên tổng số quan sát với mức ý nghĩa 0,5.

X-squared = 568.86, df = 1: giá trị thống kê kiểm định (Chi- squared) là 568,86 với 1 bậc tự do.

Giá trị p-value rất nhỏ và gần như bằng 0 (p-value < 2.2e-16). Cho thấy bằng chứng rất mạnh để bác bỏ giả thuyết \(H_0\) (rằng tỷ lệ bằng 0.5).

alternative hypothesis: giả thuyết đối (tỷ lệ thực sự khác 0.5).

95 percent confidence interval: 0.3912855 0.4075463: khoảng tin cậy 95% cho tỷ lệ mẫu là từ 39.13% đến 40.75%.

sample estimate p = 0.3993883: Ước lượng tỷ lệ từ mẫu là 39.94%.

3.Kiểm định giả thuyết

  • Đặt giả thuyết:
    Giả thuyết \(H_0\): Tỷ lệ thực sự của người không sở hữu nhà trong tổng thể bằng 0.75 (\(H_0: p=0.75\).)
    Giả thuyết \(H_1\): Tỷ lệ thực sự của những người không sở hữu nhà trong tổng thể khác 0.75 (\(H_1:p\neq 0.75\))

  • Thực hiện kiểm định giả thuyết:
    Với số lượng quan sát của hạng mục N: 5615;
    Và tổng số quan sát: 14059.

# thực hiện prop.test với p=0.7 (tỷ lệ giả định dưới H0)
test_result <- prop.test(x = count_N, n = total, p=0.75, alternative="two.sided")
print("Kết quả kiểm định giả thuyết:")
## [1] "Kết quả kiểm định giả thuyết:"
test_result
## 
##  1-sample proportions test with continuity correction
## 
## data:  count_N out of total, null probability 0.75
## X-squared = 9215.5, df = 1, p-value < 2.2e-16
## alternative hypothesis: true p is not equal to 0.75
## 95 percent confidence interval:
##  0.3912855 0.4075463
## sample estimates:
##         p 
## 0.3993883
  • Báo cáo giá trị p và đưa ra kết luận ở mức ý nghĩa \(\alpha=0.05\):
    Tỷ lệ mẫu p = 39,94%.
    Giá trị p_value < 2.2e-16, một con số cực kỳ nhỏ (gần như bằng 0).
    Với mức ý nghĩa \(\alpha\): chúng ta chọn \(\alpha=0.05\).
    So sánh p-value với \(\alpha: p-value(<2.2e-16)<\alpha(0.05)\).
    Kết luận: vì p-value nhỏ hơn mức ý nghĩa \(\alpha\), chúng ta bác bỏ giả thuyết \(H_0\).
    Tỷ lệ mẫu 39,94% chênh lệch có ý nghĩa thống kê so với giả thuyết tỷ lệ 50%, cho thấy có bằng chứng để khẳng định rằng tỷ lệ thực sự trong tổng thể không phải là 50%.

  • Kết luận:
    Việc bác bỏ \(H_0:p=0.75\) có nghĩa là chúng ta không có đủ bằng chứng thống kê để kết luận rằng tỷ lệ thực sự của những người không sở hữu nhà trong tổng thể không bằng 70%.
    Kết quả kiểm định này, cùng với ước lượng điểm từ mẫu (39.94%) và khoảng tin cậy 95% (0.3912855 0.4075463), cho thấy tỷ lệ người không sở hữu nhà trên thực tế có vẻ thấp hơn đáng kể so với con số 70% mà giả thuyết không đã đặt ra. Điều này khẳng định rằng giả định ban đầu về tỷ lệ người không sở hữu nhà là 70% là không phù hợp với dữ liệu quan sát được.

3.2 Biến Gender

1.Xác định hạng mục quan tâm: hạng mục Nữ của biến Gender.

2.Ước lượng khoảng tin cây:
Ước lượng khoảng tin cậy cho tỷ lệ của hạng mục F (Nữ) với khoảng tin cậy 95%.

# Đếm số lượng quan sát của hạng mục N
count_F <- sum(d1$Gender == "F")
print("Số lượng quan sát của hạng mục F:")
## [1] "Số lượng quan sát của hạng mục F:"
count_F
## [1] 7170
print("Số tổng quan sát:")
## [1] "Số tổng quan sát:"
total
## [1] 14059
# Tính khoảng tin cây
result1 <- prop.test(x = count_F, n = total, conf.level = 0.95)

# Hiển thị kết quả
print("Khoảng tin cậy:")
## [1] "Khoảng tin cậy:"
result1
## 
##  1-sample proportions test with continuity correction
## 
## data:  count_F out of total, 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

Diễn giải
* Tỷ lệ nữ trong mẫu khảo sát là 51%.
* Khoảng tin cậy 95% cho tỷ lệ người không sở hữu nhà (‘N’) là từ 50.17% đến 51.83%.
* Tức là: Chúng ta tự tin 95% rằng tỷ lệ thực sự số người có giới tính nữ trong tổng thể nằm trong khoảng từ 50.17% đến 51.83%.

3.Kiểm định giả thuyết

  • Đặt giả thuyết:
    Giả thuyết \(H_0\): Tỷ lệ thực sự của người có giới tính nữ trong tổng thể bằng 0.3 (\(H_0: p=0.3\).)
    Giả thuyết \(H_1\): Tỷ lệ thực sự của người có giới tính nữ trong tổng thể khác 0.3 (\(H_1:p\neq 0.3\))

  • Thực hiện kiểm định giả thuyết:
    Với số lượng quan sát của hạng mục F: 7170;
    Và tổng số quan sát: 14059.

# thực hiện prop.test với p=0.3 (tỷ lệ giả định dưới H0)
test_result1 <- prop.test(x = count_F, n = total, p=0.3, alternative="two.sided")
print("Kết quả kiểm định giả thuyết:")
## [1] "Kết quả kiểm định giả thuyết:"
test_result1
## 
##  1-sample proportions test with continuity correction
## 
## data:  count_F out of total, null probability 0.3
## X-squared = 2951.2, df = 1, p-value < 2.2e-16
## alternative hypothesis: true p is not equal to 0.3
## 95 percent confidence interval:
##  0.5016931 0.5182886
## sample estimates:
##         p 
## 0.5099936
  • Báo cáo giá trị p và đưa ra kết luận ở mức ý nghĩa \(\alpha=0.05\):
    Tỷ lệ mẫu p = 51%.
    Giá trị p_value < 2.2e-16, một con số cực kỳ nhỏ (gần như bằng 0).
    Với mức ý nghĩa \(\alpha\): chúng ta chọn \(\alpha=0.05\).
    So sánh p-value với \(\alpha: p-value(<2.2e-16)<\alpha(0.05)\).
    Kết luận: vì p-value nhỏ hơn mức ý nghĩa \(\alpha\), chúng ta bác bỏ giả thuyết \(H_0\).

  • Kết luận:
    có đủ bằng chứng thống kê để kết luận rằng tỷ lệ thực sự của người có giới tính nữ trong tổng thể là khác 0.3.
    Nói cách khác, dữ liệu mẫu của chúng ta cho thấy tỷ lệ nữ trong tổng thể không phải là 30%. Trên thực tế, tỷ lệ ước tính trong mẫu là 0.5099936 (khoảng 51%), và khoảng tin cậy 95% cho tỷ lệ thực sự là từ 0.5016931 đến 0.5182886, không chứa giá trị 0.3.

3.3 Biến Country

1.Xác định hạng mục quan tâm: hạng mục Mexico của biến Country.

2.Ước lượng khoảng tin cây:
Ước lượng khoảng tin cậy cho tỷ lệ của hạng mục Mexico với khoảng tin cậy 95%.

# Đếm số lượng quan sát của hạng mục N
count_M <- sum(d1$Country == "Mexico")
print("Số lượng quan sát của hạng mục Mexico:")
## [1] "Số lượng quan sát của hạng mục Mexico:"
count_M
## [1] 3688
print("Số tổng quan sát:")
## [1] "Số tổng quan sát:"
total
## [1] 14059
# Tính khoảng tin cây
result2 <- prop.test(x = count_M, n = total, conf.level = 0.95)

# Hiển thị kết quả
print("Khoảng tin cậy:")
## [1] "Khoảng tin cậy:"
result2
## 
##  1-sample proportions test with continuity correction
## 
## data:  count_M out of total, null probability 0.5
## X-squared = 3175.8, df = 1, p-value < 2.2e-16
## alternative hypothesis: true p is not equal to 0.5
## 95 percent confidence interval:
##  0.2550820 0.2696946
## sample estimates:
##         p 
## 0.2623231

Diễn giải
* Uớc lượng tỷ lệ người ở Mexico trong mẫu khảo sát là 26,23%.
* Khoảng tin cậy 95% cho tỷ lệ thực sự của hạng mục Mexico trong tổng thể là từ 50.17% đến 51.83%.
* Tức là: Chúng ta tự tin 95% rằng tỷ lệ thực sự của hạng mục Mexico trong tổng thể nằm trong khoảng từ 25.51% đến 26.97%.

3.Kiểm định giả thuyết

  • Đặt giả thuyết:
    Giả thuyết \(H_0\): Tỷ lệ thực sự của người có giới tính nữ trong tổng thể bằng 0.8 (\(H_0: p=8\).)
    Giả thuyết \(H_1\): Tỷ lệ thực sự của người có giới tính nữ trong tổng thể khác 0.8 (\(H_1:p\neq 0.8\))

  • Thực hiện kiểm định giả thuyết:
    Với số lượng quan sát của hạng mục Mexico: 3688;
    Và tổng số quan sát: 14059.

# thực hiện prop.test với p=0.3 (tỷ lệ giả định dưới H0)
test_result2 <- prop.test(x = count_M, n = total, p=0.8, alternative="two.sided")
print("Kết quả kiểm định giả thuyết:")
## [1] "Kết quả kiểm định giả thuyết:"
test_result2
## 
##  1-sample proportions test with continuity correction
## 
## data:  count_M out of total, null probability 0.8
## X-squared = 25399, df = 1, p-value < 2.2e-16
## alternative hypothesis: true p is not equal to 0.8
## 95 percent confidence interval:
##  0.2550820 0.2696946
## sample estimates:
##         p 
## 0.2623231
  • Báo cáo giá trị p và đưa ra kết luận ở mức ý nghĩa \(\alpha=0.05\):
    Tỷ lệ mẫu p = 26.23%.
    Giá trị p_value < 2.2e-16, một con số cực kỳ nhỏ (gần như bằng 0).
    Với mức ý nghĩa \(\alpha\): chúng ta chọn \(\alpha=0.05\).
    So sánh p-value với \(\alpha: p-value(<2.2e-16)<\alpha(0.05)\).
    Kết luận: vì p-value nhỏ hơn mức ý nghĩa \(\alpha\), chúng ta bác bỏ giả thuyết \(H_0\).

  • Kết luận:
    Kết luận bác bỏ giả thuyết SH_0$ có nghĩa là có đủ bằng chứng thống kê để kết luận rằng tỷ lệ thực sự của người có giới tính nữ trong tổng thể KHÔNG phải là 0.8

    Hơn nữa, dựa trên ước tính mẫu, tỷ lệ người có giới tính nữ trong mẫu là khoảng 0.262 (hoặc 26.2%), và khoảng tin cậy 95% cho tỷ lệ thực sự trong tổng thể là từ 0.255 đến 0.269. Giá trị 0.8 hoàn toàn nằm ngoài khoảng tin cậy này, củng cố thêm kết luận bác bỏ giả thuyết null.

4 Phần 4: Phân tích mối quan hệ giữa hai biến định tính

  • Chọn các cặp biến định tính:
    • GenderProductCategory.
    • MaritalSatusHomewner.
    • MaritalStatusProductFamily.

4.1 Gender và ProductCategory

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

  • Câu hỏi được đặt ra: Thói quan mua sắm theo danh mục sản phẩm của nam giới có khác biệt so với nữ giới hay không.

  • Bảng tần số

# tạo bảng tần số 
s1 <- table( d1$ProductCategory, d1$Gender)
  • Bảng tần suất:
h1 <- prop.table(s1, margin = 2) * 100
h1 <- round(h1,2)
  • Lý do lựa chọn phân tích dữ liệu theo tỷ lệ phần trăm theo cột vì nó giúp chúng ta so sánh cơ cấu mua sắm hoặc hành vi tiêu dùng riêng của từng nhóm giới tính.

    • Tức là muốn biết Nam mua những gì, và Nữ mua những gì, và liệu có sự khác biệt trong danh mục hàng hóa mà mỗi nhóm giới tính này ưu tiên hay không.

    • Tóm lại: Chọn tính theo cột là để hiểu rõ hơn về thói quen và ưu tiên mua sắm của từng giới tính một cách riêng biệt, sau đó so sánh những thói quen và ưu tiên đó giữa Nam và Nữ để xác định xem có sự khác biệt hay không.

4.1.2 Trực quan hóa

ggplot(d1, aes(x = ProductCategory, fill = Gender)) +
  geom_bar(position = "dodge") +
  labs(title = "Phân bố Giới tính theo Danh mục Sản phẩm",
       x = "Danh mục Sản phẩm",
       y = "Số lượng",
       fill = "Giới tính") + coord_flip() +
  theme_minimal()

4.1.3 Nhận xét:

  • Có vẻ như có sự liên kết giữa hai biến này. Điều này được thể hiện qua việc phân bổ số lượng mua sản phẩm của nam và nữ là khác nhau đáng kể ở nhiều danh mục, chứ không phải là đồng đều.

  • Đối với một số danh mục như Vegetables (Rau củ), Snack Foods (Đồ ăn vặt), Meat (Thịt), Frozen Desserts (Món tráng miệng đông lạnh), Dairy (Sản phẩm từ sữa), Candles (Nến), giới tính Nữ (F - màu cam) có xu hướng mua nhiều hơn đáng kể so với giới tính Nam (M - màu xanh ngọc).

  • Đối với một số danh mục, giới tính Nam (M - màu xanh ngọc) có xu hướng mua nhiều hơn đáng kể so với giới tính Nữ (F - màu cam). Danh mục nổi bật nhất là: Decongestants (Thuốc thông mũi/thuốc cảm). Đây là danh mục có sự chênh lệch rõ rệt nhất về số lượng mua, với Nam mua nhiều hơn Nữ rất nhiều.

  • Kết luận chung: biểu đồ cho thấy rõ ràng rằng hành vi mua sắm các danh mục sản phẩm có sự khác biệt giữa giới tính Nam và Nữ. Có những danh mục sản phẩm được một giới tính ưa chuộng hơn đáng kể so với giới tính còn lại, trong khi ở một số danh mục khác, sự phân bổ là tương đối đồng đều. Điều này gợi ý rằng giới tính là một yếu tố có ảnh hưởng đến loại sản phẩm mà khách hàng lựa chọn mua.

4.1.4 Kiểm định thống kê

  • Phát biểu giả thuyết:
    • Giả thuyết \(H_0\): Hai biến Gender và ProductCategory là độc lập.
    • Giả thuyết \(H_1\): Hai biến Gender và ProductCategory là không độc lập.
chisq.test(s1)
## 
##  Pearson's Chi-squared test
## 
## data:  s1
## X-squared = 50.407, df = 44, p-value = 0.2349

1.Báo cáo giá trị Chi - bình phương, bậc tự do và giá trị p:
* Giá trị Chi - bình phương (x-squared): 50.407.
* Bậc tự do (df): 44
* Giá trị p (p-value): 0.2349

2.Dựa vào giá trị p, đưa ra kết luận về tính độc lập của hai biến ở mức ý nghĩa \(\alpha=0.05\):

  • So sánh giá trị p (0.2349) với mức ý nghĩa \(\alpha=0.05\).
  • Vì p-value (0.2349) > \(\alpha(0.05)\), chúng ta không có đủ bằng chứng để bác bỏ giá thuyết \(H_0\).

Kết luận: ở mức ý nghĩa \(\alpha=0.05\), không có bằng chứng thống kê đủ mạnh để kết luận rằng có mối liên hệ giữa giới tính và danh mục sản phẩm . Hai biến này có thể được gọi là độc lập về mặt thống kê.


4.2 MaritalSatus và Homewner

  • Câu hỏi: trong số những người có tình trạng hôn nhân là đã kết hôn thì tỷ lệ sở hữu nhà của họ là bao nhiêu?

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

# tạo bảng tần số 
s2 <- table( d1$MaritalStatus, d1$Homeowner)
  • Bảng tần suất:
r0 <- prop.table(s2, margin = 1) * 100
r0 <- round(r0,2)

Mục tiêu của câu hỏi là tìm hiểu sự phân bổ của việc sở hữu nhà trong nội bộ từng nhóm tình trạng hôn nhân. Tỷ lệ phần trăm theo hàng cung cấp thông tin này một cách trực tiếp, cho thấy đối với mỗi nhóm tình trạng hôn nhân, tỷ lệ bao nhiêu phần trăm sở hữu nhà và bao nhiêu phần trăm không.

Tính tỷ lệ phần trăm theo hàng cho phép bạn nhìn vào tỷ lệ của một thuộc tính (sở hữu nhà) trong một nhóm dân số cụ thể (những người đã kết hôn).

4.2.2 Trục quan hóa

ggplot(d1, aes(x = MaritalStatus, fill = Homeowner)) +
  geom_bar(position = "dodge") +
  labs(title = "Phân bố Tình trạng Hôn nhân theo Quyền Sở hữu Nhà",
       x = "Tình trạng Hôn nhân",
       y = "Số lượng",
       fill = "Chủ sở hữu nhà") +
  theme_minimal()

4.2.3 Nhận xét

  • Có vẻ như có một mối liên kết rõ ràng giữa tình trạng hôn nhân và quyền sở hữu nhà. Xu hướng chung là những người đã kết hôn có tỷ lệ sở hữu nhà cao hơn đáng kể so với những người độc thân.

  • Đối với nhóm “Đã kết hôn” (M): số lượng người sở hữu nhà (Y - màu xanh ngọc) lớn hơn rất nhiều so với số lượng người không sở hữu nhà (N - màu cam), có hơn 5000 người đã kết hôn là chủ sở hữu nhà, trong khi số người đã kết hôn nhưng không sở hữu nhà chỉ khoảng 1700-1800.

  • Đối với nhóm “Độc thân” (S): số lượng người không sở hữu nhà (N - màu cam) lại cao hơn số lượng người sở hữu nhà (Y - màu xanh ngọc). Có khoảng gần 4000 người độc thân không sở hữu nhà, trong khi số người độc thân sở hữu nhà là khoảng 3300-3400.

  • Kết luận chung: tình trạng hôn nhân ‘Đã kết hôn’ đi kèm với khả năng cao hơn nhiều trong việc sở hữu nhà, trong khi tình trạng hôn nhân ‘Độc thân’ lại có tỷ lệ không sở hữu nhà cao hơn. Mối quan hệ này là hợp lý theo lẽ thường, vì việc kết hôn thường liên quan đến việc ổn định cuộc sống, bao gồm cả việc mua và sở hữu tài sản lớn như nhà ở.

4.2.4 Kiểm định thống kê

  • Phát biểu giả thuyết:
    • Giả thuyết \(H_0\): Hai biến MaritalSatus và Homewner là độc lập.
    • Giả thuyết \(H_1\): Hai biến MaritalSatus và Homewner là không độc lập.
chisq.test(s2)
## 
##  Pearson's Chi-squared test with Yates' continuity correction
## 
## data:  s2
## X-squared = 1241.2, df = 1, p-value < 2.2e-16

1.Báo cáo giá trị Chi - bình phương, bậc tự do và giá trị p:
* Giá trị Chi - bình phương (x-squared): 1241.2.
* Bậc tự do (df): 1
* Giá trị p (p-value): < 2.2e-16

2.Dựa vào giá trị p, đưa ra kết luận về tính độc lập của hai biến ở mức ý nghĩa \(\alpha=0.05\):

  • So sánh giá trị p (< 2.2e-16) với mức ý nghĩa \(\alpha=0.05\).
  • Vì p-value (< 2.2e-16) < \(\alpha(0.05)\), chúng ta có đủ bằng chứng để bác bỏ giá thuyết \(H_0\).

Kết luận: ở mức ý nghĩa \(\alpha=0.05\), có bằng chứng thống kê đủ mạnh để kết luận rằng có mối liên hệ giữa giới tính và danh mục sản phẩm . Hai biến này có thể được gọi là không độc lập về mặt thống kê.

3.Thảo luận về bản chất của mối quan hệ

Bản chất của mối quan hệ này là một sự tương phản rõ nét: tình trạng hôn nhân “Đã kết hôn” đi kèm với khả năng sở hữu nhà cao hơn đáng kể, trong khi tình trạng hôn nhân “Độc thân” có tỷ lệ không sở hữu nhà cao hơn. Điều này nhất quán với các quan sát xã hội thông thường, nơi việc ổn định gia đình thường gắn liền với các quyết định tài chính quan trọng như việc mua và sở hữu nhà.

4.3 MaritalStatus và ProductFamily

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

  • Câu hỏi: những người đã kết hôn thường mua những nhóm sản phẩm nào?
# tạo bảng tần số 
e <- table( d1$MaritalStatus, d1$ProductFamily)
  • Bảng tần suất:
e0 <- prop.table(e, margin = 2) * 100
e0 <- round(e0,2)

Việc tính toán tỷ lệ phần trăm theo cột, mỗi ô sẽ cho biết: “Trong tổng số lượt mua của nhóm sản phẩm X (ví dụ: Drink), bao nhiêu phần trăm được thực hiện bởi người đã kết hôn (M) và bao nhiêu phần trăm được thực hiện bởi người độc thân (S).”

###Trực quan hóa

ggplot(d1, aes(x = MaritalStatus, fill = ProductFamily)) +
  geom_bar(position = "dodge") +
  labs(title = "Phân bố Tình trạng Hôn nhân theo Họ Sản phẩm",
       x = "Tình trạng Hôn nhân",
       y = "Số lượng",
       fill = "Họ Sản phẩm") +
  theme_minimal() 

4.3.2 Nhận xét:

  • Có vẻ như không có sự khác biệt đáng kể trong cơ cấu mua sắm các nhóm sản phẩm chính giữa người đã kết hôn (M) và người độc thân (S). Mối liên kết giữa hai biến này dường như không mạnh mẽ, hoặc ít nhất là không cho thấy xu hướng mua sắm rất khác biệt dựa trên tình trạng hôn nhân.

  • Đối với cả hai nhóm Tình trạng Hôn nhân (M và S):

    • Nhóm sản phẩm Food (Thực phẩm - màu xanh lá cây) chiếm tỷ lệ áp đảo về số lượng mua. Cả người đã kết hôn và người độc thân đều mua lượng thực phẩm rất lớn, với số lượng đều trên 5000 đơn vị.

    • Nhóm sản phẩm Non-Consumable (Không tiêu thụ - màu xanh dương) đứng thứ hai về số lượng mua, với số lượng mua của cả hai nhóm tình trạng hôn nhân đều dao động quanh mức 1300.

    • Nhóm sản phẩm Drink (Đồ uống - màu đỏ) có số lượng mua ít nhất trong ba nhóm, với số lượng của cả hai nhóm tình trạng hôn nhân đều ở mức khoảng 600-700.

  • Kết luận chung: mặc dù có thể có một chút chênh lệch nhỏ về số lượng tuyệt đối ở một số danh mục, nhưng cơ cấu mua sắm chính (tỷ trọng của từng loại sản phẩm trong tổng giỏ hàng) dường như rất giống nhau giữa người đã kết hôn và người độc thân. Cả hai nhóm đều tập trung mua Thực phẩm là chính, tiếp theo là Non-Consumable, và cuối cùng là Đồ uống. Điều này gợi ý rằng tình trạng hôn nhân có thể không phải là yếu tố quyết định mạnh mẽ đến việc lựa chọn các nhóm sản phẩm chính này.

4.3.3 Kiểm định thống kê

  • Phát biểu giả thuyết:
    • Giả thuyết \(H_0\): Hai biến MaritalStatus và ProductFamily là độc lập.
    • Giả thuyết \(H_1\): Hai biến MaritalStatus và ProductFamily là không độc lập.
chisq.test(e)
## 
##  Pearson's Chi-squared test
## 
## data:  e
## X-squared = 1.1617, df = 2, p-value = 0.5594

1.Báo cáo giá trị Chi - bình phương, bậc tự do và giá trị p:
* Giá trị Chi - bình phương (x-squared): 1.1617.
* Bậc tự do (df): 2
* Giá trị p (p-value):0.5594

2.Dựa vào giá trị p, đưa ra kết luận về tính độc lập của hai biến ở mức ý nghĩa \(\alpha=0.05\):

  • So sánh giá trị p (0.5594) với mức ý nghĩa \(\alpha=0.05\).
  • Vì p-value (0.5594) < \(\alpha(0.05)\), chúng không ta có đủ bằng chứng để bác bỏ giá thuyết \(H_0\).

Kết luận: ở mức ý nghĩa \(\alpha=0.05\), không có bằng chứng thống kê đủ mạnh để kết luận rằng có mối liên hệ giữa giới tính và danh mục sản phẩm . Hai biến này có thể được gọi là độc lập về mặt thống kê.

5 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

  • Đặc điểm phân bố của các biến định tính:

    • Gender: Tập dữ liệu có sự phân bổ giới tính khá cân bằng, với Nữ (F) chiếm khoảng 51% và Nam (M) chiếm 49% tổng số quan sát. Điều này thuận lợi cho việc phân tích, đảm bảo không có sự mất cân bằng đáng kể về giới tính làm sai lệch kết quả.

    • Homeowner: Có sự chênh lệch rõ rệt về quyền sở hữu nhà. Khoảng 60.06% cá nhân trong dữ liệu là chủ sở hữu nhà (Y), trong khi 39.94% không sở hữu nhà (N). Điều này cho thấy phần lớn các cá nhân được ghi nhận trong tập dữ liệu này là những người đã có tài sản nhà ở.

    • MaritalStatus: Tình trạng hôn nhân cũng có sự cân bằng tương đối giữa nhóm Đã kết hôn (M) và Độc thân (S), với Độc thân chiếm khoảng 51.17% và Đã kết hôn chiếm 48.83% tổng số quan sát. Tỷ lệ này gần 1:1, thuận lợi cho việc phân tích mối liên hệ.

    • AnnualIncome: Thu nhập hàng năm có sự phân bổ lệch về phía các khoảng thu nhập thấp và trung bình. Khoảng $30K - $50K chiếm tỷ lệ lớn nhất (khoảng 32.73%), tiếp theo là $10K - $30K (khoảng 21.98%). Các khoảng thu nhập cao hơn như $110K - $130K và $150K+ chiếm tỷ lệ rất nhỏ. Điều này ngụ ý rằng đối tượng khách hàng chủ yếu tập trung vào các cá nhân có mức thu nhập thấp và trung bình.

  • Mối quan hệ giữa các biến định tính:

    • Gender và ProductCategory: Dựa trên kiểm định Chi-bình phương (X-squared = 50.407, df = 44, p-value = 0.2349), với p-value lớn hơn α=0.05, không có bằng chứng thống kê đủ mạnh để kết luận có mối liên hệ giữa giới tính và danh mục sản phẩm. Hai biến này có thể được coi là độc lập. Mặc dù có những khác biệt quan sát được về mặt số lượng mua ở một số danh mục (ví dụ Nữ mua rau củ, đồ ăn vặt nhiều hơn, Nam mua thuốc thông mũi nhiều hơn), nhưng sự khác biệt này không đủ lớn để được coi là có ý nghĩa thống kê.

    • MaritalStatus và Homeowner: Dựa trên kiểm định Chi-bình phương (X-squared = 1241.2, df = 1, p-value < 2.2e-16), với p-value cực kỳ nhỏ (gần như bằng 0), có bằng chứng thống kê cực kỳ mạnh mẽ để bác bỏ giả thuyết độc lập. Điều này khẳng định có mối liên hệ có ý nghĩa thống kê giữa tình trạng hôn nhân và quyền sở hữu nhà. Bản chất của mối quan hệ này là những người đã kết hôn có xu hướng sở hữu nhà cao hơn đáng kể so với những người độc thân.

    • MaritalStatus và ProductFamily: Dựa trên kiểm định Chi-bình phương (X-squared = 1.1617, df = 2, p-value = 0.5594), với p-value lớn hơn α=0.05, không có bằng chứng thống kê đủ mạnh để kết luận có mối liên hệ giữa tình trạng hôn nhân và nhóm sản phẩm. Hai biến này có thể được coi là độc lập. Quan sát từ biểu đồ cũng cho thấy cả người đã kết hôn và người độc thân đều có mô hình mua sắm tương tự nhau, tập trung chủ yếu vào nhóm Food, sau đó là Non-Consumable và cuối cùng là Drink.

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

  • Giới hạn của việc chỉ phân tích biến định tính: Phân tích này chỉ tập trung vào các biến định tính và mối quan hệ giữa chúng. Việc không kết hợp các biến định lượng (ví dụ: số tiền chi tiêu, số lượng sản phẩm mua cụ thể) có thể hạn chế chiều sâu của các phát hiện về hành vi mua sắm.

  • Thiếu thông tin ngữ cảnh: Phân tích không có thông tin về mục tiêu kinh doanh cụ thể của doanh nghiệp, loại hình sản phẩm, hay thị trường mục tiêu, điều này có thể hạn chế khả năng đưa ra các đề xuất chiến lược chi tiết và phù hợp nhất.

5.3 Đề xuất

Về chiến lược marketing và phân loại sản phẩm:

  • Giới tính và Danh mục sản phẩm: Do không có mối liên hệ ý nghĩa thống kê giữa giới tính và danh mục sản phẩm, doanh nghiệp có thể cân nhắc không cần phải tùy chỉnh quá sâu các chiến lược marketing sản phẩm theo giới tính cho các danh mục sản phẩm rộng này. Thay vào đó, tập trung vào đặc điểm của bản thân sản phẩm hoặc các yếu tố khác.

  • Tình trạng hôn nhân và Sở hữu nhà: Đây là một mối liên hệ mạnh mẽ. Doanh nghiệp kinh doanh các sản phẩm/dịch vụ liên quan đến nhà ở (ví dụ: đồ gia dụng, nội thất, dịch vụ bảo trì nhà cửa, sản phẩm tiêu dùng gia đình số lượng lớn) có thể nhắm mục tiêu mạnh mẽ vào nhóm khách hàng đã kết hôn. Có thể thiết kế các gói sản phẩm, chương trình khuyến mãi dành riêng cho các gia đình hoặc chủ nhà.

  • Tình trạng hôn nhân và Nhóm sản phẩm: Do không có mối liên hệ ý nghĩa thống kê giữa tình trạng hôn nhân và nhóm sản phẩm (Drink, Food, Non-Consumable), các chiến lược phân loại và tiếp thị cho các nhóm sản phẩm rộng này có thể không cần phải quá khác biệt giữa người đã kết hôn và người độc thân. Cả hai nhóm đều là khách hàng tiềm năng lớn cho Food và Non-Consumable.

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

  • Mối quan hệ giữa Thu nhập và hành vi mua sắm/đặc điểm khác: Có mối liên hệ nào giữa thu nhập và các danh mục sản phẩm cụ thể (không chỉ nhóm sản phẩm rộng), hoặc thu nhập và quyền sở hữu nhà không?

  • Phân tích sâu hơn về các danh mục sản phẩm cụ thể: Mặc dù nhóm ProductFamily không có mối liên hệ với MaritalStatus, liệu có những danh mục sản phẩm cụ thể hơn bên trong các nhóm đó (ví dụ: các loại thực phẩm khác nhau, các loại đồ uống khác nhau) mà lại có mối liên hệ với giới tính hoặc tình trạng hôn nhân hay không?

LS0tDQp0aXRsZTogIk5oaeG7h20gduG7pSAyIg0KYXV0aG9yOiAicG5taW5oY2hhdSINCmRhdGU6ICIyMDI1LTA1LTI1Ig0Kb3V0cHV0Og0KICBodG1sX2RvY3VtZW50Og0KICAgIGNvZGVfZG93bmxvYWQ6IHRydWUNCiAgICBjb2RlX2ZvbGRpbmc6IGhpZGUNCiAgICBudW1iZXJfc2VjdGlvbnM6IHllcw0KICAgIHRoZW06ICJkZWZhdWx0Ig0KICAgIHRvY19kZXB0aDogMw0KICAgIHRvYzogdHJ1ZQ0KICAgIHRvY19mbG9hdDogdHJ1ZQ0KLS0tDQoNCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQ0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBUUlVFKQ0KYGBgDQoNCmBgYHtyLGVjaG89VFJVRX0NCmxpYnJhcnkoRFQpDQpsaWJyYXJ5KGRwbHlyKQ0KbGlicmFyeShnZ3Bsb3QyKQ0KbGlicmFyeShzdGF0cykNCmxpYnJhcnkocHN5Y2gpDQpgYGANCg0KIyAqKlBo4bqnbiAxOiBUw6xtIGhp4buDdSB2w6AgY2h14bqpbiBi4buLIGThu68gbGnhu4d1KiogICANCg0KIyMgKirEkOG7jWMgZOG7ryBsaeG7h3UqKiAgIA0KDQogQuG7mSBk4buvIGxp4buHdSBnaWFvIGThu4tjaCBzacOqdSB0aOG7iyBn4buTbSAxNDA1OSBxdWFuIHPDoXQgdsOgIDEwICBiaeG6v24gxJHhu4tuaCB0w61uaCwgY3VuZyBj4bqlcCB0aMO0bmcgdGluIGNoaSB0aeG6v3QgduG7gSBnaWFvIGThu4tjaCAobmfDoHkgbXVhLCBz4bqjbiBwaOG6qW0pIHbDoCBuaMOibiBraOG6qXUgaOG7jWMga2jDoWNoIGjDoG5nIChnaeG7m2kgdMOtbmgsIHRodSBuaOG6rXAsIMSR4buLYSBsw70pLiDEkMOieSBsw6Agbmd14buTbiBk4buvIGxp4buHdSBs4bubbiwgxJFhIGThuqFuZyBjaG8gcGjDom4gdMOtY2ggaMOgbmggdmkga2jDoWNoIGjDoG5nIHbDoCBz4bqjbiBwaOG6qW0uICAgDQogDQpgYGB7cixlY2hvPVRSVUV9DQpkIDwtIHJlYWQuY3N2KCdGOi9SL2RhdGExL1N1cGVybWFya2V0IFRyYW5zYWN0aW9ucy5jc3YnLGhlYWRlcj1UKQ0KDQojIEzhu41jIGThu68gbGnhu4d1IChjaOG7iSBnaeG7ryBjw6FjIGJp4bq/biDEkeG7i25oIHTDrW5oKQ0KZDEgPC0gc3Vic2V0KGQsIHNlbGVjdD0tYyhVbml0c1NvbGQsUmV2ZW51ZSxDaGlsZHJlbixDdXN0b21lcklEKSkNCg0KIyBIaeG7g24gdGjhu4sgY+G6pXUgdHLDumMgZOG7ryBsaeG7h3UNCnN0cihkMSkNCmBgYA0KDQogUXVhIHZp4buHYyB4ZW0geMOpdCBraeG7g3UgZOG7ryBsaeG7h3UgY+G7p2EgdOG7q25nIGJp4bq/biwgY8OzIHRo4buDIHRo4bqleSBy4bqxbmcgYuG7mSBk4buvIGxp4buHdSBuw6B5IGPhuqduIG3hu5l0IGLGsOG7m2MgdGnhu4FuIHjhu60gbMO9IMSRw6FuZyBr4buDIMSR4buDIGPDoWMgYmnhur9uIMSRxrDhu6NjIGfDoW4ga2nhu4N1IGThu68gbGnhu4d1IHBow7kgaOG7o3AgduG7m2kgbuG7mWkgZHVuZyB2w6AgbeG7pWMgxJHDrWNoIHBow6JuIHTDrWNoLiAgIA0KDQogQ+G7pSB0aOG7gywgY8OhYyBiaeG6v24gWCB2w6AgQ3VzdG9tZXJJRCBoaeG7h24gxJFhbmcg4bufIGtp4buDdSBpbnRlZ2VyIChz4buRIG5ndXnDqm4pIHbDoCDEkcOieSBsw6Aga2nhu4N1IGThu68gbGnhu4d1IHBow7kgaOG7o3AgY2hvIGPDoWMgYmnhur9uIGNo4buJIG3hu6VjIGhv4bq3YyDEkeG7i25oIGRhbmguICAgDQoNCiBUdXkgbmhpw6puLCBwaOG6p24gbOG7m24gY8OhYyBiaeG6v24gY8OybiBs4bqhaSDEkWFuZyDhu58ga2nhu4N1IGNoYXJhY3RlciAoY2h14buXaSBrw70gdOG7sSkgbmjGsG5nIGzhuqFpIMSR4bqhaSBkaeG7h24gY2hvIHRow7RuZyB0aW4gxJHhu4tuaCB0w61uaCBob+G6t2MgbmfDoHkgdGjDoW5nLCBj4bqnbiDEkcaw4bujYyBjaHV54buDbiDEkeG7lWkgc2FuZyBjw6FjIGtp4buDdSBwaMO5IGjhu6NwIGjGoW4uICAgDQogDQoqKioNCg0KKiAqKlF1YW4gc8OhdCBk4buvIGxp4buHdSoqICAgDQoNCmBgYHtyLGVjaG89VFJVRX0NCiMgSGnhu4NuIHRo4buLIDEwIGTDsm5nIMSR4bqndSBk4buvIGxp4buHdQ0KcHJpbnQoIjEwIGTDsm5nIMSR4bqndSBj4bunYSBi4buZIGThu68gbGnhu4d1IikNCnogPC0gaGVhZChkMSwxMCkNCmRhdGF0YWJsZSh6KQ0KDQojIEhp4buDbiB0aOG7iyAxMCBkw7JuZyBjdeG7kWkgZOG7ryBsaeG7h3UNCnByaW50KCIxMCBkw7JuZyBjdeG7kWkgY+G7p2EgYuG7mSBk4buvIGxp4buHdSIpDQp6MSA8LSB0YWlsKGQxLDEwKQ0KZGF0YXRhYmxlKHoxKQ0KYGBgDQoqKioNCg0KKiAqKktp4buDbSB0cmEgdsOgIHjhu60gbMO9IGThu68gbGnhu4d1IHRoaeG6v3UqKiAgIA0KDQpgYGB7cixlY2hvPVRSVUV9DQojIEtp4buDbSB0cmEgYuG7mSBk4buvIGxp4buHdSBjw7MgZ2nDoSB0cuG7iyB0aGnhur91IChOQSkgaGF5IGtow7RuZy4NCnByaW50KCJLaeG7g20gdHJhIGLhu5kgZOG7ryBsaeG7h3UgY8OzIGPDoWMgZ2nDoSB0cuG7iyB0aGnhur91IGhheSBraMO0bmc6IikNCnoyIDwtIGlzLm5hKGQxKQ0KZGF0YXRhYmxlKHoyKQ0KIyDEkOG6v20gdOG7lW5nIHPhu5EgbMaw4bujbmcgZ2nDoSB0cuG7iyB0aGnhur91IChOQSkNCnByaW50KCJU4buVbmcgc+G7kSBsxrDhu6NuZyBjw6FjIGdpw6EgdHLhu4sgdGhp4bq/dToiKQ0Kc3VtKGlzLm5hKGQxKSkNCg0KIyBUw6xtIHJhIGPDoWMgduG7iyB0csOtIGPhu6dhIGPDoWMgZ2nDoSB0cuG7iyB0aGnhur91IChOQSkNCnByaW50KCJW4buLIHRy4buLIGPhu6dhIGPDoWMgZ2nDoSB0cuG7iyB0aGnhur91OiIpDQp3aGljaChpcy5uYShkMSkpDQoNCmBgYA0KIEvhur90IHF14bqjIGNobyB0aOG6pXkgcuG6sW5nIGLhu5kgZOG7ryBsaeG7h3Uga2jDtG5nIGNo4bupYSBi4bqldCBr4buzIGdpw6EgdHLhu4sgdGhp4bq/dSAoTkEpIG7DoG8uICAgDQoNCg0KKiAqKkNodXnhu4NuIMSR4buVaSBjw6FjIGJp4bq/biBj4bqnbiB0aGnhur90IHNhbmcga2nhu4N1IGZhY3RvcioqICAgDQoNCiDhu54gcGjhuqduIMSR4buNYyBk4buvIGxp4buHdSwga2hpIHRo4buxYyBoaeG7h24gaMOgbSBzdHIoKSBr4bq/dCBxdeG6oyB0aHUgxJHGsOG7o2MgY2hvIHRhIHRo4bqleSBo4bqndSBo4bq/dCBjw6FjIGJp4bq/biDEkeG7i25oIHTDrW5oIMSRYW5nIOG7nyBraeG7g3UgZOG7ryBsaeG7h3UgY2hhcmFjdGVyIChjaHXhu5dpIGvDvSB04buxKSBuaMawbmcgbOG6oWkgxJHhuqFpIGRp4buHbiBjaG8gdGjDtG5nIHRpbiDEkeG7i25oIHTDrW5oLCBjaG8gdGjhuqV5IMSRxrDhu6NjIGPDoWMgYmnhur9uIGPhuqduIMSRxrDhu6NjIGNodXnhu4NuIMSR4buVaSBzYW5nIGtp4buDdSBk4buvIGxp4buHdSBwaMO5IGjhu6NwIGjGoW4gbmjGsCBmYWN0b3IuICAgDQogDQpgYGB7cixlY2hvPVRSVUV9DQojIEzGsHUgZGFuaCBzw6FjaCBjw6FjIGJp4bq/biBj4bqnbiBjaHV54buDbiDEkeG7lWkgdsOgbyBt4buZdCB2ZWN0b3IgcmnDqm5nDQp6MyA8LSBjKCJHZW5kZXIiLCAiTWFyaXRhbFN0YXR1cyIsICJIb21lb3duZXIiLCJBbm51YWxJbmNvbWUiLCAiQ2l0eSIsICJTdGF0ZW9yUHJvdmluY2UiLCAiQ291bnRyeSIsICJQcm9kdWN0RmFtaWx5IiwgIlByb2R1Y3REZXBhcnRtZW50IiwgIlByb2R1Y3RDYXRlZ29yeSIpDQoNCiMgQ2h1eeG7g24gxJHhu5VpIGtp4buDdSBk4buvIGxp4buHdQ0KZDEgPC0gZDEgJT4lIG11dGF0ZShhY3Jvc3MoYWxsX29mKHozKSwgYXMuZmFjdG9yKSkNCiAjIHRvw6FuIHThu60gJT4lIDogdHJ1eeG7gW4gZDEgdsOgbyBow6BtIG11dGF0ZQ0KICMgbXV0YXRlKCk6IHRoYXkgxJHhu5VpIGJp4bq/biBoaeG7h24gY8OzIGLhurFuZyBjw6FjaCDDoXAgZOG7pW5nIG3hu5l0IGjDoG0gdsOgIGvhur90IHF14bqjIMSRw6ggbMOqbiBjaMOtbmggY+G7mXQgxJHDsy4NCiAjIGFjcm9zcygpOiBkw7luZyDEkeG7gyDDoXAgZOG7pW5nIGjDoG0gYXMuZmFjdG9yIGNobyBuaGnhu4F1IGPhu5l0Lg0KICNhbGxfb2YoKTogY2jhu4kgxJHhu4tuaCBjw6FjIGPhu5l0IGLhurFuZyB0w6puIMSRxrDhu6NjIGzGsHUgdHLhu68gdHJvbmcgdmVjdG9yLg0KDQojIEhp4buDbiB0aOG7iyBj4bqldSB0csO6YyBk4buvIGxp4buHdQ0KcHJpbnQoIkPhuqV1IHRyw7pjIGThu68gbGnhu4d1OiIpDQpzdHIoZDEpDQpgYGANCg0KIFNhdSBraGkgY2h1eeG7g24gxJHhu5VpIHThu6sgY2hhcmFjdGVyIHNhbmcgZmFjdG9yLCBj4bqldSB0csO6YyBk4buvIGxp4buHdSDEkcOjIMSRxrDhu6NjIGPhuqNpIHRoaeG7h24gxJHDoW5nIGvhu4MuIEjhuqd1IGjhur90IGPDoWMgYmnhur9uIMSR4buLbmggdMOtbmggxJHDoyDEkcO6bmcga2nhu4N1LCB04buRaSDGsHUgYuG7mSBuaOG7myB2w6Agc+G6tW4gc8OgbmcgY2hvIHBow6JuIHTDrWNoLiAgIA0KIA0KIyAqKlBo4bqnbiAyOiBQaMOibiB0w61jaCBNw7QgdOG6oyBN4buZdCBiaeG6v24gxJDhu4tuaCB0w61uaCAoVW5pdmFydWF0ZSBEZXNjcmlwdGl2ZSBBbmFseXNpcykqKiAgIA0KDQojIyAqKkJp4bq/biBIb21lb3duZXIqKiAgIA0KDQoqIELhuqNuZyB04bqnbiBz4buROiAgICANCmBgYHtyLGVjaG89VFJVRX0NCnRhYmxlKGQxJEhvbWVvd25lcikNCmBgYA0KDQoqIELhuqNuZyB04bqnbiBzdeG6pXQ6ICAgDQpgYGB7cixlY2hvPVRSVUV9DQpmIDwtIHRhYmxlKGQxJEhvbWVvd25lcikvc3VtKG5yb3coZDEpKQ0KcHJpbnQoZikNCmBgYA0KVuG6rXkgdHJvbmcgYuG7mSBk4buvIGxp4buHdSBuw6B5IGPDsyBgciB0YWJsZShkMSRIb21lb3duZXIpWzFdL3N1bShucm93KGQxKSkqMTAwYFwlIGtow7RuZyBz4bufIGjhu691IG5ow6AgdsOgICBgciB0YWJsZShkMSRIb21lb3duZXIpIFsyXS9zdW0obnJvdyhkMSkpKjEwMGBcJSBjw7Mgc+G7nyBo4buvdSBuaMOgLiAgIA0KDQoqIEJp4buDdSDEkeG7kzogICANCmBgYHtyLGVjaG89VFJVRX0NCnBpZShmLA0KICAgIGxhYmVscyA9IHBhc3RlKG5hbWVzKGYpLCByb3VuZChmLCAyKSwgIiUiKSwNCiAgICBtYWluID0gIkJp4buDdSDEkeG7kyB0csOybjogVOG7tyBs4buHIEhvbWVvd25lIikgDQoNCiMgKiBwaWUoKTogaMOgbSB24bq9IGJp4buDdSDEkeG7kyB0csOybiB0aOG7gyBoaeG7h24gdOG7tyBs4buHIGPhu6dhIGPDoWMgdGjDoG5oIHBo4bqnbiBzbyB24bubaSB04buVbmcgdGjhu4MgIA0KIyBmOiB2ZWN0b3IgbXXhu5FuIHRo4buDIGhp4buHbiBkxrDhu5tpIGThuqFuZyBiaeG7g3UgxJHhu5MuICAgDQojIGxhYmVsczogY2jhu4kgxJHhu4tuaCBjw6FjIG5ow6NuIMSRxrDhu6NjIGhp4buDbiB0aOG7iy4gICANCiMgcGFzdGUgKCk6IGjDoG0gZ2jDqXAgY8OhYyBjaHXhu5dpIGvDvSB04buxIGzhuqFpIHbhu5tpIG5oYXUuICAgDQojIG5hbWVzKGYpOiB0cuG6oyB24buBIHTDqm4gY+G7p2EgY8OhYyB0aMOgbmggcGjhuqduIHRyb25nIGYuICAgDQojIHJvdW5kKGYpOiBsw6BtIHRyw7JuIGPDoWMgZ2nDoSB0cuG7iyB0cm9uZyB2ZWN0b3IgZiDEkeG6v24gbeG7mXQgY2jhu68gc+G7kSB0aOG6rXAgcGjDom4gbmjhuqV0IMSR4buLbmguIHJvdW5kKGYsMik6IGzDoG0gdHLDsm4gY8OhYyB04bu3IGzhu4cgdHJvbmcgZiDEkeG6v24gMiBjaOG7ryBz4buRIHRo4bqtcCBwaMOibi4gICANCiMgbWFpbjogdMOqbiBj4bunYSBiaeG7g3UgxJHhu5MuDQpgYGANCiBE4buxYSB0csOqbiBwaMOibiB0w61jaCBiaeG6v24gIkhvbWVvd25lciIsIGNow7puZyB0YSBjw7MgdGjhu4MgcsO6dCByYSBt4buZdCBz4buRIG5o4bqtbiB4w6l0IHF1YW4gdHLhu41uZyB24buBIMSR4bq3YyDEkWnhu4NtIGPhu6dhIGLhu5kgZOG7ryBsaeG7h3UuIEJp4bq/biBuw6B5IHBow6JuIGxv4bqhaSBjw6FjIGPDoSBuaMOibiBk4buxYSB0csOqbiB0w6xuaCB0cuG6oW5nIHPhu58gaOG7r3UgbmjDoCwgduG7m2kgaGFpIG5ow7NtIGNow61uaCBsw6AgIk4iIChraMO0bmcgc+G7nyBo4buvdSBuaMOgKSB2w6AgIlkiIChjw7Mgc+G7nyBo4buvdSBuaMOgKS4gICANCg0KIFF1YW4gc8OhdCB04burIGLhuqNuZyB04bqnbiBz4buRLCBjw7MgNTYxNSBjw6EgbmjDom4gdGh14buZYyBuaMOzbSAiTiIgdsOgIDg0NDQgY8OhIG5ow6JuIHRodeG7mWMgbmjDs20gIlkiLiBLaGkgY2h1eeG7g24gc2FuZyB04bu3IGzhu4csIGLhuqNuZyB04bqnbiBzdeG6pXQgY2hvIHRo4bqleSBuaMOzbSAiTiIgY2hp4bq/bSBraG/huqNuZyAzOS45NCUgdOG7lW5nIHPhu5EgcXVhbiBzw6F0LCB0cm9uZyBraGkgbmjDs20gIlkiIGNoaeG6v20gcGjhuqduIGzhu5tuIGjGoW4gduG7m2kga2hv4bqjbmcgNjAuMDYlLiBCaeG7g3UgxJHhu5MgdHLDsm4gIlThu7cgbOG7hyBIb21lb3duZSIgY8WpbmcgbWluaCBo4buNYSByw7UgcsOgbmcgdOG7tyBs4buHIG7DoHkgduG7m2kgMC40JSAoaG/hurdjIDQwJSkgY2hvICJOIiB2w6AgMC42JSAoaG/hurdjIDYwJSkgY2hvICJZIiwgeMOhYyBuaOG6rW4gc+G7sSBwaMOibiBi4buVIGThu68gbGnhu4d1LiAgIA0KDQogUsO1IHLDoG5nLCBo4bqhbmcgbeG7pWMgIlkiIChjw7Mgc+G7nyBo4buvdSBuaMOgKSBjaGnhur9tIMawdSB0aOG6vyDEkcOhbmcga+G7gyB0cm9uZyBi4buZIGThu68gbGnhu4d1IG7DoHkuIEPDsyBt4buZdCBz4buxIGNow6puaCBs4buHY2ggbOG7m24gZ2nhu69hIGhhaSBo4bqhbmcgbeG7pWMsIGtoaSBz4buRIGzGsOG7o25nIHbDoCB04bu3IGzhu4cgbmfGsOG7nWkgc+G7nyBo4buvdSBuaMOgIGNhbyBoxqFuIHLDtSBy4buHdCBzbyB24bubaSBuZ8aw4budaSBraMO0bmcgc+G7nyBo4buvdSBuaMOgLiDEkGnhu4F1IG7DoHkgY2hvIHRo4bqleSBy4bqxbmcgcGjhuqduIGzhu5tuIGPDoWMgY8OhIG5ow6JuIMSRxrDhu6NjIGdoaSBuaOG6rW4gdHJvbmcgYuG7mSBk4buvIGxp4buHdSBuw6B5IGzDoCBuaOG7r25nIG5nxrDhu51pIMSRw6MgY8OzIHTDoGkgc+G6o24gbmjDoCDhu58uICAgDQogDQoqKiogICANCg0KIyMgKipCaeG6v24gR2VuZGVyKiogDQoNCiogQuG6o25nIHThuqduIHPhu5E6ICAgIA0KYGBge3IsZWNobz1UUlVFfQ0KdGFibGUoZDEkR2VuZGVyKQ0KYGBgDQoNCiogQuG6o25nIHThuqduIHN14bqldDogICANCmBgYHtyLGVjaG89VFJVRX0NCmEgPC0gdGFibGUoZDEkR2VuZGVyKS9zdW0obnJvdyhkMSkpDQpwcmludChhKQ0KYGBgDQoNCiBW4bqteSB0cm9uZyBi4buZIGThu68gbGnhu4d1IG7DoHkgY8OzIGByIHRhYmxlKGQxJEdlbmRlcilbMV0vc3VtKG5yb3coZDEpKSoxMDBgXCUgbuG7ryB2w6AgIGByIHRhYmxlKGQxJEdlbmRlcikgWzJdL3N1bShucm93KGQxKSkqMTAwYFwlIG5hbS4gIA0KDQoqIEJp4buDdSDEkeG7kzogICANCmBgYHtyLGVjaG89VFJVRX0NCnBpZShhLA0KICAgIGxhYmVscyA9IHBhc3RlKG5hbWVzKGEpLCByb3VuZChhLCAyKSwgIiUiKSwNCiAgICBtYWluID0gIkJp4buDdSDEkeG7kyB0csOybjogVOG7tyBs4buHIEdlbmRlciIpIA0KYGBgDQoNCiBE4buxYSB0csOqbiBwaMOibiB0w61jaCBiaeG6v24gIkdlbmRlciIsIGNow7puZyB0YSBjw7MgdGjhu4Mgbmjhuq1uIHjDqXQgduG7gSBwaMOibiBi4buVIGdp4bubaSB0w61uaCB0cm9uZyBi4buZIGThu68gbGnhu4d1LiBCaeG6v24gbsOgeSBwaMOibiBsb+G6oWkgY8OhYyBjw6EgbmjDom4gdGjDoG5oIGhhaSBuaMOzbSBjaMOtbmggbMOgICJGIiAoTuG7rykgdsOgICJNIiAoTmFtKS4gICANCg0KIFThu6sgYuG6o25nIHThuqduIHPhu5EsIGPDsyA3MTcwIGPDoSBuaMOibiBsw6AgbuG7ryB2w6AgNjg4OSBjw6EgbmjDom4gbMOgIG5hbS4gS2hpIGNodXnhu4NuIHNhbmcgdOG7tyBs4buHLCBi4bqjbmcgdOG6p24gc3XhuqV0IGNobyB0aOG6pXkgbuG7ryBnaeG7m2kgKEYpIGNoaeG6v20ga2hv4bqjbmcgNTEuMDAlIHThu5VuZyBz4buRIHF1YW4gc8OhdCwgdHJvbmcga2hpIG5hbSBnaeG7m2kgKE0pIGNoaeG6v20ga2hv4bqjbmcgNDkuMDAlLiBCaeG7g3UgxJHhu5MgdHLDsm4gIlThu7cgbOG7hyBHZW5kZXIiIGPFqW5nIG1pbmggaOG7jWEgcsO1IHLDoG5nIHThu7cgbOG7hyBuw6B5IHbhu5tpIDAuNTElIChob+G6t2MgNTElKSBjaG8gbuG7ryB2w6AgMC40OSUgKGhv4bq3YyA0OSUpIGNobyBuYW0sIHRo4buDIGhp4buHbiBz4buxIG5o4bqldCBxdcOhbiBnaeG7r2EgY8OhYyBow6xuaCB0aOG7qWMgdHLDrG5oIGLDoHkgZOG7ryBsaeG7h3UuICAgDQoNCiBOaMOsbiBjaHVuZywgxJHhurdjIMSRaeG7g20gY2jDrW5oIGLhuqFuIHF1YW4gc8OhdCDEkcaw4bujYyBsw6Agc+G7sSBwaMOibiBi4buVIGdp4bubaSB0w61uaCB0xrDGoW5nIMSR4buRaSBjw6JuIGLhurFuZyB0cm9uZyBi4buZIGThu68gbGnhu4d1LiBN4bq3YyBkw7kgaOG6oW5nIG3hu6VjICJGIiAoTuG7rykgY8OzIG3hu5l0IGNow7p0IMawdSB0aOG6vyB24buBIHPhu5EgbMaw4bujbmcgdsOgIHThu7cgbOG7hyBzbyB24bubaSBo4bqhbmcgbeG7pWMgIk0iIChOYW0pLCBuaMawbmcgc+G7sSBjaMOqbmggbOG7h2NoIG7DoHkga2jDtG5nIMSRw6FuZyBr4buDLiBU4bu3IGzhu4cgZ2nhu69hIG7hu68gdsOgIG5hbSBn4bqnbiBuaMawIDE6MSwgY2hvIHRo4bqleSBi4buZIGThu68gbGnhu4d1IG7DoHkgY8OzIHPhu7EgxJHhuqFpIGRp4buHbiBraMOhIMSR4buTbmcgxJHhu4F1IGPhu6dhIGPhuqMgaGFpIGdp4bubaSB0w61uaC4gxJBp4buBdSBuw6B5IHLhuqV0IHRodeG6rW4gbOG7o2kgY2hvIGPDoWMgcGjDom4gdMOtY2ggdGnhur9wIHRoZW8sIMSR4bqjbSBi4bqjbyBy4bqxbmcga2jDtG5nIGPDsyBz4buxIG3huqV0IGPDom4gYuG6sW5nIMSRw6FuZyBr4buDIHbhu4EgZ2nhu5tpIHTDrW5oIGPDsyB0aOG7gyBsw6BtIHNhaSBs4buHY2gga+G6v3QgcXXhuqMuICAgDQogDQoqKioNCg0KIyMgKipCaeG6v24gTWFyaXRhbFN0YXR1cyoqICAgDQoNCiogQuG6o25nIHThuqduIHPhu5E6ICAgIA0KYGBge3IsZWNobz1UUlVFfQ0KdGFibGUoZDEkTWFyaXRhbFN0YXR1cykNCmBgYA0KDQoqIELhuqNuZyB04bqnbiBzdeG6pXQ6ICAgDQpgYGB7cixlY2hvPVRSVUV9DQpiIDwtIHRhYmxlKGQxJE1hcml0YWxTdGF0dXMpL3N1bShucm93KGQxKSkNCnByaW50KGIpDQpgYGANCiBW4bqteSB0cm9uZyBi4buZIGThu68gbGnhu4d1IG7DoHkgY8OzIGByIHRhYmxlKGQxJE1hcml0YWxTdGF0dXMpWzFdL3N1bShucm93KGQxKSkqMTAwYFwlIMSRw6Mga+G6v3QgaMO0biB2w6AgIGByIHRhYmxlKGQxJE1hcml0YWxTdGF0dXMpIFsyXS9zdW0obnJvdyhkMSkpKjEwMGBcJSDEkeG7mWMgdGjDom4uICANCg0KKiBCaeG7g3UgxJHhu5M6ICAgDQpgYGB7cixlY2hvPVRSVUV9DQpwaWUoYiwNCiAgICBsYWJlbHMgPSBwYXN0ZShuYW1lcyhiKSwgcm91bmQoYiwgMiksICIlIiksDQogICAgbWFpbiA9ICJCaeG7g3UgxJHhu5MgdHLDsm46IFThu7cgbOG7hyBNYXJpdGFsU3RhdHVzIikgDQpgYGANCg0KIEJp4bq/biAiTWFyaXRhbFN0YXR1cyIgKFTDrG5oIHRy4bqhbmcgaMO0biBuaMOibikgdHJvbmcgYuG7mSBk4buvIGxp4buHdSBwaMOibiBsb+G6oWkgY8OhYyBjw6EgbmjDom4gdGjDoG5oIGhhaSBuaMOzbSBjaMOtbmggbMOgICJNIiAoxJDDoyBr4bq/dCBow7RuKSB2w6AgIlMiICjEkOG7mWMgdGjDom4pLiAgIA0KDQogVOG7qyBi4bqjbmcgdOG6p24gc+G7kSwgY8OzIDY4NjYgY8OhIG5ow6JuIMSRw6Mga+G6v3QgaMO0biAoTSkgdsOgIDcxOTMgY8OhIG5ow6JuIMSR4buZYyB0aMOibiAoUykuIEtoaSB4ZW0geMOpdCB04bu3IGzhu4csIGLhuqNuZyB04bqnbiBzdeG6pXQgY2hvIHRo4bqleSBuaMOzbSAiTSIgY2hp4bq/bSBraG/huqNuZyA0OC44MyUgdOG7lW5nIHPhu5EgcXVhbiBzw6F0LCB0cm9uZyBraGkgbmjDs20gIlMiIGNoaeG6v20gdOG7tyBs4buHIGzhu5tuIGjGoW4gbeG7mXQgY2jDunQgduG7m2kga2hv4bqjbmcgNTEuMTclLiBCaeG7g3UgxJHhu5MgdHLDsm4gIlThu7cgbOG7hyBNYXJpdGFsU3RhdHVzIiBjxaluZyBtaW5oIGjhu41hIHLDtSByw6BuZyBz4buxIHBow6JuIGLhu5UgbsOgeSwgduG7m2kgMC40OSUgKGhv4bq3YyA0OSUpIGNobyAiTSIgdsOgIDAuNTElIChob+G6t2MgNTElKSBjaG8gIlMiLCB4w6FjIG5o4bqtbiBz4buxIG5o4bqldCBxdcOhbiBnaeG7r2EgY8OhYyBow6xuaCB0aOG7qWMgdHLDrG5oIGLDoHkgZOG7ryBsaeG7h3UuICAgDQoNCiDEkOG6t2MgxJFp4buDbSBjaMOtbmggcXVhbiBzw6F0IMSRxrDhu6NjIGzDoCBz4buxIGPDom4gYuG6sW5nIHTGsMahbmcgxJHhu5FpIGdp4buvYSBoYWkgdMOsbmggdHLhuqFuZyBow7RuIG5ow6JuIHRyb25nIGLhu5kgZOG7ryBsaeG7h3UuIE3hurdjIGTDuSBo4bqhbmcgbeG7pWMgIlMiICjEkOG7mWMgdGjDom4pIGPDsyBt4buZdCBjaMO6dCDGsHUgdGjhur8gduG7gSBz4buRIGzGsOG7o25nIHbDoCB04bu3IGzhu4cgc28gduG7m2kgaOG6oW5nIG3hu6VjICJNIiAoxJDDoyBr4bq/dCBow7RuKSwgbmjGsG5nIHPhu7EgY2jDqm5oIGzhu4djaCBuw6B5IGtow7RuZyDEkcOhbmcga+G7gy4gVOG7tyBs4buHIGdp4buvYSBuZ8aw4budaSDEkeG7mWMgdGjDom4gdsOgIG5nxrDhu51pIMSRw6Mga+G6v3QgaMO0biBn4bqnbiBuaMawIDE6MSwgY2hvIHRo4bqleSBi4buZIGThu68gbGnhu4d1IG7DoHkgY8OzIHPhu7EgxJHhuqFpIGRp4buHbiBraMOhIMSR4buTbmcgxJHhu4F1IGPhu6dhIGPhuqMgaGFpIG5ow7NtLiDEkGnhu4F1IG7DoHkgY8OzIGzhu6NpIGNobyBjw6FjIHBow6JuIHTDrWNoIHNhdSBuw6B5LCB2w6wgbsOzIHRyw6FuaCDEkcaw4bujYyB0w6xuaCB0cuG6oW5nIG3huqV0IGPDom4gYuG6sW5nIGThu68gbGnhu4d1IGPDsyB0aOG7gyDhuqNuaCBoxrDhu59uZyDEkeG6v24ga+G6v3QgcXXhuqMgbcO0IGjDrG5oIGhv4bq3YyB0aOG7kW5nIGvDqiBsacOqbiBxdWFuIMSR4bq/biB0w6xuaCB0cuG6oW5nIGjDtG4gbmjDom4uICAgDQogDQoqKioNCg0KIyMgKipCaeG6v24gQW5udWFsSW5jb21lKiogICANCg0KKiBC4bqjbmcgdOG6p24gc+G7kTogICAgDQpgYGB7cixlY2hvPVRSVUV9DQogdGFibGUoZDEkQW5udWFsSW5jb21lKQ0KYGBgDQoNCiogQuG6o25nIHThuqduIHN14bqldDogICANCmBgYHtyLGVjaG89VFJVRX0NCmwgPC0gdGFibGUoZDEkQW5udWFsSW5jb21lKS9zdW0obnJvdyhkMSkpDQpwcmludChsKQ0KYGBgDQogVuG6rXkgdHJvbmcgYuG7mSBk4buvIGxp4buHdSBuw6B5IGPDszogICANCmByIHRhYmxlKGQxJEFubnVhbEluY29tZSlbMV0vc3VtKG5yb3coZDEpKSoxMDBgXCUgY8OhIG5ow6JuIGPDsyB0aHUgbmjhuq1wIHRodeG7mWMga2hv4bqjbmcgJDEwSyAtICQzMEsgOyAgIA0KYHIgdGFibGUoZDEkQW5udWFsSW5jb21lKSBbMl0vc3VtKG5yb3coZDEpKSoxMDBgXCUgY8OhIG5ow6JuIGPDsyB0aHUgbmjhuq1wIHRodeG7mWMga2hv4bqjbmcgJDExMEsgLSAkMTMwSzsgICANCmByIHRhYmxlKGQxJEFubnVhbEluY29tZSkgWzNdL3N1bShucm93KGQxKSkqMTAwYFwlIGPDoSBuaMOibiBjw7MgdGh1IG5o4bqtcCB0aHXhu5ljIGtob+G6o25nICQxMzBLIC0gJDE1MEs7ICAgDQpgciB0YWJsZShkMSRBbm51YWxJbmNvbWUpIFs0XS9zdW0obnJvdyhkMSkpKjEwMGBcJSBjw6EgbmjDom4gY8OzIHRodSBuaOG6rXAgdGh14buZYyBraG/huqNuZyAkMTUwSyArOyAgIA0KYHIgdGFibGUoZDEkQW5udWFsSW5jb21lKSBbNV0vc3VtKG5yb3coZDEpKSoxMDBgXCUgY8OhIG5ow6JuIGPDsyB0aHUgbmjhuq1wIHRodeG7mWMga2hv4bqjbmcgJDUwSyAtICQ3MEsgOyAgIA0KYHIgdGFibGUoZDEkQW5udWFsSW5jb21lKSBbNl0vc3VtKG5yb3coZDEpKSoxMDBgXCUgY8OhIG5ow6JuIGPDsyB0aHUgbmjhuq1wIHRodeG7mWMga2hv4bqjbmcgJDcwSyAtICQ5MEs7ICAgDQpgciB0YWJsZShkMSRBbm51YWxJbmNvbWUpIFs4XS9zdW0obnJvdyhkMSkpKjEwMGBcJSBjw6EgbmjDom4gY8OzIHRodSBuaOG6rXAgdGh14buZYyBraG/huqNuZyAkOTBLIC0gJDExMEs7ICAgDQoNCiogQmnhu4N1IMSR4buTOiAgIA0KYGBge3IsZWNobz1UUlVFfQ0KcGllKGwsDQogICAgbGFiZWxzID0gcGFzdGUobmFtZXMobCksIHJvdW5kKGwsIDIpLCAiJSIpLA0KICAgIG1haW4gPSAiQmnhu4N1IMSR4buTIHRyw7JuOiBU4bu3IGzhu4cgQW5udWFsSW5jb21lIikgDQpgYGANCg0KIEJp4bq/biAiQW5udWFsSW5jb21lIiAoVGh1IG5o4bqtcCBow6BuZyBuxINtKSB0cm9uZyBi4buZIGThu68gbGnhu4d1IMSRxrDhu6NjIHBow6JuIGxv4bqhaSB0aMOgbmggbmhp4buBdSBraG/huqNuZyBraMOhYyBuaGF1LCBjaG8gcGjDqXAgY2jDum5nIHRhIHBow6JuIHTDrWNoIHPhu7EgcGjDom4gYuG7lSB0aHUgbmjhuq1wIGPhu6dhIGPDoWMgY8OhIG5ow6JuLiBDw6FjIGtob+G6o25nIHRodSBuaOG6rXAgYmFvIGfhu5NtIHThu6sgdGjhuqVwIG5o4bqldCAoJDEwSyAtICQzMEspIMSR4bq/biBjYW8gbmjhuqV0ICgkMTUwSyArKS4gICANCg0KIFThu6sgYuG6o25nIHThuqduIHPhu5EsIGNow7puZyB0YSBjw7MgdGjhu4MgdGjhuqV5IHPhu5EgbMaw4bujbmcgY8OhIG5ow6JuIHRyb25nIHThu6tuZyBraG/huqNuZyB0aHUgbmjhuq1wLiBD4bulIHRo4buDLCBraG/huqNuZyB0aHUgbmjhuq1wIHBo4buVIGJp4bq/biBuaOG6pXQgbMOgICQzMEsgLSAkNTBLIHbhu5tpIDQ2MDEgY8OhIG5ow6JuLCB0aeG6v3AgdGhlbyBsw6Aga2hv4bqjbmcgJDEwSyAtICQzMEsgduG7m2kgMzA5MCBjw6EgbmjDom4uIEPDoWMga2hv4bqjbmcgdGh1IG5o4bqtcCBjYW8gaMahbiBuaMawICQxMTBLIC0gJDEzMEssICQxMzBLIC0gJDE1MEssIHbDoCAkMTUwSyArIGPDsyBz4buRIGzGsOG7o25nIGPDoSBuaMOibiDDrXQgaMahbiDEkcOhbmcga+G7gy4gICANCg0KIEtoaSB4ZW0geMOpdCB04bu3IGzhu4csIGLhuqNuZyB04bqnbiBzdeG6pXQgY2hvIHRo4bqleSBraG/huqNuZyAkMzBLIC0gJDUwSyBjaGnhur9tIHThu7cgbOG7hyBs4bubbiBuaOG6pXQgduG7m2kga2hv4bqjbmcgMzIuNzMlLiBLaG/huqNuZyAkMTBLIC0gJDMwSyDEkeG7qW5nIHRo4bupIGhhaSB24bubaSBraG/huqNuZyAyMS45OCUuIEPDoWMga2hv4bqjbmcgdGh1IG5o4bqtcCBjw7JuIGzhuqFpIGPDsyB04bu3IGzhu4cgdGjhuqVwIGjGoW4gbmhp4buBdSwgxJHhurdjIGJp4buHdCBsw6Aga2hv4bqjbmcgJDE1MEsgKyBjaOG7iSBjaGnhur9tIGtob+G6o25nIDEuOTQlLiBCaeG7g3UgxJHhu5MgdHLDsm4gIlThu7cgbOG7hyBBbm51YWxJbmNvbWUiIGPFqW5nIG1pbmggaOG7jWEgcsO1IHLDoG5nIHPhu7EgcGjDom4gYuG7lSBuw6B5LCB24bubaSAwLjMzJSAoaG/hurdjIDMzJSkgY2hvICQzMEsgLSAkNTBLIHbDoCAwLjIyJSAoaG/hurdjIDIyJSkgY2hvICQxMEsgLSAkMzBLLiAgIA0KDQogxJDhurdjIMSRaeG7g20gY2jDrW5oIHF1YW4gc8OhdCDEkcaw4bujYyBsw6Agc+G7sSBwaMOibiBi4buVIHRodSBuaOG6rXAgbOG7h2NoIHbhu4EgcGjDrWEgY8OhYyBraG/huqNuZyB0aHUgbmjhuq1wIHRo4bqlcCB2w6AgdHJ1bmcgYsOsbmguIEjhuqFuZyBt4bulYyAkMzBLIC0gJDUwSyBjaGnhur9tIMawdSB0aOG6vyByw7UgcuG7h3QgbmjhuqV0IHRyb25nIGLhu5kgZOG7ryBsaeG7h3UsIGNobyB0aOG6pXkgxJHDonkgbMOgIG5ow7NtIHRodSBuaOG6rXAgcGjhu5UgYmnhur9uIG5o4bqldC4gQ8OzIHPhu7EgY2jDqm5oIGzhu4djaCBs4bubbiBnaeG7r2EgY8OhYyBo4bqhbmcgbeG7pWMgdGh1IG5o4bqtcCwgduG7m2kgcGjhuqduIGzhu5tuIGPDoWMgY8OhIG5ow6JuIHThuq1wIHRydW5nIOG7nyBjw6FjIGtob+G6o25nIHRodSBuaOG6rXAgZMaw4bubaSAkNzBLLCB2w6AgbeG7mXQgdOG7tyBs4buHIHLhuqV0IG5o4buPIOG7nyBjw6FjIGtob+G6o25nIHRodSBuaOG6rXAgY2FvIGjGoW4gJDExMEsuIMSQaeG7gXUgbsOgeSBuZ+G7pSDDvSBy4bqxbmcgYuG7mSBk4buvIGxp4buHdSBjaOG7pyB54bq/dSB04bqtcCB0cnVuZyB2w6BvIGPDoWMgY8OhIG5ow6JuIGPDsyBt4bupYyB0aHUgbmjhuq1wIHRo4bqlcCB2w6AgdHJ1bmcgYsOsbmguICAgIA0KIA0KKioqIA0KDQojIyAqKkJp4bq/biBDaXR5KiogICANCg0KKiBC4bqjbmcgdOG6p24gc+G7kTogICAgDQpgYGB7cixlY2hvPVRSVUV9DQogdGFibGUoZDEkQ2l0eSkNCmBgYA0KDQoqIELhuqNuZyB04bqnbiBzdeG6pXQ6ICAgDQpgYGB7cixlY2hvPVRSVUV9DQprIDwtIHRhYmxlKGQxJENpdHkpL3N1bShucm93KGQxKSkNCnByaW50KGspDQpgYGANClbhuq15IHRyb25nIGLhu5kgZOG7ryBsaeG7h3UgbsOgeSBjw7M6ICAgDQpgciB0YWJsZShkMSRDaXR5KVsxXS9zdW0obnJvdyhkMSkpKjEwMGBcJSBjw6EgbmjDom4gc2luaCBz4buRbmcg4bufIEFjYXB1bGNvOyAgIA0KYHIgdGFibGUoZDEkQ2l0eSlbMl0vc3VtKG5yb3coZDEpKSoxMDBgXCUgY8OhIG5ow6JuIHNpbmggc+G7kW5nIOG7nyBCZWxsaW5naGFtOyAgIA0KYHIgdGFibGUoZDEkQ2l0eSlbM10vc3VtKG5yb3coZDEpKSoxMDBgXCUgY8OhIG5ow6JuIHNpbmggc+G7kW5nIOG7nyBCZXZlcmx5IEhpbGxzOyAgIA0KYHIgdGFibGUoZDEkQ2l0eSlbNF0vc3VtKG5yb3coZDEpKSoxMDBgXCUgY8OhIG5ow6JuIHNpbmggc+G7kW5nIOG7nyBCcmVtZXJ0b247ICAgDQpgciB0YWJsZShkMSRDaXR5KVs1XS9zdW0obnJvdyhkMSkpKjEwMGBcJSBjw6EgbmjDom4gc2luaCBz4buRbmcg4bufIENhbWFjaG87ICAgDQpgciB0YWJsZShkMSRDaXR5KVs2XS9zdW0obnJvdyhkMSkpKjEwMGBcJSBjw6EgbmjDom4gc2luaCBz4buRbmcg4bufIEd1YWRhbGFqYXJhOyAgIA0KYHIgdGFibGUoZDEkQ2l0eSlbN10vc3VtKG5yb3coZDEpKSoxMDBgXCUgY8OhIG5ow6JuIHNpbmggc+G7kW5nIOG7nyBIaWRhbGdvOyAgIA0KYHIgdGFibGUoZDEkQ2l0eSlbOF0vc3VtKG5yb3coZDEpKSoxMDBgXCUgY8OhIG5ow6JuIHNpbmggc+G7kW5nIOG7nyBMb3MgQW5nZWxlczsgICANCmByIHRhYmxlKGQxJENpdHkpWzldL3N1bShucm93KGQxKSkqMTAwYFwlIGPDoSBuaMOibiBzaW5oIHPhu5FuZyDhu58gTWVyaWRhOyAgIA0KYHIgdGFibGUoZDEkQ2l0eSlbMTBdL3N1bShucm93KGQxKSkqMTAwYFwlIGPDoSBuaMOibiBzaW5oIHPhu5FuZyDhu58gTWV4aWNvIENpdHk7ICAgDQpgciB0YWJsZShkMSRDaXR5KVsxMV0vc3VtKG5yb3coZDEpKSoxMDBgXCUgY8OhIG5ow6JuIHNpbmggc+G7kW5nIOG7nyBPcml6YWJhOyAgIA0KYHIgdGFibGUoZDEkQ2l0eSlbMTJdL3N1bShucm93KGQxKSkqMTAwYFwlIGPDoSBuaMOibiBzaW5oIHPhu5FuZyDhu58gUG9ydGxhbmQ7ICAgDQpgciB0YWJsZShkMSRDaXR5KVsxM10vc3VtKG5yb3coZDEpKSoxMDBgXCUgY8OhIG5ow6JuIHNpbmggc+G7kW5nIOG7nyBTYWxlbTsgICANCmByIHRhYmxlKGQxJENpdHkpWzE0XS9zdW0obnJvdyhkMSkpKjEwMGBcJSBjw6EgbmjDom4gc2luaCBz4buRbmcg4bufIFNhbiBBbmRyZXM7ICAgDQpgciB0YWJsZShkMSRDaXR5KVsxNV0vc3VtKG5yb3coZDEpKSoxMDBgXCUgY8OhIG5ow6JuIHNpbmggc+G7kW5nIOG7nyBTYW4gRGllZ287ICAgDQpgciB0YWJsZShkMSRDaXR5KVsxNl0vc3VtKG5yb3coZDEpKSoxMDBgXCUgY8OhIG5ow6JuIHNpbmggc+G7kW5nIOG7nyBTYW4gRnJhbmNpc2NvOyAgIA0KYHIgdGFibGUoZDEkQ2l0eSlbMTddL3N1bShucm93KGQxKSkqMTAwYFwlIGPDoSBuaMOibiBzaW5oIHPhu5FuZyDhu58gU2VhdHRsZTsgICANCmByIHRhYmxlKGQxJENpdHkpWzE4XS9zdW0obnJvdyhkMSkpKjEwMGBcJSBjw6EgbmjDom4gc2luaCBz4buRbmcg4bufIFNwb2thbmU7ICAgDQpgciB0YWJsZShkMSRDaXR5KVsxOV0vc3VtKG5yb3coZDEpKSoxMDBgXCUgY8OhIG5ow6JuIHNpbmggc+G7kW5nIOG7nyBUYWNvbWE7ICAgDQpgciB0YWJsZShkMSRDaXR5KVsyMF0vc3VtKG5yb3coZDEpKSoxMDBgXCUgY8OhIG5ow6JuIHNpbmggc+G7kW5nIOG7nyBWYW5jb3V2ZXI7ICAgDQpgciB0YWJsZShkMSRDaXR5KVsyMV0vc3VtKG5yb3coZDEpKSoxMDBgXCUgY8OhIG5ow6JuIHNpbmggc+G7kW5nIOG7nyBWaWN0b3JpYTsgICANCmByIHRhYmxlKGQxJENpdHkpWzIyXS9zdW0obnJvdyhkMSkpKjEwMGBcJSBjw6EgbmjDom4gc2luaCBz4buRbmcg4bufIFdhbGxhIFdhbGxhOyAgIA0KYHIgdGFibGUoZDEkQ2l0eSlbMjNdL3N1bShucm93KGQxKSkqMTAwYFwlIGPDoSBuaMOibiBzaW5oIHPhu5FuZyDhu58gWWFraW1hLiAgIA0KDQoqKioNCg0KKiBCaeG7g3UgxJHhu5M6ICAgDQoNCmBgYHtyLGVjaG89VFJVRX0NCnRhYmxlKGQxJENpdHkpICU+JSBhcy5kYXRhLmZyYW1lKCkgLT5vMg0KY29sbmFtZXMobzIpPC1jKCJ2YWx1ZSIsImNvdW50IikNCg0KZ2dwbG90KG8yLCBhZXMoeCA9IHZhbHVlLCB5ID0gY291bnQsIGZpbGwgPSB2YWx1ZSkpICsNCiAgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIpICsgIGNvb3JkX2ZsaXAoKSArDQogIGdlb21fdGV4dChhZXMobGFiZWwgPSBjb3VudCksIHZqdXN0ID0gLTAuMywgc2l6ZSA9IDIuNSkgKw0KICBsYWJzKHRpdGxlID0gIkJp4buDdSDEkeG7kyBDaXR5ICIsIHggPSAiQ2l0eSIsIHkgPSAiU+G7kSBsxrDhu6NuZyIpICsNCiAgdGhlbWVfbWluaW1hbCgpDQpgYGANCg0KICBCaeG6v24gIkNpdHkiIHRyb25nIGLhu5kgZOG7ryBsaeG7h3UgdGjhu4MgaGnhu4duIHRow6BuaCBwaOG7kSBuxqFpIGPDoWMgY8OhIG5ow6JuIHNpbmggc+G7kW5nLiBDw7MgcuG6pXQgbmhp4buBdSB0aMOgbmggcGjhu5Ega2jDoWMgbmhhdSDEkcaw4bujYyBsaeG7h3Qga8OqLCBjaG8gdGjhuqV5IHPhu7EgcGjDom4gYuG7lSDEkeG7i2EgbMO9IHLhu5luZyBj4bunYSB04bqtcCBraMOhY2ggaMOgbmcuICAgDQoNCiAgVOG7qyBi4bqjbmcgdOG6p24gc+G7kSwgY2jDum5nIHRhIGPDsyB0aOG7gyB0aOG6pXkgc+G7kSBsxrDhu6NuZyBjw6EgbmjDom4g4bufIG3hu5dpIHRow6BuaCBwaOG7kS4gUXVhbiBzw6F0IG5oYW5oIGNobyB0aOG6pXkgbeG7mXQgc+G7kSB0aMOgbmggcGjhu5EgY8OzIHThuqduIHPhu5EgeHXhuqV0IGhp4buHbiBjYW8gaMahbiDEkcOhbmcga+G7gyBzbyB24bubaSBuaOG7r25nIHRow6BuaCBwaOG7kSBraMOhYy4gVsOtIGThu6UsIExvcyBBbmdlbGVzIGPDsyA5MjYgY8OhIG5ow6JuLCBUYWNvbWEgY8OzIDEyNTcgY8OhIG5ow6JuLCBTZWF0dGxlIGPDsyA5MjIgY8OhIG5ow6JuLCBQb3J0bGFuZCBjw7MgODc2IGPDoSBuaMOibiwgdsOgIFNhbiBEaWVnbyBjw7MgODY2IGPDoSBuaMOibi4gTmfGsOG7o2MgbOG6oWksIG3hu5l0IHPhu5EgdGjDoG5oIHBo4buRIG5oxrAgR3VhZGFsYWphcmEgKDc1IGPDoSBuaMOibikgaG/hurdjIFZpY3RvcmlhICgxNzYgY8OhIG5ow6JuKSBjw7Mgc+G7kSBsxrDhu6NuZyDDrXQgaMahbiBuaGnhu4F1LiAgIA0KDQogIEtoaSB4ZW0geMOpdCB04bu3IGzhu4cgKHThuqduIHN14bqldCksIGPDoWMgdGjDoG5oIHBo4buRIGPDsyBz4buRIGzGsOG7o25nIGPDoSBuaMOibiBjYW8gbmjhuqV0IGPFqW5nIGPDsyB04bu3IGzhu4cgcGjhuqduIHRyxINtIGzhu5tuIG5o4bqldC4gVsOtIGThu6UsIFRhY29tYSBjaGnhur9tIGtob+G6o25nIDguOTQlIHThu5VuZyBz4buRIHF1YW4gc8OhdCwgTG9zIEFuZ2VsZXMga2hv4bqjbmcgNi41OCUsIFNlYXR0bGUga2hv4bqjbmcgNi41NiUsIHbDoCBQb3J0bGFuZCBraG/huqNuZyA2LjIzJS4gQ8OhYyB0aMOgbmggcGjhu5Ega2jDoWMgY8OzIHThu7cgbOG7hyB0aOG6pXAgaMahbiBuaGnhu4F1LCBt4buZdCBz4buRIGNo4buJIGNoaeG6v20gZMaw4bubaSAxJSAodsOtIGThu6U6IEd1YWRhbGFqYXJhIGNo4buJIDAuNTMlKS4gICANCg0KICDEkOG6t2MgxJFp4buDbSBjaMOtbmggcXVhbiBzw6F0IMSRxrDhu6NjIGzDoCBz4buxIHBow6JuIGLhu5UgY8OhIG5ow6JuIGtow7RuZyDEkeG7k25nIMSR4buBdSBnaeG7r2EgY8OhYyB0aMOgbmggcGjhu5EuIEjhuqFuZyBt4bulYyBUYWNvbWEgdsOgIExvcyBBbmdlbGVzIGPDuW5nIHbhu5tpIG3hu5l0IHPhu5EgdGjDoG5oIHBo4buRIGzhu5tuIGtow6FjIG5oxrAgU2VhdHRsZSwgUG9ydGxhbmQsIFNhbiBEaWVnbywgQmVsbGluZ2hhbSwgdsOgIEJyZW1lcnRvbiAoa2hpIHThu5VuZyBo4bujcCkgY2hp4bq/bSDGsHUgdGjhur8gxJHDoW5nIGvhu4MgduG7gSBz4buRIGzGsOG7o25nIHbDoCB04bu3IGzhu4cuIEPDsyBz4buxIGNow6puaCBs4buHY2ggcuG6pXQgbOG7m24gZ2nhu69hIGPDoWMgaOG6oW5nIG3hu6VjOiB0cm9uZyBraGkgbeG7mXQgc+G7kSB0aMOgbmggcGjhu5EgdOG6rXAgdHJ1bmcgxJHDtG5nIMSR4bqjbyBkw6JuIGPGsCB0cm9uZyBi4buZIGThu68gbGnhu4d1LCBuaGnhu4F1IHRow6BuaCBwaOG7kSBraMOhYyBjaOG7iSBjw7MgcuG6pXQgw610IMSR4bqhaSBkaeG7h24uIMSQaeG7gXUgbsOgeSBjaG8gdGjhuqV5IGLhu5kgZOG7ryBsaeG7h3UgY8OzIHRo4buDIHThuq1wIHRydW5nIHbDoG8gbeG7mXQgc+G7kSBraHUgduG7sWMgxJHDtCB0aOG7iyBs4bubbiBuaOG6pXQgxJHhu4tuaCwgduG7m2kgw610IGThu68gbGnhu4d1IHThu6sgY8OhYyBraHUgduG7sWMgbmjhu48gaMahbi4gICANCiAgDQoqKioNCiMjICoqQmnhur9uIFN0YXRlb3JQcm92aW5jZSoqICAgICANCg0KKiBC4bqjbmcgdOG6p24gc+G7kTogICAgDQpgYGB7cixlY2hvPVRSVUV9DQogdGFibGUoZDEkU3RhdGVvclByb3ZpbmNlKQ0KYGBgDQoqIELhuqNuZyB04bqnbiBzdeG6pXQ6ICAgDQpgYGB7cixlY2hvPVRSVUV9DQpzIDwtIHRhYmxlKGQxJFN0YXRlb3JQcm92aW5jZSkvc3VtKG5yb3coZDEpKQ0KcHJpbnQocykNCmBgYA0KduG6rXkgdHJvbmcgYuG7mSBk4buvIGxp4buHdSBuw6B5IGPDszogICANCmByIHRhYmxlKGQxJFN0YXRlb3JQcm92aW5jZSlbMV0vc3VtKG5yb3coZDEpKSoxMDBgXCUgY8OhIG5ow6JuIHNpbmggc+G7kW5nIOG7nyBiYW5nIFdBOyAgIA0KYHIgdGFibGUoZDEkU3RhdGVvclByb3ZpbmNlKVsyXS9zdW0obnJvdyhkMSkpKjEwMGBcJSBjw6EgbmjDom4gc2luaCBz4buRbmcg4bufIGJhbmcgQ0E7ICAgDQpgciB0YWJsZShkMSRTdGF0ZW9yUHJvdmluY2UpWzNdL3N1bShucm93KGQxKSkqMTAwYFwlIGPDoSBuaMOibiBzaW5oIHPhu5FuZyDhu58gYmFuZyBPUjsgICANCmByIHRhYmxlKGQxJFN0YXRlb3JQcm92aW5jZSlbNF0vc3VtKG5yb3coZDEpKSoxMDBgXCUgY8OhIG5ow6JuIHNpbmggc+G7kW5nIOG7nyBiYW5nIEJDOyAgIA0KYHIgdGFibGUoZDEkU3RhdGVvclByb3ZpbmNlKVs1XS9zdW0obnJvdyhkMSkpKjEwMGBcJSBjw6EgbmjDom4gc2luaCBz4buRbmcg4bufIGJhbmcgREY7ICAgDQpgciB0YWJsZShkMSRTdGF0ZW9yUHJvdmluY2UpWzZdL3N1bShucm93KGQxKSkqMTAwYFwlIGPDoSBuaMOibiBzaW5oIHPhu5FuZyDhu58gYmFuZyBHdWVycmVybzsgICANCmByIHRhYmxlKGQxJFN0YXRlb3JQcm92aW5jZSlbN10vc3VtKG5yb3coZDEpKSoxMDBgXCUgY8OhIG5ow6JuIHNpbmggc+G7kW5nIOG7nyBiYW5nIEphbGlzY287ICAgDQpgciB0YWJsZShkMSRTdGF0ZW9yUHJvdmluY2UpWzhdL3N1bShucm93KGQxKSkqMTAwYFwlIGPDoSBuaMOibiBzaW5oIHPhu5FuZyDhu58gYmFuZyBWZXJhY3J1ejsgICANCmByIHRhYmxlKGQxJFN0YXRlb3JQcm92aW5jZSlbOV0vc3VtKG5yb3coZDEpKSoxMDBgXCUgY8OhIG5ow6JuIHNpbmggc+G7kW5nIOG7nyBiYW5nIFl1Y2F0YW47ICAgDQpgciB0YWJsZShkMSRTdGF0ZW9yUHJvdmluY2UpWzEwXS9zdW0obnJvdyhkMSkpKjEwMGBcJSBjw6EgbmjDom4gc2luaCBz4buRbmcg4bufIGJhbmcgWsOiY3RlY2FzLiAgIA0KDQoqIEJp4buDdSDEkeG7kzogICANCmBgYHtyLGVjaG89VFJVRX0NCnBpZShzLA0KICAgIGxhYmVscyA9IHBhc3RlKG5hbWVzKHMpLCByb3VuZChzLCAyKSwgIiUiKSwNCiAgICBtYWluID0gIkJp4buDdSDEkeG7kyB0csOybjogVOG7tyBs4buHIFN0YXRlb3JQcm92aW5jZSIpIA0KYGBgDQoNCiAgQmnhur9uIFN0YXRlb3JQcm92aW5jZSAoQmFuZy9U4buJbmgpIHRyb25nIGLhu5kgZOG7ryBsaeG7h3UgcGjDom4gbG/huqFpIGPDoWMgY8OhIG5ow6JuIHRow6BuaCBuaGnhu4F1IG5ow7NtIGNow61uaCwgdsOtIGThu6UgbmjGsCAiV0EiLCAiQ0EiLCAiT1IiLCAiQkMiLCAiREYiLCAiR3VlcnJlcm8iLCAiSmFsaXNjbyIsICJWZXJhY3J1eiIsICJZdWNhdGFuIiB2w6AgIlphY2F0ZWNhcyIuICAgDQoNCiAgVOG7qyBi4bqjbmcgdOG6p24gc+G7kSwgV0EgY8OzIHPhu5EgbMaw4bujbmcgcXVhbiBzw6F0IGNhbyBuaOG6pXQgduG7m2kgNDU2NyBjw6EgbmjDom4sIHRp4bq/cCB0aGVvIGzDoCBDQSB24bubaSAyNzMzIGPDoSBuaMOibiB2w6AgT1IgduG7m2kgMjI2MiBjw6EgbmjDom4uIE5nxrDhu6NjIGzhuqFpLCBKYWxpc2NvIGzDoCBo4bqhbmcgbeG7pWMgY8OzIHPhu5EgbMaw4bujbmcgcXVhbiBzw6F0IHRo4bqlcCBuaOG6pXQgY2jhu4kgduG7m2kgNzUgY8OhIG5ow6JuLiBLaGkgeGVtIHjDqXQgdOG7tyBs4buHLCBi4bqjbmcgdOG6p24gc3XhuqV0IGNobyB0aOG6pXkgbmjDs20gIldBIiBjaGnhur9tIGtob+G6o25nIDMyLjQ4JSB04buVbmcgc+G7kSBxdWFuIHPDoXQsICJDQSIgY2hp4bq/bSAxOS40NCUsIHbDoCAiT1IiIGNoaeG6v20gMTYuMDklLiBCaeG7g3UgxJHhu5MgdHLDsm4gIlThu7cgbOG7hyBTdGF0ZW9yUHJvdmluY2UiIGPFqW5nIG1pbmggaOG7jWEgcsO1IHLDoG5nIHPhu7EgcGjDom4gYuG7kSBuw6B5LCB24bubaSAzMi40OCUgY2hvICJXQSIsIDE5LjQ0JSBjaG8gIkNBIiwgMTYuMDklIGNobyAiT1IiLCB2w6AgY8OhYyB04bu3IGzhu4cgcuG6pXQgbmjhu48gY2hvIGPDoWMgaOG6oW5nIG3hu6VjIGtow6FjLCB4w6FjIG5o4bqtbiBz4buxIG5o4bqldCBxdcOhbiBnaeG7r2EgY8OhYyBow6xuaCB0aOG7qWMgdHLDrG5oIGLDoHkgZOG7ryBsaeG7h3UuICAgDQoNCiAgxJDhurdjIMSRaeG7g20gY2jDrW5oIHF1YW4gc8OhdCDEkcaw4bujYyBsw6Agc+G7sSBt4bqldCBjw6JuIGLhurFuZyByw7UgcuG7h3QgZ2nhu69hIGPDoWMgYmFuZy904buJbmggdHJvbmcgYuG7mSBk4buvIGxp4buHdS4gSOG6oW5nIG3hu6VjICJXQSIgY2hp4bq/bSDGsHUgdGjhur8gdsaw4bujdCB0cuG7mWkgduG7gSBz4buRIGzGsOG7o25nIHbDoCB04bu3IGzhu4csIHRoZW8gc2F1IGzDoCAiQ0EiIHbDoCAiT1IiLiBDw7Mgc+G7sSBjaMOqbmggbOG7h2NoIHLhuqV0IGzhu5tuIGdp4buvYSBjw6FjIGjhuqFuZyBt4bulYywga2hpIG3hu5l0IHbDoGkgYmFuZy904buJbmggKG5oxrAgV0EsIENBLCBPUikgY2hp4bq/bSBwaOG6p24gbOG7m24gxJHDoW5nIGvhu4MgZOG7ryBsaeG7h3UsIHRyb25nIGtoaSBjw6FjIGJhbmcvdOG7iW5oIGtow6FjICh2w60gZOG7pSBKYWxpc2NvLCBHdWVycmVybywgVmVyYWNydXopIGNo4buJIGPDsyBz4buxIMSR4bqhaSBkaeG7h24gcuG6pXQgbmjhu48uIMSQaeG7gXUgbsOgeSBjw7MgdGjhu4Mg4bqjbmggaMaw4bufbmcgxJHhur9uIGPDoWMgcGjDom4gdMOtY2ggc2F1IG7DoHksIHbDrCBuw7MgY2hvIHRo4bqleSBk4buvIGxp4buHdSBjw7Mgc+G7sSB04bqtcCB0cnVuZyBt4bqhbmggdsOgbyBt4buZdCBz4buRIGtodSB24buxYyBuaOG6pXQgxJHhu4tuaCwgY8OzIGto4bqjIG7Eg25nIGfDonkgcmEgc2FpIGzhu4djaCBob+G6t2MgZ2nhuqNtIMSR4buZIHRpbiBj4bqteSBj4bunYSBtw7QgaMOsbmggxJHhu5FpIHbhu5tpIGPDoWMgbmjDs20gY8OzIMOtdCBk4buvIGxp4buHdS4gICAgICANCiAgDQoqKioNCg0KIyMgKipCaeG6v24gQ291bnRyeSoqICAgIA0KDQoqIELhuqNuZyB04bqnbiBz4buROiAgICANCmBgYHtyLGVjaG89VFJVRX0NCiB0YWJsZShkMSRDb3VudHJ5KQ0KYGBgDQoqIELhuqNuZyB04bqnbiBzdeG6pXQ6ICAgDQpgYGB7cixlY2hvPVRSVUV9DQpjIDwtIHRhYmxlKGQxJENvdW50cnkpL3N1bShucm93KGQxKSkNCnByaW50KGMpDQpgYGANCnbhuq15IHRyb25nIGLhu5kgZOG7ryBsaeG7h3UgbsOgeSBjw7M6ICAgDQpgciB0YWJsZShkMSRDb3VudHJ5KVsxXS9zdW0obnJvdyhkMSkpKjEwMGBcJSBjw6EgbmjDom4gc2luaCBz4buRbmcg4bufIENhbmFkYTsgICANCmByIHRhYmxlKGQxJENvdW50cnkpIFsyXS9zdW0obnJvdyhkMSkpKjEwMGBcJSBjw6EgbmjDom4gc2luaCBz4buRbmcg4bufIE1leGljbzsgICANCmByIHRhYmxlKGQxJENvdW50cnkpIFszXS9zdW0obnJvdyhkMSkpKjEwMGBcJSBjw6EgbmjDom4gc2luaCBz4buRbmcg4bufIFVTQS4gICANCg0KKiBCaeG7g3UgxJHhu5M6ICAgDQpgYGB7cixlY2hvPVRSVUV9DQpwaWUoYywNCiAgICBsYWJlbHMgPSBwYXN0ZShuYW1lcyhjKSwgcm91bmQoYywgMiksICIlIiksDQogICAgbWFpbiA9ICJCaeG7g3UgxJHhu5MgdHLDsm46IFThu7cgbOG7hyBDb3VudHJ5IikgDQpgYGANCg0KICBU4burIGLhuqNuZyB04bqnbiBz4buRLCBiaeG6v24gQ291bnRyeSBjaG8gdGjhuqV5IGPDsyBiYSBxdeG7kWMgZ2lhIGNow61uaCB0cm9uZyBi4buZIGThu68gbGnhu4d1IGzDoCBDYW5hZGEsIE1leGljbyB2w6AgVVNBLiBUcm9uZyDEkcOzLCBVU0EgbMOgIHF14buRYyBnaWEgY8OzIHPhu5EgbMaw4bujbmcgcXVhbiBzw6F0IGNhbyBuaOG6pXQgduG7m2kgOTU2MiBi4bqjbiBnaGksIE1leGljbyDEkeG7qW5nIHRo4bupIGhhaSB24bubaSAzNjg4IGLhuqNuIGdoaSwgdsOgIENhbmFkYSBjw7Mgc+G7kSBsxrDhu6NuZyB0aOG6pXAgbmjhuqV0IHbhu5tpIDgwOSBi4bqjbiBnaGkuIFBow6JuIHTDrWNoIGLhuqNuZyB04bqnbiBzdeG6pXQgdsOgIGJp4buDdSDEkeG7kyB0csOybiB4w6FjIG5o4bqtbiBz4buxIHBow6JuIGLhu5EgbsOgeTogVVNBIGNoaeG6v20gdOG7tyBs4buHIMOhcCDEkeG6o28gduG7m2kgMC42ODAxMzM3MiAodOG7qWMga2hv4bqjbmcgNjguMDElKSwgTWV4aWNvIGNoaeG6v20gMC4yNjIzMjMwNyAoa2hv4bqjbmcgMjYuMjMlKSwgdsOgIENhbmFkYSBjaGnhur9tIDAuMDU3NTQzMjEgKGtob+G6o25nIDUuNzUlKS4gVVNBIHLDtSByw6BuZyBsw6AgaOG6oW5nIG3hu6VjIGNoaeG6v20gxrB1IHRo4bq/IHbGsOG7o3QgdHLhu5lpIHRyb25nIGLhu5kgZOG7ryBsaeG7h3UuIEPDsyBz4buxIGNow6puaCBs4buHY2ggcuG6pXQgbOG7m24gZ2nhu69hIGPDoWMgaOG6oW5nIG3hu6VjLCBraGkgdOG7tyBs4buHIGPhu6dhIFVTQSBs4bubbiBoxqFuIGfhuqVwIMSRw7RpIHNvIHbhu5tpIE1leGljbyB2w6AgbOG7m24gaMahbiBraG/huqNuZyAxMCBs4bqnbiBzbyB24bubaSBDYW5hZGEuIMSQaeG7gXUgbsOgeSBjaG8gdGjhuqV5IGThu68gbGnhu4d1IHRyb25nIHThuq1wIG7DoHkgY2jhu6cgeeG6v3UgxJHhur9uIHThu6sgSG9hIEvhu7MsIHbDoCBjw6FjIHBow6JuIHTDrWNoIHNhdSBuw6B5IGPDsyB0aOG7gyBi4buLIOG6o25oIGjGsOG7n25nIGLhu59pIHPhu7EgxJHhuqFpIGRp4buHbiBraMO0bmcgxJHhu5NuZyDEkeG7gXUgbsOgeSwgxJHhurdjIGJp4buHdCBraGkgc3V5IGx14bqtbiB24buBIGPDoWMgcXXhu5FjIGdpYSBjw7MgdOG7tyBs4buHIHRo4bqlcCBoxqFuLiAgICAgIA0KICANCioqKiAgIA0KDQojIyAqKkJp4bq/biBQcm9kdWN0RmFtaWx5KiogICAgDQoqIELhuqNuZyB04bqnbiBz4buROiAgICANCmBgYHtyLGVjaG89VFJVRX0NCiB0YWJsZShkMSRQcm9kdWN0RmFtaWx5KQ0KYGBgDQoqIELhuqNuZyB04bqnbiBzdeG6pXQ6ICAgDQpgYGB7cixlY2hvPVRSVUV9DQp2IDwtIHRhYmxlKGQxJFByb2R1Y3RGYW1pbHkpL3N1bShucm93KGQxKSkNCnByaW50KHYpDQpgYGANCnbhuq15IHRyb25nIGLhu5kgZOG7ryBsaeG7h3UgbsOgeSBjw7M6ICAgIA0KYHIgdGFibGUoZDEkUHJvZHVjdEZhbWlseSlbMV0vc3VtKG5yb3coZDEpKSoxMDBgXCUgc+G6o24gcGjhuqltIHRodeG7mWMgbmjDs20gRHJpbms7ICAgDQpgciB0YWJsZShkMSRQcm9kdWN0RmFtaWx5KSBbMl0vc3VtKG5yb3coZDEpKSoxMDBgXCUgc+G6o24gcGjhuqltIHRodeG7mWMgbmjDs20gRm9vZDsgICANCmByIHRhYmxlKGQxJFByb2R1Y3RGYW1pbHkpIFszXS9zdW0obnJvdyhkMSkpKjEwMGBcJSBz4bqjbiBwaOG6qW0gdGh14buZYyBuaMOzbSBOb24tQ29uc3VtYWJsZS4gICAgIA0KDQoqIEJp4buDdSDEkeG7kzogICANCmBgYHtyLGVjaG89VFJVRX0NCnBpZSh2LA0KICAgIGxhYmVscyA9IHBhc3RlKG5hbWVzKHYpLCByb3VuZCh2LCAyKSwgIiUiKSwNCiAgICBtYWluID0gIkJp4buDdSDEkeG7kyB0csOybjogVOG7tyBs4buHIFByb2R1Y3RGYW1pbHkgIikgDQpgYGANCg0KICBCaeG6v24gUHJvZHVjdEZhbWlseSAoTmjDs20gc+G6o24gcGjhuqltKSB0cm9uZyBi4buZIGThu68gbGnhu4d1IHBow6JuIGxv4bqhaSBjw6FjIHPhuqNuIHBo4bqpbSB0aMOgbmggYmEgbmjDs20gY2jDrW5oIGzDoCAiRHJpbmsiICjEkOG7kyB14buRbmcpLCAiRm9vZCIgKFRo4buxYyBwaOG6qW0pLCB2w6AgIk5vbi1Db25zdW1hYmxlIiAoS2jDtG5nIHRpw6p1IGTDuW5nKS4gICANCg0KICBU4burIGLhuqNuZyB04bqnbiBz4buRLCBjw7MgMTAxNTMgc+G6o24gcGjhuqltIHRodeG7mWMgbmjDs20gIkZvb2QiLCAyNjU2IHPhuqNuIHBo4bqpbSB0aHXhu5ljIG5ow7NtICJOb24tQ29uc3VtYWJsZSIsIHbDoCAxMjUwIHPhuqNuIHBo4bqpbSB0aHXhu5ljIG5ow7NtICJEcmluayIuIEtoaSB4ZW0geMOpdCB04bu3IGzhu4csIGLhuqNuZyB04bqnbiBzdeG6pXQgY2hvIHRo4bqleSBuaMOzbSAiRm9vZCIgY2hp4bq/bSB04bu3IGzhu4cgw6FwIMSR4bqjbyB24bubaSAwLjcyMjE3MDg1ICh04bupYyA3Mi4yMiUpIHThu5VuZyBz4buRIHF1YW4gc8OhdC4gTmjDs20gIk5vbi1Db25zdW1hYmxlIiDEkeG7qW5nIHRo4bupIGhhaSB24bubaSAwLjE4ODkxODEzICh04bupYyAxOC44OSUpLCB2w6AgbmjDs20gIkRyaW5rIiBjaGnhur9tIHThu7cgbOG7hyB0aOG6pXAgbmjhuqV0IHbhu5tpIDAuMDg4OTExMDIgKHThu6ljIDguODklKS4gQmnhu4N1IMSR4buTIHRyw7JuIChkw7kgbmjDo24gbMOgICJDb3VudHJ5IiBuaMawbmcgZOG7ryBsaeG7h3UgcGjhuqNuIMOhbmggIlByb2R1Y3RGYW1pbHkiKSBjxaluZyBtaW5oIGjhu41hIHLDtSByw6BuZyBz4buxIHBow6JuIGLhu5EgbsOgeSwgduG7m2kgMC43MiUgKGhv4bq3YyA3MiUpIGNobyAiRm9vZCIsIDAuMTklIChob+G6t2MgMTklKSBjaG8gIk5vbi1Db25zdW1hYmxlIiwgdsOgIDAuMDklIChob+G6t2MgOSUpIGNobyAiRHJpbmsiLCB4w6FjIG5o4bqtbiBz4buxIG5o4bqldCBxdcOhbiBnaeG7r2EgY8OhYyBow6xuaCB0aOG7qWMgdHLDrG5oIGLDoHkgZOG7ryBsaeG7h3UuICAgDQoNCiAgxJDhurdjIMSRaeG7g20gY2jDrW5oIHF1YW4gc8OhdCDEkcaw4bujYyBsw6Agc+G7sSBt4bqldCBjw6JuIGLhurFuZyBy4bqldCBs4bubbiBnaeG7r2EgY8OhYyBuaMOzbSBz4bqjbiBwaOG6qW0gdHJvbmcgYuG7mSBk4buvIGxp4buHdS4gSOG6oW5nIG3hu6VjICJGb29kIiBjaGnhur9tIMawdSB0aOG6vyB2xrDhu6N0IHRy4buZaSB24buBIHPhu5EgbMaw4bujbmcgdsOgIHThu7cgbOG7hywgxJHhuqFpIGRp4buHbiBjaG8gZ+G6p24gYmEgcGjhuqduIHTGsCB04buVbmcgc+G7kSBz4bqjbiBwaOG6qW0uIEPDsyBz4buxIGNow6puaCBs4buHY2ggxJHDoW5nIGvhu4MgZ2nhu69hIGPDoWMgaOG6oW5nIG3hu6VjLCBraGkgbmjDs20gIkZvb2QiIGzhu5tuIGjGoW4gcuG6pXQgbmhp4buBdSBzbyB24bubaSAiTm9uLUNvbnN1bWFibGUiIHbDoCAiRHJpbmsiLCB24buRbiBjaOG7iSBjaGnhur9tIG3hu5l0IHBo4bqnbiBuaOG7jy4gxJBp4buBdSBuw6B5IGNobyB0aOG6pXkgaG/huqF0IMSR4buZbmcga2luaCBkb2FuaCBob+G6t2MgZOG7ryBsaeG7h3UgdGh1IHRo4bqtcCDEkWFuZyB04bqtcCB0cnVuZyBt4bqhbmggdsOgbyBjw6FjIHPhuqNuIHBo4bqpbSB0aHXhu5ljIG5ow7NtIFRo4buxYyBwaOG6qW0sIMSRaeG7gXUgbsOgeSBjw7MgdGjhu4Mg4bqjbmggaMaw4bufbmcgxJHhur9uIGPDoWMgcGjDom4gdMOtY2ggduG7gSB4dSBoxrDhu5tuZyBtdWEgc+G6r20sIGhp4buHdSBzdeG6pXQgc+G6o24gcGjhuqltLCBob+G6t2MgY2hp4bq/biBsxrDhu6NjIG1hcmtldGluZyBu4bq/dSBraMO0bmcgxJHGsOG7o2MgeGVtIHjDqXQga+G7uSBsxrDhu6FuZy4gICAgICANCiAgDQoqKioNCg0KIyMgKipCaeG6v24gUHJvZHVjdENhdGVnb3J5KiogICAgDQoqIELhuqNuZyB04bqnbiBz4buROiAgICANCmBgYHtyLGVjaG89VFJVRX0NCiB0YWJsZShkMSRQcm9kdWN0Q2F0ZWdvcnkpDQpgYGANCg0KKiBC4bqjbmcgdOG6p24gc3XhuqV0OiAgIA0KYGBge3IsZWNobz1UUlVFfQ0KdjEgPC0gdGFibGUoZDEkUHJvZHVjdENhdGVnb3J5KS9zdW0obnJvdyhkMSkpDQpwcmludCh2MSkNCmBgYA0KDQoNCiogQmnhu4N1IMSR4buTOiAgIA0KYGBge3IsZWNobz1UUlVFfQ0KdGFibGUoZDEkUHJvZHVjdENhdGVnb3J5KSAlPiUgYXMuZGF0YS5mcmFtZSgpIC0+bzMNCmNvbG5hbWVzKG8zKTwtYygidmFsdWUiLCJjb3VudCIpDQoNCmdncGxvdChvMywgYWVzKHggPSB2YWx1ZSwgeSA9IGNvdW50LCBmaWxsID0gdmFsdWUpKSArDQogIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiKSsgIGNvb3JkX2ZsaXAoKSArICANCiAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IGNvdW50KSwgdmp1c3QgPSAtMC4zLCBzaXplID0gMi41KSArDQogIGxhYnModGl0bGUgPSAiQmnhu4N1IMSR4buTIFByb2R1Y3RDYXRlZ29yeSAiLCB4ID0gIlByb2R1Y3RDYXRlZ29yeSIsIHkgPSAiU+G7kSBsxrDhu6NuZyIpICsNCiAgdGhlbWVfbWluaW1hbCgpK3RoZW1lKA0KICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUsIGZhY2UgPSAiYm9sZCIsIHNpemUgPSAxNCksDQogICAgbGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiICAjIOG6qG4gY2jDuiB0aMOtY2ggbcOgdSBu4bq/dSBraMO0bmcgY+G6p24NCiAgKQ0KYGBgDQoNCiAgVOG7qyBi4bqjbmcgdOG6p24gc+G7kSwgIlZlZ2V0YWJsZXMiIHbDoCAiU25hY2sgRm9vZHMiIGzDoCBoYWkgaOG6oW5nIG3hu6VjIGPDsyBz4buRIGzGsOG7o25nIHF1YW4gc8OhdCBjYW8gbmjhuqV0IGzhuqduIGzGsOG7o3QgbMOgIDE3MjggdsOgIDE2MDAgYuG6o24gZ2hpLiBUaGVvIHNhdSBsw6AgIkRhaXJ5IiB24bubaSA5MDMgYuG6o24gZ2hpIHbDoCAiRnJ1aXQiIHbhu5tpIDc2NSBi4bqjbiBnaGkuIE5nxrDhu6NjIGzhuqFpLCBuaGnhu4F1IGjhuqFuZyBt4bulYyBjw7Mgc+G7kSBsxrDhu6NuZyBxdWFuIHPDoXQgcuG6pXQgdGjhuqVwLCB2w60gZOG7pSBuaMawICJNaXNjZWxsYW5lb3VzIiAoNDIpLCAiQ2FubmVkIEFuY2hvdmllcyIgKDQ0KSwgIkNhbmRsZXMiICg0NSksICJQYWNrYWdlZCBWZWdldGFibGVzIiAoNDgpLCB2w6AgIkNhbm5lZCBDbGFtcyIgKDUzKS4gS2hpIHhlbSB4w6l0IHThu7cgbOG7hywgYuG6o25nIHThuqduIHN14bqldCBjaG8gdGjhuqV5ICJWZWdldGFibGVzIiBjaGnhur9tIHThu7cgbOG7hyBjYW8gbmjhuqV0IHbhu5tpIDAuMTIyOTEwNTkxICh04bupYyBraG/huqNuZyAxMi4yOSUpIHThu5VuZyBz4buRIHF1YW4gc8OhdCwgdsOgICJTbmFjayBGb29kcyIgY2hp4bq/bSAwLjExMzgwNjEwMyAodOG7qWMga2hv4bqjbmcgMTEuMzglKS4gTmfGsOG7o2MgbOG6oWksICJNaXNjZWxsYW5lb3VzIiBjaOG7iSBjaGnhur9tIDAuMDAyOTg3NDEwIChraG/huqNuZyAwLjMwJSkgdsOgICJDYW5uZWQgQW5jaG92aWVzIiBsw6AgMC4wMDMxMjk2NjggKGtob+G6o25nIDAuMzElKS4gQmnhu4N1IMSR4buTIGPhu5l0ICJCaeG7g3UgxJHhu5MgUHJvZHVjdENhdGVnb3J5IiBtaW5oIGjhu41hIHLDtSByw6BuZyBz4buxIHBow6JuIGLhu5EgbsOgeSwgduG7m2kgY8OhYyBj4buZdCAiVmVnZXRhYmxlcyIgdsOgICJTbmFjayBGb29kcyIgbuG7lWkgYuG6rXQgduG7m2kgY2hp4buBdSBjYW8gdsaw4bujdCB0cuG7mWksIHRyb25nIGtoaSBuaGnhu4F1IGPhu5l0IGtow6FjIGfhuqduIG5oxrAga2jDtG5nIMSRw6FuZyBr4buDLCB4w6FjIG5o4bqtbiBz4buxIG5o4bqldCBxdcOhbiBnaeG7r2EgY8OhYyBow6xuaCB0aOG7qWMgdHLDrG5oIGLDoHkgZOG7ryBsaeG7h3UuICAgDQoNCiAgxJDhurdjIMSRaeG7g20gY2jDrW5oIHF1YW4gc8OhdCDEkcaw4bujYyBsw6Agc+G7sSBt4bqldCBjw6JuIGLhurFuZyBy4bqldCBs4bubbiBnaeG7r2EgY8OhYyBkYW5oIG3hu6VjIHPhuqNuIHBo4bqpbSB0cm9uZyBi4buZIGThu68gbGnhu4d1LiBDw6FjIGjhuqFuZyBt4bulYyAiVmVnZXRhYmxlcyIgdsOgICJTbmFjayBGb29kcyIgY2hp4bq/bSDGsHUgdGjhur8gcsO1IHLhu4d0IHbhu4Egc+G7kSBsxrDhu6NuZyB2w6AgdOG7tyBs4buHLiBDw7Mgc+G7sSBjaMOqbmggbOG7h2NoIGPhu7FjIGvhu7MgbOG7m24gZ2nhu69hIGPDoWMgaOG6oW5nIG3hu6VjLCBraGkgaGFpIG5ow7NtIMSR4bupbmcgxJHhuqd1IGNoaeG6v20gdOG7tyB0cuG7jW5nIMSRw6FuZyBr4buDLCB0cm9uZyBraGkgbeG7mXQgbMaw4bujbmcgbOG7m24gY8OhYyBkYW5oIG3hu6VjIGtow6FjIChuaMawICJNaXNjZWxsYW5lb3VzIiwgIkNhbm5lZCBDbGFtcyIsICJDYW5kbGVzIikgY8OzIHPhu5EgbMaw4bujbmcgdsOgIHThu7cgbOG7hyBy4bqldCBuaOG7jywgdGjhuq1tIGNow60gY2jhu4kgY2hp4bq/bSBjaMawYSDEkeG6v24gMSUgdOG7lW5nIHPhu5EuIMSQaeG7gXUgbsOgeSBjaG8gdGjhuqV5IGThu68gbGnhu4d1IG11YSBz4bqvbSBob+G6t2MgdOG7k24ga2hvIMSRYW5nIHThuq1wIHRydW5nIG3huqFuaCB2w6BvIG3hu5l0IHPhu5Egw610IGRhbmggbeG7pWMgc+G6o24gcGjhuqltIG5o4bqldCDEkeG7i25oLCDEkWnhu4F1IG7DoHkgY8OzIHRo4buDIOG6o25oIGjGsOG7n25nIMSR4bq/biBjw6FjIHBow6JuIHTDrWNoIHRo4buLIHRyxrDhu51uZywgY2hp4bq/biBsxrDhu6NjIHPhuqNuIHBo4bqpbSBob+G6t2MgZOG7sSBiw6FvIGRvYW5oIHPhu5EgbuG6v3Uga2jDtG5nIMSRxrDhu6NjIHhlbSB4w6l0IGvhu7kgbMaw4buhbmcuICAgICAgDQogIA0KKioqDQoNCiMjICoqQmnhur9uIFByb2R1Y3REZXBhcnRtZW50KiogICAgDQoqIELhuqNuZyB04bqnbiBz4buROiAgICANCmBgYHtyLGVjaG89VFJVRX0NCiB0YWJsZShkMSRQcm9kdWN0RGVwYXJ0bWVudCkNCmBgYA0KDQoqIELhuqNuZyB04bqnbiBzdeG6pXQ6ICAgDQpgYGB7cixlY2hvPVRSVUV9DQp2MiA8LSB0YWJsZShkMSRQcm9kdWN0RGVwYXJ0bWVudCkvc3VtKG5yb3coZDEpKQ0KcHJpbnQodjIpDQpgYGANCg0KDQoqIEJp4buDdSDEkeG7kzogICANCmBgYHtyLGVjaG89VFJVRX0NCnRhYmxlKGQxJFByb2R1Y3REZXBhcnRtZW50KSAlPiUgYXMuZGF0YS5mcmFtZSgpIC0+bzQNCmNvbG5hbWVzKG80KTwtYygidmFsdWUiLCJjb3VudCIpDQoNCmdncGxvdChvNCwgYWVzKHggPSB2YWx1ZSwgeSA9IGNvdW50LCBmaWxsID0gdmFsdWUpKSArDQogIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiKSsgIA0KICBnZW9tX3RleHQoYWVzKGxhYmVsID0gY291bnQpLCB2anVzdCA9IC0wLjMsIHNpemUgPSAyLjUpICsNCiAgbGFicyh0aXRsZSA9ICJCaeG7g3UgxJHhu5MgUHJvZHVjdERlcGFydG1lbnQgIiwgeCA9ICJQcm9kdWN0RGVwYXJ0bWVudCIsIHkgPSAiU+G7kSBsxrDhu6NuZyIpICsgIHRoZW1lX21pbmltYWwoKSArDQogIHRoZW1lKA0KICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUsIGZhY2UgPSAiYm9sZCIsIHNpemUgPSAxNCksDQogICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X2JsYW5rKCksICMg4bqobiBuaMOjbiBkxrDhu5tpIHRy4bulYyBYIG7hur91IGPhuqduDQogICAgbGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSINCiAgKSANCmBgYA0KDQogIFBow6JuIGLhu5EgY+G7p2EgY8OhYyBsb+G6oWkgc+G6o24gcGjhuqltIGtow7RuZyDEkeG7k25nIMSR4buBdS4gIlByb2R1Y2UiICgxOTk0IG3huqt1LCBjaGnhur9tIGtob+G6o25nIDE0LjI2JSkgdsOgICJTbmFjayBGb29kcyIgKDE2MDAgbeG6q3UsIGNoaeG6v20ga2hv4bqjbmcgMTEuNDQlKSBsw6AgaGFpIGxv4bqhaSBz4bqjbiBwaOG6qW0gY8OzIHPhu5EgbMaw4bujbmcgbeG6q3UgxJHGsOG7o2MgcGjDom4gdMOtY2ggbmhp4buBdSBuaOG6pXQsIGNobyB0aOG6pXkgxJHDonkgbMOgIG5o4buvbmcgbmfDoG5oIGjDoG5nIGNoaeG6v20gdOG7tyB0cuG7jW5nIGzhu5tuIHRyb25nIGThu68gbGnhu4d1LiBOZ8aw4bujYyBs4bqhaSwgY8OhYyBuZ8OgbmggaMOgbmcgbmjGsCAiQ2hlY2tvdXQiICg4MiBt4bqrdSwgY2hp4bq/bSBraG/huqNuZyAwLjU5JSksICJNZWF0IiAoODkgbeG6q3UsIGNoaeG6v20ga2hv4bqjbmcgMC42MyUpIHbDoCAiQ2FubmVkIFByb2R1Y3RzIiAoMTA5IG3huqt1LCBjaGnhur9tIGtob+G6o25nIDAuNzglKSBjw7Mgc+G7kSBsxrDhu6NuZyBt4bqrdSBy4bqldCB0aOG6pXAsIGPDsyB0aOG7gyBsw6Agbmjhu69uZyBuZ8OgbmggaMOgbmcgw610IHBo4buVIGJp4bq/biBoxqFuIGhv4bq3YyDDrXQgxJHGsOG7o2MgcXVhbiB0w6JtIHRyb25nIHF1w6EgdHLDrG5oIHBow6JuIHTDrWNoIGThu68gbGnhu4d1IG7DoHkuICAgDQoNCiAgU+G7sSBjaMOqbmggbOG7h2NoIGzhu5tuIGdp4buvYSBjw6FjIG5nw6BuaCBow6BuZyBjaG8gdGjhuqV5IHLhurFuZyBkb2FuaCBuZ2hp4buHcCBob+G6t2MgdOG7lSBjaOG7qWMgxJFhbmcgdOG6rXAgdHJ1bmcgdsOgbyBt4buZdCBz4buRIGzEqW5oIHbhu7FjIHPhuqNuIHBo4bqpbSBuaOG6pXQgxJHhu4tuaCAoIlByb2R1Y2UiLCAiU25hY2sgRm9vZHMiLCAiSG91c2Vob2xkIiwgIkZyb3plbiBGb29kcyIpIHRyb25nIGtoaSBt4buZdCBz4buRIG5nw6BuaCBow6BuZyBraMOhYyDEkWFuZyBi4buLIGLhu48gbmfhu48gaG/hurdjIGtow7RuZyDEkcaw4bujYyDGsHUgdGnDqm4uIMSQaeG7gXUgbsOgeSBjw7MgdGjhu4Mg4bqjbmggaMaw4bufbmcgxJHhur9uIGhp4buHdSBxdeG6oyBraW5oIGRvYW5oIHThu5VuZyB0aOG7gyBu4bq/dSBraMO0bmcgY8OzIHPhu7EgcGjDom4gYuG7lSBo4bujcCBsw70gaG/hurdjIG7hur91IGPDoWMgbmfDoG5oIGjDoG5nIMOtdCBwaOG7lSBiaeG6v24gY8OzIHRp4buBbSBuxINuZyB0xINuZyB0csaw4bufbmcgbmjGsG5nIGNoxrBhIMSRxrDhu6NjIGtoYWkgdGjDoWMuIMSQ4buDIGhp4buDdSByw7UgaMahbiB24buBIGzDvSBkbyBj4bunYSBz4buxIHBow6JuIGLhu5EgbsOgeSwgY+G6p24gY8OzIHRow6ptIHRow7RuZyB0aW4gduG7gSBi4buRaSBj4bqjbmggdGh1IHRo4bqtcCBk4buvIGxp4buHdSB2w6AgbeG7pWMgdGnDqnUgcGjDom4gdMOtY2guICAgDQogIA0KIyAqKlBo4bqnbiAzOiDGr+G7m2MgbMaw4bujbmcga2hv4bqjbmcgdsOgIEtp4buDbSDEkeG7i25oIEdpw6EgdGh1eeG6v3QgY2hvIFThu7cgbOG7hyoqICAgDQoNCiogQ8OhYyBiaeG6v24gxJHGsOG7o2MgbOG7sWEgY2jhu41uIGJhbyBn4buTbTogSG9tZW93bmVyOyBHZW5kZXI7IENvdW50cnkuICAgDQoNCiMjICoqQmnhur9uIEhvbWVvd25lcioqICAgDQoNCjEuKipYw6FjIMSR4buLbmggaOG6oW5nIG3hu6VjIHF1YW4gdMOibSoqOiBo4bqhbmcgbeG7pWMgTiAoa2jDtG5nIGPDsyBz4bufIGjhu691IG5ow6ApIGPhu6dhIGJp4bq/biBIb21lb3duZXIuICAgDQoNCjIuKirGr+G7m2MgbMaw4bujbmcga2hv4bqjbmcgdGluIGPDonk6KiogICANCiAgxq/hu5tjIGzGsOG7o25nIGtob+G6o25nIHRpbiBj4bqteSBjaG8gdOG7tyBs4buHIGPhu6dhIGjhuqFuZyBt4bulYyBOIHbhu5tpIGtob+G6o25nIHRpbiBj4bqteSA5NSUuICAgDQogIA0KYGBge3IsZWNobz1UUlVFfQ0KIyDEkOG6v20gc+G7kSBsxrDhu6NuZyBxdWFuIHPDoXQgY+G7p2EgaOG6oW5nIG3hu6VjIE4NCmNvdW50X04gPC0gc3VtKGQxJEhvbWVvd25lciA9PSAiTiIpDQpwcmludCgiU+G7kSBsxrDhu6NuZyBxdWFuIHPDoXQgY+G7p2EgaOG6oW5nIG3hu6VjIE46IikNCmNvdW50X04NCg0KIyDEkOG6v20gc+G7kSB04buVbmcgcXVhbiBzw6F0Lg0KdG90YWwgPC0gbnJvdyhkMSkNCnByaW50KCJT4buRIHThu5VuZyBxdWFuIHPDoXQ6IikNCnRvdGFsDQoNCiMgVMOtbmgga2hv4bqjbmcgdGluIGPDonkNCnJlc3VsdCA8LSBwcm9wLnRlc3QoeCA9IGNvdW50X04sIG4gPSB0b3RhbCwgY29uZi5sZXZlbCA9IDAuOTUpDQoNCiMgSGnhu4NuIHRo4buLIGvhur90IHF14bqjDQpwcmludCgiS2hv4bqjbmcgdGluIGPhuq15OiIpDQpyZXN1bHQNCg0KDQpgYGANCioqRGnhu4VuIGdp4bqjaSoqICAgDQoqIFThu7cgbOG7hyBuZ8aw4budaSBraMO0bmcgc+G7nyBo4buvdSBuaMOgIHRyb25nIG3huqt1IGto4bqjbyBzw6F0IGzDoCAzOSw5NCUuICAgDQoqIEtob+G6o25nIHRpbiBj4bqteSA5NSUgY2hvIHThu7cgbOG7hyBuZ8aw4budaSBraMO0bmcgc+G7nyBo4buvdSBuaMOgICgnTicpIGzDoCB04burIDM5LDEzJSDEkeG6v24gNDAsNzUlLiAgICAgIA0KKiBU4bupYyBsw6A6IENow7puZyB0YSB04buxIHRpbiA5NSUgcuG6sW5nIHThu7cgbOG7hyB0aOG7sWMgc+G7sSBj4bunYSBuaOG7r25nIG5nxrDhu51pIGtow7RuZyBz4bufIGjhu691IG5ow6AgdHJvbmcgdOG7lW5nIHRo4buDIG7hurFtIHRyb25nIGtob+G6o25nIHThu6sgMzksMTMlIMSR4bq/biA0MCw3NSUuICAgICAgDQogIA0KKipHaeG6o2kgdGjDrWNoKiogICANCiAgxq/hu5tjIGzGsOG7o25nIGtob+G6o25nIHRpbiBj4bqteSBjaG8gdOG7tyBs4buHIG5nxrDhu51pIGtow7RuZyBz4bufIGjhu691IG5ow6AgdHLDqm4gdOG7lW5nIHPhu5EgcXVhbiBzw6F0IHbhu5tpIG3hu6ljIMO9IG5naMSpYSAwLDUuICAgDQogIA0KICBYLXNxdWFyZWQgPSA1NjguODYsIGRmID0gMTogZ2nDoSB0cuG7iyB0aOG7kW5nIGvDqiBraeG7g20gxJHhu4tuaCAoQ2hpLSBzcXVhcmVkKSBsw6AgNTY4LDg2IHbhu5tpIDEgYuG6rWMgdOG7sSBkby4gICANCiAgDQogIEdpw6EgdHLhu4sgcC12YWx1ZSBy4bqldCBuaOG7jyB2w6AgZ+G6p24gbmjGsCBi4bqxbmcgMCAocC12YWx1ZSA8IDIuMmUtMTYpLiBDaG8gdGjhuqV5IGLhurFuZyBjaOG7qW5nIHLhuqV0IG3huqFuaCDEkeG7gyBiw6FjIGLhu48gZ2nhuqMgdGh1eeG6v3QgJEhfMCQgKHLhurFuZyB04bu3IGzhu4cgYuG6sW5nIDAuNSkuICAgDQogIA0KICBhbHRlcm5hdGl2ZSBoeXBvdGhlc2lzOiBnaeG6oyB0aHV54bq/dCDEkeG7kWkgKHThu7cgbOG7hyB0aOG7sWMgc+G7sSBraMOhYyAwLjUpLiAgIA0KICANCiAgOTUgcGVyY2VudCBjb25maWRlbmNlIGludGVydmFsOiAwLjM5MTI4NTUgMC40MDc1NDYzOiBraG/huqNuZyB0aW4gY+G6rXkgOTUlIGNobyB04bu3IGzhu4cgbeG6q3UgbMOgIHThu6sgMzkuMTMlIMSR4bq/biA0MC43NSUuICAgDQogIA0KICBzYW1wbGUgZXN0aW1hdGUgcCA9IDAuMzk5Mzg4Mzogxq/hu5tjIGzGsOG7o25nIHThu7cgbOG7hyB04burIG3huqt1IGzDoCAzOS45NCUuICAgDQogIA0KMy4qKktp4buDbSDEkeG7i25oIGdp4bqjIHRodXnhur90KiogICANCg0KKiDEkOG6t3QgZ2nhuqMgdGh1eeG6v3Q6ICAgDQpHaeG6oyB0aHV54bq/dCAkSF8wJDogVOG7tyBs4buHIHRo4buxYyBz4buxIGPhu6dhIG5nxrDhu51pIGtow7RuZyBz4bufIGjhu691IG5ow6AgdHJvbmcgdOG7lW5nIHRo4buDIGLhurFuZyAwLjc1ICgkSF8wOiBwPTAuNzUkLikgICANCkdp4bqjIHRodXnhur90ICRIXzEkOiBU4bu3IGzhu4cgdGjhu7FjIHPhu7EgY+G7p2Egbmjhu69uZyBuZ8aw4budaSBraMO0bmcgc+G7nyBo4buvdSBuaMOgIHRyb25nIHThu5VuZyB0aOG7gyBraMOhYyAwLjc1ICgkSF8xOnBcbmVxIDAuNzUkKSAgIA0KDQoqIFRo4buxYyBoaeG7h24ga2nhu4NtIMSR4buLbmggZ2nhuqMgdGh1eeG6v3Q6ICAgDQogIFbhu5tpIHPhu5EgbMaw4bujbmcgcXVhbiBzw6F0IGPhu6dhIGjhuqFuZyBt4bulYyBOOiA1NjE1OyAgIA0KICBWw6AgdOG7lW5nIHPhu5EgcXVhbiBzw6F0OiAxNDA1OS4gICANCg0KYGBge3IsZWNobz1UUlVFfQ0KIyB0aOG7sWMgaGnhu4duIHByb3AudGVzdCB24bubaSBwPTAuNyAodOG7tyBs4buHIGdp4bqjIMSR4buLbmggZMaw4bubaSBIMCkNCnRlc3RfcmVzdWx0IDwtIHByb3AudGVzdCh4ID0gY291bnRfTiwgbiA9IHRvdGFsLCBwPTAuNzUsIGFsdGVybmF0aXZlPSJ0d28uc2lkZWQiKQ0KcHJpbnQoIkvhur90IHF14bqjIGtp4buDbSDEkeG7i25oIGdp4bqjIHRodXnhur90OiIpDQp0ZXN0X3Jlc3VsdA0KYGBgDQoqIELDoW8gY8OhbyBnacOhIHRy4buLIHAgdsOgIMSRxrBhIHJhIGvhur90IGx14bqtbiDhu58gbeG7qWMgw70gbmdoxKlhICRcYWxwaGE9MC4wNSQ6ICAgDQogIFThu7cgbOG7hyBt4bqrdSBwID0gMzksOTQlLiAgDQogIEdpw6EgdHLhu4sgcF92YWx1ZSA8IDIuMmUtMTYsIG3hu5l0IGNvbiBz4buRIGPhu7FjIGvhu7Mgbmjhu48gKGfhuqduIG5oxrAgYuG6sW5nIDApLiAgDQogIFbhu5tpIG3hu6ljIMO9IG5naMSpYSAkXGFscGhhJDogY2jDum5nIHRhIGNo4buNbiAkXGFscGhhPTAuMDUkLiAgIA0KICBTbyBzw6FuaCBwLXZhbHVlIHbhu5tpICRcYWxwaGE6IHAtdmFsdWUoPDIuMmUtMTYpPFxhbHBoYSgwLjA1KSQuICAgDQogIEvhur90IGx14bqtbjogdsOsIHAtdmFsdWUgbmjhu48gaMahbiBt4bupYyDDvSBuZ2jEqWEgJFxhbHBoYSQsIGNow7puZyB0YSBiw6FjIGLhu48gZ2nhuqMgdGh1eeG6v3QgJEhfMCQuICAgDQogIFThu7cgbOG7hyBt4bqrdSAzOSw5NCUgY2jDqm5oIGzhu4djaCBjw7Mgw70gbmdoxKlhIHRo4buRbmcga8OqIHNvIHbhu5tpIGdp4bqjIHRodXnhur90IHThu7cgbOG7hyA1MCUsIGNobyB0aOG6pXkgY8OzIGLhurFuZyBjaOG7qW5nIMSR4buDIGto4bqzbmcgxJHhu4tuaCBy4bqxbmcgdOG7tyBs4buHIHRo4buxYyBz4buxIHRyb25nIHThu5VuZyB0aOG7gyBraMO0bmcgcGjhuqNpIGzDoCA1MCUuICAgDQogIA0KKiBL4bq/dCBsdeG6rW46ICAgDQogIFZp4buHYyBiw6FjIGLhu48gJEhfMDpwPTAuNzUkIGPDsyBuZ2jEqWEgbMOgIGNow7puZyB0YSBraMO0bmcgY8OzIMSR4bunIGLhurFuZyBjaOG7qW5nIHRo4buRbmcga8OqIMSR4buDIGvhur90IGx14bqtbiBy4bqxbmcgdOG7tyBs4buHIHRo4buxYyBz4buxIGPhu6dhIG5o4buvbmcgbmfGsOG7nWkga2jDtG5nIHPhu58gaOG7r3UgbmjDoCB0cm9uZyB04buVbmcgdGjhu4Mga2jDtG5nIGLhurFuZyA3MCUuICAgDQogIEvhur90IHF14bqjIGtp4buDbSDEkeG7i25oIG7DoHksIGPDuW5nIHbhu5tpIMaw4bubYyBsxrDhu6NuZyDEkWnhu4NtIHThu6sgbeG6q3UgKDM5Ljk0JSkgdsOgIGtob+G6o25nIHRpbiBj4bqteSA5NSUgKDAuMzkxMjg1NSAwLjQwNzU0NjMpLCBjaG8gdGjhuqV5IHThu7cgbOG7hyBuZ8aw4budaSBraMO0bmcgc+G7nyBo4buvdSBuaMOgIHRyw6puIHRo4buxYyB04bq/IGPDsyB24bq7IHRo4bqlcCBoxqFuIMSRw6FuZyBr4buDIHNvIHbhu5tpIGNvbiBz4buRIDcwJSBtw6AgZ2nhuqMgdGh1eeG6v3Qga2jDtG5nIMSRw6MgxJHhurd0IHJhLiDEkGnhu4F1IG7DoHkga2jhurNuZyDEkeG7i25oIHLhurFuZyBnaeG6oyDEkeG7i25oIGJhbiDEkeG6p3UgduG7gSB04bu3IGzhu4cgbmfGsOG7nWkga2jDtG5nIHPhu58gaOG7r3UgbmjDoCBsw6AgNzAlIGzDoCBraMO0bmcgcGjDuSBo4bujcCB24bubaSBk4buvIGxp4buHdSBxdWFuIHPDoXQgxJHGsOG7o2MuICAgDQogIA0KIyMgKipCaeG6v24gR2VuZGVyKiogICANCg0KMS4qKljDoWMgxJHhu4tuaCBo4bqhbmcgbeG7pWMgcXVhbiB0w6JtKio6IGjhuqFuZyBt4bulYyBO4buvIGPhu6dhIGJp4bq/biBHZW5kZXIuICAgDQoNCjIuKirGr+G7m2MgbMaw4bujbmcga2hv4bqjbmcgdGluIGPDonk6KiogICANCiAgxq/hu5tjIGzGsOG7o25nIGtob+G6o25nIHRpbiBj4bqteSBjaG8gdOG7tyBs4buHIGPhu6dhIGjhuqFuZyBt4bulYyBGIChO4buvKSB24bubaSBraG/huqNuZyB0aW4gY+G6rXkgOTUlLiAgIA0KICANCmBgYHtyLGVjaG89VFJVRX0NCiMgxJDhur9tIHPhu5EgbMaw4bujbmcgcXVhbiBzw6F0IGPhu6dhIGjhuqFuZyBt4bulYyBODQpjb3VudF9GIDwtIHN1bShkMSRHZW5kZXIgPT0gIkYiKQ0KcHJpbnQoIlPhu5EgbMaw4bujbmcgcXVhbiBzw6F0IGPhu6dhIGjhuqFuZyBt4bulYyBGOiIpDQpjb3VudF9GDQoNCnByaW50KCJT4buRIHThu5VuZyBxdWFuIHPDoXQ6IikNCnRvdGFsDQoNCiMgVMOtbmgga2hv4bqjbmcgdGluIGPDonkNCnJlc3VsdDEgPC0gcHJvcC50ZXN0KHggPSBjb3VudF9GLCBuID0gdG90YWwsIGNvbmYubGV2ZWwgPSAwLjk1KQ0KDQojIEhp4buDbiB0aOG7iyBr4bq/dCBxdeG6ow0KcHJpbnQoIktob+G6o25nIHRpbiBj4bqteToiKQ0KcmVzdWx0MQ0KDQpgYGANCiAgDQoqKkRp4buFbiBnaeG6o2kqKiAgIA0KKiBU4bu3IGzhu4cgbuG7ryB0cm9uZyBt4bqrdSBraOG6o28gc8OhdCBsw6AgNTElLiAgIA0KKiBLaG/huqNuZyB0aW4gY+G6rXkgOTUlIGNobyB04bu3IGzhu4cgbmfGsOG7nWkga2jDtG5nIHPhu58gaOG7r3UgbmjDoCAoJ04nKSBsw6AgdOG7qyA1MC4xNyUgxJHhur9uIDUxLjgzJS4gICANCiogVOG7qWMgbMOgOiBDaMO6bmcgdGEgdOG7sSB0aW4gOTUlIHLhurFuZyB04bu3IGzhu4cgdGjhu7FjIHPhu7Egc+G7kSBuZ8aw4budaSBjw7MgZ2nhu5tpIHTDrW5oIG7hu68gdHJvbmcgdOG7lW5nIHRo4buDIG7hurFtIHRyb25nIGtob+G6o25nIHThu6sgNTAuMTclIMSR4bq/biA1MS44MyUuICAgDQogIA0KMy4qKktp4buDbSDEkeG7i25oIGdp4bqjIHRodXnhur90KiogICANCg0KKiDEkOG6t3QgZ2nhuqMgdGh1eeG6v3Q6ICAgDQpHaeG6oyB0aHV54bq/dCAkSF8wJDogVOG7tyBs4buHIHRo4buxYyBz4buxIGPhu6dhIG5nxrDhu51pIGPDsyBnaeG7m2kgdMOtbmggbuG7ryB0cm9uZyB04buVbmcgdGjhu4MgYuG6sW5nIDAuMyAoJEhfMDogcD0wLjMkLikgICANCkdp4bqjIHRodXnhur90ICRIXzEkOiBU4bu3IGzhu4cgdGjhu7FjIHPhu7EgY+G7p2EgbmfGsOG7nWkgY8OzIGdp4bubaSB0w61uaCBu4buvICB0cm9uZyB04buVbmcgdGjhu4Mga2jDoWMgMC4zICgkSF8xOnBcbmVxIDAuMyQpICAgDQoNCiogVGjhu7FjIGhp4buHbiBraeG7g20gxJHhu4tuaCBnaeG6oyB0aHV54bq/dDogICANCiAgVuG7m2kgc+G7kSBsxrDhu6NuZyBxdWFuIHPDoXQgY+G7p2EgaOG6oW5nIG3hu6VjIEY6IDcxNzA7ICAgDQogIFbDoCB04buVbmcgc+G7kSBxdWFuIHPDoXQ6IDE0MDU5LiAgIA0KDQpgYGB7cixlY2hvPVRSVUV9DQojIHRo4buxYyBoaeG7h24gcHJvcC50ZXN0IHbhu5tpIHA9MC4zICh04bu3IGzhu4cgZ2nhuqMgxJHhu4tuaCBkxrDhu5tpIEgwKQ0KdGVzdF9yZXN1bHQxIDwtIHByb3AudGVzdCh4ID0gY291bnRfRiwgbiA9IHRvdGFsLCBwPTAuMywgYWx0ZXJuYXRpdmU9InR3by5zaWRlZCIpDQpwcmludCgiS+G6v3QgcXXhuqMga2nhu4NtIMSR4buLbmggZ2nhuqMgdGh1eeG6v3Q6IikNCnRlc3RfcmVzdWx0MQ0KYGBgDQoNCiogQsOhbyBjw6FvIGdpw6EgdHLhu4sgcCB2w6AgxJHGsGEgcmEga+G6v3QgbHXhuq1uIOG7nyBt4bupYyDDvSBuZ2jEqWEgJFxhbHBoYT0wLjA1JDogICANCiAgVOG7tyBs4buHIG3huqt1IHAgPSA1MSUuICANCiAgR2nDoSB0cuG7iyBwX3ZhbHVlIDwgMi4yZS0xNiwgbeG7mXQgY29uIHPhu5EgY+G7sWMga+G7syBuaOG7jyAoZ+G6p24gbmjGsCBi4bqxbmcgMCkuICANCiAgVuG7m2kgbeG7qWMgw70gbmdoxKlhICRcYWxwaGEkOiBjaMO6bmcgdGEgY2jhu41uICRcYWxwaGE9MC4wNSQuICAgDQogIFNvIHPDoW5oIHAtdmFsdWUgduG7m2kgJFxhbHBoYTogcC12YWx1ZSg8Mi4yZS0xNik8XGFscGhhKDAuMDUpJC4gICANCiAgS+G6v3QgbHXhuq1uOiB2w6wgcC12YWx1ZSBuaOG7jyBoxqFuIG3hu6ljIMO9IG5naMSpYSAkXGFscGhhJCwgY2jDum5nIHRhIGLDoWMgYuG7jyBnaeG6oyB0aHV54bq/dCAkSF8wJC4gICANCiAgDQoqIEvhur90IGx14bqtbjogICANCiBjw7MgxJHhu6cgYuG6sW5nIGNo4bupbmcgdGjhu5FuZyBrw6ogxJHhu4Mga+G6v3QgbHXhuq1uIHLhurFuZyB04bu3IGzhu4cgdGjhu7FjIHPhu7EgY+G7p2EgbmfGsOG7nWkgY8OzIGdp4bubaSB0w61uaCBu4buvIHRyb25nIHThu5VuZyB0aOG7gyBsw6Aga2jDoWMgMC4zLiAgICAgICANCiAgTsOzaSBjw6FjaCBraMOhYywgZOG7ryBsaeG7h3UgbeG6q3UgY+G7p2EgY2jDum5nIHRhIGNobyB0aOG6pXkgdOG7tyBs4buHIG7hu68gdHJvbmcgdOG7lW5nIHRo4buDIGtow7RuZyBwaOG6o2kgbMOgIDMwJS4gVHLDqm4gdGjhu7FjIHThur8sIHThu7cgbOG7hyDGsOG7m2MgdMOtbmggdHJvbmcgbeG6q3UgbMOgIDAuNTA5OTkzNiAoa2hv4bqjbmcgNTElKSwgdsOgIGtob+G6o25nIHRpbiBj4bqteSA5NSUgY2hvIHThu7cgbOG7hyB0aOG7sWMgc+G7sSBsw6AgdOG7qyAwLjUwMTY5MzEgxJHhur9uIDAuNTE4Mjg4Niwga2jDtG5nIGNo4bupYSBnacOhIHRy4buLIDAuMy4gICANCiAgDQojIyAqKkJp4bq/biBDb3VudHJ5KiogICANCg0KMS4qKljDoWMgxJHhu4tuaCBo4bqhbmcgbeG7pWMgcXVhbiB0w6JtKio6IGjhuqFuZyBt4bulYyBNZXhpY28gY+G7p2EgYmnhur9uIENvdW50cnkuICAgDQoNCjIuKirGr+G7m2MgbMaw4bujbmcga2hv4bqjbmcgdGluIGPDonk6KiogICANCiAgxq/hu5tjIGzGsOG7o25nIGtob+G6o25nIHRpbiBj4bqteSBjaG8gdOG7tyBs4buHIGPhu6dhIGjhuqFuZyBt4bulYyBNZXhpY28gduG7m2kga2hv4bqjbmcgdGluIGPhuq15IDk1JS4gICANCiAgDQpgYGB7cixlY2hvPVRSVUV9DQojIMSQ4bq/bSBz4buRIGzGsOG7o25nIHF1YW4gc8OhdCBj4bunYSBo4bqhbmcgbeG7pWMgTg0KY291bnRfTSA8LSBzdW0oZDEkQ291bnRyeSA9PSAiTWV4aWNvIikNCnByaW50KCJT4buRIGzGsOG7o25nIHF1YW4gc8OhdCBj4bunYSBo4bqhbmcgbeG7pWMgTWV4aWNvOiIpDQpjb3VudF9NDQoNCnByaW50KCJT4buRIHThu5VuZyBxdWFuIHPDoXQ6IikNCnRvdGFsDQoNCiMgVMOtbmgga2hv4bqjbmcgdGluIGPDonkNCnJlc3VsdDIgPC0gcHJvcC50ZXN0KHggPSBjb3VudF9NLCBuID0gdG90YWwsIGNvbmYubGV2ZWwgPSAwLjk1KQ0KDQojIEhp4buDbiB0aOG7iyBr4bq/dCBxdeG6ow0KcHJpbnQoIktob+G6o25nIHRpbiBj4bqteToiKQ0KcmVzdWx0Mg0KDQpgYGANCiAgDQoqKkRp4buFbiBnaeG6o2kqKiAgIA0KKiBV4bubYyBsxrDhu6NuZyB04bu3IGzhu4cgbmfGsOG7nWkg4bufIE1leGljbyB0cm9uZyBt4bqrdSBraOG6o28gc8OhdCBsw6AgMjYsMjMlLiAgIA0KKiBLaG/huqNuZyB0aW4gY+G6rXkgOTUlIGNobyB04bu3IGzhu4cgdGjhu7FjIHPhu7EgY+G7p2EgaOG6oW5nIG3hu6VjIE1leGljbyB0cm9uZyB04buVbmcgdGjhu4MgbMOgIHThu6sgNTAuMTclIMSR4bq/biA1MS44MyUuICAgDQoqIFThu6ljIGzDoDogQ2jDum5nIHRhIHThu7EgdGluIDk1JSBy4bqxbmcgdOG7tyBs4buHIHRo4buxYyBz4buxIGPhu6dhIGjhuqFuZyBt4bulYyBNZXhpY28gdHJvbmcgdOG7lW5nIHRo4buDIG7hurFtIHRyb25nIGtob+G6o25nIHThu6sgMjUuNTElIMSR4bq/biAyNi45NyUuICAgDQogIA0KMy4qKktp4buDbSDEkeG7i25oIGdp4bqjIHRodXnhur90KiogICANCg0KKiDEkOG6t3QgZ2nhuqMgdGh1eeG6v3Q6ICAgDQpHaeG6oyB0aHV54bq/dCAkSF8wJDogVOG7tyBs4buHIHRo4buxYyBz4buxIGPhu6dhIG5nxrDhu51pIGPDsyBnaeG7m2kgdMOtbmggbuG7ryB0cm9uZyB04buVbmcgdGjhu4MgYuG6sW5nIDAuOCAoJEhfMDogcD04JC4pICAgDQpHaeG6oyB0aHV54bq/dCAkSF8xJDogVOG7tyBs4buHIHRo4buxYyBz4buxIGPhu6dhIG5nxrDhu51pIGPDsyBnaeG7m2kgdMOtbmggbuG7ryAgdHJvbmcgdOG7lW5nIHRo4buDIGtow6FjIDAuOCAoJEhfMTpwXG5lcSAwLjgkKSAgIA0KDQoqIFRo4buxYyBoaeG7h24ga2nhu4NtIMSR4buLbmggZ2nhuqMgdGh1eeG6v3Q6ICAgDQogIFbhu5tpIHPhu5EgbMaw4bujbmcgcXVhbiBzw6F0IGPhu6dhIGjhuqFuZyBt4bulYyBNZXhpY286IDM2ODg7ICAgDQogIFbDoCB04buVbmcgc+G7kSBxdWFuIHPDoXQ6IDE0MDU5LiAgIA0KDQpgYGB7cixlY2hvPVRSVUV9DQojIHRo4buxYyBoaeG7h24gcHJvcC50ZXN0IHbhu5tpIHA9MC4zICh04bu3IGzhu4cgZ2nhuqMgxJHhu4tuaCBkxrDhu5tpIEgwKQ0KdGVzdF9yZXN1bHQyIDwtIHByb3AudGVzdCh4ID0gY291bnRfTSwgbiA9IHRvdGFsLCBwPTAuOCwgYWx0ZXJuYXRpdmU9InR3by5zaWRlZCIpDQpwcmludCgiS+G6v3QgcXXhuqMga2nhu4NtIMSR4buLbmggZ2nhuqMgdGh1eeG6v3Q6IikNCnRlc3RfcmVzdWx0Mg0KYGBgDQoNCiogQsOhbyBjw6FvIGdpw6EgdHLhu4sgcCB2w6AgxJHGsGEgcmEga+G6v3QgbHXhuq1uIOG7nyBt4bupYyDDvSBuZ2jEqWEgJFxhbHBoYT0wLjA1JDogICANCiAgVOG7tyBs4buHIG3huqt1IHAgPSAyNi4yMyUuICANCiAgR2nDoSB0cuG7iyBwX3ZhbHVlIDwgMi4yZS0xNiwgbeG7mXQgY29uIHPhu5EgY+G7sWMga+G7syBuaOG7jyAoZ+G6p24gbmjGsCBi4bqxbmcgMCkuICANCiAgVuG7m2kgbeG7qWMgw70gbmdoxKlhICRcYWxwaGEkOiBjaMO6bmcgdGEgY2jhu41uICRcYWxwaGE9MC4wNSQuICAgDQogIFNvIHPDoW5oIHAtdmFsdWUgduG7m2kgJFxhbHBoYTogcC12YWx1ZSg8Mi4yZS0xNik8XGFscGhhKDAuMDUpJC4gICANCiAgS+G6v3QgbHXhuq1uOiB2w6wgcC12YWx1ZSBuaOG7jyBoxqFuIG3hu6ljIMO9IG5naMSpYSAkXGFscGhhJCwgY2jDum5nIHRhIGLDoWMgYuG7jyBnaeG6oyB0aHV54bq/dCAkSF8wJC4gICANCiAgDQoqIEvhur90IGx14bqtbjogICANCiBL4bq/dCBsdeG6rW4gYsOhYyBi4buPIGdp4bqjIHRodXnhur90IFNIXzAkIGPDsyBuZ2jEqWEgbMOgIGPDsyDEkeG7pyBi4bqxbmcgY2jhu6luZyB0aOG7kW5nIGvDqiDEkeG7gyBr4bq/dCBsdeG6rW4gcuG6sW5nIHThu7cgbOG7hyB0aOG7sWMgc+G7sSBj4bunYSBuZ8aw4budaSBjw7MgZ2nhu5tpIHTDrW5oIG7hu68gdHJvbmcgdOG7lW5nIHRo4buDIEtIw5RORyBwaOG6o2kgbMOgIDAuOCAgIA0KIA0KICBIxqFuIG7hu69hLCBk4buxYSB0csOqbiDGsOG7m2MgdMOtbmggbeG6q3UsIHThu7cgbOG7hyBuZ8aw4budaSBjw7MgZ2nhu5tpIHTDrW5oIG7hu68gdHJvbmcgbeG6q3UgbMOgIGtob+G6o25nIDAuMjYyIChob+G6t2MgMjYuMiUpLCB2w6Aga2hv4bqjbmcgdGluIGPhuq15IDk1JSBjaG8gdOG7tyBs4buHIHRo4buxYyBz4buxIHRyb25nIHThu5VuZyB0aOG7gyBsw6AgdOG7qyAwLjI1NSDEkeG6v24gMC4yNjkuIEdpw6EgdHLhu4sgMC44IGhvw6BuIHRvw6BuIG7hurFtIG5nb8OgaSBraG/huqNuZyB0aW4gY+G6rXkgbsOgeSwgY+G7p25nIGPhu5EgdGjDqm0ga+G6v3QgbHXhuq1uIGLDoWMgYuG7jyBnaeG6oyB0aHV54bq/dCBudWxsLiAgIA0KICANCiMgKipQaOG6p24gNDogUGjDom4gdMOtY2ggbeG7kWkgcXVhbiBo4buHIGdp4buvYSBoYWkgYmnhur9uIMSR4buLbmggdMOtbmgqKiAgIA0KDQotIENo4buNbiBjw6FjIGPhurdwIGJp4bq/biDEkeG7i25oIHTDrW5oOiAgICANCiAgLSA8c3BhbiBzdHlsZT0iY29sb3I6IHB1cnBsZTsiPkdlbmRlcjwvc3Bhbj4gIHbDoCA8c3BhbiBzdHlsZT0iY29sb3I6IHB1cnBsZTsiPlByb2R1Y3RDYXRlZ29yeTwvc3Bhbj4uICAgDQogIC0gPHNwYW4gc3R5bGU9ImNvbG9yOiBwdXJwbGU7Ij5NYXJpdGFsU2F0dXM8L3NwYW4+ICB2w6AgPHNwYW4gc3R5bGU9ImNvbG9yOiBwdXJwbGU7Ij5Ib21ld25lcjwvc3Bhbj4uICAgDQogIC0gPHNwYW4gc3R5bGU9ImNvbG9yOiBwdXJwbGU7Ij5NYXJpdGFsU3RhdHVzPC9zcGFuPiAgdsOgIDxzcGFuIHN0eWxlPSJjb2xvcjogcHVycGxlOyI+UHJvZHVjdEZhbWlseTwvc3Bhbj4uICAgDQoNCiMjICoqR2VuZGVyIHbDoCBQcm9kdWN0Q2F0ZWdvcnkqKiAgIA0KDQojIyMgKipC4bqjbmcgdOG6p24gc3XhuqV0IGNow6lvKiogICANCiogQ8OidSBo4buPaSDEkcaw4bujYyDEkeG6t3QgcmE6IFRow7NpIHF1YW4gbXVhIHPhuq9tIHRoZW8gZGFuaCBt4bulYyBz4bqjbiBwaOG6qW0gY+G7p2EgbmFtIGdp4bubaSBjw7Mga2jDoWMgYmnhu4d0IHNvIHbhu5tpIG7hu68gZ2nhu5tpIGhheSBraMO0bmcuICAgDQoNCiogKipC4bqjbmcgdOG6p24gc+G7kSoqDQpgYGB7cixlY2hvPVRSVUV9DQojIHThuqFvIGLhuqNuZyB04bqnbiBz4buRIA0KczEgPC0gdGFibGUoIGQxJFByb2R1Y3RDYXRlZ29yeSwgZDEkR2VuZGVyKQ0KDQpgYGANCg0KYGBge3IsZWNobz1GQUxTRX0NCiMgaGnhu4NuIHRo4buLIGLhuqNuZyB04bqnbiBz4buRDQojIFThuqFvIGLhuqNuZyBjaMOpbyBk4bqhbmcgd2lkZQ0KZDIgPC0gYXMuZGF0YS5mcmFtZS5tYXRyaXgodGFibGUoIGQxJFByb2R1Y3RDYXRlZ29yeSwgZDEkR2VuZGVyKSkNCiMgVGjDqm0gY+G7mXQgUHJvZHVjdENhdGVnb3J5IHThu6sgcm93bmFtZXMNCg0KZDMgPC0gZDIgJT4lDQogIHRpYmJsZTo6cm93bmFtZXNfdG9fY29sdW1uKHZhciA9ICJQcm9kdWN0Q2F0ZWdvcnkiKQ0KDQojIEhp4buDbiB0aOG7iyB24bubaSBkYXRhdGFibGUNCkRUOjpkYXRhdGFibGUoZDMsIG9wdGlvbnMgPSBsaXN0KHBhZ2VMZW5ndGggPSAxMCwgYXV0b1dpZHRoID0gVFJVRSksY2FwdGlvbiA9ICJC4bqjbmcgc+G7kSBsxrDhu6NuZyBz4bqjbiBwaOG6qW0gdGhlbyB04burbmcgbG/huqFpIHbDoCBnaeG7m2kgdMOtbmgiKQ0KYGBgDQoNCiogQuG6o25nIHThuqduIHN14bqldDogICANCg0KYGBge3IsZWNobz1UUlVFfQ0KaDEgPC0gcHJvcC50YWJsZShzMSwgbWFyZ2luID0gMikgKiAxMDANCmgxIDwtIHJvdW5kKGgxLDIpDQpgYGANCg0KYGBge3IsZWNobz1GQUxTRX0NCiMgaGnhu4NuIHRo4buLIGLhuqNuZyB04bqnbiBz4buRDQojIFThuqFvIGLhuqNuZyBjaMOpbyBk4bqhbmcgd2lkZQ0KcjEgPC0gYXMuZGF0YS5mcmFtZS5tYXRyaXgoaDEpDQojIFRow6ptIGPhu5l0IFByb2R1Y3RDYXRlZ29yeSB04burIHJvd25hbWVzDQpyMiA8LSByMSAlPiUNCiAgdGliYmxlOjpyb3duYW1lc190b19jb2x1bW4odmFyID0gIlByb2R1Y3RDYXRlZ29yeSIpDQoNCiMgSGnhu4NuIHRo4buLIHbhu5tpIGRhdGF0YWJsZQ0KRFQ6OmRhdGF0YWJsZShyMiwgb3B0aW9ucyA9IGxpc3QocGFnZUxlbmd0aCA9IDEwLCBhdXRvV2lkdGggPSBUUlVFKSxjYXB0aW9uID0gIlThu7cgbOG7hyBwaMOibiBi4buRIGdp4bubaSB0w61uaCB0cm9uZyBt4buXaSBkYW5oIG3hu6VjIHPhuqNuIHBo4bqpbSIpDQpgYGANCg0KKiBMw70gZG8gbOG7sWEgY2jhu41uIHBow6JuIHTDrWNoIGThu68gbGnhu4d1IHRoZW8gdOG7tyBs4buHIHBo4bqnbiB0csSDbSB0aGVvIGPhu5l0ICB2w6wgbsOzIGdpw7pwIGNow7puZyB0YSBzbyBzw6FuaCBjxqEgY+G6pXUgbXVhIHPhuq9tIGhv4bq3YyBow6BuaCB2aSB0acOqdSBkw7luZyByacOqbmcgY+G7p2EgdOG7q25nIG5ow7NtIGdp4bubaSB0w61uaC4gICANCg0KICAqIFThu6ljIGzDoCBtdeG7kW4gYmnhur90IE5hbSBtdWEgbmjhu69uZyBnw6wsIHbDoCBO4buvIG11YSBuaOG7r25nIGfDrCwgdsOgIGxp4buHdSBjw7Mgc+G7sSBraMOhYyBiaeG7h3QgdHJvbmcgZGFuaCBt4bulYyBow6BuZyBow7NhIG3DoCBt4buXaSBuaMOzbSBnaeG7m2kgdMOtbmggbsOgeSDGsHUgdGnDqm4gaGF5IGtow7RuZy4gIA0KICANCiAgKiBUw7NtIGzhuqFpOiBDaOG7jW4gdMOtbmggdGhlbyBj4buZdCBsw6AgxJHhu4MgaGnhu4N1IHLDtSBoxqFuIHbhu4EgdGjDs2kgcXVlbiB2w6AgxrB1IHRpw6puIG11YSBz4bqvbSBj4bunYSB04burbmcgZ2nhu5tpIHTDrW5oIG3hu5l0IGPDoWNoIHJpw6puZyBiaeG7h3QsIHNhdSDEkcOzIHNvIHPDoW5oIG5o4buvbmcgdGjDs2kgcXVlbiB2w6AgxrB1IHRpw6puIMSRw7MgZ2nhu69hIE5hbSB2w6AgTuG7ryDEkeG7gyB4w6FjIMSR4buLbmggeGVtIGPDsyBz4buxIGtow6FjIGJp4buHdCBoYXkga2jDtG5nLiAgIA0KICANCiMjIyAqKlRy4buxYyBxdWFuIGjDs2EqKg0KDQpgYGB7cixlY2hvPVRSVUV9DQpnZ3Bsb3QoZDEsIGFlcyh4ID0gUHJvZHVjdENhdGVnb3J5LCBmaWxsID0gR2VuZGVyKSkgKw0KICBnZW9tX2Jhcihwb3NpdGlvbiA9ICJkb2RnZSIpICsNCiAgbGFicyh0aXRsZSA9ICJQaMOibiBi4buRIEdp4bubaSB0w61uaCB0aGVvIERhbmggbeG7pWMgU+G6o24gcGjhuqltIiwNCiAgICAgICB4ID0gIkRhbmggbeG7pWMgU+G6o24gcGjhuqltIiwNCiAgICAgICB5ID0gIlPhu5EgbMaw4bujbmciLA0KICAgICAgIGZpbGwgPSAiR2nhu5tpIHTDrW5oIikgKyBjb29yZF9mbGlwKCkgKw0KICB0aGVtZV9taW5pbWFsKCkNCmBgYA0KDQojIyMgKipOaOG6rW4geMOpdDoqKiAgIA0KICAqIEPDsyB24bq7IG5oxrAgY8OzIHPhu7EgbGnDqm4ga+G6v3QgZ2nhu69hIGhhaSBiaeG6v24gbsOgeS4gxJBp4buBdSBuw6B5IMSRxrDhu6NjIHRo4buDIGhp4buHbiBxdWEgdmnhu4djIHBow6JuIGLhu5Ugc+G7kSBsxrDhu6NuZyBtdWEgc+G6o24gcGjhuqltIGPhu6dhIG5hbSB2w6AgbuG7ryBsw6Aga2jDoWMgbmhhdSDEkcOhbmcga+G7gyDhu58gbmhp4buBdSBkYW5oIG3hu6VjLCBjaOG7qSBraMO0bmcgcGjhuqNpIGzDoCDEkeG7k25nIMSR4buBdS4gICANCiAgKiDEkOG7kWkgduG7m2kgbeG7mXQgc+G7kSBkYW5oIG3hu6VjIG5oxrAgVmVnZXRhYmxlcyAoUmF1IGPhu6cpLCBTbmFjayBGb29kcyAoxJDhu5MgxINuIHbhurd0KSwgTWVhdCAoVGjhu4t0KSwgRnJvemVuIERlc3NlcnRzIChNw7NuIHRyw6FuZyBtaeG7h25nIMSRw7RuZyBs4bqhbmgpLCBEYWlyeSAoU+G6o24gcGjhuqltIHThu6sgc+G7r2EpLCBDYW5kbGVzIChO4bq/biksIGdp4bubaSB0w61uaCBO4buvIChGIC0gbcOgdSBjYW0pIGPDsyB4dSBoxrDhu5tuZyBtdWEgbmhp4buBdSBoxqFuIMSRw6FuZyBr4buDIHNvIHbhu5tpIGdp4bubaSB0w61uaCBOYW0gKE0gLSBtw6B1IHhhbmggbmfhu41jKS4gICAgICANCiAgDQogICogxJDhu5FpIHbhu5tpIG3hu5l0IHPhu5EgZGFuaCBt4bulYywgZ2nhu5tpIHTDrW5oIE5hbSAoTSAtIG3DoHUgeGFuaCBuZ+G7jWMpIGPDsyB4dSBoxrDhu5tuZyBtdWEgbmhp4buBdSBoxqFuIMSRw6FuZyBr4buDIHNvIHbhu5tpIGdp4bubaSB0w61uaCBO4buvIChGIC0gbcOgdSBjYW0pLiBEYW5oIG3hu6VjIG7hu5VpIGLhuq10IG5o4bqldCBsw6A6IERlY29uZ2VzdGFudHMgKFRodeG7kWMgdGjDtG5nIG3FqWkvdGh14buRYyBj4bqjbSkuIMSQw6J5IGzDoCBkYW5oIG3hu6VjIGPDsyBz4buxIGNow6puaCBs4buHY2ggcsO1IHLhu4d0IG5o4bqldCB24buBIHPhu5EgbMaw4bujbmcgbXVhLCB24bubaSBOYW0gbXVhIG5oaeG7gXUgaMahbiBO4buvIHLhuqV0IG5oaeG7gXUuICAgDQogIA0KICAqIEvhur90IGx14bqtbiBjaHVuZzogYmnhu4N1IMSR4buTIGNobyB0aOG6pXkgcsO1IHLDoG5nIHLhurFuZyBow6BuaCB2aSBtdWEgc+G6r20gY8OhYyBkYW5oIG3hu6VjIHPhuqNuIHBo4bqpbSBjw7Mgc+G7sSBraMOhYyBiaeG7h3QgZ2nhu69hIGdp4bubaSB0w61uaCBOYW0gdsOgIE7hu68uIEPDsyBuaOG7r25nIGRhbmggbeG7pWMgc+G6o24gcGjhuqltIMSRxrDhu6NjIG3hu5l0IGdp4bubaSB0w61uaCDGsGEgY2h14buZbmcgaMahbiDEkcOhbmcga+G7gyBzbyB24bubaSBnaeG7m2kgdMOtbmggY8OybiBs4bqhaSwgdHJvbmcga2hpIOG7nyBt4buZdCBz4buRIGRhbmggbeG7pWMga2jDoWMsIHPhu7EgcGjDom4gYuG7lSBsw6AgdMawxqFuZyDEkeG7kWkgxJHhu5NuZyDEkeG7gXUuIMSQaeG7gXUgbsOgeSBn4bujaSDDvSBy4bqxbmcgZ2nhu5tpIHTDrW5oIGzDoCBt4buZdCB54bq/dSB04buRIGPDsyDhuqNuaCBoxrDhu59uZyDEkeG6v24gbG/huqFpIHPhuqNuIHBo4bqpbSBtw6Aga2jDoWNoIGjDoG5nIGzhu7FhIGNo4buNbiBtdWEuICAgDQogDQojIyMgKipLaeG7g20gxJHhu4tuaCB0aOG7kW5nIGvDqioqICAgDQoNCiogKipQaMOhdCBiaeG7g3UgZ2nhuqMgdGh1eeG6v3Q6KiogICANCiAgKiBHaeG6oyB0aHV54bq/dCAkSF8wJDogSGFpIGJp4bq/biBHZW5kZXIgdsOgIFByb2R1Y3RDYXRlZ29yeSBsw6AgxJHhu5ljIGzhuq1wLiAgIA0KICAqIEdp4bqjIHRodXnhur90ICRIXzEkOiBIYWkgYmnhur9uIEdlbmRlciB2w6AgUHJvZHVjdENhdGVnb3J5IGzDoCBraMO0bmcgxJHhu5ljIGzhuq1wLiAgIA0KICANCmBgYHtyLGVjaG89VFJVRX0NCmNoaXNxLnRlc3QoczEpDQoNCmBgYA0KMS4qKkLDoW8gY8OhbyBnacOhIHRy4buLIENoaSAtIGLDrG5oIHBoxrDGoW5nLCBi4bqtYyB04buxIGRvIHbDoCBnacOhIHRy4buLIHA6KiogICAgICANCiAgKiBHacOhIHRy4buLIENoaSAtIGLDrG5oIHBoxrDGoW5nICh4LXNxdWFyZWQpOiA1MC40MDcuICAgIA0KICAqIELhuq1jIHThu7EgZG8gKGRmKTogNDQgICANCiAgKiBHacOhIHRy4buLIHAgKHAtdmFsdWUpOiAwLjIzNDkgICAgIA0KICANCjIuKipE4buxYSB2w6BvIGdpw6EgdHLhu4sgcCwgxJHGsGEgcmEga+G6v3QgbHXhuq1uIHbhu4EgdMOtbmggxJHhu5ljIGzhuq1wIGPhu6dhIGhhaSBiaeG6v24g4bufIG3hu6ljIMO9IG5naMSpYSAkXGFscGhhPTAuMDUkOioqICAgDQogIA0KICAqIFNvIHPDoW5oIGdpw6EgdHLhu4sgcCAoMC4yMzQ5KSB24bubaSBt4bupYyDDvSBuZ2jEqWEgJFxhbHBoYT0wLjA1JC4gICANCiAgKiBWw6wgcC12YWx1ZSAoMC4yMzQ5KSA+ICRcYWxwaGEoMC4wNSkkLCBjaMO6bmcgdGEga2jDtG5nIGPDsyDEkeG7pyBi4bqxbmcgY2jhu6luZyDEkeG7gyBiw6FjIGLhu48gZ2nDoSB0aHV54bq/dCAkSF8wJC4gICANCiAgDQpL4bq/dCBsdeG6rW46IOG7nyBt4bupYyDDvSBuZ2jEqWEgJFxhbHBoYT0wLjA1JCwga2jDtG5nIGPDsyBi4bqxbmcgY2jhu6luZyB0aOG7kW5nIGvDqiDEkeG7pyBt4bqhbmggxJHhu4Mga+G6v3QgbHXhuq1uIHLhurFuZyBjw7MgbeG7kWkgbGnDqm4gaOG7hyBnaeG7r2EgZ2nhu5tpIHTDrW5oIHbDoCBkYW5oIG3hu6VjIHPhuqNuIHBo4bqpbSAuIEhhaSBiaeG6v24gbsOgeSBjw7MgdGjhu4MgxJHGsOG7o2MgZ+G7jWkgbMOgIMSR4buZYyBs4bqtcCB24buBIG3hurd0IHRo4buRbmcga8OqLiAgICAgDQoNCioqKg0KICANCiMjICoqTWFyaXRhbFNhdHVzIHbDoCBIb21ld25lcioqICAgDQoNCiogQ8OidSBo4buPaTogdHJvbmcgc+G7kSBuaOG7r25nIG5nxrDhu51pIGPDsyB0w6xuaCB0cuG6oW5nIGjDtG4gbmjDom4gbMOgIMSRw6Mga+G6v3QgaMO0biB0aMOsIHThu7cgbOG7hyBz4bufIGjhu691IG5ow6AgY+G7p2EgaOG7jSBsw6AgYmFvIG5oacOqdT8gICAgDQoNCiMjIyAqKkLhuqNuZyB04bqnbiBzdeG6pXQgY2jDqW8qKiAgIA0KDQoNCmBgYHtyLGVjaG89VFJVRX0NCiMgdOG6oW8gYuG6o25nIHThuqduIHPhu5EgDQpzMiA8LSB0YWJsZSggZDEkTWFyaXRhbFN0YXR1cywgZDEkSG9tZW93bmVyKQ0KDQpgYGANCg0KYGBge3IsZWNobz1GQUxTRX0NCiMgaGnhu4NuIHRo4buLIGLhuqNuZyB04bqnbiBz4buRDQojIFThuqFvIGLhuqNuZyBjaMOpbyBk4bqhbmcgd2lkZQ0KZDIgPC0gYXMuZGF0YS5mcmFtZS5tYXRyaXgodGFibGUoIGQxJE1hcml0YWxTdGF0dXMsIGQxJEhvbWVvd25lcikpDQojIFRow6ptIGPhu5l0IE1hcml0YWxTdGF0dXMgdOG7qyByb3duYW1lcw0KDQpkMyA8LSBkMiAlPiUgDQogIHRpYmJsZTo6cm93bmFtZXNfdG9fY29sdW1uKHZhciA9ICJNYXJpdGFsU3RhdHVzIikNCg0KIyBIaeG7g24gdGjhu4sgduG7m2kgZGF0YXRhYmxlDQpEVDo6ZGF0YXRhYmxlKGQzLCBvcHRpb25zID0gbGlzdChwYWdlTGVuZ3RoID0gMTAsIGF1dG9XaWR0aCA9IFRSVUUpLGNhcHRpb24gPSAiQuG6o25nIHPhu5EgbMaw4bujbmcgbmfGsOG7nWkgc+G7nyBo4buvdSBuaMOgIHRoZW8gbmjDs20gdMOsbmggdHLhuqFuZyBow7RuIG5ow6JuIikNCmBgYA0KDQoqIELhuqNuZyB04bqnbiBzdeG6pXQ6ICAgDQoNCmBgYHtyLGVjaG89VFJVRX0NCnIwIDwtIHByb3AudGFibGUoczIsIG1hcmdpbiA9IDEpICogMTAwDQpyMCA8LSByb3VuZChyMCwyKQ0KYGBgDQoNCmBgYHtyLGVjaG89RkFMU0V9DQojIGhp4buDbiB0aOG7iyBi4bqjbmcgdOG6p24gc+G7kQ0KIyBU4bqhbyBi4bqjbmcgY2jDqW8gZOG6oW5nIHdpZGUNCnIxIDwtIGFzLmRhdGEuZnJhbWUubWF0cml4KHIwKQ0KIyBUaMOqbSBj4buZdCBNYXJpdGFsU3RhdHVzIHThu6sgcm93bmFtZXMNCnIyIDwtIHIxICU+JQ0KICB0aWJibGU6OnJvd25hbWVzX3RvX2NvbHVtbih2YXIgPSAiTWFyaXRhbFN0YXR1cyIpDQoNCiMgSGnhu4NuIHRo4buLIHbhu5tpIGRhdGF0YWJsZQ0KRFQ6OmRhdGF0YWJsZShyMiwgb3B0aW9ucyA9IGxpc3QocGFnZUxlbmd0aCA9IDEwLCBhdXRvV2lkdGggPSBUUlVFKSxjYXB0aW9uID0gIlThu7cgbOG7hyBz4bufIGjhu691IG5ow6AgdHJvbmcgdOG7q25nIG5ow7NtIHTDrG5oIHRy4bqhbmcgaMO0biBuaMOibiIpDQpgYGANCg0KICBN4bulYyB0acOqdSBj4bunYSBjw6J1IGjhu49pIGzDoCB0w6xtIGhp4buDdSBz4buxIHBow6JuIGLhu5UgY+G7p2Egdmnhu4djIHPhu58gaOG7r3UgbmjDoCB0cm9uZyBu4buZaSBi4buZIHThu6tuZyBuaMOzbSB0w6xuaCB0cuG6oW5nIGjDtG4gbmjDom4uIFThu7cgbOG7hyBwaOG6p24gdHLEg20gdGhlbyBow6BuZyBjdW5nIGPhuqVwIHRow7RuZyB0aW4gbsOgeSBt4buZdCBjw6FjaCB0cuG7sWMgdGnhur9wLCBjaG8gdGjhuqV5IMSR4buRaSB24bubaSBt4buXaSBuaMOzbSB0w6xuaCB0cuG6oW5nIGjDtG4gbmjDom4sIHThu7cgbOG7hyBiYW8gbmhpw6p1IHBo4bqnbiB0csSDbSBz4bufIGjhu691IG5ow6AgdsOgIGJhbyBuaGnDqnUgcGjhuqduIHRyxINtIGtow7RuZy4gICAgDQogIA0KICBUw61uaCB04bu3IGzhu4cgcGjhuqduIHRyxINtIHRoZW8gaMOgbmcgY2hvIHBow6lwIGLhuqFuIG5ow6xuIHbDoG8gdOG7tyBs4buHIGPhu6dhIG3hu5l0IHRodeG7mWMgdMOtbmggKHPhu58gaOG7r3UgbmjDoCkgdHJvbmcgbeG7mXQgbmjDs20gZMOibiBz4buRIGPhu6UgdGjhu4MgKG5o4buvbmcgbmfGsOG7nWkgxJHDoyBr4bq/dCBow7RuKS4gICANCiAgDQojIyMgKipUcuG7pWMgcXVhbiBow7NhKiogICANCg0KYGBge3IsZWNobz1UUlVFfQ0KZ2dwbG90KGQxLCBhZXMoeCA9IE1hcml0YWxTdGF0dXMsIGZpbGwgPSBIb21lb3duZXIpKSArDQogIGdlb21fYmFyKHBvc2l0aW9uID0gImRvZGdlIikgKw0KICBsYWJzKHRpdGxlID0gIlBow6JuIGLhu5EgVMOsbmggdHLhuqFuZyBIw7RuIG5ow6JuIHRoZW8gUXV54buBbiBT4bufIGjhu691IE5ow6AiLA0KICAgICAgIHggPSAiVMOsbmggdHLhuqFuZyBIw7RuIG5ow6JuIiwNCiAgICAgICB5ID0gIlPhu5EgbMaw4bujbmciLA0KICAgICAgIGZpbGwgPSAiQ2jhu6cgc+G7nyBo4buvdSBuaMOgIikgKw0KICB0aGVtZV9taW5pbWFsKCkNCiAgDQpgYGANCg0KICANCiMjIyAqKk5o4bqtbiB4w6l0KiogICAgDQogICogQ8OzIHbhursgbmjGsCBjw7MgbeG7mXQgbeG7kWkgbGnDqm4ga+G6v3QgcsO1IHLDoG5nIGdp4buvYSB0w6xuaCB0cuG6oW5nIGjDtG4gbmjDom4gdsOgIHF1eeG7gW4gc+G7nyBo4buvdSBuaMOgLiBYdSBoxrDhu5tuZyBjaHVuZyBsw6Agbmjhu69uZyBuZ8aw4budaSDEkcOjIGvhur90IGjDtG4gY8OzIHThu7cgbOG7hyBz4bufIGjhu691IG5ow6AgY2FvIGjGoW4gxJHDoW5nIGvhu4Mgc28gduG7m2kgbmjhu69uZyBuZ8aw4budaSDEkeG7mWMgdGjDom4uICAgDQogIA0KICAqIMSQ4buRaSB24bubaSBuaMOzbSAixJDDoyBr4bq/dCBow7RuIiAoTSk6IHPhu5EgbMaw4bujbmcgbmfGsOG7nWkgc+G7nyBo4buvdSBuaMOgIChZIC0gbcOgdSB4YW5oIG5n4buNYykgbOG7m24gaMahbiBy4bqldCBuaGnhu4F1IHNvIHbhu5tpIHPhu5EgbMaw4bujbmcgbmfGsOG7nWkga2jDtG5nIHPhu58gaOG7r3UgbmjDoCAoTiAtIG3DoHUgY2FtKSwgY8OzIGjGoW4gNTAwMCBuZ8aw4budaSDEkcOjIGvhur90IGjDtG4gbMOgIGNo4bunIHPhu58gaOG7r3UgbmjDoCwgdHJvbmcga2hpIHPhu5EgbmfGsOG7nWkgxJHDoyBr4bq/dCBow7RuIG5oxrBuZyBraMO0bmcgc+G7nyBo4buvdSBuaMOgIGNo4buJIGtob+G6o25nIDE3MDAtMTgwMC4gICANCiAgDQogICogxJDhu5FpIHbhu5tpIG5ow7NtICLEkOG7mWMgdGjDom4iIChTKTogc+G7kSBsxrDhu6NuZyBuZ8aw4budaSBraMO0bmcgc+G7nyBo4buvdSBuaMOgIChOIC0gbcOgdSBjYW0pIGzhuqFpIGNhbyBoxqFuIHPhu5EgbMaw4bujbmcgbmfGsOG7nWkgc+G7nyBo4buvdSBuaMOgIChZIC0gbcOgdSB4YW5oIG5n4buNYykuIEPDsyBraG/huqNuZyBn4bqnbiA0MDAwIG5nxrDhu51pIMSR4buZYyB0aMOibiBraMO0bmcgc+G7nyBo4buvdSBuaMOgLCB0cm9uZyBraGkgc+G7kSBuZ8aw4budaSDEkeG7mWMgdGjDom4gc+G7nyBo4buvdSBuaMOgIGzDoCBraG/huqNuZyAzMzAwLTM0MDAuICAgDQogIA0KICAqIEvhur90IGx14bqtbiBjaHVuZzogdMOsbmggdHLhuqFuZyBow7RuIG5ow6JuICfEkMOjIGvhur90IGjDtG4nIMSRaSBrw6htIHbhu5tpIGto4bqjIG7Eg25nIGNhbyBoxqFuIG5oaeG7gXUgdHJvbmcgdmnhu4djIHPhu58gaOG7r3UgbmjDoCwgdHJvbmcga2hpIHTDrG5oIHRy4bqhbmcgaMO0biBuaMOibiAnxJDhu5ljIHRow6JuJyBs4bqhaSBjw7MgdOG7tyBs4buHIGtow7RuZyBz4bufIGjhu691IG5ow6AgY2FvIGjGoW4uIE3hu5FpIHF1YW4gaOG7hyBuw6B5IGzDoCBo4bujcCBsw70gdGhlbyBs4bq9IHRoxrDhu51uZywgdsOsIHZp4buHYyBr4bq/dCBow7RuIHRoxrDhu51uZyBsacOqbiBxdWFuIMSR4bq/biB2aeG7h2Mg4buVbiDEkeG7i25oIGN14buZYyBz4buRbmcsIGJhbyBn4buTbSBj4bqjIHZp4buHYyBtdWEgdsOgIHPhu58gaOG7r3UgdMOgaSBz4bqjbiBs4bubbiBuaMawIG5ow6Ag4bufLiAgICAgIA0KICANCiMjIyAqKktp4buDbSDEkeG7i25oIHRo4buRbmcga8OqKiogICANCg0KKiAqKlBow6F0IGJp4buDdSBnaeG6oyB0aHV54bq/dDoqKiAgIA0KICAqIEdp4bqjIHRodXnhur90ICRIXzAkOiBIYWkgYmnhur9uIE1hcml0YWxTYXR1cyB2w6AgSG9tZXduZXIgbMOgIMSR4buZYyBs4bqtcC4gICANCiAgKiBHaeG6oyB0aHV54bq/dCAkSF8xJDogSGFpIGJp4bq/biBNYXJpdGFsU2F0dXMgdsOgIEhvbWV3bmVyIGzDoCBraMO0bmcgxJHhu5ljIGzhuq1wLiAgIA0KICANCmBgYHtyLGVjaG89VFJVRX0NCmNoaXNxLnRlc3QoczIpDQoNCmBgYA0KMS4qKkLDoW8gY8OhbyBnacOhIHRy4buLIENoaSAtIGLDrG5oIHBoxrDGoW5nLCBi4bqtYyB04buxIGRvIHbDoCBnacOhIHRy4buLIHA6KiogICAgICANCiAgKiBHacOhIHRy4buLIENoaSAtIGLDrG5oIHBoxrDGoW5nICh4LXNxdWFyZWQpOiAxMjQxLjIuICAgDQogICogQuG6rWMgdOG7sSBkbyAoZGYpOiAxICANCiAgKiBHacOhIHRy4buLIHAgKHAtdmFsdWUpOiA8IDIuMmUtMTYNCiAgDQoyLioqROG7sWEgdsOgbyBnacOhIHRy4buLIHAsIMSRxrBhIHJhIGvhur90IGx14bqtbiB24buBIHTDrW5oIMSR4buZYyBs4bqtcCBj4bunYSBoYWkgYmnhur9uIOG7nyBt4bupYyDDvSBuZ2jEqWEgJFxhbHBoYT0wLjA1JDoqKiAgIA0KICANCiAgKiBTbyBzw6FuaCBnacOhIHRy4buLIHAgKDwgMi4yZS0xNikgduG7m2kgbeG7qWMgw70gbmdoxKlhICRcYWxwaGE9MC4wNSQuICAgDQogICogVsOsIHAtdmFsdWUgKDwgMi4yZS0xNikgPCAkXGFscGhhKDAuMDUpJCwgY2jDum5nIHRhIGPDsyDEkeG7pyBi4bqxbmcgY2jhu6luZyDEkeG7gyBiw6FjIGLhu48gZ2nDoSB0aHV54bq/dCAkSF8wJC4gICANCiAgDQpL4bq/dCBsdeG6rW46IOG7nyBt4bupYyDDvSBuZ2jEqWEgJFxhbHBoYT0wLjA1JCwgY8OzIGLhurFuZyBjaOG7qW5nIHRo4buRbmcga8OqIMSR4bunIG3huqFuaCDEkeG7gyBr4bq/dCBsdeG6rW4gcuG6sW5nIGPDsyBt4buRaSBsacOqbiBo4buHIGdp4buvYSBnaeG7m2kgdMOtbmggdsOgIGRhbmggbeG7pWMgc+G6o24gcGjhuqltIC4gSGFpIGJp4bq/biBuw6B5IGPDsyB0aOG7gyDEkcaw4bujYyBn4buNaSBsw6AgIGtow7RuZyDEkeG7mWMgbOG6rXAgIHbhu4EgbeG6t3QgdGjhu5FuZyBrw6ouICAgICANCg0KMy4qKlRo4bqjbyBsdeG6rW4gduG7gSBi4bqjbiBjaOG6pXQgY+G7p2EgbeG7kWkgcXVhbiBo4buHKiogICANCg0KICBC4bqjbiBjaOG6pXQgY+G7p2EgbeG7kWkgcXVhbiBo4buHIG7DoHkgbMOgIG3hu5l0IHPhu7EgdMawxqFuZyBwaOG6o24gcsO1IG7DqXQ6IHTDrG5oIHRy4bqhbmcgaMO0biBuaMOibiAixJDDoyBr4bq/dCBow7RuIiDEkWkga8OobSB24bubaSBraOG6oyBuxINuZyBz4bufIGjhu691IG5ow6AgY2FvIGjGoW4gxJHDoW5nIGvhu4MsIHRyb25nIGtoaSB0w6xuaCB0cuG6oW5nIGjDtG4gbmjDom4gIsSQ4buZYyB0aMOibiIgY8OzIHThu7cgbOG7hyBraMO0bmcgc+G7nyBo4buvdSBuaMOgIGNhbyBoxqFuLiDEkGnhu4F1IG7DoHkgbmjhuqV0IHF1w6FuIHbhu5tpIGPDoWMgcXVhbiBzw6F0IHjDoyBo4buZaSB0aMO0bmcgdGjGsOG7nW5nLCBuxqFpIHZp4buHYyDhu5VuIMSR4buLbmggZ2lhIMSRw6xuaCB0aMaw4budbmcgZ+G6r24gbGnhu4FuIHbhu5tpIGPDoWMgcXV54bq/dCDEkeG7i25oIHTDoGkgY2jDrW5oIHF1YW4gdHLhu41uZyBuaMawIHZp4buHYyBtdWEgdsOgIHPhu58gaOG7r3UgbmjDoC4gICANCg0KDQojIyAqKk1hcml0YWxTdGF0dXMgdsOgIFByb2R1Y3RGYW1pbHkqKiAgIA0KDQojIyMgKipC4bqjbmcgdOG6p24gc3XhuqV0IGNow6lvKioNCg0KKiBDw6J1IGjhu49pOiBuaOG7r25nIG5nxrDhu51pIMSRw6Mga+G6v3QgaMO0biB0aMaw4budbmcgbXVhIG5o4buvbmcgbmjDs20gc+G6o24gcGjhuqltIG7DoG8/ICAgICAgDQoNCmBgYHtyLGVjaG89VFJVRX0NCiMgdOG6oW8gYuG6o25nIHThuqduIHPhu5EgDQplIDwtIHRhYmxlKCBkMSRNYXJpdGFsU3RhdHVzLCBkMSRQcm9kdWN0RmFtaWx5KQ0KDQpgYGANCg0KYGBge3IsZWNobz1GQUxTRX0NCiMgaGnhu4NuIHRo4buLIGLhuqNuZyB04bqnbiBz4buRDQojIFThuqFvIGLhuqNuZyBjaMOpbyBk4bqhbmcgd2lkZQ0KZTIgPC0gYXMuZGF0YS5mcmFtZS5tYXRyaXgodGFibGUoIGQxJE1hcml0YWxTdGF0dXMsIGQxJFByb2R1Y3RGYW1pbHkpKQ0KIyBUaMOqbSBj4buZdCBNYXJpdGFsU3RhdHVzIHThu6sgcm93bmFtZXMNCg0KZTMgPC0gZTIgJT4lIA0KICB0aWJibGU6OnJvd25hbWVzX3RvX2NvbHVtbih2YXIgPSAiTWFyaXRhbFN0YXR1cyIpDQoNCiMgSGnhu4NuIHRo4buLIHbhu5tpIGRhdGF0YWJsZQ0KRFQ6OmRhdGF0YWJsZShlMywgb3B0aW9ucyA9IGxpc3QocGFnZUxlbmd0aCA9IDEwLCBhdXRvV2lkdGggPSBUUlVFKSxjYXB0aW9uID0gIkLhuqNuZyBz4buRIGzGsOG7o25nIG5nxrDhu51pIMSRw6Mga+G6v3QgaMO0biB0aGVvIG5ow7NtIHPhuqNuIHBo4bqpbSIpDQpgYGANCg0KKiBC4bqjbmcgdOG6p24gc3XhuqV0OiAgIA0KDQpgYGB7cixlY2hvPVRSVUV9DQplMCA8LSBwcm9wLnRhYmxlKGUsIG1hcmdpbiA9IDIpICogMTAwDQplMCA8LSByb3VuZChlMCwyKQ0KYGBgDQoNCmBgYHtyLGVjaG89RkFMU0V9DQojIGhp4buDbiB0aOG7iyBi4bqjbmcgdOG6p24gc+G7kQ0KIyBU4bqhbyBi4bqjbmcgY2jDqW8gZOG6oW5nIHdpZGUNCmUxIDwtIGFzLmRhdGEuZnJhbWUubWF0cml4KGUwKQ0KIyBUaMOqbSBj4buZdCBNYXJpdGFsU3RhdHVzIHThu6sgcm93bmFtZXMNCmU0IDwtIGUxICU+JQ0KICB0aWJibGU6OnJvd25hbWVzX3RvX2NvbHVtbih2YXIgPSAiTWFyaXRhbFN0YXR1cyIpDQoNCiMgSGnhu4NuIHRo4buLIHbhu5tpIGRhdGF0YWJsZQ0KRFQ6OmRhdGF0YWJsZShlNCwgb3B0aW9ucyA9IGxpc3QocGFnZUxlbmd0aCA9IDEwLCBhdXRvV2lkdGggPSBUUlVFKSxjYXB0aW9uID0gIlThu7cgbOG7hyBwaOG6p24gdHLEg20gbmfGsOG7nWkgxJHDoyBr4bq/dCBow7RuIHRoZW8gdOG7q25nIG5ow7NtIHPhuqNuIHBo4bqpbSIpDQpgYGANCg0KICBWaeG7h2MgdMOtbmggdG/DoW4gdOG7tyBs4buHIHBo4bqnbiB0csSDbSB0aGVvIGPhu5l0LCBt4buXaSDDtCBz4bq9IGNobyBiaeG6v3Q6ICJUcm9uZyB04buVbmcgc+G7kSBsxrDhu6N0IG11YSBj4bunYSBuaMOzbSBz4bqjbiBwaOG6qW0gWCAodsOtIGThu6U6IERyaW5rKSwgYmFvIG5oacOqdSBwaOG6p24gdHLEg20gxJHGsOG7o2MgdGjhu7FjIGhp4buHbiBi4bufaSBuZ8aw4budaSDEkcOjIGvhur90IGjDtG4gKE0pIHbDoCBiYW8gbmhpw6p1IHBo4bqnbiB0csSDbSDEkcaw4bujYyB0aOG7sWMgaGnhu4duIGLhu59pIG5nxrDhu51pIMSR4buZYyB0aMOibiAoUykuIiAgIA0KICANCiMjIyoqVHLhu7FjIHF1YW4gaMOzYSoqICAgDQoNCmBgYHtyLGVjaG89VFJVRX0NCg0KZ2dwbG90KGQxLCBhZXMoeCA9IE1hcml0YWxTdGF0dXMsIGZpbGwgPSBQcm9kdWN0RmFtaWx5KSkgKw0KICBnZW9tX2Jhcihwb3NpdGlvbiA9ICJkb2RnZSIpICsNCiAgbGFicyh0aXRsZSA9ICJQaMOibiBi4buRIFTDrG5oIHRy4bqhbmcgSMO0biBuaMOibiB0aGVvIEjhu40gU+G6o24gcGjhuqltIiwNCiAgICAgICB4ID0gIlTDrG5oIHRy4bqhbmcgSMO0biBuaMOibiIsDQogICAgICAgeSA9ICJT4buRIGzGsOG7o25nIiwNCiAgICAgICBmaWxsID0gIkjhu40gU+G6o24gcGjhuqltIikgKw0KICB0aGVtZV9taW5pbWFsKCkgDQpgYGANCg0KIyMjICoqTmjhuq1uIHjDqXQ6KiogICANCiAgKiBDw7MgduG6uyBuaMawIGtow7RuZyBjw7Mgc+G7sSBraMOhYyBiaeG7h3QgxJHDoW5nIGvhu4MgdHJvbmcgY8ahIGPhuqV1IG11YSBz4bqvbSBjw6FjIG5ow7NtIHPhuqNuIHBo4bqpbSBjaMOtbmggZ2nhu69hIG5nxrDhu51pIMSRw6Mga+G6v3QgaMO0biAoTSkgdsOgIG5nxrDhu51pIMSR4buZYyB0aMOibiAoUykuIE3hu5FpIGxpw6puIGvhur90IGdp4buvYSBoYWkgYmnhur9uIG7DoHkgZMaw4budbmcgbmjGsCBraMO0bmcgbeG6oW5oIG3hur0sIGhv4bq3YyDDrXQgbmjhuqV0IGzDoCBraMO0bmcgY2hvIHRo4bqleSB4dSBoxrDhu5tuZyBtdWEgc+G6r20gcuG6pXQga2jDoWMgYmnhu4d0IGThu7FhIHRyw6puIHTDrG5oIHRy4bqhbmcgaMO0biBuaMOibi4gICANCiAgDQogICogxJDhu5FpIHbhu5tpIGPhuqMgaGFpIG5ow7NtIFTDrG5oIHRy4bqhbmcgSMO0biBuaMOibiAoTSB2w6AgUyk6DQogIA0KICAgICogTmjDs20gc+G6o24gcGjhuqltIEZvb2QgKFRo4buxYyBwaOG6qW0gLSBtw6B1IHhhbmggbMOhIGPDonkpIGNoaeG6v20gdOG7tyBs4buHIMOhcCDEkeG6o28gduG7gSBz4buRIGzGsOG7o25nIG11YS4gQ+G6oyBuZ8aw4budaSDEkcOjIGvhur90IGjDtG4gdsOgIG5nxrDhu51pIMSR4buZYyB0aMOibiDEkeG7gXUgbXVhIGzGsOG7o25nIHRo4buxYyBwaOG6qW0gcuG6pXQgbOG7m24sIHbhu5tpIHPhu5EgbMaw4bujbmcgxJHhu4F1IHRyw6puIDUwMDAgxJHGoW4gduG7iy4gICANCiAgICANCiAgICAqIE5ow7NtIHPhuqNuIHBo4bqpbSBOb24tQ29uc3VtYWJsZSAoS2jDtG5nIHRpw6p1IHRo4bulIC0gbcOgdSB4YW5oIGTGsMahbmcpIMSR4bupbmcgdGjhu6kgaGFpIHbhu4Egc+G7kSBsxrDhu6NuZyBtdWEsIHbhu5tpIHPhu5EgbMaw4bujbmcgbXVhIGPhu6dhIGPhuqMgaGFpIG5ow7NtIHTDrG5oIHRy4bqhbmcgaMO0biBuaMOibiDEkeG7gXUgZGFvIMSR4buZbmcgcXVhbmggbeG7qWMgMTMwMC4gICANCiAgICANCiAgICAqIE5ow7NtIHPhuqNuIHBo4bqpbSBEcmluayAoxJDhu5MgdeG7kW5nIC0gbcOgdSDEkeG7jykgY8OzIHPhu5EgbMaw4bujbmcgbXVhIMOtdCBuaOG6pXQgdHJvbmcgYmEgbmjDs20sIHbhu5tpIHPhu5EgbMaw4bujbmcgY+G7p2EgY+G6oyBoYWkgbmjDs20gdMOsbmggdHLhuqFuZyBow7RuIG5ow6JuIMSR4buBdSDhu58gbeG7qWMga2hv4bqjbmcgNjAwLTcwMC4NCiAgDQogICogS+G6v3QgbHXhuq1uIGNodW5nOiBt4bq3YyBkw7kgY8OzIHRo4buDIGPDsyBt4buZdCBjaMO6dCBjaMOqbmggbOG7h2NoIG5o4buPIHbhu4Egc+G7kSBsxrDhu6NuZyB0dXnhu4d0IMSR4buRaSDhu58gbeG7mXQgc+G7kSBkYW5oIG3hu6VjLCBuaMawbmcgY8ahIGPhuqV1IG11YSBz4bqvbSBjaMOtbmggKHThu7cgdHLhu41uZyBj4bunYSB04burbmcgbG/huqFpIHPhuqNuIHBo4bqpbSB0cm9uZyB04buVbmcgZ2nhu48gaMOgbmcpIGTGsOG7nW5nIG5oxrAgcuG6pXQgZ2nhu5FuZyBuaGF1IGdp4buvYSBuZ8aw4budaSDEkcOjIGvhur90IGjDtG4gdsOgIG5nxrDhu51pIMSR4buZYyB0aMOibi4gQ+G6oyBoYWkgbmjDs20gxJHhu4F1IHThuq1wIHRydW5nIG11YSBUaOG7sWMgcGjhuqltIGzDoCBjaMOtbmgsIHRp4bq/cCB0aGVvIGzDoCBOb24tQ29uc3VtYWJsZSwgdsOgIGN14buRaSBjw7luZyBsw6AgxJDhu5MgdeG7kW5nLiDEkGnhu4F1IG7DoHkgZ+G7o2kgw70gcuG6sW5nIHTDrG5oIHRy4bqhbmcgaMO0biBuaMOibiBjw7MgdGjhu4Mga2jDtG5nIHBo4bqjaSBsw6AgeeG6v3UgdOG7kSBxdXnhur90IMSR4buLbmggbeG6oW5oIG3hur0gxJHhur9uIHZp4buHYyBs4buxYSBjaOG7jW4gY8OhYyBuaMOzbSBz4bqjbiBwaOG6qW0gY2jDrW5oIG7DoHkuICAgDQogIA0KIyMjICoqS2nhu4NtIMSR4buLbmggdGjhu5FuZyBrw6oqKiAgIA0KDQoqICoqUGjDoXQgYmnhu4N1IGdp4bqjIHRodXnhur90OioqICAgDQogICogR2nhuqMgdGh1eeG6v3QgJEhfMCQ6IEhhaSBiaeG6v24gTWFyaXRhbFN0YXR1cyB2w6AgUHJvZHVjdEZhbWlseSBsw6AgxJHhu5ljIGzhuq1wLiAgIA0KICAqIEdp4bqjIHRodXnhur90ICRIXzEkOiBIYWkgYmnhur9uIE1hcml0YWxTdGF0dXMgdsOgIFByb2R1Y3RGYW1pbHkgbMOgIGtow7RuZyDEkeG7mWMgbOG6rXAuICAgDQogIA0KYGBge3IsZWNobz1UUlVFfQ0KY2hpc3EudGVzdChlKQ0KDQpgYGANCjEuKipCw6FvIGPDoW8gZ2nDoSB0cuG7iyBDaGkgLSBiw6xuaCBwaMawxqFuZywgYuG6rWMgdOG7sSBkbyB2w6AgZ2nDoSB0cuG7iyBwOioqICAgICAgDQogICogR2nDoSB0cuG7iyBDaGkgLSBiw6xuaCBwaMawxqFuZyAoeC1zcXVhcmVkKTogMS4xNjE3LiAgIA0KICAqIELhuq1jIHThu7EgZG8gKGRmKTogMiAgDQogICogR2nDoSB0cuG7iyBwIChwLXZhbHVlKTowLjU1OTQNCiAgDQoyLioqROG7sWEgdsOgbyBnacOhIHRy4buLIHAsIMSRxrBhIHJhIGvhur90IGx14bqtbiB24buBIHTDrW5oIMSR4buZYyBs4bqtcCBj4bunYSBoYWkgYmnhur9uIOG7nyBt4bupYyDDvSBuZ2jEqWEgJFxhbHBoYT0wLjA1JDoqKiAgIA0KICANCiAgKiBTbyBzw6FuaCBnacOhIHRy4buLIHAgKDAuNTU5NCkgduG7m2kgbeG7qWMgw70gbmdoxKlhICRcYWxwaGE9MC4wNSQuICAgDQogICogVsOsIHAtdmFsdWUgKDAuNTU5NCkgPCAkXGFscGhhKDAuMDUpJCwgY2jDum5nIGtow7RuZyB0YSBjw7MgxJHhu6cgYuG6sW5nIGNo4bupbmcgxJHhu4MgYsOhYyBi4buPIGdpw6EgdGh1eeG6v3QgJEhfMCQuICAgICAgDQogIA0KS+G6v3QgbHXhuq1uOiDhu58gbeG7qWMgw70gbmdoxKlhICRcYWxwaGE9MC4wNSQsIGtow7RuZyBjw7MgYuG6sW5nIGNo4bupbmcgdGjhu5FuZyBrw6ogxJHhu6cgbeG6oW5oIMSR4buDIGvhur90IGx14bqtbiBy4bqxbmcgY8OzIG3hu5FpIGxpw6puIGjhu4cgZ2nhu69hIGdp4bubaSB0w61uaCB2w6AgZGFuaCBt4bulYyBz4bqjbiBwaOG6qW0gLiBIYWkgYmnhur9uIG7DoHkgY8OzIHRo4buDIMSRxrDhu6NjIGfhu41pIGzDoCAgxJHhu5ljIGzhuq1wICB24buBIG3hurd0IHRo4buRbmcga8OqLiAgICAgDQoNCiMgKipQaOG6p24gNTogVOG7lW5nIGvhur90IHbDoCB0aOG6o28gbHXhuq1uKiogICANCg0KDQojIyAqKlTDs20gdOG6r3Qgbmjhu69uZyBwaMOhdCBoaeG7h24gY2jDrW5oKiogICANCg0KKiAqKsSQ4bq3YyDEkWnhu4NtIHBow6JuIGLhu5EgY+G7p2EgY8OhYyBiaeG6v24gxJHhu4tuaCB0w61uaDoqKiAgIA0KICANCiAgKiBHZW5kZXI6IFThuq1wIGThu68gbGnhu4d1IGPDsyBz4buxIHBow6JuIGLhu5UgZ2nhu5tpIHTDrW5oIGtow6EgY8OibiBi4bqxbmcsIHbhu5tpIE7hu68gKEYpIGNoaeG6v20ga2hv4bqjbmcgNTElIHbDoCBOYW0gKE0pIGNoaeG6v20gNDklIHThu5VuZyBz4buRIHF1YW4gc8OhdC4gxJBp4buBdSBuw6B5IHRodeG6rW4gbOG7o2kgY2hvIHZp4buHYyBwaMOibiB0w61jaCwgxJHhuqNtIGLhuqNvIGtow7RuZyBjw7Mgc+G7sSBt4bqldCBjw6JuIGLhurFuZyDEkcOhbmcga+G7gyB24buBIGdp4bubaSB0w61uaCBsw6BtIHNhaSBs4buHY2gga+G6v3QgcXXhuqMuICAgDQogIA0KICAqIEhvbWVvd25lcjogQ8OzIHPhu7EgY2jDqm5oIGzhu4djaCByw7UgcuG7h3QgduG7gSBxdXnhu4FuIHPhu58gaOG7r3UgbmjDoC4gS2hv4bqjbmcgNjAuMDYlIGPDoSBuaMOibiB0cm9uZyBk4buvIGxp4buHdSBsw6AgY2jhu6cgc+G7nyBo4buvdSBuaMOgIChZKSwgdHJvbmcga2hpIDM5Ljk0JSBraMO0bmcgc+G7nyBo4buvdSBuaMOgIChOKS4gxJBp4buBdSBuw6B5IGNobyB0aOG6pXkgcGjhuqduIGzhu5tuIGPDoWMgY8OhIG5ow6JuIMSRxrDhu6NjIGdoaSBuaOG6rW4gdHJvbmcgdOG6rXAgZOG7ryBsaeG7h3UgbsOgeSBsw6Agbmjhu69uZyBuZ8aw4budaSDEkcOjIGPDsyB0w6BpIHPhuqNuIG5ow6Ag4bufLiAgIA0KICANCiAgKiBNYXJpdGFsU3RhdHVzOiBUw6xuaCB0cuG6oW5nIGjDtG4gbmjDom4gY8WpbmcgY8OzIHPhu7EgY8OibiBi4bqxbmcgdMawxqFuZyDEkeG7kWkgZ2nhu69hIG5ow7NtIMSQw6Mga+G6v3QgaMO0biAoTSkgdsOgIMSQ4buZYyB0aMOibiAoUyksIHbhu5tpIMSQ4buZYyB0aMOibiBjaGnhur9tIGtob+G6o25nIDUxLjE3JSB2w6AgxJDDoyBr4bq/dCBow7RuIGNoaeG6v20gNDguODMlIHThu5VuZyBz4buRIHF1YW4gc8OhdC4gVOG7tyBs4buHIG7DoHkgZ+G6p24gMToxLCB0aHXhuq1uIGzhu6NpIGNobyB2aeG7h2MgcGjDom4gdMOtY2ggbeG7kWkgbGnDqm4gaOG7hy4gICANCiAgDQogICogQW5udWFsSW5jb21lOiBUaHUgbmjhuq1wIGjDoG5nIG7Eg20gY8OzIHPhu7EgcGjDom4gYuG7lSBs4buHY2ggduG7gSBwaMOtYSBjw6FjIGtob+G6o25nIHRodSBuaOG6rXAgdGjhuqVwIHbDoCB0cnVuZyBiw6xuaC4gS2hv4bqjbmcgJDMwSyAtICQ1MEsgY2hp4bq/bSB04bu3IGzhu4cgbOG7m24gbmjhuqV0IChraG/huqNuZyAzMi43MyUpLCB0aeG6v3AgdGhlbyBsw6AgJDEwSyAtICQzMEsgKGtob+G6o25nIDIxLjk4JSkuIEPDoWMga2hv4bqjbmcgdGh1IG5o4bqtcCBjYW8gaMahbiBuaMawICQxMTBLIC0gJDEzMEsgdsOgICQxNTBLKyBjaGnhur9tIHThu7cgbOG7hyBy4bqldCBuaOG7jy4gxJBp4buBdSBuw6B5IG5n4bulIMO9IHLhurFuZyDEkeG7kWkgdMaw4bujbmcga2jDoWNoIGjDoG5nIGNo4bunIHnhur91IHThuq1wIHRydW5nIHbDoG8gY8OhYyBjw6EgbmjDom4gY8OzIG3hu6ljIHRodSBuaOG6rXAgdGjhuqVwIHbDoCB0cnVuZyBiw6xuaC4gICANCiAgDQoqICoqTeG7kWkgcXVhbiBo4buHIGdp4buvYSBjw6FjIGJp4bq/biDEkeG7i25oIHTDrW5oOioqICAgDQoNCiAgKiBHZW5kZXIgdsOgIFByb2R1Y3RDYXRlZ29yeTogROG7sWEgdHLDqm4ga2nhu4NtIMSR4buLbmggQ2hpLWLDrG5oIHBoxrDGoW5nIChYLXNxdWFyZWQgPSA1MC40MDcsIGRmID0gNDQsIHAtdmFsdWUgPSAwLjIzNDkpLCB24bubaSBwLXZhbHVlIGzhu5tuIGjGoW4gzrE9MC4wNSwga2jDtG5nIGPDsyBi4bqxbmcgY2jhu6luZyB0aOG7kW5nIGvDqiDEkeG7pyBt4bqhbmggxJHhu4Mga+G6v3QgbHXhuq1uIGPDsyBt4buRaSBsacOqbiBo4buHIGdp4buvYSBnaeG7m2kgdMOtbmggdsOgIGRhbmggbeG7pWMgc+G6o24gcGjhuqltLiBIYWkgYmnhur9uIG7DoHkgY8OzIHRo4buDIMSRxrDhu6NjIGNvaSBsw6AgxJHhu5ljIGzhuq1wLiBN4bq3YyBkw7kgY8OzIG5o4buvbmcga2jDoWMgYmnhu4d0IHF1YW4gc8OhdCDEkcaw4bujYyB24buBIG3hurd0IHPhu5EgbMaw4bujbmcgbXVhIOG7nyBt4buZdCBz4buRIGRhbmggbeG7pWMgKHbDrSBk4bulIE7hu68gbXVhIHJhdSBj4bunLCDEkeG7kyDEg24gduG6t3Qgbmhp4buBdSBoxqFuLCBOYW0gbXVhIHRodeG7kWMgdGjDtG5nIG3FqWkgbmhp4buBdSBoxqFuKSwgbmjGsG5nIHPhu7Ega2jDoWMgYmnhu4d0IG7DoHkga2jDtG5nIMSR4bunIGzhu5tuIMSR4buDIMSRxrDhu6NjIGNvaSBsw6AgY8OzIMO9IG5naMSpYSB0aOG7kW5nIGvDqi4gICANCiAgDQogICogTWFyaXRhbFN0YXR1cyB2w6AgSG9tZW93bmVyOiBE4buxYSB0csOqbiBraeG7g20gxJHhu4tuaCBDaGktYsOsbmggcGjGsMahbmcgKFgtc3F1YXJlZCA9IDEyNDEuMiwgZGYgPSAxLCBwLXZhbHVlIDwgMi4yZS0xNiksIHbhu5tpIHAtdmFsdWUgY+G7sWMga+G7syBuaOG7jyAoZ+G6p24gbmjGsCBi4bqxbmcgMCksIGPDsyBi4bqxbmcgY2jhu6luZyB0aOG7kW5nIGvDqiBj4buxYyBr4buzIG3huqFuaCBt4bq9IMSR4buDIGLDoWMgYuG7jyBnaeG6oyB0aHV54bq/dCDEkeG7mWMgbOG6rXAuIMSQaeG7gXUgbsOgeSBraOG6s25nIMSR4buLbmggY8OzIG3hu5FpIGxpw6puIGjhu4cgY8OzIMO9IG5naMSpYSB0aOG7kW5nIGvDqiBnaeG7r2EgdMOsbmggdHLhuqFuZyBow7RuIG5ow6JuIHbDoCBxdXnhu4FuIHPhu58gaOG7r3UgbmjDoC4gQuG6o24gY2jhuqV0IGPhu6dhIG3hu5FpIHF1YW4gaOG7hyBuw6B5IGzDoCBuaOG7r25nIG5nxrDhu51pIMSRw6Mga+G6v3QgaMO0biBjw7MgeHUgaMaw4bubbmcgc+G7nyBo4buvdSBuaMOgIGNhbyBoxqFuIMSRw6FuZyBr4buDIHNvIHbhu5tpIG5o4buvbmcgbmfGsOG7nWkgxJHhu5ljIHRow6JuLiAgIA0KICANCiAgKiBNYXJpdGFsU3RhdHVzIHbDoCBQcm9kdWN0RmFtaWx5OiBE4buxYSB0csOqbiBraeG7g20gxJHhu4tuaCBDaGktYsOsbmggcGjGsMahbmcgKFgtc3F1YXJlZCA9IDEuMTYxNywgZGYgPSAyLCBwLXZhbHVlID0gMC41NTk0KSwgduG7m2kgcC12YWx1ZSBs4bubbiBoxqFuIM6xPTAuMDUsIGtow7RuZyBjw7MgYuG6sW5nIGNo4bupbmcgdGjhu5FuZyBrw6ogxJHhu6cgbeG6oW5oIMSR4buDIGvhur90IGx14bqtbiBjw7MgbeG7kWkgbGnDqm4gaOG7hyBnaeG7r2EgdMOsbmggdHLhuqFuZyBow7RuIG5ow6JuIHbDoCBuaMOzbSBz4bqjbiBwaOG6qW0uIEhhaSBiaeG6v24gbsOgeSBjw7MgdGjhu4MgxJHGsOG7o2MgY29pIGzDoCDEkeG7mWMgbOG6rXAuIFF1YW4gc8OhdCB04burIGJp4buDdSDEkeG7kyBjxaluZyBjaG8gdGjhuqV5IGPhuqMgbmfGsOG7nWkgxJHDoyBr4bq/dCBow7RuIHbDoCBuZ8aw4budaSDEkeG7mWMgdGjDom4gxJHhu4F1IGPDsyBtw7QgaMOsbmggbXVhIHPhuq9tIHTGsMahbmcgdOG7sSBuaGF1LCB04bqtcCB0cnVuZyBjaOG7pyB54bq/dSB2w6BvIG5ow7NtIEZvb2QsIHNhdSDEkcOzIGzDoCBOb24tQ29uc3VtYWJsZSB2w6AgY3Xhu5FpIGPDuW5nIGzDoCBEcmluay4gICANCiAgDQojIyAqKkjhuqFuIGNo4bq/IGPhu6dhIHBow6JuIHTDrWNoKiogICANCg0KKiBHaeG7m2kgaOG6oW4gY+G7p2Egdmnhu4djIGNo4buJIHBow6JuIHTDrWNoIGJp4bq/biDEkeG7i25oIHTDrW5oOiBQaMOibiB0w61jaCBuw6B5IGNo4buJIHThuq1wIHRydW5nIHbDoG8gY8OhYyBiaeG6v24gxJHhu4tuaCB0w61uaCB2w6AgbeG7kWkgcXVhbiBo4buHIGdp4buvYSBjaMO6bmcuIFZp4buHYyBraMO0bmcga+G6v3QgaOG7o3AgY8OhYyBiaeG6v24gxJHhu4tuaCBsxrDhu6NuZyAodsOtIGThu6U6IHPhu5EgdGnhu4FuIGNoaSB0acOqdSwgc+G7kSBsxrDhu6NuZyBz4bqjbiBwaOG6qW0gbXVhIGPhu6UgdGjhu4MpIGPDsyB0aOG7gyBo4bqhbiBjaOG6vyBjaGnhu4F1IHPDonUgY+G7p2EgY8OhYyBwaMOhdCBoaeG7h24gduG7gSBow6BuaCB2aSBtdWEgc+G6r20uICAgDQoNCiogVGhp4bq/dSB0aMO0bmcgdGluIG5n4buvIGPhuqNuaDogUGjDom4gdMOtY2gga2jDtG5nIGPDsyB0aMO0bmcgdGluIHbhu4EgbeG7pWMgdGnDqnUga2luaCBkb2FuaCBj4bulIHRo4buDIGPhu6dhIGRvYW5oIG5naGnhu4dwLCBsb+G6oWkgaMOsbmggc+G6o24gcGjhuqltLCBoYXkgdGjhu4sgdHLGsOG7nW5nIG3hu6VjIHRpw6p1LCDEkWnhu4F1IG7DoHkgY8OzIHRo4buDIGjhuqFuIGNo4bq/IGto4bqjIG7Eg25nIMSRxrBhIHJhIGPDoWMgxJHhu4EgeHXhuqV0IGNoaeG6v24gbMaw4bujYyBjaGkgdGnhur90IHbDoCBwaMO5IGjhu6NwIG5o4bqldC4gICAgDQoNCiMjICoqxJDhu4EgeHXhuqV0KiogICANCg0KVuG7gSBjaGnhur9uIGzGsOG7o2MgbWFya2V0aW5nIHbDoCBwaMOibiBsb+G6oWkgc+G6o24gcGjhuqltOiAgIA0KDQoqIEdp4bubaSB0w61uaCB2w6AgRGFuaCBt4bulYyBz4bqjbiBwaOG6qW06IERvIGtow7RuZyBjw7MgbeG7kWkgbGnDqm4gaOG7hyDDvSBuZ2jEqWEgdGjhu5FuZyBrw6ogZ2nhu69hIGdp4bubaSB0w61uaCB2w6AgZGFuaCBt4bulYyBz4bqjbiBwaOG6qW0sIGRvYW5oIG5naGnhu4dwIGPDsyB0aOG7gyBjw6JuIG5o4bqvYyBraMO0bmcgY+G6p24gcGjhuqNpIHTDuXkgY2jhu4luaCBxdcOhIHPDonUgY8OhYyBjaGnhur9uIGzGsOG7o2MgbWFya2V0aW5nIHPhuqNuIHBo4bqpbSB0aGVvIGdp4bubaSB0w61uaCBjaG8gY8OhYyBkYW5oIG3hu6VjIHPhuqNuIHBo4bqpbSBy4buZbmcgbsOgeS4gVGhheSB2w6BvIMSRw7MsIHThuq1wIHRydW5nIHbDoG8gxJHhurdjIMSRaeG7g20gY+G7p2EgYuG6o24gdGjDom4gc+G6o24gcGjhuqltIGhv4bq3YyBjw6FjIHnhur91IHThu5Ega2jDoWMuICAgDQoNCiogVMOsbmggdHLhuqFuZyBow7RuIG5ow6JuIHbDoCBT4bufIGjhu691IG5ow6A6IMSQw6J5IGzDoCBt4buZdCBt4buRaSBsacOqbiBo4buHIG3huqFuaCBt4bq9LiBEb2FuaCBuZ2hp4buHcCBraW5oIGRvYW5oIGPDoWMgc+G6o24gcGjhuqltL2Thu4tjaCB24bulIGxpw6puIHF1YW4gxJHhur9uIG5ow6Ag4bufICh2w60gZOG7pTogxJHhu5MgZ2lhIGThu6VuZywgbuG7mWkgdGjhuqV0LCBk4buLY2ggduG7pSBi4bqjbyB0csOsIG5ow6AgY+G7rWEsIHPhuqNuIHBo4bqpbSB0acOqdSBkw7luZyBnaWEgxJHDrG5oIHPhu5EgbMaw4bujbmcgbOG7m24pIGPDsyB0aOG7gyBuaOG6r20gbeG7pWMgdGnDqnUgbeG6oW5oIG3hur0gdsOgbyBuaMOzbSBraMOhY2ggaMOgbmcgxJHDoyBr4bq/dCBow7RuLiBDw7MgdGjhu4MgdGhp4bq/dCBr4bq/IGPDoWMgZ8OzaSBz4bqjbiBwaOG6qW0sIGNoxrDGoW5nIHRyw6xuaCBraHV54bq/biBtw6NpIGTDoG5oIHJpw6puZyBjaG8gY8OhYyBnaWEgxJHDrG5oIGhv4bq3YyBjaOG7pyBuaMOgLiAgIA0KDQoqIFTDrG5oIHRy4bqhbmcgaMO0biBuaMOibiB2w6AgTmjDs20gc+G6o24gcGjhuqltOiBEbyBraMO0bmcgY8OzIG3hu5FpIGxpw6puIGjhu4cgw70gbmdoxKlhIHRo4buRbmcga8OqIGdp4buvYSB0w6xuaCB0cuG6oW5nIGjDtG4gbmjDom4gdsOgIG5ow7NtIHPhuqNuIHBo4bqpbSAoRHJpbmssIEZvb2QsIE5vbi1Db25zdW1hYmxlKSwgY8OhYyBjaGnhur9uIGzGsOG7o2MgcGjDom4gbG/huqFpIHbDoCB0aeG6v3AgdGjhu4sgY2hvIGPDoWMgbmjDs20gc+G6o24gcGjhuqltIHLhu5luZyBuw6B5IGPDsyB0aOG7gyBraMO0bmcgY+G6p24gcGjhuqNpIHF1w6Ega2jDoWMgYmnhu4d0IGdp4buvYSBuZ8aw4budaSDEkcOjIGvhur90IGjDtG4gdsOgIG5nxrDhu51pIMSR4buZYyB0aMOibi4gQ+G6oyBoYWkgbmjDs20gxJHhu4F1IGzDoCBraMOhY2ggaMOgbmcgdGnhu4FtIG7Eg25nIGzhu5tuIGNobyBGb29kIHbDoCBOb24tQ29uc3VtYWJsZS4gICANCg0KIyMgKipDw6J1IGjhu49pIG3hu58vSMaw4bubbmcgbmdoacOqbiBj4bupdSB0aeG6v3AgdGhlbyoqICAgDQoNCiogTeG7kWkgcXVhbiBo4buHIGdp4buvYSBUaHUgbmjhuq1wIHbDoCBow6BuaCB2aSBtdWEgc+G6r20vxJHhurdjIMSRaeG7g20ga2jDoWM6IEPDsyBt4buRaSBsacOqbiBo4buHIG7DoG8gZ2nhu69hIHRodSBuaOG6rXAgdsOgIGPDoWMgZGFuaCBt4bulYyBz4bqjbiBwaOG6qW0gY+G7pSB0aOG7gyAoa2jDtG5nIGNo4buJIG5ow7NtIHPhuqNuIHBo4bqpbSBy4buZbmcpLCBob+G6t2MgdGh1IG5o4bqtcCB2w6AgcXV54buBbiBz4bufIGjhu691IG5ow6Aga2jDtG5nPyAgIA0KDQoqIFBow6JuIHTDrWNoIHPDonUgaMahbiB24buBIGPDoWMgZGFuaCBt4bulYyBz4bqjbiBwaOG6qW0gY+G7pSB0aOG7gzogTeG6t2MgZMO5IG5ow7NtIFByb2R1Y3RGYW1pbHkga2jDtG5nIGPDsyBt4buRaSBsacOqbiBo4buHIHbhu5tpIE1hcml0YWxTdGF0dXMsIGxp4buHdSBjw7Mgbmjhu69uZyBkYW5oIG3hu6VjIHPhuqNuIHBo4bqpbSBj4bulIHRo4buDIGjGoW4gYsOqbiB0cm9uZyBjw6FjIG5ow7NtIMSRw7MgKHbDrSBk4bulOiBjw6FjIGxv4bqhaSB0aOG7sWMgcGjhuqltIGtow6FjIG5oYXUsIGPDoWMgbG/huqFpIMSR4buTIHXhu5FuZyBraMOhYyBuaGF1KSBtw6AgbOG6oWkgY8OzIG3hu5FpIGxpw6puIGjhu4cgduG7m2kgZ2nhu5tpIHTDrW5oIGhv4bq3YyB0w6xuaCB0cuG6oW5nIGjDtG4gbmjDom4gaGF5IGtow7RuZz8gICANCg==