library(readxl)
library(ggplot2)
## Warning: package 'ggplot2' was built under R version 4.3.1
library(epitools)
library(DescTools)
## Warning: package 'DescTools' was built under R version 4.3.1
library(DT)
## Warning: package 'DT' was built under R version 4.3.1
library(energy)
## Warning: package 'energy' was built under R version 4.3.1
options(digits = 4)
library(tidyverse)
## Warning: package 'tidyverse' was built under R version 4.3.1
## Warning: package 'tidyr' was built under R version 4.3.1
## Warning: package 'readr' was built under R version 4.3.1
## Warning: package 'purrr' was built under R version 4.3.1
## Warning: package 'dplyr' was built under R version 4.3.1
## Warning: package 'forcats' was built under R version 4.3.1
## Warning: package 'lubridate' was built under R version 4.3.1
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ dplyr     1.1.2     ✔ readr     2.1.4
## ✔ forcats   1.0.0     ✔ stringr   1.5.0
## ✔ lubridate 1.9.2     ✔ tibble    3.2.1
## ✔ purrr     1.0.1     ✔ tidyr     1.3.0
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag()    masks stats::lag()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
library(caret)
## Warning: package 'caret' was built under R version 4.3.1
## Loading required package: lattice
## 
## Attaching package: 'caret'
## 
## The following object is masked from 'package:purrr':
## 
##     lift
## 
## The following objects are masked from 'package:DescTools':
## 
##     MAE, RMSE

CHƯƠNG 1 : TỔNG QUAN VỀ NGHIÊN CỨU

1.1 Lý do chọn đề tài

Khách hàng là nguồn cung cấp doanh thu, lợi nhuận cho doanh nghiệp. Việc tăng số lượng khách hàng giúp doanh nghiệp mở rộng quy mô và định hướng chiến lược phát triển dài hạn. Những khách hàng mới mang đến thêm nguồn thu cho doanh nghiệp, đồng thời tăng cường sự đa dạng trong tệp khách hàng và tạo ra nhiều cơ hội tiếp cận thị trường mới.

Khách hàng đóng vai trò quan trọng nhất đối với bất kỳ ngân hàng nào và họ có thể quyết định sự tồn tại, phát triển của ngân hàng đó. Nếu không có khách hàng sẽ không có ai mua, sử dụng sản phẩm, dịch vụ. Theo đó, việc khách hàng rút tài khoản khỏi ngân hàng có thể ảnh hưởng đến nguồn tiền gửi, lợi nhuận và không thể tồn tại, phát triển.Vì vậy bài nghiên cứu muốn phân tích các yếu tố ảnh hưởng đến quyết định của khách hàng.

1.2 Mục đích nghiên cứu

Phân tích các yếu tố ảnh hưởng đến việc khách hàng quyết định rút tài khoản rời khỏi ngân hàng.

1.3 Đối tượng nghiên cứu

Dữ liệu được thu thập từ trang web kaggle.com . Trong bài này dữ liệu bao gồm 1000 khách hàng với 7 yếu tố được xem là có tác động đến việc khách hàng quyết định rút tài khoản rời khỏi ngân hàng.

1.4 Phương pháp nghiên cứu

Bài nghiên cứu sử dụng phương pháp hồi quy Logistic giải thích sự tương tác của các yếu tố lên biến phụ thuộc trong hồi quy thông qua 3 mô hình Logit, Probit, Cloglog. Từ đó đánh giá kết quả hồi quy và lựa chọn mô hình phù hợp nhất để giải quyết được các mục tiêu đề ra.

1.5 Kết cấu bài nghiên cứu

Chương 1: Tổng quan nghiên cứu

Chương 2: Cơ sở lý thuyết và dữ liệu nghiên cứu

CHương 3: Phân tích dữ liệu

Chương 4: Kết quả mô hình nghiên cứu

Chương 5: Kết luận và khuyến nghị

CHƯƠNG 2 : DỮ LIỆU NGHIÊN CỨU

2.1 Giới thiệu về bộ dữ liệu

Bộ dữ liệu này chứa thông tin chi tiết về khách hàng của ngân hàng và phản ánh thực tế liệu khách hàng đã rời ngân hàng (đóng tài khoản) hay tiếp tục là khách hàng.

Dữ liệu bao gồm 7 Biến và 1000 quan sát.

2.2 Mô tả các biến

  • Exited : Khách hàng có rời khỏi ngân hàng hay không?, có 2 giá trị 1 (rời khỏi) và 0(không rời khỏi)

  • Gender : Giới Tính của khách hàng, có 2 giá trị Female và Male

  • Age : Tuổi của khách hàng

  • Tenure : Số năm khách hàng gắn bó

  • HasCrCard :Có thẻ tín dụng hay không?, có 2 giá trị Yes và No

  • IsActiveMember : Có phải là khách hàng thân thiết hay không?, có 2 giá trị Yes và No

  • EstimatedSalary : Tiền lương của khách hàng

2.3 Quan sát về dữ liệu

SLTL<- read_excel("C:/Users/pc/Downloads/SLPT.xlsx")
str(SLTL)
## tibble [1,000 × 8] (S3: tbl_df/tbl/data.frame)
##  $ RowNumber      : num [1:1000] 1 2 3 4 5 6 7 8 9 10 ...
##  $ Gender         : chr [1:1000] "Male" "Male" "Female" "Female" ...
##  $ Age            : num [1:1000] 47 33 40 43 32 55 47 39 45 33 ...
##  $ Tenure         : num [1:1000] 5 1 5 4 2 6 5 4 1 5 ...
##  $ HasCrCard      : chr [1:1000] "Yes" "No" "No" "Yes" ...
##  $ IsActiveMember : chr [1:1000] "No" "Yes" "Yes" "Yes" ...
##  $ EstimatedSalary: num [1:1000] 162761 175179 177100 66406 59560 ...
##  $ Exited         : num [1:1000] 0 0 0 0 0 0 0 0 1 1 ...
datatable(SLTL)

2.4 Mô hình đề xuất

\(Exited= \beta_0 + \beta_1 Gender + \beta_2Age+\beta_3HasCrCard+\beta_4IsActiveMember+\beta_5EstimatedSalary\)

Biến phụ thuộc là biến Exited

Biệc độc lập là Gender, Age, HasCrCard, IsActiveMember, EstimatedSalary

CHƯƠNG 3 PHÂN TÍCH DỮ LIỆU

3.1 Thống kê mô tả biến phụ thuộc

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

Ta chọn biến Exited làm biến phụ thuộc. Vì việc khách hàng rời bỏ có thể bị ảnh hưởng bởi các yếu tố như là độ tuổi, tiền lương, giới tính, ….

Bảng Tần Số

table(SLTL$Exited)
## 
##   0   1 
## 787 213

Bảng Tần Suất

table(SLTL$Exited)/sum(table(SLTL$Exited))
## 
##     0     1 
## 0.787 0.213

Đồ thị

ggplot(SLTL,aes(Exited))+ geom_bar(color = "green", fill = "green")+ geom_text(aes(label = scales :: percent(after_stat(count/sum(count)), accuracy= 0.01)), stat=  'count', color = 'black', vjust = -.5)+ ylab("Number")+ xlab("Exited")

Trong 1000 khách hàng của ngân hàng :

  • Có 787 khách hàng ( chiếm 78.7% ) không rời khỏi ngân hàng.

  • Có 213 khách hàng ( chiếm 21.3% ) rời khỏi ngân hàng.

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

Ta chọn biến Tenure làm biến phụ thuộc Vì muốn phân tích số năm khách hàng gắn bó với ngân hàng có chịu ảnh hưởng bởi các yếu tố khác hay không.

summary(SLTL$Tenure)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##    0.00    3.00    5.00    5.03    7.00   10.00
  • Trong 1000 khách hàng của ngân hàng:

Số năm khách hàng gắn bó với ngân hàng nhiều nhất là : 10 năm

Số năm khách hàng gắn bó với ngân hàng thấp nhất là 0 năm

Số năm trung bình khách hàng gắn bó với ngân hàng là 5 năm

table(SLTL$Tenure)
## 
##   0   1   2   3   4   5   6   7   8   9  10 
##  40  91 106 111  96 112 102 102  99  83  58

Đồ thị

hist(SLTL$Tenure)

3.2 Thống kê mô tả Các Biến Định Tính

3.2.1 Biến Gender

table(SLTL$Gender)
## 
## Female   Male 
##    463    537
table(SLTL$Gender)/sum(table(SLTL$Gender))
## 
## Female   Male 
##  0.463  0.537

Đồ thị

ggplot(SLTL,aes(Gender))+ geom_bar(color = "blue", fill = "blue")+ geom_text(aes(label = scales :: percent(after_stat(count/sum(count)), accuracy= 0.01)), stat=  'count', color = 'black', vjust = -.5)+ ylab("Number")+ xlab("Gender")

Trong 1000 khách hàng của ngân hàng :

  • Có 463 khách hàng ( chiếm 46.3% ) thuộc giới tính là Nữ

  • Có 537 khách hàng ( chiếm 53.7% ) thuộc giới tính là Nam

3.2.2 Biến HasCrCard

table(SLTL$HasCrCard)
## 
##  No Yes 
## 304 696
table(SLTL$HasCrCard)/sum(table(SLTL$HasCrCard))
## 
##    No   Yes 
## 0.304 0.696

Đồ thị

ggplot(SLTL,aes(HasCrCard))+ geom_bar(color = "blue", fill = "blue")+ geom_text(aes(label = scales :: percent(after_stat(count/sum(count)), accuracy= 0.01)), stat=  'count', color = 'black', vjust = -.5)+ ylab("Number")+ xlab("HasCrCard")

Trong 1000 khách hàng của ngân hàng :

  • Có 304 khách hàng ( chiếm 30.4% ) không có sử dụng thẻ tín dụng.

  • Có 696 khách hàng ( chiếm 69.6% ) có sử dụng thẻ tín dụng.

3.2.3 Biến IsActiveMember

table(SLTL$IsActiveMember)
## 
##  No Yes 
## 494 506
table(SLTL$IsActiveMember)/sum(table(SLTL$IsActiveMember))
## 
##    No   Yes 
## 0.494 0.506

Đồ thị

ggplot(SLTL,aes(IsActiveMember))+ geom_bar(color = "green", fill = "green")+ geom_text(aes(label = scales :: percent(after_stat(count/sum(count)), accuracy= 0.01)), stat=  'count', color = 'black', vjust = -.5)+ ylab("Number")+ xlab("IsActiveMember")

Trong 1000 khách hàng của ngân hàng :

  • Có 494 khách hàng ( chiếm 49.4% ) không phải là thành viên thân thiết của ngân hàng.

  • Có 506 khách hàng ( chiếm 50.6% ) là thành viên thân thiết của ngân hàng.

3.3 Thống kê mô tả các biến định lượng

3.3.1 Biến EstimatedSalary

summary(SLTL$EstimatedSalary)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##     247   52539  101665  100789  147290  199971
  • Trong 1000 khách hàng của ngân hàng:

Tiền lương ước tính cao nhất là : 199970.7$

Tiền lương ước tính thấp nhất là 247.4$

Tiền lương ước tính trung bình là 100789.1$

Đồ thị

hist(SLTL$EstimatedSalary)

3.3.2 Biến Age

summary(SLTL$Age)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##    18.0    31.0    37.0    39.1    44.0    85.0
  • Trong 1000 khách hàng của ngân hàng:

Tuổi của khách hàng cao nhất là : 85 tuổi

Tuổi của khách hàng thấp nhất là 18 tuổi

Trung bình Tuổi của khách hàng là 39 tuổi

Đồ thị

hist(SLTL$Age)

3.4 THỐNG KÊ MÔ TẢ CHO 2 BIẾN

3.4.1 Biến Exited và biến HasCrCard

Bảng tần suất

A<-table(SLTL$HasCrCard,SLTL$Exited)
prop.table(A)
##      
##           0     1
##   No  0.236 0.068
##   Yes 0.551 0.145
addmargins(A)
##      
##          0    1  Sum
##   No   236   68  304
##   Yes  551  145  696
##   Sum  787  213 1000
  • Trong 787 người không rời khỏi ngân hàng có 236 người không có thẻ tín dụng và 551 người có thẻ tín dụng.

  • Trong 213 người rời khỏi ngân hàng có 68 người không có thẻ tín dụng và 145 người có thẻ tín dụng.

ggplot(SLTL, aes(Exited, fill = HasCrCard)) + geom_bar(position = 'dodge')

Tính rủi ro tương đối

riskratio(A)
## $data
##        
##           0   1 Total
##   No    236  68   304
##   Yes   551 145   696
##   Total 787 213  1000
## 
## $measure
##      risk ratio with 95% C.I.
##       estimate lower upper
##   No    1.0000    NA    NA
##   Yes   0.9314 0.722 1.201
## 
## $p.value
##      two-sided
##       midp.exact fisher.exact chi.square
##   No          NA           NA         NA
##   Yes     0.5839       0.6146     0.5855
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "Unconditional MLE & normal approximation (Wald) CI"
  • Vậy tỉ lệ những người rời khỏi ngân hàng có thẻ tín dụng gấp 0.93 lần so với những người rời khỏi ngân hàng không có thẻ tín dụng.
riskratio(A, rev = 'c')
## $data
##        
##           1   0 Total
##   No     68 236   304
##   Yes   145 551   696
##   Total 213 787  1000
## 
## $measure
##      risk ratio with 95% C.I.
##       estimate  lower upper
##   No      1.00     NA    NA
##   Yes     1.02 0.9495 1.095
## 
## $p.value
##      two-sided
##       midp.exact fisher.exact chi.square
##   No          NA           NA         NA
##   Yes     0.5839       0.6146     0.5855
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "Unconditional MLE & normal approximation (Wald) CI"
  • Vậy tỉ lệ những người không rời khỏi ngân hàng có thẻ tín dụng gấp 1.02 lần so với những người không rời khỏi ngân hàng không có thẻ tín dụng.

Tỷ lệ chênh

oddsratio(A)
## $data
##        
##           0   1 Total
##   No    236  68   304
##   Yes   551 145   696
##   Total 787 213  1000
## 
## $measure
##      odds ratio with 95% C.I.
##       estimate  lower upper
##   No    1.0000     NA    NA
##   Yes   0.9126 0.6605  1.27
## 
## $p.value
##      two-sided
##       midp.exact fisher.exact chi.square
##   No          NA           NA         NA
##   Yes     0.5839       0.6146     0.5855
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "median-unbiased estimate & mid-p exact CI"

Tỷ lệ giữa người không rời khỏi và rời khỏi ngân hàng mà không có thẻ tín dụng so với người không rời khỏi và rời khỏi ngân hàng mà có thẻ tín dụng là 0.9126

oddsratio(A, rev = 'c')
## $data
##        
##           1   0 Total
##   No     68 236   304
##   Yes   145 551   696
##   Total 213 787  1000
## 
## $measure
##      odds ratio with 95% C.I.
##       estimate  lower upper
##   No     1.000     NA    NA
##   Yes    1.096 0.7875 1.514
## 
## $p.value
##      two-sided
##       midp.exact fisher.exact chi.square
##   No          NA           NA         NA
##   Yes     0.5839       0.6146     0.5855
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "median-unbiased estimate & mid-p exact CI"

Tỷ lệ giữa người rời khỏi và không rời khỏi ngân hàng mà không có thẻ tín dụng so với người rời khỏi và không rời khỏi ngân hàng mà có thẻ tín dụng là 1.096.

3.4.2 Biến Exited và biến IsActiveMember

Bảng tần suất

E <-table(SLTL$IsActiveMember,SLTL$Exited)
prop.table(E)
##      
##           0     1
##   No  0.364 0.130
##   Yes 0.423 0.083
addmargins(E)
##      
##          0    1  Sum
##   No   364  130  494
##   Yes  423   83  506
##   Sum  787  213 1000
  • Trong 213 người rời khỏi ngân hàng có 130 người không phải là thành viên thân thiết và 83 người có là khách hàng thân thiết.

  • Trong 787 người không rời khỏi ngân hàng có 364 người không phải là thành viên thân thiết và 423 người là khách hàng thân thiết

ggplot(SLTL, aes(Exited, fill = IsActiveMember)) + geom_bar(position = 'dodge')

Tính rủi ro tương đối

riskratio(E)
## $data
##        
##           0   1 Total
##   No    364 130   494
##   Yes   423  83   506
##   Total 787 213  1000
## 
## $measure
##      risk ratio with 95% C.I.
##       estimate  lower  upper
##   No    1.0000     NA     NA
##   Yes   0.6233 0.4874 0.7971
## 
## $p.value
##      two-sided
##       midp.exact fisher.exact chi.square
##   No          NA           NA         NA
##   Yes  0.0001297    0.0001476  0.0001293
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "Unconditional MLE & normal approximation (Wald) CI"
  • Vậy tỉ lệ những người rời khỏi ngân hàng là thành viên thân thiết gấp 0.63 lần so với những người rời khỏi ngân hàng không là thành viên thân thiết.
riskratio(E, rev = 'c')
## $data
##        
##           1   0 Total
##   No    130 364   494
##   Yes    83 423   506
##   Total 213 787  1000
## 
## $measure
##      risk ratio with 95% C.I.
##       estimate lower upper
##   No     1.000    NA    NA
##   Yes    1.135 1.063 1.211
## 
## $p.value
##      two-sided
##       midp.exact fisher.exact chi.square
##   No          NA           NA         NA
##   Yes  0.0001297    0.0001476  0.0001293
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "Unconditional MLE & normal approximation (Wald) CI"
  • Vậy tỉ lệ những người không rời khỏi ngân hàng là thành viên thân thiết gấp 1.14 lần so với những người không rời khỏi ngân hàng không là thành viên thân thiết.

Tỷ lệ chênh

