PHẦN 1: CHUẨN BỊ VÀ TÌM HIỂU DỮ LIỆU

1.1 Nhập dữ liệu

library(readxl)
tcc <- read_excel("D:/BAI TAP/PTDLDT/tcc.xlsx")

1.2 Thông tin về bộ dữ liệu

tcc.xlsx là một bộ dữ liệu liên quan đến việc khảo sát nhu cầu tiếp tục hay dừng không tiếp tục sử dụng dịch vụ của một công ty chuyên cung cấp dịch vụ về bưu chính viễn thông. Bên dưới là thông tin cơ bản của bộ dữ liệu:

  • CustomerID: Mã khách hàng

  • Gender: Giới tính

  • InternetService: Dịch vụ Internet đang sử dụng (Bao gồm Internet cáp quang - Fiber optic và Đường dây thuê bao số - DSL)

  • Contract: Loại hợp đồng (Bao gồm hàng tháng, hàng năm và 2 năm)

  • PaymentMethod: Phương thức thanh toán (Bao gồm bill điện tử, bill qua thư, thẻ tín dụng và chuyển khoản)

  • MonthlyCharges: Phí hàng tháng (Tính bằng USD)

  • Churn1, Churn: Quyết định ngưng sử dụng dịch vụ. (1 là Yes - Ngừng sử dụng, 0 là No - Tiếp tục sử dụng)

Kiểm tra dữ liệu bị thiếu:

na <- is.na(tcc)
sum(na)
## [1] 0

Kết quả cho thấy không có giá trị nào bị trống trong bộ dữ liệu này.

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

str(tcc)
## tibble [7,043 × 8] (S3: tbl_df/tbl/data.frame)
##  $ customerID     : chr [1:7043] "7590-VHVEG" "5575-GNVDE" "3668-QPYBK" "7795-CFOCW" ...
##  $ gender         : chr [1:7043] "Female" "Male" "Male" "Male" ...
##  $ InternetService: chr [1:7043] "DSL" "DSL" "DSL" "DSL" ...
##  $ Contract       : chr [1:7043] "Month-to-month" "One year" "Month-to-month" "One year" ...
##  $ PaymentMethod  : chr [1:7043] "Electronic check" "Mailed check" "Mailed check" "Bank transfer (automatic)" ...
##  $ MonthlyCharges : num [1:7043] 29.9 57 53.9 42.3 70.7 ...
##  $ Churn1         : num [1:7043] 0 0 1 0 1 1 0 0 1 0 ...
##  $ Churn          : chr [1:7043] "No" "No" "Yes" "No" ...

Dữ liệu này có 8 biến, dựa theo bảng cấu trúc này, ta có thể dễ dàng thấy được nó hiện đang có 6 biến định tính bao gồm gender, InternetService, Contract, PaymentMethod, Churn1Churn có thể gộp làm một. Ở đây, ta chọn biến Churn làm biến phụ thuộc để có thể xem xét được những yếu tố nào ảnh hưởng đến quyết định dừng sử dụng dịch vụ của khách hàng.

PHẦN 2: PHÂN TÍCH VÀ MÔ TẢ CÁC BIẾN ĐỊNH TÍNH

2.1 gender

Tần số, tần suất

# Lập bảng tần số
gender_f <- table(tcc$gender)

# Lập bảng tần suất
gender_p <- prop.table(gender_f)*100

# Kết hợp thành một bảng
gender <- data.frame(
  Category = names(gender_f),
  Frequency = as.vector(gender_f),
  Percentage = round(as.vector(gender_p), 2)
)
gender
##   Category Frequency Percentage
## 1   Female      3488      49.52
## 2     Male      3555      50.48

Biểu đồ

ggplot(data = gender, aes(x = '', y = Frequency, fill = Category)) +
  geom_col() +
  coord_polar('y') +
  geom_text(aes(label = percent(Frequency/length(tcc$gender))), position = position_stack(vjust = 0.5)) +
  labs(title = 'Figure 1: Gender of Customers') +
  scale_fill_brewer(palette = "Set3") +
  theme(plot.title = element_text(hjust = 0.5, face = 'bold'))  

Nhận xét: Số lượng khách hàng là nam chiếm khoảng 50.48% và số lượng khách hàng nữ là 49.52% cho thấy rằng số lượng khách hàng nam đang có tỷ lệ cao hơn số khách hàng nữ nhưng sự chênh lệch đó là không đáng kể, chỉ khoảng chưa tới 1%.

2.2 InternetService

Bảng tần số, tần suất

# Lập bảng tần số
is_f <- table(tcc$InternetService)

# Lập bảng tần suất
is_p <- prop.table(is_f)*100

# Kết hợp thành một bảng
is <- data.frame(
  Category = names(is_f),
  Frequency = as.vector(is_f),
  Percentage = round(as.vector(is_p), 2)
)
is
##      Category Frequency Percentage
## 1         DSL      2421      34.37
## 2 Fiber optic      3096      43.96
## 3          No      1526      21.67

Biểu đồ

ggplot(data = is, aes(x = '', y = Frequency, fill = Category)) +
  geom_col() +
  coord_polar('y') +
  geom_text(aes(label = percent(Frequency/length(tcc$gender))), position = position_stack(vjust = 0.5)) +
  labs(title = 'Figure 2: Internet Service of Customers') +
  scale_fill_brewer(palette = "Set3") +
  theme(plot.title = element_text(hjust = 0.5, face = 'bold'))  

Nhận xét: Đa số khách hàng chọn sử dụng cáp quang (Fiber optic) với tỷ lệ chiếm gần nửa (~40%), DSL chiếm tỷ lệ cao thứ hai với 34.4% và không sử dụng internet là 21.7%.

2.3 Contract

Bảng tần số, tần suất

# Lập bảng tần số
co_f <- table(tcc$Contract)

# Lập bảng tần suất
co_p <- prop.table(co_f)*100

# Kết hợp thành một bảng
contract <- data.frame(
  Category = names(co_f),
  Frequency = as.vector(co_f),
  Percentage = round(as.vector(co_p), 2)
)
contract
##         Category Frequency Percentage
## 1 Month-to-month      3875      55.02
## 2       One year      1473      20.91
## 3       Two year      1695      24.07

Biểu đồ

ggplot(data = contract, aes(x = '', y = Frequency, fill = Category)) +
  geom_col() +
  coord_polar('y') +
  geom_text(aes(label = percent(Frequency/length(tcc$gender))), position = position_stack(vjust = 0.5)) +
  labs(title = 'Figure 3: Contract of Customers') +
  scale_fill_brewer(palette = "Set3") +
  theme(plot.title = element_text(hjust = 0.5, face = 'bold'))  

Nhận xét: Đa số khách hàng sử dụng loại hợp đồng hàng tháng (Month-to-month)với tỷ lệ rất cao là 55%. Số còn lại sử dụng hợp đồng 2 năm với 24.1% và 1 năm với 20.9%.

2.4 PaymentMethod

Bảng tần số, tần suất

# Lập bảng tần số
pm_f <- table(tcc$PaymentMethod)

# Lập bảng tần suất
pm_p <- prop.table(pm_f)*100

# Kết hợp thành một bảng
pm <- data.frame(
  Category = names(pm_f),
  Frequency = as.vector(pm_f),
  Percentage = round(as.vector(pm_p), 2)
)
pm
##                    Category Frequency Percentage
## 1 Bank transfer (automatic)      1544      21.92
## 2   Credit card (automatic)      1522      21.61
## 3          Electronic check      2365      33.58
## 4              Mailed check      1612      22.89

Biểu đồ

ggplot(data = pm, aes(x = '', y = Frequency, fill = Category)) +
  geom_col() +
  coord_polar('y') +
  geom_text(aes(label = percent(Frequency/length(tcc$gender))), position = position_stack(vjust = 0.5)) +
  labs(title = 'Figure 4: Payment Method of Customers') +
  scale_fill_brewer(palette = "Set3") +
  theme(plot.title = element_text(hjust = 0.5, face = 'bold'))  

Nhận xét: Các phương thức thanh toán đa phần là không có quá nhiều sự chênh lệch, Electronic check chiếm tỷ lệ cao nhất với 33.58%, Mailed check đứng thứ hai với 22.89%, Bank transfer đứng thứ 3 với 21.92% và Credit card đứng cuối với 21.61%. Thật ngạc nhiên khi các phương thức thanh toán dạng tự động trừ tiền (automatic)lại ít được ưa chuộng hơn so với các phương thức truyền thống như bill qua mail hay bill điện tử.

2.5 Churn

Tần số, tần suất

# Lập bảng tần số
ch_f <- table(tcc$Churn)

# Lập bảng tần suất
ch_p <- prop.table(ch_f)*100

# Kết hợp thành một bảng
churn <- data.frame(
  Category = names(ch_f),
  Frequency = as.vector(ch_f),
  Percentage = round(as.vector(ch_p), 2)
)
churn
##   Category Frequency Percentage
## 1       No      5174      73.46
## 2      Yes      1869      26.54

Biểu đồ

ggplot(data = churn, aes(x = '', y = Frequency, fill = Category)) +
  geom_col() +
  coord_polar('y') +
  geom_text(aes(label = percent(Frequency/length(tcc$gender))), position = position_stack(vjust = 0.5)) +
  labs(title = 'Figure 5: Churn of Customers') +
  scale_fill_brewer(palette = "Set3") +
  theme(plot.title = element_text(hjust = 0.5, face = 'bold'))  

Nhận xét: Đa số khách hàng chọn tiếp tục sử dụng dịch vụ (73%) và chỉ có 27% khách hàng quyết định ngừng sử dụng dịch vụ.

PHẦN 3: ƯỚC LƯỢNG KHOẢNG VÀ KIỂM ĐỊNH GIẢ THUYẾT CHO TỶ LỆ

Trong thống kê suy diễn, việc ước lượng khoảng và kiểm định giả thuyết cho tỷ lệ là một bước quan trọng, đặc biệt là trong trường hợp muốn đưa ra kết luận về quần thể dựa trên mẫu. Khi khảo sát, ta chỉ lấy một mẫu nhỏ từ quần thể lớn, mà mẫu đại diện cho quần thể nên ta cần ước lượng được khoảng tin cậy cho tỷ lệ thật sự bên ngoài quần thể. Ngoài ra ước lượng khoảng còn đưa ra được một khoảng tin cậy thể hiện độ chính xác của tỷ lệ.

3.1 gender

# Số lượng khách hàng nữ
fm <- sum(tcc$gender == "Female")
# Tổng số khách hàng
total <- length(tcc$gender)
# Kiểm định tỷ lệ
prop.test(fm, total, p = 0.495, conf.level = 0.95)
## 
##  1-sample proportions test with continuity correction
## 
## data:  fm out of total, null probability 0.495
## X-squared = 0.00083849, df = 1, p-value = 0.9769
## alternative hypothesis: true p is not equal to 0.495
## 95 percent confidence interval:
##  0.4835017 0.5069906
## sample estimates:
##         p 
## 0.4952435

