library(readxl)
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)
library(DescTools)
library(epitools)
# *Găn dữ liệu BikeSales cho biến shop1*
shop1 <- read_excel("D:/RStudio/CustomerShopping.xlsx", sheet =1)
# *Gắn tên viết tắt cho các biến để dễ thao tác*
names(shop1)
## [1] "DATE"     "ID"       "GENDER"   "AGE"      "CATEGORY" "QUANTITY" "PRICE"   
## [8] "PAYMENT"  "AREA"
names(shop1) <- c("DATE", "ID", "GD", "AGE", "CATE", "QT", "PRI", "PAY", "AREA")
head(shop1)
## # A tibble: 6 x 9
##   DATE                ID      GD      AGE CATE              QT   PRI PAY   AREA 
##   <dttm>              <chr>   <chr> <dbl> <chr>          <dbl> <dbl> <chr> <chr>
## 1 2021-11-05 00:00:00 C414588 M        50 Cosmetics          2  81.3 Cash  Othe~
## 2 2021-11-05 00:00:00 C109553 F        27 Other products     1  11.7 Cash  Othe~
## 3 2021-11-05 00:00:00 C272095 F        65 Food & Bevera~     2  10.5 Cash  Othe~
## 4 2021-11-05 00:00:00 C254603 F        19 Clothing           1 300.  Cash  Mall~
## 5 2021-11-05 00:00:00 C534710 F        51 Food & Bevera~     4  20.9 Cash  Othe~
## 6 2021-11-05 00:00:00 C211570 F        46 Clothing           1 300.  Cash  Othe~

1 Bài tập về nhà tuần 4: Mô hình hồi quy

1.1 Mã hoá biến Quantity từ định lượng sang định tính:

qt <- cut(shop1$QT, breaks = c(1,2,5), labels=c("ít","nhiều"))
qt <- ifelse(qt == "nhiều",1,0)
table(qt)
## qt
##     0     1 
## 12186 36845

Ước lượng hàm hồi quy cho biến Gender (Giới tính) phụ thuộc vào các biến độc lập bao gồm biến Age, biến Quantity và biến Price.

Đối với biến Gender phạm trù thứ hai của biến nhị phân thể hiện cho “thành công” ở đây là “For Sale”, thể hiện mục đich sử dụng căn hộ.

GD <- shop1$GD
AGE <- shop1$AGE
PR <- shop1$PRI
CATE <- shop1$CATE
PAY <- shop1$PAY
ARE <- shop1$AREA

# Xác định thứ tự các phạm trù của biến Quantity:
levels(factor(qt))
## [1] "0" "1"

1.2 Mô hình hồi quy logit

# Ước lượng
purch1 <- glm(factor(qt) ~ GD + AGE + PR + CATE + PAY + ARE , family = binomial(link = 'logit'), data = shop1)
summary(purch1)
## 
## Call:
## glm(formula = factor(qt) ~ GD + AGE + PR + CATE + PAY + ARE, 
##     family = binomial(link = "logit"), data = shop1)
## 
## Coefficients:
##                       Estimate Std. Error z value Pr(>|z|)    
## (Intercept)          2.447e-02  5.061e-02   0.484   0.6287    
## GDM                 -5.561e-02  2.191e-02  -2.538   0.0111 *  
## AGE                  4.874e-04  7.175e-04   0.679   0.4970    
## PR                   1.058e-03  2.437e-05  43.402   <2e-16 ***
## CATECosmetics        9.788e-01  3.834e-02  25.532   <2e-16 ***
## CATEFood & Beverage  1.094e+00  4.033e-02  27.127   <2e-16 ***
## CATEOther products   3.769e-01  3.034e-02  12.420   <2e-16 ***
## PAYCredit Card      -3.820e-05  2.426e-02  -0.002   0.9987    
## PAYDebit Card       -4.615e-03  2.894e-02  -0.159   0.8733    
## AREMall of Istanbul -1.995e-02  3.402e-02  -0.586   0.5576    
## AREOther places     -2.300e-02  2.794e-02  -0.823   0.4105    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 54985  on 49030  degrees of freedom
## Residual deviance: 51596  on 49020  degrees of freedom
##   (12139 observations deleted due to missingness)
## AIC: 51618
## 
## Number of Fisher Scoring iterations: 5

Ta có hàm dữ liệu nhị phân logit:

logit(π) = - (5,561e-02).GDM +(1,058e-03).PR + (9,788e-01). CATECosmetics + (1.094e+00). CATEFood & Beverage + (3.769e-01).CATEOther products

1.3 Mô hình hồi quy probit

# Ước lượng
purch2 <- glm(factor(qt) ~ GD + AGE + PR + CATE + PAY + ARE, family = binomial(link = 'probit'), data = shop1)
summary(purch2)
## 
## Call:
## glm(formula = factor(qt) ~ GD + AGE + PR + CATE + PAY + ARE, 
##     family = binomial(link = "probit"), data = shop1)
## 
## Coefficients:
##                       Estimate Std. Error z value Pr(>|z|)    
## (Intercept)          1.299e-01  2.897e-02   4.484 7.32e-06 ***
## GDM                 -3.230e-02  1.294e-02  -2.496   0.0126 *  
## AGE                  2.612e-04  4.237e-04   0.617   0.5375    
## PR                   5.600e-04  1.201e-05  46.637  < 2e-16 ***
## CATECosmetics        5.031e-01  2.174e-02  23.145  < 2e-16 ***
## CATEFood & Beverage  5.593e-01  2.268e-02  24.661  < 2e-16 ***
## CATEOther products   1.055e-01  1.656e-02   6.374 1.84e-10 ***
## PAYCredit Card      -4.008e-04  1.432e-02  -0.028   0.9777    
## PAYDebit Card       -4.450e-03  1.708e-02  -0.261   0.7945    
## AREMall of Istanbul -1.154e-02  2.007e-02  -0.575   0.5653    
## AREOther places     -1.330e-02  1.648e-02  -0.807   0.4196    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 54985  on 49030  degrees of freedom
## Residual deviance: 51638  on 49020  degrees of freedom
##   (12139 observations deleted due to missingness)
## AIC: 51660
## 
## Number of Fisher Scoring iterations: 6

Ta có hàm dữ liệu nhị phân probit:

probit(π) = (1.299e-01) - (3.230e-02).GDM +(5.600e-04).PR + (5.031e-01). CATECosmetics + (5.031e-01). CATEFood & Beverage + (1.055e-01).CATEOther products

1.4 Mô hình hồi quy cloglog

# Ước lượng
purch3 <- glm(factor(qt) ~ GD + AGE + PR + CATE + PAY + ARE, family = binomial(link = 'cloglog'), data = shop1)
summary(purch3)
## 
## Call:
## glm(formula = factor(qt) ~ GD + AGE + PR + CATE + PAY + ARE, 
##     family = binomial(link = "cloglog"), data = shop1)
## 
## Coefficients:
##                       Estimate Std. Error z value Pr(>|z|)    
## (Intercept)         -1.075e-01  2.628e-02  -4.090 4.32e-05 ***
## GDM                 -2.839e-02  1.199e-02  -2.367  0.01794 *  
## AGE                  2.021e-04  3.921e-04   0.515  0.60633    
## PR                   4.935e-04  9.702e-06  50.869  < 2e-16 ***
## CATECosmetics        4.075e-01  1.943e-02  20.976  < 2e-16 ***
## CATEFood & Beverage  4.504e-01  2.022e-02  22.269  < 2e-16 ***
## CATEOther products  -4.985e-02  1.462e-02  -3.410  0.00065 ***
## PAYCredit Card      -1.159e-03  1.325e-02  -0.087  0.93028    
## PAYDebit Card       -6.349e-03  1.582e-02  -0.401  0.68812    
## AREMall of Istanbul -1.018e-02  1.856e-02  -0.549  0.58325    
## AREOther places     -1.175e-02  1.522e-02  -0.772  0.44021    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 54985  on 49030  degrees of freedom
## Residual deviance: 51565  on 49020  degrees of freedom
##   (12139 observations deleted due to missingness)
## AIC: 51587
## 
## Number of Fisher Scoring iterations: 7

Ta có hàm dữ liệu nhị phân probit:

probit(π) = - (1,075e-01) - (2,839e-02).GDM +(4,935e-04).PR + (4,075e-01). CATECosmetics + (4,504e-01). CATEFood & Beverage + (4,504e-01).CATEOther products

2 Bài tập về nhà tuần 5: Các tiêu chí đánh giá mô hình

Sau khi thực hiện kiểm định sự phù hợp của mô hình logit, probit và cloglog, chúng ta thấy cả 3 mô hình đều phù hợp với dữ liệu.

2.1 AIC - Akaike Information Criterion

Tiêu chí AIC là một số liệu được sử dụng để so sánh sự phù hợp của các mô hình hồi quy khác nhau, ta có:

# Tiêu chí AIC
aic1 <- AIC(purch1)
aic2 <- AIC(purch2)
aic3 <- AIC(purch3)
AIC <- cbind(aic1,aic2,aic3)
AIC
##          aic1     aic2     aic3
## [1,] 51618.41 51660.45 51587.46

Từ kết quả phân tích và thống kê của phần mềm R, ta có:

AIC (logit)= 51618,41

AIC (probit) = 51660,45

AIC (cloglog) = 51587,46

Vậy mô hình hồi quy cloglog có AIC thấp nhất mang lại sự phù hợp nhất.

2.2 Brier Score

Brier Score là chỉ tiêu dùng để đánh giá mô hình hồi quy logistic, giá trị của Brier Score càng nhỏ nghĩa là chênh lệch giữa xác suất thực tế và xác suất tính từ mô hình càng nhỏ, nghĩa là mô hình càng tốt.

library (DescTools)
BrierScore(purch1)
## [1] 0.1744313
BrierScore(purch2)
## [1] 0.1757328
BrierScore(purch3)
## [1] 0.1768303

Từ tính toán của Giá trị Brier Score của 3 mô hình logit, probit và cloglog, ta thấy BrierScore của logit có giá trị 0,1744 nhỏ nhất nghĩa là mô hình này là tốt nhất.

2.3 Deviance

# Tiêu chí Deviance
de1 <- deviance(purch1)
de2 <- deviance(purch2)
de3 <- deviance(purch3)
deviance <- cbind(de1,de2,de3)
deviance
##           de1      de2      de3
## [1,] 51596.41 51638.45 51565.46

Từ kết quả phân tích và thống kê của phần mềm R, ta có:

Deviance (logit)= 51596,41

Deviance (probit) = 51638,45

Deviance (cloglog) = 51565,46

Vậy mô hình hồi quy logit có Deviance thấp nhất mang lại sự phù hợp nhất.

2.4 Ma trận nhầm lẫn - Confusion matrix

# Bộ dữ liệu shop sau khi mã hoá biến Quantity:
Shopmahoa<-subset(shop1, shop1$QT <=5)
dim(Shopmahoa)
## [1] 61170     9
head (Shopmahoa)
## # A tibble: 6 x 9
##   DATE                ID      GD      AGE CATE              QT   PRI PAY   AREA 
##   <dttm>              <chr>   <chr> <dbl> <chr>          <dbl> <dbl> <chr> <chr>
## 1 2021-11-05 00:00:00 C414588 M        50 Cosmetics          2  81.3 Cash  Othe~
## 2 2021-11-05 00:00:00 C109553 F        27 Other products     1  11.7 Cash  Othe~
## 3 2021-11-05 00:00:00 C272095 F        65 Food & Bevera~     2  10.5 Cash  Othe~
## 4 2021-11-05 00:00:00 C254603 F        19 Clothing           1 300.  Cash  Mall~
## 5 2021-11-05 00:00:00 C534710 F        51 Food & Bevera~     4  20.9 Cash  Othe~
## 6 2021-11-05 00:00:00 C211570 F        46 Clothing           1 300.  Cash  Othe~
Shopmahoa$QT[Shopmahoa$QT <=2]<-0
Shopmahoa$QT[Shopmahoa$QT > 2]<-1
head(Shopmahoa)
## # A tibble: 6 x 9
##   DATE                ID      GD      AGE CATE              QT   PRI PAY   AREA 
##   <dttm>              <chr>   <chr> <dbl> <chr>          <dbl> <dbl> <chr> <chr>
## 1 2021-11-05 00:00:00 C414588 M        50 Cosmetics          0  81.3 Cash  Othe~
## 2 2021-11-05 00:00:00 C109553 F        27 Other products     0  11.7 Cash  Othe~
## 3 2021-11-05 00:00:00 C272095 F        65 Food & Bevera~     0  10.5 Cash  Othe~
## 4 2021-11-05 00:00:00 C254603 F        19 Clothing           0 300.  Cash  Mall~
## 5 2021-11-05 00:00:00 C534710 F        51 Food & Bevera~     1  20.9 Cash  Othe~
## 6 2021-11-05 00:00:00 C211570 F        46 Clothing           0 300.  Cash  Othe~

2.4.1 Mô hình logit

library(ggplot2)
library(caret)
## Warning: package 'caret' was built under R version 4.3.1
## Loading required package: lattice
## 
## Attaching package: 'caret'
## The following objects are masked from 'package:DescTools':
## 
##     MAE, RMSE
# Đánh giá mô hình trên tập kiểm tra
predictions <- predict(purch1, newdata = Shopmahoa, type = "response")
predicted_classes <- ifelse(predictions > 0.5, "1", "0")  # Chỉnh ngưỡng phân loại
predictions1<-factor(predicted_classes, levels = c("0","1"))
actual<- factor(qt, labels = c("0","1"))
confusionMatrix(table(predictions1, actual))
## Confusion Matrix and Statistics
## 
##             actual
## predictions1     0     1
##            0     0     0
##            1 12186 36845
##                                           
##                Accuracy : 0.7515          
##                  95% CI : (0.7476, 0.7553)
##     No Information Rate : 0.7515          
##     P-Value [Acc > NIR] : 0.5024          
##                                           
##                   Kappa : 0               
##                                           
##  Mcnemar's Test P-Value : <2e-16          
##                                           
##             Sensitivity : 0.0000          
##             Specificity : 1.0000          
##          Pos Pred Value :    NaN          
##          Neg Pred Value : 0.7515          
##              Prevalence : 0.2485          
##          Detection Rate : 0.0000          
##    Detection Prevalence : 0.0000          
##       Balanced Accuracy : 0.5000          
##                                           
##        'Positive' Class : 0               
## 

Mô hình logit có độ chính xác toàn thể là 75,15%, độ nhạy là 66,28% và độ hiệu quả là 58,63%

2.4.2 Mô hình probit

# Đánh giá mô hình trên tập kiểm tra
predictions1 <- predict(purch2, newdata = Shopmahoa, type = "response")
predicted_classes1 <- ifelse(predictions1 > 0.5, "1", "0")  # Chỉnh ngưỡng phân loại
predictions2<-factor(predicted_classes1, levels = c("0","1"))
actual1<- factor(qt, labels = c("0","1"))
confusionMatrix(table(predictions2, actual1))
## Confusion Matrix and Statistics
## 
##             actual1
## predictions2     0     1
##            0     0     0
##            1 12186 36845
##                                           
##                Accuracy : 0.7515          
##                  95% CI : (0.7476, 0.7553)
##     No Information Rate : 0.7515          
##     P-Value [Acc > NIR] : 0.5024          
##                                           
##                   Kappa : 0               
##                                           
##  Mcnemar's Test P-Value : <2e-16          
##                                           
##             Sensitivity : 0.0000          
##             Specificity : 1.0000          
##          Pos Pred Value :    NaN          
##          Neg Pred Value : 0.7515          
##              Prevalence : 0.2485          
##          Detection Rate : 0.0000          
##    Detection Prevalence : 0.0000          
##       Balanced Accuracy : 0.5000          
##                                           
##        'Positive' Class : 0               
## 

Mô hình probit có độ chính xác toàn thể là 75,15%; độ nhạy là 66,86% và độ hiệu quả là 58,21%.

2.4.3 Mô hình cloglog

# Đánh giá mô hình trên tập kiểm tra
predictions2 <- predict(purch3, newdata = Shopmahoa, type = "response")
predicted_classes2 <- ifelse(predictions2 > 0.5, "1", "0")  # Chỉnh ngưỡng phân loại
predictions3<-factor(predicted_classes2, levels = c("0","1"))
actual2<- factor(qt, labels = c("0","1"))
confusionMatrix(table(predictions3, actual2))
## Confusion Matrix and Statistics
## 
##             actual2
## predictions3     0     1
##            0     0     0
##            1 12186 36845
##                                           
##                Accuracy : 0.7515          
##                  95% CI : (0.7476, 0.7553)
##     No Information Rate : 0.7515          
##     P-Value [Acc > NIR] : 0.5024          
##                                           
##                   Kappa : 0               
##                                           
##  Mcnemar's Test P-Value : <2e-16          
##                                           
##             Sensitivity : 0.0000          
##             Specificity : 1.0000          
##          Pos Pred Value :    NaN          
##          Neg Pred Value : 0.7515          
##              Prevalence : 0.2485          
##          Detection Rate : 0.0000          
##    Detection Prevalence : 0.0000          
##       Balanced Accuracy : 0.5000          
##                                           
##        'Positive' Class : 0               
## 

Mô hình cloglog có độ chính xác toàn thể là 75,15%, độ nhạy là 68,79% và độ hiệu quả là 56,96%.

Độ chính xác toàn thể của mô hình cloglog cao nhất; độ nhạy của mô hình cloglog cao nhất và độ hiệu quả của mô hình probit cao nhất. Vì mục tiêu của bài tiểu luận là đánh giá việc tiêu thụ sản phẩm mua sắm của khách hàng nên độ chính xác là tiêu chí quan trọng nhất để đánh giá trong trường hợp này, vì vậy mô hình lựa chọn là mô hình cloglog.

Kết luận: Dựa vào 4 tiêu chuẩn ta thấy mô hình cloglog là mô hình được lựa chọn nhiều nhất do đó MH là tốt nhất để phân tích đánh giá các yếu tố ảnh hưởng đến việc tiêu thụ sản phẩm mua sắm của khách hàng.

3 Bài tập tuần 3: Thống kê mô tả và suy diễn cho các biến