oddsratio(E)
## $data
##        
##           0   1 Total
##   No    364 130   494
##   Yes   423  83   506
##   Total 787 213  1000
## 
## $measure
##      odds ratio with 95% C.I.
##       estimate  lower upper
##   No    1.0000     NA    NA
##   Yes   0.5501 0.4027 0.748
## 
## $p.value
##      two-sided
##       midp.exact fisher.exact chi.square
##   No          NA           NA         NA
##   Yes  0.0001297    0.0001476  0.0001293
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "median-unbiased estimate & mid-p exact CI"

Tỷ lệ giữa người không rời khỏi và rời khỏi ngân hàng mà không là thành viên thân thiết so với người không rời khỏi và rời khỏi ngân hàng mà là thành viên thân thiết là 0.5501

oddsratio(E, rev = 'c')
## $data
##        
##           1   0 Total
##   No    130 364   494
##   Yes    83 423   506
##   Total 213 787  1000
## 
## $measure
##      odds ratio with 95% C.I.
##       estimate lower upper
##   No     1.000    NA    NA
##   Yes    1.818 1.337 2.484
## 
## $p.value
##      two-sided
##       midp.exact fisher.exact chi.square
##   No          NA           NA         NA
##   Yes  0.0001297    0.0001476  0.0001293
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "median-unbiased estimate & mid-p exact CI"

Tỷ lệ giữa người rời khỏi và không rời khỏi ngân hàng mà không là thành viên thân thiết so với người rời khỏi và không rời khỏi ngân hàng mà là thành viên thân thiết là 1.818

3.4.3 Biến Exited và biến Gender

Bảng tần suất

R <-table(SLTL$Gender,SLTL$Exited)
prop.table(R)
##         
##              0     1
##   Female 0.333 0.130
##   Male   0.454 0.083
addmargins(R)
##         
##             0    1  Sum
##   Female  333  130  463
##   Male    454   83  537
##   Sum     787  213 1000
  • Trong 787 người không rời khỏi ngân hàng có 333 người có giới tính là nữ và 454 người có giới tính là nam.

  • Trong 213 người rời khỏi ngân hàng có 130 người có giới tính là nữ và 83 người có giới tính là nam.

Tính rủi ro tương đối

riskratio(R)
## $data
##         
##            0   1 Total
##   Female 333 130   463
##   Male   454  83   537
##   Total  787 213  1000
## 
## $measure
##         risk ratio with 95% C.I.
##          estimate  lower  upper
##   Female   1.0000     NA     NA
##   Male     0.5505 0.4305 0.7038
## 
## $p.value
##         two-sided
##          midp.exact fisher.exact chi.square
##   Female         NA           NA         NA
##   Male    1.241e-06      1.4e-06  1.169e-06
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "Unconditional MLE & normal approximation (Wald) CI"
  • Vậy tỉ lệ những người rời khỏi ngân hàng có giới tính là nam gấp 0.55 lần so với những người rời khỏi ngân hàng có giới tính là nữ.
riskratio(R, rev = 'c')
## $data
##         
##            1   0 Total
##   Female 130 333   463
##   Male    83 454   537
##   Total  213 787  1000
## 
## $measure
##         risk ratio with 95% C.I.
##          estimate lower upper
##   Female    1.000    NA    NA
##   Male      1.175 1.099 1.257
## 
## $p.value
##         two-sided
##          midp.exact fisher.exact chi.square
##   Female         NA           NA         NA
##   Male    1.241e-06      1.4e-06  1.169e-06
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "Unconditional MLE & normal approximation (Wald) CI"
  • Tỷ lệ khách hàng không rời khỏi ngân hàng có giới tính là nam gấp 1.175 lần so với khách hàng không rời khỏi ngân hàng có giới tính là nữ.

Tỷ lệ chênh

oddsratio(R)
## $data
##         
##            0   1 Total
##   Female 333 130   463
##   Male   454  83   537
##   Total  787 213  1000
## 
## $measure
##         odds ratio with 95% C.I.
##          estimate  lower  upper
##   Female   1.0000     NA     NA
##   Male     0.4689 0.3431 0.6381
## 
## $p.value
##         two-sided
##          midp.exact fisher.exact chi.square
##   Female         NA           NA         NA
##   Male    1.241e-06      1.4e-06  1.169e-06
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "median-unbiased estimate & mid-p exact CI"

Tỷ lệ giữa người không rời khỏi và rời khỏi ngân hàng có giới tính là nữ so với người không rời khỏi và rời khỏi ngân hàng có giới tính là nam là 0.4689

oddsratio(E, rev = 'c')
## $data
##        
##           1   0 Total
##   No    130 364   494
##   Yes    83 423   506
##   Total 213 787  1000
## 
## $measure
##      odds ratio with 95% C.I.
##       estimate lower upper
##   No     1.000    NA    NA
##   Yes    1.818 1.337 2.484
## 
## $p.value
##      two-sided
##       midp.exact fisher.exact chi.square
##   No          NA           NA         NA
##   Yes  0.0001297    0.0001476  0.0001293
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "median-unbiased estimate & mid-p exact CI"

Tỷ lệ giữa người rời khỏi và không rời khỏi ngân hàng có giới tính là nữ so với người rời khỏi và không rời khỏi ngân hàng có giới tính là nam là 1.818

3.4.4 Biến Exited và biến EstimatedSalary

Bảng tần suất

Salary <- cut(SLTL$EstimatedSalary, breaks = c(0,100789,199971), labels = c('thấp', 'cao'))
SLTL <- mutate(SLTL,Salary)
T <-table(SLTL$Salary,SLTL$Exited)
prop.table(T)
##       
##            0     1
##   thấp 0.389 0.107
##   cao  0.398 0.106
addmargins(T)
##       
##           0    1  Sum
##   thấp  389  107  496
##   cao   398  106  504
##   Sum   787  213 1000
  • Trong 787 người không rời khỏi ngân hàng có 389 người có thu nhập thấp và 398 người có thu nhập cao.

  • Trong 213 người rời khỏi ngân hàng có 107 người có thu nhập thấp và 106 người có thu nhập cao.

Tính rủi ro tương đối

riskratio(T)
## $data
##        
##           0   1 Total
##   thấp  389 107   496
##   cao   398 106   504
##   Total 787 213  1000
## 
## $measure
##       risk ratio with 95% C.I.
##        estimate  lower upper
##   thấp   1.0000     NA    NA
##   cao    0.9749 0.7682 1.237
## 
## $p.value
##       two-sided
##        midp.exact fisher.exact chi.square
##   thấp         NA           NA         NA
##   cao       0.835       0.8773     0.8346
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "Unconditional MLE & normal approximation (Wald) CI"
  • Vậy tỉ lệ những người rời khỏi ngân hàng có thu nhập cao gấp 0.97 lần so với những người rời tài khoản khỏi ngân hàng có thu nhập thấp.
riskratio(T, rev = 'c')
## $data
##        
##           1   0 Total
##   thấp  107 389   496
##   cao   106 398   504
##   Total 213 787  1000
## 
## $measure
##       risk ratio with 95% C.I.
##        estimate lower upper
##   thấp    1.000    NA    NA
##   cao     1.007 0.944 1.074
## 
## $p.value
##       two-sided
##        midp.exact fisher.exact chi.square
##   thấp         NA           NA         NA
##   cao       0.835       0.8773     0.8346
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "Unconditional MLE & normal approximation (Wald) CI"
  • Tỷ lệ khách hàng không rời khỏi ngân hàng có thu nhập cao gấp 1.007 lần so với khách hàng không rời khỏi ngân hàng có thu nhập thấp.

Tỷ lệ chênh

oddsratio(T)
## $data
##        
##           0   1 Total
##   thấp  389 107   496
##   cao   398 106   504
##   Total 787 213  1000
## 
## $measure
##       odds ratio with 95% C.I.
##        estimate  lower upper
##   thấp   1.0000     NA    NA
##   cao    0.9683 0.7148 1.312
## 
## $p.value
##       two-sided
##        midp.exact fisher.exact chi.square
##   thấp         NA           NA         NA
##   cao       0.835       0.8773     0.8346
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "median-unbiased estimate & mid-p exact CI"

Tỷ lệ giữa người không rời khỏi và rời khỏi ngân hàng có thu nhập thấp so với người không rời khỏi và rời khỏi ngân hàng có thu nhập cao là 0.9683

oddsratio(T, rev = 'c')
## $data
##        
##           1   0 Total
##   thấp  107 389   496
##   cao   106 398   504
##   Total 213 787  1000
## 
## $measure
##       odds ratio with 95% C.I.
##        estimate  lower upper
##   thấp    1.000     NA    NA
##   cao     1.033 0.7625 1.399
## 
## $p.value
##       two-sided
##        midp.exact fisher.exact chi.square
##   thấp         NA           NA         NA
##   cao       0.835       0.8773     0.8346
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "median-unbiased estimate & mid-p exact CI"

Tỷ lệ giữa người rời khỏi và không rời khỏi ngân hàng tài khoản có thu nhập thấp so với người rời khỏi và không rời khỏi ngân hàng có thu nhập cao là 1.033

3.4.5 Biến Exited và biến Age

Bảng tần suất

Age1 <- cut(SLTL$Age, breaks = c(0,30,85), labels = c('duoi 30', 'tren 30'))
SLTL <- mutate(SLTL,Age1)
Z<-table(SLTL$Age1,SLTL$Exited)
prop.table(Z)
##          
##               0     1
##   duoi 30 0.192 0.017
##   tren 30 0.595 0.196
addmargins(Z)
##          
##              0    1  Sum
##   duoi 30  192   17  209
##   tren 30  595  196  791
##   Sum      787  213 1000
  • Trong 787 người không rời khỏi ngân hàng có 192 người dưới 30 tuổi và 595 người trên 30 tuổi .

  • Trong 213 người rời khỏi ngân hàng có 17 người dưới 30 tuổi và 196 người trên 30 tuổi.

Tính rủi ro tương đối

riskratio(Z)
## $data
##          
##             0   1 Total
##   duoi 30 192  17   209
##   tren 30 595 196   791
##   Total   787 213  1000
## 
## $measure
##          risk ratio with 95% C.I.
##           estimate lower upper
##   duoi 30    1.000    NA    NA
##   tren 30    3.046 1.901 4.882
## 
## $p.value
##          two-sided
##           midp.exact fisher.exact chi.square
##   duoi 30         NA           NA         NA
##   tren 30  1.882e-08    2.378e-08  1.722e-07
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "Unconditional MLE & normal approximation (Wald) CI"
  • Vậy tỉ lệ những người rời khỏi ngân hàng trên 30 tuổi gấp 3.43 lần so với những người rời khỏi ngân hàng dưới 30 tuổi.
riskratio(Z, rev = 'c')
## $data
##          
##             1   0 Total
##   duoi 30  17 192   209
##   tren 30 196 595   791
##   Total   213 787  1000
## 
## $measure
##          risk ratio with 95% C.I.
##           estimate  lower  upper
##   duoi 30   1.0000     NA     NA
##   tren 30   0.8188 0.7736 0.8667
## 
## $p.value
##          two-sided
##           midp.exact fisher.exact chi.square
##   duoi 30         NA           NA         NA
##   tren 30  1.882e-08    2.378e-08  1.722e-07
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "Unconditional MLE & normal approximation (Wald) CI"
  • Tỷ lệ khách hàng không rời khỏi ngân hàng trên 30 tuổi gấp 0.69 lần so với khách hàng không rời khỏi ngân hàng dưới 30 tuổi.

Tỷ lệ chênh

oddsratio(Z)
## $data
##          
##             0   1 Total
##   duoi 30 192  17   209
##   tren 30 595 196   791
##   Total   787 213  1000
## 
## $measure
##          odds ratio with 95% C.I.
##           estimate lower upper
##   duoi 30    1.000    NA    NA
##   tren 30    3.687 2.249 6.442
## 
## $p.value
##          two-sided
##           midp.exact fisher.exact chi.square
##   duoi 30         NA           NA         NA
##   tren 30  1.882e-08    2.378e-08  1.722e-07
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "median-unbiased estimate & mid-p exact CI"

Tỷ lệ giữa người không rời khỏi và rời khỏi ngân hàng mà dưới 30 tuổi so với người không rút và rút tài khoản mà trên 30 tuổi là 3.687

oddsratio(Z, rev = 'c')
## $data
##          
##             1   0 Total
##   duoi 30  17 192   209
##   tren 30 196 595   791
##   Total   213 787  1000
## 
## $measure
##          odds ratio with 95% C.I.
##           estimate  lower  upper
##   duoi 30   1.0000     NA     NA
##   tren 30   0.2712 0.1552 0.4447
## 
## $p.value
##          two-sided
##           midp.exact fisher.exact chi.square
##   duoi 30         NA           NA         NA
##   tren 30  1.882e-08    2.378e-08  1.722e-07
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "median-unbiased estimate & mid-p exact CI"

Tỷ lệ giữa người rời khỏi và không rời khỏi ngân hàng mà dưới 30 tuổi so với người rời khỏi và không rời khỏi ngân hàng mà trên 30 tuổi là 0.2712

3.4.6 Biến Tenure và biến EstimatedSalary

Bảng tần suất

Tenure1 <- cut(SLTL$Tenure, breaks = c(0,5,10), labels = c('ít', 'nhiều'))
SLTL <- mutate(SLTL,Tenure1)
M <-table(SLTL$Salary,SLTL$Tenure1)
prop.table(M)
##       
##            ít  nhiều
##   thấp 0.2698 0.2229
##   cao  0.2677 0.2396
addmargins(M)
##       
##         ít nhiều Sum
##   thấp 259   214 473
##   cao  257   230 487
##   Sum  516   444 960
  • Trong 516 khách hàng gắn bó dưới 5 năm của ngân hàng có 259 người có thu nhập thấp và 257 người có thu nhập cao. .

  • Trong 444 khách hàng gắn bó trên 5 năm của ngân hàng có 214 người có thu nhập thấp và 230 người người có thu nhập cao.

Tính rủi ro tương đối

riskratio(M)
## $data
##        
##          ít nhiều Total
##   thấp  259   214   473
##   cao   257   230   487
##   Total 516   444   960
## 
## $measure
##       risk ratio with 95% C.I.
##        estimate  lower upper
##   thấp    1.000     NA    NA
##   cao     1.044 0.9106 1.197
## 
## $p.value
##       two-sided
##        midp.exact fisher.exact chi.square
##   thấp         NA           NA         NA
##   cao      0.5384       0.5603     0.5375
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "Unconditional MLE & normal approximation (Wald) CI"
  • Vậy tỉ lệ những người gắn bó trên 5 năm có thu nhập cao gấp 1.044 lần so với những người gắn bó trên 5 năm có thu nhập thấp.
riskratio(M, rev = 'c')
## $data
##        
##         nhiều  ít Total
##   thấp    214 259   473
##   cao     230 257   487
##   Total   444 516   960
## 
## $measure
##       risk ratio with 95% C.I.
##        estimate lower upper
##   thấp   1.0000    NA    NA
##   cao    0.9638 0.857 1.084
## 
## $p.value
##       two-sided
##        midp.exact fisher.exact chi.square
##   thấp         NA           NA         NA
##   cao      0.5384       0.5603     0.5375
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "Unconditional MLE & normal approximation (Wald) CI"
  • Tỷ lệ khách hàng gắn bó dưới 5 năm có thu nhập cao gấp 0.96 lần so với khách hàng gắn bó dưới 5 năm có thu nhập thấp.

Tỷ lệ chênh

oddsratio(M)
## $data
##        
##          ít nhiều Total
##   thấp  259   214   473
##   cao   257   230   487
##   Total 516   444   960
## 
## $measure
##       odds ratio with 95% C.I.
##        estimate  lower upper
##   thấp    1.000     NA    NA
##   cao     1.083 0.8401 1.397
## 
## $p.value
##       two-sided
##        midp.exact fisher.exact chi.square
##   thấp         NA           NA         NA
##   cao      0.5384       0.5603     0.5375
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "median-unbiased estimate & mid-p exact CI"

Tỷ lệ giữa người gắn bó dưới 5 năm và gắn bó trên 5 năm mà có thu nhập thấp so với người gắn bó dưới 5 năm và gắn bó trên 5 năm mà có thu nhập cao là 1.083

oddsratio(M, rev = 'c')
## $data
##        
##         nhiều  ít Total
##   thấp    214 259   473
##   cao     230 257   487
##   Total   444 516   960
## 
## $measure
##       odds ratio with 95% C.I.
##        estimate  lower upper
##   thấp   1.0000     NA    NA
##   cao    0.9234 0.7161  1.19
## 
## $p.value
##       two-sided
##        midp.exact fisher.exact chi.square
##   thấp         NA           NA         NA
##   cao      0.5384       0.5603     0.5375
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "median-unbiased estimate & mid-p exact CI"

Tỷ lệ giữa người gắn bó trên 5 năm và gắn bó dưới 5 năm mà có thu nhập thấp so với người gắn bó trên 5 năm và gắn bó dưới 5 năm mà có thu nhập cao là 0.9234

3.4.7 Biến Tenure và biến Age

Bảng tần suất

N <-table(SLTL$Age1,SLTL$Tenure1)
prop.table(N)
##          
##                ít   nhiều
##   duoi 30 0.11979 0.09271
##   tren 30 0.41771 0.36979
addmargins(N)
##          
##            ít nhiều Sum
##   duoi 30 115    89 204
##   tren 30 401   355 756
##   Sum     516   444 960
  • Trong 516 khách hàng gắn bó dưới 5 năm của ngân hàng có 115 người dưới 30 tuổi và 401 người trên 30 tuổi .

  • Trong 444 khách hàng gắn bó trên 5 năm của ngân hàng có 89 người dưới 30 tuổi và 355 người trên 30 tuổi.