Đặt giả thuyết: \[ \left\{ \begin{array}{ll} H_0: & \text{Tỷ lệ thực số khách hàng là nữ } = 0.495 \\ H_1: & \text{Tỷ lệ thực số khách hàng là nữ } \ne 0.495 \end{array} \right. \]

Ta thấy rằng p_value = 0.9769 > 5%, nghĩa là không có đủ cơ sở để bác bỏ H0. Nghĩa là thực tế tỷ lệ số khách hàng nữ là 49.5%, ngoài ra, tỷ lệ khách hàng nữ còn được ước lượng là nằm trong khoảng 48.35-50.7% với độ tin cậy 95%.

3.2 Churn

# Số lượng No
continue <- sum(tcc$Churn == "No")
# Tổng số khách hàng
total <- length(tcc$gender)
# Kiểm định tỷ lệ
prop.test(continue, total, p = 0.73, conf.level = 0.95)
## 
##  1-sample proportions test with continuity correction
## 
## data:  continue out of total, null probability 0.73
## X-squared = 0.74274, df = 1, p-value = 0.3888
## alternative hypothesis: true p is not equal to 0.73
## 95 percent confidence interval:
##  0.7241207 0.7448820
## sample estimates:
##         p 
## 0.7346301

Đặt giả thuyết: \[ \left\{ \begin{array}{ll} H_0: & \text{Tỷ lệ thực số khách hàng tiếp tục sử dụng dịch vụ } = 0.73 \\ H_1: & \text{Tỷ lệ thực số khách hàng tiếp tục sử dụng dịch vụ } \ne 0.73 \end{array} \right. \]

Ta thấy rằng p_value = 0.3888 > 5%, nghĩa là không có đủ cơ sở để bác bỏ H0. Nghĩa là thực tế tỷ lệ số khách hàng chọn tiếp tục sử dụng dịch vụ là 73%, ngoài ra, tỷ lệ khách hàng tiếp tục sử dụng dịch vụ còn được ước lượng là nằm trong khoảng 72.41-74.48% với độ tin cậy 95%.

PHẦN 4: PHÂN TÍCH MỐI QUAN HỆ CỦA CÁC BIẾN

4.1 Biến phụ thuộc Churn

4.1.1 genderChurn

Bảng tần số chéo

gender_churn <- table(tcc$gender,tcc$Churn)
gender_churn
##         
##            No  Yes
##   Female 2549  939
##   Male   2625  930

Biểu đồ

df_gender_churn <- as.data.frame(gender_churn)
colnames(df_gender_churn) <- c("Gender","Churn","Freq")
ggplot(df_gender_churn, aes(x = Churn, y = Freq, fill = Gender)) +
  geom_col(position = position_dodge()) +
  labs(title = 'Figure 6: Gender and Churn', x = 'Churn', y = 'Frequency') +
  scale_fill_brewer(palette = "Set2") +
  theme_minimal() +
    theme(axis.text.x = element_text(angle = 90, hjust = 1),
        plot.title = element_text(hjust = 0.5, face = "bold"))

Kiểm định Chi-bình phương

chisq.test(gender_churn)
## 
##  Pearson's Chi-squared test with Yates' continuity correction
## 
## data:  gender_churn
## X-squared = 0.48408, df = 1, p-value = 0.4866

Nhận xét: Nhìn sơ qua biểu đồ và bảng tần số chéo, ta có thể thấy được tỷ lệ khách hàng nam, nữ trong nhóm rời bỏ và tiếp tục không quá chênh lệch nhau. Ở nhóm tiếp tục sử dụng, số lượng nữ, nam lần lượt là 2549 và 2625 còn nhóm rời bỏ lần lượt là 939 và 930.

Đặt giả thuyết: \[ \left\{ \begin{array}{ll} H_0: & \text{Không có mối quan hệ giữa giới tính và quyết định rời bỏ } \\ H_1: & \text{Có tồn tại mối quan hệ giữa giới tính và quyết định rời bỏ } \end{array} \right. \]

Ta thấy giá trị p_value = 0.4866 > 5%, nghĩa là không đủ cơ sở để bác bỏ H0. Vậy không có mối quan hệ nào giữa genderChurn.

Relative Risk - RR

library(epitools)
riskratio(gender_churn)
## $data
##         
##            No  Yes Total
##   Female 2549  939  3488
##   Male   2625  930  3555
##   Total  5174 1869  7043
## 
## $measure
##         risk ratio with 95% C.I.
##           estimate     lower    upper
##   Female 1.0000000        NA       NA
##   Male   0.9717493 0.8990893 1.050281
## 
## $p.value
##         two-sided
##          midp.exact fisher.exact chi.square
##   Female         NA           NA         NA
##   Male    0.4699892    0.4828768  0.4698339
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "Unconditional MLE & normal approximation (Wald) CI"

Tỷ lệ khách hàng dừng sử dụng dịch vụ của giới tính nam và giới tính nữ không quá chênh lệch. Cụ thể ta thấy so với nữ, tỷ lệ dừng sử dụng dịch vụ của khách nam chỉ bằng 0.97 trong khoảng 0.89-1.05 với độ tin cậy 95% cho thấy số khách nam dừng sử dụng dịch vụ thấp hơn số khách nữ là 3% và thấp hơn 0.97 lần.

Odds Ratio - OR

oddsratio(gender_churn)
## $data
##         
##            No  Yes Total
##   Female 2549  939  3488
##   Male   2625  930  3555
##   Total  5174 1869  7043
## 
## $measure
##         odds ratio with 95% C.I.
##           estimate     lower    upper
##   Female 1.0000000        NA       NA
##   Male   0.9617495 0.8652007 1.069076
## 
## $p.value
##         two-sided
##          midp.exact fisher.exact chi.square
##   Female         NA           NA         NA
##   Male    0.4699892    0.4828768  0.4698339
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "median-unbiased estimate & mid-p exact CI"

Tương tự, ta thấy tỷ số chênh của khách hàng nam quyết định dừng sử dụng dịch vụ so với số khách hàng nữ là 0.96 và nằm trong khoảng 0.86-1.07 với độ tin cậy 95%. Nghĩa là tỷ số chênh của khách hàng nam dừng sử dụng dịch vụ bằng 0.96 lần tỷ số chênh của khách hàng là nữ.

4.1.2 InternetServiceChurn

Bảng tần số chéo

is_churn <- table(tcc$InternetService,tcc$Churn)
is_churn
##              
##                 No  Yes
##   DSL         1962  459
##   Fiber optic 1799 1297
##   No          1413  113

Biểu đồ

df_is_churn <- as.data.frame(is_churn)
colnames(df_is_churn) <- c("Internet Service","Churn","Freq")
ggplot(df_is_churn, aes(x = Churn, y = Freq, fill = `Internet Service`)) +
  geom_col(position = position_dodge()) +
  labs(title = 'Figure 7: Internet Service and Churn', x = 'Churn', y = 'Frequency') +
  scale_fill_brewer(palette = "Set2") +
  theme_minimal() +
    theme(axis.text.x = element_text(angle = 90, hjust = 1),
        plot.title = element_text(hjust = 0.5, face = "bold"))

Kiểm định Chi-bình phương

chisq.test(is_churn)
## 
##  Pearson's Chi-squared test
## 
## data:  is_churn
## X-squared = 732.31, df = 2, p-value < 2.2e-16

Nhận xét: Từ biểu đồ đã thể hiện rõ ràng được sự khác biệt của hai yếu tố. Cụ thể là ở nhóm tiếp tục sử dụng thì số dịch vụ Fiber optic, DSL và No lần lượt là 1962, 1799 và 1413, đây là một tỷ lệ khá chênh lệch và ở nhóm rời bỏ thì số dịch vụ đó lần lượt là 459, 1297 và 113. Ta có thể thấy nhóm chọn dừng sử dụng dịch vụ có tỷ lệ sử dụng Fiber optic rất cao, do đó InternetService có khả năng là có ảnh hưởng lên Churn Ta tiến hành kiểm định Chi-bình phương.

Đặt giả thuyết: \[ \left\{ \begin{array}{ll} H_0: & \text{Không có mối quan hệ giữa loại dịch vụ Internet và quyết định rời bỏ } \\ H_1: & \text{Có tồn tại mối quan hệ giữa loại dịch vụ Internet và quyết định rời bỏ } \end{array} \right. \]

Ta thấy giá trị p_value = 0.0000 < 5%, nghĩa là bác bỏ H0. Vậy có tồn tại mối quan hệ giữa InternetServiceChurn. Vì thế ta tiến hành tính toán Relative Risk và Odds Ratio.

Relative Risk - RR

riskratio(is_churn)
## $data
##              
##                 No  Yes Total
##   DSL         1962  459  2421
##   Fiber optic 1799 1297  3096
##   No          1413  113  1526
##   Total       5174 1869  7043
## 
## $measure
##              risk ratio with 95% C.I.
##                estimate     lower     upper
##   DSL         1.0000000        NA        NA
##   Fiber optic 2.2096380 2.0149902 2.4230887
##   No          0.3905764 0.3211862 0.4749579
## 
## $p.value
##              two-sided
##               midp.exact fisher.exact   chi.square
##   DSL                 NA           NA           NA
##   Fiber optic          0 5.462658e-76 1.352046e-73
##   No                   0 1.775062e-25 9.986103e-24
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "Unconditional MLE & normal approximation (Wald) CI"

Với nhóm Fiber optic so với DSL, ta có giá trị RR = 2.21 và nằm trong khoảng 2.02-2.42 với độ tin cậy 95%, nghĩa là tỷ lệ khách hàng sử dụng dịch vụ Fiber optic có tỷ lệ ngưng sử dụng dịch vụ cao hơn hẳn so với các khách hàng dùng DSL. Cụ thể, nhóm sử dụng Fiber optic có tỷ lệ dừng sử dụng cao hơn 121% so với nhóm DSL hay tỷ lệ dừng sử dụng dịch vụ của Fiber optic gấp 2.2 lần so với DSL.

Với nhóm không dùng so với DSL, ta có giá trị RR = 0.39 và nằm trong khoảng 0.32-0.47 với độ tin cậy 95%, nghĩa là tỷ lệ khách hàng không dùng dịch vụ có tỷ lệ ngưng sử dụng dịch vụ thấp hơn so với các khách hàng dùng DSL. Cụ thể, nhóm không dùng internet có tỷ lệ dừng sử dụng thấp hơn so với nhóm DSL là 61% hay tỷ lệ dừng sử dụng dịch vụ của nhóm không dùng internet chỉ bằng 0.39 lần so với DSL.

Odds-Ratio - OR

oddsratio(is_churn)
## $data
##              
##                 No  Yes Total
##   DSL         1962  459  2421
##   Fiber optic 1799 1297  3096
##   No          1413  113  1526
##   Total       5174 1869  7043
## 
## $measure
##              odds ratio with 95% C.I.
##                estimate     lower     upper
##   DSL         1.0000000        NA        NA
##   Fiber optic 3.0805710 2.7224910 3.4904113
##   No          0.3422587 0.2743666 0.4236615
## 
## $p.value
##              two-sided
##               midp.exact fisher.exact   chi.square
##   DSL                 NA           NA           NA
##   Fiber optic          0 5.462658e-76 1.352046e-73
##   No                   0 1.775062e-25 9.986103e-24
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "median-unbiased estimate & mid-p exact CI"

Ở nhóm Fiber optic, giá trị OR = 3.08 và nằm trong khoảng 2.72-3.49 với độ tin cậy 95% cho thấy việc tỷ lệ việc khách hàng sử dụng Fiber optic rời bỏ so với không rời bỏ cao hơn gấp 3 lần so với tỷ lệ mà khách hàng sử dụng DSL. Còn ở nhóm không sử dụng dịch vụ, giá trị OR = 0.34 và nằm trong khoảng 0.27-0.42 với độ tin cậy 95% cho thấy tỷ lệ mà khách hàng không sử dụng dịch vụ rời bỏ so với không rời bỏ ít hơn 0.34 lần so với tỷ lệ mà khách hàng dùng DSL rời bỏ.

4.1.3 ContractChurn

Bảng tần số chéo

contract_churn <- table(tcc$Contract,tcc$Churn)
contract_churn
##                 
##                    No  Yes
##   Month-to-month 2220 1655
##   One year       1307  166
##   Two year       1647   48

Biểu đồ

df_contract_churn <- as.data.frame(contract_churn)
colnames(df_contract_churn) <- c("Contract","Churn","Freq")
ggplot(df_contract_churn, aes(x = Churn, y = Freq, fill = Contract)) +
  geom_col(position = position_dodge()) +
  labs(title = 'Figure 8: Contract and Churn', x = 'Churn', y = 'Frequency') +
  scale_fill_brewer(palette = "Set2") +
  theme_minimal() +
    theme(axis.text.x = element_text(angle = 90, hjust = 1),
        plot.title = element_text(hjust = 0.5, face = "bold"))

Kiểm định Chi-bình phương

chisq.test(contract_churn)
## 
##  Pearson's Chi-squared test
## 
## data:  contract_churn
## X-squared = 1184.6, df = 2, p-value < 2.2e-16

Nhận xét: Từ biểu đồ, ta có thể thấy được hai yếu tố có sự khác biệt rõ rệt. Cụ thể những người chọn dừng sử dụng dịch vụ thường có xu hướng là hợp đồng hàng tháng trong khi nhóm tiếp tục sử dụng dịch vụ thì phân bố đều các hạn hợp đồng. Ở nhóm tiếp tục sử dụng, các hạn hợp đồng hàng tháng, hàng năm và 2 năm lần lượt là 2220, 1307 và 1647 trong khi đó ở nhóm không sử dụng nữa thì là 1655, 166, 48.

Đặt giả thuyết: \[ \left\{ \begin{array}{ll} H_0: & \text{Không có mối quan hệ giữa hạn hợp đồng và quyết định rời bỏ } \\ H_1: & \text{Có tồn tại mối quan hệ giữa hạn hợp đồng và quyết định rời bỏ } \end{array} \right. \]

Ta thấy giá trị p_value = 0.0000 < 5%, nghĩa là bác bỏ H0. Vậy có mối quan hệ giữa ContractChurn. Vì thế ta tiến hành tính toán Relative Risk và Odds Ratio.

Relative Risk - RR

riskratio(contract_churn)
## $data
##                 
##                    No  Yes Total
##   Month-to-month 2220 1655  3875
##   One year       1307  166  1473
##   Two year       1647   48  1695
##   Total          5174 1869  7043
## 
## $measure
##                 risk ratio with 95% C.I.
##                    estimate      lower      upper
##   Month-to-month 1.00000000         NA         NA
##   One year       0.26386334 0.22759535 0.30591073
##   Two year       0.06630484 0.05005021 0.08783844
## 
## $p.value
##                 two-sided
##                  midp.exact  fisher.exact    chi.square
##   Month-to-month         NA            NA            NA
##   One year                0 1.189415e-117 3.529090e-104
##   Two year                0 1.102868e-247 3.932491e-194
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "Unconditional MLE & normal approximation (Wald) CI"

RR của one year so với month-to-month có giá trị là 0.26 và nằm trong khoảng 0.23 - 0.31 với độ tin cậy 95%, điều này cho thấy tỷ lệ dừng sử dụng dịch vụ của khách hàng có hạn hợp đồng là 1 năm thấp hơn 74% so với hàng tháng hay tỷ lệ dừng sử dụng dịch vụ của khách hàng có hạn hợp đồng 1 năm chỉ bằng 0.26 lần so với hàng tháng. RR của two year so với month-to-month có giá trị là 0.06 và nằm trong khoảng 0.05 - 0.08 với độ tin cậy 95%, là một tỷ lệ rất thấp cho thấy rằng việc dừng sử dụng dịch vụ của những khách hàng có hạn hợp đồng 2 năm thấp hơn đến 94% so với những khách hàng hàng tháng hay việc dừng sử dụng dịch vụ của các khách hàng có hạn hợp đồng 2 năm chỉ bằng 0.06 lần so với những khách hàng có hạn hợp đồng hàng tháng.

Odds-Ratio - OR

oddsratio(contract_churn)
## $data
##                 
##                    No  Yes Total
##   Month-to-month 2220 1655  3875
##   One year       1307  166  1473
##   Two year       1647   48  1695
##   Total          5174 1869  7043
## 
## $measure
##                 odds ratio with 95% C.I.
##                    estimate      lower      upper
##   Month-to-month 1.00000000         NA         NA
##   One year       0.17052367 0.14292010 0.20231701
##   Two year       0.03923438 0.02887594 0.05203486
## 
## $p.value
##                 two-sided
##                  midp.exact  fisher.exact    chi.square
##   Month-to-month         NA            NA            NA
##   One year                0 1.189415e-117 3.529090e-104
##   Two year                0 1.102868e-247 3.932491e-194
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "median-unbiased estimate & mid-p exact CI"

So với nhóm hàng tháng, OR = 0.17 và nằm trong khoảng 0.14 - 0.2 với độ tin cậy 95% cho thấy tỷ lệ rời bỏ của nhóm hàng năm thấp hơn 0.17 so với hàng tháng. Còn đối với nhóm 2 năm, khi OR = 0.03 và nằm trong khoảng 0.02 - 0.05 với độ tin cậy 95% cho thấy tỷ số lệ rời bỏ của nhóm 2 năm càng thấp hơn khi chỉ bằng 0.03 lần so với nhóm hàng tháng.

4.1.4 PaymentMethodChurn

Bảng tần số chéo

pm_churn <- table(tcc$PaymentMethod,tcc$Churn)
pm_churn
##                            
##                               No  Yes
##   Bank transfer (automatic) 1286  258
##   Credit card (automatic)   1290  232
##   Electronic check          1294 1071
##   Mailed check              1304  308

Biểu đồ

df_pm_churn <- as.data.frame(pm_churn)
colnames(df_pm_churn) <- c("Payment Method","Churn","Freq")
ggplot(df_pm_churn, aes(x = Churn, y = Freq, fill = `Payment Method`)) +
  geom_col(position = position_dodge()) +
  labs(title = 'Figure 9: Payment Method and Churn', x = 'Churn', y = 'Frequency') +
  scale_fill_brewer(palette = "Set2") +
  theme_minimal() +
    theme(axis.text.x = element_text(angle = 90, hjust = 1),
        plot.title = element_text(hjust = 0.5, face = "bold"))

Kiểm định Chi-bình phương

chisq.test(pm_churn)
## 
##  Pearson's Chi-squared test
## 
## data:  pm_churn
## X-squared = 648.14, df = 3, p-value < 2.2e-16

Nhận xét: PaymentMethod cho ra kết quả rằng ở phía chọn tiếp tục sử dụng dịch vụ thì các loại phương thức thanh toán đều không quá chênh lệch, nhưng ở bên rời bỏ, ta thấy phương thức electronic check - bill điện tử là phương thức cao nhất trong nhóm rời bỏ. Cụ thể ở nhóm chọn ở lại, các phương thức thanh toán đều không có quá nhiều chênh lệch với số lượng chuyển khoản, thẻ tín dụng, bill điện tử và bill qua thư lần lượt là 1286, 1290, 1294 và 1304. Trong khi đó ở nhóm rời bỏ thì lần lượt là 258, 232, 1071, 308 cho thấy séc điện tử là phương thức có tỷ lệ rời bỏ cao nhất.

Đặt giả thuyết:

\[ \left\{ \begin{array}{ll} H_0: & \text{Không có mối quan hệ giữa hai biến phân loại } \\ H_1: & \text{Có tồn tại mối quan hệ giữa hai biến phân loại } \end{array} \right. \]

Ta thấy p_value = 0.0000 < 5% nên bác bỏ H0, khi đó hai biến phân loại có tồn tại mối quan hệ. Ta tiến hành tình giá trị RR và OR của hai biến này như sau.

Relative Risk - RR

riskratio(pm_churn)
## $data
##                            
##                               No  Yes Total
##   Bank transfer (automatic) 1286  258  1544
##   Credit card (automatic)   1290  232  1522
##   Electronic check          1294 1071  2365
##   Mailed check              1304  308  1612
##   Total                     5174 1869  7043
## 
## $measure
##                            risk ratio with 95% C.I.
##                              estimate     lower    upper
##   Bank transfer (automatic) 1.0000000        NA       NA
##   Credit card (automatic)   0.9122228 0.7753344 1.073279
##   Electronic check          2.7101037 2.4040084 3.055173
##   Mailed check              1.1434397 0.9841985 1.328446
## 
## $p.value
##                            two-sided
##                             midp.exact fisher.exact   chi.square
##   Bank transfer (automatic)         NA           NA           NA
##   Credit card (automatic)    0.2683554 2.783795e-01 2.677952e-01
##   Electronic check           0.0000000 3.445894e-80 6.609560e-76
##   Mailed check               0.0795265 8.589995e-02 7.934142e-02
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "Unconditional MLE & normal approximation (Wald) CI"

So với nhóm chuyển khoản ngân hàng, nhóm thanh toán bằng thẻ tín dụng có RR = 0.9 và nằm trong khoảng 0.75 - 1.07 với độ tin cậy 95% cho thấy tỷ lệ mà khách hàng rời bỏ sử dụng thẻ tín dụng chỉ bằng 0.9 lần so với chuyển khoản và ít hơn 10%. Đối với nhóm bill điện tử với RR = 2.71 và nằm trong khoảng 2.4 - 3.05 với độ tin cậy 95% cho thấy tỷ lệ rời bỏ mà khách hàng sử dụng séc điện tử cao hơn rất nhiều, cao hơn 171% và gấp 2.71 lần so với nhóm tham chiếu là chuyển khoản ngân hàng. Cuối cùng là nhóm bill qua thư, với RR = 1.14 và nằm trong khoảng 0.98 - 1.33 với độ tin cậy 95% cho thấy được đối với nhóm chuyển khoản ngân hàng thì nhóm bill qua thư có tỷ lệ rời bỏ cao hơn 1.14 lần và 14%.

Odds-Ratio - OR

oddsratio(pm_churn)
## $data
##                            
##                               No  Yes Total
##   Bank transfer (automatic) 1286  258  1544
##   Credit card (automatic)   1290  232  1522
##   Electronic check          1294 1071  2365
##   Mailed check              1304  308  1612
##   Total                     5174 1869  7043
## 
## $measure
##                            odds ratio with 95% C.I.
##                             estimate    lower    upper
##   Bank transfer (automatic) 1.000000       NA       NA
##   Credit card (automatic)   0.896523 0.738563 1.087777
##   Electronic check          4.122501 3.530664 4.827030
##   Mailed check              1.177159 0.980964 1.413431
## 
## $p.value
##                            two-sided
##                             midp.exact fisher.exact   chi.square
##   Bank transfer (automatic)         NA           NA           NA
##   Credit card (automatic)    0.2683554 2.783795e-01 2.677952e-01
##   Electronic check           0.0000000 3.445894e-80 6.609560e-76
##   Mailed check               0.0795265 8.589995e-02 7.934142e-02
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "median-unbiased estimate & mid-p exact CI"

Với giá trị OR là 0.89 và nằm trong khoảng 0.73 - 1.09 ở độ tin cậy 95% so với chuyển khoản ngân hàng, ta thấy được tỷ lệ mà khách hàng sử dụng phương thức thẻ tín dụng rời bỏ so với ở lại bằng 0.89 lần so với chuyển khoản ngân hàng. Còn về bill điện tử, với OR = 4.12 và nằm trong khoảng 3.5 - 4.82 ở độ tin cậy 95% cho thấy được nhóm sử dụng bill điện tử có tỷ lệ rời bỏ so với ở lại cao gấp 4.12 lần so với chuyển khoản. Cuối cùng là bill qua thư với OR = 1.17 và nằm trong khoảng 0.98 - 1.41 cho thấy được nhóm sử dụng bill qua thư có tỷ lệ rời bỏ so với không rời bỏ cao gấp 1.17 lần so với chuyển khoản ngân hàng.

PHẦN 5: TỔNG KẾT VÀ THẢO LUẬN

5.1 Những phát hiện chính và đề xuất

Các yếu tố ảnh hưởng đến quyết định dừng sử dụng dịch vụ của khách hàng bao gồm yếu tố loại dịch vụ Internet mà khách hàng sử dụng, hợp đồng mà khách hàng đăng ký và phương thức thanh toán của khách hàng. Đầu tiên, về mặt dịch vụ Internet, ta có thể thấy tỷ lệ khách hàng rời bỏ công ty thường là những khách hàng đăng ký dịch vụ Fiber Optic. Do đó, có thể do công ty này đang có vấn đề với dịch vụ này, vì thế Fiber Optic là dịch vụ internet cần phải được cải thiện để giảm thiểu tỷ lệ rời khỏi của khách hàng. Tiếp đến, với thời hạn hợp đồng, tỷ lệ rời bỏ thường tập trung vào hạn hợp đồng hàng tháng, khi đó để giảm thiểu tỷ lệ rời bỏ, ta có thể tập trung vào việc phục vụ các gói có thời hạn 2 năm, 1 năm và cải thiện thêm các ưu đãi đối với gói hàng tháng. Cuối cùng là phương thức thanh toán, ta có thể thấy đa số khách hàng chọn dừng dịch vụ đa số đều dùng phương thức thanh toán là electric check. Vì thế để giảm thiểu được tỷ lệ rời bỏ, cần xem xét thêm về phương thức thanh toán này hoặc có thể thêm những ưu đãi khi thanh toán cho phương thức electric check để níu giữ chân của khách hàng.

5.3 Hạn chế của phân tích và hướng giải quyết

Phân tích này có những hạn chế như chưa có đủ đa dạng loại yếu tố ảnh hưởng đến quyết định rời bỏ của khách hàng. Điều này khiến phân tích chưa đủ mức tổng quát và chỉ phụ thuộc một vài yếu tố cơ bản. Vì thế, có thể kết hợp thêm nhiều yếu tố khác để làm phân tích trở nên tổng quát hơn.

LS0tDQp0aXRsZTogIkI1Ig0KYXV0aG9yOiAiTmd1eeG7hW4gVHLhuqduIEtow6FuaCBTYW4iDQpkYXRlOiAiMjAyNS0wNi0xNCINCm91dHB1dDogDQogIGh0bWxfZG9jdW1lbnQ6DQogICAgdG9jOiB0cnVlDQogICAgdG9jX2Zsb2F0OiB0cnVlDQogICAgY29kZV9mb2xkaW5nOiBoaWRlDQogICAgY29kZV9kb3dubG9hZDogdHJ1ZQ0KLS0tDQoNCmBgYHtjc3MsIGVjaG89RkFMU0V9DQpib2R5IHsNCiAgZm9udC1zaXplOiAxOHB4Ow0KfQ0KDQpoMSB7IGZvbnQtc2l6ZTogMi4yZW07IH0NCmgyIHsgZm9udC1zaXplOiAxLjhlbTsgfQ0KaDMgeyBmb250LXNpemU6IDEuNWVtOyB9DQoNCnAgew0KICBmb250LXNpemU6IDEuMWVtOw0KICBsaW5lLWhlaWdodDogMS42OyANCn0NCg0KY29kZSB7DQogIGZvbnQtc2l6ZTogMTZweDsNCn0NCmBgYA0KDQojICoqUEjhuqZOIDE6IENIVeG6qE4gQuG7iiBWw4AgVMOMTSBISeG7glUgROG7riBMSeG7hlUqKg0KDQojIyAqKjEuMSBOaOG6rXAgZOG7ryBsaeG7h3UqKg0KDQpgYGB7cn0NCmxpYnJhcnkocmVhZHhsKQ0KdGNjIDwtIHJlYWRfZXhjZWwoIkQ6L0JBSSBUQVAvUFRETERUL3RjYy54bHN4IikNCmBgYA0KDQojIyAqKjEuMiBUaMO0bmcgdGluIHbhu4EgYuG7mSBk4buvIGxp4buHdSoqDQoNCmB0Y2MueGxzeGAgbMOgIG3hu5l0IGLhu5kgZOG7ryBsaeG7h3UgbGnDqm4gcXVhbiDEkeG6v24gdmnhu4djIGto4bqjbyBzw6F0IG5odSBj4bqndSB0aeG6v3AgdOG7pWMgaGF5IGThu6tuZyBraMO0bmcgdGnhur9wIHThu6VjIHPhu60gZOG7pW5nIGThu4tjaCB24bulIGPhu6dhIG3hu5l0IGPDtG5nIHR5IGNodXnDqm4gY3VuZyBj4bqlcCBk4buLY2ggduG7pSB24buBIGLGsHUgY2jDrW5oIHZp4buFbiB0aMO0bmcuIELDqm4gZMaw4bubaSBsw6AgdGjDtG5nIHRpbiBjxqEgYuG6o24gY+G7p2EgYuG7mSBk4buvIGxp4buHdToNCg0KLSBDdXN0b21lcklEOiBNw6Mga2jDoWNoIGjDoG5nDQoNCi0gR2VuZGVyOiBHaeG7m2kgdMOtbmgNCg0KLSBJbnRlcm5ldFNlcnZpY2U6IEThu4tjaCB24bulIEludGVybmV0IMSRYW5nIHPhu60gZOG7pW5nIChCYW8gZ+G7k20gSW50ZXJuZXQgY8OhcCBxdWFuZyAtIEZpYmVyIG9wdGljIHbDoCDEkMaw4budbmcgZMOieSB0aHXDqiBiYW8gc+G7kSAtIERTTCkNCg0KLSBDb250cmFjdDogTG/huqFpIGjhu6NwIMSR4buTbmcgKEJhbyBn4buTbSBow6BuZyB0aMOhbmcsIGjDoG5nIG7Eg20gdsOgIDIgbsSDbSkNCg0KLSBQYXltZW50TWV0aG9kOiBQaMawxqFuZyB0aOG7qWMgdGhhbmggdG/DoW4gKEJhbyBn4buTbSBiaWxsIMSRaeG7h24gdOG7rSwgYmlsbCBxdWEgdGjGsCwgdGjhursgdMOtbiBk4bulbmcgdsOgIGNodXnhu4NuIGtob+G6o24pDQoNCi0gTW9udGhseUNoYXJnZXM6IFBow60gaMOgbmcgdGjDoW5nIChUw61uaCBi4bqxbmcgVVNEKQ0KDQotIENodXJuMSwgQ2h1cm46IFF1eeG6v3QgxJHhu4tuaCBuZ8awbmcgc+G7rSBk4bulbmcgZOG7i2NoIHbhu6UuICgxIGzDoCBZZXMgLSBOZ+G7q25nIHPhu60gZOG7pW5nLCAwIGzDoCBObyAtIFRp4bq/cCB04bulYyBz4butIGThu6VuZykNCg0KKipLaeG7g20gdHJhIGThu68gbGnhu4d1IGLhu4sgdGhp4bq/dToqKg0KDQpgYGB7cn0NCm5hIDwtIGlzLm5hKHRjYykNCnN1bShuYSkNCmBgYA0KS+G6v3QgcXXhuqMgY2hvIHRo4bqleSBraMO0bmcgY8OzIGdpw6EgdHLhu4sgbsOgbyBi4buLIHRy4buRbmcgdHJvbmcgYuG7mSBk4buvIGxp4buHdSBuw6B5Lg0KDQoqKkPhuqV1IHRyw7pjIGPhu6dhIGThu68gbGnhu4d1OioqDQoNCmBgYHtyfQ0Kc3RyKHRjYykNCmBgYA0KROG7ryBsaeG7h3UgbsOgeSBjw7MgOCBiaeG6v24sIGThu7FhIHRoZW8gYuG6o25nIGPhuqV1IHRyw7pjIG7DoHksIHRhIGPDsyB0aOG7gyBk4buFIGTDoG5nIHRo4bqleSDEkcaw4bujYyBuw7MgaGnhu4duIMSRYW5nIGPDsyA2IGJp4bq/biDEkeG7i25oIHTDrW5oIGJhbyBn4buTbSBgZ2VuZGVyYCwgYEludGVybmV0U2VydmljZWAsIGBDb250cmFjdGAsIGBQYXltZW50TWV0aG9kYCwgYENodXJuMWAgdsOgIGBDaHVybmAgY8OzIHRo4buDIGfhu5lwIGzDoG0gbeG7mXQuIOG7niDEkcOieSwgdGEgY2jhu41uIGJp4bq/biBgQ2h1cm5gIGzDoG0gYmnhur9uIHBo4bulIHRodeG7mWMgxJHhu4MgY8OzIHRo4buDIHhlbSB4w6l0IMSRxrDhu6NjIG5o4buvbmcgeeG6v3UgdOG7kSBuw6BvIOG6o25oIGjGsOG7n25nIMSR4bq/biBxdXnhur90IMSR4buLbmggZOG7q25nIHPhu60gZOG7pW5nIGThu4tjaCB24bulIGPhu6dhIGtow6FjaCBow6BuZy4NCg0KIyAqKlBI4bqmTiAyOiBQSMOCTiBUw41DSCBWw4AgTcOUIFThuqIgQ8OBQyBCSeG6vk4gxJDhu4pOSCBUw41OSCoqDQoNCiMjICoqMi4xIGBnZW5kZXJgKioNCg0KKioqVOG6p24gc+G7kSwgdOG6p24gc3XhuqV0KioqDQoNCmBgYHtyfQ0KIyBM4bqtcCBi4bqjbmcgdOG6p24gc+G7kQ0KZ2VuZGVyX2YgPC0gdGFibGUodGNjJGdlbmRlcikNCg0KIyBM4bqtcCBi4bqjbmcgdOG6p24gc3XhuqV0DQpnZW5kZXJfcCA8LSBwcm9wLnRhYmxlKGdlbmRlcl9mKSoxMDANCg0KIyBL4bq/dCBo4bujcCB0aMOgbmggbeG7mXQgYuG6o25nDQpnZW5kZXIgPC0gZGF0YS5mcmFtZSgNCiAgQ2F0ZWdvcnkgPSBuYW1lcyhnZW5kZXJfZiksDQogIEZyZXF1ZW5jeSA9IGFzLnZlY3RvcihnZW5kZXJfZiksDQogIFBlcmNlbnRhZ2UgPSByb3VuZChhcy52ZWN0b3IoZ2VuZGVyX3ApLCAyKQ0KKQ0KZ2VuZGVyDQpgYGANCg0KKioqQmnhu4N1IMSR4buTKioqDQoNCmBgYHtyIGluY2x1ZGU9RkFMU0V9DQpsaWJyYXJ5KGdncGxvdDIpDQpsaWJyYXJ5KHNjYWxlcykNCmBgYA0KDQpgYGB7cn0NCmdncGxvdChkYXRhID0gZ2VuZGVyLCBhZXMoeCA9ICcnLCB5ID0gRnJlcXVlbmN5LCBmaWxsID0gQ2F0ZWdvcnkpKSArDQogIGdlb21fY29sKCkgKw0KICBjb29yZF9wb2xhcigneScpICsNCiAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IHBlcmNlbnQoRnJlcXVlbmN5L2xlbmd0aCh0Y2MkZ2VuZGVyKSkpLCBwb3NpdGlvbiA9IHBvc2l0aW9uX3N0YWNrKHZqdXN0ID0gMC41KSkgKw0KICBsYWJzKHRpdGxlID0gJ0ZpZ3VyZSAxOiBHZW5kZXIgb2YgQ3VzdG9tZXJzJykgKw0KICBzY2FsZV9maWxsX2JyZXdlcihwYWxldHRlID0gIlNldDMiKSArDQogIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUsIGZhY2UgPSAnYm9sZCcpKSAgDQpgYGANCg0KKioqTmjhuq1uIHjDqXQ6KioqIFPhu5EgbMaw4bujbmcga2jDoWNoIGjDoG5nIGzDoCBuYW0gY2hp4bq/bSBraG/huqNuZyA1MC40OCUgdsOgIHPhu5EgbMaw4bujbmcga2jDoWNoIGjDoG5nIG7hu68gbMOgIDQ5LjUyJSBjaG8gdGjhuqV5IHLhurFuZyBz4buRIGzGsOG7o25nIGtow6FjaCBow6BuZyBuYW0gxJFhbmcgY8OzIHThu7cgbOG7hyBjYW8gaMahbiBz4buRIGtow6FjaCBow6BuZyBu4buvIG5oxrBuZyBz4buxIGNow6puaCBs4buHY2ggxJHDsyBsw6Aga2jDtG5nIMSRw6FuZyBr4buDLCBjaOG7iSBraG/huqNuZyBjaMawYSB04bubaSAxJS4NCg0KIyMgKioyLjIgYEludGVybmV0U2VydmljZWAqKg0KDQoqKipC4bqjbmcgdOG6p24gc+G7kSwgdOG6p24gc3XhuqV0KioqDQoNCmBgYHtyfQ0KIyBM4bqtcCBi4bqjbmcgdOG6p24gc+G7kQ0KaXNfZiA8LSB0YWJsZSh0Y2MkSW50ZXJuZXRTZXJ2aWNlKQ0KDQojIEzhuq1wIGLhuqNuZyB04bqnbiBzdeG6pXQNCmlzX3AgPC0gcHJvcC50YWJsZShpc19mKSoxMDANCg0KIyBL4bq/dCBo4bujcCB0aMOgbmggbeG7mXQgYuG6o25nDQppcyA8LSBkYXRhLmZyYW1lKA0KICBDYXRlZ29yeSA9IG5hbWVzKGlzX2YpLA0KICBGcmVxdWVuY3kgPSBhcy52ZWN0b3IoaXNfZiksDQogIFBlcmNlbnRhZ2UgPSByb3VuZChhcy52ZWN0b3IoaXNfcCksIDIpDQopDQppcw0KYGBgDQoNCioqKkJp4buDdSDEkeG7kyoqKg0KDQpgYGB7cn0NCmdncGxvdChkYXRhID0gaXMsIGFlcyh4ID0gJycsIHkgPSBGcmVxdWVuY3ksIGZpbGwgPSBDYXRlZ29yeSkpICsNCiAgZ2VvbV9jb2woKSArDQogIGNvb3JkX3BvbGFyKCd5JykgKw0KICBnZW9tX3RleHQoYWVzKGxhYmVsID0gcGVyY2VudChGcmVxdWVuY3kvbGVuZ3RoKHRjYyRnZW5kZXIpKSksIHBvc2l0aW9uID0gcG9zaXRpb25fc3RhY2sodmp1c3QgPSAwLjUpKSArDQogIGxhYnModGl0bGUgPSAnRmlndXJlIDI6IEludGVybmV0IFNlcnZpY2Ugb2YgQ3VzdG9tZXJzJykgKw0KICBzY2FsZV9maWxsX2JyZXdlcihwYWxldHRlID0gIlNldDMiKSArDQogIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUsIGZhY2UgPSAnYm9sZCcpKSAgDQpgYGANCg0KKioqTmjhuq1uIHjDqXQ6KioqIMSQYSBz4buRIGtow6FjaCBow6BuZyBjaOG7jW4gc+G7rSBk4bulbmcgY8OhcCBxdWFuZyAoRmliZXIgb3B0aWMpIHbhu5tpIHThu7cgbOG7hyBjaGnhur9tIGfhuqduIG7hu61hICh+NDAlKSwgRFNMIGNoaeG6v20gdOG7tyBs4buHIGNhbyB0aOG7qSBoYWkgduG7m2kgMzQuNCUgdsOgIGtow7RuZyBz4butIGThu6VuZyBpbnRlcm5ldCBsw6AgMjEuNyUuDQoNCiMjICoqMi4zIGBDb250cmFjdGAqKg0KDQoqKipC4bqjbmcgdOG6p24gc+G7kSwgdOG6p24gc3XhuqV0KioqDQoNCmBgYHtyfQ0KIyBM4bqtcCBi4bqjbmcgdOG6p24gc+G7kQ0KY29fZiA8LSB0YWJsZSh0Y2MkQ29udHJhY3QpDQoNCiMgTOG6rXAgYuG6o25nIHThuqduIHN14bqldA0KY29fcCA8LSBwcm9wLnRhYmxlKGNvX2YpKjEwMA0KDQojIEvhur90IGjhu6NwIHRow6BuaCBt4buZdCBi4bqjbmcNCmNvbnRyYWN0IDwtIGRhdGEuZnJhbWUoDQogIENhdGVnb3J5ID0gbmFtZXMoY29fZiksDQogIEZyZXF1ZW5jeSA9IGFzLnZlY3Rvcihjb19mKSwNCiAgUGVyY2VudGFnZSA9IHJvdW5kKGFzLnZlY3Rvcihjb19wKSwgMikNCikNCmNvbnRyYWN0DQpgYGANCg0KKioqQmnhu4N1IMSR4buTKioqDQoNCmBgYHtyfQ0KZ2dwbG90KGRhdGEgPSBjb250cmFjdCwgYWVzKHggPSAnJywgeSA9IEZyZXF1ZW5jeSwgZmlsbCA9IENhdGVnb3J5KSkgKw0KICBnZW9tX2NvbCgpICsNCiAgY29vcmRfcG9sYXIoJ3knKSArDQogIGdlb21fdGV4dChhZXMobGFiZWwgPSBwZXJjZW50KEZyZXF1ZW5jeS9sZW5ndGgodGNjJGdlbmRlcikpKSwgcG9zaXRpb24gPSBwb3NpdGlvbl9zdGFjayh2anVzdCA9IDAuNSkpICsNCiAgbGFicyh0aXRsZSA9ICdGaWd1cmUgMzogQ29udHJhY3Qgb2YgQ3VzdG9tZXJzJykgKw0KICBzY2FsZV9maWxsX2JyZXdlcihwYWxldHRlID0gIlNldDMiKSArDQogIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUsIGZhY2UgPSAnYm9sZCcpKSAgDQpgYGANCioqKk5o4bqtbiB4w6l0OioqKiDEkGEgc+G7kSBraMOhY2ggaMOgbmcgc+G7rSBk4bulbmcgbG/huqFpIGjhu6NwIMSR4buTbmcgaMOgbmcgdGjDoW5nIChNb250aC10by1tb250aCl24bubaSB04bu3IGzhu4cgcuG6pXQgY2FvIGzDoCA1NSUuIFPhu5EgY8OybiBs4bqhaSBz4butIGThu6VuZyBo4bujcCDEkeG7k25nIDIgbsSDbSB24bubaSAyNC4xJSB2w6AgMSBuxINtIHbhu5tpIDIwLjklLg0KDQojIyAqKjIuNCBgUGF5bWVudE1ldGhvZGAqKg0KDQoqKipC4bqjbmcgdOG6p24gc+G7kSwgdOG6p24gc3XhuqV0KioqDQoNCmBgYHtyfQ0KIyBM4bqtcCBi4bqjbmcgdOG6p24gc+G7kQ0KcG1fZiA8LSB0YWJsZSh0Y2MkUGF5bWVudE1ldGhvZCkNCg0KIyBM4bqtcCBi4bqjbmcgdOG6p24gc3XhuqV0DQpwbV9wIDwtIHByb3AudGFibGUocG1fZikqMTAwDQoNCiMgS+G6v3QgaOG7o3AgdGjDoG5oIG3hu5l0IGLhuqNuZw0KcG0gPC0gZGF0YS5mcmFtZSgNCiAgQ2F0ZWdvcnkgPSBuYW1lcyhwbV9mKSwNCiAgRnJlcXVlbmN5ID0gYXMudmVjdG9yKHBtX2YpLA0KICBQZXJjZW50YWdlID0gcm91bmQoYXMudmVjdG9yKHBtX3ApLCAyKQ0KKQ0KcG0NCmBgYA0KDQoqKipCaeG7g3UgxJHhu5MqKioNCg0KYGBge3J9DQpnZ3Bsb3QoZGF0YSA9IHBtLCBhZXMoeCA9ICcnLCB5ID0gRnJlcXVlbmN5LCBmaWxsID0gQ2F0ZWdvcnkpKSArDQogIGdlb21fY29sKCkgKw0KICBjb29yZF9wb2xhcigneScpICsNCiAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IHBlcmNlbnQoRnJlcXVlbmN5L2xlbmd0aCh0Y2MkZ2VuZGVyKSkpLCBwb3NpdGlvbiA9IHBvc2l0aW9uX3N0YWNrKHZqdXN0ID0gMC41KSkgKw0KICBsYWJzKHRpdGxlID0gJ0ZpZ3VyZSA0OiBQYXltZW50IE1ldGhvZCBvZiBDdXN0b21lcnMnKSArDQogIHNjYWxlX2ZpbGxfYnJld2VyKHBhbGV0dGUgPSAiU2V0MyIpICsNCiAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSwgZmFjZSA9ICdib2xkJykpICANCmBgYA0KDQoqKipOaOG6rW4geMOpdDoqKiogQ8OhYyBwaMawxqFuZyB0aOG7qWMgdGhhbmggdG/DoW4gxJFhIHBo4bqnbiBsw6Aga2jDtG5nIGPDsyBxdcOhIG5oaeG7gXUgc+G7sSBjaMOqbmggbOG7h2NoLCBFbGVjdHJvbmljIGNoZWNrIGNoaeG6v20gdOG7tyBs4buHIGNhbyBuaOG6pXQgduG7m2kgMzMuNTglLCBNYWlsZWQgY2hlY2sgxJHhu6luZyB0aOG7qSBoYWkgduG7m2kgMjIuODklLCBCYW5rIHRyYW5zZmVyIMSR4bupbmcgdGjhu6kgMyB24bubaSAyMS45MiUgdsOgIENyZWRpdCBjYXJkIMSR4bupbmcgY3Xhu5FpIHbhu5tpIDIxLjYxJS4gVGjhuq10IG5n4bqhYyBuaGnDqm4ga2hpIGPDoWMgcGjGsMahbmcgdGjhu6ljIHRoYW5oIHRvw6FuIGThuqFuZyB04buxIMSR4buZbmcgdHLhu6sgdGnhu4FuIChhdXRvbWF0aWMpbOG6oWkgw610IMSRxrDhu6NjIMawYSBjaHXhu5luZyBoxqFuIHNvIHbhu5tpIGPDoWMgcGjGsMahbmcgdGjhu6ljIHRydXnhu4FuIHRo4buRbmcgbmjGsCBiaWxsIHF1YSBtYWlsIGhheSBiaWxsIMSRaeG7h24gdOG7rS4NCg0KIyMgKioyLjUgYENodXJuYCoqDQoNCioqKlThuqduIHPhu5EsIHThuqduIHN14bqldCoqKg0KDQpgYGB7cn0NCiMgTOG6rXAgYuG6o25nIHThuqduIHPhu5ENCmNoX2YgPC0gdGFibGUodGNjJENodXJuKQ0KDQojIEzhuq1wIGLhuqNuZyB04bqnbiBzdeG6pXQNCmNoX3AgPC0gcHJvcC50YWJsZShjaF9mKSoxMDANCg0KIyBL4bq/dCBo4bujcCB0aMOgbmggbeG7mXQgYuG6o25nDQpjaHVybiA8LSBkYXRhLmZyYW1lKA0KICBDYXRlZ29yeSA9IG5hbWVzKGNoX2YpLA0KICBGcmVxdWVuY3kgPSBhcy52ZWN0b3IoY2hfZiksDQogIFBlcmNlbnRhZ2UgPSByb3VuZChhcy52ZWN0b3IoY2hfcCksIDIpDQopDQpjaHVybg0KYGBgDQoNCioqKkJp4buDdSDEkeG7kyoqKg0KDQpgYGB7cn0NCmdncGxvdChkYXRhID0gY2h1cm4sIGFlcyh4ID0gJycsIHkgPSBGcmVxdWVuY3ksIGZpbGwgPSBDYXRlZ29yeSkpICsNCiAgZ2VvbV9jb2woKSArDQogIGNvb3JkX3BvbGFyKCd5JykgKw0KICBnZW9tX3RleHQoYWVzKGxhYmVsID0gcGVyY2VudChGcmVxdWVuY3kvbGVuZ3RoKHRjYyRnZW5kZXIpKSksIHBvc2l0aW9uID0gcG9zaXRpb25fc3RhY2sodmp1c3QgPSAwLjUpKSArDQogIGxhYnModGl0bGUgPSAnRmlndXJlIDU6IENodXJuIG9mIEN1c3RvbWVycycpICsNCiAgc2NhbGVfZmlsbF9icmV3ZXIocGFsZXR0ZSA9ICJTZXQzIikgKw0KICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41LCBmYWNlID0gJ2JvbGQnKSkgIA0KYGBgDQoNCioqKk5o4bqtbiB4w6l0OioqKiDEkGEgc+G7kSBraMOhY2ggaMOgbmcgY2jhu41uIHRp4bq/cCB04bulYyBz4butIGThu6VuZyBk4buLY2ggduG7pSAoNzMlKSB2w6AgY2jhu4kgY8OzIDI3JSBraMOhY2ggaMOgbmcgcXV54bq/dCDEkeG7i25oIG5n4burbmcgc+G7rSBk4bulbmcgZOG7i2NoIHbhu6UuDQoNCiMgKipQSOG6pk4gMzogxq/hu5pDIEzGr+G7ok5HIEtIT+G6ok5HIFbDgCBLSeG7gk0gxJDhu4pOSCBHSeG6oiBUSFVZ4bq+VCBDSE8gVOG7tiBM4buGKioNCg0KVHJvbmcgdGjhu5FuZyBrw6ogc3V5IGRp4buFbiwgdmnhu4djIMaw4bubYyBsxrDhu6NuZyBraG/huqNuZyB2w6Aga2nhu4NtIMSR4buLbmggZ2nhuqMgdGh1eeG6v3QgY2hvIHThu7cgbOG7hyBsw6AgbeG7mXQgYsaw4bubYyBxdWFuIHRy4buNbmcsIMSR4bq3YyBiaeG7h3QgbMOgIHRyb25nIHRyxrDhu51uZyBo4bujcCBtdeG7kW4gxJHGsGEgcmEga+G6v3QgbHXhuq1uIHbhu4EgcXXhuqduIHRo4buDIGThu7FhIHRyw6puIG3huqt1LiBLaGkga2jhuqNvIHPDoXQsIHRhIGNo4buJIGzhuqV5IG3hu5l0IG3huqt1IG5o4buPIHThu6sgcXXhuqduIHRo4buDIGzhu5tuLCBtw6AgbeG6q3UgxJHhuqFpIGRp4buHbiBjaG8gcXXhuqduIHRo4buDIG7Dqm4gdGEgY+G6p24gxrDhu5tjIGzGsOG7o25nIMSRxrDhu6NjIGtob+G6o25nIHRpbiBj4bqteSBjaG8gdOG7tyBs4buHIHRo4bqtdCBz4buxIGLDqm4gbmdvw6BpIHF14bqnbiB0aOG7gy4gTmdvw6BpIHJhIMaw4bubYyBsxrDhu6NuZyBraG/huqNuZyBjw7JuIMSRxrBhIHJhIMSRxrDhu6NjIG3hu5l0IGtob+G6o25nIHRpbiBj4bqteSB0aOG7gyBoaeG7h24gxJHhu5kgY2jDrW5oIHjDoWMgY+G7p2EgdOG7tyBs4buHLg0KDQojIyAqKjMuMSBgZ2VuZGVyYCoqDQoNCmBgYHtyfQ0KIyBT4buRIGzGsOG7o25nIGtow6FjaCBow6BuZyBu4buvDQpmbSA8LSBzdW0odGNjJGdlbmRlciA9PSAiRmVtYWxlIikNCiMgVOG7lW5nIHPhu5Ega2jDoWNoIGjDoG5nDQp0b3RhbCA8LSBsZW5ndGgodGNjJGdlbmRlcikNCiMgS2nhu4NtIMSR4buLbmggdOG7tyBs4buHDQpwcm9wLnRlc3QoZm0sIHRvdGFsLCBwID0gMC40OTUsIGNvbmYubGV2ZWwgPSAwLjk1KQ0KYGBgDQoNCsSQ4bq3dCBnaeG6oyB0aHV54bq/dDogDQokJA0KXGxlZnRcew0KXGJlZ2lue2FycmF5fXtsbH0NCkhfMDogJiBcdGV4dHtU4bu3IGzhu4cgdGjhu7FjIHPhu5Ega2jDoWNoIGjDoG5nIGzDoCBu4buvIH0gPSAwLjQ5NSBcXA0KSF8xOiAmIFx0ZXh0e1Thu7cgbOG7hyB0aOG7sWMgc+G7kSBraMOhY2ggaMOgbmcgbMOgIG7hu68gfSBcbmUgMC40OTUNClxlbmR7YXJyYXl9DQpccmlnaHQuDQokJA0KDQpUYSB0aOG6pXkgcuG6sW5nIHBfdmFsdWUgPSAwLjk3NjkgPiA1JSwgbmdoxKlhIGzDoCBraMO0bmcgY8OzIMSR4bunIGPGoSBz4bufIMSR4buDIGLDoWMgYuG7jyBIMC4gTmdoxKlhIGzDoCB0aOG7sWMgdOG6vyB04bu3IGzhu4cgc+G7kSBraMOhY2ggaMOgbmcgbuG7ryBsw6AgNDkuNSUsIG5nb8OgaSByYSwgdOG7tyBs4buHIGtow6FjaCBow6BuZyBu4buvIGPDsm4gxJHGsOG7o2MgxrDhu5tjIGzGsOG7o25nIGzDoCBu4bqxbSB0cm9uZyBraG/huqNuZyA0OC4zNS01MC43JSB24bubaSDEkeG7mSB0aW4gY+G6rXkgOTUlLg0KDQojIyAqKjMuMiBgQ2h1cm5gKioNCg0KYGBge3J9DQojIFPhu5EgbMaw4bujbmcgTm8NCmNvbnRpbnVlIDwtIHN1bSh0Y2MkQ2h1cm4gPT0gIk5vIikNCiMgVOG7lW5nIHPhu5Ega2jDoWNoIGjDoG5nDQp0b3RhbCA8LSBsZW5ndGgodGNjJGdlbmRlcikNCiMgS2nhu4NtIMSR4buLbmggdOG7tyBs4buHDQpwcm9wLnRlc3QoY29udGludWUsIHRvdGFsLCBwID0gMC43MywgY29uZi5sZXZlbCA9IDAuOTUpDQpgYGANCg0KxJDhurd0IGdp4bqjIHRodXnhur90OiANCiQkDQpcbGVmdFx7DQpcYmVnaW57YXJyYXl9e2xsfQ0KSF8wOiAmIFx0ZXh0e1Thu7cgbOG7hyB0aOG7sWMgc+G7kSBraMOhY2ggaMOgbmcgdGnhur9wIHThu6VjIHPhu60gZOG7pW5nIGThu4tjaCB24bulIH0gPSAwLjczIFxcDQpIXzE6ICYgXHRleHR7VOG7tyBs4buHIHRo4buxYyBz4buRIGtow6FjaCBow6BuZyB0aeG6v3AgdOG7pWMgc+G7rSBk4bulbmcgZOG7i2NoIHbhu6UgfSBcbmUgMC43Mw0KXGVuZHthcnJheX0NClxyaWdodC4NCiQkDQoNClRhIHRo4bqleSBy4bqxbmcgcF92YWx1ZSA9IDAuMzg4OCA+IDUlLCBuZ2jEqWEgbMOgIGtow7RuZyBjw7MgxJHhu6cgY8ahIHPhu58gxJHhu4MgYsOhYyBi4buPIEgwLiBOZ2jEqWEgbMOgIHRo4buxYyB04bq/IHThu7cgbOG7hyBz4buRIGtow6FjaCBow6BuZyBjaOG7jW4gdGnhur9wIHThu6VjIHPhu60gZOG7pW5nIGThu4tjaCB24bulIGzDoCA3MyUsIG5nb8OgaSByYSwgdOG7tyBs4buHIGtow6FjaCBow6BuZyB0aeG6v3AgdOG7pWMgc+G7rSBk4bulbmcgZOG7i2NoIHbhu6UgY8OybiDEkcaw4bujYyDGsOG7m2MgbMaw4bujbmcgbMOgIG7hurFtIHRyb25nIGtob+G6o25nIDcyLjQxLTc0LjQ4JSB24bubaSDEkeG7mSB0aW4gY+G6rXkgOTUlLg0KDQojICoqUEjhuqZOIDQ6IFBIw4JOIFTDjUNIIE3hu5BJIFFVQU4gSOG7hiBD4bumQSBDw4FDIEJJ4bq+TioqDQoNCiMjICoqNC4xIEJp4bq/biBwaOG7pSB0aHXhu5ljIGBDaHVybmAqKg0KDQojIyMgKio0LjEuMSBgZ2VuZGVyYCB2w6AgYENodXJuYCoqDQoNCioqKkLhuqNuZyB04bqnbiBz4buRIGNow6lvKioqDQoNCmBgYHtyfQ0KZ2VuZGVyX2NodXJuIDwtIHRhYmxlKHRjYyRnZW5kZXIsdGNjJENodXJuKQ0KZ2VuZGVyX2NodXJuDQpgYGANCg0KKioqQmnhu4N1IMSR4buTKioqDQoNCmBgYHtyfQ0KZGZfZ2VuZGVyX2NodXJuIDwtIGFzLmRhdGEuZnJhbWUoZ2VuZGVyX2NodXJuKQ0KY29sbmFtZXMoZGZfZ2VuZGVyX2NodXJuKSA8LSBjKCJHZW5kZXIiLCJDaHVybiIsIkZyZXEiKQ0KZ2dwbG90KGRmX2dlbmRlcl9jaHVybiwgYWVzKHggPSBDaHVybiwgeSA9IEZyZXEsIGZpbGwgPSBHZW5kZXIpKSArDQogIGdlb21fY29sKHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2UoKSkgKw0KICBsYWJzKHRpdGxlID0gJ0ZpZ3VyZSA2OiBHZW5kZXIgYW5kIENodXJuJywgeCA9ICdDaHVybicsIHkgPSAnRnJlcXVlbmN5JykgKw0KICBzY2FsZV9maWxsX2JyZXdlcihwYWxldHRlID0gIlNldDIiKSArDQogIHRoZW1lX21pbmltYWwoKSArDQogICAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCwgaGp1c3QgPSAxKSwNCiAgICAgICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSwgZmFjZSA9ICJib2xkIikpDQpgYGANCg0KKioqS2nhu4NtIMSR4buLbmggQ2hpLWLDrG5oIHBoxrDGoW5nKioqDQoNCmBgYHtyfQ0KY2hpc3EudGVzdChnZW5kZXJfY2h1cm4pDQpgYGANCioqKk5o4bqtbiB4w6l0OioqKiBOaMOsbiBzxqEgcXVhIGJp4buDdSDEkeG7kyB2w6AgYuG6o25nIHThuqduIHPhu5EgY2jDqW8sIHRhIGPDsyB0aOG7gyB0aOG6pXkgxJHGsOG7o2MgdOG7tyBs4buHIGtow6FjaCBow6BuZyBuYW0sIG7hu68gdHJvbmcgbmjDs20gcuG7nWkgYuG7jyB2w6AgdGnhur9wIHThu6VjIGtow7RuZyBxdcOhIGNow6puaCBs4buHY2ggbmhhdS4g4bueIG5ow7NtIHRp4bq/cCB04bulYyBz4butIGThu6VuZywgc+G7kSBsxrDhu6NuZyBu4buvLCBuYW0gbOG6p24gbMaw4bujdCBsw6AgMjU0OSB2w6AgMjYyNSBjw7JuIG5ow7NtIHLhu51pIGLhu48gbOG6p24gbMaw4bujdCBsw6AgOTM5IHbDoCA5MzAuDQoNCsSQ4bq3dCBnaeG6oyB0aHV54bq/dDogDQokJA0KXGxlZnRcew0KXGJlZ2lue2FycmF5fXtsbH0NCkhfMDogJiBcdGV4dHtLaMO0bmcgY8OzIG3hu5FpIHF1YW4gaOG7hyBnaeG7r2EgZ2nhu5tpIHTDrW5oIHbDoCBxdXnhur90IMSR4buLbmggcuG7nWkgYuG7jyB9IFxcDQpIXzE6ICYgXHRleHR7Q8OzIHThu5NuIHThuqFpIG3hu5FpIHF1YW4gaOG7hyBnaeG7r2EgZ2nhu5tpIHTDrW5oIHbDoCBxdXnhur90IMSR4buLbmggcuG7nWkgYuG7jyB9DQpcZW5ke2FycmF5fQ0KXHJpZ2h0Lg0KJCQNCg0KVGEgdGjhuqV5IGdpw6EgdHLhu4sgcF92YWx1ZSA9IDAuNDg2NiA+IDUlLCBuZ2jEqWEgbMOgIGtow7RuZyDEkeG7pyBjxqEgc+G7nyDEkeG7gyBiw6FjIGLhu48gSDAuIFbhuq15IGtow7RuZyBjw7MgbeG7kWkgcXVhbiBo4buHIG7DoG8gZ2nhu69hIGBnZW5kZXJgIHbDoCBgQ2h1cm5gLiANCg0KKioqUmVsYXRpdmUgUmlzayAtIFJSKioqDQoNCmBgYHtyfQ0KbGlicmFyeShlcGl0b29scykNCnJpc2tyYXRpbyhnZW5kZXJfY2h1cm4pDQpgYGANCg0KVOG7tyBs4buHIGtow6FjaCBow6BuZyBk4burbmcgc+G7rSBk4bulbmcgZOG7i2NoIHbhu6UgY+G7p2EgZ2nhu5tpIHTDrW5oIG5hbSB2w6AgZ2nhu5tpIHTDrW5oIG7hu68ga2jDtG5nIHF1w6EgY2jDqm5oIGzhu4djaC4gQ+G7pSB0aOG7gyB0YSB0aOG6pXkgc28gduG7m2kgbuG7rywgdOG7tyBs4buHIGThu6tuZyBz4butIGThu6VuZyBk4buLY2ggduG7pSBj4bunYSBraMOhY2ggbmFtIGNo4buJIGLhurFuZyAwLjk3IHRyb25nIGtob+G6o25nIDAuODktMS4wNSB24bubaSDEkeG7mSB0aW4gY+G6rXkgOTUlIGNobyB0aOG6pXkgc+G7kSBraMOhY2ggbmFtIGThu6tuZyBz4butIGThu6VuZyBk4buLY2ggduG7pSB0aOG6pXAgaMahbiBz4buRIGtow6FjaCBu4buvIGzDoCAzJSB2w6AgdGjhuqVwIGjGoW4gMC45NyBs4bqnbi4NCg0KKioqT2RkcyBSYXRpbyAtIE9SKioqDQoNCmBgYHtyfQ0Kb2Rkc3JhdGlvKGdlbmRlcl9jaHVybikNCmBgYA0KDQpUxrDGoW5nIHThu7EsIHRhIHRo4bqleSB04bu3IHPhu5EgY2jDqm5oIGPhu6dhIGtow6FjaCBow6BuZyBuYW0gcXV54bq/dCDEkeG7i25oIGThu6tuZyBz4butIGThu6VuZyBk4buLY2ggduG7pSBzbyB24bubaSBz4buRIGtow6FjaCBow6BuZyBu4buvIGzDoCAwLjk2IHbDoCBu4bqxbSB0cm9uZyBraG/huqNuZyAwLjg2LTEuMDcgduG7m2kgxJHhu5kgdGluIGPhuq15IDk1JS4gTmdoxKlhIGzDoCB04bu3IHPhu5EgY2jDqm5oIGPhu6dhIGtow6FjaCBow6BuZyBuYW0gZOG7q25nIHPhu60gZOG7pW5nIGThu4tjaCB24bulIGLhurFuZyAwLjk2IGzhuqduIHThu7cgc+G7kSBjaMOqbmggY+G7p2Ega2jDoWNoIGjDoG5nIGzDoCBu4buvLg0KDQojIyMgKio0LjEuMiBgSW50ZXJuZXRTZXJ2aWNlYCB2w6AgYENodXJuYCoqDQoNCioqKkLhuqNuZyB04bqnbiBz4buRIGNow6lvKioqDQoNCmBgYHtyfQ0KaXNfY2h1cm4gPC0gdGFibGUodGNjJEludGVybmV0U2VydmljZSx0Y2MkQ2h1cm4pDQppc19jaHVybg0KYGBgDQoNCioqKkJp4buDdSDEkeG7kyoqKg0KDQpgYGB7cn0NCmRmX2lzX2NodXJuIDwtIGFzLmRhdGEuZnJhbWUoaXNfY2h1cm4pDQpjb2xuYW1lcyhkZl9pc19jaHVybikgPC0gYygiSW50ZXJuZXQgU2VydmljZSIsIkNodXJuIiwiRnJlcSIpDQpnZ3Bsb3QoZGZfaXNfY2h1cm4sIGFlcyh4ID0gQ2h1cm4sIHkgPSBGcmVxLCBmaWxsID0gYEludGVybmV0IFNlcnZpY2VgKSkgKw0KICBnZW9tX2NvbChwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKCkpICsNCiAgbGFicyh0aXRsZSA9ICdGaWd1cmUgNzogSW50ZXJuZXQgU2VydmljZSBhbmQgQ2h1cm4nLCB4ID0gJ0NodXJuJywgeSA9ICdGcmVxdWVuY3knKSArDQogIHNjYWxlX2ZpbGxfYnJld2VyKHBhbGV0dGUgPSAiU2V0MiIpICsNCiAgdGhlbWVfbWluaW1hbCgpICsNCiAgICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwLCBoanVzdCA9IDEpLA0KICAgICAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41LCBmYWNlID0gImJvbGQiKSkNCmBgYA0KDQoqKipLaeG7g20gxJHhu4tuaCBDaGktYsOsbmggcGjGsMahbmcqKioNCg0KYGBge3J9DQpjaGlzcS50ZXN0KGlzX2NodXJuKQ0KYGBgDQoqKipOaOG6rW4geMOpdDoqKiogVOG7qyBiaeG7g3UgxJHhu5MgxJHDoyB0aOG7gyBoaeG7h24gcsO1IHLDoG5nIMSRxrDhu6NjIHPhu7Ega2jDoWMgYmnhu4d0IGPhu6dhIGhhaSB54bq/dSB04buRLiBD4bulIHRo4buDIGzDoCDhu58gbmjDs20gdGnhur9wIHThu6VjIHPhu60gZOG7pW5nIHRow6wgc+G7kSBk4buLY2ggduG7pSBGaWJlciBvcHRpYywgRFNMIHbDoCBObyBs4bqnbiBsxrDhu6N0IGzDoCAgMTk2MiwgMTc5OSB2w6AgMTQxMywgxJHDonkgbMOgIG3hu5l0IHThu7cgbOG7hyBraMOhIGNow6puaCBs4buHY2ggdsOgIOG7nyBuaMOzbSBy4budaSBi4buPIHRow6wgc+G7kSBk4buLY2ggduG7pSDEkcOzIGzhuqduIGzGsOG7o3QgbMOgIDQ1OSwgMTI5NyB2w6AgMTEzLiBUYSBjw7MgdGjhu4MgdGjhuqV5IG5ow7NtIGNo4buNbiBk4burbmcgc+G7rSBk4bulbmcgZOG7i2NoIHbhu6UgY8OzIHThu7cgbOG7hyBz4butIGThu6VuZyBGaWJlciBvcHRpYyBy4bqldCBjYW8sIGRvIMSRw7MgYEludGVybmV0U2VydmljZWAgY8OzIGto4bqjIG7Eg25nIGzDoCBjw7Mg4bqjbmggaMaw4bufbmcgbMOqbiBgQ2h1cm5gIFRhIHRp4bq/biBow6BuaCBraeG7g20gxJHhu4tuaCBDaGktYsOsbmggcGjGsMahbmcuIA0KDQrEkOG6t3QgZ2nhuqMgdGh1eeG6v3Q6DQokJA0KXGxlZnRcew0KXGJlZ2lue2FycmF5fXtsbH0NCkhfMDogJiBcdGV4dHtLaMO0bmcgY8OzIG3hu5FpIHF1YW4gaOG7hyBnaeG7r2EgbG/huqFpIGThu4tjaCB24bulIEludGVybmV0IHbDoCBxdXnhur90IMSR4buLbmggcuG7nWkgYuG7jyB9IFxcDQpIXzE6ICYgXHRleHR7Q8OzIHThu5NuIHThuqFpIG3hu5FpIHF1YW4gaOG7hyBnaeG7r2EgbG/huqFpIGThu4tjaCB24bulIEludGVybmV0IHbDoCBxdXnhur90IMSR4buLbmggcuG7nWkgYuG7jyB9DQpcZW5ke2FycmF5fQ0KXHJpZ2h0Lg0KJCQNCg0KVGEgdGjhuqV5IGdpw6EgdHLhu4sgcF92YWx1ZSA9IDAuMDAwMCA8IDUlLCBuZ2jEqWEgbMOgIGLDoWMgYuG7jyBIMC4gVuG6rXkgY8OzIHThu5NuIHThuqFpIG3hu5FpIHF1YW4gaOG7hyBnaeG7r2EgYEludGVybmV0U2VydmljZWAgdsOgIGBDaHVybmAuIFbDrCB0aOG6vyB0YSB0aeG6v24gaMOgbmggdMOtbmggdG/DoW4gUmVsYXRpdmUgUmlzayB2w6AgT2RkcyBSYXRpby4NCg0KKioqUmVsYXRpdmUgUmlzayAtIFJSKioqDQoNCmBgYHtyfQ0Kcmlza3JhdGlvKGlzX2NodXJuKQ0KYGBgDQoNClbhu5tpIG5ow7NtIEZpYmVyIG9wdGljIHNvIHbhu5tpIERTTCwgdGEgY8OzIGdpw6EgdHLhu4sgUlIgPSAyLjIxIHbDoCBu4bqxbSB0cm9uZyBraG/huqNuZyAyLjAyLTIuNDIgduG7m2kgxJHhu5kgdGluIGPhuq15IDk1JSwgbmdoxKlhIGzDoCB04bu3IGzhu4cga2jDoWNoIGjDoG5nIHPhu60gZOG7pW5nIGThu4tjaCB24bulIEZpYmVyIG9wdGljIGPDsyB04bu3IGzhu4cgbmfGsG5nIHPhu60gZOG7pW5nIGThu4tjaCB24bulIGNhbyBoxqFuIGjhurNuIHNvIHbhu5tpIGPDoWMga2jDoWNoIGjDoG5nIGTDuW5nIERTTC4gQ+G7pSB0aOG7gywgbmjDs20gc+G7rSBk4bulbmcgRmliZXIgb3B0aWMgY8OzIHThu7cgbOG7hyBk4burbmcgc+G7rSBk4bulbmcgY2FvIGjGoW4gMTIxJSBzbyB24bubaSBuaMOzbSBEU0wgaGF5IHThu7cgbOG7hyBk4burbmcgc+G7rSBk4bulbmcgZOG7i2NoIHbhu6UgY+G7p2EgRmliZXIgb3B0aWMgZ+G6pXAgMi4yIGzhuqduIHNvIHbhu5tpIERTTC4gDQoNClbhu5tpIG5ow7NtIGtow7RuZyBkw7luZyBzbyB24bubaSBEU0wsIHRhIGPDsyBnacOhIHRy4buLIFJSID0gMC4zOSB2w6AgbuG6sW0gdHJvbmcga2hv4bqjbmcgMC4zMi0wLjQ3IHbhu5tpIMSR4buZIHRpbiBj4bqteSA5NSUsIG5naMSpYSBsw6AgdOG7tyBs4buHIGtow6FjaCBow6BuZyBraMO0bmcgZMO5bmcgZOG7i2NoIHbhu6UgY8OzIHThu7cgbOG7hyBuZ8awbmcgc+G7rSBk4bulbmcgZOG7i2NoIHbhu6UgdGjhuqVwIGjGoW4gc28gduG7m2kgY8OhYyBraMOhY2ggaMOgbmcgZMO5bmcgRFNMLiBD4bulIHRo4buDLCBuaMOzbSBraMO0bmcgZMO5bmcgaW50ZXJuZXQgY8OzIHThu7cgbOG7hyBk4burbmcgc+G7rSBk4bulbmcgdGjhuqVwIGjGoW4gc28gduG7m2kgbmjDs20gRFNMIGzDoCA2MSUgaGF5IHThu7cgbOG7hyBk4burbmcgc+G7rSBk4bulbmcgZOG7i2NoIHbhu6UgY+G7p2EgbmjDs20ga2jDtG5nIGTDuW5nIGludGVybmV0IGNo4buJIGLhurFuZyAwLjM5IGzhuqduIHNvIHbhu5tpIERTTC4NCg0KKioqT2Rkcy1SYXRpbyAtIE9SKioqDQoNCmBgYHtyfQ0Kb2Rkc3JhdGlvKGlzX2NodXJuKQ0KYGBgDQoNCuG7niBuaMOzbSBGaWJlciBvcHRpYywgZ2nDoSB0cuG7iyBPUiA9IDMuMDggdsOgIG7hurFtIHRyb25nIGtob+G6o25nIDIuNzItMy40OSB24bubaSDEkeG7mSB0aW4gY+G6rXkgOTUlIGNobyB0aOG6pXkgdmnhu4djIHThu7cgbOG7hyB2aeG7h2Mga2jDoWNoIGjDoG5nIHPhu60gZOG7pW5nIEZpYmVyIG9wdGljIHLhu51pIGLhu48gc28gduG7m2kga2jDtG5nIHLhu51pIGLhu48gY2FvIGjGoW4gZ+G6pXAgMyBs4bqnbiBzbyB24bubaSB04bu3IGzhu4cgbcOgIGtow6FjaCBow6BuZyBz4butIGThu6VuZyBEU0wuIEPDsm4g4bufIG5ow7NtIGtow7RuZyBz4butIGThu6VuZyBk4buLY2ggduG7pSwgZ2nDoSB0cuG7iyBPUiA9IDAuMzQgdsOgIG7hurFtIHRyb25nIGtob+G6o25nIDAuMjctMC40MiB24bubaSDEkeG7mSB0aW4gY+G6rXkgOTUlIGNobyB0aOG6pXkgdOG7tyBs4buHIG3DoCBraMOhY2ggaMOgbmcga2jDtG5nIHPhu60gZOG7pW5nIGThu4tjaCB24bulIHLhu51pIGLhu48gc28gduG7m2kga2jDtG5nIHLhu51pIGLhu48gw610IGjGoW4gMC4zNCBs4bqnbiBzbyB24bubaSB04bu3IGzhu4cgbcOgIGtow6FjaCBow6BuZyBkw7luZyBEU0wgcuG7nWkgYuG7jy4NCg0KIyMjICoqNC4xLjMgYENvbnRyYWN0YCB2w6AgYENodXJuYCoqDQoNCioqKkLhuqNuZyB04bqnbiBz4buRIGNow6lvKioqDQoNCmBgYHtyfQ0KY29udHJhY3RfY2h1cm4gPC0gdGFibGUodGNjJENvbnRyYWN0LHRjYyRDaHVybikNCmNvbnRyYWN0X2NodXJuDQpgYGANCg0KDQoqKipCaeG7g3UgxJHhu5MqKioNCg0KYGBge3J9DQpkZl9jb250cmFjdF9jaHVybiA8LSBhcy5kYXRhLmZyYW1lKGNvbnRyYWN0X2NodXJuKQ0KY29sbmFtZXMoZGZfY29udHJhY3RfY2h1cm4pIDwtIGMoIkNvbnRyYWN0IiwiQ2h1cm4iLCJGcmVxIikNCmdncGxvdChkZl9jb250cmFjdF9jaHVybiwgYWVzKHggPSBDaHVybiwgeSA9IEZyZXEsIGZpbGwgPSBDb250cmFjdCkpICsNCiAgZ2VvbV9jb2wocG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSgpKSArDQogIGxhYnModGl0bGUgPSAnRmlndXJlIDg6IENvbnRyYWN0IGFuZCBDaHVybicsIHggPSAnQ2h1cm4nLCB5ID0gJ0ZyZXF1ZW5jeScpICsNCiAgc2NhbGVfZmlsbF9icmV3ZXIocGFsZXR0ZSA9ICJTZXQyIikgKw0KICB0aGVtZV9taW5pbWFsKCkgKw0KICAgIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTAsIGhqdXN0ID0gMSksDQogICAgICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUsIGZhY2UgPSAiYm9sZCIpKQ0KYGBgDQoNCioqKktp4buDbSDEkeG7i25oIENoaS1iw6xuaCBwaMawxqFuZyoqKg0KDQpgYGB7cn0NCmNoaXNxLnRlc3QoY29udHJhY3RfY2h1cm4pDQpgYGANCg0KKioqTmjhuq1uIHjDqXQ6KioqIFThu6sgYmnhu4N1IMSR4buTLCB0YSBjw7MgdGjhu4MgdGjhuqV5IMSRxrDhu6NjIGhhaSB54bq/dSB04buRIGPDsyBz4buxIGtow6FjIGJp4buHdCByw7UgcuG7h3QuIEPhu6UgdGjhu4Mgbmjhu69uZyBuZ8aw4budaSBjaOG7jW4gZOG7q25nIHPhu60gZOG7pW5nIGThu4tjaCB24bulIHRoxrDhu51uZyBjw7MgeHUgaMaw4bubbmcgbMOgIGjhu6NwIMSR4buTbmcgaMOgbmcgdGjDoW5nIHRyb25nIGtoaSBuaMOzbSB0aeG6v3AgdOG7pWMgc+G7rSBk4bulbmcgZOG7i2NoIHbhu6UgdGjDrCBwaMOibiBi4buRIMSR4buBdSBjw6FjIGjhuqFuIGjhu6NwIMSR4buTbmcuIOG7niBuaMOzbSB0aeG6v3AgdOG7pWMgc+G7rSBk4bulbmcsIGPDoWMgaOG6oW4gaOG7o3AgxJHhu5NuZyBow6BuZyB0aMOhbmcsIGjDoG5nIG7Eg20gdsOgIDIgbsSDbSBs4bqnbiBsxrDhu6N0IGzDoCAyMjIwLCAxMzA3IHbDoCAxNjQ3IHRyb25nIGtoaSDEkcOzIOG7nyBuaMOzbSBraMO0bmcgc+G7rSBk4bulbmcgbuG7r2EgdGjDrCBsw6AgMTY1NSwgMTY2LCA0OC4NCg0KxJDhurd0IGdp4bqjIHRodXnhur90Og0KJCQNClxsZWZ0XHsNClxiZWdpbnthcnJheX17bGx9DQpIXzA6ICYgXHRleHR7S2jDtG5nIGPDsyBt4buRaSBxdWFuIGjhu4cgZ2nhu69hIGjhuqFuIGjhu6NwIMSR4buTbmcgdsOgIHF1eeG6v3QgxJHhu4tuaCBy4budaSBi4buPIH0gXFwNCkhfMTogJiBcdGV4dHtDw7MgdOG7k24gdOG6oWkgbeG7kWkgcXVhbiBo4buHIGdp4buvYSBo4bqhbiBo4bujcCDEkeG7k25nIHbDoCBxdXnhur90IMSR4buLbmggcuG7nWkgYuG7jyB9DQpcZW5ke2FycmF5fQ0KXHJpZ2h0Lg0KJCQNCg0KVGEgdGjhuqV5IGdpw6EgdHLhu4sgcF92YWx1ZSA9IDAuMDAwMCA8IDUlLCBuZ2jEqWEgbMOgIGLDoWMgYuG7jyBIMC4gVuG6rXkgY8OzIG3hu5FpIHF1YW4gaOG7hyBnaeG7r2EgYENvbnRyYWN0YCB2w6AgYENodXJuYC4gVsOsIHRo4bq/IHRhIHRp4bq/biBow6BuaCB0w61uaCB0b8OhbiBSZWxhdGl2ZSBSaXNrIHbDoCBPZGRzIFJhdGlvLg0KDQoqKipSZWxhdGl2ZSBSaXNrIC0gUlIqKioNCg0KYGBge3J9DQpyaXNrcmF0aW8oY29udHJhY3RfY2h1cm4pDQpgYGANClJSIGPhu6dhIG9uZSB5ZWFyIHNvIHbhu5tpIG1vbnRoLXRvLW1vbnRoIGPDsyBnacOhIHRy4buLIGzDoCAwLjI2IHbDoCBu4bqxbSB0cm9uZyBraG/huqNuZyAwLjIzIC0gMC4zMSB24bubaSDEkeG7mSB0aW4gY+G6rXkgOTUlLCDEkWnhu4F1IG7DoHkgY2hvIHRo4bqleSB04bu3IGzhu4cgZOG7q25nIHPhu60gZOG7pW5nIGThu4tjaCB24bulIGPhu6dhIGtow6FjaCBow6BuZyBjw7MgaOG6oW4gaOG7o3AgxJHhu5NuZyBsw6AgMSBuxINtIHRo4bqlcCBoxqFuIDc0JSBzbyB24bubaSBow6BuZyB0aMOhbmcgaGF5IHThu7cgbOG7hyBk4burbmcgc+G7rSBk4bulbmcgZOG7i2NoIHbhu6UgY+G7p2Ega2jDoWNoIGjDoG5nIGPDsyBo4bqhbiBo4bujcCDEkeG7k25nIDEgbsSDbSBjaOG7iSBi4bqxbmcgMC4yNiBs4bqnbiBzbyB24bubaSBow6BuZyB0aMOhbmcuIFJSIGPhu6dhIHR3byB5ZWFyIHNvIHbhu5tpIG1vbnRoLXRvLW1vbnRoIGPDsyBnacOhIHRy4buLIGzDoCAwLjA2IHbDoCBu4bqxbSB0cm9uZyBraG/huqNuZyAwLjA1IC0gMC4wOCB24bubaSDEkeG7mSB0aW4gY+G6rXkgOTUlLCBsw6AgbeG7mXQgdOG7tyBs4buHIHLhuqV0IHRo4bqlcCBjaG8gdGjhuqV5IHLhurFuZyB2aeG7h2MgZOG7q25nIHPhu60gZOG7pW5nIGThu4tjaCB24bulIGPhu6dhIG5o4buvbmcga2jDoWNoIGjDoG5nIGPDsyBo4bqhbiBo4bujcCDEkeG7k25nIDIgbsSDbSB0aOG6pXAgaMahbiDEkeG6v24gOTQlIHNvIHbhu5tpIG5o4buvbmcga2jDoWNoIGjDoG5nIGjDoG5nIHRow6FuZyBoYXkgdmnhu4djIGThu6tuZyBz4butIGThu6VuZyBk4buLY2ggduG7pSBj4bunYSBjw6FjIGtow6FjaCBow6BuZyBjw7MgaOG6oW4gaOG7o3AgxJHhu5NuZyAyIG7Eg20gY2jhu4kgYuG6sW5nIDAuMDYgbOG6p24gc28gduG7m2kgbmjhu69uZyBraMOhY2ggaMOgbmcgY8OzIGjhuqFuIGjhu6NwIMSR4buTbmcgaMOgbmcgdGjDoW5nLg0KDQoqKipPZGRzLVJhdGlvIC0gT1IqKioNCg0KYGBge3J9DQpvZGRzcmF0aW8oY29udHJhY3RfY2h1cm4pDQpgYGANCg0KU28gduG7m2kgbmjDs20gaMOgbmcgdGjDoW5nLCBPUiA9IDAuMTcgdsOgIG7hurFtIHRyb25nIGtob+G6o25nIDAuMTQgLSAwLjIgduG7m2kgxJHhu5kgdGluIGPhuq15IDk1JSBjaG8gdGjhuqV5IHThu7cgbOG7hyBy4budaSBi4buPIGPhu6dhIG5ow7NtIGjDoG5nIG7Eg20gdGjhuqVwIGjGoW4gMC4xNyBzbyB24bubaSBow6BuZyB0aMOhbmcuIEPDsm4gxJHhu5FpIHbhu5tpIG5ow7NtIDIgbsSDbSwga2hpIE9SID0gMC4wMyB2w6AgbuG6sW0gdHJvbmcga2hv4bqjbmcgMC4wMiAtIDAuMDUgduG7m2kgxJHhu5kgdGluIGPhuq15IDk1JSBjaG8gdGjhuqV5IHThu7cgc+G7kSBs4buHIHLhu51pIGLhu48gY+G7p2EgbmjDs20gMiBuxINtIGPDoG5nIHRo4bqlcCBoxqFuIGtoaSBjaOG7iSBi4bqxbmcgMC4wMyBs4bqnbiBzbyB24bubaSBuaMOzbSBow6BuZyB0aMOhbmcuDQoNCiMjIyAqKjQuMS40IGBQYXltZW50TWV0aG9kYCB2w6AgYENodXJuYCoqDQoNCioqKkLhuqNuZyB04bqnbiBz4buRIGNow6lvKioqDQoNCmBgYHtyfQ0KcG1fY2h1cm4gPC0gdGFibGUodGNjJFBheW1lbnRNZXRob2QsdGNjJENodXJuKQ0KcG1fY2h1cm4NCmBgYA0KDQoqKipCaeG7g3UgxJHhu5MqKioNCg0KYGBge3J9DQpkZl9wbV9jaHVybiA8LSBhcy5kYXRhLmZyYW1lKHBtX2NodXJuKQ0KY29sbmFtZXMoZGZfcG1fY2h1cm4pIDwtIGMoIlBheW1lbnQgTWV0aG9kIiwiQ2h1cm4iLCJGcmVxIikNCmdncGxvdChkZl9wbV9jaHVybiwgYWVzKHggPSBDaHVybiwgeSA9IEZyZXEsIGZpbGwgPSBgUGF5bWVudCBNZXRob2RgKSkgKw0KICBnZW9tX2NvbChwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKCkpICsNCiAgbGFicyh0aXRsZSA9ICdGaWd1cmUgOTogUGF5bWVudCBNZXRob2QgYW5kIENodXJuJywgeCA9ICdDaHVybicsIHkgPSAnRnJlcXVlbmN5JykgKw0KICBzY2FsZV9maWxsX2JyZXdlcihwYWxldHRlID0gIlNldDIiKSArDQogIHRoZW1lX21pbmltYWwoKSArDQogICAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCwgaGp1c3QgPSAxKSwNCiAgICAgICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSwgZmFjZSA9ICJib2xkIikpDQpgYGANCg0KKioqS2nhu4NtIMSR4buLbmggQ2hpLWLDrG5oIHBoxrDGoW5nKioqDQoNCmBgYHtyfQ0KY2hpc3EudGVzdChwbV9jaHVybikNCmBgYA0KTmjhuq1uIHjDqXQ6IGBQYXltZW50TWV0aG9kYCBjaG8gcmEga+G6v3QgcXXhuqMgcuG6sW5nIOG7nyBwaMOtYSBjaOG7jW4gdGnhur9wIHThu6VjIHPhu60gZOG7pW5nIGThu4tjaCB24bulIHRow6wgY8OhYyBsb+G6oWkgcGjGsMahbmcgdGjhu6ljIHRoYW5oIHRvw6FuIMSR4buBdSBraMO0bmcgcXXDoSBjaMOqbmggbOG7h2NoLCBuaMawbmcg4bufIGLDqm4gcuG7nWkgYuG7jywgdGEgdGjhuqV5IHBoxrDGoW5nIHRo4bupYyBlbGVjdHJvbmljIGNoZWNrIC0gYmlsbCAgxJFp4buHbiB04butIGzDoCBwaMawxqFuZyB0aOG7qWMgY2FvIG5o4bqldCB0cm9uZyBuaMOzbSBy4budaSBi4buPLiBD4bulIHRo4buDIOG7nyBuaMOzbSBjaOG7jW4g4bufIGzhuqFpLCBjw6FjIHBoxrDGoW5nIHRo4bupYyB0aGFuaCB0b8OhbiDEkeG7gXUga2jDtG5nIGPDsyBxdcOhIG5oaeG7gXUgY2jDqm5oIGzhu4djaCB24bubaSBz4buRIGzGsOG7o25nIGNodXnhu4NuIGtob+G6o24sIHRo4bq7IHTDrW4gZOG7pW5nLCBiaWxsIMSRaeG7h24gdOG7rSB2w6AgYmlsbCBxdWEgdGjGsCBs4bqnbiBsxrDhu6N0IGzDoCAxMjg2LCAxMjkwLCAxMjk0IHbDoCAxMzA0LiBUcm9uZyBraGkgxJHDsyDhu58gbmjDs20gcuG7nWkgYuG7jyB0aMOsIGzhuqduIGzGsOG7o3QgbMOgIDI1OCwgMjMyLCAxMDcxLCAzMDggY2hvIHRo4bqleSBzw6ljIMSRaeG7h24gdOG7rSBsw6AgcGjGsMahbmcgdGjhu6ljIGPDsyB04bu3IGzhu4cgcuG7nWkgYuG7jyBjYW8gbmjhuqV0Lg0KDQrEkOG6t3QgZ2nhuqMgdGh1eeG6v3Q6DQoNCiQkDQpcbGVmdFx7DQpcYmVnaW57YXJyYXl9e2xsfQ0KSF8wOiAmIFx0ZXh0e0tow7RuZyBjw7MgbeG7kWkgcXVhbiBo4buHIGdp4buvYSBoYWkgYmnhur9uIHBow6JuIGxv4bqhaSB9IFxcDQpIXzE6ICYgXHRleHR7Q8OzIHThu5NuIHThuqFpIG3hu5FpIHF1YW4gaOG7hyBnaeG7r2EgaGFpIGJp4bq/biBwaMOibiBsb+G6oWkgfQ0KXGVuZHthcnJheX0NClxyaWdodC4NCiQkDQoNClRhIHRo4bqleSBwX3ZhbHVlID0gMC4wMDAwIDwgNSUgbsOqbiBiw6FjIGLhu48gSDAsIGtoaSDEkcOzIGhhaSBiaeG6v24gcGjDom4gbG/huqFpIGPDsyB04buTbiB04bqhaSBt4buRaSBxdWFuIGjhu4cuIFRhIHRp4bq/biBow6BuaCB0w6xuaCBnacOhIHRy4buLIFJSIHbDoCBPUiBj4bunYSBoYWkgYmnhur9uIG7DoHkgbmjGsCBzYXUuDQoNCioqKlJlbGF0aXZlIFJpc2sgLSBSUioqKg0KDQpgYGB7cn0NCnJpc2tyYXRpbyhwbV9jaHVybikNCmBgYA0KDQpTbyB24bubaSBuaMOzbSBjaHV54buDbiBraG/huqNuIG5nw6JuIGjDoG5nLCBuaMOzbSB0aGFuaCB0b8OhbiBi4bqxbmcgdGjhursgdMOtbiBk4bulbmcgY8OzIFJSID0gMC45IHbDoCBu4bqxbSB0cm9uZyBraG/huqNuZyAwLjc1IC0gMS4wNyB24bubaSDEkeG7mSB0aW4gY+G6rXkgOTUlIGNobyB0aOG6pXkgdOG7tyBs4buHIG3DoCBraMOhY2ggaMOgbmcgcuG7nWkgYuG7jyBz4butIGThu6VuZyB0aOG6uyB0w61uIGThu6VuZyBjaOG7iSBi4bqxbmcgMC45IGzhuqduIHNvIHbhu5tpIGNodXnhu4NuIGtob+G6o24gdsOgIMOtdCBoxqFuIDEwJS4gxJDhu5FpIHbhu5tpIG5ow7NtIGJpbGwgxJFp4buHbiB04butIHbhu5tpIFJSID0gMi43MSB2w6AgbuG6sW0gdHJvbmcga2hv4bqjbmcgMi40IC0gMy4wNSB24bubaSDEkeG7mSB0aW4gY+G6rXkgOTUlIGNobyB0aOG6pXkgdOG7tyBs4buHIHLhu51pIGLhu48gbcOgIGtow6FjaCBow6BuZyBz4butIGThu6VuZyBzw6ljIMSRaeG7h24gdOG7rSBjYW8gaMahbiBy4bqldCBuaGnhu4F1LCBjYW8gaMahbiAxNzElIHbDoCBn4bqlcCAyLjcxIGzhuqduIHNvIHbhu5tpIG5ow7NtIHRoYW0gY2hp4bq/dSBsw6AgY2h1eeG7g24ga2hv4bqjbiBuZ8OibiBow6BuZy4gQ3Xhu5FpIGPDuW5nIGzDoCBuaMOzbSBiaWxsIHF1YSB0aMawLCB24bubaSBSUiA9IDEuMTQgdsOgIG7hurFtIHRyb25nIGtob+G6o25nIDAuOTggLSAxLjMzIHbhu5tpIMSR4buZIHRpbiBj4bqteSA5NSUgY2hvIHRo4bqleSDEkcaw4bujYyDEkeG7kWkgduG7m2kgbmjDs20gY2h1eeG7g24ga2hv4bqjbiBuZ8OibiBow6BuZyB0aMOsIG5ow7NtIGJpbGwgcXVhIHRoxrAgY8OzIHThu7cgbOG7hyBy4budaSBi4buPIGNhbyBoxqFuIDEuMTQgbOG6p24gdsOgIDE0JS4NCg0KKioqT2Rkcy1SYXRpbyAtIE9SKioqDQoNCmBgYHtyfQ0Kb2Rkc3JhdGlvKHBtX2NodXJuKQ0KYGBgDQoNClbhu5tpIGdpw6EgdHLhu4sgT1IgbMOgIDAuODkgdsOgIG7hurFtIHRyb25nIGtob+G6o25nIDAuNzMgLSAxLjA5IOG7nyDEkeG7mSB0aW4gY+G6rXkgOTUlIHNvIHbhu5tpIGNodXnhu4NuIGtob+G6o24gbmfDom4gaMOgbmcsIHRhIHRo4bqleSDEkcaw4bujYyB04bu3IGzhu4cgbcOgIGtow6FjaCBow6BuZyBz4butIGThu6VuZyBwaMawxqFuZyB0aOG7qWMgdGjhursgdMOtbiBk4bulbmcgcuG7nWkgYuG7jyBzbyB24bubaSDhu58gbOG6oWkgYuG6sW5nIDAuODkgbOG6p24gc28gduG7m2kgY2h1eeG7g24ga2hv4bqjbiBuZ8OibiBow6BuZy4gQ8OybiB24buBIGJpbGwgxJFp4buHbiB04butLCB24bubaSBPUiA9IDQuMTIgdsOgIG7hurFtIHRyb25nIGtob+G6o25nIDMuNSAtIDQuODIg4bufIMSR4buZIHRpbiBj4bqteSA5NSUgY2hvIHRo4bqleSDEkcaw4bujYyBuaMOzbSBz4butIGThu6VuZyBiaWxsIMSRaeG7h24gdOG7rSBjw7MgdOG7tyBs4buHIHLhu51pIGLhu48gc28gduG7m2kg4bufIGzhuqFpIGNhbyBn4bqlcCA0LjEyIGzhuqduIHNvIHbhu5tpIGNodXnhu4NuIGtob+G6o24uIEN14buRaSBjw7luZyBsw6AgYmlsbCBxdWEgdGjGsCB24bubaSBPUiA9IDEuMTcgdsOgIG7hurFtIHRyb25nIGtob+G6o25nIDAuOTggLSAxLjQxIGNobyB0aOG6pXkgxJHGsOG7o2MgbmjDs20gc+G7rSBk4bulbmcgYmlsbCBxdWEgdGjGsCBjw7MgdOG7tyBs4buHIHLhu51pIGLhu48gc28gduG7m2kga2jDtG5nIHLhu51pIGLhu48gY2FvIGfhuqVwIDEuMTcgbOG6p24gc28gduG7m2kgY2h1eeG7g24ga2hv4bqjbiBuZ8OibiBow6BuZy4NCg0KIyAqKlBI4bqmTiA1OiBU4buUTkcgS+G6vlQgVsOAIFRI4bqiTyBMVeG6rE4qKg0KDQojIyAqKjUuMSBOaOG7r25nIHBow6F0IGhp4buHbiBjaMOtbmggdsOgIMSR4buBIHh14bqldCoqDQoNCkPDoWMgeeG6v3UgdOG7kSDhuqNuaCBoxrDhu59uZyDEkeG6v24gcXV54bq/dCDEkeG7i25oIGThu6tuZyBz4butIGThu6VuZyBk4buLY2ggduG7pSBj4bunYSBraMOhY2ggaMOgbmcgYmFvIGfhu5NtIHnhur91IHThu5EgbG/huqFpIGThu4tjaCB24bulIEludGVybmV0IG3DoCBraMOhY2ggaMOgbmcgc+G7rSBk4bulbmcsIGjhu6NwIMSR4buTbmcgbcOgIGtow6FjaCBow6BuZyDEkcSDbmcga8O9IHbDoCBwaMawxqFuZyB0aOG7qWMgdGhhbmggdG/DoW4gY+G7p2Ega2jDoWNoIGjDoG5nLiDEkOG6p3UgdGnDqm4sIHbhu4EgbeG6t3QgZOG7i2NoIHbhu6UgSW50ZXJuZXQsIHRhIGPDsyB0aOG7gyB0aOG6pXkgdOG7tyBs4buHIGtow6FjaCBow6BuZyBy4budaSBi4buPIGPDtG5nIHR5IHRoxrDhu51uZyBsw6Agbmjhu69uZyBraMOhY2ggaMOgbmcgxJHEg25nIGvDvSBk4buLY2ggduG7pSBGaWJlciBPcHRpYy4gRG8gxJHDsywgY8OzIHRo4buDIGRvIGPDtG5nIHR5IG7DoHkgxJFhbmcgY8OzIHbhuqVuIMSR4buBIHbhu5tpIGThu4tjaCB24bulIG7DoHksIHbDrCB0aOG6vyBGaWJlciBPcHRpYyBsw6AgZOG7i2NoIHbhu6UgaW50ZXJuZXQgY+G6p24gcGjhuqNpIMSRxrDhu6NjIGPhuqNpIHRoaeG7h24gxJHhu4MgZ2nhuqNtIHRoaeG7g3UgdOG7tyBs4buHIHLhu51pIGto4buPaSBj4bunYSBraMOhY2ggaMOgbmcuIFRp4bq/cCDEkeG6v24sIHbhu5tpIHRo4budaSBo4bqhbiBo4bujcCDEkeG7k25nLCB04bu3IGzhu4cgcuG7nWkgYuG7jyB0aMaw4budbmcgdOG6rXAgdHJ1bmcgdsOgbyBo4bqhbiBo4bujcCDEkeG7k25nIGjDoG5nIHRow6FuZywga2hpIMSRw7MgxJHhu4MgZ2nhuqNtIHRoaeG7g3UgdOG7tyBs4buHIHLhu51pIGLhu48sIHRhIGPDsyB0aOG7gyB04bqtcCB0cnVuZyB2w6BvIHZp4buHYyBwaOG7pWMgduG7pSBjw6FjIGfDs2kgY8OzIHRo4budaSBo4bqhbiAyIG7Eg20sIDEgbsSDbSB2w6AgY+G6o2kgdGhp4buHbiB0aMOqbSBjw6FjIMawdSDEkcOjaSDEkeG7kWkgduG7m2kgZ8OzaSBow6BuZyB0aMOhbmcuIEN14buRaSBjw7luZyBsw6AgcGjGsMahbmcgdGjhu6ljIHRoYW5oIHRvw6FuLCB0YSBjw7MgdGjhu4MgdGjhuqV5IMSRYSBz4buRIGtow6FjaCBow6BuZyBjaOG7jW4gZOG7q25nIGThu4tjaCB24bulIMSRYSBz4buRIMSR4buBdSBkw7luZyBwaMawxqFuZyB0aOG7qWMgdGhhbmggdG/DoW4gbMOgIGVsZWN0cmljIGNoZWNrLiBWw6wgdGjhur8gxJHhu4MgZ2nhuqNtIHRoaeG7g3UgxJHGsOG7o2MgdOG7tyBs4buHIHLhu51pIGLhu48sIGPhuqduIHhlbSB4w6l0IHRow6ptIHbhu4EgcGjGsMahbmcgdGjhu6ljIHRoYW5oIHRvw6FuIG7DoHkgaG/hurdjIGPDsyB0aOG7gyB0aMOqbSBuaOG7r25nIMawdSDEkcOjaSBraGkgdGhhbmggdG/DoW4gY2hvIHBoxrDGoW5nIHRo4bupYyBlbGVjdHJpYyBjaGVjayDEkeG7gyBuw611IGdp4buvIGNow6JuIGPhu6dhIGtow6FjaCBow6BuZy4NCg0KIyMgKio1LjMgSOG6oW4gY2jhur8gY+G7p2EgcGjDom4gdMOtY2ggdsOgIGjGsOG7m25nIGdp4bqjaSBxdXnhur90KioNCg0KUGjDom4gdMOtY2ggbsOgeSBjw7Mgbmjhu69uZyBo4bqhbiBjaOG6vyBuaMawIGNoxrBhIGPDsyDEkeG7pyDEkWEgZOG6oW5nIGxv4bqhaSB54bq/dSB04buRIOG6o25oIGjGsOG7n25nIMSR4bq/biBxdXnhur90IMSR4buLbmggcuG7nWkgYuG7jyBj4bunYSBraMOhY2ggaMOgbmcuIMSQaeG7gXUgbsOgeSBraGnhur9uIHBow6JuIHTDrWNoIGNoxrBhIMSR4bunIG3hu6ljIHThu5VuZyBxdcOhdCB2w6AgY2jhu4kgcGjhu6UgdGh14buZYyBt4buZdCB2w6BpIHnhur91IHThu5EgY8ahIGLhuqNuLiBWw6wgdGjhur8sIGPDsyB0aOG7gyBr4bq/dCBo4bujcCB0aMOqbSBuaGnhu4F1IHnhur91IHThu5Ega2jDoWMgxJHhu4MgbMOgbSBwaMOibiB0w61jaCB0cuG7nyBuw6puIHThu5VuZyBxdcOhdCBoxqFuLiANCg==