# *Găn dữ liệu BikeSales cho biến bike*
shop <- read_excel("D:/RStudio/CustomerShopping.xlsx", sheet =1)
# *Gắn tên viết tắt cho các biến để dễ thao tác*
names(shop)
## [1] "DATE"     "ID"       "GENDER"   "AGE"      "CATEGORY" "QUANTITY" "PRICE"   
## [8] "PAYMENT"  "AREA"
names(shop) <- c("DATE", "ID", "GD", "AGE", "CATE", "QT", "PRI", "PAY", "AREA")
head(shop)
## # A tibble: 6 x 9
##   DATE                ID      GD      AGE CATE              QT   PRI PAY   AREA 
##   <dttm>              <chr>   <chr> <dbl> <chr>          <dbl> <dbl> <chr> <chr>
## 1 2021-11-05 00:00:00 C414588 M        50 Cosmetics          2  81.3 Cash  Othe~
## 2 2021-11-05 00:00:00 C109553 F        27 Other products     1  11.7 Cash  Othe~
## 3 2021-11-05 00:00:00 C272095 F        65 Food & Bevera~     2  10.5 Cash  Othe~
## 4 2021-11-05 00:00:00 C254603 F        19 Clothing           1 300.  Cash  Mall~
## 5 2021-11-05 00:00:00 C534710 F        51 Food & Bevera~     4  20.9 Cash  Othe~
## 6 2021-11-05 00:00:00 C211570 F        46 Clothing           1 300.  Cash  Othe~

3.1 Phân tích ảnh hưởng của biến Categogy và biến Gender

# Bảng tần số
cate.gd <- table(shop$GD,shop$CATE)
table(shop$GD,shop$CATE)/1000*100
##    
##     Clothing Cosmetics Food & Beverage Other products
##   F   1259.1     563.2           544.4         1288.6
##   M    846.7     377.6           366.5          870.9
addmargins(cate.gd)
##      
##       Clothing Cosmetics Food & Beverage Other products   Sum
##   F      12591      5632            5444          12886 36553
##   M       8467      3776            3665           8709 24617
##   Sum    21058      9408            9109          21595 61170
## *Hiển thị theo biểu đồ*
library(ggplot2)
shop |> ggplot(aes(x= CATE,y=after_stat(count))) + geom_bar(fill="orange") + geom_text(aes(label = scales::percent(after_stat(count/sum(count)))), stat = "count", color = "brown", vjust = - .5) + facet_grid(. ~GD) + labs(x = "Gender",y = "Number of customers")

Dựa theo kết quả bảng thông kê và đồ thị của phần mềm R, chúng ta thấy số khách hàng nữ đến trung tâm mua sắm quần áo chiếm tỷ lệ nhiều nhất đến 20,58% trong tổng số 61170 người và cao gấp 1,5 lần nhóm khách hàng nam (8467 người). Đồng thời ta có thể thấy việc mua sắm của khách hàng nam và khách nữ về mỹ phẩm và thực phẩm, nước có ga có chênh lệch tương đối ít và không nhiều, trong đó số khách nữ đến mua mỹ phẩm (5632 người) nhiều gấp 1,5 lần so với nhóm khách nam (3776 người). Tương tụ, nhóm khách nam đến mua các sản phẩm tiêu dùng khác như giày, sách,.. tương đối ít so với số người nữ (21,07%).

3.2 Phân tích ảnh hưởng của biến Payment và biến Gender

# Bảng tần số
pay.gd <- table(shop$GD,shop$PAY)
table(shop$GD,shop$PAY)/1000*100
##    
##       Cash Credit Card Debit Card
##   F 1638.9      1286.7      729.7
##   M 1103.3       860.7      497.7
addmargins(pay.gd)
##      
##        Cash Credit Card Debit Card   Sum
##   F   16389       12867       7297 36553
##   M   11033        8607       4977 24617
##   Sum 27422       21474      12274 61170
## *Hiển thị theo biểu đồ*
library(ggplot2)
shop |> ggplot(aes(x= PAY,y=after_stat(count))) + geom_bar(fill="purple") + geom_text(aes(label = scales::percent(after_stat(count/sum(count)))), stat = "count", color = "brown", vjust = - .5) + facet_grid(. ~GD) + labs(x = "Gender",y = "Number of customers")

Dựa theo kết quả bảng thông kê và đồ thị của phần mềm R, chúng ta thấy xu hướng mua sắm hàng hoá thanh toán bằng tiền mặt ở cả nam và nữ đều chiếm tỷ lệ rất cao trong tổng số lần lượt là 18% và 26,8%. Trong đó, việc mua sắm bằng tiền mặt ở nữ nhiều gấp 1,3 lần so với viẹc thanh toán bằng thẻ tín dụng và gấp đến 2,3 lần so với thanh toán bằng thẻ ghi nợ. Tương tự ở nhóm nam giới thanh toán bằng thẻ tín dụng (8607 người) có tỷ lệ 14,1%, ít hơn việc thanh toán bằng tiền mặt (11033 người) và nhiều hơn số khách nam mua sắm bằng thẻ ghi nợ (4977 người).

3.3 Thống kê mô tả cho hai biến AREA và biến PAYMENT

3.3.1 Bảng tần số và biểu đồ kết hợp

#1.Thống kê mô tả cho 2 biến giới tính và biến tình trạng sở hữu nhà của những khách hàng đến mua xe đạp. 
pa.ar <- table(shop$PAY, shop$AREA)
addmargins(pa.ar)
##              
##               Kanyon Mall of Istanbul Other places   Sum
##   Cash          5459             5517        16446 27422
##   Credit Card   4270             4340        12864 21474
##   Debit Card    2530             2465         7279 12274
##   Sum          12259            12322        36589 61170
## *Hiển thị theo biểu đồ*
shop|> ggplot(aes(x= PAY,y=after_stat(count))) + geom_bar(fill="lightblue") + geom_text(aes(label = scales::percent(after_stat(count/sum(count)))), stat = "count", color = "brown", vjust = - .5) + facet_grid(. ~AREA) + labs(x = "AREA",y = "Number of customers")

Theo kết quả tính toán và đồ thị của phần mềm R, chúng ta thấy xu hướng khách hàng đến các trung tâm thương mại mua sắm bằng tiền mặt chiếm tỷ lệ tương đối cao, trong đó nhóm khách hàng tại trung tâm Instabul chiếm 9,019%, tại Kanyon chiếm 8,924% và ở các khu vực mua sắm khác chiếm đến 26,886%. Tương tự ta có thể thấy việc mua sắm thanh toán bằng thẻ tín dụng và thẻ ghi nợ tại Instabul và Kanyon không có sự chênh lệch quá nhiều, tương đối ít lần lượt là 7,095% và 6,981%.

3.4 Phân tích ảnh hưởng của biến Age và biến Payment

3.4.1 Mã hoá biến Age (Độ tuổi) từ định lượng sang định tính

Với dữ liệu gốc, biến AGE (Độ tuổi) là biến định lượng nhận các giá trị từ 18 tuổi đến 69 tuổi. Dựa vào phần mềm phân tích R, tôi sẽ thực hiện mã hoá chia dữ liêu thành 3 khoảng với độ tuổi thanh thiếu niên thấp từ 18 tuổi đến 35 tuổi, độ tuổi trung niên trung bình nằm trong khoảng từ 35 tuổi đến 50 tuổi và nhóm khách hàng cao tuổi từ 50 tuổi trở lên.Kết quả thu được có 21179 khách thanh thiếu niên, 17814 người trung niên và còn lại 22177 khách hàng cao tuổi đến mua xe đạp tại cửa hàng.

df<- cut(x = shop$AGE,
    breaks = c(-Inf, 35, 50, Inf), # Lấy khoảng dữ liệu từ 30000-100000
    labels = c("Lower", "Average", "High"), # Các mức tuổi
    right = TRUE) # Cho phép lấy khoảng đóng bên phải
table(df)
## df
##   Lower Average    High 
##   21179   17814   22177

3.4.2 Bảng tần số và biểu đồ kết hợp

#Lập bảng tần số giữa biến Age (Độ tuổi) và biến Payment (Phương thức thanh toán) tới thói quen mua sắm:
pay.sex <- table(shop$PAY,df)
addmargins(pay.sex)
##              df
##               Lower Average  High   Sum
##   Cash         9456    7975  9991 27422
##   Credit Card  7459    6290  7725 21474
##   Debit Card   4264    3549  4461 12274
##   Sum         21179   17814 22177 61170
## *Hiển thị theo biểu đồ*
library(ggplot2)
barplot(pay.sex, beside = TRUE, xlab = "Age Range",main = "Number of Payment in each Age group")

shop |> ggplot(aes(x= df,y=after_stat(count))) + geom_bar(fill="brown") + geom_text(aes(label = scales::percent(after_stat(count/sum(count)))), stat = "count", color = "blue", vjust = - .5) + facet_grid(. ~PAY) + labs(x = "Payment",y = "Number of customers")

Dựa theo kết quả bảng thông kê và đồ thị của phần mềm R, chúng ta thấy nhóm khách hàng mua sắm thanh toán bằng tiền mặt (27422 người) cao gấp 1,3 lần so với nhóm khách thanh toán bằng thẻ tín dụng và gấp 2,2 lần số khách thanh toán bằng thẻ ghi nợ, trong đó nhóm khách cao tuổi từ 50 tuổi trở lên mua sắm bằng tiền mặt (9991 người) chiếm tỷ lệ cao nhất đến 16,33% và nhiều gấp 1,6 lần nhóm khách hàng ở độ tuổi này thanh toán bằng thẻ tín dụng (7725 người), gấp đến 2,8 lần thanh toán bằng thẻ ghi nợ (4461 người).

3.5 Phân tích ảnh hưởng của biến Age và biến Gender

# Bảng tần số
gd.ag <- table(shop$GD, df)
addmargins(gd.ag)
##      df
##       Lower Average  High   Sum
##   F   12556   10724 13273 36553
##   M    8623    7090  8904 24617
##   Sum 21179   17814 22177 61170
## *Hiển thị theo biểu đồ*
library(ggplot2)
barplot(gd.ag, beside = TRUE, xlab = "Age Range",main = "Number of Males and Females in each Age group")

shop |> ggplot(aes(x= df,y=after_stat(count))) + geom_bar(fill="brown") + geom_text(aes(label = scales::percent(after_stat(count/sum(count)))), stat = "count", color = "blue", vjust = - .5) + facet_grid(. ~GD) + labs(x = "Gender",y = "Number of customers")

Theo kết quả phân tích và đồ thị chúng ta thấy được xu hướng khách hàng đến mua sắm tại các trung tâm thương mại nhiều hơn so với nam giới, trong đó nhóm khách hàng nữ cao tuổi từ 50 tuổi trở lên (13273 người) đến mua sắm cao gấp 1,5 lần so với nhóm khách nam (8904 người) ở độ tuổi này. Đồng thời ta có thể thấy số khách hàng nam từ 35 tuổi trở xuống (14,10%) đến trung tâm mua sắm chiếm tỷ lệ thấp hơn nhiều so với nhóm khách hàng nữ (20,53%) ở độ tuổi này. Tương tự với nhóm khách hàng nữ trung niên năm trong khoảng từ 35 tuổi đến 50 tuổi đến mua sắm cao hơn rất nhiều so số khách hàng nam trong độ tuổi này, chiếm tỷ, chiếm tỷ lệ lần lượt là 17,53% và 11,59%.

3.6 Thống kê mô tả cho hai biến Gender và biến Price

3.6.1 Mã hoá biến Price (Giá sản phẩm) từ định lượng sang định tính

Với dữ liệu gốc, biến Price (Giá sản phẩm) là biến định lượng nhận các giá trị từ 5,23 TRY đến 5250 TRY.. Dựa vào phần mềm phân tích R, tôi sẽ thực hiện mã hoá chia dữ liêu thành 2 khoảng với mức giá trung bình từ 700 TRY trở xuống và mức giá cao của sản phẩm từ 700 TRY trở lên. Kết quả thu được có 40530 sản phẩm đã được bán với mức giá trung bình và 20640 được bán với mức giá cao.

df1<- cut(x = shop$PRI,
    breaks = c(-Inf, 700, Inf), # Lấy khoảng dữ liệu 
    labels = c("Average", "High"), # Các mức giá
    right = TRUE) # Cho phép lấy khoảng đóng bên phải
table(df1)
## df1
## Average    High 
##   40530   20640

3.6.2 Bảng tần số và biểu đồ kết hợp

#1.Thống kê mô tả cho 2 biến giới tính và biến tình trạng sở hữu nhà của những khách hàng đến mua xe đạp. 
gd.pr<- table(shop$GD, df1)
addmargins(gd.pr)
##      df1
##       Average  High   Sum
##   F     24278 12275 36553
##   M     16252  8365 24617
##   Sum   40530 20640 61170
## *Hiển thị theo biểu đồ*
shop|> ggplot(aes(x= df1,y=after_stat(count))) + geom_bar(fill="lightblue") + geom_text(aes(label = scales::percent(after_stat(count/sum(count)))), stat = "count", color = "brown", vjust = - .5) + facet_grid(. ~GD) + labs(x = "Gender",y = "Number of customers")

Theo kết quả tính toán và đồ thị của phần mềm R, chúng ta thấy xu hướng khách hàng nữ mua các sản phẩm có mức giá trung bình từ 700 TRY trở xuống chiếm tỷ lệ rất cao đến 39,7% trong tống số 61170 người và gấp 2 lần nhóm khách nam giới (26,6&). Tương tự đối với các sản phẩm có mức giá cao, số khách nam (8365 người) mua ít hơn nhóm khách hàng nữ (12275 người),ít gấp 1,5 lần.

3.6.3 Rủi ro tương đối (Relative Risk)

library(epitools)
riskratio(gd.pr)
## $data
##        df1
##         Average  High Total
##   F       24278 12275 36553
##   M       16252  8365 24617
##   Total   40530 20640 61170
## 
## $measure
##    risk ratio with 95% C.I.
##     estimate     lower    upper
##   F 1.000000        NA       NA
##   M 1.011888 0.9892695 1.035023
## 
## $p.value
##    two-sided
##     midp.exact fisher.exact chi.square
##   F         NA           NA         NA
##   M  0.3058534    0.3076873  0.3058309
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "Unconditional MLE & normal approximation (Wald) CI"

Thông qua kết quả phân tích của phần mềm R cho thấy với độ tin cậy 95%, xác suất số khách nam đến mua sản phẩm có mức giá cao chiếm tỷ lệ gấp 1,012 lần so với khách nữ đến mua những sản phẩm từ 700 TRY..Từ đó cho thấy gần như không có sự chênh lệch nhiều giữa việc khách nam hay nữ trong việc mua những sản phẩm cao giá.

3.6.4 Tỷ lệ chênh (Odd Ratio)

oddsratio(gd.pr)
## $data
##        df1
##         Average  High Total
##   F       24278 12275 36553
##   M       16252  8365 24617
##   Total   40530 20640 61170
## 
## $measure
##    odds ratio with 95% C.I.
##     estimate     lower    upper
##   F 1.000000        NA       NA
##   M 1.017998 0.9837969 1.053378
## 
## $p.value
##    two-sided
##     midp.exact fisher.exact chi.square
##   F         NA           NA         NA
##   M  0.3058534    0.3076873  0.3058309
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "median-unbiased estimate & mid-p exact CI"

Dựa vào kết quả phân tích của phần mềm R cho thấy với độ tin cậy 95%, việc đã sở hữu nhà của khách hàng nam và khách hàng nữ đến để mua xe đạp là gần như nhau, chênh lệch gấp 1,018 lần.

3.6.5 Kiểm định tính độc lập

Kiểm định chi bình phương (Chi-Square) cho hai biến giới tình và giá sản phẩm.

Đặt giả thuyết:

Ho: Biến giới tính và biến giá sản phẩm là độc lập

H1: Biến giới tính và biến giá sản phẩm không độc lậP

chisq.test(gd.pr)
## 
##  Pearson's Chi-squared test with Yates' continuity correction
## 
## data:  gd.pr
## X-squared = 1.0308, df = 1, p-value = 0.31

Với p_value = 0,31 > 5% vậy ta bác bỏ Ho tại mức ý nghĩa 5%. Kết quả này cho chúng ta thấy rằng: Chưa đủ cơ sở để nói rằng giới tính khách hàng có liên quan tới việc chọn sản phẩm có giá như thế nào.

3.7 Khoảng ước lượng cho tỷ lệ

1. Ước lượng tỷ lệ khách hàng mua nhiều hơn 3 sản phẩm tại các trung tâm thương mại khác nhau, đồng thời kiểm định xem tỷ lệ (%) khách hàng mua nhiều hơn 3 sản phẩm có phải là 65% không ?

a.Đặt giả thuyết:

Ho: p = 0.65

H1: p # 0.65

inc <- shop[shop$QT > 3,]
prop.test(length(inc$QT), length(shop$QT), p = 0.65)
## 
##  1-sample proportions test with continuity correction
## 
## data:  length(inc$QT) out of length(shop$QT), null probability 0.65
## X-squared = 16892, df = 1, p-value < 2.2e-16
## alternative hypothesis: true p is not equal to 0.65
## 95 percent confidence interval:
##  0.3954632 0.4032417
## sample estimates:
##         p 
## 0.3993461

Trong kết quả phần mềm R, prop.test ước tính tỉ lệ khách hàng mua nhiều hơn 3 sản phẩm là 0.3993 (tức 39,93%) vậy ta bác bỏ Ho và với khoảng tin cậy 95% là 0,3955 đến 0,4032. Giá trị khi chi bình phương là 16,892; với trị số p < 2.2e-16. Như vậy, nghiên cứu này cho thấy tỷ lệ khách hàng mua nhiều hơn 3 sản phẩm tại các trung tâm thương mại khác nhau thấp hơn 65%.

Thực hiện bài toán kiểm định giả thuyết sự bằng nhau về tỷ lệ khách khách hàng mua nhiều hơn 3 sản phẩm của 2 tổng thể giới tính (nam và nữ):

Đặt giả thuyết

Ho: p1 = p2

H1: p1 # p2

icm <- shop[shop$GD =="M",]
icf <- shop[shop$GD =="F",]

icm3 <- icm[icm$QT > 3,]
icf3 <- icf[icf$QT > 3,]

a <- c(nrow(icm), nrow(icf))
b <- c(nrow(icm3), nrow(icf3))

prop.test(b,a)
## 
##  2-sample test for equality of proportions with continuity correction
## 
## data:  b out of a
## X-squared = 2.515, df = 1, p-value = 0.1128
## alternative hypothesis: two.sided
## 95 percent confidence interval:
##  -0.014382024  0.001506288
## sample estimates:
##    prop 1    prop 2 
## 0.3954990 0.4019369

Trong kết quả kiểm định trên, prop.test ước tính tỷ lệ khách nam giới mua nhiều hơn 3 sản phẩm là 0,3955 và ước tính tỉ lệ khách nữ giới mua trên 3 sản phẩm là 0,4019. Vậy ta bác bỏ Ho với độ tin cậy 95%. Đồng thời phân tích còn cho thấy với mức ý nghĩa 5%, tỷ lệ nam giới mua nhiều hơn 3 sản phẩm cao hơn 11,28%.

2.Ước lượng tỷ lệ khách hàng mua các sản phẩm có mức giá từ 300 TRY trở xuống, đồng thời kiểm định xem tỷ lệ (%) khách hàng khách hàng mua những sản phẩm có giá ít hơn 300 TRY có phải là 30% không ?