Tính rủi ro tương đối

riskratio(N)
## $data
##          
##            ít nhiều Total
##   duoi 30 115    89   204
##   tren 30 401   355   756
##   Total   516   444   960
## 
## $measure
##          risk ratio with 95% C.I.
##           estimate lower upper
##   duoi 30    1.000    NA    NA
##   tren 30    1.076 0.905  1.28
## 
## $p.value
##          two-sided
##           midp.exact fisher.exact chi.square
##   duoi 30         NA           NA         NA
##   tren 30     0.3989        0.429     0.3972
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "Unconditional MLE & normal approximation (Wald) CI"
  • Vậy tỉ lệ những người gắn bó trên 5 năm và trên 30 tuổi gấp 1.076 lần so với những người gắn bó trên 5 năm và dưới 30 tuổi.
riskratio(N, rev = 'c')
## $data
##          
##           nhiều  ít Total
##   duoi 30    89 115   204
##   tren 30   355 401   756
##   Total     444 516   960
## 
## $measure
##          risk ratio with 95% C.I.
##           estimate  lower upper
##   duoi 30   1.0000     NA    NA
##   tren 30   0.9409 0.8196  1.08
## 
## $p.value
##          two-sided
##           midp.exact fisher.exact chi.square
##   duoi 30         NA           NA         NA
##   tren 30     0.3989        0.429     0.3972
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "Unconditional MLE & normal approximation (Wald) CI"
  • Vậy tỉ lệ những người gắn bó dưới 5 năm và trên 30 tuổi gấp 0.9409 lần so với những người gắn bó dưới 5 năm và dưới 30 tuổi.

Tỷ lệ chênh

oddsratio(N)
## $data
##          
##            ít nhiều Total
##   duoi 30 115    89   204
##   tren 30 401   355   756
##   Total   516   444   960
## 
## $measure
##          odds ratio with 95% C.I.
##           estimate  lower upper
##   duoi 30    1.000     NA    NA
##   tren 30    1.143 0.8379 1.564
## 
## $p.value
##          two-sided
##           midp.exact fisher.exact chi.square
##   duoi 30         NA           NA         NA
##   tren 30     0.3989        0.429     0.3972
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "median-unbiased estimate & mid-p exact CI"

Tỷ lệ giữa người gắn bó dưới 5 năm và gắn bó trên 5 năm mà dưới 30 tuổi so với người gắn bó dưới 5 năm và gắn bó trên 5 năm mà trên 30 tuổi là 1.143

oddsratio(N, rev = 'c')
## $data
##          
##           nhiều  ít Total
##   duoi 30    89 115   204
##   tren 30   355 401   756
##   Total     444 516   960
## 
## $measure
##          odds ratio with 95% C.I.
##           estimate  lower upper
##   duoi 30   1.0000     NA    NA
##   tren 30   0.8746 0.6393 1.193
## 
## $p.value
##          two-sided
##           midp.exact fisher.exact chi.square
##   duoi 30         NA           NA         NA
##   tren 30     0.3989        0.429     0.3972
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "median-unbiased estimate & mid-p exact CI"

Tỷ lệ giữa người gắn bó trên 5 năm và gắn bó dưới 5 năm mà dưới 30 tuổi so với người gắn bó trên 5 năm và gắn bó dưới mà trên 30 tuổi là 0.8746.

3.5 : THỐNG KÊ SUY DIỄN CHO DỮ LIỆU

3.5.1 Biến Exited và biến HasCrCard

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

Giả thuyết:

  • H0 : 2 biến độc lập
  • H1 : 2 biến không độc lập
chisq.test(A)
## 
##  Pearson's Chi-squared test with Yates' continuity correction
## 
## data:  A
## X-squared = 0.21, df = 1, p-value = 0.6

Với p-value = 0.6445 > 0.05 , chấp nhận H0. Vì vậy chưa có cơ sở để nói biến HasCrCard có liên quan đến Biến Exited.

3.5.2 Biến Exited và biến IsActiveMember

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

Giả thuyết:

  • H0 : 2 biến độc lập
  • H1 : 2 biến không độc lập
chisq.test(E)
## 
##  Pearson's Chi-squared test with Yates' continuity correction
## 
## data:  E
## X-squared = 14, df = 1, p-value = 2e-04

Với p-value = 0.0001 < 0.05 , bác bỏ H0. Vì vậy Biến IsActiveMember có liên quan đến Biến Exited.

3.5.3 Biến Exited và biến Gender

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

Giả thuyết:

  • H0 : 2 biến độc lập
  • H1 : 2 biến không độc lập
chisq.test(R)
## 
##  Pearson's Chi-squared test with Yates' continuity correction
## 
## data:  R
## X-squared = 23, df = 1, p-value = 2e-06

Với p-value < 0.05 , bác bỏ H0. Vì vậy biến Gender có liên quan đến Biến Exited.

3.5.4 Biến Exited và biến EstimatedSalary

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

Giả thuyết:

  • H0 : 2 biến độc lập
  • H1 : 2 biến không độc lập
chisq.test(SLTL$Exited,SLTL$EstimatedSalary)
## Warning in chisq.test(SLTL$Exited, SLTL$EstimatedSalary): Chi-squared
## approximation may be incorrect
## 
##  Pearson's Chi-squared test
## 
## data:  SLTL$Exited and SLTL$EstimatedSalary
## X-squared = 1000, df = 998, p-value = 0.5

Với p-value > 0.05 , chấp nhận H0. Vì vậy chưa có cơ sở để nói biến EstimatedSalary có liên quan đến Biến Exited.

3.5.5 Biến Exited và biến Age

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

Giả thuyết:

  • H0 : 2 biến độc lập
  • H1 : 2 biến không độc lập
chisq.test(SLTL$Exited,SLTL$Age)
## Warning in chisq.test(SLTL$Exited, SLTL$Age): Chi-squared approximation may be
## incorrect
## 
##  Pearson's Chi-squared test
## 
## data:  SLTL$Exited and SLTL$Age
## X-squared = 214, df = 62, p-value <2e-16

Với p-value < 0.05 , bác bỏ H0.Vì vậy Biến Age có liên quan đến Biến Exited.

3.6 Ước lượng tỷ lệ

ggplot(SLTL,aes(Exited))+ geom_bar(color = "black", fill = "white")+ geom_text(aes(label = scales :: percent(after_stat(count/sum(count)))), stat=  'count', color = 'black', vjust = -.5)+ ylab("Số người")+ xlab("Exited")

ggplot(SLTL,aes(Gender))+ geom_bar(color = "black", fill = "white")+ geom_text(aes(label = scales :: percent(after_stat(count/sum(count)))), stat=  'count', color = 'black', vjust = -.5)+ ylab("Số người")+ xlab("Gender")

Ước lượng tỷ lệ khách hàng nam rời khỏi ngân hàng:

d<- SLTL[SLTL$Gender == "Male",]
prop.test(length(d$Gender), length(SLTL$Gender), p = 0.54)
## 
##  1-sample proportions test with continuity correction
## 
## data:  length(d$Gender) out of length(SLTL$Gender), null probability 0.54
## X-squared = 0.025, df = 1, p-value = 0.9
## alternative hypothesis: true p is not equal to 0.54
## 95 percent confidence interval:
##  0.5055 0.5682
## sample estimates:
##     p 
## 0.537
  • Khoảng ước lượng với mức ý nghĩ 5% là từ 0.5055 đến 0.5682

Ước lượng tỷ lệ khách hàng nữ rời khỏi ngân hàng:

d<- SLTL[SLTL$Gender == "Female",]
prop.test(length(d$Gender), length(SLTL$Gender), p = 0.46)
## 
##  1-sample proportions test with continuity correction
## 
## data:  length(d$Gender) out of length(SLTL$Gender), null probability 0.46
## X-squared = 0.025, df = 1, p-value = 0.9
## alternative hypothesis: true p is not equal to 0.46
## 95 percent confidence interval:
##  0.4318 0.4945
## sample estimates:
##     p 
## 0.463
  • Khoảng ước lượng với mức ý nghĩ 5% là từ 0.4318 đến 0.4945

Ước lượng sự chênh lệch

rmm<- SLTL[SLTL$Gender == "Male",]
rmm1<-d[d$Exited=="0",]
rmf <- SLTL[SLTL$Gender == 'Female',]
rmf1<-rmf[rmf$Exited=="1",]

a <- c(nrow(rmm), nrow(rmf))
b <- c(nrow(rmm1), nrow(rmf1))
prop.test(b,a)
## 
##  2-sample test for equality of proportions with continuity correction
## 
## data:  b out of a
## X-squared = 114, df = 1, p-value <2e-16
## alternative hypothesis: two.sided
## 95 percent confidence interval:
##  0.2794 0.3993
## sample estimates:
## prop 1 prop 2 
## 0.6201 0.2808
  • Khoảng chêch lệch tỷ lệ với mức ý nghĩ 5% là từ 0.2794 đến 0.3993

3.7 Ma trận hệ số tương quan

cv <- SLTL[, sapply(SLTL, is.numeric)]
cor_matrix <- cor(cv)
cor_matrix
##                 RowNumber      Age    Tenure EstimatedSalary    Exited
## RowNumber        1.000000  0.02390  0.004749       -0.008825 -0.007737
## Age              0.023898  1.00000  0.033367       -0.026122  0.281193
## Tenure           0.004749  0.03337  1.000000        0.048866 -0.032832
## EstimatedSalary -0.008825 -0.02612  0.048866        1.000000 -0.017332
## Exited          -0.007737  0.28119 -0.032832       -0.017332  1.000000

CHƯƠNG 4 KẾT QUẢ MÔ HÌNH HỒI QUY

Sau khi kiểm định tính độc lập thì mô hình nghiên cứu bao gồm biến phụ thuộc là Exited và 3 biến độc lập là IsActiveMember, Gender, Age.

4.1 Mô hình logit

MH1 <- glm(Exited ~ IsActiveMember + Gender + Age , family= binomial( link = 'logit'), data=SLTL)
levels(factor(SLTL$Exited))
## [1] "0" "1"
summary(MH1)
## 
## Call:
## glm(formula = Exited ~ IsActiveMember + Gender + Age, family = binomial(link = "logit"), 
##     data = SLTL)
## 
## Coefficients:
##                   Estimate Std. Error z value Pr(>|z|)    
## (Intercept)       -3.21363    0.31024  -10.36  < 2e-16 ***
## IsActiveMemberYes -0.92923    0.17685   -5.25  1.5e-07 ***
## GenderMale        -0.83198    0.16839   -4.94  7.8e-07 ***
## Age                0.06656    0.00733    9.08  < 2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 1035.81  on 999  degrees of freedom
## Residual deviance:  907.32  on 996  degrees of freedom
## AIC: 915.3
## 
## Number of Fisher Scoring iterations: 5
  • Mô hình logit : -3.21363 -0.92923IsActiveMemberYes -0.83198GenderMale + 0.06656Age

Kiểm định tính phù hợp của mô hình logit:

H0: Mô hình không phù hợp với dữ liệu

H1: Mô hình phù hợp với dữ liệu

lr_test1 <- anova(MH1, test = "Chisq")
p_value1 <- lr_test1$Pr[2]
p_value1
## [1] 0.0001234

Với p-value < 5%. Ta kết luận mô hình logit phù hợp với dữ liệu.

4.2 Mô hình probit

MH2 <- glm(Exited ~  IsActiveMember + Gender  + Age  , family= binomial( link = 'probit'), data=SLTL)
summary(MH2)
## 
## Call:
## glm(formula = Exited ~ IsActiveMember + Gender + Age, family = binomial(link = "probit"), 
##     data = SLTL)
## 
## Coefficients:
##                   Estimate Std. Error z value Pr(>|z|)    
## (Intercept)       -1.91499    0.17677  -10.83  < 2e-16 ***
## IsActiveMemberYes -0.50098    0.09849   -5.09  3.6e-07 ***
## GenderMale        -0.48086    0.09544   -5.04  4.7e-07 ***
## Age                0.03897    0.00418    9.33  < 2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 1035.81  on 999  degrees of freedom
## Residual deviance:  906.47  on 996  degrees of freedom
## AIC: 914.5
## 
## Number of Fisher Scoring iterations: 5
  • Mô hình probit : -1.91499 - 0.50098IsActiveMemberYes -0.48086GenderMale + 0.03897Age

Kiểm định tính phù hợp của mô hình probit:

H0: Mô hình không phù hợp với dữ liệu

H1: Mô hình phù hợp với dữ liệu

lr_test <- anova(MH2, test = "Chisq")
p_value <- lr_test$Pr[2] 
p_value
## [1] 0.0001234

Với p-value < 5%. Ta kết luận mô hình probit phù hợp với dữ liệu.

4.3 Mô hình cloglog

MH3 <- glm(Exited ~  IsActiveMember + Gender  + Age , family= binomial( link = 'cloglog'), data=SLTL)
levels(factor(SLTL$Exited))
## [1] "0" "1"
summary(MH3)
## 
## Call:
## glm(formula = Exited ~ IsActiveMember + Gender + Age, family = binomial(link = "cloglog"), 
##     data = SLTL)
## 
## Coefficients:
##                   Estimate Std. Error z value Pr(>|z|)    
## (Intercept)       -2.90897    0.25337  -11.48  < 2e-16 ***
## IsActiveMemberYes -0.91602    0.15197   -6.03  1.7e-09 ***
## GenderMale        -0.68526    0.14211   -4.82  1.4e-06 ***
## Age                0.05344    0.00568    9.42  < 2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 1035.81  on 999  degrees of freedom
## Residual deviance:  908.26  on 996  degrees of freedom
## AIC: 916.3
## 
## Number of Fisher Scoring iterations: 7
  • Mô hình cloglog : -2.90897 - 0.91602IsActiveMemberYes -0.68526GenderMale + 0.05344Age

Kiểm định tính phù hợp của mô hình cloglog:

H0: Mô hình không phù hợp với dữ liệu

H1: Mô hình phù hợp với dữ liệu

lr_test <- anova(MH3, test = "Chisq")
p_value <- lr_test$Pr[2] 
p_value
## [1] 0.0001234

Với p-value < 5%. Ta kết luận mô hình cloglog phù hợp với dữ liệu.

4.4 Các tiêu chí đánh giá mô hình

Tiêu chí AIC

aic1 <- AIC(MH1)
aic2 <- AIC(MH2)
aic3 <- AIC(MH3)
AIC <-cbind(aic1,aic2,aic3)
AIC
##       aic1  aic2  aic3
## [1,] 915.3 914.5 916.3

Tiêu chí Deviance

de1 <- deviance(MH1)
de2 <- deviance(MH2)
de3 <- deviance(MH3)
deviance <- cbind(de1,de2,de3)
deviance
##        de1   de2   de3
## [1,] 907.3 906.5 908.3

Tiêu chí Brier Score

bs1 <- BrierScore(MH1)
bs2 <- BrierScore(MH2)
bs3 <- BrierScore(MH3)
BrierScore <- cbind(bs1,bs2,bs3)
BrierScore
##         bs1    bs2    bs3
## [1,] 0.1458 0.1459 0.1453

-> Giá trị của 3 tiêu chí trên càng nhỏ nghĩa là mô hình càng tốt.Vì vậy ta lựa chọn mô hình hàm hồi quy probit.

4.5 Kết quả mô hình

summary(MH2)
## 
## Call:
## glm(formula = Exited ~ IsActiveMember + Gender + Age, family = binomial(link = "probit"), 
##     data = SLTL)
## 
## Coefficients:
##                   Estimate Std. Error z value Pr(>|z|)    
## (Intercept)       -1.91499    0.17677  -10.83  < 2e-16 ***
## IsActiveMemberYes -0.50098    0.09849   -5.09  3.6e-07 ***
## GenderMale        -0.48086    0.09544   -5.04  4.7e-07 ***
## Age                0.03897    0.00418    9.33  < 2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 1035.81  on 999  degrees of freedom
## Residual deviance:  906.47  on 996  degrees of freedom
## AIC: 914.5
## 
## Number of Fisher Scoring iterations: 5

Sau khi thực hiện hồi quy probit, ta được kết quả như sau:

Yếu tố thành viên thân thiết (IsActiveMember) có ý nghĩa thống kê với biến Exited (Khách hàng rời bỏ) cho thấy yếu tố khách hàng thân thiết sẽ ảnh hưởng đến việc khách hàng rời bỏ và yếu tố người là khách hàng thân thiết của ngân hàng có tỷ lệ rời bỏ cao hơn yếu tố người không là khách hàng thân thiết của ngân hàng.

Yếu tố giới tính (Gender) có ý nghĩa thống kê với biến Exited (Khách hàng rời bỏ) cho thấy giới tính sẽ ảnh hưởng đến việc khách hàng rời bỏ và yếu tố khách hàng có giới tính là nam có tỷ lệ rời bỏ cao hơn yếu tố người có giới tính là nữ.

Yếu tố độ tuổi (Age) có ý nghĩa thống kê với biến Exited (Khách hàng rời bỏ) cho thấy yếu tố tuổi cũng sẽ ảnh hưởng đến việc khách hàng rời bỏ.

4.6 Khoảng ước lượng cho hệ số hồi quy

confint.default(MH2)
##                      2.5 %   97.5 %
## (Intercept)       -2.26145 -1.56852
## IsActiveMemberYes -0.69403 -0.30794
## GenderMale        -0.66793 -0.29380
## Age                0.03079  0.04716

4.7 Mô hình hồi quy dữ liệu poisson