a.Đặt giả thuyết:

Ho: p = 0.3

H1: p # 0.3

prg <- shop[shop$PRI < 300,]
prop.test(length(prg$PRI), length(shop$PRI), p = 0.3)
## 
##  1-sample proportions test with continuity correction
## 
## data:  length(prg$PRI) out of length(shop$PRI), null probability 0.3
## X-squared = 12311, df = 1, p-value < 2.2e-16
## alternative hypothesis: true p is not equal to 0.3
## 95 percent confidence interval:
##  0.5016205 0.5095607
## sample estimates:
##        p 
## 0.505591

Trong kết quả phần mềm R, prop.test ước tính tỉ lệ khách hàng mua các sản phẩm có mức giá 300 TRY trở xuống là 0,5056 (tức 50,56%) vậy ta bác bỏ Ho và với khoảng tin cậy 95% là 0,5016 đến 0,5096. Giá trị khi chi bình phương là 12,311; với trị số p < 2.2e-16. Như vậy, nghiên cứu này cho thấy tỷ lệ khách hàng mua những sản phẩm có giá ít hơn 300 TRY tại các trung tâm thương mại khác nhau cao hơn 30%.

Thực hiện bài toán kiểm định giả thuyết sự bằng nhau về tỷ lệ khách khách hàng tỷ lệ khách hàng mua các sản phẩm có mức giá từ 300 TRY trở xuống của 2 tổng thể giới tính (nam và nữ):

Đặt giả thuyết

Ho: p1 = p2

H1: p1 # p2

prgm <- shop[shop$GD == 'M',]
prgf <- shop[shop$GD == 'F',]

prgm3 <- prgm[prgm$PRI < 300,]
prgf3 <- prgf[prgf$PRI < 300,]

c <- c(nrow(prgm), nrow(prgf))
d <- c(nrow(prgm3), nrow(prgf3))

prop.test(d,c)
## 
##  2-sample test for equality of proportions with continuity correction
## 
## data:  d out of c
## X-squared = 0.54176, df = 1, p-value = 0.4617
## alternative hypothesis: two.sided
## 95 percent confidence interval:
##  -0.011181632  0.005045354
## sample estimates:
##    prop 1    prop 2 
## 0.5037576 0.5068257

Trong kết quả kiểm định trên, prop.test ước tính tỷ lệ khách nam giới mua những sản phẩm có giá ít hơn 300 TRY là 0,5038 và ước tính tỉ lệ khách nữ giới mua các sản phẩm có mức giá từ 300 TRY trở xuống là 0,5068. Vậy ta bác bỏ Ho với độ tin cậy 95%. Đồng thời phân tích còn cho thấy với mức ý nghĩa 5%, tỷ lệ nam giới mua những sản phẩm có giá ít hơn 300 TRY cao hơn 46,17%.

4 Bài tập về nhà tuần 1

4.1 Giới thiệu các biến

Mô tả: Dữ liệu CustomerShopping là một bộ dữ liệu bảng lấy từ website: https://www.kaggle.com/datasets/mehmettahiraslan/customer-shopping-dataset. Bộ dữ liệu phân tích và đánh giá thói quen mua sắm danh mục các sản phẩm của mỗi khách hàng tại Istanbul thu thập từ các trung tâm mua sắm khác nhau từ năm 2021 đến năm 2023. Bộ dữ liệu chứa 61170 quan sát và trong đó có 9 biến gồm:

  1. Date: dữ liệu thu nhập từ 05/11/2021 đến 08/03/2023.
  2. CustomerID: mã định danh ID của mỗi khách hàng(C414588, C109553, C272095,…)
  3. Age: Độ tuổi của mỗi khách hàng
  4. Gender: Giới tính của khách hàng (F -Female: Nữ giới, M - Male: Nam giới)
  5. Category: Danh mục các sản phẩm đã mua của mỗi khách hàng (Cosmetics, Clothing, Food & Beverage và Other products bao gồm: Souvenir, Technology, Books,…)
  6. Quantity: Số lượng của từng sản phẩm (mặt hàng) trên mỗi giao dichh mua sắm của khách hàng (1,2,3,4,5)
  7. Price: Giá sản phẩm trên mỗi đơn vị tính bằng đồng Lira (TRY) của Thổ Nhĩ Kỳ (81,32; 11,73; 10,46; 300,08;… )
  8. Payment: Phương thức thanh toán của mỗi khách hàng (Cash, Debit Card và Credit Card)
  9. Area: Trung tâm mua sắm nơi mỗi khách hàng mua sản phẩm (Mall of Istanbul, Kanyon và Other places bao gồm: Metropol AVM, Metrocity, Emaar Square Mall,…)
library(readxl)
library(dplyr)
library(ggplot2)
library(DescTools)
library(epitools)

4.1.1 Lấy bộ dữ liệu BikeSales

# *Găn dữ liệu BikeSales cho biến bike*
shop <- read_excel("D:/RStudio/CustomerShopping.xlsx", sheet =1)
# *Mô tả chi tiết kiểu biến số của datasheet BikeSales*
str(shop)
## tibble [61,170 x 9] (S3: tbl_df/tbl/data.frame)
##  $ DATE    : POSIXct[1:61170], format: "2021-11-05" "2021-11-05" ...
##  $ ID      : chr [1:61170] "C414588" "C109553" "C272095" "C254603" ...
##  $ GENDER  : chr [1:61170] "M" "F" "F" "F" ...
##  $ AGE     : num [1:61170] 50 27 65 19 51 46 23 21 48 20 ...
##  $ CATEGORY: chr [1:61170] "Cosmetics" "Other products" "Food & Beverage" "Clothing" ...
##  $ QUANTITY: num [1:61170] 2 1 2 1 4 1 4 4 3 2 ...
##  $ PRICE   : num [1:61170] 81.3 11.7 10.5 300.1 20.9 ...
##  $ PAYMENT : chr [1:61170] "Cash" "Cash" "Cash" "Cash" ...
##  $ AREA    : chr [1:61170] "Other places" "Other places" "Other places" "Mall of Istanbul" ...
# *Gắn tên viết tắt cho các biến để dễ thao tác*
names(shop)
## [1] "DATE"     "ID"       "GENDER"   "AGE"      "CATEGORY" "QUANTITY" "PRICE"   
## [8] "PAYMENT"  "AREA"
names(shop) <- c("DATE", "ID", "GD", "AGE", "CATE", "QT", "PRI", "PAY", "AREA")
head(shop)
## # A tibble: 6 x 9
##   DATE                ID      GD      AGE CATE              QT   PRI PAY   AREA 
##   <dttm>              <chr>   <chr> <dbl> <chr>          <dbl> <dbl> <chr> <chr>
## 1 2021-11-05 00:00:00 C414588 M        50 Cosmetics          2  81.3 Cash  Othe~
## 2 2021-11-05 00:00:00 C109553 F        27 Other products     1  11.7 Cash  Othe~
## 3 2021-11-05 00:00:00 C272095 F        65 Food & Bevera~     2  10.5 Cash  Othe~
## 4 2021-11-05 00:00:00 C254603 F        19 Clothing           1 300.  Cash  Mall~
## 5 2021-11-05 00:00:00 C534710 F        51 Food & Bevera~     4  20.9 Cash  Othe~
## 6 2021-11-05 00:00:00 C211570 F        46 Clothing           1 300.  Cash  Othe~

4.1.2 Trích xuất dữ liệu từ một dataframe có sẵn

# Trích xuất các quan sát của biến GD = "F" và các quan sát của biến CATE = Cosmetics trong đối tượng shop gắn vào với tên shop1
shop1 <- subset(shop, GD == "F"& CATE == "Cosmetics")
dim(shop1)
## [1] 5632    9
head (shop1)
## # A tibble: 6 x 9
##   DATE                ID      GD      AGE CATE         QT   PRI PAY        AREA 
##   <dttm>              <chr>   <chr> <dbl> <chr>     <dbl> <dbl> <chr>      <chr>
## 1 2021-11-05 00:00:00 C228381 F        23 Cosmetics     4 163.  Cash       Othe~
## 2 2021-11-05 00:00:00 C239989 F        20 Cosmetics     2  81.3 Credit Ca~ Othe~
## 3 2021-11-05 00:00:00 C101079 F        20 Cosmetics     5 203.  Cash       Mall~
## 4 2021-11-05 00:00:00 C192609 F        19 Cosmetics     4 163.  Cash       Othe~
## 5 2021-11-05 00:00:00 C100900 F        30 Cosmetics     2  81.3 Debit Card Othe~
## 6 2021-11-05 00:00:00 C936162 F        47 Cosmetics     4 163.  Credit Ca~ Othe~

4.2 Mô tả và thống kê các biến BikeSales

4.2.1 Phân tích biến AGE (Độ tuổi của khách hàng)

#Bảng summary
summary(shop$AGE)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   18.00   30.00   43.00   43.43   56.00   69.00
# Đồ thị
hist (shop$AGE, main = "Frequency of Age", col = "lightblue")

Dựa theo kết quả phân tích của phần mềm R tôi thấy được khách hàng có độ tuổi cao nhất đến trung tâm mua sắm là 69 tuổi và khách hàng có độ tuổi thấp nhất là 18 tuổi; độ tuổi trung bình của mỗi khách hàng đến mua sắm là 43 tuổi và có 50% số người có tuổi dưới 43 tuổi đến mua hàng.Thông qua biểu đồ tần số trên có thể thấy rằng phần lớn những người đến trung tâm mua sắm có độ tuổi nằm trong khoảng từ 20 đến 70 tuổi. Còn lại những người có độ tuổi trung bình dưới 20 tuổi đến mua sắm chiếm số ít trong tổng số 61170 khách hàng.

4.2.2 Phân tích biến Price (Giá sản phẩm trên mỗi đơn vị tính)

#Bảng summary
summary(shop$PRI)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##    5.23   40.66  203.30  686.63 1200.32 5250.00
# Đồ thị
hist (shop$PRI, main = "Frequency of Price", col = "orange")

Dựa theo kết quả phân tích của phần mềm R tôi thấy được khách hàng mua sản phẩm với mức giá thấp nhất là 5,23 TRY và khách hàng mua sản phẩm với mức giá cao nhất là 5250 TRY; trung bình khách thường mua sản phẩm có mức giá khoảng 686,63 TRY và có 50% số người mua hàng với mức giá dưới 203,30 TRY.Thông qua biểu đồ tần số trên có thể thấy rằng phần lớn những người đến mua sắm thường mua các sản phẩm có giá trung bình dưới 2000 TRY. Còn lại có rất ít người mua sản phẩm từ 2500 TRY trở lên trong tổng số 61170 khách hàng.

4.2.3 Phân tích biến Quantity (Số sản phẩm đã mua)

# Bảng summary
summary(shop$QT)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   1.000   2.000   3.000   3.006   4.000   5.000
# Đồ thị
library(ggplot2)
shop |> ggplot(aes(x = QT, y = after_stat(count))) +
geom_bar(fill = 'blue') +geom_text(aes(label = scales::percent(after_stat(count/sum(count)))), stat ='count', color = 'red', vjust = - .5) +labs(x = 'Frequency of Quantity', y = 'Number of customers')

Dựa vào số liệu thống kê và đồ thị ở trên, ta phân tích được khách hàng mua nhiều nhất 5 sản phẩm chiếm tỷ lệ là 20,271% và tối thiểu khách hàng chỉ mua một sản phẩm chiếm 19,845% trong tổng số, trung bình mỗi khách hàng đến mua tầm 3 sản phẩm và có 50% số khách hàng mua dưới 3 sản phẩm.

4.2.4 Phân tích biến Gender (Giới tính)

# Bảng tần số
table(shop$GD)
## 
##     F     M 
## 36553 24617
## *Hiển thị theo biểu đồ*
shop |> ggplot(aes(x = GD, y = after_stat(count))) +
geom_bar(fill = 'pink') +geom_text(aes(label = scales::percent(after_stat(count/sum(count)))), stat ='count', color = 'blue', vjust = - .5) +labs(x = 'Frequency of males and females', y = 'Number of customers')

Theo kết quả thống kê của phần mềm phân tích R, ta thấy số khách hàng nữ đến trung tâm mua sắm nhiều gấp 1.5 lần số khách nam, trong đó tỷ lệ khách hàng nữ chiếm đến 60% và tỷ lệ khách hàng nữ chiếm khoảng 40%.

4.2.5 Phân tích biến CATEGORY (Danh mục các sản phẩm đã mua)

# Bảng tần số
table(shop$CATE)
## 
##        Clothing       Cosmetics Food & Beverage  Other products 
##           21058            9408            9109           21595
## *Hiển thị theo biểu đồ*
shop |> ggplot(aes(x = CATE, y = after_stat(count))) +
geom_bar(fill = 'pink') +geom_text(aes(label = scales::percent(after_stat(count/sum(count)))), stat ='count', color = 'blue', vjust = - .5) +labs(x = 'Frequency of PRODUCTS', y = 'Number of customers')

Theo kết quả phân tích và đồ thị chúng ta thấy được xu hướng khách hàng đên trung tâm mua sắm quần áo chiếm tỷ lệ tương đối cao đến 34,43 trong tổng số 61170 người. Tiếp đến là nhóm khách hàng đến mua mỹ phẩm và nhóm khách mua các loại thức phẩm, nước giải khát không có sự chênh lệnh quá nhiều, có tỷ lệ gần như nhau chiếm lần lượt là 15,38% và 14,89%.

4.2.6 Phân tích biến Payment (Phương thức thanh toán)

# Bảng tần số
table(shop$PAY)
## 
##        Cash Credit Card  Debit Card 
##       27422       21474       12274
## *Hiển thị theo biểu đồ*
library(ggplot2)
pie(table(shop$PAY), main= "Histogram of Payment", col = rainbow(6))

shop |> ggplot(aes(x = PAY, y = after_stat(count))) +
geom_bar(fill = 'brown') +geom_text(aes(label = scales::percent(after_stat(count/sum(count)))), stat ='count', color = 'blue', vjust = - .5) +labs(x = 'Frequency of Payment', y = 'Number of customers')

Theo kết quả phân tích và đồ thị ta thấy những khách hàng đến trung tâm thương mại mua sắm thanh toán sản phẩm bằng tiền mặt chiếm tỷ lệ cao nhất đến 44,8% trong tổng số, gấp đến 2,2 lần nhóm khách hàng thanh toán bằng thẻ ghi nợ (12274 người) và gấp 1,3 lần số khách thanh toán bằng thẻ tín dụng (21474 người).

5 Bài tập về nhà tuần 2: Lựa chọn các biến định tính và định lượng

5.1 Biến phụ thuộc là biến định tính

Bài nghiên cứu chọn biến phụ thuộc gồm các biến định tính đã được mã hoá là biến Quantity (Số lượng sản phẩm khách hàng đã mua) xác định thông qua 61170 khách hàng quan sát thu nhập được ở Istanbul để đánh giá mức độ tiêu thụ sản phẩm mua sắm sẽ có thói quen mua sản phẩm nào nhiều nhất, từ đó đưa ra phương án và các chương trình khuyến mãi nhằm đẩy mạnh nhu cầu tiêu thụ loại sản phẩm đó ra thị trường.

5.2 Biến phụ thuộc là biến định lượng

Nghiên cứu sử dụng biến định lượng làm biến phụ thuộc bao gồm biến PRICE (giá cả mỗi sản phẩm), biến AGE (Độ tuổi của mỗi khách hàng), biến Gender, biến AREA VÀ Biến Payment nhằm phân tích thói quen mua sắm sản phẩm bằng ước lượng mức giá trung bình của những sản phẩm thì khách thường chọn mua nhiều nhất hoặc một khách hàng có độ tuổi trung bình của mỗi khách hàng sẽ có xu hướng mua những sản phẩm nào và với mức giá bao nhiêu?