PS <- glm(Tenure~ EstimatedSalary + Age + HasCrCard + Gender+ IsActiveMember , family = poisson(link = 'log'), data = SLTL)
summary(PS)
## 
## Call:
## glm(formula = Tenure ~ EstimatedSalary + Age + HasCrCard + Gender + 
##     IsActiveMember, family = poisson(link = "log"), data = SLTL)
## 
## Coefficients:
##                    Estimate Std. Error z value Pr(>|z|)    
## (Intercept)        1.50e+00   6.39e-02   23.43   <2e-16 ***
## EstimatedSalary    4.77e-07   2.45e-07    1.95    0.051 .  
## Age                1.46e-03   1.23e-03    1.19    0.235    
## HasCrCardYes       5.05e-03   3.07e-02    0.16    0.869    
## GenderMale        -2.99e-02   2.83e-02   -1.06    0.291    
## IsActiveMemberYes  4.62e-02   2.85e-02    1.63    0.104    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for poisson family taken to be 1)
## 
##     Null deviance: 1887.2  on 999  degrees of freedom
## Residual deviance: 1877.7  on 994  degrees of freedom
## AIC: 5113
## 
## Number of Fisher Scoring iterations: 5

CHƯƠNG 5 KẾT LUẬN VÀ KIẾN NGHỊ

5.1 Kết Luận

Qua kết quả nghiên cứu, ta thấy được rằng yếu tố khách hàng thân thiết, giới tính, độ tuổi sẽ ảnh hưởng một phần nào đó đến việc khách hàng quyết định sẽ rời bỏ ngân hàng. Dựa vào đó ngân hàng sẽ có thể đưa ra những chính sách và giải pháp để hạn chế việc khách hàng rời bỏ ngân hàng.

5.2 Kiến Nghị

  • Ngân hàng nên có những chính sách ưu đãi dành cho những khách hàng như tích điểm, khuyến mãi,hưởng lãi suất, phí và chi phí ưu đãi…

  • các dịch vụ chăm sóc khách hàng cá nhân, bảo đảm cho họ luôn tiếp cận tức khắc với nhân viên phụ trách tài khoản của mình hoặc cấp trên để thực hiện mọi giao dịch, từ việc thanh toán séc đến việc chuyển một số tiền lớn từ tài khoản này đến tài khoản khác, hoặc được tư vấn từ các nhà chuyên môn về thuế, các vấn đề về luật pháp và tài chính

  • Ngân hàng nên có giải pháp về sản phẩm, dịch vụ, tính năng tốt, có nhân viên phục vụ riêng và đầu tư tốt về công nghệ.

  • Cải thiện các kỹ năng và thái độ khi chăm sóc khách hàng để họ có những trải nghiệm tốt để được phục vụ tai ngân hàng.

TÀI LIỆU THAM KHẢO

T.K.Thanh, T.M.Tường, V.A.L.Duy, Bài giảng Phân tích dữ liệu định tính.

LS0tDQp0aXRsZTogIlRJ4buCVSBMVeG6rE4gUEjDgk4gVMONQ0ggROG7riBMSeG7hlUgxJDhu4pOSCBUw41OSCINCmF1dGhvcjogIkLDuWkgVsO1IEjhuqEgVnkiDQpkYXRlOiAiMjAyMy0wOC0wMSINCm91dHB1dDogDQogaHRtbF9kb2N1bWVudDoNCiAgdG9jOiB0cnVlDQogIHRvY19mbG9hdDogdHJ1ZQ0KICBudW1iZXJfc2V0aW9uczogdHJ1ZQ0KICBjb2RlX2Rvd25sb2FkOiB0cnVlDQotLS0NCg0KYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0V9DQprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobyA9IFRSVUUpDQpgYGANCg0KDQpgYGB7cn0NCmxpYnJhcnkocmVhZHhsKQ0KbGlicmFyeShnZ3Bsb3QyKQ0KbGlicmFyeShlcGl0b29scykNCmxpYnJhcnkoRGVzY1Rvb2xzKQ0KbGlicmFyeShEVCkNCmxpYnJhcnkoZW5lcmd5KQ0Kb3B0aW9ucyhkaWdpdHMgPSA0KQ0KbGlicmFyeSh0aWR5dmVyc2UpDQpsaWJyYXJ5KGNhcmV0KQ0KYGBgDQoNCiMgQ0jGr8agTkcgMSA6IFThu5RORyBRVUFOIFbhu4AgTkdIScOKTiBD4buoVQ0KDQojIyAxLjEgTMO9IGRvIGNo4buNbiDEkeG7gSB0w6BpDQoNCktow6FjaCBow6BuZyBsw6Agbmd14buTbiBjdW5nIGPhuqVwIGRvYW5oIHRodSwgbOG7o2kgbmh14bqtbiBjaG8gZG9hbmggbmdoaeG7h3AuIFZp4buHYyB0xINuZyBz4buRIGzGsOG7o25nIGtow6FjaCBow6BuZyBnacO6cCBkb2FuaCBuZ2hp4buHcCBt4bufIHLhu5luZyBxdXkgbcO0IHbDoCDEkeG7i25oIGjGsOG7m25nIGNoaeG6v24gbMaw4bujYyBwaMOhdCB0cmnhu4NuIGTDoGkgaOG6oW4uIE5o4buvbmcga2jDoWNoIGjDoG5nIG3hu5tpIG1hbmcgxJHhur9uIHRow6ptIG5ndeG7k24gdGh1IGNobyBkb2FuaCBuZ2hp4buHcCwgxJHhu5NuZyB0aOG7nWkgdMSDbmcgY8aw4budbmcgc+G7sSDEkWEgZOG6oW5nIHRyb25nIHThu4dwIGtow6FjaCBow6BuZyB2w6AgdOG6oW8gcmEgbmhp4buBdSBjxqEgaOG7mWkgdGnhur9wIGPhuq1uIHRo4buLIHRyxrDhu51uZyBt4bubaS4NCg0KS2jDoWNoIGjDoG5nIMSRw7NuZyB2YWkgdHLDsiBxdWFuIHRy4buNbmcgbmjhuqV0IMSR4buRaSB24bubaSBi4bqldCBr4buzIG5nw6JuIGjDoG5nIG7DoG8gdsOgIGjhu40gY8OzIHRo4buDIHF1eeG6v3QgxJHhu4tuaCBz4buxIHThu5NuIHThuqFpLCBwaMOhdCB0cmnhu4NuIGPhu6dhIG5nw6JuIGjDoG5nIMSRw7MuIE7hur91IGtow7RuZyBjw7Mga2jDoWNoIGjDoG5nIHPhur0ga2jDtG5nIGPDsyBhaSBtdWEsIHPhu60gZOG7pW5nIHPhuqNuIHBo4bqpbSwgZOG7i2NoIHbhu6UuIFRoZW8gxJHDsywgdmnhu4djIGtow6FjaCBow6BuZyByw7p0IHTDoGkga2hv4bqjbiBraOG7j2kgbmfDom4gaMOgbmcgY8OzIHRo4buDIOG6o25oIGjGsOG7n25nIMSR4bq/biBuZ3Xhu5NuIHRp4buBbiBn4butaSwgbOG7o2kgbmh14bqtbiB2w6Aga2jDtG5nIHRo4buDIHThu5NuIHThuqFpLCBwaMOhdCB0cmnhu4NuLlbDrCB24bqteSBiw6BpIG5naGnDqm4gY+G7qXUgbXXhu5FuIHBow6JuIHTDrWNoIGPDoWMgeeG6v3UgdOG7kSDhuqNuaCBoxrDhu59uZyDEkeG6v24gcXV54bq/dCDEkeG7i25oIGPhu6dhIGtow6FjaCBow6BuZy4NCg0KIyMgMS4yIE3hu6VjIMSRw61jaCBuZ2hpw6puIGPhu6l1DQoNClBow6JuIHTDrWNoIGPDoWMgeeG6v3UgdOG7kSDhuqNuaCBoxrDhu59uZyDEkeG6v24gdmnhu4djIGtow6FjaCBow6BuZyBxdXnhur90IMSR4buLbmggcsO6dCB0w6BpIGtob+G6o24gcuG7nWkga2jhu49pIG5nw6JuIGjDoG5nLg0KDQojIyAxLjMgxJDhu5FpIHTGsOG7o25nIG5naGnDqm4gY+G7qXUNCg0KROG7ryBsaeG7h3UgxJHGsOG7o2MgdGh1IHRo4bqtcCB04burIHRyYW5nIHdlYiBrYWdnbGUuY29tIC4gVHJvbmcgYsOgaSBuw6B5IGThu68gbGnhu4d1IGJhbyBn4buTbSAxMDAwIGtow6FjaCBow6BuZyB24bubaSA3IHnhur91IHThu5EgxJHGsOG7o2MgeGVtIGzDoCBjw7MgdMOhYyDEkeG7mW5nIMSR4bq/biB2aeG7h2Mga2jDoWNoIGjDoG5nIHF1eeG6v3QgxJHhu4tuaCByw7p0IHTDoGkga2hv4bqjbiBy4budaSBraOG7j2kgbmfDom4gaMOgbmcuDQoNCg0KIyMgMS40IFBoxrDGoW5nIHBow6FwIG5naGnDqm4gY+G7qXUNCg0KQsOgaSBuZ2hpw6puIGPhu6l1IHPhu60gZOG7pW5nIHBoxrDGoW5nIHBow6FwIGjhu5NpIHF1eSBMb2dpc3RpYyBnaeG6o2kgdGjDrWNoIHPhu7EgdMawxqFuZyB0w6FjIGPhu6dhIGPDoWMgeeG6v3UgdOG7kSBsw6puIGJp4bq/biBwaOG7pSB0aHXhu5ljIHRyb25nIGjhu5NpIHF1eSB0aMO0bmcgcXVhIDMgbcO0IGjDrG5oIExvZ2l0LCBQcm9iaXQsIENsb2dsb2cuIFThu6sgxJHDsyDEkcOhbmggZ2nDoSBr4bq/dCBxdeG6oyBo4buTaSBxdXkgdsOgIGzhu7FhIGNo4buNbiBtw7QgaMOsbmggcGjDuSBo4bujcCBuaOG6pXQgxJHhu4MgZ2nhuqNpIHF1eeG6v3QgxJHGsOG7o2MgY8OhYyBt4bulYyB0acOqdSDEkeG7gSByYS4NCg0KIyMgMS41IEvhur90IGPhuqV1IGLDoGkgbmdoacOqbiBj4bupdQ0KDQpDaMawxqFuZyAxOiBU4buVbmcgcXVhbiBuZ2hpw6puIGPhu6l1DQoNCkNoxrDGoW5nIDI6IEPGoSBz4bufIGzDvSB0aHV54bq/dCB2w6AgZOG7ryBsaeG7h3UgbmdoacOqbiBj4bupdQ0KDQpDSMawxqFuZyAzOiBQaMOibiB0w61jaCBk4buvIGxp4buHdQ0KDQpDaMawxqFuZyA0OiBL4bq/dCBxdeG6oyBtw7QgaMOsbmggbmdoacOqbiBj4bupdQ0KDQpDaMawxqFuZyA1OiBL4bq/dCBsdeG6rW4gdsOgIGtodXnhur9uIG5naOG7iw0KDQoNCiMgQ0jGr8agTkcgMiA6IEThu64gTEnhu4ZVIE5HSEnDik4gQ+G7qFUNCg0KIyMgMi4xIEdp4bubaSB0aGnhu4d1IHbhu4EgYuG7mSBk4buvIGxp4buHdQ0KDQpC4buZIGThu68gbGnhu4d1IG7DoHkgY2jhu6lhIHRow7RuZyB0aW4gY2hpIHRp4bq/dCB24buBIGtow6FjaCBow6BuZyBj4bunYSBuZ8OibiBow6BuZyB2w6AgcGjhuqNuIMOhbmggdGjhu7FjIHThur8gbGnhu4d1IGtow6FjaCBow6BuZyDEkcOjIHLhu51pIG5nw6JuIGjDoG5nICjEkcOzbmcgdMOgaSBraG/huqNuKSBoYXkgdGnhur9wIHThu6VjIGzDoCBraMOhY2ggaMOgbmcuDQoNCkThu68gbGnhu4d1IGJhbyBn4buTbSA3IEJp4bq/biB2w6AgMTAwMCBxdWFuIHPDoXQuDQoNCiMjIDIuMiBNw7QgdOG6oyBjw6FjIGJp4bq/bg0KDQotIEV4aXRlZCA6IEtow6FjaCBow6BuZyBjw7MgcuG7nWkga2jhu49pIG5nw6JuIGjDoG5nIGhheSBraMO0bmc/LCBjw7MgMiBnacOhIHRy4buLIDEgKHLhu51pIGto4buPaSkgdsOgIDAoa2jDtG5nIHLhu51pIGto4buPaSkNCg0KLSBHZW5kZXIgOiBHaeG7m2kgVMOtbmggY+G7p2Ega2jDoWNoIGjDoG5nLCBjw7MgMiBnacOhIHRy4buLIEZlbWFsZSB2w6AgTWFsZQ0KDQotIEFnZQk6IFR14buVaSBj4bunYSBraMOhY2ggaMOgbmcNCg0KLSBUZW51cmUgOiBT4buRIG7Eg20ga2jDoWNoIGjDoG5nIGfhuq9uIGLDsw0KDQotIEhhc0NyQ2FyZAk6Q8OzIHRo4bq7IHTDrW4gZOG7pW5nIGhheSBraMO0bmc/LCBjw7MgMiBnacOhIHRy4buLIFllcyB2w6AgTm8NCg0KLSBJc0FjdGl2ZU1lbWJlciA6IEPDsyBwaOG6o2kgbMOgIGtow6FjaCBow6BuZyB0aMOibiB0aGnhur90IGhheSBraMO0bmc/LCBjw7MgMiBnacOhIHRy4buLIFllcyB2w6AgTm8NCg0KLSBFc3RpbWF0ZWRTYWxhcnkJOiBUaeG7gW4gbMawxqFuZyBj4bunYSBraMOhY2ggaMOgbmcNCg0KIyMgMi4zIFF1YW4gc8OhdCB24buBIGThu68gbGnhu4d1DQoNCmBgYHtyfQ0KU0xUTDwtIHJlYWRfZXhjZWwoIkM6L1VzZXJzL3BjL0Rvd25sb2Fkcy9TTFBULnhsc3giKQ0Kc3RyKFNMVEwpDQpkYXRhdGFibGUoU0xUTCkNCmBgYA0KIyMgMi40IE3DtCBow6xuaCDEkeG7gSB4deG6pXQgDQoNCiRFeGl0ZWQ9IFxiZXRhXzAgKyBcYmV0YV8xIEdlbmRlciArIFxiZXRhXzJBZ2UrXGJldGFfM0hhc0NyQ2FyZCtcYmV0YV80SXNBY3RpdmVNZW1iZXIrXGJldGFfNUVzdGltYXRlZFNhbGFyeSQNCg0KQmnhur9uIHBo4bulIHRodeG7mWMgbMOgIGJp4bq/biBFeGl0ZWQNCg0KQmnhu4djIMSR4buZYyBs4bqtcCBsw6AgR2VuZGVyLCBBZ2UsIEhhc0NyQ2FyZCwgSXNBY3RpdmVNZW1iZXIsIEVzdGltYXRlZFNhbGFyeQ0KDQoNCiMgQ0jGr8agTkcgMyBQSMOCTiBUw41DSCBE4buuIExJ4buGVQ0KDQojIyAzLjEgVGjhu5FuZyBrw6ogbcO0IHThuqMgYmnhur9uIHBo4bulIHRodeG7mWMNCg0KIyMjMy4xLjEgQmnhur9uIMSR4buLbmggdMOtbmggbMOgbSBiaeG6v24gcGjhu6UgdGh14buZYw0KDQpUYSBjaOG7jW4gYmnhur9uIEV4aXRlZCBsw6BtIGJp4bq/biBwaOG7pSB0aHXhu5ljLiBWw6wgdmnhu4djIGtow6FjaCBow6BuZyBy4budaSBi4buPIGPDsyB0aOG7gyBi4buLIOG6o25oIGjGsOG7n25nIGLhu59pIGPDoWMgeeG6v3UgdOG7kSBuaMawIGzDoCDEkeG7mSB0deG7lWksIHRp4buBbiBsxrDGoW5nLCBnaeG7m2kgdMOtbmgsIC4uLi4gDQoNCkLhuqNuZyBU4bqnbiBT4buRDQoNCmBgYHtyfQ0KdGFibGUoU0xUTCRFeGl0ZWQpDQpgYGANCg0KQuG6o25nIFThuqduIFN14bqldA0KDQpgYGB7cn0NCnRhYmxlKFNMVEwkRXhpdGVkKS9zdW0odGFibGUoU0xUTCRFeGl0ZWQpKQ0KYGBgDQoNCsSQ4buTIHRo4buLDQoNCmBgYHtyfQ0KZ2dwbG90KFNMVEwsYWVzKEV4aXRlZCkpKyBnZW9tX2Jhcihjb2xvciA9ICJncmVlbiIsIGZpbGwgPSAiZ3JlZW4iKSsgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IHNjYWxlcyA6OiBwZXJjZW50KGFmdGVyX3N0YXQoY291bnQvc3VtKGNvdW50KSksIGFjY3VyYWN5PSAwLjAxKSksIHN0YXQ9ICAnY291bnQnLCBjb2xvciA9ICdibGFjaycsIHZqdXN0ID0gLS41KSsgeWxhYigiTnVtYmVyIikrIHhsYWIoIkV4aXRlZCIpDQpgYGANCg0KDQpUcm9uZyAxMDAwIGtow6FjaCBow6BuZyBj4bunYSBuZ8OibiBow6BuZyA6DQoNCi0gQ8OzIDc4NyBraMOhY2ggaMOgbmcgKCBjaGnhur9tIDc4LjclICkga2jDtG5nIHLhu51pIGto4buPaSBuZ8OibiBow6BuZy4NCg0KLSBDw7MgMjEzIGtow6FjaCBow6BuZyAoIGNoaeG6v20gMjEuMyUgKSBy4budaSBraOG7j2kgbmfDom4gaMOgbmcuDQoNCiMjIyAzLjEuMiBCaeG6v24gxJHhu4tuaCBsxrDhu6NuZyBsw6BtIGJp4bq/biBwaOG7pSB0aHXhu5ljDQoNClRhIGNo4buNbiBiaeG6v24gVGVudXJlIGzDoG0gYmnhur9uIHBo4bulIHRodeG7mWMgVsOsIG114buRbiBwaMOibiB0w61jaCBz4buRIG7Eg20ga2jDoWNoIGjDoG5nIGfhuq9uIGLDsyB24bubaSBuZ8OibiBow6BuZyBjw7MgY2jhu4t1IOG6o25oIGjGsOG7n25nIGLhu59pIGPDoWMgeeG6v3UgdOG7kSBraMOhYyBoYXkga2jDtG5nLg0KDQpgYGB7cn0NCnN1bW1hcnkoU0xUTCRUZW51cmUpDQpgYGANCg0KDQotIFRyb25nIDEwMDAga2jDoWNoIGjDoG5nIGPhu6dhIG5nw6JuIGjDoG5nOg0KDQpT4buRIG7Eg20ga2jDoWNoIGjDoG5nIGfhuq9uIGLDsyB24bubaSBuZ8OibiBow6BuZyBuaGnhu4F1IG5o4bqldCBsw6AgOiAxMCBuxINtDQoNClPhu5EgbsSDbSBraMOhY2ggaMOgbmcgZ+G6r24gYsOzIHbhu5tpIG5nw6JuIGjDoG5nIHRo4bqlcCBuaOG6pXQgbMOgIDAgbsSDbQ0KDQpT4buRIG7Eg20gdHJ1bmcgYsOsbmgga2jDoWNoIGjDoG5nIGfhuq9uIGLDsyB24bubaSBuZ8OibiBow6BuZyBsw6AgNSBuxINtDQoNCg0KYGBge3J9DQp0YWJsZShTTFRMJFRlbnVyZSkNCmBgYA0KDQoNCsSQ4buTIHRo4buLDQoNCmBgYHtyfQ0KaGlzdChTTFRMJFRlbnVyZSkNCmBgYA0KDQoNCiMjIDMuMiAgVGjhu5FuZyBrw6ogbcO0IHThuqMgQ8OhYyBCaeG6v24gxJDhu4tuaCBUw61uaA0KDQojIyMgMy4yLjEgQmnhur9uIEdlbmRlcg0KDQoNCmBgYHtyfQ0KdGFibGUoU0xUTCRHZW5kZXIpDQpgYGANCg0KYGBge3J9DQp0YWJsZShTTFRMJEdlbmRlcikvc3VtKHRhYmxlKFNMVEwkR2VuZGVyKSkNCmBgYA0KDQrEkOG7kyB0aOG7iw0KDQpgYGB7cn0NCmdncGxvdChTTFRMLGFlcyhHZW5kZXIpKSsgZ2VvbV9iYXIoY29sb3IgPSAiYmx1ZSIsIGZpbGwgPSAiYmx1ZSIpKyBnZW9tX3RleHQoYWVzKGxhYmVsID0gc2NhbGVzIDo6IHBlcmNlbnQoYWZ0ZXJfc3RhdChjb3VudC9zdW0oY291bnQpKSwgYWNjdXJhY3k9IDAuMDEpKSwgc3RhdD0gICdjb3VudCcsIGNvbG9yID0gJ2JsYWNrJywgdmp1c3QgPSAtLjUpKyB5bGFiKCJOdW1iZXIiKSsgeGxhYigiR2VuZGVyIikNCmBgYA0KDQoNClRyb25nIDEwMDAga2jDoWNoIGjDoG5nIGPhu6dhIG5nw6JuIGjDoG5nIDoNCg0KLSBDw7MgNDYzIGtow6FjaCBow6BuZyAoIGNoaeG6v20gNDYuMyUgKSB0aHXhu5ljIGdp4bubaSB0w61uaCBsw6AgTuG7rw0KDQotIEPDsyA1Mzcga2jDoWNoIGjDoG5nICggY2hp4bq/bSA1My43JSApIHRodeG7mWMgZ2nhu5tpIHTDrW5oIGzDoCBOYW0NCg0KIyMjIDMuMi4yIEJp4bq/biBIYXNDckNhcmQNCg0KDQoNCmBgYHtyfQ0KdGFibGUoU0xUTCRIYXNDckNhcmQpDQpgYGANCg0KDQpgYGB7cn0NCnRhYmxlKFNMVEwkSGFzQ3JDYXJkKS9zdW0odGFibGUoU0xUTCRIYXNDckNhcmQpKQ0KYGBgDQoNCsSQ4buTIHRo4buLIA0KDQpgYGB7cn0NCmdncGxvdChTTFRMLGFlcyhIYXNDckNhcmQpKSsgZ2VvbV9iYXIoY29sb3IgPSAiYmx1ZSIsIGZpbGwgPSAiYmx1ZSIpKyBnZW9tX3RleHQoYWVzKGxhYmVsID0gc2NhbGVzIDo6IHBlcmNlbnQoYWZ0ZXJfc3RhdChjb3VudC9zdW0oY291bnQpKSwgYWNjdXJhY3k9IDAuMDEpKSwgc3RhdD0gICdjb3VudCcsIGNvbG9yID0gJ2JsYWNrJywgdmp1c3QgPSAtLjUpKyB5bGFiKCJOdW1iZXIiKSsgeGxhYigiSGFzQ3JDYXJkIikNCmBgYA0KDQoNClRyb25nIDEwMDAga2jDoWNoIGjDoG5nIGPhu6dhIG5nw6JuIGjDoG5nIDoNCg0KLSBDw7MgMzA0IGtow6FjaCBow6BuZyAoIGNoaeG6v20gMzAuNCUgKSBraMO0bmcgY8OzIHPhu60gZOG7pW5nIHRo4bq7IHTDrW4gZOG7pW5nLg0KDQotIEPDsyA2OTYga2jDoWNoIGjDoG5nICggY2hp4bq/bSA2OS42JSApIGPDsyBz4butIGThu6VuZyB0aOG6uyB0w61uIGThu6VuZy4NCg0KIyMjIDMuMi4zIEJp4bq/biBJc0FjdGl2ZU1lbWJlcg0KDQoNCg0KYGBge3J9DQp0YWJsZShTTFRMJElzQWN0aXZlTWVtYmVyKQ0KYGBgDQoNCg0KYGBge3J9DQp0YWJsZShTTFRMJElzQWN0aXZlTWVtYmVyKS9zdW0odGFibGUoU0xUTCRJc0FjdGl2ZU1lbWJlcikpDQpgYGANCg0KxJDhu5MgdGjhu4sNCg0KYGBge3J9DQpnZ3Bsb3QoU0xUTCxhZXMoSXNBY3RpdmVNZW1iZXIpKSsgZ2VvbV9iYXIoY29sb3IgPSAiZ3JlZW4iLCBmaWxsID0gImdyZWVuIikrIGdlb21fdGV4dChhZXMobGFiZWwgPSBzY2FsZXMgOjogcGVyY2VudChhZnRlcl9zdGF0KGNvdW50L3N1bShjb3VudCkpLCBhY2N1cmFjeT0gMC4wMSkpLCBzdGF0PSAgJ2NvdW50JywgY29sb3IgPSAnYmxhY2snLCB2anVzdCA9IC0uNSkrIHlsYWIoIk51bWJlciIpKyB4bGFiKCJJc0FjdGl2ZU1lbWJlciIpDQpgYGANCg0KDQpUcm9uZyAxMDAwIGtow6FjaCBow6BuZyBj4bunYSBuZ8OibiBow6BuZyA6DQoNCi0gQ8OzIDQ5NCBraMOhY2ggaMOgbmcgKCBjaGnhur9tIDQ5LjQlICkga2jDtG5nIHBo4bqjaSBsw6AgdGjDoG5oIHZpw6puIHRow6JuIHRoaeG6v3QgY+G7p2EgbmfDom4gaMOgbmcuDQoNCi0gQ8OzIDUwNiBraMOhY2ggaMOgbmcgKCBjaGnhur9tIDUwLjYlICkgbMOgIHRow6BuaCB2acOqbiB0aMOibiB0aGnhur90IGPhu6dhIG5nw6JuIGjDoG5nLg0KDQoNCiMjIDMuMyBUaOG7kW5nIGvDqiBtw7QgdOG6oyBjw6FjIGJp4bq/biDEkeG7i25oIGzGsOG7o25nDQoNCiMjIyAzLjMuMSBCaeG6v24gRXN0aW1hdGVkU2FsYXJ5DQoNCmBgYHtyfQ0Kc3VtbWFyeShTTFRMJEVzdGltYXRlZFNhbGFyeSkNCmBgYA0KDQotIFRyb25nIDEwMDAga2jDoWNoIGjDoG5nIGPhu6dhIG5nw6JuIGjDoG5nOg0KDQpUaeG7gW4gbMawxqFuZyDGsOG7m2MgdMOtbmggY2FvIG5o4bqldCBsw6AgOiAxOTk5NzAuNyQNCg0KVGnhu4FuIGzGsMahbmcgxrDhu5tjIHTDrW5oIHRo4bqlcCBuaOG6pXQgbMOgIDI0Ny40JA0KDQpUaeG7gW4gbMawxqFuZyDGsOG7m2MgdMOtbmggdHJ1bmcgYsOsbmggbMOgIDEwMDc4OS4xJA0KDQoNCg0KxJDhu5MgdGjhu4sNCg0KYGBge3J9DQpoaXN0KFNMVEwkRXN0aW1hdGVkU2FsYXJ5KQ0KYGBgDQoNCg0KDQojIyMgMy4zLjIgQmnhur9uIEFnZQ0KDQpgYGB7cn0NCnN1bW1hcnkoU0xUTCRBZ2UpDQoNCmBgYA0KDQotIFRyb25nIDEwMDAga2jDoWNoIGjDoG5nIGPhu6dhIG5nw6JuIGjDoG5nOg0KDQpUdeG7lWkgY+G7p2Ega2jDoWNoIGjDoG5nIGNhbyBuaOG6pXQgbMOgIDogODUgdHXhu5VpDQoNClR14buVaSBj4bunYSBraMOhY2ggaMOgbmcgdGjhuqVwIG5o4bqldCBsw6AgMTggdHXhu5VpDQoNClRydW5nIGLDrG5oIFR14buVaSBj4bunYSBraMOhY2ggaMOgbmcgbMOgIDM5IHR14buVaQ0KDQoNCsSQ4buTIHRo4buLDQoNCmBgYHtyfQ0KaGlzdChTTFRMJEFnZSkNCmBgYA0KDQoNCiMjIDMuNCBUSOG7kE5HIEvDiiBNw5QgVOG6oiBDSE8gMiBCSeG6vk4NCg0KIyMjIDMuNC4xIEJp4bq/biBFeGl0ZWQgdsOgIGJp4bq/biBIYXNDckNhcmQNCg0KQuG6o25nIHThuqduIHN14bqldA0KDQpgYGB7cn0NCkE8LXRhYmxlKFNMVEwkSGFzQ3JDYXJkLFNMVEwkRXhpdGVkKQ0KcHJvcC50YWJsZShBKQ0KYGBgDQoNCg0KYGBge3J9DQphZGRtYXJnaW5zKEEpDQpgYGANCg0KDQoqIFRyb25nIDc4NyBuZ8aw4budaSBraMO0bmcgcuG7nWkga2jhu49pIG5nw6JuIGjDoG5nIGPDsyAgMjM2IG5nxrDhu51pIGtow7RuZyBjw7MgdGjhursgdMOtbiBk4bulbmcgdsOgIDU1MSBuZ8aw4budaSBjw7MgdGjhursgdMOtbiBk4bulbmcuDQoNCiogVHJvbmcgMjEzIG5nxrDhu51pIHLhu51pIGto4buPaSBuZ8OibiBow6BuZyBjw7MgNjggbmfGsOG7nWkga2jDtG5nIGPDsyB0aOG6uyB0w61uIGThu6VuZyB2w6AgMTQ1IG5nxrDhu51pIGPDsyB0aOG6uyB0w61uIGThu6VuZy4NCg0KYGBge3J9DQpnZ3Bsb3QoU0xUTCwgYWVzKEV4aXRlZCwgZmlsbCA9IEhhc0NyQ2FyZCkpICsgZ2VvbV9iYXIocG9zaXRpb24gPSAnZG9kZ2UnKQ0KYGBgDQoNCg0KVMOtbmggcuG7p2kgcm8gdMawxqFuZyDEkeG7kWkNCg0KYGBge3J9DQpyaXNrcmF0aW8oQSkNCmBgYA0KDQotIFbhuq15IHThu4kgbOG7hyBuaOG7r25nIG5nxrDhu51pIHLhu51pIGto4buPaSBuZ8OibiBow6BuZyBjw7MgdGjhursgdMOtbiBk4bulbmcgZ+G6pXAgMC45MyBs4bqnbiBzbyB24bubaSBuaOG7r25nIG5nxrDhu51pIHLhu51pIGto4buPaSBuZ8OibiBow6BuZyBraMO0bmcgY8OzIHRo4bq7IHTDrW4gZOG7pW5nLg0KDQoNCmBgYHtyfQ0Kcmlza3JhdGlvKEEsIHJldiA9ICdjJykNCmBgYA0KDQotIFbhuq15IHThu4kgbOG7hyBuaOG7r25nIG5nxrDhu51pIGtow7RuZyBy4budaSBraOG7j2kgbmfDom4gaMOgbmcgY8OzIHRo4bq7IHTDrW4gZOG7pW5nIGfhuqVwIDEuMDIgbOG6p24gc28gduG7m2kgbmjhu69uZyBuZ8aw4budaSBraMO0bmcgcuG7nWkga2jhu49pIG5nw6JuIGjDoG5nIGtow7RuZyBjw7MgdGjhursgdMOtbiBk4bulbmcuDQoNClThu7cgbOG7hyBjaMOqbmgNCg0KYGBge3J9DQpvZGRzcmF0aW8oQSkNCmBgYA0KVOG7tyBs4buHIGdp4buvYSBuZ8aw4budaSBraMO0bmcgcuG7nWkga2jhu49pIHbDoCBy4budaSBraOG7j2kgbmfDom4gaMOgbmcgbcOgIGtow7RuZyBjw7MgdGjhursgdMOtbiBk4bulbmcgc28gduG7m2kgbmfGsOG7nWkga2jDtG5nIHLhu51pIGto4buPaSB2w6AgcuG7nWkga2jhu49pIG5nw6JuIGjDoG5nIG3DoCBjw7MgdGjhursgdMOtbiBk4bulbmcgbMOgIDAuOTEyNiANCg0KYGBge3J9DQpvZGRzcmF0aW8oQSwgcmV2ID0gJ2MnKQ0KYGBgDQoNClThu7cgbOG7hyBnaeG7r2EgbmfGsOG7nWkgcuG7nWkga2jhu49pIHbDoCBraMO0bmcgcuG7nWkga2jhu49pIG5nw6JuIGjDoG5nIG3DoCBraMO0bmcgY8OzIHRo4bq7IHTDrW4gZOG7pW5nIHNvIHbhu5tpIG5nxrDhu51pIHLhu51pIGto4buPaSB2w6Aga2jDtG5nIHLhu51pIGto4buPaSBuZ8OibiBow6BuZyBtw6AgY8OzIHRo4bq7IHTDrW4gZOG7pW5nIGzDoCAxLjA5Ni4NCg0KDQojIyMgMy40LjIgQmnhur9uIEV4aXRlZCB2w6AgYmnhur9uIElzQWN0aXZlTWVtYmVyDQoNCkLhuqNuZyB04bqnbiBzdeG6pXQNCg0KYGBge3J9DQpFIDwtdGFibGUoU0xUTCRJc0FjdGl2ZU1lbWJlcixTTFRMJEV4aXRlZCkNCnByb3AudGFibGUoRSkNCmBgYA0KDQoNCmBgYHtyfQ0KYWRkbWFyZ2lucyhFKQ0KYGBgDQoNCiogVHJvbmcgMjEzIG5nxrDhu51pIHLhu51pIGto4buPaSBuZ8OibiBow6BuZyBjw7MgMTMwIG5nxrDhu51pIGtow7RuZyBwaOG6o2kgbMOgIHRow6BuaCB2acOqbiB0aMOibiB0aGnhur90IHbDoCA4MyBuZ8aw4budaSBjw7MgbMOgIGtow6FjaCBow6BuZyB0aMOibiB0aGnhur90Lg0KDQoqIFRyb25nIDc4NyBuZ8aw4budaSBraMO0bmcgcuG7nWkga2jhu49pIG5nw6JuIGjDoG5nIGPDsyAzNjQgbmfGsOG7nWkga2jDtG5nIHBo4bqjaSBsw6AgdGjDoG5oIHZpw6puIHRow6JuIHRoaeG6v3QgdsOgIDQyMyBuZ8aw4budaSBsw6Aga2jDoWNoIGjDoG5nIHRow6JuIHRoaeG6v3QNCg0KYGBge3J9DQpnZ3Bsb3QoU0xUTCwgYWVzKEV4aXRlZCwgZmlsbCA9IElzQWN0aXZlTWVtYmVyKSkgKyBnZW9tX2Jhcihwb3NpdGlvbiA9ICdkb2RnZScpDQpgYGANCg0KDQpUw61uaCBy4bunaSBybyB0xrDGoW5nIMSR4buRaQ0KDQpgYGB7cn0NCnJpc2tyYXRpbyhFKQ0KYGBgDQoNCi0gVuG6rXkgdOG7iSBs4buHIG5o4buvbmcgbmfGsOG7nWkgcuG7nWkga2jhu49pIG5nw6JuIGjDoG5nIGzDoCB0aMOgbmggdmnDqm4gdGjDom4gdGhp4bq/dCBn4bqlcCAwLjYzIGzhuqduICBzbyB24bubaSBuaOG7r25nIG5nxrDhu51pIHLhu51pIGto4buPaSBuZ8OibiBow6BuZyBraMO0bmcgbMOgIHRow6BuaCB2acOqbiB0aMOibiB0aGnhur90Lg0KDQpgYGB7cn0NCnJpc2tyYXRpbyhFLCByZXYgPSAnYycpDQpgYGANCg0KLSBW4bqteSB04buJIGzhu4cgbmjhu69uZyBuZ8aw4budaSBraMO0bmcgcuG7nWkga2jhu49pIG5nw6JuIGjDoG5nIGzDoCB0aMOgbmggdmnDqm4gdGjDom4gdGhp4bq/dCBn4bqlcCAxLjE0IGzhuqduIHNvIHbhu5tpIG5o4buvbmcgbmfGsOG7nWkga2jDtG5nIHLhu51pIGto4buPaSBuZ8OibiBow6BuZyBraMO0bmcgbMOgIHRow6BuaCB2acOqbiB0aMOibiB0aGnhur90Lg0KDQpU4bu3IGzhu4cgY2jDqm5oDQoNCmBgYHtyfQ0Kb2Rkc3JhdGlvKEUpDQpgYGANCg0KVOG7tyBs4buHIGdp4buvYSBuZ8aw4budaSBraMO0bmcgcuG7nWkga2jhu49pIHbDoCBy4budaSBraOG7j2kgbmfDom4gaMOgbmcgbcOgIGtow7RuZyBsw6AgdGjDoG5oIHZpw6puIHRow6JuIHRoaeG6v3Qgc28gduG7m2kgbmfGsOG7nWkga2jDtG5nIHLhu51pIGto4buPaSB2w6AgcuG7nWkga2jhu49pIG5nw6JuIGjDoG5nIG3DoCBsw6AgdGjDoG5oIHZpw6puIHRow6JuIHRoaeG6v3QgbMOgIDAuNTUwMQ0KDQpgYGB7cn0NCm9kZHNyYXRpbyhFLCByZXYgPSAnYycpDQpgYGANCiANClThu7cgbOG7hyBnaeG7r2EgbmfGsOG7nWkgcuG7nWkga2jhu49pIHbDoCBraMO0bmcgcuG7nWkga2jhu49pIG5nw6JuIGjDoG5nIG3DoCBraMO0bmcgbMOgIHRow6BuaCB2acOqbiB0aMOibiB0aGnhur90IHNvIHbhu5tpIG5nxrDhu51pIHLhu51pIGto4buPaSB2w6Aga2jDtG5nIHLhu51pIGto4buPaSBuZ8OibiBow6BuZyBtw6AgbMOgIHRow6BuaCB2acOqbiB0aMOibiB0aGnhur90IGzDoCAxLjgxOA0KDQojIyMgMy40LjMgQmnhur9uIEV4aXRlZCB2w6AgYmnhur9uIEdlbmRlcg0KDQpC4bqjbmcgdOG6p24gc3XhuqV0DQoNCmBgYHtyfQ0KUiA8LXRhYmxlKFNMVEwkR2VuZGVyLFNMVEwkRXhpdGVkKQ0KcHJvcC50YWJsZShSKQ0KYGBgDQoNCmBgYHtyfQ0KYWRkbWFyZ2lucyhSKQ0KYGBgDQoNCiogVHJvbmcgNzg3IG5nxrDhu51pIGtow7RuZyAgcuG7nWkga2jhu49pIG5nw6JuIGjDoG5nIGPDsyAzMzMgbmfGsOG7nWkgY8OzIGdp4bubaSB0w61uaCBsw6AgbuG7ryB2w6AgNDU0IG5nxrDhu51pIGPDsyBnaeG7m2kgdMOtbmggbMOgIG5hbS4NCg0KKiBUcm9uZyAyMTMgbmfGsOG7nWkgIHLhu51pIGto4buPaSBuZ8OibiBow6BuZyBjw7MgMTMwIG5nxrDhu51pIGPDsyBnaeG7m2kgdMOtbmggbMOgIG7hu68gdsOgIDgzIG5nxrDhu51pIGPDsyBnaeG7m2kgdMOtbmggbMOgIG5hbS4NCg0KDQpUw61uaCBy4bunaSBybyB0xrDGoW5nIMSR4buRaQ0KDQpgYGB7cn0NCnJpc2tyYXRpbyhSKQ0KYGBgDQoNCi0gVuG6rXkgdOG7iSBs4buHIG5o4buvbmcgbmfGsOG7nWkgIHLhu51pIGto4buPaSBuZ8OibiBow6BuZyBjw7MgZ2nhu5tpIHTDrW5oIGzDoCBuYW0gZ+G6pXAgMC41NSBs4bqnbiBzbyB24bubaSBuaOG7r25nIG5nxrDhu51pIHLhu51pIGto4buPaSBuZ8OibiBow6BuZyBjw7MgZ2nhu5tpIHTDrW5oIGzDoCBu4buvLg0KDQpgYGB7cn0NCnJpc2tyYXRpbyhSLCByZXYgPSAnYycpDQpgYGANCg0KDQotIFThu7cgbOG7hyBraMOhY2ggaMOgbmcga2jDtG5nIHLhu51pIGto4buPaSBuZ8OibiBow6BuZyBjw7MgZ2nhu5tpIHTDrW5oIGzDoCBuYW0gIGfhuqVwIDEuMTc1IGzhuqduIHNvIHbhu5tpIGtow6FjaCBow6BuZyBraMO0bmcgcuG7nWkga2jhu49pIG5nw6JuIGjDoG5nIGPDsyBnaeG7m2kgdMOtbmggbMOgIG7hu68uDQoNCg0KVOG7tyBs4buHIGNow6puaA0KDQpgYGB7cn0NCm9kZHNyYXRpbyhSKQ0KYGBgDQoNClThu7cgbOG7hyBnaeG7r2EgbmfGsOG7nWkga2jDtG5nIHLhu51pIGto4buPaSB2w6AgcuG7nWkga2jhu49pIG5nw6JuIGjDoG5nIGPDsyBnaeG7m2kgdMOtbmggbMOgIG7hu68gc28gduG7m2kgbmfGsOG7nWkga2jDtG5nIHLhu51pIGto4buPaSB2w6AgcuG7nWkga2jhu49pIG5nw6JuIGjDoG5nIGPDsyBnaeG7m2kgdMOtbmggbMOgIG5hbSBsw6AgMC40Njg5DQoNCmBgYHtyfQ0Kb2Rkc3JhdGlvKEUsIHJldiA9ICdjJykNCmBgYA0KDQpU4bu3IGzhu4cgZ2nhu69hIG5nxrDhu51pIHLhu51pIGto4buPaSB2w6Aga2jDtG5nIHLhu51pIGto4buPaSBuZ8OibiBow6BuZyBjw7MgZ2nhu5tpIHTDrW5oIGzDoCBu4buvIHNvIHbhu5tpIG5nxrDhu51pIHLhu51pIGto4buPaSB2w6Aga2jDtG5nIHLhu51pIGto4buPaSBuZ8OibiBow6BuZyBjw7MgZ2nhu5tpIHTDrW5oIGzDoCBuYW0gbMOgIDEuODE4DQoNCiMjIyAzLjQuNCBCaeG6v24gRXhpdGVkIHbDoCBiaeG6v24gRXN0aW1hdGVkU2FsYXJ5DQoNCkLhuqNuZyB04bqnbiBzdeG6pXQNCg0KYGBge3J9DQpTYWxhcnkgPC0gY3V0KFNMVEwkRXN0aW1hdGVkU2FsYXJ5LCBicmVha3MgPSBjKDAsMTAwNzg5LDE5OTk3MSksIGxhYmVscyA9IGMoJ3Ro4bqlcCcsICdjYW8nKSkNClNMVEwgPC0gbXV0YXRlKFNMVEwsU2FsYXJ5KQ0KVCA8LXRhYmxlKFNMVEwkU2FsYXJ5LFNMVEwkRXhpdGVkKQ0KcHJvcC50YWJsZShUKQ0KYGBgDQoNCmBgYHtyfQ0KYWRkbWFyZ2lucyhUKQ0KYGBgDQoNCiogVHJvbmcgNzg3IG5nxrDhu51pIGtow7RuZyBy4budaSBraOG7j2kgbmfDom4gaMOgbmcgY8OzIDM4OSBuZ8aw4budaSBjw7MgdGh1IG5o4bqtcCB0aOG6pXAgdsOgIDM5OCBuZ8aw4budaSBjw7MgdGh1IG5o4bqtcCBjYW8uDQoNCiogVHJvbmcgMjEzIG5nxrDhu51pIHLhu51pIGto4buPaSBuZ8OibiBow6BuZyBjw7MgMTA3IG5nxrDhu51pIGPDsyB0aHUgbmjhuq1wIHRo4bqlcCB2w6AgMTA2IG5nxrDhu51pIGPDsyB0aHUgbmjhuq1wIGNhby4NCg0KDQpUw61uaCBy4bunaSBybyB0xrDGoW5nIMSR4buRaQ0KDQpgYGB7cn0NCnJpc2tyYXRpbyhUKQ0KYGBgDQoNCi0gVuG6rXkgdOG7iSBs4buHIG5o4buvbmcgbmfGsOG7nWkgcuG7nWkga2jhu49pIG5nw6JuIGjDoG5nIGPDsyB0aHUgbmjhuq1wIGNhbyBn4bqlcCAwLjk3IGzhuqduIHNvIHbhu5tpIG5o4buvbmcgbmfGsOG7nWkgcuG7nWkgdMOgaSBraG/huqNuIGto4buPaSBuZ8OibiBow6BuZyBjw7MgdGh1IG5o4bqtcCB0aOG6pXAuDQoNCmBgYHtyfQ0Kcmlza3JhdGlvKFQsIHJldiA9ICdjJykNCmBgYA0KDQotIFThu7cgbOG7hyBraMOhY2ggaMOgbmcga2jDtG5nIHLhu51pIGto4buPaSBuZ8OibiBow6BuZyBjw7MgdGh1IG5o4bqtcCBjYW8gZ+G6pXAgMS4wMDcgbOG6p24gc28gduG7m2kga2jDoWNoIGjDoG5nIGtow7RuZyBy4budaSBraOG7j2kgbmfDom4gaMOgbmcgY8OzIHRodSBuaOG6rXAgdGjhuqVwLg0KDQoNClThu7cgbOG7hyBjaMOqbmgNCg0KYGBge3J9DQpvZGRzcmF0aW8oVCkNCmBgYA0KDQpU4bu3IGzhu4cgZ2nhu69hIG5nxrDhu51pIGtow7RuZyBy4budaSBraOG7j2kgdsOgIHLhu51pIGto4buPaSBuZ8OibiBow6BuZyBjw7MgdGh1IG5o4bqtcCB0aOG6pXAgc28gduG7m2kgbmfGsOG7nWkga2jDtG5nIHLhu51pIGto4buPaSB2w6AgcuG7nWkga2jhu49pIG5nw6JuIGjDoG5nIGPDsyB0aHUgbmjhuq1wIGNhbyBsw6AgMC45NjgzDQoNCmBgYHtyfQ0Kb2Rkc3JhdGlvKFQsIHJldiA9ICdjJykNCmBgYA0KDQpU4bu3IGzhu4cgZ2nhu69hIG5nxrDhu51pIHLhu51pIGto4buPaSB2w6Aga2jDtG5nIHLhu51pIGto4buPaSBuZ8OibiBow6BuZyB0w6BpIGtob+G6o24gY8OzIHRodSBuaOG6rXAgdGjhuqVwIHNvIHbhu5tpIG5nxrDhu51pIHLhu51pIGto4buPaSB2w6Aga2jDtG5nIHLhu51pIGto4buPaSBuZ8OibiBow6BuZyBjw7MgdGh1IG5o4bqtcCBjYW8gbMOgIDEuMDMzDQoNCiMjIyAzLjQuNSBCaeG6v24gRXhpdGVkIHbDoCBiaeG6v24gQWdlDQoNCkLhuqNuZyB04bqnbiBzdeG6pXQNCg0KYGBge3J9DQpBZ2UxIDwtIGN1dChTTFRMJEFnZSwgYnJlYWtzID0gYygwLDMwLDg1KSwgbGFiZWxzID0gYygnZHVvaSAzMCcsICd0cmVuIDMwJykpDQpTTFRMIDwtIG11dGF0ZShTTFRMLEFnZTEpDQpaPC10YWJsZShTTFRMJEFnZTEsU0xUTCRFeGl0ZWQpDQpwcm9wLnRhYmxlKFopDQpgYGANCg0KYGBge3J9DQphZGRtYXJnaW5zKFopDQpgYGANCg0KKiBUcm9uZyA3ODcgbmfGsOG7nWkga2jDtG5nIHLhu51pIGto4buPaSBuZ8OibiBow6BuZyBjw7MgMTkyIG5nxrDhu51pIGTGsOG7m2kgMzAgdHXhu5VpIHbDoCA1OTUgbmfGsOG7nWkgdHLDqm4gMzAgdHXhu5VpIC4NCg0KKiBUcm9uZyAyMTMgbmfGsOG7nWkgcuG7nWkga2jhu49pIG5nw6JuIGjDoG5nIGPDsyAxNyBuZ8aw4budaSBkxrDhu5tpIDMwIHR14buVaSB2w6AgMTk2IG5nxrDhu51pIHRyw6puIDMwIHR14buVaS4NCg0KDQpUw61uaCBy4bunaSBybyB0xrDGoW5nIMSR4buRaQ0KDQpgYGB7cn0NCnJpc2tyYXRpbyhaKQ0KYGBgDQoNCi0gVuG6rXkgdOG7iSBs4buHIG5o4buvbmcgbmfGsOG7nWkgcuG7nWkga2jhu49pIG5nw6JuIGjDoG5nIHRyw6puIDMwIHR14buVaSBn4bqlcCAzLjQzIGzhuqduIHNvIHbhu5tpIG5o4buvbmcgbmfGsOG7nWkgcuG7nWkga2jhu49pIG5nw6JuIGjDoG5nIGTGsOG7m2kgMzAgdHXhu5VpLg0KDQpgYGB7cn0NCnJpc2tyYXRpbyhaLCByZXYgPSAnYycpDQpgYGANCg0KLSBU4bu3IGzhu4cga2jDoWNoIGjDoG5nIGtow7RuZyBy4budaSBraOG7j2kgbmfDom4gaMOgbmcgdHLDqm4gMzAgdHXhu5VpIGfhuqVwIDAuNjkgbOG6p24gc28gduG7m2kga2jDoWNoIGjDoG5nIGtow7RuZyBy4budaSBraOG7j2kgbmfDom4gaMOgbmcgZMaw4bubaSAzMCB0deG7lWkuDQoNCg0KVOG7tyBs4buHIGNow6puaA0KDQpgYGB7cn0NCm9kZHNyYXRpbyhaKQ0KYGBgDQoNClThu7cgbOG7hyBnaeG7r2EgbmfGsOG7nWkga2jDtG5nIHLhu51pIGto4buPaSB2w6AgcuG7nWkga2jhu49pIG5nw6JuIGjDoG5nIG3DoCBkxrDhu5tpIDMwIHR14buVaSBzbyB24bubaSBuZ8aw4budaSBraMO0bmcgcsO6dCB2w6AgcsO6dCAgdMOgaSBraG/huqNuIG3DoCB0csOqbiAzMCB0deG7lWkgbMOgIDMuNjg3DQoNCmBgYHtyfQ0Kb2Rkc3JhdGlvKFosIHJldiA9ICdjJykNCmBgYA0KDQpU4bu3IGzhu4cgZ2nhu69hIG5nxrDhu51pIHLhu51pIGto4buPaSB2w6Aga2jDtG5nIHLhu51pIGto4buPaSBuZ8OibiBow6BuZyBtw6AgZMaw4bubaSAzMCB0deG7lWkgc28gduG7m2kgbmfGsOG7nWkgcuG7nWkga2jhu49pIHbDoCBraMO0bmcgcuG7nWkga2jhu49pIG5nw6JuIGjDoG5nIG3DoCB0csOqbiAzMCB0deG7lWkgbMOgIDAuMjcxMg0KDQoNCiMjIyAzLjQuNiBCaeG6v24gVGVudXJlIHbDoCBiaeG6v24gRXN0aW1hdGVkU2FsYXJ5DQogQuG6o25nIHThuqduIHN14bqldA0KDQpgYGB7cn0NClRlbnVyZTEgPC0gY3V0KFNMVEwkVGVudXJlLCBicmVha3MgPSBjKDAsNSwxMCksIGxhYmVscyA9IGMoJ8OtdCcsICduaGnhu4F1JykpDQpTTFRMIDwtIG11dGF0ZShTTFRMLFRlbnVyZTEpDQpNIDwtdGFibGUoU0xUTCRTYWxhcnksU0xUTCRUZW51cmUxKQ0KcHJvcC50YWJsZShNKQ0KYGBgDQoNCmBgYHtyfQ0KYWRkbWFyZ2lucyhNKQ0KYGBgDQoNCiogVHJvbmcgNTE2IGtow6FjaCBow6BuZyBn4bqvbiBiw7MgZMaw4bubaSA1IG7Eg20gIGPhu6dhIG5nw6JuIGjDoG5nIGPDsyAyNTkgbmfGsOG7nWkgY8OzIHRodSBuaOG6rXAgdGjhuqVwIHbDoCAyNTcgbmfGsOG7nWkgY8OzIHRodSBuaOG6rXAgY2FvLiAuDQoNCiogVHJvbmcgNDQ0IGtow6FjaCBow6BuZyBn4bqvbiBiw7MgdHLDqm4gNSBuxINtICBj4bunYSBuZ8OibiBow6BuZyBjw7MgMjE0IG5nxrDhu51pIGPDsyB0aHUgbmjhuq1wIHRo4bqlcCB2w6AgMjMwIG5nxrDhu51pIG5nxrDhu51pIGPDsyB0aHUgbmjhuq1wIGNhby4NCg0KDQogVMOtbmggcuG7p2kgcm8gdMawxqFuZyDEkeG7kWkNCg0KYGBge3J9DQpyaXNrcmF0aW8oTSkNCmBgYA0KDQotIFbhuq15IHThu4kgbOG7hyBuaOG7r25nIG5nxrDhu51pIGfhuq9uIGLDsyB0csOqbiA1IG7Eg20gY8OzIHRodSBuaOG6rXAgY2FvIGfhuqVwIDEuMDQ0IGzhuqduIHNvIHbhu5tpIG5o4buvbmcgbmfGsOG7nWkgZ+G6r24gYsOzIHRyw6puIDUgbsSDbSBjw7MgdGh1IG5o4bqtcCB0aOG6pXAuDQoNCmBgYHtyfQ0Kcmlza3JhdGlvKE0sIHJldiA9ICdjJykNCmBgYA0KDQotIFThu7cgbOG7hyBraMOhY2ggaMOgbmcgZ+G6r24gYsOzIGTGsOG7m2kgNSBuxINtIGPDsyB0aHUgbmjhuq1wIGNhbyBn4bqlcCAwLjk2IGzhuqduIHNvIHbhu5tpIGtow6FjaCBow6BuZyBn4bqvbiBiw7MgZMaw4bubaSA1IG7Eg20gY8OzIHRodSBuaOG6rXAgdGjhuqVwLg0KDQoNCiBU4bu3IGzhu4cgY2jDqm5oDQoNCmBgYHtyfQ0Kb2Rkc3JhdGlvKE0pDQpgYGANCg0KVOG7tyBs4buHIGdp4buvYSBuZ8aw4budaSBn4bqvbiBiw7MgZMaw4bubaSA1IG7Eg20gdsOgIGfhuq9uIGLDsyB0csOqbiA1IG7Eg20gbcOgIGPDsyB0aHUgbmjhuq1wIHRo4bqlcCBzbyB24bubaSBuZ8aw4budaSBn4bqvbiBiw7MgZMaw4bubaSA1IG7Eg20gdsOgIGfhuq9uIGLDsyB0csOqbiA1IG7Eg20gbcOgIGPDsyB0aHUgbmjhuq1wIGNhbyBsw6AgMS4wODMNCg0KYGBge3J9DQpvZGRzcmF0aW8oTSwgcmV2ID0gJ2MnKQ0KYGBgDQoNClThu7cgbOG7hyBnaeG7r2EgbmfGsOG7nWkgZ+G6r24gYsOzIHRyw6puIDUgbsSDbSB2w6AgZ+G6r24gYsOzIGTGsOG7m2kgNSBuxINtIG3DoCBjw7MgdGh1IG5o4bqtcCB0aOG6pXAgc28gduG7m2kgbmfGsOG7nWkgZ+G6r24gYsOzIHRyw6puIDUgbsSDbSB2w6AgZ+G6r24gYsOzIGTGsOG7m2kgNSBuxINtIG3DoCBjw7MgdGh1IG5o4bqtcCBjYW8gbMOgIDAuOTIzNA0KDQojIyMgMy40LjcgQmnhur9uIFRlbnVyZSB2w6AgYmnhur9uIEFnZQ0KQuG6o25nIHThuqduIHN14bqldA0KDQpgYGB7cn0NCk4gPC10YWJsZShTTFRMJEFnZTEsU0xUTCRUZW51cmUxKQ0KcHJvcC50YWJsZShOKQ0KYGBgDQoNCmBgYHtyfQ0KYWRkbWFyZ2lucyhOKQ0KYGBgDQoNCiogVHJvbmcgNTE2IGtow6FjaCBow6BuZyBn4bqvbiBiw7MgZMaw4bubaSA1IG7Eg20gIGPhu6dhIG5nw6JuIGjDoG5nIGPDsyAxMTUgbmfGsOG7nWkgZMaw4bubaSAzMCB0deG7lWkgdsOgIDQwMSBuZ8aw4budaSB0csOqbiAzMCB0deG7lWkgLg0KDQoqIFRyb25nIDQ0NCBraMOhY2ggaMOgbmcgZ+G6r24gYsOzIHRyw6puIDUgbsSDbSAgY+G7p2EgbmfDom4gaMOgbmcgY8OzIDg5IG5nxrDhu51pIGTGsOG7m2kgMzAgdHXhu5VpIHbDoCAzNTUgbmfGsOG7nWkgdHLDqm4gMzAgdHXhu5VpLg0KDQoNClTDrW5oIHLhu6dpIHJvIHTGsMahbmcgxJHhu5FpDQoNCmBgYHtyfQ0Kcmlza3JhdGlvKE4pDQpgYGANCg0KLSBW4bqteSB04buJIGzhu4cgbmjhu69uZyBuZ8aw4budaSBn4bqvbiBiw7MgdHLDqm4gNSBuxINtIHbDoCB0csOqbiAzMCB0deG7lWkgZ+G6pXAgMS4wNzYgbOG6p24gc28gduG7m2kgbmjhu69uZyBuZ8aw4budaSBn4bqvbiBiw7MgdHLDqm4gNSBuxINtIHbDoCBkxrDhu5tpIDMwIHR14buVaS4NCg0KYGBge3J9DQpyaXNrcmF0aW8oTiwgcmV2ID0gJ2MnKQ0KYGBgDQoNCi0gVuG6rXkgdOG7iSBs4buHIG5o4buvbmcgbmfGsOG7nWkgZ+G6r24gYsOzIGTGsOG7m2kgNSBuxINtIHbDoCB0csOqbiAzMCB0deG7lWkgZ+G6pXAgMC45NDA5IGzhuqduIHNvIHbhu5tpIG5o4buvbmcgbmfGsOG7nWkgZ+G6r24gYsOzIGTGsOG7m2kgNSBuxINtIHbDoCBkxrDhu5tpIDMwIHR14buVaS4NCg0KDQogVOG7tyBs4buHIGNow6puaA0KDQpgYGB7cn0NCm9kZHNyYXRpbyhOKQ0KYGBgDQoNClThu7cgbOG7hyBnaeG7r2EgbmfGsOG7nWkgZ+G6r24gYsOzIGTGsOG7m2kgNSBuxINtIHbDoCBn4bqvbiBiw7MgdHLDqm4gNSBuxINtIG3DoCBkxrDhu5tpIDMwIHR14buVaSBzbyB24bubaSBuZ8aw4budaSBn4bqvbiBiw7MgZMaw4bubaSA1IG7Eg20gdsOgIGfhuq9uIGLDsyB0csOqbiA1IG7Eg20gbcOgIHRyw6puIDMwIHR14buVaSBsw6AgMS4xNDMNCg0KYGBge3J9DQpvZGRzcmF0aW8oTiwgcmV2ID0gJ2MnKQ0KYGBgDQoNClThu7cgbOG7hyBnaeG7r2EgbmfGsOG7nWkgZ+G6r24gYsOzIHRyw6puIDUgbsSDbSB2w6AgZ+G6r24gYsOzIGTGsOG7m2kgNSBuxINtICBtw6AgZMaw4bubaSAzMCB0deG7lWkgc28gduG7m2kgbmfGsOG7nWkgZ+G6r24gYsOzIHRyw6puIDUgbsSDbSB2w6AgZ+G6r24gYsOzIGTGsOG7m2kgbcOgIHRyw6puIDMwIHR14buVaSBsw6AgMC44NzQ2Lg0KDQoNCiMjIDMuNSA6IFRI4buQTkcgS8OKIFNVWSBESeG7hE4gQ0hPIEThu64gTEnhu4ZVDQoNCiMjIyAzLjUuMSBCaeG6v24gRXhpdGVkIHbDoCBiaeG6v24gSGFzQ3JDYXJkDQoNCktp4buDbSDEkeG7i25oIHTDrW5oIMSR4buZYyBs4bqtcCANCg0KR2nhuqMgdGh1eeG6v3Q6DQoNCi0gSDAgOiAyIGJp4bq/biDEkeG7mWMgbOG6rXANCi0gSDEgOiAyIGJp4bq/biBraMO0bmcgxJHhu5ljIGzhuq1wDQoNCmBgYHtyfQ0KY2hpc3EudGVzdChBKQ0KYGBgDQpW4bubaSBwLXZhbHVlID0gMC42NDQ1ID4gMC4wNSAsIGNo4bqlcCBuaOG6rW4gSDAuIFbDrCB24bqteSBjaMawYSBjw7MgY8ahIHPhu58gxJHhu4MgbsOzaSBiaeG6v24gSGFzQ3JDYXJkIGPDsyBsacOqbiBxdWFuIMSR4bq/biBCaeG6v24gRXhpdGVkLg0KDQoNCiMjIyAzLjUuMiBCaeG6v24gRXhpdGVkIHbDoCBiaeG6v24gSXNBY3RpdmVNZW1iZXINCg0KS2nhu4NtIMSR4buLbmggdMOtbmggxJHhu5ljIGzhuq1wIA0KDQpHaeG6oyB0aHV54bq/dDoNCg0KLSBIMCA6IDIgYmnhur9uIMSR4buZYyBs4bqtcA0KLSBIMSA6IDIgYmnhur9uIGtow7RuZyDEkeG7mWMgbOG6rXANCg0KYGBge3J9DQpjaGlzcS50ZXN0KEUpDQpgYGANClbhu5tpIHAtdmFsdWUgPSAwLjAwMDEgPCAwLjA1ICwgYsOhYyBi4buPIEgwLiBWw6wgduG6rXkgQmnhur9uIElzQWN0aXZlTWVtYmVyICBjw7MgbGnDqm4gcXVhbiDEkeG6v24gQmnhur9uIEV4aXRlZC4NCg0KDQojIyMgMy41LjMgQmnhur9uIEV4aXRlZCB2w6AgYmnhur9uIEdlbmRlcg0KDQpLaeG7g20gxJHhu4tuaCB0w61uaCDEkeG7mWMgbOG6rXAgDQoNCkdp4bqjIHRodXnhur90Og0KDQotIEgwIDogMiBiaeG6v24gxJHhu5ljIGzhuq1wDQotIEgxIDogMiBiaeG6v24ga2jDtG5nIMSR4buZYyBs4bqtcA0KDQpgYGB7cn0NCmNoaXNxLnRlc3QoUikNCmBgYA0KVuG7m2kgcC12YWx1ZSA8IDAuMDUgLCBiw6FjIGLhu48gSDAuIFbDrCB24bqteSBiaeG6v24gR2VuZGVyIGPDsyBsacOqbiBxdWFuIMSR4bq/biBCaeG6v24gRXhpdGVkLg0KDQojIyMgMy41LjQgQmnhur9uIEV4aXRlZCB2w6AgYmnhur9uIEVzdGltYXRlZFNhbGFyeQ0KDQpLaeG7g20gxJHhu4tuaCB0w61uaCDEkeG7mWMgbOG6rXAgDQoNCkdp4bqjIHRodXnhur90Og0KDQotIEgwIDogMiBiaeG6v24gxJHhu5ljIGzhuq1wDQotIEgxIDogMiBiaeG6v24ga2jDtG5nIMSR4buZYyBs4bqtcA0KDQpgYGB7cn0NCmNoaXNxLnRlc3QoU0xUTCRFeGl0ZWQsU0xUTCRFc3RpbWF0ZWRTYWxhcnkpDQpgYGANClbhu5tpIHAtdmFsdWUgID4gMC4wNSAsIGNo4bqlcCBuaOG6rW4gSDAuIFbDrCB24bqteSBjaMawYSBjw7MgY8ahIHPhu58gxJHhu4MgbsOzaSBiaeG6v24gRXN0aW1hdGVkU2FsYXJ5IGPDsyBsacOqbiBxdWFuIMSR4bq/biBCaeG6v24gRXhpdGVkLg0KDQojIyMgMy41LjUgQmnhur9uIEV4aXRlZCB2w6AgYmnhur9uIEFnZQ0KDQpLaeG7g20gxJHhu4tuaCB0w61uaCDEkeG7mWMgbOG6rXAgDQoNCkdp4bqjIHRodXnhur90Og0KDQotIEgwIDogMiBiaeG6v24gxJHhu5ljIGzhuq1wDQotIEgxIDogMiBiaeG6v24ga2jDtG5nIMSR4buZYyBs4bqtcA0KDQpgYGB7cn0NCmNoaXNxLnRlc3QoU0xUTCRFeGl0ZWQsU0xUTCRBZ2UpDQpgYGANCg0KVuG7m2kgcC12YWx1ZSA8IDAuMDUgLCBiw6FjIGLhu48gSDAuVsOsIHbhuq15IEJp4bq/biBBZ2UgY8OzIGxpw6puIHF1YW4gxJHhur9uIEJp4bq/biBFeGl0ZWQuDQoNCg0KIyMgMy42IMav4bubYyBsxrDhu6NuZyB04bu3IGzhu4cNCg0KYGBge3J9DQpnZ3Bsb3QoU0xUTCxhZXMoRXhpdGVkKSkrIGdlb21fYmFyKGNvbG9yID0gImJsYWNrIiwgZmlsbCA9ICJ3aGl0ZSIpKyBnZW9tX3RleHQoYWVzKGxhYmVsID0gc2NhbGVzIDo6IHBlcmNlbnQoYWZ0ZXJfc3RhdChjb3VudC9zdW0oY291bnQpKSkpLCBzdGF0PSAgJ2NvdW50JywgY29sb3IgPSAnYmxhY2snLCB2anVzdCA9IC0uNSkrIHlsYWIoIlPhu5EgbmfGsOG7nWkiKSsgeGxhYigiRXhpdGVkIikNCmBgYA0KDQpgYGB7cn0NCmdncGxvdChTTFRMLGFlcyhHZW5kZXIpKSsgZ2VvbV9iYXIoY29sb3IgPSAiYmxhY2siLCBmaWxsID0gIndoaXRlIikrIGdlb21fdGV4dChhZXMobGFiZWwgPSBzY2FsZXMgOjogcGVyY2VudChhZnRlcl9zdGF0KGNvdW50L3N1bShjb3VudCkpKSksIHN0YXQ9ICAnY291bnQnLCBjb2xvciA9ICdibGFjaycsIHZqdXN0ID0gLS41KSsgeWxhYigiU+G7kSBuZ8aw4budaSIpKyB4bGFiKCJHZW5kZXIiKQ0KYGBgDQoNCg0Kxq/hu5tjIGzGsOG7o25nIHThu7cgbOG7hyBraMOhY2ggaMOgbmcgbmFtIHLhu51pIGto4buPaSBuZ8OibiBow6BuZzogDQoNCmBgYHtyfQ0KZDwtIFNMVExbU0xUTCRHZW5kZXIgPT0gIk1hbGUiLF0NCnByb3AudGVzdChsZW5ndGgoZCRHZW5kZXIpLCBsZW5ndGgoU0xUTCRHZW5kZXIpLCBwID0gMC41NCkNCmBgYA0KDQoqIEtob+G6o25nIMaw4bubYyBsxrDhu6NuZyB24bubaSBt4bupYyDDvSBuZ2jEqSA1JSBsw6AgdOG7qyAwLjUwNTUgxJHhur9uIDAuNTY4Mg0KDQrGr+G7m2MgbMaw4bujbmcgdOG7tyBs4buHIGtow6FjaCBow6BuZyBu4buvIHLhu51pIGto4buPaSBuZ8OibiBow6BuZzogDQoNCmBgYHtyfQ0KZDwtIFNMVExbU0xUTCRHZW5kZXIgPT0gIkZlbWFsZSIsXQ0KcHJvcC50ZXN0KGxlbmd0aChkJEdlbmRlciksIGxlbmd0aChTTFRMJEdlbmRlciksIHAgPSAwLjQ2KQ0KYGBgDQoNCiogS2hv4bqjbmcgxrDhu5tjIGzGsOG7o25nIHbhu5tpIG3hu6ljIMO9IG5naMSpIDUlIGzDoCB04burIDAuNDMxOCDEkeG6v24gMC40OTQ1DQoNCsav4bubYyBsxrDhu6NuZyBz4buxIGNow6puaCBs4buHY2gNCg0KYGBge3J9DQpybW08LSBTTFRMW1NMVEwkR2VuZGVyID09ICJNYWxlIixdDQpybW0xPC1kW2QkRXhpdGVkPT0iMCIsXQ0Kcm1mIDwtIFNMVExbU0xUTCRHZW5kZXIgPT0gJ0ZlbWFsZScsXQ0Kcm1mMTwtcm1mW3JtZiRFeGl0ZWQ9PSIxIixdDQoNCmEgPC0gYyhucm93KHJtbSksIG5yb3cocm1mKSkNCmIgPC0gYyhucm93KHJtbTEpLCBucm93KHJtZjEpKQ0KcHJvcC50ZXN0KGIsYSkNCmBgYA0KDQoqIEtob+G6o25nIGNow6pjaCBs4buHY2ggdOG7tyBs4buHIHbhu5tpIG3hu6ljIMO9IG5naMSpIDUlIGzDoCB04burIDAuMjc5NCDEkeG6v24gMC4zOTkzDQoNCiMjIDMuNyBNYSB0cuG6rW4gaOG7hyBz4buRIHTGsMahbmcgcXVhbg0KDQpgYGB7cn0NCmN2IDwtIFNMVExbLCBzYXBwbHkoU0xUTCwgaXMubnVtZXJpYyldDQpjb3JfbWF0cml4IDwtIGNvcihjdikNCmNvcl9tYXRyaXgNCmBgYA0KDQoNCiMgQ0jGr8agTkcgNCBL4bq+VCBRVeG6oiBNw5QgSMOMTkggSOG7kkkgUVVZDQoNClNhdSBraGkga2nhu4NtIMSR4buLbmggdMOtbmggxJHhu5ljIGzhuq1wIHRow6wgbcO0IGjDrG5oIG5naGnDqm4gY+G7qXUgYmFvIGfhu5NtIGJp4bq/biBwaOG7pSB0aHXhu5ljIGzDoCBFeGl0ZWQgdsOgIDMgYmnhur9uIMSR4buZYyBs4bqtcCBsw6AgSXNBY3RpdmVNZW1iZXIsIEdlbmRlciwgQWdlLg0KDQojIyA0LjEgTcO0IGjDrG5oIGxvZ2l0DQoNCmBgYHtyfQ0KTUgxIDwtIGdsbShFeGl0ZWQgfiBJc0FjdGl2ZU1lbWJlciArIEdlbmRlciArIEFnZSAsIGZhbWlseT0gYmlub21pYWwoIGxpbmsgPSAnbG9naXQnKSwgZGF0YT1TTFRMKQ0KbGV2ZWxzKGZhY3RvcihTTFRMJEV4aXRlZCkpDQpzdW1tYXJ5KE1IMSkNCmBgYA0KDQotIE3DtCBow6xuaCBsb2dpdCA6ICAtMy4yMTM2MyAtMC45MjkyM0lzQWN0aXZlTWVtYmVyWWVzIC0wLjgzMTk4R2VuZGVyTWFsZSAgKyAwLjA2NjU2QWdlICAgICANCg0KS2nhu4NtIMSR4buLbmggdMOtbmggcGjDuSBo4bujcCBj4bunYSBtw7QgaMOsbmggbG9naXQ6DQoNCkgwOiBNw7QgaMOsbmgga2jDtG5nIHBow7kgaOG7o3AgduG7m2kgZOG7ryBsaeG7h3UgDQoNCkgxOiBNw7QgaMOsbmggcGjDuSBo4bujcCB24bubaSBk4buvIGxp4buHdQ0KDQpgYGB7cn0NCmxyX3Rlc3QxIDwtIGFub3ZhKE1IMSwgdGVzdCA9ICJDaGlzcSIpDQpwX3ZhbHVlMSA8LSBscl90ZXN0MSRQclsyXQ0KcF92YWx1ZTENCmBgYA0KDQpW4bubaSBwLXZhbHVlIDwgNSUuIFRhIGvhur90IGx14bqtbiBtw7QgaMOsbmggbG9naXQgcGjDuSBo4bujcCB24bubaSBk4buvIGxp4buHdS4NCg0KIyMgNC4yIE3DtCBow6xuaCBwcm9iaXQNCg0KYGBge3J9DQpNSDIgPC0gZ2xtKEV4aXRlZCB+ICBJc0FjdGl2ZU1lbWJlciArIEdlbmRlciAgKyBBZ2UgICwgZmFtaWx5PSBiaW5vbWlhbCggbGluayA9ICdwcm9iaXQnKSwgZGF0YT1TTFRMKQ0Kc3VtbWFyeShNSDIpDQpgYGANCg0KLSBNw7QgaMOsbmggcHJvYml0IDogIC0xLjkxNDk5IC0gMC41MDA5OElzQWN0aXZlTWVtYmVyWWVzIC0wLjQ4MDg2R2VuZGVyTWFsZSAgKyAwLjAzODk3QWdlDQoNCg0KS2nhu4NtIMSR4buLbmggdMOtbmggcGjDuSBo4bujcCBj4bunYSBtw7QgaMOsbmggcHJvYml0Og0KDQpIMDogTcO0IGjDrG5oIGtow7RuZyBwaMO5IGjhu6NwIHbhu5tpIGThu68gbGnhu4d1IA0KDQpIMTogTcO0IGjDrG5oIHBow7kgaOG7o3AgduG7m2kgZOG7ryBsaeG7h3UNCg0KYGBge3J9DQpscl90ZXN0IDwtIGFub3ZhKE1IMiwgdGVzdCA9ICJDaGlzcSIpDQpwX3ZhbHVlIDwtIGxyX3Rlc3QkUHJbMl0gDQpwX3ZhbHVlDQpgYGANCg0KVuG7m2kgcC12YWx1ZSA8IDUlLiBUYSBr4bq/dCBsdeG6rW4gbcO0IGjDrG5oIHByb2JpdCBwaMO5IGjhu6NwIHbhu5tpIGThu68gbGnhu4d1Lg0KDQojIyA0LjMgTcO0IGjDrG5oIGNsb2dsb2cNCg0KYGBge3J9DQpNSDMgPC0gZ2xtKEV4aXRlZCB+ICBJc0FjdGl2ZU1lbWJlciArIEdlbmRlciAgKyBBZ2UgLCBmYW1pbHk9IGJpbm9taWFsKCBsaW5rID0gJ2Nsb2dsb2cnKSwgZGF0YT1TTFRMKQ0KbGV2ZWxzKGZhY3RvcihTTFRMJEV4aXRlZCkpDQpzdW1tYXJ5KE1IMykNCmBgYA0KDQotIE3DtCBow6xuaCBjbG9nbG9nIDogLTIuOTA4OTcgLSAwLjkxNjAySXNBY3RpdmVNZW1iZXJZZXMgLTAuNjg1MjZHZW5kZXJNYWxlICArIDAuMDUzNDRBZ2UNCg0KS2nhu4NtIMSR4buLbmggdMOtbmggcGjDuSBo4bujcCBj4bunYSBtw7QgaMOsbmggY2xvZ2xvZzoNCg0KSDA6IE3DtCBow6xuaCBraMO0bmcgcGjDuSBo4bujcCB24bubaSBk4buvIGxp4buHdSANCg0KSDE6IE3DtCBow6xuaCBwaMO5IGjhu6NwIHbhu5tpIGThu68gbGnhu4d1DQoNCmBgYHtyfQ0KbHJfdGVzdCA8LSBhbm92YShNSDMsIHRlc3QgPSAiQ2hpc3EiKQ0KcF92YWx1ZSA8LSBscl90ZXN0JFByWzJdIA0KcF92YWx1ZQ0KYGBgDQoNClbhu5tpIHAtdmFsdWUgPCA1JS4gVGEga+G6v3QgbHXhuq1uIG3DtCBow6xuaCBjbG9nbG9nIHBow7kgaOG7o3AgduG7m2kgZOG7ryBsaeG7h3UuDQoNCiMjIDQuNCBDw6FjIHRpw6p1IGNow60gxJHDoW5oIGdpw6EgbcO0IGjDrG5oDQoNClRpw6p1IGNow60gQUlDDQoNCmBgYHtyfQ0KYWljMSA8LSBBSUMoTUgxKQ0KYWljMiA8LSBBSUMoTUgyKQ0KYWljMyA8LSBBSUMoTUgzKQ0KQUlDIDwtY2JpbmQoYWljMSxhaWMyLGFpYzMpDQpBSUMNCmBgYA0KDQpUacOqdSBjaMOtIERldmlhbmNlDQoNCmBgYHtyfQ0KZGUxIDwtIGRldmlhbmNlKE1IMSkNCmRlMiA8LSBkZXZpYW5jZShNSDIpDQpkZTMgPC0gZGV2aWFuY2UoTUgzKQ0KZGV2aWFuY2UgPC0gY2JpbmQoZGUxLGRlMixkZTMpDQpkZXZpYW5jZQ0KYGBgDQoNCg0KVGnDqnUgY2jDrSBCcmllciBTY29yZQ0KDQpgYGB7cn0NCmJzMSA8LSBCcmllclNjb3JlKE1IMSkNCmJzMiA8LSBCcmllclNjb3JlKE1IMikNCmJzMyA8LSBCcmllclNjb3JlKE1IMykNCkJyaWVyU2NvcmUgPC0gY2JpbmQoYnMxLGJzMixiczMpDQpCcmllclNjb3JlDQpgYGANCg0KLT4gR2nDoSB0cuG7iyBj4bunYSAzIHRpw6p1IGNow60gdHLDqm4gY8Ogbmcgbmjhu48gbmdoxKlhIGzDoCBtw7QgaMOsbmggY8OgbmcgdOG7kXQuVsOsIHbhuq15IHRhIGzhu7FhIGNo4buNbiBtw7QgaMOsbmggaMOgbSBo4buTaSBxdXkgcHJvYml0Lg0KDQoNCiMjIDQuNSBL4bq/dCBxdeG6oyBtw7QgaMOsbmgNCg0KYGBge3J9DQpzdW1tYXJ5KE1IMikNCmBgYA0KDQpTYXUga2hpIHRo4buxYyBoaeG7h24gaOG7k2kgcXV5IHByb2JpdCwgdGEgxJHGsOG7o2Mga+G6v3QgcXXhuqMgbmjGsCBzYXU6DQoNClnhur91IHThu5EgdGjDoG5oIHZpw6puIHRow6JuIHRoaeG6v3QgKElzQWN0aXZlTWVtYmVyKSBjw7Mgw70gbmdoxKlhIHRo4buRbmcga8OqIHbhu5tpIGJp4bq/biBFeGl0ZWQgKEtow6FjaCBow6BuZyBy4budaSBi4buPKSBjaG8gdGjhuqV5IHnhur91IHThu5Ega2jDoWNoIGjDoG5nIHRow6JuIHRoaeG6v3Qgc+G6vSDhuqNuaCBoxrDhu59uZyDEkeG6v24gdmnhu4djIGtow6FjaCBow6BuZyBy4budaSBi4buPIHbDoCB54bq/dSB04buRIG5nxrDhu51pIGzDoCBraMOhY2ggaMOgbmcgdGjDom4gdGhp4bq/dCBj4bunYSBuZ8OibiBow6BuZyBjw7MgdOG7tyBs4buHIHLhu51pIGLhu48gY2FvIGjGoW4geeG6v3UgdOG7kSBuZ8aw4budaSBraMO0bmcgbMOgIGtow6FjaCBow6BuZyB0aMOibiB0aGnhur90IGPhu6dhIG5nw6JuIGjDoG5nLg0KDQpZ4bq/dSB04buRIGdp4bubaSB0w61uaCAoR2VuZGVyKSBjw7Mgw70gbmdoxKlhIHRo4buRbmcga8OqIHbhu5tpIGJp4bq/biBFeGl0ZWQgKEtow6FjaCBow6BuZyBy4budaSBi4buPKSBjaG8gdGjhuqV5IGdp4bubaSB0w61uaCBz4bq9IOG6o25oIGjGsOG7n25nIMSR4bq/biB2aeG7h2Mga2jDoWNoIGjDoG5nIHLhu51pIGLhu48gdsOgIHnhur91IHThu5Ega2jDoWNoIGjDoG5nIGPDsyBnaeG7m2kgdMOtbmggbMOgIG5hbSBjw7MgdOG7tyBs4buHIHLhu51pIGLhu48gY2FvIGjGoW4geeG6v3UgdOG7kSBuZ8aw4budaSBjw7MgZ2nhu5tpIHTDrW5oIGzDoCBu4buvLg0KDQpZ4bq/dSB04buRIMSR4buZIHR14buVaSAoQWdlKSBjw7Mgw70gbmdoxKlhIHRo4buRbmcga8OqIHbhu5tpIGJp4bq/biBFeGl0ZWQgKEtow6FjaCBow6BuZyBy4budaSBi4buPKSBjaG8gdGjhuqV5IHnhur91IHThu5EgdHXhu5VpIGPFqW5nIHPhur0g4bqjbmggaMaw4bufbmcgxJHhur9uIHZp4buHYyBraMOhY2ggaMOgbmcgcuG7nWkgYuG7jy4NCg0KIyMgNC42IEtob+G6o25nIMaw4bubYyBsxrDhu6NuZyBjaG8gaOG7hyBz4buRIGjhu5NpIHF1eQ0KDQoNCmBgYHtyfQ0KY29uZmludC5kZWZhdWx0KE1IMikNCmBgYA0KDQoNCiMjIDQuNyBNw7QgaMOsbmggaOG7k2kgcXV5IGThu68gbGnhu4d1IHBvaXNzb24NCg0KYGBge3J9DQpQUyA8LSBnbG0oVGVudXJlfiBFc3RpbWF0ZWRTYWxhcnkgKyBBZ2UgKyBIYXNDckNhcmQJKyBHZW5kZXIrIElzQWN0aXZlTWVtYmVyICwgZmFtaWx5ID0gcG9pc3NvbihsaW5rID0gJ2xvZycpLCBkYXRhID0gU0xUTCkNCnN1bW1hcnkoUFMpDQpgYGANCg0KIyBDSMavxqBORyA1IEvhur5UIExV4bqsTiBWw4AgS0nhur5OIE5HSOG7ig0KDQojIyA1LjEgS+G6v3QgTHXhuq1uDQoNClF1YSBr4bq/dCBxdeG6oyBuZ2hpw6puIGPhu6l1LCB0YSB0aOG6pXkgxJHGsOG7o2MgcuG6sW5nIHnhur91IHThu5Ega2jDoWNoIGjDoG5nIHRow6JuIHRoaeG6v3QsIGdp4bubaSB0w61uaCwgxJHhu5kgdHXhu5VpIHPhur0g4bqjbmggaMaw4bufbmcgbeG7mXQgcGjhuqduIG7DoG8gxJHDsyDEkeG6v24gdmnhu4djIGtow6FjaCBow6BuZyBxdXnhur90IMSR4buLbmggc+G6vSBy4budaSBi4buPIG5nw6JuIGjDoG5nLiBE4buxYSB2w6BvIMSRw7MgbmfDom4gaMOgbmcgc+G6vSBjw7MgdGjhu4MgxJHGsGEgcmEgbmjhu69uZyBjaMOtbmggc8OhY2ggdsOgIGdp4bqjaSBwaMOhcCDEkeG7gyBo4bqhbiBjaOG6vyB2aeG7h2Mga2jDoWNoIGjDoG5nIHLhu51pIGLhu48gbmfDom4gaMOgbmcuIA0KDQojIyA1LjIgS2nhur9uIE5naOG7iw0KDQotIE5nw6JuIGjDoG5nIG7Dqm4gY8OzIG5o4buvbmcgY2jDrW5oIHPDoWNoIMawdSDEkcOjaSBkw6BuaCBjaG8gbmjhu69uZyBraMOhY2ggaMOgbmcgbmjGsCB0w61jaCDEkWnhu4NtLCBraHV54bq/biBtw6NpLGjGsOG7n25nIGzDo2kgc3XhuqV0LCBwaMOtIHbDoCBjaGkgcGjDrSDGsHUgxJHDo2kuLi4NCg0KLSBjw6FjIGThu4tjaCB24bulIGNoxINtIHPDs2Mga2jDoWNoIGjDoG5nIGPDoSBuaMOibiwgYuG6o28gxJHhuqNtIGNobyBo4buNIGx1w7RuIHRp4bq/cCBj4bqtbiB04bupYyBraOG6r2MgduG7m2kgbmjDom4gdmnDqm4gcGjhu6UgdHLDoWNoIHTDoGkga2hv4bqjbiBj4bunYSBtw6xuaCBob+G6t2MgY+G6pXAgdHLDqm4gxJHhu4MgdGjhu7FjIGhp4buHbiBt4buNaSBnaWFvIGThu4tjaCwgdOG7qyB2aeG7h2MgdGhhbmggdG/DoW4gc8OpYyDEkeG6v24gdmnhu4djIGNodXnhu4NuIG3hu5l0IHPhu5EgdGnhu4FuIGzhu5tuIHThu6sgdMOgaSBraG/huqNuIG7DoHkgxJHhur9uIHTDoGkga2hv4bqjbiBraMOhYywgaG/hurdjIMSRxrDhu6NjIHTGsCB24bqlbiB04burIGPDoWMgbmjDoCBjaHV5w6puIG3DtG4gduG7gSB0aHXhur8sIGPDoWMgduG6pW4gxJHhu4EgduG7gSBsdeG6rXQgcGjDoXAgdsOgIHTDoGkgY2jDrW5oDQoNCi0gTmfDom4gaMOgbmcgbsOqbiBjw7MgZ2nhuqNpIHBow6FwIHbhu4Egc+G6o24gcGjhuqltLCBk4buLY2ggduG7pSwgdMOtbmggbsSDbmcgdOG7kXQsIGPDsyBuaMOibiB2acOqbiBwaOG7pWMgduG7pSByacOqbmcgdsOgIMSR4bqndSB0xrAgdOG7kXQgduG7gSBjw7RuZyBuZ2jhu4cuDQoNCi0gQ+G6o2kgdGhp4buHbiBjw6FjIGvhu7kgbsSDbmcgdsOgIHRow6FpIMSR4buZIGtoaSBjaMSDbSBzw7NjIGtow6FjaCBow6BuZyDEkeG7gyBo4buNIGPDsyBuaOG7r25nIHRy4bqjaSBuZ2hp4buHbSB04buRdCDEkeG7gyDEkcaw4bujYyBwaOG7pWMgduG7pSB0YWkgbmfDom4gaMOgbmcuDQoNCiMjIFTDgEkgTEnhu4ZVIFRIQU0gS0jhuqJPDQoNClQuSy5UaGFuaCwgVC5NLlTGsOG7nW5nLCBWLkEuTC5EdXksIELDoGkgZ2nhuqNuZyBQaMOibiB0w61jaCBk4buvIGxp4buHdSDEkeG7i25oIHTDrW5oLg0KDQoNCg==