LS0tDQp0aXRsZTogIlBURExEVCINCmF1dGhvcjogIlbDtSBUaOG7iyBLaW0gT2FuaCINCmRhdGU6ICIyMDIzLTA2LTExIg0Kb3V0cHV0Og0KICBodG1sX2RvY3VtZW50Og0KICAgIG51bWJlcl9zZWN0aW9uczogeWVzDQogICAgdG9jOiB5ZXMNCiAgICB0b2NfZmxvYXQ6IHllcw0KICAgIHRvY19kZXBodDogMw0KICAgIGNvZGVfZm9sZGluZzogaGlkZQ0KICAgIGNvZGVfZG93bmxvYWQ6IHRydWUNCiAgd29yZF9kb2N1bWVudDoNCiAgICB0b2M6IHllcw0KICAgIA0KLS0tDQoNCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQ0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBUUlVFKQ0KYGBgDQoNCmBgYHtyfQ0KbGlicmFyeShyZWFkeGwpDQpsaWJyYXJ5KGRwbHlyKQ0KbGlicmFyeShnZ3Bsb3QyKQ0KbGlicmFyeShEZXNjVG9vbHMpDQpsaWJyYXJ5KGVwaXRvb2xzKQ0KIyAqR8SDbiBk4buvIGxp4buHdSBCaWtlU2FsZXMgY2hvIGJp4bq/biBzaG9wMSoNCnNob3AxIDwtIHJlYWRfZXhjZWwoIkQ6L1JTdHVkaW8vQ3VzdG9tZXJTaG9wcGluZy54bHN4Iiwgc2hlZXQgPTEpDQojICpH4bqvbiB0w6puIHZp4bq/dCB04bqvdCBjaG8gY8OhYyBiaeG6v24gxJHhu4MgZOG7hSB0aGFvIHTDoWMqDQpuYW1lcyhzaG9wMSkNCm5hbWVzKHNob3AxKSA8LSBjKCJEQVRFIiwgIklEIiwgIkdEIiwgIkFHRSIsICJDQVRFIiwgIlFUIiwgIlBSSSIsICJQQVkiLCAiQVJFQSIpDQpoZWFkKHNob3AxKQ0KYGBgDQoNCiMgKipCw6BpIHThuq1wIHbhu4EgbmjDoCB0deG6p24gNDoqKiBNw7QgaMOsbmggaOG7k2kgcXV5DQojIyBNw6MgaG/DoSBiaeG6v24gUXVhbnRpdHkgdOG7qyDEkeG7i25oIGzGsOG7o25nIHNhbmcgxJHhu4tuaCB0w61uaDoNCmBgYHtyfQ0KcXQgPC0gY3V0KHNob3AxJFFULCBicmVha3MgPSBjKDEsMiw1KSwgbGFiZWxzPWMoIsOtdCIsIm5oaeG7gXUiKSkNCnF0IDwtIGlmZWxzZShxdCA9PSAibmhp4buBdSIsMSwwKQ0KdGFibGUocXQpDQpgYGANCg0KKirGr+G7m2MgbMaw4bujbmcgaMOgbSBo4buTaSBxdXkgY2hvIGJp4bq/biBHZW5kZXIgKEdp4bubaSB0w61uaCkgcGjhu6UgdGh14buZYyB2w6BvIGPDoWMgYmnhur9uIMSR4buZYyBs4bqtcCBiYW8gZ+G7k20gIGJp4bq/biBBZ2UsIGJp4bq/biBRdWFudGl0eSB2w6AgYmnhur9uIFByaWNlLioqDQoNCsSQ4buRaSB24bubaSBiaeG6v24gR2VuZGVyIHBo4bqhbSB0csO5IHRo4bupIGhhaSBj4bunYSBiaeG6v24gbmjhu4sgcGjDom4gdGjhu4MgaGnhu4duIGNobyDigJx0aMOgbmggY8O0bmfigJ0g4bufIMSRw6J5IGzDoCAiRm9yIFNhbGUiLCB0aOG7gyBoaeG7h24gbeG7pWMgxJFpY2ggc+G7rSBk4bulbmcgY8SDbiBo4buZLg0KYGBge3J9DQpHRCA8LSBzaG9wMSRHRA0KQUdFIDwtIHNob3AxJEFHRQ0KUFIgPC0gc2hvcDEkUFJJDQpDQVRFIDwtIHNob3AxJENBVEUNClBBWSA8LSBzaG9wMSRQQVkNCkFSRSA8LSBzaG9wMSRBUkVBDQoNCiMgWMOhYyDEkeG7i25oIHRo4bupIHThu7EgY8OhYyBwaOG6oW0gdHLDuSBj4bunYSBiaeG6v24gUXVhbnRpdHk6DQpsZXZlbHMoZmFjdG9yKHF0KSkNCmBgYA0KICANCiMjIE3DtCBow6xuaCBo4buTaSBxdXkgbG9naXQNCg0KYGBge3J9DQojIMav4bubYyBsxrDhu6NuZw0KcHVyY2gxIDwtIGdsbShmYWN0b3IocXQpIH4gR0QgKyBBR0UgKyBQUiArIENBVEUgKyBQQVkgKyBBUkUgLCBmYW1pbHkgPSBiaW5vbWlhbChsaW5rID0gJ2xvZ2l0JyksIGRhdGEgPSBzaG9wMSkNCnN1bW1hcnkocHVyY2gxKQ0KYGBgDQpUYSBjw7MgaMOgbSBk4buvIGxp4buHdSBuaOG7iyBwaMOibiBsb2dpdDogDQoNCiAgICBsb2dpdCjPgCkgPSAtICg1LDU2MWUtMDIpLkdETSArKDEsMDU4ZS0wMykuUFIgKyAoOSw3ODhlLTAxKS4gQ0FURUNvc21ldGljcyArICgxLjA5NGUrMDApLiBDQVRFRm9vZCAmIEJldmVyYWdlICsgKDMuNzY5ZS0wMSkuQ0FURU90aGVyIHByb2R1Y3RzDQoNCiMjIE3DtCBow6xuaCBo4buTaSBxdXkgcHJvYml0DQoNCmBgYHtyfQ0KIyDGr+G7m2MgbMaw4bujbmcNCnB1cmNoMiA8LSBnbG0oZmFjdG9yKHF0KSB+IEdEICsgQUdFICsgUFIgKyBDQVRFICsgUEFZICsgQVJFLCBmYW1pbHkgPSBiaW5vbWlhbChsaW5rID0gJ3Byb2JpdCcpLCBkYXRhID0gc2hvcDEpDQpzdW1tYXJ5KHB1cmNoMikNCmBgYA0KDQpUYSBjw7MgaMOgbSBk4buvIGxp4buHdSBuaOG7iyBwaMOibiBwcm9iaXQ6DQoNCnByb2JpdCjPgCkgPSAoMS4yOTllLTAxKSAtICgzLjIzMGUtMDIpLkdETSArKDUuNjAwZS0wNCkuUFIgKyAoNS4wMzFlLTAxKS4gQ0FURUNvc21ldGljcyArICg1LjAzMWUtMDEpLiBDQVRFRm9vZCAmIEJldmVyYWdlICsgKDEuMDU1ZS0wMSkuQ0FURU90aGVyIHByb2R1Y3RzDQoNCiMjIE3DtCBow6xuaCBo4buTaSBxdXkgY2xvZ2xvZw0KDQpgYGB7cn0NCiMgxq/hu5tjIGzGsOG7o25nDQpwdXJjaDMgPC0gZ2xtKGZhY3RvcihxdCkgfiBHRCArIEFHRSArIFBSICsgQ0FURSArIFBBWSArIEFSRSwgZmFtaWx5ID0gYmlub21pYWwobGluayA9ICdjbG9nbG9nJyksIGRhdGEgPSBzaG9wMSkNCnN1bW1hcnkocHVyY2gzKQ0KYGBgDQpUYSBjw7MgaMOgbSBk4buvIGxp4buHdSBuaOG7iyBwaMOibiBwcm9iaXQ6DQoNCnByb2JpdCjPgCkgPSAtICgxLDA3NWUtMDEpIC0gKDIsODM5ZS0wMikuR0RNICsoNCw5MzVlLTA0KS5QUiArICg0LDA3NWUtMDEpLiBDQVRFQ29zbWV0aWNzICsgKDQsNTA0ZS0wMSkuIENBVEVGb29kICYgQmV2ZXJhZ2UgKyAoNCw1MDRlLTAxKS5DQVRFT3RoZXIgcHJvZHVjdHMNCg0KIyAqKkLDoGkgdOG6rXAgduG7gSBuaMOgIHR14bqnbiA1OiAgQ8OhYyB0acOqdSBjaMOtIMSRw6FuaCBnacOhIG3DtCBow6xuaCoqDQoNCiBTYXUga2hpIHRo4buxYyBoaeG7h24ga2nhu4NtIMSR4buLbmggc+G7sSBwaMO5IGjhu6NwIGPhu6dhIG3DtCBow6xuaCBsb2dpdCwgcHJvYml0IHbDoCBjbG9nbG9nLCBjaMO6bmcgdGEgdGjhuqV5IGPhuqMgMyBtw7QgaMOsbmggxJHhu4F1IHBow7kgaOG7o3AgduG7m2kgZOG7ryBsaeG7h3UuDQogDQojIyBBSUMgLSBBa2Fpa2UgSW5mb3JtYXRpb24gQ3JpdGVyaW9uDQoNCiBUacOqdSBjaMOtIEFJQyBsw6AgbeG7mXQgc+G7kSBsaeG7h3UgxJHGsOG7o2Mgc+G7rSBk4bulbmcgxJHhu4Mgc28gc8Ohbmggc+G7sSBwaMO5IGjhu6NwIGPhu6dhIGPDoWMgbcO0IGjDrG5oIGjhu5NpIHF1eSBraMOhYyBuaGF1LCB0YSBjw7M6DQoNCmBgYHtyfQ0KIyBUacOqdSBjaMOtIEFJQw0KYWljMSA8LSBBSUMocHVyY2gxKQ0KYWljMiA8LSBBSUMocHVyY2gyKQ0KYWljMyA8LSBBSUMocHVyY2gzKQ0KQUlDIDwtIGNiaW5kKGFpYzEsYWljMixhaWMzKQ0KQUlDDQpgYGANCg0KVOG7qyBr4bq/dCBxdeG6oyBwaMOibiB0w61jaCB2w6AgdGjhu5FuZyBrw6ogY+G7p2EgcGjhuqduIG3hu4FtIFIsIHRhIGPDszoNCg0KQUlDIChsb2dpdCk9IDUxNjE4LDQxDQoNCkFJQyAocHJvYml0KSA9IDUxNjYwLDQ1DQoNCkFJQyAoY2xvZ2xvZykgPSA1MTU4Nyw0Ng0KDQogIFbhuq15IG3DtCBow6xuaCBo4buTaSBxdXkgY2xvZ2xvZyBjw7MgQUlDIHRo4bqlcCBuaOG6pXQgbWFuZyBs4bqhaSBz4buxIHBow7kgaOG7o3AgbmjhuqV0Lg0KDQojIwlCcmllciBTY29yZQ0KDQpCcmllciBTY29yZSBsw6AgY2jhu4kgdGnDqnUgZMO5bmcgxJHhu4MgxJHDoW5oIGdpw6EgbcO0IGjDrG5oIGjhu5NpIHF1eSBsb2dpc3RpYywgZ2nDoSB0cuG7iyBj4bunYSBCcmllciBTY29yZSBjw6BuZyBuaOG7jyBuZ2jEqWEgbMOgIGNow6puaCBs4buHY2ggZ2nhu69hIHjDoWMgc3XhuqV0IHRo4buxYyB04bq/IHbDoCB4w6FjIHN14bqldCB0w61uaCB04burIG3DtCBow6xuaCBjw6BuZyBuaOG7jywgbmdoxKlhIGzDoCBtw7QgaMOsbmggY8OgbmcgdOG7kXQuDQoNCmBgYHtyfQ0KbGlicmFyeSAoRGVzY1Rvb2xzKQ0KQnJpZXJTY29yZShwdXJjaDEpDQpgYGANCmBgYHtyfQ0KQnJpZXJTY29yZShwdXJjaDIpDQpgYGANCmBgYHtyfQ0KQnJpZXJTY29yZShwdXJjaDMpDQpgYGANCiAgVOG7qyB0w61uaCB0b8OhbiBj4bunYSBHacOhIHRy4buLIEJyaWVyIFNjb3JlIGPhu6dhIDMgbcO0IGjDrG5oIGxvZ2l0LCBwcm9iaXQgdsOgIGNsb2dsb2csIHRhIHRo4bqleSBCcmllclNjb3JlIGPhu6dhIGxvZ2l0IGPDsyBnacOhIHRy4buLIDAsMTc0NCBuaOG7jyBuaOG6pXQgbmdoxKlhIGzDoCBtw7QgaMOsbmggbsOgeSBsw6AgdOG7kXQgbmjhuqV0Lg0KICANCiMjCURldmlhbmNlDQpgYGB7cn0NCiMgVGnDqnUgY2jDrSBEZXZpYW5jZQ0KZGUxIDwtIGRldmlhbmNlKHB1cmNoMSkNCmRlMiA8LSBkZXZpYW5jZShwdXJjaDIpDQpkZTMgPC0gZGV2aWFuY2UocHVyY2gzKQ0KZGV2aWFuY2UgPC0gY2JpbmQoZGUxLGRlMixkZTMpDQpkZXZpYW5jZQ0KYGBgDQpU4burIGvhur90IHF14bqjIHBow6JuIHTDrWNoIHbDoCB0aOG7kW5nIGvDqiBj4bunYSBwaOG6p24gbeG7gW0gUiwgdGEgY8OzOiANCg0KRGV2aWFuY2UgKGxvZ2l0KT0gNTE1OTYsNDENCg0KRGV2aWFuY2UgKHByb2JpdCkgPSA1MTYzOCw0NQ0KDQpEZXZpYW5jZSAoY2xvZ2xvZykgPSA1MTU2NSw0Ng0KDQogIFbhuq15IG3DtCBow6xuaCBo4buTaSBxdXkgbG9naXQgY8OzIERldmlhbmNlIHRo4bqlcCBuaOG6pXQgbWFuZyBs4bqhaSBz4buxIHBow7kgaOG7o3AgbmjhuqV0Lg0KICANCiMjCU1hIHRy4bqtbiBuaOG6p20gbOG6q24gLSBDb25mdXNpb24gbWF0cml4IA0KYGBge3J9DQojIELhu5kgZOG7ryBsaeG7h3Ugc2hvcCBzYXUga2hpIG3DoyBob8OhIGJp4bq/biBRdWFudGl0eToNClNob3BtYWhvYTwtc3Vic2V0KHNob3AxLCBzaG9wMSRRVCA8PTUpDQpkaW0oU2hvcG1haG9hKQ0KaGVhZCAoU2hvcG1haG9hKQ0KU2hvcG1haG9hJFFUW1Nob3BtYWhvYSRRVCA8PTJdPC0wDQpTaG9wbWFob2EkUVRbU2hvcG1haG9hJFFUID4gMl08LTENCmhlYWQoU2hvcG1haG9hKQ0KYGBgDQoNCiMjIyBNw7QgaMOsbmggbG9naXQNCmBgYHtyfQ0KbGlicmFyeShnZ3Bsb3QyKQ0KbGlicmFyeShjYXJldCkNCiMgxJDDoW5oIGdpw6EgbcO0IGjDrG5oIHRyw6puIHThuq1wIGtp4buDbSB0cmENCnByZWRpY3Rpb25zIDwtIHByZWRpY3QocHVyY2gxLCBuZXdkYXRhID0gU2hvcG1haG9hLCB0eXBlID0gInJlc3BvbnNlIikNCnByZWRpY3RlZF9jbGFzc2VzIDwtIGlmZWxzZShwcmVkaWN0aW9ucyA+IDAuNSwgIjEiLCAiMCIpICAjIENo4buJbmggbmfGsOG7oW5nIHBow6JuIGxv4bqhaQ0KcHJlZGljdGlvbnMxPC1mYWN0b3IocHJlZGljdGVkX2NsYXNzZXMsIGxldmVscyA9IGMoIjAiLCIxIikpDQphY3R1YWw8LSBmYWN0b3IocXQsIGxhYmVscyA9IGMoIjAiLCIxIikpDQpjb25mdXNpb25NYXRyaXgodGFibGUocHJlZGljdGlvbnMxLCBhY3R1YWwpKQ0KYGBgDQoNCk3DtCBow6xuaCBsb2dpdCBjw7MgxJHhu5kgY2jDrW5oIHjDoWMgdG/DoG4gdGjhu4MgbMOgIDc1LDE1JSwgxJHhu5kgbmjhuqF5IGzDoCA2NiwyOCUgdsOgIMSR4buZIGhp4buHdSBxdeG6oyBsw6AgNTgsNjMlDQoNCiMjIyBNw7QgaMOsbmggcHJvYml0DQoNCmBgYHtyfQ0KIyDEkMOhbmggZ2nDoSBtw7QgaMOsbmggdHLDqm4gdOG6rXAga2nhu4NtIHRyYQ0KcHJlZGljdGlvbnMxIDwtIHByZWRpY3QocHVyY2gyLCBuZXdkYXRhID0gU2hvcG1haG9hLCB0eXBlID0gInJlc3BvbnNlIikNCnByZWRpY3RlZF9jbGFzc2VzMSA8LSBpZmVsc2UocHJlZGljdGlvbnMxID4gMC41LCAiMSIsICIwIikgICMgQ2jhu4luaCBuZ8aw4buhbmcgcGjDom4gbG/huqFpDQpwcmVkaWN0aW9uczI8LWZhY3RvcihwcmVkaWN0ZWRfY2xhc3NlczEsIGxldmVscyA9IGMoIjAiLCIxIikpDQphY3R1YWwxPC0gZmFjdG9yKHF0LCBsYWJlbHMgPSBjKCIwIiwiMSIpKQ0KY29uZnVzaW9uTWF0cml4KHRhYmxlKHByZWRpY3Rpb25zMiwgYWN0dWFsMSkpDQpgYGANCg0KTcO0IGjDrG5oIHByb2JpdCBjw7MgxJHhu5kgY2jDrW5oIHjDoWMgdG/DoG4gdGjhu4MgbMOgIDc1LDE1JTsgxJHhu5kgbmjhuqF5IGzDoCA2Niw4NiUgdsOgIMSR4buZIGhp4buHdSBxdeG6oyBsw6AgNTgsMjElLg0KDQojIyMgTcO0IGjDrG5oIGNsb2dsb2cNCg0KYGBge3J9DQojIMSQw6FuaCBnacOhIG3DtCBow6xuaCB0csOqbiB04bqtcCBraeG7g20gdHJhDQpwcmVkaWN0aW9uczIgPC0gcHJlZGljdChwdXJjaDMsIG5ld2RhdGEgPSBTaG9wbWFob2EsIHR5cGUgPSAicmVzcG9uc2UiKQ0KcHJlZGljdGVkX2NsYXNzZXMyIDwtIGlmZWxzZShwcmVkaWN0aW9uczIgPiAwLjUsICIxIiwgIjAiKSAgIyBDaOG7iW5oIG5nxrDhu6FuZyBwaMOibiBsb+G6oWkNCnByZWRpY3Rpb25zMzwtZmFjdG9yKHByZWRpY3RlZF9jbGFzc2VzMiwgbGV2ZWxzID0gYygiMCIsIjEiKSkNCmFjdHVhbDI8LSBmYWN0b3IocXQsIGxhYmVscyA9IGMoIjAiLCIxIikpDQpjb25mdXNpb25NYXRyaXgodGFibGUocHJlZGljdGlvbnMzLCBhY3R1YWwyKSkNCmBgYA0KDQpNw7QgaMOsbmggY2xvZ2xvZyBjw7MgxJHhu5kgY2jDrW5oIHjDoWMgdG/DoG4gdGjhu4MgbMOgIDc1LDE1JSwgxJHhu5kgbmjhuqF5IGzDoCA2OCw3OSUgdsOgIMSR4buZIGhp4buHdSBxdeG6oyBsw6AgNTYsOTYlLg0KDQogIMSQ4buZIGNow61uaCB4w6FjIHRvw6BuIHRo4buDIGPhu6dhIG3DtCBow6xuaCBjbG9nbG9nIGNhbyBuaOG6pXQ7IMSR4buZIG5o4bqheSBj4bunYSBtw7QgaMOsbmggY2xvZ2xvZyBjYW8gbmjhuqV0IHbDoCDEkeG7mSBoaeG7h3UgcXXhuqMgY+G7p2EgbcO0IGjDrG5oIHByb2JpdCBjYW8gbmjhuqV0LiBWw6wgbeG7pWMgdGnDqnUgY+G7p2EgYsOgaSB0aeG7g3UgbHXhuq1uIGzDoCDEkcOhbmggZ2nDoSB2aeG7h2MgdGnDqnUgdGjhu6Ugc+G6o24gcGjhuqltIG11YSBz4bqvbSBj4bunYSBraMOhY2ggaMOgbmcgbsOqbiDEkeG7mSBjaMOtbmggeMOhYyBsw6AgdGnDqnUgY2jDrSBxdWFuIHRy4buNbmcgbmjhuqV0IMSR4buDIMSRw6FuaCBnacOhIHRyb25nIHRyxrDhu51uZyBo4bujcCBuw6B5LCB2w6wgduG6rXkgbcO0IGjDrG5oIGzhu7FhIGNo4buNbiBsw6AgbcO0IGjDrG5oIGNsb2dsb2cuDQoNCioqS+G6v3QgbHXhuq1uKio6IEThu7FhIHbDoG8gNCB0acOqdSBjaHXhuqluIHRhIHRo4bqleSBtw7QgaMOsbmggY2xvZ2xvZyBsw6AgbcO0IGjDrG5oIMSRxrDhu6NjIGzhu7FhIGNo4buNbiBuaGnhu4F1IG5o4bqldCBkbyDEkcOzIE1IIGzDoCB04buRdCBuaOG6pXQgxJHhu4MgcGjDom4gdMOtY2ggxJHDoW5oIGdpw6EgY8OhYyB54bq/dSB04buRIOG6o25oIGjGsOG7n25nIMSR4bq/biB2aeG7h2MgdGnDqnUgdGjhu6Ugc+G6o24gcGjhuqltIG11YSBz4bqvbSBj4bunYSBraMOhY2ggaMOgbmcuICAgDQoNCiMgKipCw6BpIHThuq1wIHR14bqnbiAzOioqIFRo4buRbmcga8OqIG3DtCB04bqjIHbDoCBzdXkgZGnhu4VuIGNobyBjw6FjIGJp4bq/bg0KYGBge3J9DQojICpHxINuIGThu68gbGnhu4d1IEJpa2VTYWxlcyBjaG8gYmnhur9uIGJpa2UqDQpzaG9wIDwtIHJlYWRfZXhjZWwoIkQ6L1JTdHVkaW8vQ3VzdG9tZXJTaG9wcGluZy54bHN4Iiwgc2hlZXQgPTEpDQojICpH4bqvbiB0w6puIHZp4bq/dCB04bqvdCBjaG8gY8OhYyBiaeG6v24gxJHhu4MgZOG7hSB0aGFvIHTDoWMqDQpuYW1lcyhzaG9wKQ0KbmFtZXMoc2hvcCkgPC0gYygiREFURSIsICJJRCIsICJHRCIsICJBR0UiLCAiQ0FURSIsICJRVCIsICJQUkkiLCAiUEFZIiwgIkFSRUEiKQ0KaGVhZChzaG9wKQ0KYGBgDQogIA0KIyMgUGjDom4gdMOtY2ggIOG6o25oIGjGsOG7n25nIGPhu6dhIGJp4bq/biBDYXRlZ29neSB2w6AgYmnhur9uIEdlbmRlcg0KDQpgYGB7cn0NCiMgQuG6o25nIHThuqduIHPhu5ENCmNhdGUuZ2QgPC0gdGFibGUoc2hvcCRHRCxzaG9wJENBVEUpDQp0YWJsZShzaG9wJEdELHNob3AkQ0FURSkvMTAwMCoxMDANCmFkZG1hcmdpbnMoY2F0ZS5nZCkNCmBgYA0KDQpgYGB7cn0NCiMjICpIaeG7g24gdGjhu4sgdGhlbyBiaeG7g3UgxJHhu5MqDQpsaWJyYXJ5KGdncGxvdDIpDQpzaG9wIHw+IGdncGxvdChhZXMoeD0gQ0FURSx5PWFmdGVyX3N0YXQoY291bnQpKSkgKyBnZW9tX2JhcihmaWxsPSJvcmFuZ2UiKSArIGdlb21fdGV4dChhZXMobGFiZWwgPSBzY2FsZXM6OnBlcmNlbnQoYWZ0ZXJfc3RhdChjb3VudC9zdW0oY291bnQpKSkpLCBzdGF0ID0gImNvdW50IiwgY29sb3IgPSAiYnJvd24iLCB2anVzdCA9IC0gLjUpICsgZmFjZXRfZ3JpZCguIH5HRCkgKyBsYWJzKHggPSAiR2VuZGVyIix5ID0gIk51bWJlciBvZiBjdXN0b21lcnMiKQ0KYGBgDQoNCiAgROG7sWEgdGhlbyBr4bq/dCBxdeG6oyBi4bqjbmcgdGjDtG5nIGvDqiB2w6AgxJHhu5MgdGjhu4sgY+G7p2EgcGjhuqduIG3hu4FtIFIsIGNow7puZyB0YSB0aOG6pXkgc+G7kSBraMOhY2ggaMOgbmcgbuG7ryDEkeG6v24gdHJ1bmcgdMOibSBtdWEgc+G6r20gcXXhuqduIMOhbyBjaGnhur9tIHThu7cgbOG7hyBuaGnhu4F1IG5o4bqldCDEkeG6v24gMjAsNTglIHRyb25nIHThu5VuZyBz4buRIDYxMTcwIG5nxrDhu51pIHbDoCBjYW8gZ+G6pXAgMSw1IGzhuqduIG5ow7NtIGtow6FjaCBow6BuZyBuYW0gKDg0NjcgbmfGsOG7nWkpLiDEkOG7k25nIHRo4budaSB0YSBjw7MgdGjhu4MgdGjhuqV5IHZp4buHYyBtdWEgc+G6r20gY+G7p2Ega2jDoWNoIGjDoG5nIG5hbSB2w6Aga2jDoWNoIG7hu68gduG7gSBt4bu5IHBo4bqpbSB2w6AgdGjhu7FjIHBo4bqpbSwgbsaw4bubYyBjw7MgZ2EgY8OzIGNow6puaCBs4buHY2ggdMawxqFuZyDEkeG7kWkgw610IHbDoCBraMO0bmcgbmhp4buBdSwgdHJvbmcgxJHDsyBz4buRIGtow6FjaCBu4buvIMSR4bq/biBtdWEgbeG7uSBwaOG6qW0gKDU2MzIgbmfGsOG7nWkpIG5oaeG7gXUgZ+G6pXAgMSw1IGzhuqduIHNvIHbhu5tpIG5ow7NtIGtow6FjaCBuYW0gKDM3NzYgbmfGsOG7nWkpLiBUxrDGoW5nIHThu6UsIG5ow7NtIGtow6FjaCBuYW0gxJHhur9uIG11YSBjw6FjIHPhuqNuIHBo4bqpbSB0acOqdSBkw7luZyBraMOhYyBuaMawIGdpw6B5LCBzw6FjaCwuLiB0xrDGoW5nIMSR4buRaSDDrXQgc28gduG7m2kgc+G7kSBuZ8aw4budaSBu4buvICgyMSwwNyUpLg0KDQojIyBQaMOibiB0w61jaCAg4bqjbmggaMaw4bufbmcgY+G7p2EgYmnhur9uIFBheW1lbnQgdsOgIGJp4bq/biBHZW5kZXINCg0KYGBge3J9DQojIELhuqNuZyB04bqnbiBz4buRDQpwYXkuZ2QgPC0gdGFibGUoc2hvcCRHRCxzaG9wJFBBWSkNCnRhYmxlKHNob3AkR0Qsc2hvcCRQQVkpLzEwMDAqMTAwDQphZGRtYXJnaW5zKHBheS5nZCkNCmBgYA0KDQpgYGB7cn0NCiMjICpIaeG7g24gdGjhu4sgdGhlbyBiaeG7g3UgxJHhu5MqDQpsaWJyYXJ5KGdncGxvdDIpDQpzaG9wIHw+IGdncGxvdChhZXMoeD0gUEFZLHk9YWZ0ZXJfc3RhdChjb3VudCkpKSArIGdlb21fYmFyKGZpbGw9InB1cnBsZSIpICsgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IHNjYWxlczo6cGVyY2VudChhZnRlcl9zdGF0KGNvdW50L3N1bShjb3VudCkpKSksIHN0YXQgPSAiY291bnQiLCBjb2xvciA9ICJicm93biIsIHZqdXN0ID0gLSAuNSkgKyBmYWNldF9ncmlkKC4gfkdEKSArIGxhYnMoeCA9ICJHZW5kZXIiLHkgPSAiTnVtYmVyIG9mIGN1c3RvbWVycyIpDQpgYGANCg0KICBE4buxYSB0aGVvIGvhur90IHF14bqjIGLhuqNuZyB0aMO0bmcga8OqIHbDoCDEkeG7kyB0aOG7iyBj4bunYSBwaOG6p24gbeG7gW0gUiwgY2jDum5nIHRhIHRo4bqleSB4dSBoxrDhu5tuZyBtdWEgc+G6r20gaMOgbmcgaG/DoSB0aGFuaCB0b8OhbiBi4bqxbmcgdGnhu4FuIG3hurd0IOG7nyBj4bqjIG5hbSB2w6AgbuG7ryDEkeG7gXUgY2hp4bq/bSB04bu3IGzhu4cgcuG6pXQgY2FvIHRyb25nIHThu5VuZyBz4buRIGzhuqduIGzGsOG7o3QgbMOgIDE4JSB2w6AgMjYsOCUuIFRyb25nIMSRw7MsIHZp4buHYyBtdWEgc+G6r20gYuG6sW5nIHRp4buBbiBt4bq3dCDhu58gbuG7ryBuaGnhu4F1IGfhuqVwIDEsMyBs4bqnbiBzbyB24bubaSB2aeG6uWMgdGhhbmggdG/DoW4gYuG6sW5nIHRo4bq7IHTDrW4gZOG7pW5nIHbDoCBn4bqlcCDEkeG6v24gMiwzIGzhuqduIHNvIHbhu5tpIHRoYW5oIHRvw6FuIGLhurFuZyB0aOG6uyBnaGkgbuG7oy4gVMawxqFuZyB04buxIOG7nyBuaMOzbSBuYW0gZ2nhu5tpIHRoYW5oIHRvw6FuIGLhurFuZyB0aOG6uyB0w61uIGThu6VuZyAoODYwNyBuZ8aw4budaSkgY8OzIHThu7cgbOG7hyAxNCwxJSwgw610IGjGoW4gdmnhu4djIHRoYW5oIHRvw6FuIGLhurFuZyB0aeG7gW4gbeG6t3QgKDExMDMzIG5nxrDhu51pKSB2w6Agbmhp4buBdSBoxqFuIHPhu5Ega2jDoWNoIG5hbSBtdWEgc+G6r20gYuG6sW5nIHRo4bq7IGdoaSBu4bujICg0OTc3IG5nxrDhu51pKS4NCg0KIyMgVGjhu5FuZyBrw6ogbcO0IHThuqMgY2hvIGhhaSBiaeG6v24gQVJFQSB2w6AgYmnhur9uIFBBWU1FTlQNCiMjIyBC4bqjbmcgdOG6p24gc+G7kSB2w6AgYmnhu4N1IMSR4buTIGvhur90IGjhu6NwIA0KDQpgYGB7cn0NCiMxLlRo4buRbmcga8OqIG3DtCB04bqjIGNobyAyIGJp4bq/biBnaeG7m2kgdMOtbmggdsOgIGJp4bq/biB0w6xuaCB0cuG6oW5nIHPhu58gaOG7r3UgbmjDoCBj4bunYSBuaOG7r25nIGtow6FjaCBow6BuZyDEkeG6v24gbXVhIHhlIMSR4bqhcC4gDQpwYS5hciA8LSB0YWJsZShzaG9wJFBBWSwgc2hvcCRBUkVBKQ0KYWRkbWFyZ2lucyhwYS5hcikNCmBgYA0KDQpgYGB7cn0NCiMjICpIaeG7g24gdGjhu4sgdGhlbyBiaeG7g3UgxJHhu5MqDQpzaG9wfD4gZ2dwbG90KGFlcyh4PSBQQVkseT1hZnRlcl9zdGF0KGNvdW50KSkpICsgZ2VvbV9iYXIoZmlsbD0ibGlnaHRibHVlIikgKyBnZW9tX3RleHQoYWVzKGxhYmVsID0gc2NhbGVzOjpwZXJjZW50KGFmdGVyX3N0YXQoY291bnQvc3VtKGNvdW50KSkpKSwgc3RhdCA9ICJjb3VudCIsIGNvbG9yID0gImJyb3duIiwgdmp1c3QgPSAtIC41KSArIGZhY2V0X2dyaWQoLiB+QVJFQSkgKyBsYWJzKHggPSAiQVJFQSIseSA9ICJOdW1iZXIgb2YgY3VzdG9tZXJzIikNCg0KYGBgDQpUaGVvIGvhur90IHF14bqjIHTDrW5oIHRvw6FuIHbDoCDEkeG7kyB0aOG7iyBj4bunYSBwaOG6p24gbeG7gW0gUiwgY2jDum5nIHRhIHRo4bqleSB4dSBoxrDhu5tuZyBraMOhY2ggaMOgbmcgxJHhur9uIGPDoWMgdHJ1bmcgdMOibSB0aMawxqFuZyBt4bqhaSBtdWEgc+G6r20gYuG6sW5nIHRp4buBbiBt4bq3dCBjaGnhur9tIHThu7cgbOG7hyB0xrDGoW5nIMSR4buRaSBjYW8sIHRyb25nIMSRw7MgbmjDs20ga2jDoWNoIGjDoG5nIHThuqFpIHRydW5nIHTDom0gSW5zdGFidWwgY2hp4bq/bSA5LDAxOSUsIHThuqFpIEthbnlvbiBjaGnhur9tIDgsOTI0JSB2w6Ag4bufIGPDoWMga2h1IHbhu7FjIG11YSBz4bqvbSBraMOhYyBjaGnhur9tIMSR4bq/biAyNiw4ODYlLiBUxrDGoW5nIHThu7EgdGEgY8OzIHRo4buDIHRo4bqleSB2aeG7h2MgbXVhIHPhuq9tIHRoYW5oIHRvw6FuIGLhurFuZyB0aOG6uyB0w61uIGThu6VuZyB2w6AgdGjhursgZ2hpIG7hu6MgdOG6oWkgSW5zdGFidWwgdsOgIEthbnlvbiBraMO0bmcgY8OzIHPhu7EgY2jDqm5oIGzhu4djaCBxdcOhIG5oaeG7gXUsIHTGsMahbmcgxJHhu5FpIMOtdCBs4bqnbiBsxrDhu6N0IGzDoCA3LDA5NSUgdsOgIDYsOTgxJS4gDQoNCiMjIFBow6JuIHTDrWNoICDhuqNuaCBoxrDhu59uZyBj4bunYSBiaeG6v24gQWdlIHbDoCBiaeG6v24gUGF5bWVudA0KIyMjIE3DoyBob8OhIGJp4bq/biBBZ2UgKMSQ4buZIHR14buVaSkgdOG7qyDEkeG7i25oIGzGsOG7o25nIHNhbmcgxJHhu4tuaCB0w61uaA0KDQpW4bubaSBk4buvIGxp4buHdSBn4buRYywgYmnhur9uIEFHRSAoxJDhu5kgdHXhu5VpKSBsw6AgYmnhur9uIMSR4buLbmggbMaw4bujbmcgbmjhuq1uIGPDoWMgZ2nDoSB0cuG7iyB04burIDE4IHR14buVaSDEkeG6v24gNjkgdHXhu5VpLiBE4buxYSB2w6BvIHBo4bqnbiBt4buBbSBwaMOibiB0w61jaCBSLCB0w7RpIHPhur0gdGjhu7FjIGhp4buHbiBtw6MgaG/DoSBjaGlhIGThu68gbGnDqnUgdGjDoG5oIDMga2hv4bqjbmcgduG7m2kgxJHhu5kgdHXhu5VpIHRoYW5oIHRoaeG6v3UgbmnDqm4gdGjhuqVwIHThu6sgMTggdHXhu5VpIMSR4bq/biAzNSB0deG7lWksIMSR4buZIHR14buVaSB0cnVuZyBuacOqbiB0cnVuZyBiw6xuaCBu4bqxbSB0cm9uZyBraG/huqNuZyB04burIDM1IHR14buVaSDEkeG6v24gNTAgdHXhu5VpIHbDoCBuaMOzbSBraMOhY2ggaMOgbmcgY2FvIHR14buVaSB04burIDUwIHR14buVaSB0cuG7nyBsw6puLkvhur90IHF14bqjIHRodSDEkcaw4bujYyBjw7MgMjExNzkga2jDoWNoIHRoYW5oIHRoaeG6v3UgbmnDqm4sIDE3ODE0IG5nxrDhu51pIHRydW5nIG5pw6puIHbDoCBjw7JuIGzhuqFpIDIyMTc3IGtow6FjaCBow6BuZyBjYW8gdHXhu5VpIMSR4bq/biBtdWEgeGUgxJHhuqFwIHThuqFpIGPhu61hIGjDoG5nLiANCg0KYGBge3J9DQpkZjwtIGN1dCh4ID0gc2hvcCRBR0UsDQogICAgYnJlYWtzID0gYygtSW5mLCAzNSwgNTAsIEluZiksICMgTOG6pXkga2hv4bqjbmcgZOG7ryBsaeG7h3UgdOG7qyAzMDAwMC0xMDAwMDANCiAgICBsYWJlbHMgPSBjKCJMb3dlciIsICJBdmVyYWdlIiwgIkhpZ2giKSwgIyBDw6FjIG3hu6ljIHR14buVaQ0KICAgIHJpZ2h0ID0gVFJVRSkgIyBDaG8gcGjDqXAgbOG6pXkga2hv4bqjbmcgxJHDs25nIGLDqm4gcGjhuqNpDQp0YWJsZShkZikNCmBgYA0KDQojIyMgQuG6o25nIHThuqduIHPhu5EgdsOgIGJp4buDdSDEkeG7kyBr4bq/dCBo4bujcA0KDQpgYGB7cn0NCiNM4bqtcCBi4bqjbmcgdOG6p24gc+G7kSBnaeG7r2EgYmnhur9uIEFnZSAoxJDhu5kgdHXhu5VpKSB2w6AgYmnhur9uIFBheW1lbnQgKFBoxrDGoW5nIHRo4bupYyB0aGFuaCB0b8OhbikgdOG7m2kgdGjDs2kgcXVlbiBtdWEgc+G6r206DQpwYXkuc2V4IDwtIHRhYmxlKHNob3AkUEFZLGRmKQ0KYWRkbWFyZ2lucyhwYXkuc2V4KQ0KYGBgDQoNCmBgYHtyfQ0KIyMgKkhp4buDbiB0aOG7iyB0aGVvIGJp4buDdSDEkeG7kyoNCmxpYnJhcnkoZ2dwbG90MikNCmJhcnBsb3QocGF5LnNleCwgYmVzaWRlID0gVFJVRSwgeGxhYiA9ICJBZ2UgUmFuZ2UiLG1haW4gPSAiTnVtYmVyIG9mIFBheW1lbnQgaW4gZWFjaCBBZ2UgZ3JvdXAiKQ0Kc2hvcCB8PiBnZ3Bsb3QoYWVzKHg9IGRmLHk9YWZ0ZXJfc3RhdChjb3VudCkpKSArIGdlb21fYmFyKGZpbGw9ImJyb3duIikgKyBnZW9tX3RleHQoYWVzKGxhYmVsID0gc2NhbGVzOjpwZXJjZW50KGFmdGVyX3N0YXQoY291bnQvc3VtKGNvdW50KSkpKSwgc3RhdCA9ICJjb3VudCIsIGNvbG9yID0gImJsdWUiLCB2anVzdCA9IC0gLjUpICsgZmFjZXRfZ3JpZCguIH5QQVkpICsgbGFicyh4ID0gIlBheW1lbnQiLHkgPSAiTnVtYmVyIG9mIGN1c3RvbWVycyIpDQoNCmBgYA0KDQpE4buxYSB0aGVvIGvhur90IHF14bqjIGLhuqNuZyB0aMO0bmcga8OqIHbDoCDEkeG7kyB0aOG7iyBj4bunYSBwaOG6p24gbeG7gW0gUiwgY2jDum5nIHRhIHRo4bqleSBuaMOzbSBraMOhY2ggaMOgbmcgbXVhIHPhuq9tIHRoYW5oIHRvw6FuIGLhurFuZyB0aeG7gW4gbeG6t3QgKDI3NDIyIG5nxrDhu51pKSBjYW8gZ+G6pXAgMSwzIGzhuqduIHNvIHbhu5tpIG5ow7NtIGtow6FjaCB0aGFuaCB0b8OhbiBi4bqxbmcgdGjhursgdMOtbiBk4bulbmcgdsOgIGfhuqVwIDIsMiBs4bqnbiBz4buRIGtow6FjaCB0aGFuaCB0b8OhbiBi4bqxbmcgdGjhursgZ2hpIG7hu6MsIHRyb25nIMSRw7MgbmjDs20ga2jDoWNoIGNhbyB0deG7lWkgdOG7qyA1MCB0deG7lWkgdHLhu58gbMOqbiBtdWEgc+G6r20gYuG6sW5nIHRp4buBbiBt4bq3dCAoOTk5MSBuZ8aw4budaSkgY2hp4bq/bSB04bu3IGzhu4cgY2FvIG5o4bqldCDEkeG6v24gMTYsMzMlIHbDoCBuaGnhu4F1IGfhuqVwIDEsNiBs4bqnbiBuaMOzbSBraMOhY2ggaMOgbmcg4bufIMSR4buZIHR14buVaSBuw6B5IHRoYW5oIHRvw6FuIGLhurFuZyB0aOG6uyB0w61uIGThu6VuZyAoNzcyNSBuZ8aw4budaSksIGfhuqVwIMSR4bq/biAyLDggbOG6p24gdGhhbmggdG/DoW4gYuG6sW5nIHRo4bq7IGdoaSBu4bujICg0NDYxIG5nxrDhu51pKS4gDQoNCg0KIyMgUGjDom4gdMOtY2gg4bqjbmggaMaw4bufbmcgY+G7p2EgYmnhur9uIEFnZSB2w6AgYmnhur9uIEdlbmRlcg0KDQpgYGB7cn0NCiMgQuG6o25nIHThuqduIHPhu5ENCmdkLmFnIDwtIHRhYmxlKHNob3AkR0QsIGRmKQ0KYWRkbWFyZ2lucyhnZC5hZykNCmBgYA0KYGBge3J9DQojIyAqSGnhu4NuIHRo4buLIHRoZW8gYmnhu4N1IMSR4buTKg0KbGlicmFyeShnZ3Bsb3QyKQ0KYmFycGxvdChnZC5hZywgYmVzaWRlID0gVFJVRSwgeGxhYiA9ICJBZ2UgUmFuZ2UiLG1haW4gPSAiTnVtYmVyIG9mIE1hbGVzIGFuZCBGZW1hbGVzIGluIGVhY2ggQWdlIGdyb3VwIikNCnNob3AgfD4gZ2dwbG90KGFlcyh4PSBkZix5PWFmdGVyX3N0YXQoY291bnQpKSkgKyBnZW9tX2JhcihmaWxsPSJicm93biIpICsgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IHNjYWxlczo6cGVyY2VudChhZnRlcl9zdGF0KGNvdW50L3N1bShjb3VudCkpKSksIHN0YXQgPSAiY291bnQiLCBjb2xvciA9ICJibHVlIiwgdmp1c3QgPSAtIC41KSArIGZhY2V0X2dyaWQoLiB+R0QpICsgbGFicyh4ID0gIkdlbmRlciIseSA9ICJOdW1iZXIgb2YgY3VzdG9tZXJzIikNCg0KYGBgDQoNClRoZW8ga+G6v3QgcXXhuqMgcGjDom4gdMOtY2ggdsOgIMSR4buTIHRo4buLIGNow7puZyB0YSB0aOG6pXkgxJHGsOG7o2MgeHUgaMaw4bubbmcga2jDoWNoIGjDoG5nIMSR4bq/biBtdWEgc+G6r20gdOG6oWkgY8OhYyB0cnVuZyB0w6JtIHRoxrDGoW5nIG3huqFpIG5oaeG7gXUgaMahbiBzbyB24bubaSBuYW0gZ2nhu5tpLCB0cm9uZyDEkcOzIG5ow7NtIGtow6FjaCBow6BuZyBu4buvIGNhbyB0deG7lWkgdOG7qyA1MCB0deG7lWkgdHLhu58gbMOqbiAoMTMyNzMgbmfGsOG7nWkpIMSR4bq/biBtdWEgc+G6r20gY2FvIGfhuqVwIDEsNSBs4bqnbiBzbyB24bubaSBuaMOzbSBraMOhY2ggbmFtICg4OTA0IG5nxrDhu51pKSDhu58gxJHhu5kgdHXhu5VpIG7DoHkuIMSQ4buTbmcgdGjhu51pIHRhIGPDsyB0aOG7gyB0aOG6pXkgc+G7kSBraMOhY2ggaMOgbmcgbmFtIHThu6sgMzUgdHXhu5VpIHRy4bufIHh14buRbmcgKDE0LDEwJSkgxJHhur9uIHRydW5nIHTDom0gbXVhIHPhuq9tIGNoaeG6v20gdOG7tyBs4buHIHRo4bqlcCBoxqFuIG5oaeG7gXUgc28gduG7m2kgbmjDs20ga2jDoWNoIGjDoG5nIG7hu68gKDIwLDUzJSkg4bufIMSR4buZIHR14buVaSBuw6B5LiBUxrDGoW5nIHThu7EgduG7m2kgbmjDs20ga2jDoWNoIGjDoG5nIG7hu68gdHJ1bmcgbmnDqm4gbsSDbSB0cm9uZyBraG/huqNuZyB04burIDM1IHR14buVaSDEkeG6v24gNTAgdHXhu5VpIMSR4bq/biBtdWEgc+G6r20gY2FvIGjGoW4gcuG6pXQgbmhp4buBdSBzbyBz4buRIGtow6FjaCBow6BuZyBuYW0gdHJvbmcgxJHhu5kgdHXhu5VpIG7DoHksIGNoaeG6v20gdOG7tywgY2hp4bq/bSB04bu3IGzhu4cgbOG6p24gbMaw4bujdCBsw6AgMTcsNTMlIHbDoCAxMSw1OSUuDQoNCiMjIFRo4buRbmcga8OqIG3DtCB04bqjIGNobyBoYWkgYmnhur9uIEdlbmRlciB2w6AgYmnhur9uIFByaWNlDQojIyMgTcOjIGhvw6EgYmnhur9uIFByaWNlIChHacOhIHPhuqNuIHBo4bqpbSkgdOG7qyDEkeG7i25oIGzGsOG7o25nIHNhbmcgxJHhu4tuaCB0w61uaA0KDQpW4bubaSBk4buvIGxp4buHdSBn4buRYywgYmnhur9uIFByaWNlIChHacOhIHPhuqNuIHBo4bqpbSkgbMOgIGJp4bq/biDEkeG7i25oIGzGsOG7o25nIG5o4bqtbiBjw6FjIGdpw6EgdHLhu4sgdOG7qyA1LDIzIFRSWSDEkeG6v24gNTI1MCBUUlkuLiBE4buxYSB2w6BvIHBo4bqnbiBt4buBbSBwaMOibiB0w61jaCBSLCB0w7RpIHPhur0gdGjhu7FjIGhp4buHbiBtw6MgaG/DoSBjaGlhIGThu68gbGnDqnUgdGjDoG5oIDIga2hv4bqjbmcgduG7m2kgbeG7qWMgZ2nDoSB0cnVuZyBiw6xuaCB04burIDcwMCBUUlkgdHLhu58geHXhu5FuZyB2w6AgbeG7qWMgZ2nDoSBjYW8gY+G7p2Egc+G6o24gcGjhuqltIHThu6sgNzAwIFRSWSB0cuG7nyBsw6puLiBL4bq/dCBxdeG6oyB0aHUgxJHGsOG7o2MgY8OzIDQwNTMwIHPhuqNuIHBo4bqpbSDEkcOjIMSRxrDhu6NjIGLDoW4gduG7m2kgbeG7qWMgZ2nDoSB0cnVuZyBiw6xuaCB2w6AgMjA2NDAgxJHGsOG7o2MgYsOhbiB24bubaSBt4bupYyBnacOhIGNhby4NCg0KYGBge3J9DQpkZjE8LSBjdXQoeCA9IHNob3AkUFJJLA0KICAgIGJyZWFrcyA9IGMoLUluZiwgNzAwLCBJbmYpLCAjIEzhuqV5IGtob+G6o25nIGThu68gbGnhu4d1IA0KICAgIGxhYmVscyA9IGMoIkF2ZXJhZ2UiLCAiSGlnaCIpLCAjIEPDoWMgbeG7qWMgZ2nDoQ0KICAgIHJpZ2h0ID0gVFJVRSkgIyBDaG8gcGjDqXAgbOG6pXkga2hv4bqjbmcgxJHDs25nIGLDqm4gcGjhuqNpDQp0YWJsZShkZjEpDQpgYGANCiMjIyBC4bqjbmcgdOG6p24gc+G7kSB2w6AgYmnhu4N1IMSR4buTIGvhur90IGjhu6NwDQpgYGB7cn0NCiMxLlRo4buRbmcga8OqIG3DtCB04bqjIGNobyAyIGJp4bq/biBnaeG7m2kgdMOtbmggdsOgIGJp4bq/biB0w6xuaCB0cuG6oW5nIHPhu58gaOG7r3UgbmjDoCBj4bunYSBuaOG7r25nIGtow6FjaCBow6BuZyDEkeG6v24gbXVhIHhlIMSR4bqhcC4gDQpnZC5wcjwtIHRhYmxlKHNob3AkR0QsIGRmMSkNCmFkZG1hcmdpbnMoZ2QucHIpDQpgYGANCmBgYHtyfQ0KIyMgKkhp4buDbiB0aOG7iyB0aGVvIGJp4buDdSDEkeG7kyoNCnNob3B8PiBnZ3Bsb3QoYWVzKHg9IGRmMSx5PWFmdGVyX3N0YXQoY291bnQpKSkgKyBnZW9tX2JhcihmaWxsPSJsaWdodGJsdWUiKSArIGdlb21fdGV4dChhZXMobGFiZWwgPSBzY2FsZXM6OnBlcmNlbnQoYWZ0ZXJfc3RhdChjb3VudC9zdW0oY291bnQpKSkpLCBzdGF0ID0gImNvdW50IiwgY29sb3IgPSAiYnJvd24iLCB2anVzdCA9IC0gLjUpICsgZmFjZXRfZ3JpZCguIH5HRCkgKyBsYWJzKHggPSAiR2VuZGVyIix5ID0gIk51bWJlciBvZiBjdXN0b21lcnMiKQ0KDQpgYGANCg0KVGhlbyBr4bq/dCBxdeG6oyB0w61uaCB0b8OhbiB2w6AgxJHhu5MgdGjhu4sgY+G7p2EgcGjhuqduIG3hu4FtIFIsIGNow7puZyB0YSB0aOG6pXkgeHUgaMaw4bubbmcga2jDoWNoIGjDoG5nIG7hu68gbXVhIGPDoWMgc+G6o24gcGjhuqltIGPDsyBt4bupYyBnacOhIHRydW5nIGLDrG5oIHThu6sgNzAwIFRSWSB0cuG7nyB4deG7kW5nIGNoaeG6v20gdOG7tyBs4buHIHLhuqV0IGNhbyDEkeG6v24gMzksNyUgdHJvbmcgdOG7kW5nIHPhu5EgNjExNzAgbmfGsOG7nWkgdsOgIGfhuqVwIDIgbOG6p24gbmjDs20ga2jDoWNoIG5hbSBnaeG7m2kgKDI2LDYmKS4gVMawxqFuZyB04buxIMSR4buRaSB24bubaSBjw6FjIHPhuqNuIHBo4bqpbSBjw7MgbeG7qWMgZ2nDoSBjYW8sIHPhu5Ega2jDoWNoIG5hbSAoODM2NSBuZ8aw4budaSkgbXVhIMOtdCBoxqFuIG5ow7NtIGtow6FjaCBow6BuZyBu4buvICgxMjI3NSBuZ8aw4budaSksw610IGfhuqVwIDEsNSBs4bqnbi4NCg0KIyMjIFLhu6dpIHJvIHTGsMahbmcgxJHhu5FpIChSZWxhdGl2ZSBSaXNrKQ0KDQpgYGB7cn0NCmxpYnJhcnkoZXBpdG9vbHMpDQpyaXNrcmF0aW8oZ2QucHIpDQpgYGANCiAgVGjDtG5nIHF1YSBr4bq/dCBxdeG6oyBwaMOibiB0w61jaCBj4bunYSBwaOG6p24gbeG7gW0gUiBjaG8gdGjhuqV5IHbhu5tpIMSR4buZIHRpbiBj4bqteSA5NSUsIHjDoWMgc3XhuqV0IHPhu5Ega2jDoWNoIG5hbSDEkeG6v24gbXVhIHPhuqNuIHBo4bqpbSBjw7MgbeG7qWMgZ2nDoSBjYW8gY2hp4bq/bSB04bu3IGzhu4cgZ+G6pXAgMSwwMTIgbOG6p24gc28gduG7m2kga2jDoWNoIG7hu68gxJHhur9uIG11YSBuaOG7r25nIHPhuqNuIHBo4bqpbSB04burIDcwMCBUUlkuLlThu6sgxJHDsyBjaG8gdGjhuqV5IGfhuqduIG5oxrAga2jDtG5nIGPDsyBz4buxIGNow6puaCBs4buHY2ggbmhp4buBdSBnaeG7r2Egdmnhu4djIGtow6FjaCBuYW0gaGF5IG7hu68gdHJvbmcgdmnhu4djIG11YSBuaOG7r25nIHPhuqNuIHBo4bqpbSBjYW8gZ2nDoS4NCg0KIyMjIFThu7cgbOG7hyBjaMOqbmggKE9kZCBSYXRpbykNCg0KYGBge3J9DQpvZGRzcmF0aW8oZ2QucHIpDQpgYGANCiAgROG7sWEgdsOgbyBr4bq/dCBxdeG6oyBwaMOibiB0w61jaCBj4bunYSBwaOG6p24gbeG7gW0gUiBjaG8gdGjhuqV5IHbhu5tpIMSR4buZIHRpbiBj4bqteSA5NSUsIHZp4buHYyDEkcOjIHPhu58gaOG7r3UgbmjDoCBj4bunYSBraMOhY2ggaMOgbmcgbmFtIHbDoCBraMOhY2ggaMOgbmcgbuG7ryDEkeG6v24gxJHhu4MgbXVhIHhlIMSR4bqhcCBsw6AgZ+G6p24gbmjGsCBuaGF1LCBjaMOqbmggbOG7h2NoIGfhuqVwIDEsMDE4IGzhuqduLg0KICANCiMjIyBLaeG7g20gxJHhu4tuaCB0w61uaCDEkeG7mWMgbOG6rXANCg0KKktp4buDbSDEkeG7i25oIGNoaSBiw6xuaCBwaMawxqFuZyAoQ2hpLVNxdWFyZSkgY2hvIGhhaSBiaeG6v24gZ2nhu5tpIHTDrG5oIHbDoCBnacOhIHPhuqNuIHBo4bqpbS4qDQoNCsSQ4bq3dCBnaeG6oyB0aHV54bq/dDogDQoNCkhvOiBCaeG6v24gZ2nhu5tpIHTDrW5oIHbDoCBiaeG6v24gZ2nDoSBz4bqjbiBwaOG6qW0gbMOgIMSR4buZYyBs4bqtcA0KDQpIMTogQmnhur9uIGdp4bubaSB0w61uaCB2w6AgYmnhur9uIGdpw6Egc+G6o24gcGjhuqltIGtow7RuZyDEkeG7mWMgbOG6rVANCg0KYGBge3J9DQpjaGlzcS50ZXN0KGdkLnByKQ0KYGBgDQpW4bubaSBwX3ZhbHVlID0gMCwzMSA+IDUlIHbhuq15IHRhIGLDoWMgYuG7jyBIbyB04bqhaSBt4bupYyDDvSBuZ2jEqWEgNSUuIEvhur90IHF14bqjIG7DoHkgY2hvIGNow7puZyB0YSB0aOG6pXkgcuG6sW5nOiBDaMawYSDEkeG7pyBjxqEgc+G7nyDEkeG7gyBuw7NpIHLhurFuZyBnaeG7m2kgdMOtbmgga2jDoWNoIGjDoG5nIGPDsyBsacOqbiBxdWFuIHThu5tpIHZp4buHYyBjaOG7jW4gc+G6o24gcGjhuqltIGPDsyBnacOhIG5oxrAgdGjhur8gbsOgby4NCg0KIyMgS2hv4bqjbmcgxrDhu5tjIGzGsOG7o25nIGNobyB04bu3IGzhu4cNCg0KKioxLiDGr+G7m2MgbMaw4bujbmcgdOG7tyBs4buHIGtow6FjaCBow6BuZyBtdWEgbmhp4buBdSBoxqFuIDMgc+G6o24gcGjhuqltIHThuqFpIGPDoWMgdHJ1bmcgdMOibSB0aMawxqFuZyBt4bqhaSBraMOhYyBuaGF1LCDEkeG7k25nIHRo4budaSBraeG7g20gxJHhu4tuaCB4ZW0gdOG7tyBs4buHICglKSBraMOhY2ggaMOgbmcgbXVhIG5oaeG7gXUgaMahbiAzIHPhuqNuIHBo4bqpbSBjw7MgcGjhuqNpIGzDoCA2NSUga2jDtG5nID8qKg0KDQphLsSQ4bq3dCBnaeG6oyB0aHV54bq/dDogDQoNCkhvOiBwID0gMC42NQ0KDQpIMTogcCAjIDAuNjUNCg0KYGBge3J9DQppbmMgPC0gc2hvcFtzaG9wJFFUID4gMyxdDQpwcm9wLnRlc3QobGVuZ3RoKGluYyRRVCksIGxlbmd0aChzaG9wJFFUKSwgcCA9IDAuNjUpDQpgYGANCg0KICBUcm9uZyBr4bq/dCBxdeG6oyBwaOG6p24gbeG7gW0gUiwgcHJvcC50ZXN0IMaw4bubYyB0w61uaCB04buJIGzhu4cga2jDoWNoIGjDoG5nIG11YSBuaGnhu4F1IGjGoW4gMyBz4bqjbiBwaOG6qW0gbMOgIDAuMzk5MyAodOG7qWMgMzksOTMlKSB24bqteSB0YSBiw6FjIGLhu48gSG8gdsOgIHbhu5tpIGtob+G6o25nIHRpbiBj4bqteSA5NSUgbMOgIDAsMzk1NSDEkeG6v24gMCw0MDMyLiBHacOhIHRy4buLIGtoaSBjaGkgYsOsbmggcGjGsMahbmcgbMOgIDE2LDg5MjsgduG7m2kgdHLhu4sgc+G7kSBwIDwgMi4yZS0xNi4gTmjGsCB24bqteSwgbmdoacOqbiBj4bupdSBuw6B5IGNobyB0aOG6pXkgdOG7tyBs4buHIGtow6FjaCBow6BuZyBtdWEgbmhp4buBdSBoxqFuIDMgc+G6o24gcGjhuqltIHThuqFpIGPDoWMgdHJ1bmcgdMOibSB0aMawxqFuZyBt4bqhaSBraMOhYyBuaGF1IHRo4bqlcCBoxqFuIDY1JS4NCg0KKipUaOG7sWMgaGnhu4duIGLDoGkgdG/DoW4ga2nhu4NtIMSR4buLbmggZ2nhuqMgdGh1eeG6v3Qgc+G7sSBi4bqxbmcgbmhhdSB24buBIHThu7cgbOG7hyBraMOhY2gga2jDoWNoIGjDoG5nIG11YSBuaGnhu4F1IGjGoW4gMyBz4bqjbiBwaOG6qW0gY+G7p2EgMiB04buVbmcgdGjhu4MgZ2nhu5tpIHTDrW5oIChuYW0gdsOgIG7hu68pOioqDQoNCsSQ4bq3dCBnaeG6oyB0aHV54bq/dA0KDQpIbzogcDEgPSBwMg0KDQpIMTogcDEgIyBwMg0KYGBge3J9DQppY20gPC0gc2hvcFtzaG9wJEdEID09Ik0iLF0NCmljZiA8LSBzaG9wW3Nob3AkR0QgPT0iRiIsXQ0KDQppY20zIDwtIGljbVtpY20kUVQgPiAzLF0NCmljZjMgPC0gaWNmW2ljZiRRVCA+IDMsXQ0KDQphIDwtIGMobnJvdyhpY20pLCBucm93KGljZikpDQpiIDwtIGMobnJvdyhpY20zKSwgbnJvdyhpY2YzKSkNCg0KcHJvcC50ZXN0KGIsYSkNCmBgYA0KICBUcm9uZyBr4bq/dCBxdeG6oyBraeG7g20gxJHhu4tuaCB0csOqbiwgcHJvcC50ZXN0IMaw4bubYyB0w61uaCB04bu3IGzhu4cga2jDoWNoIG5hbSBnaeG7m2kgbXVhIG5oaeG7gXUgaMahbiAzIHPhuqNuIHBo4bqpbSBsw6AgMCwzOTU1IHbDoCDGsOG7m2MgdMOtbmggdOG7iSBs4buHIGtow6FjaCBu4buvIGdp4bubaSBtdWEgdHLDqm4gMyBz4bqjbiBwaOG6qW0gbMOgIDAsNDAxOS4gVuG6rXkgdGEgYsOhYyBi4buPIEhvIHbhu5tpIMSR4buZIHRpbiBj4bqteSA5NSUuIMSQ4buTbmcgdGjhu51pIHBow6JuIHTDrWNoIGPDsm4gY2hvIHRo4bqleSB24bubaSBt4bupYyDDvSBuZ2jEqWEgNSUsIHThu7cgbOG7hyBuYW0gZ2nhu5tpIG11YSBuaGnhu4F1IGjGoW4gMyBz4bqjbiBwaOG6qW0gY2FvIGjGoW4gMTEsMjglLg0KICANCioqMi7Gr+G7m2MgbMaw4bujbmcgdOG7tyBs4buHIGtow6FjaCBow6BuZyBtdWEgY8OhYyBz4bqjbiBwaOG6qW0gY8OzIG3hu6ljIGdpw6EgdOG7qyAzMDAgVFJZIHRy4bufIHh14buRbmcsIMSR4buTbmcgdGjhu51pIGtp4buDbSDEkeG7i25oIHhlbSB04bu3IGzhu4cgKCUpIGtow6FjaCBow6BuZyBraMOhY2ggaMOgbmcgbXVhIG5o4buvbmcgc+G6o24gcGjhuqltIGPDsyBnacOhIMOtdCBoxqFuIDMwMCBUUlkgY8OzIHBo4bqjaSBsw6AgMzAlIGtow7RuZyA/KioNCg0KYS7EkOG6t3QgZ2nhuqMgdGh1eeG6v3Q6IA0KDQpIbzogcCA9IDAuMw0KDQpIMTogcCAjIDAuMw0KDQpgYGB7cn0NCnByZyA8LSBzaG9wW3Nob3AkUFJJIDwgMzAwLF0NCnByb3AudGVzdChsZW5ndGgocHJnJFBSSSksIGxlbmd0aChzaG9wJFBSSSksIHAgPSAwLjMpDQpgYGANCg0KICBUcm9uZyBr4bq/dCBxdeG6oyBwaOG6p24gbeG7gW0gUiwgcHJvcC50ZXN0IMaw4bubYyB0w61uaCB04buJIGzhu4cga2jDoWNoIGjDoG5nICBtdWEgY8OhYyBz4bqjbiBwaOG6qW0gY8OzIG3hu6ljIGdpw6EgMzAwIFRSWSB0cuG7nyB4deG7kW5nIGzDoCAwLDUwNTYgKHThu6ljIDUwLDU2JSkgduG6rXkgdGEgYsOhYyBi4buPIEhvIHbDoCB24bubaSBraG/huqNuZyB0aW4gY+G6rXkgOTUlIGzDoCAwLDUwMTYgxJHhur9uIDAsNTA5Ni4gR2nDoSB0cuG7iyBraGkgY2hpIGLDrG5oIHBoxrDGoW5nIGzDoCAxMiwzMTE7IHbhu5tpIHRy4buLIHPhu5EgcCA8IDIuMmUtMTYuIE5oxrAgduG6rXksIG5naGnDqm4gY+G7qXUgbsOgeSBjaG8gdGjhuqV5IHThu7cgbOG7hyBraMOhY2ggaMOgbmcgbXVhIG5o4buvbmcgc+G6o24gcGjhuqltIGPDsyBnacOhIMOtdCBoxqFuIDMwMCBUUlkgdOG6oWkgY8OhYyB0cnVuZyB0w6JtIHRoxrDGoW5nIG3huqFpIGtow6FjIG5oYXUgY2FvIGjGoW4gMzAlLg0KDQoqKlRo4buxYyBoaeG7h24gYsOgaSB0b8OhbiBraeG7g20gxJHhu4tuaCBnaeG6oyB0aHV54bq/dCBz4buxIGLhurFuZyBuaGF1IHbhu4EgdOG7tyBs4buHIGtow6FjaCBraMOhY2ggaMOgbmcgdOG7tyBs4buHIGtow6FjaCBow6BuZyBtdWEgY8OhYyBz4bqjbiBwaOG6qW0gY8OzIG3hu6ljIGdpw6EgdOG7qyAzMDAgVFJZIHRy4bufIHh14buRbmcgY+G7p2EgMiB04buVbmcgdGjhu4MgZ2nhu5tpIHTDrW5oIChuYW0gdsOgIG7hu68pOioqDQoNCsSQ4bq3dCBnaeG6oyB0aHV54bq/dA0KDQpIbzogcDEgPSBwMg0KDQpIMTogcDEgIyBwMg0KYGBge3J9DQpwcmdtIDwtIHNob3Bbc2hvcCRHRCA9PSAnTScsXQ0KcHJnZiA8LSBzaG9wW3Nob3AkR0QgPT0gJ0YnLF0NCg0KcHJnbTMgPC0gcHJnbVtwcmdtJFBSSSA8IDMwMCxdDQpwcmdmMyA8LSBwcmdmW3ByZ2YkUFJJIDwgMzAwLF0NCg0KYyA8LSBjKG5yb3cocHJnbSksIG5yb3cocHJnZikpDQpkIDwtIGMobnJvdyhwcmdtMyksIG5yb3cocHJnZjMpKQ0KDQpwcm9wLnRlc3QoZCxjKQ0KYGBgDQogIA0KICBUcm9uZyBr4bq/dCBxdeG6oyBraeG7g20gxJHhu4tuaCB0csOqbiwgcHJvcC50ZXN0IMaw4bubYyB0w61uaCB04bu3IGzhu4cga2jDoWNoIG5hbSBnaeG7m2kgbXVhIG5o4buvbmcgc+G6o24gcGjhuqltIGPDsyBnacOhIMOtdCBoxqFuIDMwMCBUUlkgbMOgIDAsNTAzOCB2w6AgxrDhu5tjIHTDrW5oIHThu4kgbOG7hyBraMOhY2ggbuG7ryBnaeG7m2kgbXVhIGPDoWMgc+G6o24gcGjhuqltIGPDsyBt4bupYyBnacOhIHThu6sgMzAwIFRSWSB0cuG7nyB4deG7kW5nICBsw6AgMCw1MDY4LiBW4bqteSB0YSBiw6FjIGLhu48gSG8gduG7m2kgxJHhu5kgdGluIGPhuq15IDk1JS4gxJDhu5NuZyB0aOG7nWkgcGjDom4gdMOtY2ggY8OybiBjaG8gdGjhuqV5IHbhu5tpIG3hu6ljIMO9IG5naMSpYSA1JSwgdOG7tyBs4buHIG5hbSBnaeG7m2kgbXVhIG5o4buvbmcgc+G6o24gcGjhuqltIGPDsyBnacOhIMOtdCBoxqFuIDMwMCBUUlkgY2FvIGjGoW4gNDYsMTclLg0KDQojICoqQsOgaSB04bqtcCB24buBIG5ow6AgdHXhuqduIDEqKg0KIyMgR2nhu5tpIHRoaeG7h3UgY8OhYyBiaeG6v24NCk3DtCB04bqjOiBE4buvIGxp4buHdSBDdXN0b21lclNob3BwaW5nIGzDoCBt4buZdCBi4buZIGThu68gbGnhu4d1IGLhuqNuZyBs4bqleSB04burIHdlYnNpdGU6IGh0dHBzOi8vd3d3LmthZ2dsZS5jb20vZGF0YXNldHMvbWVobWV0dGFoaXJhc2xhbi9jdXN0b21lci1zaG9wcGluZy1kYXRhc2V0LiBC4buZIGThu68gbGnhu4d1IHBow6JuIHTDrWNoIHbDoCDEkcOhbmggZ2nDoSB0aMOzaSBxdWVuIG11YSBz4bqvbSBkYW5oIG3hu6VjIGPDoWMgc+G6o24gcGjhuqltIGPhu6dhIG3hu5dpIGtow6FjaCBow6BuZyB04bqhaSBJc3RhbmJ1bCB0aHUgdGjhuq1wIHThu6sgY8OhYyB0cnVuZyB0w6JtIG11YSBz4bqvbSBraMOhYyBuaGF1IHThu6sgbsSDbSAyMDIxIMSR4bq/biBuxINtIDIwMjMuIELhu5kgZOG7ryBsaeG7h3UgY2jhu6lhIDYxMTcwIHF1YW4gc8OhdCB2w6AgdHJvbmcgxJHDsyBjw7MgOSBiaeG6v24gZ+G7k206IA0KDQoxLiBEYXRlOiBk4buvIGxp4buHdSB0aHUgbmjhuq1wIHThu6sgMDUvMTEvMjAyMSDEkeG6v24gMDgvMDMvMjAyMy4NCjIuIEN1c3RvbWVySUQ6IG3DoyDEkeG7i25oIGRhbmggSUQgY+G7p2EgbeG7l2kga2jDoWNoIGjDoG5nKEM0MTQ1ODgsIEMxMDk1NTMsIEMyNzIwOTUsLi4uKQ0KMy4gQWdlOiDEkOG7mSB0deG7lWkgY+G7p2EgbeG7l2kga2jDoWNoIGjDoG5nIA0KNC4gR2VuZGVyOiBHaeG7m2kgdMOtbmggY+G7p2Ega2jDoWNoIGjDoG5nIChGIC1GZW1hbGU6IE7hu68gZ2nhu5tpLCBNIC0gTWFsZTogTmFtIGdp4bubaSkNCjUuIENhdGVnb3J5OiBEYW5oIG3hu6VjIGPDoWMgc+G6o24gcGjhuqltIMSRw6MgbXVhIGPhu6dhIG3hu5dpIGtow6FjaCBow6BuZyAoQ29zbWV0aWNzLCBDbG90aGluZywgRm9vZCAmIEJldmVyYWdlIHbDoCBPdGhlciBwcm9kdWN0cyBiYW8gZ+G7k206IFNvdXZlbmlyLCBUZWNobm9sb2d5LCBCb29rcywuLi4pDQo2LiBRdWFudGl0eTogU+G7kSBsxrDhu6NuZyBj4bunYSB04burbmcgc+G6o24gcGjhuqltICht4bq3dCBow6BuZykgdHLDqm4gbeG7l2kgZ2lhbyBkaWNoaCBtdWEgc+G6r20gY+G7p2Ega2jDoWNoIGjDoG5nICgxLDIsMyw0LDUpDQo3LiBQcmljZTogR2nDoSBz4bqjbiBwaOG6qW0gdHLDqm4gbeG7l2kgxJHGoW4gduG7iyB0w61uaCBi4bqxbmcgxJHhu5NuZyBMaXJhIChUUlkpIGPhu6dhIFRo4buVIE5oxKkgS+G7syAoODEsMzI7IDExLDczOyAxMCw0NjsgMzAwLDA4Oy4uLiApDQo4LiBQYXltZW50OiBQaMawxqFuZyB0aOG7qWMgdGhhbmggdG/DoW4gY+G7p2EgbeG7l2kga2jDoWNoIGjDoG5nIChDYXNoLCBEZWJpdCBDYXJkIHbDoCBDcmVkaXQgQ2FyZCkNCjkuIEFyZWE6IFRydW5nIHTDom0gbXVhIHPhuq9tIG7GoWkgbeG7l2kga2jDoWNoIGjDoG5nIG11YSBz4bqjbiBwaOG6qW0gKE1hbGwgb2YgSXN0YW5idWwsIEthbnlvbiB2w6AgT3RoZXIgcGxhY2VzIGJhbyBn4buTbTogTWV0cm9wb2wgQVZNLCBNZXRyb2NpdHksIEVtYWFyIFNxdWFyZSBNYWxsLC4uLikNCg0KYGBge3J9DQpsaWJyYXJ5KHJlYWR4bCkNCmxpYnJhcnkoZHBseXIpDQpsaWJyYXJ5KGdncGxvdDIpDQpsaWJyYXJ5KERlc2NUb29scykNCmxpYnJhcnkoZXBpdG9vbHMpDQpgYGANCg0KIyMjIEzhuqV5IGLhu5kgZOG7ryBsaeG7h3UgQmlrZVNhbGVzDQpgYGB7cn0NCiMgKkfEg24gZOG7ryBsaeG7h3UgQmlrZVNhbGVzIGNobyBiaeG6v24gYmlrZSoNCnNob3AgPC0gcmVhZF9leGNlbCgiRDovUlN0dWRpby9DdXN0b21lclNob3BwaW5nLnhsc3giLCBzaGVldCA9MSkNCiMgKk3DtCB04bqjIGNoaSB0aeG6v3Qga2nhu4N1IGJp4bq/biBz4buRIGPhu6dhIGRhdGFzaGVldCBCaWtlU2FsZXMqDQpzdHIoc2hvcCkNCmBgYA0KDQpgYGB7cn0NCiMgKkfhuq9uIHTDqm4gdmnhur90IHThuq90IGNobyBjw6FjIGJp4bq/biDEkeG7gyBk4buFIHRoYW8gdMOhYyoNCm5hbWVzKHNob3ApDQpuYW1lcyhzaG9wKSA8LSBjKCJEQVRFIiwgIklEIiwgIkdEIiwgIkFHRSIsICJDQVRFIiwgIlFUIiwgIlBSSSIsICJQQVkiLCAiQVJFQSIpDQpoZWFkKHNob3ApDQpgYGANCg0KIyMjIFRyw61jaCB4deG6pXQgZOG7ryBsaeG7h3UgdOG7qyBt4buZdCBkYXRhZnJhbWUgY8OzIHPhurVuDQoNCmBgYHtyfQ0KIyBUcsOtY2ggeHXhuqV0IGPDoWMgcXVhbiBzw6F0IGPhu6dhIGJp4bq/biBHRCA9ICJGIiB2w6AgY8OhYyBxdWFuIHPDoXQgY+G7p2EgYmnhur9uIENBVEUgPSBDb3NtZXRpY3MgdHJvbmcgxJHhu5FpIHTGsOG7o25nIHNob3AgZ+G6r24gdsOgbyB24bubaSB0w6puIHNob3AxDQpzaG9wMSA8LSBzdWJzZXQoc2hvcCwgR0QgPT0gIkYiJiBDQVRFID09ICJDb3NtZXRpY3MiKQ0KZGltKHNob3AxKQ0KaGVhZCAoc2hvcDEpDQpgYGANCg0KIyMgTcO0IHThuqMgdsOgIHRo4buRbmcga8OqIGPDoWMgYmnhur9uIEJpa2VTYWxlcw0KIyMjIFBow6JuIHTDrWNoIGJp4bq/biBBR0UgKMSQ4buZIHR14buVaSBj4bunYSBraMOhY2ggaMOgbmcpDQoNCmBgYHtyfQ0KI0LhuqNuZyBzdW1tYXJ5DQpzdW1tYXJ5KHNob3AkQUdFKQ0KYGBgDQoNCmBgYHtyfQ0KIyDEkOG7kyB0aOG7iw0KaGlzdCAoc2hvcCRBR0UsIG1haW4gPSAiRnJlcXVlbmN5IG9mIEFnZSIsIGNvbCA9ICJsaWdodGJsdWUiKQ0KYGBgDQoNCkThu7FhIHRoZW8ga+G6v3QgcXXhuqMgcGjDom4gdMOtY2ggY+G7p2EgcGjhuqduIG3hu4FtIFIgdMO0aSB0aOG6pXkgxJHGsOG7o2Mga2jDoWNoIGjDoG5nIGPDsyDEkeG7mSB0deG7lWkgY2FvIG5o4bqldCDEkeG6v24gdHJ1bmcgdMOibSBtdWEgc+G6r20gbMOgIDY5IHR14buVaSB2w6Aga2jDoWNoIGjDoG5nIGPDsyDEkeG7mSB0deG7lWkgdGjhuqVwIG5o4bqldCBsw6AgMTggdHXhu5VpOyDEkeG7mSB0deG7lWkgdHJ1bmcgYsOsbmggY+G7p2EgbeG7l2kga2jDoWNoIGjDoG5nIMSR4bq/biBtdWEgc+G6r20gbMOgIDQzIHR14buVaSB2w6AgY8OzIDUwJSBz4buRIG5nxrDhu51pIGPDsyB0deG7lWkgZMaw4bubaSA0MyB0deG7lWkgxJHhur9uIG11YSBow6BuZy5UaMO0bmcgcXVhIGJp4buDdSDEkeG7kyB04bqnbiBz4buRIHRyw6puIGPDsyB0aOG7gyB0aOG6pXkgcuG6sW5nIHBo4bqnbiBs4bubbiBuaOG7r25nIG5nxrDhu51pIMSR4bq/biB0cnVuZyB0w6JtIG11YSBz4bqvbSBjw7MgxJHhu5kgdHXhu5VpIG7hurFtIHRyb25nIGtob+G6o25nIHThu6sgMjAgxJHhur9uIDcwIHR14buVaS4gQ8OybiBs4bqhaSBuaOG7r25nIG5nxrDhu51pIGPDsyDEkeG7mSB0deG7lWkgdHJ1bmcgYsOsbmggZMaw4bubaSAyMCB0deG7lWkgxJHhur9uIG11YSBz4bqvbSBjaGnhur9tIHPhu5Egw610IHRyb25nIHThu5VuZyBz4buRIDYxMTcwIGtow6FjaCBow6BuZy4NCg0KIyMjIFBow6JuIHTDrWNoIGJp4bq/biBQcmljZSAoR2nDoSBz4bqjbiBwaOG6qW0gdHLDqm4gbeG7l2kgxJHGoW4gduG7iyB0w61uaCkNCg0KYGBge3J9DQojQuG6o25nIHN1bW1hcnkNCnN1bW1hcnkoc2hvcCRQUkkpDQpgYGANCg0KYGBge3J9DQojIMSQ4buTIHRo4buLDQpoaXN0IChzaG9wJFBSSSwgbWFpbiA9ICJGcmVxdWVuY3kgb2YgUHJpY2UiLCBjb2wgPSAib3JhbmdlIikNCg0KYGBgDQoNCkThu7FhIHRoZW8ga+G6v3QgcXXhuqMgcGjDom4gdMOtY2ggY+G7p2EgcGjhuqduIG3hu4FtIFIgdMO0aSB0aOG6pXkgxJHGsOG7o2Mga2jDoWNoIGjDoG5nIG11YSBz4bqjbiBwaOG6qW0gduG7m2kgbeG7qWMgZ2nDoSB0aOG6pXAgbmjhuqV0IGzDoCA1LDIzIFRSWSB2w6Aga2jDoWNoIGjDoG5nIG11YSBz4bqjbiBwaOG6qW0gduG7m2kgbeG7qWMgZ2nDoSBjYW8gbmjhuqV0IGzDoCA1MjUwIFRSWTsgdHJ1bmcgYsOsbmgga2jDoWNoIHRoxrDhu51uZyBtdWEgc+G6o24gcGjhuqltIGPDsyBt4bupYyBnacOhIGtob+G6o25nIDY4Niw2MyBUUlkgdsOgIGPDsyA1MCUgc+G7kSBuZ8aw4budaSBtdWEgaMOgbmcgduG7m2kgbeG7qWMgZ2nDoSBkxrDhu5tpIDIwMywzMCBUUlkuVGjDtG5nIHF1YSBiaeG7g3UgxJHhu5MgdOG6p24gc+G7kSB0csOqbiBjw7MgdGjhu4MgdGjhuqV5IHLhurFuZyBwaOG6p24gbOG7m24gbmjhu69uZyBuZ8aw4budaSDEkeG6v24gbXVhIHPhuq9tIHRoxrDhu51uZyBtdWEgY8OhYyBz4bqjbiBwaOG6qW0gY8OzIGdpw6EgdHJ1bmcgYsOsbmggZMaw4bubaSAyMDAwIFRSWS4gQ8OybiBs4bqhaSBjw7MgcuG6pXQgw610IG5nxrDhu51pIG11YSBz4bqjbiBwaOG6qW0gdOG7qyAyNTAwIFRSWSB0cuG7nyBsw6puIHRyb25nIHThu5VuZyBz4buRIDYxMTcwIGtow6FjaCBow6BuZy4NCg0KIyMjIFBow6JuIHTDrWNoIGJp4bq/biBRdWFudGl0eSAoU+G7kSBz4bqjbiBwaOG6qW0gxJHDoyBtdWEpDQoNCmBgYHtyfQ0KIyBC4bqjbmcgc3VtbWFyeQ0Kc3VtbWFyeShzaG9wJFFUKQ0KYGBgDQpgYGB7cn0NCiMgxJDhu5MgdGjhu4sNCmxpYnJhcnkoZ2dwbG90MikNCnNob3AgfD4gZ2dwbG90KGFlcyh4ID0gUVQsIHkgPSBhZnRlcl9zdGF0KGNvdW50KSkpICsNCmdlb21fYmFyKGZpbGwgPSAnYmx1ZScpICtnZW9tX3RleHQoYWVzKGxhYmVsID0gc2NhbGVzOjpwZXJjZW50KGFmdGVyX3N0YXQoY291bnQvc3VtKGNvdW50KSkpKSwgc3RhdCA9J2NvdW50JywgY29sb3IgPSAncmVkJywgdmp1c3QgPSAtIC41KSArbGFicyh4ID0gJ0ZyZXF1ZW5jeSBvZiBRdWFudGl0eScsIHkgPSAnTnVtYmVyIG9mIGN1c3RvbWVycycpDQpgYGANCg0KROG7sWEgdsOgbyBz4buRIGxp4buHdSB0aOG7kW5nIGvDqiB2w6AgxJHhu5MgdGjhu4sg4bufIHRyw6puLCAgdGEgcGjDom4gdMOtY2ggxJHGsOG7o2Mga2jDoWNoIGjDoG5nIG11YSBuaGnhu4F1IG5o4bqldCA1IHPhuqNuIHBo4bqpbSBjaGnhur9tIHThu7cgbOG7hyBsw6AgMjAsMjcxJSAgdsOgIHThu5FpIHRoaeG7g3Uga2jDoWNoIGjDoG5nIGNo4buJIG11YSBt4buZdCBz4bqjbiBwaOG6qW0gY2hp4bq/bSAxOSw4NDUlIHRyb25nIHThu5VuZyBz4buRLCB0cnVuZyBiw6xuaCBt4buXaSBraMOhY2ggaMOgbmcgxJHhur9uIG11YSB04bqnbSAzIHPhuqNuIHBo4bqpbSB2w6AgY8OzIDUwJSBz4buRIGtow6FjaCBow6BuZyBtdWEgZMaw4bubaSAzIHPhuqNuIHBo4bqpbS4gDQoNCiMjIyBQaMOibiB0w61jaCBiaeG6v24gR2VuZGVyIChHaeG7m2kgdMOtbmgpDQoNCmBgYHtyfQ0KIyBC4bqjbmcgdOG6p24gc+G7kQ0KdGFibGUoc2hvcCRHRCkNCmBgYA0KDQpgYGB7cn0NCiMjICpIaeG7g24gdGjhu4sgdGhlbyBiaeG7g3UgxJHhu5MqDQpzaG9wIHw+IGdncGxvdChhZXMoeCA9IEdELCB5ID0gYWZ0ZXJfc3RhdChjb3VudCkpKSArDQpnZW9tX2JhcihmaWxsID0gJ3BpbmsnKSArZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IHNjYWxlczo6cGVyY2VudChhZnRlcl9zdGF0KGNvdW50L3N1bShjb3VudCkpKSksIHN0YXQgPSdjb3VudCcsIGNvbG9yID0gJ2JsdWUnLCB2anVzdCA9IC0gLjUpICtsYWJzKHggPSAnRnJlcXVlbmN5IG9mIG1hbGVzIGFuZCBmZW1hbGVzJywgeSA9ICdOdW1iZXIgb2YgY3VzdG9tZXJzJykNCmBgYA0KDQpUaGVvIGvhur90IHF14bqjIHRo4buRbmcga8OqIGPhu6dhIHBo4bqnbiBt4buBbSBwaMOibiB0w61jaCBSLCB0YSB0aOG6pXkgc+G7kSBraMOhY2ggaMOgbmcgbuG7ryDEkeG6v24gdHJ1bmcgdMOibSBtdWEgc+G6r20gbmhp4buBdSBn4bqlcCAxLjUgbOG6p24gc+G7kSBraMOhY2ggbmFtLCB0cm9uZyDEkcOzIHThu7cgbOG7hyBraMOhY2ggaMOgbmcgbuG7ryBjaGnhur9tIMSR4bq/biA2MCUgdsOgIHThu7cgbOG7hyBraMOhY2ggaMOgbmcgbuG7ryBjaGnhur9tIGtob+G6o25nIDQwJS4NCg0KIyMjIFBow6JuIHTDrWNoIGJp4bq/biBDQVRFR09SWSAoRGFuaCBt4bulYyBjw6FjIHPhuqNuIHBo4bqpbSDEkcOjIG11YSkNCg0KYGBge3J9DQojIELhuqNuZyB04bqnbiBz4buRDQp0YWJsZShzaG9wJENBVEUpDQpgYGANCg0KYGBge3J9DQojIyAqSGnhu4NuIHRo4buLIHRoZW8gYmnhu4N1IMSR4buTKg0Kc2hvcCB8PiBnZ3Bsb3QoYWVzKHggPSBDQVRFLCB5ID0gYWZ0ZXJfc3RhdChjb3VudCkpKSArDQpnZW9tX2JhcihmaWxsID0gJ3BpbmsnKSArZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IHNjYWxlczo6cGVyY2VudChhZnRlcl9zdGF0KGNvdW50L3N1bShjb3VudCkpKSksIHN0YXQgPSdjb3VudCcsIGNvbG9yID0gJ2JsdWUnLCB2anVzdCA9IC0gLjUpICtsYWJzKHggPSAnRnJlcXVlbmN5IG9mIFBST0RVQ1RTJywgeSA9ICdOdW1iZXIgb2YgY3VzdG9tZXJzJykNCmBgYA0KDQpUaGVvIGvhur90IHF14bqjIHBow6JuIHTDrWNoIHbDoCDEkeG7kyB0aOG7iyBjaMO6bmcgdGEgdGjhuqV5IMSRxrDhu6NjIHh1IGjGsOG7m25nIGtow6FjaCBow6BuZyDEkcOqbiB0cnVuZyB0w6JtIG11YSBz4bqvbSBxdeG6p24gw6FvIGNoaeG6v20gdOG7tyBs4buHIHTGsMahbmcgxJHhu5FpIGNhbyDEkeG6v24gMzQsNDMgdHJvbmcgdOG7lW5nIHPhu5EgNjExNzAgbmfGsOG7nWkuIFRp4bq/cCDEkeG6v24gbMOgIG5ow7NtIGtow6FjaCBow6BuZyDEkeG6v24gbXVhIG3hu7kgcGjhuqltIHbDoCBuaMOzbSBraMOhY2ggbXVhIGPDoWMgbG/huqFpIHRo4bupYyBwaOG6qW0sIG7GsOG7m2MgZ2nhuqNpIGtow6F0ICBraMO0bmcgY8OzIHPhu7EgY2jDqm5oIGzhu4duaCBxdcOhIG5oaeG7gXUsIGPDsyB04bu3IGzhu4cgZ+G6p24gbmjGsCBuaGF1IGNoaeG6v20gbOG6p24gbMaw4bujdCBsw6AgMTUsMzglIHbDoCAxNCw4OSUuIA0KDQojIyMgUGjDom4gdMOtY2ggYmnhur9uIFBheW1lbnQgKFBoxrDGoW5nIHRo4bupYyB0aGFuaCB0b8OhbikNCg0KYGBge3J9DQojIELhuqNuZyB04bqnbiBz4buRDQp0YWJsZShzaG9wJFBBWSkNCmBgYA0KDQpgYGB7cn0NCiMjICpIaeG7g24gdGjhu4sgdGhlbyBiaeG7g3UgxJHhu5MqDQpsaWJyYXJ5KGdncGxvdDIpDQpwaWUodGFibGUoc2hvcCRQQVkpLCBtYWluPSAiSGlzdG9ncmFtIG9mIFBheW1lbnQiLCBjb2wgPSByYWluYm93KDYpKQ0Kc2hvcCB8PiBnZ3Bsb3QoYWVzKHggPSBQQVksIHkgPSBhZnRlcl9zdGF0KGNvdW50KSkpICsNCmdlb21fYmFyKGZpbGwgPSAnYnJvd24nKSArZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IHNjYWxlczo6cGVyY2VudChhZnRlcl9zdGF0KGNvdW50L3N1bShjb3VudCkpKSksIHN0YXQgPSdjb3VudCcsIGNvbG9yID0gJ2JsdWUnLCB2anVzdCA9IC0gLjUpICtsYWJzKHggPSAnRnJlcXVlbmN5IG9mIFBheW1lbnQnLCB5ID0gJ051bWJlciBvZiBjdXN0b21lcnMnKQ0KDQpgYGANCg0KVGhlbyBr4bq/dCBxdeG6oyBwaMOibiB0w61jaCB2w6AgxJHhu5MgdGjhu4sgdGEgdGjhuqV5IG5o4buvbmcga2jDoWNoIGjDoG5nIMSR4bq/biB0cnVuZyB0w6JtIHRoxrDGoW5nIG3huqFpIG11YSBz4bqvbSB0aGFuaCB0b8OhbiBz4bqjbiBwaOG6qW0gYuG6sW5nIHRp4buBbiBt4bq3dCBjaGnhur9tIHThu7cgbOG7hyBjYW8gbmjhuqV0IMSR4bq/biA0NCw4JSB0cm9uZyB04buVbmcgc+G7kSwgZ+G6pXAgxJHhur9uIDIsMiBs4bqnbiBuaMOzbSBraMOhY2ggaMOgbmcgdGhhbmggdG/DoW4gYuG6sW5nIHRo4bq7IGdoaSBu4bujICgxMjI3NCBuZ8aw4budaSkgdsOgIGfhuqVwIDEsMyBs4bqnbiBz4buRIGtow6FjaCB0aGFuaCB0b8OhbiBi4bqxbmcgdGjhursgdMOtbiBk4bulbmcgKDIxNDc0IG5nxrDhu51pKS4NCg0KIyAqKkLDoGkgdOG6rXAgduG7gSBuaMOgIHR14bqnbiAyOioqIEzhu7FhIGNo4buNbiBjw6FjIGJp4bq/biDEkeG7i25oIHTDrW5oIHbDoCDEkeG7i25oIGzGsOG7o25nDQojIyBCaeG6v24gcGjhu6UgdGh14buZYyBsw6AgYmnhur9uIMSR4buLbmggdMOtbmgNCg0KQsOgaSBuZ2hpw6puIGPhu6l1IGNo4buNbiBiaeG6v24gcGjhu6UgdGh14buZYyBn4buTbSBjw6FjIGJp4bq/biDEkeG7i25oIHTDrW5oIMSRw6MgxJHGsOG7o2MgbcOjIGhvw6EgbMOgIGJp4bq/biBRdWFudGl0eSAoU+G7kSBsxrDhu6NuZyBz4bqjbiBwaOG6qW0ga2jDoWNoIGjDoG5nIMSRw6MgbXVhKSB4w6FjIMSR4buLbmggdGjDtG5nIHF1YSA2MTE3MCBraMOhY2ggaMOgbmcgcXVhbiBzw6F0IHRodSBuaOG6rXAgxJHGsOG7o2Mg4bufIElzdGFuYnVsIMSR4buDIMSRw6FuaCBnacOhIG3hu6ljIMSR4buZIHRpw6p1IHRo4bulIHPhuqNuIHBo4bqpbSBtdWEgc+G6r20gc+G6vSBjw7MgdGjDs2kgcXVlbiBtdWEgc+G6o24gcGjhuqltIG7DoG8gbmhp4buBdSBuaOG6pXQsIHThu6sgxJHDsyDEkcawYSByYSBwaMawxqFuZyDDoW4gdsOgIGPDoWMgY2jGsMahbmcgdHLDrG5oIGtodXnhur9uIG3Do2kgbmjhurFtIMSR4bqpeSBt4bqhbmggbmh1IGPhuqd1IHRpw6p1IHRo4bulIGxv4bqhaSBz4bqjbiBwaOG6qW0gxJHDsyByYSB0aOG7iyB0csaw4budbmcuDQoNCiMjIEJp4bq/biBwaOG7pSB0aHXhu5ljIGzDoCBiaeG6v24gxJHhu4tuaCBsxrDhu6NuZw0KDQpOZ2hpw6puIGPhu6l1IHPhu60gZOG7pW5nIGJp4bq/biDEkeG7i25oIGzGsOG7o25nIGzDoG0gYmnhur9uIHBo4bulIHRodeG7mWMgYmFvIGfhu5NtIGJp4bq/biBQUklDRSAoZ2nDoSBj4bqjIG3hu5dpIHPhuqNuIHBo4bqpbSksIGJp4bq/biBBR0UgKMSQ4buZIHR14buVaSBj4bunYSBt4buXaSBraMOhY2ggaMOgbmcpLCBiaeG6v24gR2VuZGVyLCBiaeG6v24gQVJFQSBWw4AgQmnhur9uIFBheW1lbnQgbmjhurFtIHBow6JuIHTDrWNoIHRow7NpIHF1ZW4gbXVhIHPhuq9tIHPhuqNuIHBo4bqpbSBi4bqxbmcgxrDhu5tjIGzGsOG7o25nIG3hu6ljIGdpw6EgdHJ1bmcgYsOsbmggY+G7p2Egbmjhu69uZyBz4bqjbiBwaOG6qW0gdGjDrCBraMOhY2ggdGjGsOG7nW5nIGNo4buNbiBtdWEgbmhp4buBdSBuaOG6pXQgaG/hurdjIG3hu5l0IGtow6FjaCBow6BuZyBjw7MgxJHhu5kgdHXhu5VpIHRydW5nIGLDrG5oIGPhu6dhIG3hu5dpIGtow6FjaCBow6BuZyBz4bq9IGPDsyB4dSBoxrDhu5tuZyBtdWEgbmjhu69uZyBz4bqjbiBwaOG6qW0gbsOgbyB2w6AgduG7m2kgbeG7qWMgZ2nDoSBiYW8gbmhpw6p1Pw0KDQoNCg==