1 GIỚI THIỆU

Bộ dữ liệu được rút gọn từ một chiến dịch marketing qua điện thoại của một ngân hàng tại Bồ Đào Nha. Dữ liệu ban đầu nhằm phục vụ cho việc dự đoán khả năng khách hàng đăng ký gửi tiền có kỳ hạn. Tuy nhiên, trong nghiên cứu này, tác giả tập trung vào biến định tính quan trọng có liên quan đến hành vi tài chính của khách hàng, đó là:

  • loan: Khách hàng có vay tiêu dùng hay không (yes/no)

Hai biến này được chọn làm biến phụ thuộc, với mục tiêu phân tích xem các yếu tố nhân khẩu học và đặc điểm khách hàng như:

  • Nghề nghiệp (job)
  • Tình trạng hôn nhân (marital)
  • Trình độ học vấn (education)
  • Tình trạng nợ quá hạn (default)
  • Hình thức liên hệ (contact)
  • Tình trạng vay mua nhà của khách hàng (housing)

… có ảnh hưởng như thế nào đến quyết định vay tiêu dùng của khách hàng.

Thông qua việc sử dụng các công cụ phân tích dữ liệu định tính như: bảng tần số, biểu đồ minh họa, kiểm định Chi bình phương, phân tích tỷ số chênh lệch (Odds Ratio) và rủi ro tương đối (Relative Risk), bài nghiên cứu sẽ làm rõ các yếu tố quan trọng ảnh hưởng đến hành vi tài chính của khách hàng.

1.1 Đọc và khám phá dữ liệu

data <- read.xlsx("D:/PTDLDT/data.xlsx", sheetIndex = 1, header = TRUE)

data <- data %>%
  mutate(
    loan = as.factor(loan),
    housing = as.factor(housing),
    job = as.factor(job),
    marital = as.factor(marital),
    education = as.factor(education),
    default = as.factor(default),
    contact = as.factor(contact)
  )
str(data)
## 'data.frame':    4521 obs. of  8 variables:
##  $ age      : num  30 33 35 30 59 35 36 39 41 43 ...
##  $ job      : Factor w/ 12 levels "admin.","blue-collar",..: 11 8 5 5 2 5 7 10 3 8 ...
##  $ marital  : Factor w/ 3 levels "divorced","married",..: 2 2 3 2 2 3 2 2 2 2 ...
##  $ education: Factor w/ 4 levels "primary","secondary",..: 1 2 3 3 2 3 3 2 3 1 ...
##  $ default  : Factor w/ 2 levels "no","yes": 1 1 1 1 1 1 1 1 1 1 ...
##  $ housing  : Factor w/ 2 levels "no","yes": 1 2 2 2 2 1 2 2 2 2 ...
##  $ loan     : Factor w/ 2 levels "no","yes": 1 2 1 2 1 1 1 1 1 2 ...
##  $ contact  : Factor w/ 3 levels "cellular","telephone",..: 1 1 1 3 3 1 1 1 3 1 ...
summary(data)
##       age                 job          marital         education    default   
##  Min.   :19.00   management :969   divorced: 528   primary  : 678   no :4445  
##  1st Qu.:33.00   blue-collar:946   married :2797   secondary:2306   yes:  76  
##  Median :39.00   technician :768   single  :1196   tertiary :1350             
##  Mean   :41.17   admin.     :478                   unknown  : 187             
##  3rd Qu.:49.00   services   :417                                              
##  Max.   :87.00   retired    :230                                              
##                  (Other)    :713                                              
##  housing     loan           contact    
##  no :1962   no :3830   cellular :2896  
##  yes:2559   yes: 691   telephone: 301  
##                        unknown  :1324  
##                                        
##                                        
##                                        
## 

1.2 Mô tả các biến

Tên biến Kiểu dữ liệu Số lượng giá trị duy nhất Mô tả nội dung
age Numeric 67 Tuổi của khách hàng (từ 19 đến 87 tuổi).
job Character 12 Nghề nghiệp của khách hàng như: management, blue-collar, services, student, retired, unemployed,…
marital Character 3 Tình trạng hôn nhân: single, married, divorced.
education Character 4 Trình độ học vấn: primary, secondary, tertiary, unknown.
default Character 2 Khách hàng có nợ tín dụng quá hạn không? (yes, no)
housing Character 2 Khách hàng có vay mua nhà không? (yes, no)
loan Character 2 Khách hàng có vay tiêu dùng không? (yes, no)
contact Character 3 Hình thức liên hệ: cellular, telephone, unknown

Nhận xét

Bộ dữ liệu gồm 8 biến và 4251 quan sát, được chia thành hai nhóm chính: biến định lượng và biến định tính.

  • Biến định lượng: Chỉ có một biến duy nhất là biến định lượng, đó là biến age. Đây là biến đo lường tuổi của khách hàng, có kiểu số (numeric), có thể sử dụng để tính toán trung bình, độ lệch chuẩn, phân phối, v.v. Biến này mang thông tin liên tục và có thể dùng cho các phương pháp phân tích định lượng như hồi quy tuyến tính hoặc phân tích phương sai.

  • Các biến định tính: Có bảy biến còn lại thuộc loại biến định tính. Các biến này mang thông tin dạng danh mục (categorical), không dùng để tính toán trực tiếp mà thường được phân tích bằng cách đếm tần số, tỷ lệ, hoặc dùng các phương pháp thống kê cho dữ liệu định tính như kiểm định Chi bình phương, tính Odds Ratio, Relative Risk,…

Tạo bộ dữ liệu chỉ có biến định tính

library(dplyr)

# Tạo bộ dữ liệu chỉ chứa các biến định tính
data1 <- data %>%
  dplyr::select(job, marital, education, default, housing, loan, contact)

# Xem trước dữ liệu mới
str(data1)
## 'data.frame':    4521 obs. of  7 variables:
##  $ job      : Factor w/ 12 levels "admin.","blue-collar",..: 11 8 5 5 2 5 7 10 3 8 ...
##  $ marital  : Factor w/ 3 levels "divorced","married",..: 2 2 3 2 2 3 2 2 2 2 ...
##  $ education: Factor w/ 4 levels "primary","secondary",..: 1 2 3 3 2 3 3 2 3 1 ...
##  $ default  : Factor w/ 2 levels "no","yes": 1 1 1 1 1 1 1 1 1 1 ...
##  $ housing  : Factor w/ 2 levels "no","yes": 1 2 2 2 2 1 2 2 2 2 ...
##  $ loan     : Factor w/ 2 levels "no","yes": 1 2 1 2 1 1 1 1 1 2 ...
##  $ contact  : Factor w/ 3 levels "cellular","telephone",..: 1 1 1 3 3 1 1 1 3 1 ...
head(data1)

2 THỐNG KÊ MÔ TẢ BIẾN NGHIÊN CỨU

2.1 Thống mô tả biến phụ thuộc

2.1.1 Biến Loan

Lập bảng tần số và tần suất

table(data1$loan)
## 
##   no  yes 
## 3830  691
prop.table(table(data1$loan))
## 
##        no       yes 
## 0.8471577 0.1528423

Vẽ biểu đồ cột

freq_loan <- as.data.frame(table(data1$loan))
colnames(freq_loan) <- c("Loan", "Count")

ggplot(freq_loan, aes(x = Loan, y = Count)) +
  geom_col(fill = "#9370DB", color = "black") +
  geom_text(aes(label = Count), vjust = -0.5) +
  labs(title = "Tần số vay tiêu dùng", x = "Vay tiêu dùng", y = "Số lượng") +
  theme_minimal() +
  theme(plot.title = element_text(hjust = 0.5))

Vẽ biểu đồ tròn

# Tạo bảng tần suất
loan_freq <- table(data1$loan)
loan_prop <- prop.table(loan_freq)

# Chuyển thành data frame để dùng ggplot2
loan_df <- as.data.frame(loan_prop)
colnames(loan_df) <- c("Loan", "Proportion")

# Tính phần trăm để hiển thị nhãn
loan_df$Percent <- paste0(round(loan_df$Proportion * 100, 1), "%")

# Vẽ biểu đồ tròn bằng ggplot2
ggplot(loan_df, aes(x = "", y = Proportion, fill = Loan)) +
  geom_bar(stat = "identity", width = 1) +
  coord_polar("y") +
  geom_text(aes(label = Percent), position = position_stack(vjust = 0.5)) +
  labs(title = "Tỷ lệ vay tiêu dùng", x = NULL, y = NULL) +
  theme_void()+
  theme(plot.title = element_text(hjust = 0.5))

Dựa vào bảng tần số, tần suất và biểu đồ của biến loan, ta có các nhận định sau:

  • Nhóm không vay tiêu dùng (no) chiếm số lượng lớn vượt trội với 3.830 người, tương ứng khoảng 84.7% tổng số mẫu. Đây là nhóm chiếm ưu thế rõ rệt.

  • Nhóm có vay tiêu dùng (yes) chỉ có 691 người, chiếm khoảng 15.3%.

Kết luận:

Phân bố vay tiêu dùng cho thấy đa số khách hàng không sử dụng hình thức vay tiêu dùng, phản ánh sự thận trọng trong chi tiêu hoặc tiếp cận hạn chế với loại hình tín dụng này. Yếu tố này có thể đóng vai trò trong việc xác định mức độ tiêu dùng cá nhân và khả năng tiếp cận tín dụng tiêu dùng trong nghiên cứu hành vi tài chính.

2.2 Thống kê mô tả biến độc lập

2.2.1 Biến Housing

Lập bảng tần số và tần suất

table(data1$housing)
## 
##   no  yes 
## 1962 2559
prop.table(table(data1$housing))
## 
##        no       yes 
## 0.4339748 0.5660252

Vẽ biểu đồ cột

freq_housing <- as.data.frame(table(data1$housing))
colnames(freq_housing) <- c("Housing", "Count")

ggplot(freq_housing, aes(x = Housing, y = Count)) +
  geom_col(fill = "#66CDAA", color = "black") +
  geom_text(aes(label = Count), vjust = -0.5) +
  labs(title = "Tần số vay mua nhà", x = "Vay nhà", y = "Số lượng") +
  theme_minimal() +
  theme(plot.title = element_text(hjust = 0.5))

# Tạo bảng tần suất
housing_freq <- table(data1$housing)
housing_prop <- prop.table(housing_freq)

# Chuyển sang data frame để vẽ với ggplot2
housing_df <- as.data.frame(housing_prop)
colnames(housing_df) <- c("Housing", "Proportion")

# Thêm cột phần trăm để làm nhãn
housing_df$Percent <- paste0(round(housing_df$Proportion * 100, 1), "%")

# Vẽ biểu đồ tròn
ggplot(housing_df, aes(x = "", y = Proportion, fill = Housing)) +
  geom_bar(stat = "identity", width = 1) +
  coord_polar("y") +
  geom_text(aes(label = Percent), position = position_stack(vjust = 0.5)) +
  labs(title = "tỷ lệ vay mua nhà", x = NULL, y = NULL) +
  theme_void()

theme(plot.title = element_text(hjust = 0.5))
## List of 1
##  $ plot.title:List of 11
##   ..$ family       : NULL
##   ..$ face         : NULL
##   ..$ colour       : NULL
##   ..$ size         : NULL
##   ..$ hjust        : num 0.5
##   ..$ vjust        : NULL
##   ..$ angle        : NULL
##   ..$ lineheight   : NULL
##   ..$ margin       : NULL
##   ..$ debug        : NULL
##   ..$ inherit.blank: logi FALSE
##   ..- attr(*, "class")= chr [1:2] "element_text" "element"
##  - attr(*, "class")= chr [1:2] "theme" "gg"
##  - attr(*, "complete")= logi FALSE
##  - attr(*, "validate")= logi TRUE

Dựa vào bảng tần số, tần suất và biểu đồ của biến housing, ta có các nhận định sau:

  • Nhóm có vay mua nhà (yes) chiếm tỷ lệ cao hơn với 2,559 người, tương ứng khoảng 56.6% tổng số mẫu. Đây là nhóm chiếm tỷ trọng lớn trong tập dữ liệu.

  • Nhóm không vay mua nhà (no) có 1,962 người, chiếm khoảng 43.4%.

Kết luận:

Phân bố dữ liệu cho thấy phần lớn khách hàng trong tập dữ liệu có khoản vay mua nhà. Điều này có thể phản ánh nhu cầu về nhà ở cũng như mức độ tiếp cận tín dụng mua bất động sản của khách hàng trong tập mẫu.

2.2.2 Biến Job

Lập bảng tần số và tần suất

#Bảng tần số
table(data1$job)
## 
##        admin.   blue-collar  entrepreneur     housemaid    management 
##           478           946           168           112           969 
##       retired self-employed      services       student    technician 
##           230           183           417            84           768 
##    unemployed       unknown 
##           128            38
#Bảng tần suất
table(data1$job)/sum(table(data1$job))
## 
##        admin.   blue-collar  entrepreneur     housemaid    management 
##    0.10572882    0.20924574    0.03715992    0.02477328    0.21433311 
##       retired self-employed      services       student    technician 
##    0.05087370    0.04047777    0.09223623    0.01857996    0.16987392 
##    unemployed       unknown 
##    0.02831232    0.00840522

Vẽ biểu đồ cột

library(ggplot2)

library(ggplot2)

# Tạo bảng tần số cho biến job
freq1 <- table(data1$job)

# Chuyển thành data frame
job_freq <- as.data.frame(freq1)
colnames(job_freq) <- c("Job", "Count")

# Vẽ biểu đồ cột
ggplot(job_freq, aes(x = Job, y = Count)) +
  geom_col(fill = "#6495ED", color = "black") +
  geom_text(aes(label = Count), vjust = -0.5, color = "black") +
  labs(title = "Tần số theo nghề nghiệp", x = "Nghề nghiệp", y = "Số lượng") +
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1))+
  theme(plot.title = element_text(hjust = 0.5)) 

Dựa vào bảng tần số và biểu đồ trên, ta có các nhận định sau:

  • Nghề nghiệp phổ biến nhất là management với 969 người, chiếm khoảng 21.4% tổng số mẫu.

  • Theo sau là blue-collar (946 người, ~20.9%) và technician (768 người, ~17.0%).

  • Các nhóm nghề ít phổ biến hơn gồm: student (84 người, ~1.9%) và unknown (38 người, ~0.8%).

  • Tổng cộng, ba nhóm nghề chiếm tỷ lệ cao nhất (management, blue-collar, technician) đã chiếm hơn 59% toàn bộ dữ liệu.

Kết luận:

Phân bố nghề nghiệp không đều, cho thấy các khách hàng trong dữ liệu chủ yếu đến từ các ngành quản lý, lao động phổ thông và kỹ thuật viên.

2.2.3 Biến Marital

Lập bảng tần số và tần suất

# Bảng tần số
table(data1$marital)
## 
## divorced  married   single 
##      528     2797     1196
# Bảng tần suất
prop.table(table(data1$marital))
## 
##  divorced   married    single 
## 0.1167883 0.6186684 0.2645432

Vẽ biểu đồ cột

# Biểu đồ cột
library(ggplot2)
freq_marital <- as.data.frame(table(data1$marital))
colnames(freq_marital) <- c("Marital", "Count")

ggplot(freq_marital, aes(x = Marital, y = Count)) +
  geom_col(fill = "#6495ED", color = "black") +
  geom_text(aes(label = Count), vjust = -0.5) +
  labs(title = "Tần số theo tình trạng hôn nhân", x = "Tình trạng hôn nhân", y = "Số lượng") +
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1),
        plot.title = element_text(hjust = 0.5))

Dựa vào bảng tần số và tần suất của biến marital, ta có các nhận định sau:

  • Nhóm kết hôn (married) chiếm tỷ lệ cao nhất, với 2,797 người, tương ứng khoảng 61.9% tổng số mẫu. Đây là nhóm chiếm ưu thế vượt trội.

  • Nhóm độc thân (single) chiếm 1,196 người (~26.5%), đứng thứ hai về tần suất.

  • Nhóm ly hôn (divorced) chỉ chiếm 528 người (~11.7%), là nhóm có số lượng thấp nhất.

Kết luận:

Phân bố tình trạng hôn nhân trong tập dữ liệu này khá chênh lệch, với phần lớn khách hàng là người đã kết hôn. Điều này có thể phản ánh xu hướng hoặc cấu trúc dân số của khách hàng trong tập dữ liệu.

2.2.4 Biến Education

Lập bảng tần số và tần suất

table(data1$education)
## 
##   primary secondary  tertiary   unknown 
##       678      2306      1350       187
prop.table(table(data1$education))
## 
##    primary  secondary   tertiary    unknown 
## 0.14996682 0.51006415 0.29860650 0.04136253

Vẽ biểu đồ cột

freq_edu <- as.data.frame(table(data1$education))
colnames(freq_edu) <- c("Education", "Count")

ggplot(freq_edu, aes(x = Education, y = Count)) +
  geom_col(fill = "#FF9966", color = "black") +
  geom_text(aes(label = Count), vjust = -0.5) +
  labs(title = "Tần số theo trình độ học vấn", x = "Trình độ", y = "Số lượng") +
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1),
        plot.title = element_text(hjust = 0.5))

Dựa vào bảng tần số và tần suất của biến education, ta có các nhận định sau:

  • Nhóm có trình độ học vấn secondary chiếm tỷ lệ cao nhất, với 2,306 người, tương ứng khoảng 51.0% tổng số mẫu. Đây là nhóm chiếm ưu thế vượt trội.

  • Nhóm có trình độ tertiary (đại học, sau đại học) có 1,350 người, chiếm khoảng 29.8%, đứng thứ hai về tần suất.

  • Nhóm primary có 678 người, tương ứng khoảng 15.0% tổng số mẫu.

  • Nhóm unknown (không rõ trình độ học vấn) chỉ chiếm 187 người, tương ứng 4.1%, là nhóm có số lượng thấp nhất.

Kết luận:

Phân bố trình độ học vấn trong tập dữ liệu cho thấy phần lớn khách hàng có trình độ học vấn trung học. Điều này có thể phản ánh cấu trúc trình độ học vấn phổ biến trong nhóm khách hàng được khảo sát, đồng thời là yếu tố cần xem xét trong các phân tích liên quan đến hành vi tiêu dùng hoặc khả năng tiếp cận dịch vụ.

2.2.5 Biến Default

Lập bảng tần số và tần suất

table(data1$default)
## 
##   no  yes 
## 4445   76
prop.table(table(data1$default))
## 
##         no        yes 
## 0.98318956 0.01681044

Vẽ biểu đồ cột

freq_default <- as.data.frame(table(data1$default))
colnames(freq_default) <- c("Default", "Count")

ggplot(freq_default, aes(x = Default, y = Count)) +
  geom_col(fill = "#F08080", color = "black") +
  geom_text(aes(label = Count), vjust = -0.5) +
  labs(title = "Tần số nợ tín dụng xấu", x = "Default", y = "Số lượng") +
  theme_minimal() +
  theme(plot.title = element_text(hjust = 0.5))

Dựa vào bảng tần số và tần suất của biến default, ta có các nhận định sau:

  • Nhóm không có nợ tín dụng xấu (no) chiếm số lượng lớn nhất với 4,445 người, tương ứng khoảng 98.4% tổng số mẫu. Đây là nhóm chiếm ưu thế gần như tuyệt đối.

  • Nhóm có nợ tín dụng xấu (yes) chỉ có 76 người, chiếm tỷ lệ rất nhỏ, khoảng 1.7%.

Kết luận:

Phân bố nợ tín dụng xấu trong tập dữ liệu cho thấy phần lớn khách hàng không có lịch sử nợ xấu. Điều này phản ánh chất lượng tín dụng tương đối tốt của nhóm khách hàng được khảo sát.

3 KIỂM ĐỊNH CHI BÌNH PHƯƠNG

Kiểm định Chi bình phương (Chi-squared test) được sử dụng để kiểm tra xem có mối liên hệ thống kê giữa hai biến phân loại (categorical variables) hay không. Trong bối cảnh này, ta kiểm tra xem các yếu tố như housing, marital, education, default, v.v. có ảnh hưởng đến quyết định vay tiêu dùng (loan) hay không.

3.1 Kiểm định giữa loan và housing

Giả thuyết kiểm định

  • H0: Không có mối liên hệ giữa loan và housing
  • H1: Có mối liên hệ giữa loan và housing
# Thực hiện kiểm định Chi bình phương
table_loan_housing <- table(data1$loan, data1$housing)
chisq_housing <- chisq.test(table_loan_housing)
chisq_housing
## 
##  Pearson's Chi-squared test with Yates' continuity correction
## 
## data:  table_loan_housing
## X-squared = 1.4374, df = 1, p-value = 0.2306

3.2 Kiểm định giữa loan và job

Giả thuyết kiểm định

  • H0: Không có mối liên hệ giữa nghề nghiệp và khả năng vay tiêu dùng.
  • H1: Có mối liên hệ giữa nghề nghiệp và khả năng vay tiêu dùng.
# Thực hiện kiểm định Chi bình phương
table_loan_job <- table(data1$loan, data1$job)
chisq_job <- chisq.test(table_loan_job)
chisq_job
## 
##  Pearson's Chi-squared test
## 
## data:  table_loan_job
## X-squared = 47.191, df = 11, p-value = 1.989e-06

3.3 Kiểm định giữa loan và education

Giả thuyết kiểm định

  • H0: Không có mối liên hệ giữa trình độ học vấn và quyết định vay tiêu dùng.
  • H1: Có mối liên hệ giữa trình độ học vấn và quyết định vay tiêu dùng.
table_loan_edu <- table(data1$loan, data1$education)
chisq_edu <- chisq.test(table_loan_edu)
chisq_edu
## 
##  Pearson's Chi-squared test
## 
## data:  table_loan_edu
## X-squared = 39.798, df = 3, p-value = 1.176e-08

3.4 Kiểm định giữa loan và default

Giả thuyết kiểm định

  • H0: Không có mối liên hệ giữa tình trạng nợ quá hạn và việc vay tiêu dùng.
  • H1: Có mối liên hệ giữa tình trạng nợ quá hạn và việc vay tiêu dùng.
table_loan_default <- table(data1$loan, data1$default)
chisq_edu <- chisq.test(table_loan_default)
chisq_edu
## 
##  Pearson's Chi-squared test with Yates' continuity correction
## 
## data:  table_loan_default
## X-squared = 17.157, df = 1, p-value = 3.441e-05

3.5 Kiểm định giữa loan và marital

Giả thuyết kiểm định

  • H0: Không có mối liên hệ giữa tình trạng hôn nhân và việc vay tiêu dùng.
  • H1: Có mối liên hệ giữa tình trạng hôn nhân và việc vay tiêu dùng.
table_loan_marital <- table(data1$loan, data1$marital)
chisq_edu <- chisq.test(table_loan_marital)
chisq_edu
## 
##  Pearson's Chi-squared test
## 
## data:  table_loan_marital
## X-squared = 10.88, df = 2, p-value = 0.004339

Thông qua kết quả kiểm định chỉ có 1 biến housing là không có mối liên hệ với biến loan, 4 biến độc lập còn lại đều có mối liên hệ với biến phụ thuộc là loan. Tiếp theo đó ta sẽ phân tích sâu về tình trạng vay tiêu dùng với 4 biến độc lập là: job, education, marital và default thông qua relative risk và oddratio.

4 PHÂN TÍCH HÀNH VI VAY TIÊU DÙNG VỚI RELATIVE RISK VÀ ODD RATIO

Sau khi kiểm định Chi bình phương, 4 biến định tính gồm: education, default, marital, và job được xác định là có mối liên hệ thống kê với biến phụ thuộc loan. Chúng ta tiếp tục đặt ra các câu hỏi nghiên cứu cụ thể và phân tích sâu hơn bằng Relative RiskOdds Ratio.

4.1 Education – Trình độ học vấn

Liệu khách hàng có trình độ học vấn cao (tertiary) có xu hướng vay tiêu dùng cao hơn so với những người không có học vấn cao hoặc không rõ học vấn không?

4.1.1 Gộp dữ liệu và tạo bảng tần số

data1$edu_grouped <- ifelse(data1$education == "tertiary", "high", 
                            ifelse(data1$education %in% c("primary", "secondary"), "low", NA))
table_edu_grouped <- table(data1$loan, data1$edu_grouped)
table_edu_grouped
##      
##       high  low
##   no  1176 2474
##   yes  174  510
data1 <- na.omit(data1)

4.1.2 Vẽ đồ thị phân tích

df_edu_grouped <- as.data.frame(table_edu_grouped)
colnames(df_edu_grouped) <- c("Loan", "Edu_Grouped", "Count")

ggplot(df_edu_grouped, aes(x = Edu_Grouped, y = Count, fill = Loan)) +
  geom_bar(stat = "identity", position = "dodge") +
  labs(
    title = "Phân bố vay tiêu dùng theo trình độ học vấn",
    x = "Trình độ học vấn",
    y = "Số lượng",
    fill = "Vay tiêu dùng"
  ) +
  theme_minimal() +
  theme(plot.title = element_text(hjust = 0.5))

4.1.3 Tính Relative Risk và Odd Ratio

mat_edu_grouped <- matrix(c(
  sum(data1$loan == "no" & data1$edu_grouped == "low"),
  sum(data1$loan == "no" & data1$edu_grouped == "high"),
  sum(data1$loan == "yes" & data1$edu_grouped == "low"),
  sum(data1$loan == "yes" & data1$edu_grouped == "high")
),
byrow = TRUE, nrow = 2,
dimnames = list(Loan = c("no", "yes"), Education = c("low", "high")))  

mat_edu_grouped
##      Education
## Loan   low high
##   no  2474 1176
##   yes  510  174
rr_edu_grouped <- riskratio(mat_edu_grouped)
rr_edu_grouped$measure
##      risk ratio with 95% C.I.
## Loan   estimate     lower     upper
##   no  1.0000000        NA        NA
##   yes 0.7895483 0.6886984 0.9051661
or_edu_grouped <- oddsratio(mat_edu_grouped)
or_edu_grouped$measure
##      odds ratio with 95% C.I.
## Loan   estimate     lower     upper
##   no  1.0000000        NA        NA
##   yes 0.7181725 0.5952221 0.8629916

Trong phân tích mối quan hệ giữa trình độ học vấn và hành vi vay tiêu dùng, tác giả phân chia khách hàng thành hai nhóm:

  • Nhóm có học vấn cao: khách hàng có trình độ tertiary

  • Nhóm học vấn thấp: bao gồm trình độ primary và secondary

Sau khi tính toán Relative Risk (RR) và Odds Ratio (OR) để so sánh xác suất và khả năng vay tiêu dùng giữa hai nhóm, kết quả cho thấy cả RR và OR đều nhỏ hơn 1 điều đó có nghĩa là khách hàng có học vấn cao có xu hướng vay tiêu dùng ít hơn nhóm học vấn thấp.

Cụ thể:

  • Nguy cơ tương đối (RR) là 0.7895483, tức là xác suất vay tiêu dùng của nhóm học vấn cao chỉ bằng 78.95% so với nhóm học vấn thấp.
  • Tỷ số chênh (OR) là 0.7181725, nghĩa là odds vay tiêu dùng của nhóm học vấn cao chỉ bằng 71.82% so với nhóm học vấn thấp.

4.2 Default – Nợ tín dụng quá hạn

4.2.1 Gộp dữ liệu và tạo bảng tần số

table_default <- table(data1$loan, data1$default)
table_default
##      
##         no  yes
##   no  3601   49
##   yes  660   24

4.2.2 Vẽ đồ thị phân tích

df_default <- as.data.frame(table_default)
colnames(df_default) <- c("Loan", "Default", "Count")

ggplot(df_default, aes(x = Default, y = Count, fill = Loan)) +
  geom_bar(stat = "identity", position = "dodge") +
  labs(
    title = "Phân bố vay tiêu dùng theo trạng thái nợ tín dụng",
    x = "Nợ tín dụng",
    y = "Số lượng",
    fill = "Vay tiêu dùng"
  ) +
  theme_minimal() +
  theme(plot.title = element_text(hjust = 0.5))

4.2.3 Tính Relative Risk và Odd Ratio

# Tạo ma trận với nhóm 'yes' (vay tiêu dùng) làm dòng thứ nhất = nhóm tham chiếu
mat_default <- matrix(c(
  sum(data1$loan == "yes" & data1$default == "yes"),  # a
  sum(data1$loan == "yes" & data1$default == "no"),   # b
  sum(data1$loan == "no" & data1$default == "yes"),   # c
  sum(data1$loan == "no" & data1$default == "no")     # d
),
byrow = TRUE, nrow = 2,
dimnames = list(Loan = c("yes", "no"), Default = c("yes", "no")))

mat_default
##      Default
## Loan  yes   no
##   yes  24  660
##   no   49 3601
# Tính RR và OR với nhóm 'yes' làm tham chiếu
rr_default <- riskratio(mat_default)
rr_default$measure
##      risk ratio with 95% C.I.
## Loan  estimate    lower    upper
##   yes 1.000000       NA       NA
##   no  1.022451 1.007447 1.037678
or_default <- oddsratio(mat_default)
or_default$measure
##      odds ratio with 95% C.I.
## Loan  estimate    lower    upper
##   yes 1.000000       NA       NA
##   no  2.680628 1.604802 4.358874

Trong phân tích này, tác giả xem xét mối liên hệ giữa hành vi vay tiêu dùng (loan) và tình trạng nợ tín dụng quá hạn (default). Nhóm có vay tiêu dùng được chọn làm nhóm tham chiếu, nhằm so sánh nguy cơ và khả năng nợ tín dụng ở nhóm không vay.

Kết quả như sau:

  • Nguy cơ tương đối (Relative Risk – RR) của nhóm không vay so với nhóm có vay là 1.022451 → Điều này có nghĩa là xác suất nợ tín dụng quá hạn ở nhóm không vay cao hơn 2.25% so với nhóm có vay.

  • Tỷ số chênh (Odds Ratio – OR) giữa hai nhóm là 2.680628 → Diễn giải rằng khả năng nợ tín dụng quá hạn (odds) ở nhóm không vay cao gấp 2.68 lần so với nhóm có vay.

Tóm lại, cả RR và OR đều lớn hơn 1 và có ý nghĩa thống kê, cho thấy nhóm khách hàng không vay tiêu dùng có nguy cơ và khả năng nợ tín dụng quá hạn cao hơn đáng kể so với nhóm có vay tiêu dùng.

4.3 Marital – Tình trạng hôn nhân

Khách hàng đã kết hôn có xu hướng vay tiêu dùng khác với người chưa kết hôn không?

4.3.1 Gộp dữ liệu và tạo bảng tần số

data1$marital_grouped <- ifelse(data1$marital == "married", "married", "others")
table_marital <- table(data1$loan, data1$marital_grouped)
table_marital
##      
##       married others
##   no     2232   1418
##   yes     448    236

4.3.2 Vẽ đồ thị phân tích

df_marital <- as.data.frame(table_marital)
colnames(df_marital) <- c("Loan", "Marital", "Count")

ggplot(df_marital, aes(x = Marital, y = Count, fill = Loan)) +
  geom_bar(stat = "identity", position = "dodge") +
  labs(
    title = "Phân bố vay tiêu dùng theo tình trạng hôn nhân",
    x = "Tình trạng hôn nhân",
    y = "Số lượng",
    fill = "Vay tiêu dùng"
  ) +
  theme_minimal() +
  theme(plot.title = element_text(hjust = 0.5))

4.3.3 Tính Relative Risk và Odd Ratio

mat_marital <- matrix(c(
  sum(data1$loan == "yes" & data1$marital_grouped == "married"),
  sum(data1$loan == "yes" & data1$marital_grouped == "others"),
  sum(data1$loan == "no" & data1$marital_grouped == "married"),
  sum(data1$loan == "no" & data1$marital_grouped == "others")
),
byrow = TRUE, nrow = 2,
dimnames = list(Loan = c("yes", "no"), Marital = c("married", "others")))

mat_marital
##      Marital
## Loan  married others
##   yes     448    236
##   no     2232   1418
rr_marital <- riskratio(mat_marital)
rr_marital$measure
##      risk ratio with 95% C.I.
## Loan  estimate   lower    upper
##   yes 1.000000      NA       NA
##   no  1.125972 1.00769 1.258137
or_marital <- oddsratio(mat_marital)
or_marital$measure
##      odds ratio with 95% C.I.
## Loan  estimate    lower    upper
##   yes 1.000000       NA       NA
##   no  1.205617 1.016948 1.432372

Trong phân tích này, khách hàng được chia thành hai nhóm: đã kết hôn (married) và khác (others – bao gồm độc thân, ly hôn…). Nhóm khách hàng có vay tiêu dùng (Loan = yes) được chọn làm nhóm tham chiếu.

Kết quả cho thấy

  • Nguy cơ tương đối (RR) của nhóm không vay tiêu dùng so với nhóm vay tiêu dùng là 1.126, nghĩa là xác suất không vay tiêu dùng của nhóm chưa kết hôn cao hơn 12.6% so với nhóm đã kết hôn. Khoảng tin cậy 95% là [1.008 ; 1.258], cho thấy sự khác biệt có ý nghĩa thống kê.

  • Tương tự, tỷ số chênh (OR) là 1.2056, tức là odds không vay tiêu dùng của nhóm chưa kết hôn cao hơn khoảng 20.56% so với nhóm đã kết hôn. Khoảng tin cậy 95% là [1.017 ; 1.432], tiếp tục khẳng định kết quả có ý nghĩa thống kê.

Như vậy, khách hàng đã kết hôn có xu hướng vay tiêu dùng nhiều hơn so với nhóm chưa kết hôn.

4.4 Job – Nghề nghiệp

Liệu nhóm người thất nghiệp có xu hướng vay tiêu dùng khác biệt so với các nhóm nghề còn lại không?

4.4.1 Gộp dữ liệu và tạo bảng tần số

data1$job_grouped <- ifelse(data1$job == "unemployed", "unemployed", "others")
table_job <- table(data1$loan, data1$job_grouped)
table_job
##      
##       others unemployed
##   no    3537        113
##   yes    671         13

4.4.2 Vẽ đồ thị phân tích

df_job <- as.data.frame(table_job)
colnames(df_job) <- c("Loan", "Job_Group", "Count")

ggplot(df_job, aes(x = Job_Group, y = Count, fill = Loan)) +
  geom_bar(stat = "identity", position = "dodge") +
  labs(
    title = "Phân bố vay tiêu dùng theo nghề nghiệp (thất nghiệp vs còn lại)",
    x = "Nhóm nghề nghiệp",
    y = "Số lượng",
    fill = "Vay tiêu dùng"
  ) +
  theme_minimal() +
  theme(plot.title = element_text(hjust = 0.5))

4.4.3 Tính Relative Risk và Odd Ratio

mat_job <- matrix(c(
  sum(data1$loan == "yes" & data1$job_grouped == "unemployed"),
  sum(data1$loan == "no" & data1$job_grouped == "unemployed"),
  sum(data1$loan == "yes" & data1$job_grouped == "others"),
  sum(data1$loan == "no" & data1$job_grouped == "others")
),
byrow = TRUE, nrow = 2,
dimnames = list(Loan = c("yes", "no"), Job = c("unemployed", "others")))

mat_job
##      Job
## Loan  unemployed others
##   yes         13    113
##   no         671   3537
rr_job <- riskratio(mat_job)
rr_job$measure
##      risk ratio with 95% C.I.
## Loan   estimate     lower     upper
##   yes 1.0000000        NA        NA
##   no  0.9372413 0.8820711 0.9958623
or_job <- oddsratio(mat_job)
or_job$measure
##      odds ratio with 95% C.I.
## Loan   estimate     lower    upper
##   yes 1.0000000        NA       NA
##   no  0.6131379 0.3264265 1.055025

Trong phân tích này, khách hàng được chia thành hai nhóm nghề nghiệp: thất nghiệp (unemployed) và các nhóm nghề còn lại (others). Nhóm khách hàng có vay tiêu dùng (Loan = yes) được chọn làm nhóm tham chiếu.

Kết quả cho thấy

  • Nguy cơ tương đối (RR) là 0.9372, nghĩa là xác suất không vay tiêu dùng của nhóm còn lại chỉ bằng 93.72% so với nhóm thất nghiệp. Khoảng tin cậy 95% là [0.8821 ; 0.9959], cho thấy sự khác biệt có ý nghĩa thống kê.

  • Trong khi đó, tỷ số chênh (OR) là 0.6131, tức là odds không vay tiêu dùng của nhóm nghề nghiệp còn lại thấp hơn khoảng 38.7% so với nhóm thất nghiệp. Tuy nhiên, khoảng tin cậy 95% là [0.3264 ; 1.0550], có chứa 1, nên kết quả này chưa đủ bằng chứng để kết luận có sự khác biệt thống kê ở mức ý nghĩa 5%.

Như vậy, có thể kết luận rằng nhóm khách hàng thất nghiệp có xu hướng không vay tiêu dùng cao hơn so với các nhóm nghề còn lại, và sự khác biệt này có ý nghĩa thống kê khi xét theo RR, nhưng chưa rõ ràng theo OR.


5 HỒI QUY LOGISTIC

5.1 Hồi quy logistic đơn biến

Giả thuyết kiểm định

  • H₀: Biến không có ảnh hưởng đến xác suất vay tiêu dùng.
  • H₁: Biến có ảnh hưởng đến xác suất vay tiêu dùng.

Trước tiên, tác giả thực hiện các mô hình hồi quy logistic đơn biến, mỗi mô hình chỉ bao gồm một biến giải thích nhằm phân tích riêng lẻ ảnh hưởng của từng yếu tố đến khả năng vay tiêu dùng (loan).

# Hồi quy đơn biến với education
model_uni_edu <- glm(loan ~ education, data = data1, family = binomial)
summary(model_uni_edu)
## 
## Call:
## glm(formula = loan ~ education, family = binomial, data = data1)
## 
## Coefficients:
##                    Estimate Std. Error z value Pr(>|z|)    
## (Intercept)        -1.82661    0.11113 -16.436   <2e-16 ***
## educationsecondary  0.31296    0.12363   2.531   0.0114 *  
## educationtertiary  -0.08421    0.13765  -0.612   0.5407    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 3779.6  on 4333  degrees of freedom
## Residual deviance: 3760.2  on 4331  degrees of freedom
## AIC: 3766.2
## 
## Number of Fisher Scoring iterations: 4

Phương trình logit ước lượng

\[ \text{logit}(P(\text{loan} = \text{yes})) = -1.83 + 0.31 \times \text{educationsecondary} - 0.08 \times \text{educationtertiary} \]

Diễn giải hệ số có ý nghĩa thống kê

Biến Nhóm so sánh Hệ số (β) p-value Odds Ratio (e^β) Diễn giải
educationsecondary So với primary 0.31 0.011 1.37 Người học trung học có odds vay cao hơn 37%
educationtertiary So với primary -0.08 0.541 0.92 Không có ý nghĩa thống kê

Kết luận

Biến educationsecondary có ảnh hưởng đáng kể đến xác suất vay tiêu dùng. Những người học hết trung học có odds vay cao hơn 37% so với người chỉ học tiểu học. Trong khi đó, nhóm có trình độ đại học trở lên (tertiary) không có ảnh hưởng đáng kể đến khả năng vay.

Mô hình có dạng:

\[ \log \left( \frac{P(loan = yes)}{1 - P(loan = yes)} \right) = \beta_0 + \beta_1 \cdot education \]

5.2 Hồi quy logistic đa biến

Sau khi thực hiện phân tích nguy cơ tương đối (Relative Risk) và tỷ số chênh (Odds Ratio) để khám phá mối liên hệ giữa hành vi vay tiêu dùng với từng biến độc lập, bước tiếp theo là xây dựng mô hình hồi quy logistic nhằm đánh giá đồng thời tác động của các yếu tố này đến khả năng vay tiêu dùng của khách hàng.

Mô hình hồi quy logistic sử dụng hàm liên kết logit để mô hình hóa log-odds của hành vi vay tiêu dùng. Cụ thể, mô hình có dạng:

\[ \log\left( \frac{P(loan = yes)}{1 - P(loan = yes)} \right) = \beta_0 + \beta_1 \cdot job + \beta_2 \cdot education + \beta_3 \cdot marital + \beta_4 \cdot default \]

Giả thuyết kiểm định

Với từng biến độc lập, ta thực hiện kiểm định:

  • \(H_0\): Biến không có ảnh hưởng đến xác suất vay tiêu dùng (\(\beta = 0\))
  • \(H_1\): Biến có ảnh hưởng đến xác suất vay tiêu dùng (\(\beta \ne 0\))

Mức ý nghĩa thống kê được sử dụng là 5% (α = 0.05). Nếu p-value < 0.05, ta bác bỏ giả thuyết H₀.

# Hồi quy logistic
model_logit <- glm(loan ~ job + education + marital + default,
                   data = data1,
                   family = binomial)

# Tóm tắt kết quả
summary(model_logit)
## 
## Call:
## glm(formula = loan ~ job + education + marital + default, family = binomial, 
##     data = data1)
## 
## Coefficients:
##                    Estimate Std. Error z value Pr(>|z|)    
## (Intercept)        -1.58836    0.20458  -7.764 8.22e-15 ***
## jobblue-collar     -0.08718    0.15435  -0.565 0.572185    
## jobentrepreneur     0.44778    0.22476   1.992 0.046340 *  
## jobhousemaid       -0.60363    0.34688  -1.740 0.081833 .  
## jobmanagement      -0.33188    0.17955  -1.848 0.064543 .  
## jobretired         -0.28758    0.23024  -1.249 0.211644    
## jobself-employed   -0.09880    0.23845  -0.414 0.678629    
## jobservices        -0.11508    0.17553  -0.656 0.512067    
## jobstudent         -2.58693    1.01624  -2.546 0.010909 *  
## jobtechnician      -0.21448    0.15634  -1.372 0.170112    
## jobunemployed      -0.68802    0.31788  -2.164 0.030430 *  
## jobunknown         -1.51908    1.03125  -1.473 0.140740    
## educationsecondary  0.33074    0.13543   2.442 0.014601 *  
## educationtertiary   0.05984    0.17065   0.351 0.725858    
## maritalmarried     -0.07152    0.12961  -0.552 0.581097    
## maritalsingle      -0.33498    0.14894  -2.249 0.024508 *  
## defaultyes          0.93740    0.25773   3.637 0.000276 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 3779.6  on 4333  degrees of freedom
## Residual deviance: 3698.3  on 4317  degrees of freedom
## AIC: 3732.3
## 
## Number of Fisher Scoring iterations: 6

5.2.1 Phân tích kết quả mô hình hồi quy logistic

Mô hình hồi quy logistic được xây dựng nhằm phân tích xác suất khách hàng đăng ký vay tiêu dùng (loan = yes) dựa trên các biến định tính: nghề nghiệp (job), trình độ học vấn (education), tình trạng hôn nhân (marital) và lịch sử tín dụng (default). Mức ý nghĩa được sử dụng là 5% (α = 0.05).

Bảng tổng hợp các biến có ý nghĩa thống kê (kèm Odds Ratio)

Biến Nhóm so sánh Hệ số (β) p-value Odds Ratio (e^β) Diễn giải chi tiết
jobstudent So với admin. -2.59 0.011 0.075 Sinh viên có odds vay chỉ bằng 7.5% so với nhóm hành chính → rất ít đăng ký vay.
jobunemployed So với admin. -0.69 0.030 0.50 Người thất nghiệp có odds vay bằng một nửa nhóm hành chính → khả năng vay thấp hơn.
jobentrepreneur So với admin. 0.45 0.046 1.57 Người tự doanh có odds vay cao hơn 57% → có xu hướng vay tiêu dùng nhiều hơn.
educationsecondary So với primary 0.33 0.015 1.39 Khách hàng học hết trung học có odds vay cao hơn 39% so với người chỉ học tiểu học.
maritalsingle So với divorced -0.33 0.025 0.72 Người độc thân có odds vay thấp hơn khoảng 28% so với người đã ly hôn.
defaultyes So với default = no 0.94 < 0.001 2.55 Người có nợ xấu có odds vay cao gấp 2.55 lần người không có nợ xấu → tác động mạnh.

Kết quả từ mô hình logit như sau:

Mô hình hồi quy logistic được sử dụng nhằm phân tích khả năng khách hàng đăng ký vay tiêu dùng (loan = yes) dựa trên các đặc điểm cá nhân như nghề nghiệp, trình độ học vấn, tình trạng hôn nhân và lịch sử tín dụng. Mức ý nghĩa được xét là 5% (α = 0.05).

Phương trình logit được ước lượng như sau:

logit(P(loan = yes)) = -1.59 - 2.59×jobstudent - 0.69×jobunemployed + 0.45×jobentrepreneur + 0.33×educationsecondary - 0.33×maritalsingle + 0.94×defaultyes

Hệ số chặn (Intercept):

  • Hệ số = -1.59
  • Khi khách hàng thuộc nhóm tham chiếu (job = admin., education = primary, marital = divorced, default = no), log(odds) vay tiêu dùng là -1.59.
  • Odds tương ứng = exp(-1.59) ≈ 0.204, xác suất vay là 0.204 / (1 + 0.204) ≈ 17%.
  • → Nhóm tham chiếu có xác suất vay khá thấp.

Biến jobstudent:

  • Hệ số = -2.59
  • Odds ratio = exp(-2.59) ≈ 0.075
  • So với nhóm hành chính, sinh viên có log(odds) vay thấp hơn 2.59 đơn vị, hay odds vay chỉ bằng 7.5% nhóm admin.
  • → Sinh viên rất ít vay tiêu dùng.

Biến jobunemployed:

  • Hệ số = -0.69
  • Odds ratio = exp(-0.69) ≈ 0.50
  • So với nhóm hành chính, người thất nghiệp có log(odds) thấp hơn 0.69, tức odds vay chỉ bằng một nửa.
  • → Người thất nghiệp khó tiếp cận vay tiêu dùng hơn.

Biến jobentrepreneur:

  • Hệ số = 0.45
  • Odds ratio = exp(0.45) ≈ 1.57
  • So với nhóm hành chính, người tự doanh có log(odds) cao hơn 0.45, tức odds vay cao hơn 57%.
  • → Người tự doanh có xu hướng vay tiêu dùng nhiều hơn.

Biến educationsecondary:

  • Hệ số = 0.33
  • Odds ratio = exp(0.33) ≈ 1.39
  • So với người học tiểu học, người học trung học có odds vay cao hơn 39%.
  • → Trình độ học vấn trung học tăng khả năng vay tiêu dùng.

Biến maritalsingle:

  • Hệ số = -0.33
  • Odds ratio = exp(-0.33) ≈ 0.72
  • So với người đã ly hôn, người độc thân có odds vay thấp hơn 28%.
  • → Người độc thân ít vay tiêu dùng hơn người ly hôn.

Biến defaultyes:

  • Hệ số = 0.94
  • Odds ratio = exp(0.94) ≈ 2.55
  • So với người không có nợ xấu, người có nợ xấu có odds vay gấp 2.55 lần.
  • → Mặc dù ngược với kỳ vọng lý thuyết, kết quả cho thấy người có nợ xấu vẫn có nhu cầu hoặc khả năng vay cao hơn trong tập dữ liệu này.

Kết luận

Tất cả các biến trên đều có ảnh hưởng đáng kể đến khả năng vay tiêu dùng. Hệ số âm cho thấy odds vay giảm so với nhóm tham chiếu, trong khi hệ số dương phản ánh xu hướng tăng. Việc phân tích cụ thể từng hệ số như trên giúp hiểu rõ ai là đối tượng dễ vay hoặc khó vay, từ đó hỗ trợ ra quyết định cho ngân hàng hoặc tổ chức tín dụng.


5.2.2 Tổng kết mô hình hồi quy logistic

  • Một số đặc điểm cá nhân như nghề nghiệp, trình độ học vấn, tình trạng hôn nhân, và lịch sử tín dụng có ảnh hưởng đáng kể đến xác suất vay tiêu dùng.
  • Đặc biệt, default là yếu tố quan trọng nhất, với mức odds ratio > 2.5.
  • Sinh viênngười thất nghiệp có khả năng vay thấp, phản ánh hạn chế trong tiếp cận tín dụng.
  • Trình độ học vấn trung học giúp tăng khả năng tiếp cận vay, trong khi trình độ đại học không tạo ra sự khác biệt đáng kể trong mô hình.

6 HỒI QUY PROBIT

6.1 Hồi quy Probit đơn biến

Giả thuyết kiểm định

  • H₀: Biến không có ảnh hưởng đến xác suất vay tiêu dùng.
  • H₁: Biến có ảnh hưởng đến xác suất vay tiêu dùng.

Tác giả thực hiện hồi quy Probit đơn biến với biến giải thích là education để kiểm định ảnh hưởng của trình độ học vấn đến xác suất vay tiêu dùng (loan).

# Hồi quy Probit đơn biến với education
model_probit_edu <- glm(loan ~ education, data = data1, family = binomial(link = "probit"))
summary(model_probit_edu)
## 
## Call:
## glm(formula = loan ~ education, family = binomial(link = "probit"), 
##     data = data1)
## 
## Coefficients:
##                    Estimate Std. Error z value Pr(>|z|)    
## (Intercept)        -1.08644    0.06002 -18.100   <2e-16 ***
## educationsecondary  0.17259    0.06732   2.564   0.0104 *  
## educationtertiary  -0.04522    0.07405  -0.611   0.5414    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 3779.6  on 4333  degrees of freedom
## Residual deviance: 3760.2  on 4331  degrees of freedom
## AIC: 3766.2
## 
## Number of Fisher Scoring iterations: 4

Phương trình Probit được ước lượng

\[ \Phi^{-1}(P(\text{loan} = \text{yes})) = -1.09 + 0.17 \times \text{educationsecondary} - 0.05 \times \text{educationtertiary} \]

Bảng tóm tắt các biến có ý nghĩa thống kê

Biến Nhóm so sánh Hệ số (β) p-value Diễn giải
educationsecondary So với primary 0.17 0.010 Người học trung học có probit cao hơn 0.17 đơn vị → xác suất vay tăng.
educationtertiary So với primary -0.05 0.541 Không có ý nghĩa thống kê.

Kết luận

Kết quả hồi quy Probit cho thấy trình độ học vấn bậc trung học (secondary) có ảnh hưởng đáng kể đến xác suất vay tiêu dùng. Cụ thể, hệ số ước lượng là 0.17 (p = 0.010), cho thấy người học hết trung học có khả năng vay cao hơn so với người chỉ học tiểu học. Trong khi đó, nhóm học đại học trở lên (tertiary) không có ảnh hưởng thống kê rõ rệt (p = 0.541).

6.2 Hồi quy Probit đa biến

Sau khi thực hiện mô hình hồi quy logistic, tác giả tiếp tục triển khai mô hình hồi quy Probit nhằm kiểm định tính nhất quán và độ nhạy của các kết quả. Mô hình Probit sử dụng hàm liên kết là phân phối chuẩn tích lũy \(\Phi(\cdot)\) để mô phỏng xác suất khách hàng vay tiêu dùng (loan = yes) dựa trên các biến độc lập: job (nghề nghiệp), education (trình độ học vấn), marital (tình trạng hôn nhân) và default (lịch sử nợ quá hạn).

Mô hình có dạng:

\[ P(\text{loan}_i = 1 \mid X_i) = \Phi(\beta_0 + \beta_1 \cdot \text{job}_i + \beta_2 \cdot \text{education}_i + \beta_3 \cdot \text{marital}_i + \beta_4 \cdot \text{default}_i) \]

Trong đó:

  • \(\Phi(\cdot)\) là hàm phân phối tích lũy chuẩn chuẩn hóa (CDF),
  • \(X_i\) là vector các biến độc lập cho cá nhân \(i\).

6.2.1 Kết quả hồi quy

Giả thuyết kiểm định

Với từng biến độc lập, ta thực hiện kiểm định:

  • \(H_0\): Biến không có ảnh hưởng đến xác suất vay tiêu dùng (\(\beta = 0\))
  • \(H_1\): Biến có ảnh hưởng đến xác suất vay tiêu dùng (\(\beta \ne 0\))

Mức ý nghĩa sử dụng là \(\alpha = 0.05\). Nếu pvalue < 0.05, bác bỏ \(H_0\).

Kết quả mô hình Probit

# Chạy mô hình probit
model_probit <- glm(loan ~ job + education + marital + default,
                    data = data1,
                    family = binomial(link = "probit"))

# Hiển thị kết quả
summary(model_probit)
## 
## Call:
## glm(formula = loan ~ job + education + marital + default, family = binomial(link = "probit"), 
##     data = data1)
## 
## Coefficients:
##                    Estimate Std. Error z value Pr(>|z|)    
## (Intercept)        -0.95148    0.11423  -8.330  < 2e-16 ***
## jobblue-collar     -0.04945    0.08733  -0.566 0.571234    
## jobentrepreneur     0.25600    0.13113   1.952 0.050907 .  
## jobhousemaid       -0.32254    0.18134  -1.779 0.075288 .  
## jobmanagement      -0.18647    0.09917  -1.880 0.060054 .  
## jobretired         -0.16692    0.12751  -1.309 0.190520    
## jobself-employed   -0.06293    0.13357  -0.471 0.637561    
## jobservices        -0.06470    0.09927  -0.652 0.514542    
## jobstudent         -1.19238    0.39451  -3.022 0.002507 ** 
## jobtechnician      -0.12132    0.08785  -1.381 0.167308    
## jobunemployed      -0.37298    0.16658  -2.239 0.025157 *  
## jobunknown         -0.76093    0.46589  -1.633 0.102407    
## educationsecondary  0.18140    0.07419   2.445 0.014476 *  
## educationtertiary   0.03537    0.09280   0.381 0.703059    
## maritalmarried     -0.03876    0.07259  -0.534 0.593391    
## maritalsingle      -0.18677    0.08238  -2.267 0.023374 *  
## defaultyes          0.54800    0.15588   3.516 0.000439 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 3779.6  on 4333  degrees of freedom
## Residual deviance: 3698.3  on 4317  degrees of freedom
## AIC: 3732.3
## 
## Number of Fisher Scoring iterations: 6

6.2.2 Phân tích kết quả theo từng nhóm biến

Mô hình hồi quy logistic được xây dựng nhằm phân tích xác suất khách hàng đăng ký vay tiêu dùng (loan = yes) dựa trên các biến định tính: nghề nghiệp (job), trình độ học vấn (education), tình trạng hôn nhân (marital) và lịch sử tín dụng (default). Mức ý nghĩa được sử dụng là 5% (α = 0.05).

Bảng tổng hợp các biến có ý nghĩa thống kê (mô hình Probit)

Biến Nhóm so sánh Hệ số (β) p-value Diễn giải chi tiết
jobstudent So với admin. -1.19 0.0025 Sinh viên có xác suất vay tiêu dùng thấp hơn đáng kể so với nhóm hành chính.
jobunemployed So với admin. -0.37 0.0252 Người thất nghiệp có xác suất vay tiêu dùng thấp hơn so với nhóm hành chính.
jobentrepreneur So với admin. 0.26 0.0509 Người tự doanh có xác suất vay tiêu dùng cao hơn một chút so với nhóm hành chính.
educationsecondary So với primary 0.18 0.0145 Người học trung học có xác suất vay cao hơn so với người chỉ học tiểu học.
maritalsingle So với divorced -0.19 0.0234 Người độc thân có xác suất vay thấp hơn so với người đã ly hôn.
defaultyes So với default = no 0.55 0.0004 Người có nợ xấu có xác suất vay tiêu dùng cao hơn đáng kể.

Phương trình Probit được ước lượng như sau:

probit(P(loan = yes)) = -0.95 - 1.19×jobstudent - 0.37×jobunemployed + 0.26×jobentrepreneur + 0.18×educationsecondary - 0.19×maritalsingle + 0.55×defaultyes

Hệ số chặn (Intercept):

  • Hệ số = -0.95
  • Khi khách hàng thuộc nhóm tham chiếu (job = admin., education = primary, marital = divorced, default = no), probit của xác suất vay tiêu dùng là -0.95.
  • Từ giá trị này, xác suất vay là pnorm(-0.95) ≈ 17%.
  • → Nhóm tham chiếu có xác suất vay khá thấp.

Biến jobstudent:

  • Hệ số = -1.19
  • So với nhóm hành chính, sinh viên có probit (chuẩn hóa) thấp hơn 1.19 điểm.
  • Xác suất tương ứng giảm mạnh: pnorm(-0.95 - 1.19) ≈ pnorm(-2.14) ≈ 1.6%.
  • → Sinh viên rất ít vay tiêu dùng trong mẫu khảo sát.

Biến jobunemployed:

  • Hệ số = -0.37
  • Người thất nghiệp có probit thấp hơn 0.37 so với nhóm hành chính.
  • Xác suất vay giảm từ 17% còn khoảng pnorm(-0.95 - 0.37) ≈ pnorm(-1.32) ≈ 9%.
  • → Người thất nghiệp ít có khả năng vay hơn.

Biến jobentrepreneur:

  • Hệ số = 0.26
  • Người tự doanh có probit cao hơn 0.26 điểm so với nhóm hành chính.
  • Xác suất vay tăng từ 17% lên khoảng pnorm(-0.95 + 0.26) ≈ pnorm(-0.69) ≈ 24%.
  • → Người tự doanh có xu hướng vay tiêu dùng nhiều hơn.

Biến educationsecondary:

  • Hệ số = 0.18
  • Người học hết trung học có probit cao hơn 0.18 so với người học tiểu học.
  • Xác suất vay tăng từ 17% lên khoảng pnorm(-0.95 + 0.18) ≈ pnorm(-0.77) ≈ 22%.
  • → Trình độ học vấn trung học tăng xác suất vay tiêu dùng.

Biến maritalsingle:

  • Hệ số = -0.19
  • Người độc thân có probit thấp hơn 0.19 so với người đã ly hôn.
  • Xác suất vay giảm từ 17% xuống khoảng pnorm(-0.95 - 0.19) ≈ pnorm(-1.14) ≈ 13%.
  • → Người độc thân ít vay tiêu dùng hơn người ly hôn.

Biến defaultyes:

  • Hệ số = 0.55
  • Người có nợ xấu có probit cao hơn 0.55 so với người không nợ xấu.
  • Xác suất vay tăng từ 17% lên khoảng pnorm(-0.95 + 0.55) ≈ pnorm(-0.40) ≈ 34%.
  • → Người có nợ xấu vẫn có khả năng vay cao hơn, phản ánh nhu cầu vay cao hoặc chính sách phê duyệt đặc biệt.

6.2.3 Kết luận

Mô hình Probit cho thấy nhiều đặc điểm cá nhân có ảnh hưởng đáng kể đến xác suất vay tiêu dùng. Các hệ số âm cho thấy xu hướng giảm xác suất vay, trong khi hệ số dương cho thấy tăng xác suất vay. Phân tích chi tiết từng yếu tố như trên cung cấp góc nhìn sâu sắc cho các ngân hàng khi đánh giá hồ sơ vay của khách hàng.

7 HỒI QUY CLOGLOG

Mô hình hồi quy Cloglog (complementary log-log regression) là một dạng của mô hình hồi quy nhị phân, tương tự như Logit và Probit, nhưng sử dụng một hàm liên kết phi đối xứng – đặc biệt phù hợp khi xác suất xảy ra sự kiện quan tâm rất nhỏ (hiếm gặp) hoặc rất lớn (gần như chắc chắn).

Hàm liên kết Cloglog

Mô hình có dạng toán học như sau:

\[ \log\left[-\log(1 - P(Y = 1))\right] = \beta_0 + \beta_1 X_1 + \beta_2 X_2 + \cdots + \beta_k X_k \]

hay viết lại theo xác suất:

\[ P(Y = 1 | X) = 1 - \exp\left[-\exp\left(\beta_0 + \beta_1 X_1 + \cdots + \beta_k X_k \right)\right] \]

Trong nghiên cứu này, ta áp dụng mô hình cho biến phụ thuộc:

  • \(Y = \text{loan}\): biến nhị phân (1 = có vay tiêu dùng, 0 = không vay).

Các biến độc lập gồm: job, education, marital, default.

\[ \log[-\log(1 - P(\text{loan} = 1))] = \beta_0 + \beta_1 \cdot \text{job} + \beta_2 \cdot \text{education} + \beta_3 \cdot \text{marital} + \beta_4 \cdot \text{default} \]

7.1 Hồi quy Cloglog đơn biến

Giả thuyết kiểm định
- H₀: Trình độ học vấn không ảnh hưởng đến xác suất vay tiêu dùng.
- H₁: Trình độ học vấn có ảnh hưởng đến xác suất vay tiêu dùng.

# Hồi quy Cloglog đơn biến với biến education
model_cloglog_edu <- glm(loan ~ education, data = data1, family = binomial(link = "cloglog"))
summary(model_cloglog_edu)
## 
## Call:
## glm(formula = loan ~ education, family = binomial(link = "cloglog"), 
##     data = data1)
## 
## Coefficients:
##                    Estimate Std. Error z value Pr(>|z|)    
## (Intercept)        -1.90216    0.10324 -18.425   <2e-16 ***
## educationsecondary  0.28739    0.11432   2.514   0.0119 *  
## educationtertiary  -0.07845    0.12812  -0.612   0.5403    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 3779.6  on 4333  degrees of freedom
## Residual deviance: 3760.2  on 4331  degrees of freedom
## AIC: 3766.2
## 
## Number of Fisher Scoring iterations: 5

Phương trình Cloglog được ước lượng

\[ \log(-\log(1 - P(\text{loan} = \text{yes}))) = -1.90 + 0.29 \times \text{educationsecondary} - 0.08 \times \text{educationtertiary} \]

Bảng tóm tắt các biến có ý nghĩa thống kê

Biến Nhóm so sánh Hệ số (β) p-value Diễn giải
educationsecondary So với primary 0.29 0.0119 Người học trung học có cloglog cao hơn 0.29 → xác suất vay tăng.
educationtertiary So với primary -0.08 0.5403 Không có ý nghĩa thống kê.

Kết luận

Kết quả hồi quy Cloglog đơn biến cho thấy nhóm có trình độ học vấn trung học (secondary) có ảnh hưởng có ý nghĩa thống kê đến khả năng vay tiêu dùng (p = 0.0119).
Cụ thể, hệ số ước lượng là 0.29, cho thấy nhóm này có giá trị cloglog cao hơn, tức là xác suất vay tiêu dùng cao hơn so với nhóm chỉ học tiểu học (primary).
Ngược lại, nhóm học đại học trở lên (tertiary) có hệ số âm nhẹ và không có ý nghĩa thống kê (p = 0.5403).

7.2 Hồi quy Cloglog đa biến

7.2.1 Kết quả hồi quy

Giả thuyết kiểm định

Với mỗi biến độc lập \(X_j\), ta kiểm định:

  • H₀: Biến độc lập không ảnh hưởng đến xác suất vay tiêu dùng
  • H₁: Biến độc lập có ảnh hưởng đến xác suất vay tiêu dùng

Dựa vào p-value trong kết quả ước lượng, ta đưa ra quyết định bác bỏ hay giữ H₀ tại mức ý nghĩa α (thường là 0.05).

Ước lượng mô hình

Mô hình được ước lượng bằng phương pháp tối đa hóa hàm hợp lý (Maximum Likelihood Estimation - MLE).

# Hồi quy cloglog
model_cloglog <- glm(loan ~ job + education + marital + default,
                     data = data1,
                     family = binomial(link = "cloglog"))

# Tóm tắt kết quả
summary(model_cloglog)
## 
## Call:
## glm(formula = loan ~ job + education + marital + default, family = binomial(link = "cloglog"), 
##     data = data1)
## 
## Coefficients:
##                    Estimate Std. Error z value Pr(>|z|)    
## (Intercept)        -1.68393    0.18527  -9.089  < 2e-16 ***
## jobblue-collar     -0.08106    0.13885  -0.584 0.559350    
## jobentrepreneur     0.39136    0.19585   1.998 0.045690 *  
## jobhousemaid       -0.56392    0.32618  -1.729 0.083833 .  
## jobmanagement      -0.30336    0.16384  -1.852 0.064084 .  
## jobretired         -0.25619    0.20990  -1.221 0.222256    
## jobself-employed   -0.08133    0.21554  -0.377 0.705915    
## jobservices        -0.10557    0.15805  -0.668 0.504166    
## jobstudent         -2.49997    1.00726  -2.482 0.013066 *  
## jobtechnician      -0.19380    0.14125  -1.372 0.170039    
## jobunemployed      -0.63490    0.29818  -2.129 0.033233 *  
## jobunknown         -1.44554    1.00786  -1.434 0.151495    
## educationsecondary  0.29882    0.12413   2.407 0.016070 *  
## educationtertiary   0.05028    0.15685   0.321 0.748543    
## maritalmarried     -0.06355    0.11699  -0.543 0.586968    
## maritalsingle      -0.30214    0.13555  -2.229 0.025810 *  
## defaultyes          0.80285    0.21172   3.792 0.000149 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 3779.6  on 4333  degrees of freedom
## Residual deviance: 3698.5  on 4317  degrees of freedom
## AIC: 3732.5
## 
## Number of Fisher Scoring iterations: 6

7.3 Phân tích kết quả theo từng nhóm biến

Trong phần này, ta đi sâu phân tích ý nghĩa thống kê và thực tiễn của từng nhóm biến độc lập trong mô hình Cloglog. Mỗi hệ số phản ánh tác động của biến độc lập tương ứng đến log[-log(1 - P(loan = yes))], với các nhóm tham chiếu đã được xác định rõ.

Bảng tổng hợp các biến có ý nghĩa thống kê (mô hình Cloglog)

Biến | Nhóm so sánh | Hệ số (β) | p-value | exp(β) (hazard ratio) | Diễn giải chi tiết |

|——————–|—————————|———–|———-|————————|———————| | jobstudent | So với admin. | -2.50 | 0.013 | 0.082 | Sinh viên có xác suất vay cực thấp (hazard chỉ bằng 8.2% so với nhóm hành chính). | | jobunemployed | So với admin. | -0.63 | 0.033 | 0.53 | Người thất nghiệp có xác suất vay thấp hơn khoảng 47%. | | jobentrepreneur | So với admin. | 0.39 | 0.046 | 1.48 | Người tự doanh có xác suất vay cao hơn 48%. | | educationsecondary | So với primary | 0.30 | 0.016 | 1.35 | Người học trung học có xác suất vay cao hơn 35% so với người chỉ học tiểu học. | | maritalsingle | So với divorced | -0.30 | 0.026 | 0.74 | Người độc thân có xác suất vay thấp hơn khoảng 26%. | | defaultyes | So với default = no | 0.80 | <0.001 | 2.23 | Người có nợ xấu có xác suất vay cao gấp 2.23 lần người không có nợ xấu. |

Phương trình Cloglog được ước lượng như sau

cloglog(P(loan = yes)) = -1.68 - 2.50×jobstudent - 0.63×jobunemployed + 0.39×jobentrepreneur + 0.30×educationsecondary - 0.30×maritalsingle + 0.80×defaultyes


Hệ số chặn (Intercept)

  • Hệ số = -1.68
  • Khi khách hàng thuộc nhóm tham chiếu (job = admin., education = primary, marital = divorced, default = no), cloglog(P) = -1.68
  • Xác suất tương ứng: 1 - exp(-exp(-1.68)) ≈ 0.18
  • → Nhóm tham chiếu có xác suất vay tiêu dùng khoảng 18%

Biến jobstudent

  • Hệ số = -2.50
  • So với nhóm hành chính, sinh viên có cloglog(P) thấp hơn 2.50
  • Tỷ số hazard = exp(-2.50) ≈ 0.082
  • → Sinh viên rất ít vay tiêu dùng

Biến jobunemployed

  • Hệ số = -0.63
  • So với nhóm hành chính, người thất nghiệp có cloglog(P) thấp hơn 0.63
  • Tỷ số hazard = exp(-0.63) ≈ 0.53
  • → Người thất nghiệp khó tiếp cận vay hơn

Biến jobentrepreneur

  • Hệ số = 0.39
  • So với nhóm hành chính, người tự doanh có cloglog(P) cao hơn 0.39
  • Tỷ số hazard = exp(0.39) ≈ 1.48
  • → Người tự doanh có xu hướng vay nhiều hơn

Biến educationsecondary

  • Hệ số = 0.30
  • So với người học tiểu học, người học trung học có cloglog(P) cao hơn 0.30
  • Tỷ số hazard = exp(0.30) ≈ 1.35
  • → Trình độ học vấn trung học tăng xác suất vay tiêu dùng

Biến maritalsingle

  • Hệ số = -0.30
  • So với người đã ly hôn, người độc thân có cloglog(P) thấp hơn 0.30
  • Tỷ số hazard = exp(-0.30) ≈ 0.74
  • → Người độc thân ít vay tiêu dùng hơn người ly hôn

Biến defaultyes

  • Hệ số = 0.80
  • So với người không có nợ xấu, người có nợ xấu có cloglog(P) cao hơn 0.80
  • Tỷ số hazard = exp(0.80) ≈ 2.23
  • → Người có nợ xấu có xác suất vay cao hơn, ngược kỳ vọng nhưng nhất quán qua các mô hình

Kết luận chung từ mô hình Cloglog

Các biến jobstudent, jobunemployed, jobentrepreneur, educationsecondary, maritalsingle, và defaultyes đều ảnh hưởng có ý nghĩa thống kê đến khả năng vay tiêu dùng.
Mô hình cloglog phù hợp khi xác suất xảy ra sự kiện thấp, và kết quả thu được khá nhất quán với mô hình logit và probit.
→ Giúp tăng độ tin cậy trong phân tích và ra quyết định.


8 SO SÁNH CÁC CHỈ SỐ CỦA BA MÔ HÌNH

# So sánh AIC giữa các mô hình
aic_results <- AIC(model_logit, model_probit, model_cloglog)

# So sánh Log-Likelihood
ll_logit <- logLik(model_logit)
ll_probit <- logLik(model_probit)
ll_cloglog <- logLik(model_cloglog)

# Cài gói và tính Pseudo R²
if (!require(pscl)) install.packages("pscl")
library(pscl)

r2_logit <- pR2(model_logit)["McFadden"]
## fitting null model for pseudo-r2
r2_probit <- pR2(model_probit)["McFadden"]
## fitting null model for pseudo-r2
r2_cloglog <- pR2(model_cloglog)["McFadden"]
## fitting null model for pseudo-r2
# Tổng hợp kết quả vào bảng
comparison_table <- data.frame(
  Model = c("Logit", "Probit", "Cloglog"),
  AIC = round(aic_results$AIC, 2),
  LogLikelihood = c(round(ll_logit[1], 2),
                    round(ll_probit[1], 2),
                    round(ll_cloglog[1], 2)),
  McFadden_R2 = round(c(r2_logit, r2_probit, r2_cloglog), 4)
)

# Hiển thị bảng kết quả
knitr::kable(comparison_table, caption = "So sánh ba mô hình nhị phân")
So sánh ba mô hình nhị phân
Model AIC LogLikelihood McFadden_R2
Logit 3732.26 -1849.13 0.0215
Probit 3732.26 -1849.13 0.0215
Cloglog 3732.53 -1849.26 0.0214

Nhận xét

Để lựa chọn mô hình hồi quy nhị phân phù hợp, ba mô hình được đánh giá theo các tiêu chí: Akaike Information Criterion (AIC), Log-Likelihood và Pseudo R² của McFadden.

  • AIC: Mô hình logit và probit đều có giá trị AIC thấp nhất (3732.26), cho thấy độ phù hợp mô hình tương đương và tốt hơn mô hình cloglog (3732.53).

  • Log-Likelihood: Hai mô hình logit và probit cùng đạt giá trị log-likelihood cao hơn một chút so với cloglog (ít âm hơn), phản ánh khả năng khớp dữ liệu tốt hơn nhẹ.

  • McFadden’s R²: Cả logit và probit có cùng giá trị R² là 0.0215, nhỉnh hơn so với cloglog (0.0214). Tuy nhiên, các giá trị này đều tương đối thấp, phản ánh khả năng giải thích biến phụ thuộc còn hạn chế.

Kết luận

Trong bối cảnh ba mô hình có hiệu quả dự đoán gần như tương đương, mô hình logit được xem là lựa chọn phù hợp hơn. Do đó, mô hình logit sẽ được sử dụng cho các phân tích và suy luận tiếp theo trong nghiên cứu này.


LS0tDQp0aXRsZTogIk5oaeG7h20gVuG7pSA2Ig0Kb3V0cHV0OiANCiAgaHRtbF9kb2N1bWVudDoNCiAgICB0b2M6IHRydWUNCiAgICB0b2NfZGVwdGg6IDMNCiAgICBudW1iZXJfc2VjdGlvbnM6IHllcw0KICAgIGRmX3ByaW50OiBwYWdlZA0KICAgIGNvZGVfZm9sZGluZzogaGlkZQ0KICAgIGNvZGVfZG93bmxvYWQ6IHRydWUNCiAgICB0b2NfZmxvYXQ6DQogICAgICBjb2xsYXBzZWQ6IHllcw0KICAgICAgc21vb3RoX3Njcm9sbDogeWVzDQotLS0NCg0KPHN0eWxlPg0KLyogSW4gxJHhuq1tIHRvw6BuIGLhu5kgdGnDqnUgxJHhu4EgKi8NCmgxLCBoMiwgaDMsIGg0LCBoNSwgaDYgew0KICBmb250LXdlaWdodDogYm9sZDsNCn0NCjwvc3R5bGU+DQoNCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQ0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBUUlVFLCB3YXJuaW5nID0gRkFMU0UsIG1lc3NhZ2UgPSBGQUxTRSkNCmxpYnJhcnkoZHBseXIpDQpsaWJyYXJ5KGdncGxvdDIpDQpsaWJyYXJ5KHJlYWR4bCkNCmxpYnJhcnkobm5ldCkNCmxpYnJhcnkocHNjbCkNCmxpYnJhcnkocFJPQykNCmxpYnJhcnkoTUFTUykNCmxpYnJhcnkoZXBpdG9vbHMpDQpsaWJyYXJ5KHN0YXJnYXplcikNCmxpYnJhcnkoeGxzeCkNCmBgYA0KDQojICoqR0nhu5pJIFRISeG7hlUqKiANCg0KQuG7mSBk4buvIGxp4buHdSDEkcaw4bujYyByw7p0IGfhu41uIHThu6sgbeG7mXQgY2hp4bq/biBk4buLY2ggbWFya2V0aW5nIHF1YSDEkWnhu4duIHRob+G6oWkgY+G7p2EgbeG7mXQgbmfDom4gaMOgbmcgdOG6oWkgQuG7kyDEkMOgbyBOaGEuIEThu68gbGnhu4d1IGJhbiDEkeG6p3UgbmjhurFtIHBo4bulYyB24bulIGNobyB2aeG7h2MgZOG7sSDEkW/DoW4ga2jhuqMgbsSDbmcga2jDoWNoIGjDoG5nIMSRxINuZyBrw70gZ+G7rWkgdGnhu4FuIGPDsyBr4buzIGjhuqFuLiBUdXkgbmhpw6puLCB0cm9uZyBuZ2hpw6puIGPhu6l1IG7DoHksIHTDoWMgZ2nhuqMgdOG6rXAgdHJ1bmcgdsOgbyBiaeG6v24gxJHhu4tuaCB0w61uaCBxdWFuIHRy4buNbmcgY8OzIGxpw6puIHF1YW4gxJHhur9uIGjDoG5oIHZpIHTDoGkgY2jDrW5oIGPhu6dhIGtow6FjaCBow6BuZywgxJHDsyBsw6A6DQoNCi0gKipgbG9hbmAqKjogS2jDoWNoIGjDoG5nIGPDsyB2YXkgdGnDqnUgZMO5bmcgaGF5IGtow7RuZyAoeWVzL25vKQ0KDQpIYWkgYmnhur9uIG7DoHkgxJHGsOG7o2MgY2jhu41uIGzDoG0gKipiaeG6v24gcGjhu6UgdGh14buZYyoqLCB24bubaSBt4bulYyB0acOqdSBwaMOibiB0w61jaCB4ZW0gKipjw6FjIHnhur91IHThu5EgbmjDom4ga2jhuql1IGjhu41jIHbDoCDEkeG6t2MgxJFp4buDbSBraMOhY2ggaMOgbmcqKiBuaMawOg0KDQotIE5naOG7gSBuZ2hp4buHcCAoYGpvYmApDQotIFTDrG5oIHRy4bqhbmcgaMO0biBuaMOibiAoYG1hcml0YWxgKQ0KLSBUcsOsbmggxJHhu5kgaOG7jWMgduG6pW4gKGBlZHVjYXRpb25gKQ0KLSBUw6xuaCB0cuG6oW5nIG7hu6MgcXXDoSBo4bqhbiAoYGRlZmF1bHRgKQ0KLSBIw6xuaCB0aOG7qWMgbGnDqm4gaOG7hyAoYGNvbnRhY3RgKQ0KLSBUw6xuaCB0cuG6oW5nIHZheSBtdWEgbmjDoCBj4bunYSBraMOhY2ggaMOgbmcgKGBob3VzaW5nYCkNCg0KLi4uIGPDsyDhuqNuaCBoxrDhu59uZyBuaMawIHRo4bq/IG7DoG8gxJHhur9uIHF1eeG6v3QgxJHhu4tuaCAqKnZheSB0acOqdSBkw7luZyoqIGPhu6dhIGtow6FjaCBow6BuZy4NCg0KVGjDtG5nIHF1YSB2aeG7h2Mgc+G7rSBk4bulbmcgY8OhYyBjw7RuZyBj4bulIHBow6JuIHTDrWNoIGThu68gbGnhu4d1IMSR4buLbmggdMOtbmggbmjGsDogYuG6o25nIHThuqduIHPhu5EsIGJp4buDdSDEkeG7kyBtaW5oIGjhu41hLCBraeG7g20gxJHhu4tuaCBDaGkgYsOsbmggcGjGsMahbmcsIHBow6JuIHTDrWNoIHThu7cgc+G7kSBjaMOqbmggbOG7h2NoIChPZGRzIFJhdGlvKSB2w6AgcuG7p2kgcm8gdMawxqFuZyDEkeG7kWkgKFJlbGF0aXZlIFJpc2spLCBiw6BpIG5naGnDqm4gY+G7qXUgc+G6vSBsw6BtIHLDtSBjw6FjIHnhur91IHThu5EgcXVhbiB0cuG7jW5nIOG6o25oIGjGsOG7n25nIMSR4bq/biBow6BuaCB2aSB0w6BpIGNow61uaCBj4bunYSBraMOhY2ggaMOgbmcuDQoNCiMjICoqxJDhu41jIHbDoCBraMOhbSBwaMOhIGThu68gbGnhu4d1KioNCg0KYGBge3J9DQpkYXRhIDwtIHJlYWQueGxzeCgiRDovUFRETERUL2RhdGEueGxzeCIsIHNoZWV0SW5kZXggPSAxLCBoZWFkZXIgPSBUUlVFKQ0KDQpkYXRhIDwtIGRhdGEgJT4lDQogIG11dGF0ZSgNCiAgICBsb2FuID0gYXMuZmFjdG9yKGxvYW4pLA0KICAgIGhvdXNpbmcgPSBhcy5mYWN0b3IoaG91c2luZyksDQogICAgam9iID0gYXMuZmFjdG9yKGpvYiksDQogICAgbWFyaXRhbCA9IGFzLmZhY3RvcihtYXJpdGFsKSwNCiAgICBlZHVjYXRpb24gPSBhcy5mYWN0b3IoZWR1Y2F0aW9uKSwNCiAgICBkZWZhdWx0ID0gYXMuZmFjdG9yKGRlZmF1bHQpLA0KICAgIGNvbnRhY3QgPSBhcy5mYWN0b3IoY29udGFjdCkNCiAgKQ0Kc3RyKGRhdGEpDQpzdW1tYXJ5KGRhdGEpDQpgYGANCg0KDQojIyAqKk3DtCB04bqjIGPDoWMgYmnhur9uKioNCg0KfCBUw6puIGJp4bq/biAgICB8IEtp4buDdSBk4buvIGxp4buHdSB8IFPhu5EgbMaw4bujbmcgZ2nDoSB0cuG7iyBkdXkgbmjhuqV0IHwgTcO0IHThuqMgbuG7mWkgZHVuZyB8DQp8LS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS18DQp8IGBhZ2VgICAgICAgIHwgTnVtZXJpYyAgICAgIHwgNjcgICAgICAgICAgICAgICAgICAgICAgICAgfCBUdeG7lWkgY+G7p2Ega2jDoWNoIGjDoG5nICh04burIDE5IMSR4bq/biA4NyB0deG7lWkpLiB8DQp8IGBqb2JgICAgICAgIHwgQ2hhcmFjdGVyICAgIHwgMTIgICAgICAgICAgICAgICAgICAgICAgICAgfCBOZ2jhu4EgbmdoaeG7h3AgY+G7p2Ega2jDoWNoIGjDoG5nIG5oxrA6IGBtYW5hZ2VtZW50YCwgYGJsdWUtY29sbGFyYCwgYHNlcnZpY2VzYCwgYHN0dWRlbnRgLCBgcmV0aXJlZGAsIGB1bmVtcGxveWVkYCwuLi4gfA0KfCBgbWFyaXRhbGAgICB8IENoYXJhY3RlciAgICB8IDMgICAgICAgICAgICAgICAgICAgICAgICAgIHwgVMOsbmggdHLhuqFuZyBow7RuIG5ow6JuOiBgc2luZ2xlYCwgYG1hcnJpZWRgLCBgZGl2b3JjZWRgLiB8DQp8IGBlZHVjYXRpb25gIHwgQ2hhcmFjdGVyICAgIHwgNCAgICAgICAgICAgICAgICAgICAgICAgICAgfCBUcsOsbmggxJHhu5kgaOG7jWMgduG6pW46IGBwcmltYXJ5YCwgYHNlY29uZGFyeWAsIGB0ZXJ0aWFyeWAsIGB1bmtub3duYC4gfA0KfCBgZGVmYXVsdGAgICB8IENoYXJhY3RlciAgICB8IDIgICAgICAgICAgICAgICAgICAgICAgICAgIHwgS2jDoWNoIGjDoG5nIGPDsyBu4bujIHTDrW4gZOG7pW5nIHF1w6EgaOG6oW4ga2jDtG5nPyAoYHllc2AsIGBub2ApIHwNCnwgYGhvdXNpbmdgICAgfCBDaGFyYWN0ZXIgICAgfCAyICAgICAgICAgICAgICAgICAgICAgICAgICB8IEtow6FjaCBow6BuZyBjw7MgdmF5IG11YSBuaMOgIGtow7RuZz8gKGB5ZXNgLCBgbm9gKSB8DQp8IGBsb2FuYCAgICAgIHwgQ2hhcmFjdGVyICAgIHwgMiAgICAgICAgICAgICAgICAgICAgICAgICAgfCBLaMOhY2ggaMOgbmcgY8OzIHZheSB0acOqdSBkw7luZyBraMO0bmc/IChgeWVzYCwgYG5vYCkgfA0KfCBgY29udGFjdGAgICB8IENoYXJhY3RlciAgICB8IDMgICAgICAgICAgICAgICAgICAgICAgICAgIHwgSMOsbmggdGjhu6ljIGxpw6puIGjhu4c6IGBjZWxsdWxhcmAsIGB0ZWxlcGhvbmVgLCBgdW5rbm93bmAgfA0KDQoNCioqTmjhuq1uIHjDqXQqKg0KDQpC4buZIGThu68gbGnhu4d1IGfhu5NtIDggYmnhur9uIHbDoCA0MjUxIHF1YW4gc8OhdCwgxJHGsOG7o2MgY2hpYSB0aMOgbmggaGFpIG5ow7NtIGNow61uaDogYmnhur9uIMSR4buLbmggbMaw4bujbmcgdsOgIGJp4bq/biDEkeG7i25oIHTDrW5oLg0KDQotICoqQmnhur9uIMSR4buLbmggbMaw4bujbmc6KiogQ2jhu4kgY8OzIG3hu5l0IGJp4bq/biBkdXkgbmjhuqV0IGzDoCBiaeG6v24gxJHhu4tuaCBsxrDhu6NuZywgxJHDsyBsw6AgYmnhur9uIGFnZS4gxJDDonkgbMOgIGJp4bq/biDEkW8gbMaw4budbmcgdHXhu5VpIGPhu6dhIGtow6FjaCBow6BuZywgY8OzIGtp4buDdSBz4buRIChudW1lcmljKSwgY8OzIHRo4buDIHPhu60gZOG7pW5nIMSR4buDIHTDrW5oIHRvw6FuIHRydW5nIGLDrG5oLCDEkeG7mSBs4buHY2ggY2h14bqpbiwgcGjDom4gcGjhu5FpLCB2LnYuIEJp4bq/biBuw6B5IG1hbmcgdGjDtG5nIHRpbiBsacOqbiB04bulYyB2w6AgY8OzIHRo4buDIGTDuW5nIGNobyBjw6FjIHBoxrDGoW5nIHBow6FwIHBow6JuIHTDrWNoIMSR4buLbmggbMaw4bujbmcgbmjGsCBo4buTaSBxdXkgdHV54bq/biB0w61uaCBob+G6t2MgcGjDom4gdMOtY2ggcGjGsMahbmcgc2FpLg0KDQotICoqQ8OhYyBiaeG6v24gxJHhu4tuaCB0w61uaDoqKiBDw7MgYuG6o3kgYmnhur9uIGPDsm4gbOG6oWkgdGh14buZYyBsb+G6oWkgYmnhur9uIMSR4buLbmggdMOtbmguIEPDoWMgYmnhur9uIG7DoHkgbWFuZyB0aMO0bmcgdGluIGThuqFuZyBkYW5oIG3hu6VjIChjYXRlZ29yaWNhbCksIGtow7RuZyBkw7luZyDEkeG7gyB0w61uaCB0b8OhbiB0cuG7sWMgdGnhur9wIG3DoCB0aMaw4budbmcgxJHGsOG7o2MgcGjDom4gdMOtY2ggYuG6sW5nIGPDoWNoIMSR4bq/bSB04bqnbiBz4buRLCB04bu3IGzhu4csIGhv4bq3YyBkw7luZyBjw6FjIHBoxrDGoW5nIHBow6FwIHRo4buRbmcga8OqIGNobyBk4buvIGxp4buHdSDEkeG7i25oIHTDrW5oIG5oxrAga2nhu4NtIMSR4buLbmggQ2hpIGLDrG5oIHBoxrDGoW5nLCB0w61uaCBPZGRzIFJhdGlvLCBSZWxhdGl2ZSBSaXNrLC4uLg0KDQoqKlThuqFvIGLhu5kgZOG7ryBsaeG7h3UgY2jhu4kgY8OzIGJp4bq/biDEkeG7i25oIHTDrW5oKioNCg0KYGBge3J9DQpsaWJyYXJ5KGRwbHlyKQ0KDQojIFThuqFvIGLhu5kgZOG7ryBsaeG7h3UgY2jhu4kgY2jhu6lhIGPDoWMgYmnhur9uIMSR4buLbmggdMOtbmgNCmRhdGExIDwtIGRhdGEgJT4lDQogIGRwbHlyOjpzZWxlY3Qoam9iLCBtYXJpdGFsLCBlZHVjYXRpb24sIGRlZmF1bHQsIGhvdXNpbmcsIGxvYW4sIGNvbnRhY3QpDQoNCiMgWGVtIHRyxrDhu5tjIGThu68gbGnhu4d1IG3hu5tpDQpzdHIoZGF0YTEpDQpoZWFkKGRhdGExKQ0KYGBgDQoNCi0tLQ0KDQojICoqVEjhu5BORyBLw4ogTcOUIFThuqIgQknhur5OIE5HSEnDik4gQ+G7qFUqKg0KDQojIyAqKlRo4buRbmcgbcO0IHThuqMgYmnhur9uIHBo4bulIHRodeG7mWMqKg0KDQojIyMgKipCaeG6v24gTG9hbioqDQoNCioqTOG6rXAgYuG6o25nIHThuqduIHPhu5EgdsOgIHThuqduIHN14bqldCoqDQoNCmBgYHtyfQ0KdGFibGUoZGF0YTEkbG9hbikNCnByb3AudGFibGUodGFibGUoZGF0YTEkbG9hbikpDQpgYGANCg0KDQoqKlbhur0gYmnhu4N1IMSR4buTIGPhu5l0KioNCg0KYGBge3J9DQpmcmVxX2xvYW4gPC0gYXMuZGF0YS5mcmFtZSh0YWJsZShkYXRhMSRsb2FuKSkNCmNvbG5hbWVzKGZyZXFfbG9hbikgPC0gYygiTG9hbiIsICJDb3VudCIpDQoNCmdncGxvdChmcmVxX2xvYW4sIGFlcyh4ID0gTG9hbiwgeSA9IENvdW50KSkgKw0KICBnZW9tX2NvbChmaWxsID0gIiM5MzcwREIiLCBjb2xvciA9ICJibGFjayIpICsNCiAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IENvdW50KSwgdmp1c3QgPSAtMC41KSArDQogIGxhYnModGl0bGUgPSAiVOG6p24gc+G7kSB2YXkgdGnDqnUgZMO5bmciLCB4ID0gIlZheSB0acOqdSBkw7luZyIsIHkgPSAiU+G7kSBsxrDhu6NuZyIpICsNCiAgdGhlbWVfbWluaW1hbCgpICsNCiAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSkpDQpgYGANCg0KDQoqKlbhur0gYmnhu4N1IMSR4buTIHRyw7JuKioNCg0KYGBge3J9DQojIFThuqFvIGLhuqNuZyB04bqnbiBzdeG6pXQNCmxvYW5fZnJlcSA8LSB0YWJsZShkYXRhMSRsb2FuKQ0KbG9hbl9wcm9wIDwtIHByb3AudGFibGUobG9hbl9mcmVxKQ0KDQojIENodXnhu4NuIHRow6BuaCBkYXRhIGZyYW1lIMSR4buDIGTDuW5nIGdncGxvdDINCmxvYW5fZGYgPC0gYXMuZGF0YS5mcmFtZShsb2FuX3Byb3ApDQpjb2xuYW1lcyhsb2FuX2RmKSA8LSBjKCJMb2FuIiwgIlByb3BvcnRpb24iKQ0KDQojIFTDrW5oIHBo4bqnbiB0csSDbSDEkeG7gyBoaeG7g24gdGjhu4sgbmjDo24NCmxvYW5fZGYkUGVyY2VudCA8LSBwYXN0ZTAocm91bmQobG9hbl9kZiRQcm9wb3J0aW9uICogMTAwLCAxKSwgIiUiKQ0KDQojIFbhur0gYmnhu4N1IMSR4buTIHRyw7JuIGLhurFuZyBnZ3Bsb3QyDQpnZ3Bsb3QobG9hbl9kZiwgYWVzKHggPSAiIiwgeSA9IFByb3BvcnRpb24sIGZpbGwgPSBMb2FuKSkgKw0KICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5Iiwgd2lkdGggPSAxKSArDQogIGNvb3JkX3BvbGFyKCJ5IikgKw0KICBnZW9tX3RleHQoYWVzKGxhYmVsID0gUGVyY2VudCksIHBvc2l0aW9uID0gcG9zaXRpb25fc3RhY2sodmp1c3QgPSAwLjUpKSArDQogIGxhYnModGl0bGUgPSAiVOG7tyBs4buHIHZheSB0acOqdSBkw7luZyIsIHggPSBOVUxMLCB5ID0gTlVMTCkgKw0KICB0aGVtZV92b2lkKCkrDQogIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUpKQ0KYGBgDQoNCg0KKipE4buxYSB2w6BvIGLhuqNuZyB04bqnbiBz4buRLCB04bqnbiBzdeG6pXQgdsOgIGJp4buDdSDEkeG7kyBj4bunYSBiaeG6v24gbG9hbiwgdGEgY8OzIGPDoWMgbmjhuq1uIMSR4buLbmggc2F1OioqDQoNCi0gTmjDs20ga2jDtG5nIHZheSB0acOqdSBkw7luZyAobm8pIGNoaeG6v20gc+G7kSBsxrDhu6NuZyBs4bubbiB2xrDhu6N0IHRy4buZaSB24bubaSAzLjgzMCBuZ8aw4budaSwgdMawxqFuZyDhu6luZyBraG/huqNuZyA4NC43JSB04buVbmcgc+G7kSBt4bqrdS4gxJDDonkgbMOgIG5ow7NtIGNoaeG6v20gxrB1IHRo4bq/IHLDtSBy4buHdC4NCg0KLSBOaMOzbSBjw7MgdmF5IHRpw6p1IGTDuW5nICh5ZXMpIGNo4buJIGPDsyA2OTEgbmfGsOG7nWksIGNoaeG6v20ga2hv4bqjbmcgMTUuMyUuDQoNCioqS+G6v3QgbHXhuq1uOioqDQoNClBow6JuIGLhu5EgdmF5IHRpw6p1IGTDuW5nIGNobyB0aOG6pXkgxJFhIHPhu5Ega2jDoWNoIGjDoG5nIGtow7RuZyBz4butIGThu6VuZyBow6xuaCB0aOG7qWMgdmF5IHRpw6p1IGTDuW5nLCBwaOG6o24gw6FuaCBz4buxIHRo4bqtbiB0cuG7jW5nIHRyb25nIGNoaSB0acOqdSBob+G6t2MgdGnhur9wIGPhuq1uIGjhuqFuIGNo4bq/IHbhu5tpIGxv4bqhaSBow6xuaCB0w61uIGThu6VuZyBuw6B5LiBZ4bq/dSB04buRIG7DoHkgY8OzIHRo4buDIMSRw7NuZyB2YWkgdHLDsiB0cm9uZyB2aeG7h2MgeMOhYyDEkeG7i25oIG3hu6ljIMSR4buZIHRpw6p1IGTDuW5nIGPDoSBuaMOibiB2w6Aga2jhuqMgbsSDbmcgdGnhur9wIGPhuq1uIHTDrW4gZOG7pW5nIHRpw6p1IGTDuW5nIHRyb25nIG5naGnDqm4gY+G7qXUgaMOgbmggdmkgdMOgaSBjaMOtbmguDQoNCg0KDQojIyAqKlRo4buRbmcga8OqIG3DtCB04bqjIGJp4bq/biDEkeG7mWMgbOG6rXAqKg0KDQojIyMgKipCaeG6v24gSG91c2luZyoqDQoNCioqTOG6rXAgYuG6o25nIHThuqduIHPhu5EgdsOgIHThuqduIHN14bqldCoqDQoNCmBgYHtyfQ0KdGFibGUoZGF0YTEkaG91c2luZykNCnByb3AudGFibGUodGFibGUoZGF0YTEkaG91c2luZykpDQpgYGANCg0KDQoqKlbhur0gYmnhu4N1IMSR4buTIGPhu5l0KioNCg0KYGBge3J9DQpmcmVxX2hvdXNpbmcgPC0gYXMuZGF0YS5mcmFtZSh0YWJsZShkYXRhMSRob3VzaW5nKSkNCmNvbG5hbWVzKGZyZXFfaG91c2luZykgPC0gYygiSG91c2luZyIsICJDb3VudCIpDQoNCmdncGxvdChmcmVxX2hvdXNpbmcsIGFlcyh4ID0gSG91c2luZywgeSA9IENvdW50KSkgKw0KICBnZW9tX2NvbChmaWxsID0gIiM2NkNEQUEiLCBjb2xvciA9ICJibGFjayIpICsNCiAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IENvdW50KSwgdmp1c3QgPSAtMC41KSArDQogIGxhYnModGl0bGUgPSAiVOG6p24gc+G7kSB2YXkgbXVhIG5ow6AiLCB4ID0gIlZheSBuaMOgIiwgeSA9ICJT4buRIGzGsOG7o25nIikgKw0KICB0aGVtZV9taW5pbWFsKCkgKw0KICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KSkNCmBgYA0KDQoNCmBgYHtyfQ0KIyBU4bqhbyBi4bqjbmcgdOG6p24gc3XhuqV0DQpob3VzaW5nX2ZyZXEgPC0gdGFibGUoZGF0YTEkaG91c2luZykNCmhvdXNpbmdfcHJvcCA8LSBwcm9wLnRhYmxlKGhvdXNpbmdfZnJlcSkNCg0KIyBDaHV54buDbiBzYW5nIGRhdGEgZnJhbWUgxJHhu4MgduG6vSB24bubaSBnZ3Bsb3QyDQpob3VzaW5nX2RmIDwtIGFzLmRhdGEuZnJhbWUoaG91c2luZ19wcm9wKQ0KY29sbmFtZXMoaG91c2luZ19kZikgPC0gYygiSG91c2luZyIsICJQcm9wb3J0aW9uIikNCg0KIyBUaMOqbSBj4buZdCBwaOG6p24gdHLEg20gxJHhu4MgbMOgbSBuaMOjbg0KaG91c2luZ19kZiRQZXJjZW50IDwtIHBhc3RlMChyb3VuZChob3VzaW5nX2RmJFByb3BvcnRpb24gKiAxMDAsIDEpLCAiJSIpDQoNCiMgVuG6vSBiaeG7g3UgxJHhu5MgdHLDsm4NCmdncGxvdChob3VzaW5nX2RmLCBhZXMoeCA9ICIiLCB5ID0gUHJvcG9ydGlvbiwgZmlsbCA9IEhvdXNpbmcpKSArDQogIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiLCB3aWR0aCA9IDEpICsNCiAgY29vcmRfcG9sYXIoInkiKSArDQogIGdlb21fdGV4dChhZXMobGFiZWwgPSBQZXJjZW50KSwgcG9zaXRpb24gPSBwb3NpdGlvbl9zdGFjayh2anVzdCA9IDAuNSkpICsNCiAgbGFicyh0aXRsZSA9ICJ04bu3IGzhu4cgdmF5IG11YSBuaMOgIiwgeCA9IE5VTEwsIHkgPSBOVUxMKSArDQogIHRoZW1lX3ZvaWQoKQ0KdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSkpDQpgYGANCg0KKipE4buxYSB2w6BvIGLhuqNuZyB04bqnbiBz4buRLCB04bqnbiBzdeG6pXQgdsOgIGJp4buDdSDEkeG7kyBj4bunYSBiaeG6v24gaG91c2luZywgdGEgY8OzIGPDoWMgbmjhuq1uIMSR4buLbmggc2F1OioqDQoNCi0gTmjDs20gY8OzIHZheSBtdWEgbmjDoCAoeWVzKSBjaGnhur9tIHThu7cgbOG7hyBjYW8gaMahbiB24bubaSAyLDU1OSBuZ8aw4budaSwgdMawxqFuZyDhu6luZyBraG/huqNuZyA1Ni42JSB04buVbmcgc+G7kSBt4bqrdS4gxJDDonkgbMOgIG5ow7NtIGNoaeG6v20gdOG7tyB0cuG7jW5nIGzhu5tuIHRyb25nIHThuq1wIGThu68gbGnhu4d1Lg0KDQotIE5ow7NtIGtow7RuZyB2YXkgbXVhIG5ow6AgKG5vKSBjw7MgMSw5NjIgbmfGsOG7nWksIGNoaeG6v20ga2hv4bqjbmcgNDMuNCUuDQoNCioqS+G6v3QgbHXhuq1uOioqDQoNClBow6JuIGLhu5EgZOG7ryBsaeG7h3UgY2hvIHRo4bqleSBwaOG6p24gbOG7m24ga2jDoWNoIGjDoG5nIHRyb25nIHThuq1wIGThu68gbGnhu4d1IGPDsyBraG/huqNuIHZheSBtdWEgbmjDoC4gxJBp4buBdSBuw6B5IGPDsyB0aOG7gyBwaOG6o24gw6FuaCBuaHUgY+G6p3UgduG7gSBuaMOgIOG7nyBjxaluZyBuaMawIG3hu6ljIMSR4buZIHRp4bq/cCBj4bqtbiB0w61uIGThu6VuZyBtdWEgYuG6pXQgxJHhu5luZyBz4bqjbiBj4bunYSBraMOhY2ggaMOgbmcgdHJvbmcgdOG6rXAgbeG6q3UuDQoNCg0KIyMjICoqQmnhur9uIEpvYioqDQoNCioqTOG6rXAgYuG6o25nIHThuqduIHPhu5EgdsOgIHThuqduIHN14bqldCoqDQoNCmBgYHtyfQ0KI0LhuqNuZyB04bqnbiBz4buRDQp0YWJsZShkYXRhMSRqb2IpDQojQuG6o25nIHThuqduIHN14bqldA0KdGFibGUoZGF0YTEkam9iKS9zdW0odGFibGUoZGF0YTEkam9iKSkNCmBgYA0KDQoqKlbhur0gYmnhu4N1IMSR4buTIGPhu5l0KioNCg0KYGBge3J9DQpsaWJyYXJ5KGdncGxvdDIpDQoNCmxpYnJhcnkoZ2dwbG90MikNCg0KIyBU4bqhbyBi4bqjbmcgdOG6p24gc+G7kSBjaG8gYmnhur9uIGpvYg0KZnJlcTEgPC0gdGFibGUoZGF0YTEkam9iKQ0KDQojIENodXnhu4NuIHRow6BuaCBkYXRhIGZyYW1lDQpqb2JfZnJlcSA8LSBhcy5kYXRhLmZyYW1lKGZyZXExKQ0KY29sbmFtZXMoam9iX2ZyZXEpIDwtIGMoIkpvYiIsICJDb3VudCIpDQoNCiMgVuG6vSBiaeG7g3UgxJHhu5MgY+G7mXQNCmdncGxvdChqb2JfZnJlcSwgYWVzKHggPSBKb2IsIHkgPSBDb3VudCkpICsNCiAgZ2VvbV9jb2woZmlsbCA9ICIjNjQ5NUVEIiwgY29sb3IgPSAiYmxhY2siKSArDQogIGdlb21fdGV4dChhZXMobGFiZWwgPSBDb3VudCksIHZqdXN0ID0gLTAuNSwgY29sb3IgPSAiYmxhY2siKSArDQogIGxhYnModGl0bGUgPSAiVOG6p24gc+G7kSB0aGVvIG5naOG7gSBuZ2hp4buHcCIsIHggPSAiTmdo4buBIG5naGnhu4dwIiwgeSA9ICJT4buRIGzGsOG7o25nIikgKw0KICB0aGVtZV9taW5pbWFsKCkgKw0KICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEpKSsNCiAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSkpIA0KYGBgDQoNCioqROG7sWEgdsOgbyBi4bqjbmcgdOG6p24gc+G7kSB2w6AgYmnhu4N1IMSR4buTIHRyw6puLCB0YSBjw7MgY8OhYyBuaOG6rW4gxJHhu4tuaCBzYXU6KioNCg0KDQotIE5naOG7gSBuZ2hp4buHcCBwaOG7lSBiaeG6v24gbmjhuqV0IGzDoCBtYW5hZ2VtZW50IHbhu5tpIDk2OSBuZ8aw4budaSwgY2hp4bq/bSBraG/huqNuZyAyMS40JSB04buVbmcgc+G7kSBt4bqrdS4NCg0KLSBUaGVvIHNhdSBsw6AgYmx1ZS1jb2xsYXIgKDk0NiBuZ8aw4budaSwgfjIwLjklKSB2w6AgdGVjaG5pY2lhbiAoNzY4IG5nxrDhu51pLCB+MTcuMCUpLg0KDQotIEPDoWMgbmjDs20gbmdo4buBIMOtdCBwaOG7lSBiaeG6v24gaMahbiBn4buTbTogc3R1ZGVudCAoODQgbmfGsOG7nWksIH4xLjklKSB2w6AgdW5rbm93biAoMzggbmfGsOG7nWksIH4wLjglKS4NCg0KLSBU4buVbmcgY+G7mW5nLCBiYSBuaMOzbSBuZ2jhu4EgY2hp4bq/bSB04bu3IGzhu4cgY2FvIG5o4bqldCAobWFuYWdlbWVudCwgYmx1ZS1jb2xsYXIsIHRlY2huaWNpYW4pIMSRw6MgY2hp4bq/bSBoxqFuIDU5JSB0b8OgbiBi4buZIGThu68gbGnhu4d1Lg0KDQoqKkvhur90IGx14bqtbjoqKg0KDQpQaMOibiBi4buRIG5naOG7gSBuZ2hp4buHcCBraMO0bmcgxJHhu4F1LCBjaG8gdGjhuqV5IGPDoWMga2jDoWNoIGjDoG5nIHRyb25nIGThu68gbGnhu4d1IGNo4bunIHnhur91IMSR4bq/biB04burIGPDoWMgbmfDoG5oIHF14bqjbiBsw70sIGxhbyDEkeG7mW5nIHBo4buVIHRow7RuZyB2w6Aga+G7uSB0aHXhuq10IHZpw6puLiANCg0KDQojIyMgKipCaeG6v24gTWFyaXRhbCoqDQoNCioqTOG6rXAgYuG6o25nIHThuqduIHPhu5EgdsOgIHThuqduIHN14bqldCoqDQoNCmBgYHtyfQ0KIyBC4bqjbmcgdOG6p24gc+G7kQ0KdGFibGUoZGF0YTEkbWFyaXRhbCkNCiMgQuG6o25nIHThuqduIHN14bqldA0KcHJvcC50YWJsZSh0YWJsZShkYXRhMSRtYXJpdGFsKSkNCmBgYA0KDQoqKlbhur0gYmnhu4N1IMSR4buTIGPhu5l0KioNCg0KYGBge3J9DQojIEJp4buDdSDEkeG7kyBj4buZdA0KbGlicmFyeShnZ3Bsb3QyKQ0KZnJlcV9tYXJpdGFsIDwtIGFzLmRhdGEuZnJhbWUodGFibGUoZGF0YTEkbWFyaXRhbCkpDQpjb2xuYW1lcyhmcmVxX21hcml0YWwpIDwtIGMoIk1hcml0YWwiLCAiQ291bnQiKQ0KDQpnZ3Bsb3QoZnJlcV9tYXJpdGFsLCBhZXMoeCA9IE1hcml0YWwsIHkgPSBDb3VudCkpICsNCiAgZ2VvbV9jb2woZmlsbCA9ICIjNjQ5NUVEIiwgY29sb3IgPSAiYmxhY2siKSArDQogIGdlb21fdGV4dChhZXMobGFiZWwgPSBDb3VudCksIHZqdXN0ID0gLTAuNSkgKw0KICBsYWJzKHRpdGxlID0gIlThuqduIHPhu5EgdGhlbyB0w6xuaCB0cuG6oW5nIGjDtG4gbmjDom4iLCB4ID0gIlTDrG5oIHRy4bqhbmcgaMO0biBuaMOibiIsIHkgPSAiU+G7kSBsxrDhu6NuZyIpICsNCiAgdGhlbWVfbWluaW1hbCgpICsNCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgaGp1c3QgPSAxKSwNCiAgICAgICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSkpDQpgYGANCg0KKipE4buxYSB2w6BvIGLhuqNuZyB04bqnbiBz4buRIHbDoCB04bqnbiBzdeG6pXQgY+G7p2EgYmnhur9uIG1hcml0YWwsIHRhIGPDsyBjw6FjIG5o4bqtbiDEkeG7i25oIHNhdToqKg0KDQotIE5ow7NtIGvhur90IGjDtG4gKG1hcnJpZWQpIGNoaeG6v20gdOG7tyBs4buHIGNhbyBuaOG6pXQsIHbhu5tpIDIsNzk3IG5nxrDhu51pLCB0xrDGoW5nIOG7qW5nIGtob+G6o25nIDYxLjklIHThu5VuZyBz4buRIG3huqt1LiDEkMOieSBsw6AgbmjDs20gY2hp4bq/bSDGsHUgdGjhur8gdsaw4bujdCB0cuG7mWkuDQoNCi0gTmjDs20gxJHhu5ljIHRow6JuIChzaW5nbGUpIGNoaeG6v20gMSwxOTYgbmfGsOG7nWkgKH4yNi41JSksIMSR4bupbmcgdGjhu6kgaGFpIHbhu4EgdOG6p24gc3XhuqV0Lg0KDQotIE5ow7NtIGx5IGjDtG4gKGRpdm9yY2VkKSBjaOG7iSBjaGnhur9tIDUyOCBuZ8aw4budaSAofjExLjclKSwgbMOgIG5ow7NtIGPDsyBz4buRIGzGsOG7o25nIHRo4bqlcCBuaOG6pXQuDQoNCg0KKipL4bq/dCBsdeG6rW46KioNCg0KUGjDom4gYuG7kSB0w6xuaCB0cuG6oW5nIGjDtG4gbmjDom4gdHJvbmcgdOG6rXAgZOG7ryBsaeG7h3UgbsOgeSBraMOhIGNow6puaCBs4buHY2gsIHbhu5tpIHBo4bqnbiBs4bubbiBraMOhY2ggaMOgbmcgbMOgIG5nxrDhu51pIMSRw6Mga+G6v3QgaMO0bi4gxJBp4buBdSBuw6B5IGPDsyB0aOG7gyBwaOG6o24gw6FuaCB4dSBoxrDhu5tuZyBob+G6t2MgY+G6pXUgdHLDumMgZMOibiBz4buRIGPhu6dhIGtow6FjaCBow6BuZyB0cm9uZyB04bqtcCBk4buvIGxp4buHdS4NCg0KIyMjICoqQmnhur9uIEVkdWNhdGlvbioqDQoNCioqTOG6rXAgYuG6o25nIHThuqduIHPhu5EgdsOgIHThuqduIHN14bqldCoqDQoNCmBgYHtyfQ0KdGFibGUoZGF0YTEkZWR1Y2F0aW9uKQ0KcHJvcC50YWJsZSh0YWJsZShkYXRhMSRlZHVjYXRpb24pKQ0KYGBgDQoNCioqVuG6vSBiaeG7g3UgxJHhu5MgY+G7mXQqKg0KDQpgYGB7cn0NCmZyZXFfZWR1IDwtIGFzLmRhdGEuZnJhbWUodGFibGUoZGF0YTEkZWR1Y2F0aW9uKSkNCmNvbG5hbWVzKGZyZXFfZWR1KSA8LSBjKCJFZHVjYXRpb24iLCAiQ291bnQiKQ0KDQpnZ3Bsb3QoZnJlcV9lZHUsIGFlcyh4ID0gRWR1Y2F0aW9uLCB5ID0gQ291bnQpKSArDQogIGdlb21fY29sKGZpbGwgPSAiI0ZGOTk2NiIsIGNvbG9yID0gImJsYWNrIikgKw0KICBnZW9tX3RleHQoYWVzKGxhYmVsID0gQ291bnQpLCB2anVzdCA9IC0wLjUpICsNCiAgbGFicyh0aXRsZSA9ICJU4bqnbiBz4buRIHRoZW8gdHLDrG5oIMSR4buZIGjhu41jIHbhuqVuIiwgeCA9ICJUcsOsbmggxJHhu5kiLCB5ID0gIlPhu5EgbMaw4bujbmciKSArDQogIHRoZW1lX21pbmltYWwoKSArDQogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIGhqdXN0ID0gMSksDQogICAgICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUpKQ0KYGBgDQoNCg0KKipE4buxYSB2w6BvIGLhuqNuZyB04bqnbiBz4buRIHbDoCB04bqnbiBzdeG6pXQgY+G7p2EgYmnhur9uIGVkdWNhdGlvbiwgdGEgY8OzIGPDoWMgbmjhuq1uIMSR4buLbmggc2F1OioqDQoNCi0gTmjDs20gY8OzIHRyw6xuaCDEkeG7mSBo4buNYyB24bqlbiBzZWNvbmRhcnkgY2hp4bq/bSB04bu3IGzhu4cgY2FvIG5o4bqldCwgduG7m2kgMiwzMDYgbmfGsOG7nWksIHTGsMahbmcg4bupbmcga2hv4bqjbmcgNTEuMCUgdOG7lW5nIHPhu5EgbeG6q3UuIMSQw6J5IGzDoCBuaMOzbSBjaGnhur9tIMawdSB0aOG6vyB2xrDhu6N0IHRy4buZaS4NCg0KLSBOaMOzbSBjw7MgdHLDrG5oIMSR4buZIHRlcnRpYXJ5ICjEkeG6oWkgaOG7jWMsIHNhdSDEkeG6oWkgaOG7jWMpIGPDsyAxLDM1MCBuZ8aw4budaSwgY2hp4bq/bSBraG/huqNuZyAyOS44JSwgxJHhu6luZyB0aOG7qSBoYWkgduG7gSB04bqnbiBzdeG6pXQuDQoNCi0gTmjDs20gcHJpbWFyeSBjw7MgNjc4IG5nxrDhu51pLCB0xrDGoW5nIOG7qW5nIGtob+G6o25nIDE1LjAlIHThu5VuZyBz4buRIG3huqt1Lg0KDQotIE5ow7NtIHVua25vd24gKGtow7RuZyByw7UgdHLDrG5oIMSR4buZIGjhu41jIHbhuqVuKSBjaOG7iSBjaGnhur9tIDE4NyBuZ8aw4budaSwgdMawxqFuZyDhu6luZyA0LjElLCBsw6AgbmjDs20gY8OzIHPhu5EgbMaw4bujbmcgdGjhuqVwIG5o4bqldC4NCg0KKipL4bq/dCBsdeG6rW46KioNCg0KUGjDom4gYuG7kSB0csOsbmggxJHhu5kgaOG7jWMgduG6pW4gdHJvbmcgdOG6rXAgZOG7ryBsaeG7h3UgY2hvIHRo4bqleSBwaOG6p24gbOG7m24ga2jDoWNoIGjDoG5nIGPDsyB0csOsbmggxJHhu5kgaOG7jWMgduG6pW4gdHJ1bmcgaOG7jWMuIMSQaeG7gXUgbsOgeSBjw7MgdGjhu4MgcGjhuqNuIMOhbmggY+G6pXUgdHLDumMgdHLDrG5oIMSR4buZIGjhu41jIHbhuqVuIHBo4buVIGJp4bq/biB0cm9uZyBuaMOzbSBraMOhY2ggaMOgbmcgxJHGsOG7o2Mga2jhuqNvIHPDoXQsIMSR4buTbmcgdGjhu51pIGzDoCB54bq/dSB04buRIGPhuqduIHhlbSB4w6l0IHRyb25nIGPDoWMgcGjDom4gdMOtY2ggbGnDqm4gcXVhbiDEkeG6v24gaMOgbmggdmkgdGnDqnUgZMO5bmcgaG/hurdjIGto4bqjIG7Eg25nIHRp4bq/cCBj4bqtbiBk4buLY2ggduG7pS4NCg0KIyMjICoqQmnhur9uIERlZmF1bHQqKg0KDQoqKkzhuq1wIGLhuqNuZyB04bqnbiBz4buRIHbDoCB04bqnbiBzdeG6pXQqKg0KDQpgYGB7cn0NCnRhYmxlKGRhdGExJGRlZmF1bHQpDQpwcm9wLnRhYmxlKHRhYmxlKGRhdGExJGRlZmF1bHQpKQ0KYGBgDQoNCioqVuG6vSBiaeG7g3UgxJHhu5MgY+G7mXQqKg0KDQpgYGB7cn0NCmZyZXFfZGVmYXVsdCA8LSBhcy5kYXRhLmZyYW1lKHRhYmxlKGRhdGExJGRlZmF1bHQpKQ0KY29sbmFtZXMoZnJlcV9kZWZhdWx0KSA8LSBjKCJEZWZhdWx0IiwgIkNvdW50IikNCg0KZ2dwbG90KGZyZXFfZGVmYXVsdCwgYWVzKHggPSBEZWZhdWx0LCB5ID0gQ291bnQpKSArDQogIGdlb21fY29sKGZpbGwgPSAiI0YwODA4MCIsIGNvbG9yID0gImJsYWNrIikgKw0KICBnZW9tX3RleHQoYWVzKGxhYmVsID0gQ291bnQpLCB2anVzdCA9IC0wLjUpICsNCiAgbGFicyh0aXRsZSA9ICJU4bqnbiBz4buRIG7hu6MgdMOtbiBk4bulbmcgeOG6pXUiLCB4ID0gIkRlZmF1bHQiLCB5ID0gIlPhu5EgbMaw4bujbmciKSArDQogIHRoZW1lX21pbmltYWwoKSArDQogIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUpKQ0KYGBgDQoNCioqROG7sWEgdsOgbyBi4bqjbmcgdOG6p24gc+G7kSB2w6AgdOG6p24gc3XhuqV0IGPhu6dhIGJp4bq/biBkZWZhdWx0LCB0YSBjw7MgY8OhYyBuaOG6rW4gxJHhu4tuaCBzYXU6KioNCg0KLSBOaMOzbSBraMO0bmcgY8OzIG7hu6MgdMOtbiBk4bulbmcgeOG6pXUgKG5vKSBjaGnhur9tIHPhu5EgbMaw4bujbmcgbOG7m24gbmjhuqV0IHbhu5tpIDQsNDQ1IG5nxrDhu51pLCB0xrDGoW5nIOG7qW5nIGtob+G6o25nIDk4LjQlIHThu5VuZyBz4buRIG3huqt1LiDEkMOieSBsw6AgbmjDs20gY2hp4bq/bSDGsHUgdGjhur8gZ+G6p24gbmjGsCB0dXnhu4d0IMSR4buRaS4NCg0KLSBOaMOzbSBjw7MgbuG7oyB0w61uIGThu6VuZyB44bqldSAoeWVzKSBjaOG7iSBjw7MgNzYgbmfGsOG7nWksIGNoaeG6v20gdOG7tyBs4buHIHLhuqV0IG5o4buPLCBraG/huqNuZyAxLjclLg0KDQoqKkvhur90IGx14bqtbjoqKg0KDQpQaMOibiBi4buRIG7hu6MgdMOtbiBk4bulbmcgeOG6pXUgdHJvbmcgdOG6rXAgZOG7ryBsaeG7h3UgY2hvIHRo4bqleSBwaOG6p24gbOG7m24ga2jDoWNoIGjDoG5nIGtow7RuZyBjw7MgbOG7i2NoIHPhu60gbuG7oyB44bqldS4gxJBp4buBdSBuw6B5IHBo4bqjbiDDoW5oIGNo4bqldCBsxrDhu6NuZyB0w61uIGThu6VuZyB0xrDGoW5nIMSR4buRaSB04buRdCBj4bunYSBuaMOzbSBraMOhY2ggaMOgbmcgxJHGsOG7o2Mga2jhuqNvIHPDoXQuDQoNCiMgKipLSeG7gk0gxJDhu4pOSCBDSEkgQsOMTkggUEjGr8agTkcqKg0KDQpLaeG7g20gxJHhu4tuaCBDaGkgYsOsbmggcGjGsMahbmcgKENoaS1zcXVhcmVkIHRlc3QpIMSRxrDhu6NjIHPhu60gZOG7pW5nIMSR4buDIGtp4buDbSB0cmEgeGVtIGPDsyBt4buRaSBsacOqbiBo4buHIHRo4buRbmcga8OqIGdp4buvYSBoYWkgYmnhur9uIHBow6JuIGxv4bqhaSAoY2F0ZWdvcmljYWwgdmFyaWFibGVzKSBoYXkga2jDtG5nLiBUcm9uZyBi4buRaSBj4bqjbmggbsOgeSwgdGEga2nhu4NtIHRyYSB4ZW0gY8OhYyB54bq/dSB04buRIG5oxrAgaG91c2luZywgbWFyaXRhbCwgZWR1Y2F0aW9uLCBkZWZhdWx0LCB2LnYuIGPDsyDhuqNuaCBoxrDhu59uZyDEkeG6v24gcXV54bq/dCDEkeG7i25oIHZheSB0acOqdSBkw7luZyAobG9hbikgaGF5IGtow7RuZy4NCg0KIyMgKipLaeG7g20gxJHhu4tuaCBnaeG7r2EgbG9hbiB2w6AgaG91c2luZyoqDQoNCioqR2nhuqMgdGh1eeG6v3Qga2nhu4NtIMSR4buLbmgqKg0KDQotIEgwOiBLaMO0bmcgY8OzIG3hu5FpIGxpw6puIGjhu4cgZ2nhu69hIGxvYW4gdsOgIGhvdXNpbmcNCi0gSDE6IEPDsyBt4buRaSBsacOqbiBo4buHIGdp4buvYSBsb2FuIHbDoCBob3VzaW5nDQoNCmBgYHtyfQ0KIyBUaOG7sWMgaGnhu4duIGtp4buDbSDEkeG7i25oIENoaSBiw6xuaCBwaMawxqFuZw0KdGFibGVfbG9hbl9ob3VzaW5nIDwtIHRhYmxlKGRhdGExJGxvYW4sIGRhdGExJGhvdXNpbmcpDQpjaGlzcV9ob3VzaW5nIDwtIGNoaXNxLnRlc3QodGFibGVfbG9hbl9ob3VzaW5nKQ0KY2hpc3FfaG91c2luZw0KYGBgDQoNCiMjICoqS2nhu4NtIMSR4buLbmggZ2nhu69hIGxvYW4gdsOgIGpvYioqDQoNCioqR2nhuqMgdGh1eeG6v3Qga2nhu4NtIMSR4buLbmgqKg0KDQotIEgwOiBLaMO0bmcgY8OzIG3hu5FpIGxpw6puIGjhu4cgZ2nhu69hIG5naOG7gSBuZ2hp4buHcCB2w6Aga2jhuqMgbsSDbmcgdmF5IHRpw6p1IGTDuW5nLg0KLSBIMTogQ8OzIG3hu5FpIGxpw6puIGjhu4cgZ2nhu69hIG5naOG7gSBuZ2hp4buHcCB2w6Aga2jhuqMgbsSDbmcgdmF5IHRpw6p1IGTDuW5nLg0KDQpgYGB7cn0NCiMgVGjhu7FjIGhp4buHbiBraeG7g20gxJHhu4tuaCBDaGkgYsOsbmggcGjGsMahbmcNCnRhYmxlX2xvYW5fam9iIDwtIHRhYmxlKGRhdGExJGxvYW4sIGRhdGExJGpvYikNCmNoaXNxX2pvYiA8LSBjaGlzcS50ZXN0KHRhYmxlX2xvYW5fam9iKQ0KY2hpc3Ffam9iDQpgYGANCg0KDQojIyAqKktp4buDbSDEkeG7i25oIGdp4buvYSBsb2FuIHbDoCBlZHVjYXRpb24qKg0KDQoqKkdp4bqjIHRodXnhur90IGtp4buDbSDEkeG7i25oKioNCg0KLSBIMDogS2jDtG5nIGPDsyBt4buRaSBsacOqbiBo4buHIGdp4buvYSB0csOsbmggxJHhu5kgaOG7jWMgduG6pW4gdsOgIHF1eeG6v3QgxJHhu4tuaCB2YXkgdGnDqnUgZMO5bmcuDQotIEgxOiBDw7MgbeG7kWkgbGnDqm4gaOG7hyBnaeG7r2EgdHLDrG5oIMSR4buZIGjhu41jIHbhuqVuIHbDoCBxdXnhur90IMSR4buLbmggdmF5IHRpw6p1IGTDuW5nLg0KDQpgYGB7cn0NCnRhYmxlX2xvYW5fZWR1IDwtIHRhYmxlKGRhdGExJGxvYW4sIGRhdGExJGVkdWNhdGlvbikNCmNoaXNxX2VkdSA8LSBjaGlzcS50ZXN0KHRhYmxlX2xvYW5fZWR1KQ0KY2hpc3FfZWR1DQpgYGANCg0KIyMgKipLaeG7g20gxJHhu4tuaCBnaeG7r2EgbG9hbiB2w6AgZGVmYXVsdCoqDQoNCioqR2nhuqMgdGh1eeG6v3Qga2nhu4NtIMSR4buLbmgqKg0KDQotIEgwOiBLaMO0bmcgY8OzIG3hu5FpIGxpw6puIGjhu4cgZ2nhu69hIHTDrG5oIHRy4bqhbmcgbuG7oyBxdcOhIGjhuqFuIHbDoCB2aeG7h2MgdmF5IHRpw6p1IGTDuW5nLg0KLSBIMTogQ8OzIG3hu5FpIGxpw6puIGjhu4cgZ2nhu69hIHTDrG5oIHRy4bqhbmcgbuG7oyBxdcOhIGjhuqFuIHbDoCB2aeG7h2MgdmF5IHRpw6p1IGTDuW5nLg0KDQpgYGB7cn0NCnRhYmxlX2xvYW5fZGVmYXVsdCA8LSB0YWJsZShkYXRhMSRsb2FuLCBkYXRhMSRkZWZhdWx0KQ0KY2hpc3FfZWR1IDwtIGNoaXNxLnRlc3QodGFibGVfbG9hbl9kZWZhdWx0KQ0KY2hpc3FfZWR1DQpgYGANCg0KIyMgKipLaeG7g20gxJHhu4tuaCBnaeG7r2EgbG9hbiB2w6AgbWFyaXRhbCoqDQoNCioqR2nhuqMgdGh1eeG6v3Qga2nhu4NtIMSR4buLbmgqKg0KDQotIEgwOiBLaMO0bmcgY8OzIG3hu5FpIGxpw6puIGjhu4cgZ2nhu69hIHTDrG5oIHRy4bqhbmcgaMO0biBuaMOibiB2w6Agdmnhu4djIHZheSB0acOqdSBkw7luZy4NCi0gSDE6IEPDsyBt4buRaSBsacOqbiBo4buHIGdp4buvYSB0w6xuaCB0cuG6oW5nIGjDtG4gbmjDom4gdsOgIHZp4buHYyB2YXkgdGnDqnUgZMO5bmcuDQoNCmBgYHtyfQ0KdGFibGVfbG9hbl9tYXJpdGFsIDwtIHRhYmxlKGRhdGExJGxvYW4sIGRhdGExJG1hcml0YWwpDQpjaGlzcV9lZHUgPC0gY2hpc3EudGVzdCh0YWJsZV9sb2FuX21hcml0YWwpDQpjaGlzcV9lZHUNCmBgYA0KDQpUaMO0bmcgcXVhIGvhur90IHF14bqjIGtp4buDbSDEkeG7i25oIGNo4buJIGPDsyAxIGJp4bq/biBgaG91c2luZ2AgbMOgIGtow7RuZyBjw7MgbeG7kWkgbGnDqm4gaOG7hyB24bubaSBiaeG6v24gYGxvYW5gLCA0IGJp4bq/biDEkeG7mWMgbOG6rXAgY8OybiBs4bqhaSDEkeG7gXUgY8OzIG3hu5FpIGxpw6puIGjhu4cgduG7m2kgYmnhur9uIHBo4bulIHRodeG7mWMgbMOgIGBsb2FuYC4gVGnhur9wIHRoZW8gxJHDsyB0YSBz4bq9IHBow6JuIHTDrWNoIHPDonUgduG7gSB0w6xuaCB0cuG6oW5nIHZheSB0acOqdSBkw7luZyB24bubaSA0IGJp4bq/biDEkeG7mWMgbOG6rXAgbMOgOiBqb2IsIGVkdWNhdGlvbiwgbWFyaXRhbCB2w6AgZGVmYXVsdCB0aMO0bmcgcXVhIHJlbGF0aXZlIHJpc2sgdsOgIG9kZHJhdGlvLg0KDQojICoqUEjDgk4gVMONQ0ggSMOATkggVkkgVkFZIFRJw4pVIETDmU5HIFbhu5pJIFJFTEFUSVZFIFJJU0sgVsOAIE9ERCBSQVRJTyoqDQoNClNhdSBraGkga2nhu4NtIMSR4buLbmggQ2hpIGLDrG5oIHBoxrDGoW5nLCA0IGJp4bq/biDEkeG7i25oIHTDrW5oIGfhu5NtOiBgZWR1Y2F0aW9uYCwgYGRlZmF1bHRgLCBgbWFyaXRhbGAsIHbDoCBgam9iYCDEkcaw4bujYyB4w6FjIMSR4buLbmggbMOgIGPDsyBt4buRaSBsacOqbiBo4buHIHRo4buRbmcga8OqIHbhu5tpIGJp4bq/biBwaOG7pSB0aHXhu5ljIGBsb2FuYC4gQ2jDum5nIHRhIHRp4bq/cCB04bulYyDEkeG6t3QgcmEgKipjw6FjIGPDonUgaOG7j2kgbmdoacOqbiBj4bupdSBj4bulIHRo4buDKiogdsOgIHBow6JuIHTDrWNoIHPDonUgaMahbiBi4bqxbmcgKipSZWxhdGl2ZSBSaXNrKiogdsOgICoqT2RkcyBSYXRpbyoqLg0KDQojIyAqKkVkdWNhdGlvbiDigJMgVHLDrG5oIMSR4buZIGjhu41jIHbhuqVuKioNCg0KTGnhu4d1IGtow6FjaCBow6BuZyBjw7MgdHLDrG5oIMSR4buZIGjhu41jIHbhuqVuIGNhbyAodGVydGlhcnkpIGPDsyB4dSBoxrDhu5tuZyB2YXkgdGnDqnUgZMO5bmcgY2FvIGjGoW4gc28gduG7m2kgbmjhu69uZyBuZ8aw4budaSBraMO0bmcgY8OzIGjhu41jIHbhuqVuIGNhbyBob+G6t2Mga2jDtG5nIHLDtSBo4buNYyB24bqlbiBraMO0bmc/DQoNCg0KIyMjICoqR+G7mXAgZOG7ryBsaeG7h3UgdsOgIHThuqFvIGLhuqNuZyB04bqnbiBz4buRKioNCg0KYGBge3J9DQpkYXRhMSRlZHVfZ3JvdXBlZCA8LSBpZmVsc2UoZGF0YTEkZWR1Y2F0aW9uID09ICJ0ZXJ0aWFyeSIsICJoaWdoIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGRhdGExJGVkdWNhdGlvbiAlaW4lIGMoInByaW1hcnkiLCAic2Vjb25kYXJ5IiksICJsb3ciLCBOQSkpDQp0YWJsZV9lZHVfZ3JvdXBlZCA8LSB0YWJsZShkYXRhMSRsb2FuLCBkYXRhMSRlZHVfZ3JvdXBlZCkNCnRhYmxlX2VkdV9ncm91cGVkDQpkYXRhMSA8LSBuYS5vbWl0KGRhdGExKQ0KYGBgDQoNCg0KIyMjICoqVuG6vSDEkeG7kyB0aOG7iyBwaMOibiB0w61jaCoqDQpgYGB7cn0NCmRmX2VkdV9ncm91cGVkIDwtIGFzLmRhdGEuZnJhbWUodGFibGVfZWR1X2dyb3VwZWQpDQpjb2xuYW1lcyhkZl9lZHVfZ3JvdXBlZCkgPC0gYygiTG9hbiIsICJFZHVfR3JvdXBlZCIsICJDb3VudCIpDQoNCmdncGxvdChkZl9lZHVfZ3JvdXBlZCwgYWVzKHggPSBFZHVfR3JvdXBlZCwgeSA9IENvdW50LCBmaWxsID0gTG9hbikpICsNCiAgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIsIHBvc2l0aW9uID0gImRvZGdlIikgKw0KICBsYWJzKA0KICAgIHRpdGxlID0gIlBow6JuIGLhu5EgdmF5IHRpw6p1IGTDuW5nIHRoZW8gdHLDrG5oIMSR4buZIGjhu41jIHbhuqVuIiwNCiAgICB4ID0gIlRyw6xuaCDEkeG7mSBo4buNYyB24bqlbiIsDQogICAgeSA9ICJT4buRIGzGsOG7o25nIiwNCiAgICBmaWxsID0gIlZheSB0acOqdSBkw7luZyINCiAgKSArDQogIHRoZW1lX21pbmltYWwoKSArDQogIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUpKQ0KYGBgDQoNCg0KIyMjICoqVMOtbmggUmVsYXRpdmUgUmlzayB2w6AgT2RkIFJhdGlvKioNCg0KYGBge3J9DQptYXRfZWR1X2dyb3VwZWQgPC0gbWF0cml4KGMoDQogIHN1bShkYXRhMSRsb2FuID09ICJubyIgJiBkYXRhMSRlZHVfZ3JvdXBlZCA9PSAibG93IiksDQogIHN1bShkYXRhMSRsb2FuID09ICJubyIgJiBkYXRhMSRlZHVfZ3JvdXBlZCA9PSAiaGlnaCIpLA0KICBzdW0oZGF0YTEkbG9hbiA9PSAieWVzIiAmIGRhdGExJGVkdV9ncm91cGVkID09ICJsb3ciKSwNCiAgc3VtKGRhdGExJGxvYW4gPT0gInllcyIgJiBkYXRhMSRlZHVfZ3JvdXBlZCA9PSAiaGlnaCIpDQopLA0KYnlyb3cgPSBUUlVFLCBucm93ID0gMiwNCmRpbW5hbWVzID0gbGlzdChMb2FuID0gYygibm8iLCAieWVzIiksIEVkdWNhdGlvbiA9IGMoImxvdyIsICJoaWdoIikpKSAgDQoNCm1hdF9lZHVfZ3JvdXBlZA0KDQpycl9lZHVfZ3JvdXBlZCA8LSByaXNrcmF0aW8obWF0X2VkdV9ncm91cGVkKQ0KcnJfZWR1X2dyb3VwZWQkbWVhc3VyZQ0KDQpvcl9lZHVfZ3JvdXBlZCA8LSBvZGRzcmF0aW8obWF0X2VkdV9ncm91cGVkKQ0Kb3JfZWR1X2dyb3VwZWQkbWVhc3VyZQ0KDQpgYGANCg0KVHJvbmcgcGjDom4gdMOtY2ggbeG7kWkgcXVhbiBo4buHIGdp4buvYSB0csOsbmggxJHhu5kgaOG7jWMgduG6pW4gdsOgIGjDoG5oIHZpIHZheSB0acOqdSBkw7luZywgdMOhYyBnaeG6oyBwaMOibiBjaGlhIGtow6FjaCBow6BuZyB0aMOgbmggaGFpIG5ow7NtOg0KDQotIE5ow7NtIGPDsyBo4buNYyB24bqlbiBjYW86IGtow6FjaCBow6BuZyBjw7MgdHLDrG5oIMSR4buZIHRlcnRpYXJ5DQoNCi0gTmjDs20gaOG7jWMgduG6pW4gdGjhuqVwOiBiYW8gZ+G7k20gdHLDrG5oIMSR4buZIHByaW1hcnkgdsOgIHNlY29uZGFyeQ0KDQpTYXUga2hpIHTDrW5oIHRvw6FuIFJlbGF0aXZlIFJpc2sgKFJSKSB2w6AgT2RkcyBSYXRpbyAoT1IpIMSR4buDIHNvIHPDoW5oIHjDoWMgc3XhuqV0IHbDoCBraOG6oyBuxINuZyB2YXkgdGnDqnUgZMO5bmcgZ2nhu69hIGhhaSBuaMOzbSwga+G6v3QgcXXhuqMgY2hvIHRo4bqleSBj4bqjIFJSIHbDoCBPUiDEkeG7gXUgbmjhu48gaMahbiAxIMSRaeG7gXUgxJHDsyBjw7MgbmdoxKlhIGzDoCBraMOhY2ggaMOgbmcgY8OzIGjhu41jIHbhuqVuIGNhbyBjw7MgeHUgaMaw4bubbmcgdmF5IHRpw6p1IGTDuW5nIMOtdCBoxqFuIG5ow7NtIGjhu41jIHbhuqVuIHRo4bqlcC4NCg0KQ+G7pSB0aOG7gzoNCg0KLSBOZ3V5IGPGoSB0xrDGoW5nIMSR4buRaSAoUlIpIGzDoCAwLjc4OTU0ODMsIHThu6ljIGzDoCB4w6FjIHN14bqldCB2YXkgdGnDqnUgZMO5bmcgY+G7p2EgbmjDs20gaOG7jWMgduG6pW4gY2FvIGNo4buJIGLhurFuZyA3OC45NSUgc28gduG7m2kgbmjDs20gaOG7jWMgduG6pW4gdGjhuqVwLg0KLSBU4bu3IHPhu5EgY2jDqm5oIChPUikgbMOgIDAuNzE4MTcyNSwgbmdoxKlhIGzDoCBvZGRzIHZheSB0acOqdSBkw7luZyBj4bunYSBuaMOzbSBo4buNYyB24bqlbiBjYW8gY2jhu4kgYuG6sW5nIDcxLjgyJSBzbyB24bubaSBuaMOzbSBo4buNYyB24bqlbiB0aOG6pXAuDQoNCg0KDQojIyAqKkRlZmF1bHQg4oCTIE7hu6MgdMOtbiBk4bulbmcgcXXDoSBo4bqhbioqDQoNCiMjIyAqKkfhu5lwIGThu68gbGnhu4d1IHbDoCB04bqhbyBi4bqjbmcgdOG6p24gc+G7kSoqDQpgYGB7cn0NCnRhYmxlX2RlZmF1bHQgPC0gdGFibGUoZGF0YTEkbG9hbiwgZGF0YTEkZGVmYXVsdCkNCnRhYmxlX2RlZmF1bHQNCmBgYA0KDQojIyMgKipW4bq9IMSR4buTIHRo4buLIHBow6JuIHTDrWNoKioNCmBgYHtyfQ0KZGZfZGVmYXVsdCA8LSBhcy5kYXRhLmZyYW1lKHRhYmxlX2RlZmF1bHQpDQpjb2xuYW1lcyhkZl9kZWZhdWx0KSA8LSBjKCJMb2FuIiwgIkRlZmF1bHQiLCAiQ291bnQiKQ0KDQpnZ3Bsb3QoZGZfZGVmYXVsdCwgYWVzKHggPSBEZWZhdWx0LCB5ID0gQ291bnQsIGZpbGwgPSBMb2FuKSkgKw0KICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IiwgcG9zaXRpb24gPSAiZG9kZ2UiKSArDQogIGxhYnMoDQogICAgdGl0bGUgPSAiUGjDom4gYuG7kSB2YXkgdGnDqnUgZMO5bmcgdGhlbyB0cuG6oW5nIHRow6FpIG7hu6MgdMOtbiBk4bulbmciLA0KICAgIHggPSAiTuG7oyB0w61uIGThu6VuZyIsDQogICAgeSA9ICJT4buRIGzGsOG7o25nIiwNCiAgICBmaWxsID0gIlZheSB0acOqdSBkw7luZyINCiAgKSArDQogIHRoZW1lX21pbmltYWwoKSArDQogIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUpKQ0KYGBgDQoNCiMjIyAqKlTDrW5oIFJlbGF0aXZlIFJpc2sgdsOgIE9kZCBSYXRpbyoqDQoNCmBgYHtyfQ0KIyBU4bqhbyBtYSB0cuG6rW4gduG7m2kgbmjDs20gJ3llcycgKHZheSB0acOqdSBkw7luZykgbMOgbSBkw7JuZyB0aOG7qSBuaOG6pXQgPSBuaMOzbSB0aGFtIGNoaeG6v3UNCm1hdF9kZWZhdWx0IDwtIG1hdHJpeChjKA0KICBzdW0oZGF0YTEkbG9hbiA9PSAieWVzIiAmIGRhdGExJGRlZmF1bHQgPT0gInllcyIpLCAgIyBhDQogIHN1bShkYXRhMSRsb2FuID09ICJ5ZXMiICYgZGF0YTEkZGVmYXVsdCA9PSAibm8iKSwgICAjIGINCiAgc3VtKGRhdGExJGxvYW4gPT0gIm5vIiAmIGRhdGExJGRlZmF1bHQgPT0gInllcyIpLCAgICMgYw0KICBzdW0oZGF0YTEkbG9hbiA9PSAibm8iICYgZGF0YTEkZGVmYXVsdCA9PSAibm8iKSAgICAgIyBkDQopLA0KYnlyb3cgPSBUUlVFLCBucm93ID0gMiwNCmRpbW5hbWVzID0gbGlzdChMb2FuID0gYygieWVzIiwgIm5vIiksIERlZmF1bHQgPSBjKCJ5ZXMiLCAibm8iKSkpDQoNCm1hdF9kZWZhdWx0DQoNCiMgVMOtbmggUlIgdsOgIE9SIHbhu5tpIG5ow7NtICd5ZXMnIGzDoG0gdGhhbSBjaGnhur91DQpycl9kZWZhdWx0IDwtIHJpc2tyYXRpbyhtYXRfZGVmYXVsdCkNCnJyX2RlZmF1bHQkbWVhc3VyZQ0KDQpvcl9kZWZhdWx0IDwtIG9kZHNyYXRpbyhtYXRfZGVmYXVsdCkNCm9yX2RlZmF1bHQkbWVhc3VyZQ0KDQpgYGANCg0KDQpUcm9uZyBwaMOibiB0w61jaCBuw6B5LCB0w6FjIGdp4bqjIHhlbSB4w6l0IG3hu5FpIGxpw6puIGjhu4cgZ2nhu69hIGjDoG5oIHZpIHZheSB0acOqdSBkw7luZyAobG9hbikgdsOgIHTDrG5oIHRy4bqhbmcgbuG7oyB0w61uIGThu6VuZyBxdcOhIGjhuqFuIChkZWZhdWx0KS4gTmjDs20gY8OzIHZheSB0acOqdSBkw7luZyDEkcaw4bujYyBjaOG7jW4gbMOgbSBuaMOzbSB0aGFtIGNoaeG6v3UsIG5o4bqxbSBzbyBzw6FuaCBuZ3V5IGPGoSB2w6Aga2jhuqMgbsSDbmcgbuG7oyB0w61uIGThu6VuZyDhu58gbmjDs20ga2jDtG5nIHZheS4NCg0KKipL4bq/dCBxdeG6oyBuaMawIHNhdToqKg0KDQotIE5ndXkgY8ahIHTGsMahbmcgxJHhu5FpIChSZWxhdGl2ZSBSaXNrIOKAkyBSUikgY+G7p2EgbmjDs20ga2jDtG5nIHZheSBzbyB24bubaSBuaMOzbSBjw7MgdmF5IGzDoCAxLjAyMjQ1MSDihpIgxJBp4buBdSBuw6B5IGPDsyBuZ2jEqWEgbMOgIHjDoWMgc3XhuqV0IG7hu6MgdMOtbiBk4bulbmcgcXXDoSBo4bqhbiDhu58gbmjDs20ga2jDtG5nIHZheSBjYW8gaMahbiAyLjI1JSBzbyB24bubaSBuaMOzbSBjw7MgdmF5Lg0KDQotIFThu7cgc+G7kSBjaMOqbmggKE9kZHMgUmF0aW8g4oCTIE9SKSBnaeG7r2EgaGFpIG5ow7NtIGzDoCAyLjY4MDYyOCDihpIgRGnhu4VuIGdp4bqjaSBy4bqxbmcga2jhuqMgbsSDbmcgbuG7oyB0w61uIGThu6VuZyBxdcOhIGjhuqFuIChvZGRzKSDhu58gbmjDs20ga2jDtG5nIHZheSBjYW8gZ+G6pXAgMi42OCBs4bqnbiBzbyB24bubaSBuaMOzbSBjw7MgdmF5Lg0KDQoNClTDs20gbOG6oWksIGPhuqMgUlIgdsOgIE9SIMSR4buBdSBs4bubbiBoxqFuIDEgdsOgIGPDsyDDvSBuZ2jEqWEgdGjhu5FuZyBrw6osIGNobyB0aOG6pXkgbmjDs20ga2jDoWNoIGjDoG5nIGtow7RuZyB2YXkgdGnDqnUgZMO5bmcgY8OzIG5ndXkgY8ahIHbDoCBraOG6oyBuxINuZyBu4bujIHTDrW4gZOG7pW5nIHF1w6EgaOG6oW4gY2FvIGjGoW4gxJHDoW5nIGvhu4Mgc28gduG7m2kgbmjDs20gY8OzIHZheSB0acOqdSBkw7luZy4NCg0KIyMgKipNYXJpdGFsIOKAkyBUw6xuaCB0cuG6oW5nIGjDtG4gbmjDom4qKg0KDQpLaMOhY2ggaMOgbmcgxJHDoyBr4bq/dCBow7RuIGPDsyB4dSBoxrDhu5tuZyB2YXkgdGnDqnUgZMO5bmcga2jDoWMgduG7m2kgbmfGsOG7nWkgY2jGsGEga+G6v3QgaMO0biBraMO0bmc/DQoNCiMjIyAqKkfhu5lwIGThu68gbGnhu4d1IHbDoCB04bqhbyBi4bqjbmcgdOG6p24gc+G7kSoqDQpgYGB7cn0NCmRhdGExJG1hcml0YWxfZ3JvdXBlZCA8LSBpZmVsc2UoZGF0YTEkbWFyaXRhbCA9PSAibWFycmllZCIsICJtYXJyaWVkIiwgIm90aGVycyIpDQp0YWJsZV9tYXJpdGFsIDwtIHRhYmxlKGRhdGExJGxvYW4sIGRhdGExJG1hcml0YWxfZ3JvdXBlZCkNCnRhYmxlX21hcml0YWwNCmBgYA0KDQoNCiMjIyAqKlbhur0gxJHhu5MgdGjhu4sgcGjDom4gdMOtY2gqKg0KYGBge3J9DQpkZl9tYXJpdGFsIDwtIGFzLmRhdGEuZnJhbWUodGFibGVfbWFyaXRhbCkNCmNvbG5hbWVzKGRmX21hcml0YWwpIDwtIGMoIkxvYW4iLCAiTWFyaXRhbCIsICJDb3VudCIpDQoNCmdncGxvdChkZl9tYXJpdGFsLCBhZXMoeCA9IE1hcml0YWwsIHkgPSBDb3VudCwgZmlsbCA9IExvYW4pKSArDQogIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiLCBwb3NpdGlvbiA9ICJkb2RnZSIpICsNCiAgbGFicygNCiAgICB0aXRsZSA9ICJQaMOibiBi4buRIHZheSB0acOqdSBkw7luZyB0aGVvIHTDrG5oIHRy4bqhbmcgaMO0biBuaMOibiIsDQogICAgeCA9ICJUw6xuaCB0cuG6oW5nIGjDtG4gbmjDom4iLA0KICAgIHkgPSAiU+G7kSBsxrDhu6NuZyIsDQogICAgZmlsbCA9ICJWYXkgdGnDqnUgZMO5bmciDQogICkgKw0KICB0aGVtZV9taW5pbWFsKCkgKw0KICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KSkNCmBgYA0KDQoNCiMjIyAqKlTDrW5oIFJlbGF0aXZlIFJpc2sgdsOgIE9kZCBSYXRpbyoqDQoNCmBgYHtyfQ0KbWF0X21hcml0YWwgPC0gbWF0cml4KGMoDQogIHN1bShkYXRhMSRsb2FuID09ICJ5ZXMiICYgZGF0YTEkbWFyaXRhbF9ncm91cGVkID09ICJtYXJyaWVkIiksDQogIHN1bShkYXRhMSRsb2FuID09ICJ5ZXMiICYgZGF0YTEkbWFyaXRhbF9ncm91cGVkID09ICJvdGhlcnMiKSwNCiAgc3VtKGRhdGExJGxvYW4gPT0gIm5vIiAmIGRhdGExJG1hcml0YWxfZ3JvdXBlZCA9PSAibWFycmllZCIpLA0KICBzdW0oZGF0YTEkbG9hbiA9PSAibm8iICYgZGF0YTEkbWFyaXRhbF9ncm91cGVkID09ICJvdGhlcnMiKQ0KKSwNCmJ5cm93ID0gVFJVRSwgbnJvdyA9IDIsDQpkaW1uYW1lcyA9IGxpc3QoTG9hbiA9IGMoInllcyIsICJubyIpLCBNYXJpdGFsID0gYygibWFycmllZCIsICJvdGhlcnMiKSkpDQoNCm1hdF9tYXJpdGFsDQoNCnJyX21hcml0YWwgPC0gcmlza3JhdGlvKG1hdF9tYXJpdGFsKQ0KcnJfbWFyaXRhbCRtZWFzdXJlDQoNCm9yX21hcml0YWwgPC0gb2Rkc3JhdGlvKG1hdF9tYXJpdGFsKQ0Kb3JfbWFyaXRhbCRtZWFzdXJlDQoNCmBgYA0KDQpUcm9uZyBwaMOibiB0w61jaCBuw6B5LCBraMOhY2ggaMOgbmcgxJHGsOG7o2MgY2hpYSB0aMOgbmggaGFpIG5ow7NtOiDEkcOjIGvhur90IGjDtG4gKG1hcnJpZWQpIHbDoCBraMOhYyAob3RoZXJzIOKAkyBiYW8gZ+G7k20gxJHhu5ljIHRow6JuLCBseSBow7Ru4oCmKS4gTmjDs20ga2jDoWNoIGjDoG5nIGPDsyB2YXkgdGnDqnUgZMO5bmcgKExvYW4gPSB5ZXMpIMSRxrDhu6NjIGNo4buNbiBsw6BtIG5ow7NtIHRoYW0gY2hp4bq/dS4NCg0KKipL4bq/dCBxdeG6oyBjaG8gdGjhuqV5KiogDQoNCi0gTmd1eSBjxqEgdMawxqFuZyDEkeG7kWkgKFJSKSBj4bunYSBuaMOzbSBraMO0bmcgdmF5IHRpw6p1IGTDuW5nIHNvIHbhu5tpIG5ow7NtIHZheSB0acOqdSBkw7luZyBsw6AgMS4xMjYsIG5naMSpYSBsw6AgeMOhYyBzdeG6pXQga2jDtG5nIHZheSB0acOqdSBkw7luZyBj4bunYSBuaMOzbSBjaMawYSBr4bq/dCBow7RuIGNhbyBoxqFuIDEyLjYlIHNvIHbhu5tpIG5ow7NtIMSRw6Mga+G6v3QgaMO0bi4gS2hv4bqjbmcgdGluIGPhuq15IDk1JSBsw6AgWzEuMDA4IDsgMS4yNThdLCBjaG8gdGjhuqV5IHPhu7Ega2jDoWMgYmnhu4d0IGPDsyDDvSBuZ2jEqWEgdGjhu5FuZyBrw6ouDQoNCi0gVMawxqFuZyB04buxLCB04bu3IHPhu5EgY2jDqm5oIChPUikgbMOgIDEuMjA1NiwgdOG7qWMgbMOgIG9kZHMga2jDtG5nIHZheSB0acOqdSBkw7luZyBj4bunYSBuaMOzbSBjaMawYSBr4bq/dCBow7RuIGNhbyBoxqFuIGtob+G6o25nIDIwLjU2JSBzbyB24bubaSBuaMOzbSDEkcOjIGvhur90IGjDtG4uIEtob+G6o25nIHRpbiBj4bqteSA5NSUgbMOgIFsxLjAxNyA7IDEuNDMyXSwgdGnhur9wIHThu6VjIGto4bqzbmcgxJHhu4tuaCBr4bq/dCBxdeG6oyBjw7Mgw70gbmdoxKlhIHRo4buRbmcga8OqLg0KDQpOaMawIHbhuq15LCBraMOhY2ggaMOgbmcgxJHDoyBr4bq/dCBow7RuIGPDsyB4dSBoxrDhu5tuZyB2YXkgdGnDqnUgZMO5bmcgbmhp4buBdSBoxqFuIHNvIHbhu5tpIG5ow7NtIGNoxrBhIGvhur90IGjDtG4uDQoNCiMjICoqSm9iIOKAkyBOZ2jhu4EgbmdoaeG7h3AqKg0KDQpMaeG7h3UgbmjDs20gbmfGsOG7nWkgdGjhuqV0IG5naGnhu4dwIGPDsyB4dSBoxrDhu5tuZyB2YXkgdGnDqnUgZMO5bmcga2jDoWMgYmnhu4d0IHNvIHbhu5tpIGPDoWMgbmjDs20gbmdo4buBIGPDsm4gbOG6oWkga2jDtG5nPw0KDQojIyMgKipH4buZcCBk4buvIGxp4buHdSB2w6AgdOG6oW8gYuG6o25nIHThuqduIHPhu5EqKg0KYGBge3J9DQpkYXRhMSRqb2JfZ3JvdXBlZCA8LSBpZmVsc2UoZGF0YTEkam9iID09ICJ1bmVtcGxveWVkIiwgInVuZW1wbG95ZWQiLCAib3RoZXJzIikNCnRhYmxlX2pvYiA8LSB0YWJsZShkYXRhMSRsb2FuLCBkYXRhMSRqb2JfZ3JvdXBlZCkNCnRhYmxlX2pvYg0KYGBgDQoNCg0KIyMjICoqVuG6vSDEkeG7kyB0aOG7iyBwaMOibiB0w61jaCoqDQoNCmBgYHtyfQ0KZGZfam9iIDwtIGFzLmRhdGEuZnJhbWUodGFibGVfam9iKQ0KY29sbmFtZXMoZGZfam9iKSA8LSBjKCJMb2FuIiwgIkpvYl9Hcm91cCIsICJDb3VudCIpDQoNCmdncGxvdChkZl9qb2IsIGFlcyh4ID0gSm9iX0dyb3VwLCB5ID0gQ291bnQsIGZpbGwgPSBMb2FuKSkgKw0KICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IiwgcG9zaXRpb24gPSAiZG9kZ2UiKSArDQogIGxhYnMoDQogICAgdGl0bGUgPSAiUGjDom4gYuG7kSB2YXkgdGnDqnUgZMO5bmcgdGhlbyBuZ2jhu4EgbmdoaeG7h3AgKHRo4bqldCBuZ2hp4buHcCB2cyBjw7JuIGzhuqFpKSIsDQogICAgeCA9ICJOaMOzbSBuZ2jhu4EgbmdoaeG7h3AiLA0KICAgIHkgPSAiU+G7kSBsxrDhu6NuZyIsDQogICAgZmlsbCA9ICJWYXkgdGnDqnUgZMO5bmciDQogICkgKw0KICB0aGVtZV9taW5pbWFsKCkgKw0KICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KSkNCmBgYA0KDQoNCg0KIyMjICoqVMOtbmggUmVsYXRpdmUgUmlzayB2w6AgT2RkIFJhdGlvKioNCg0KYGBge3J9DQptYXRfam9iIDwtIG1hdHJpeChjKA0KICBzdW0oZGF0YTEkbG9hbiA9PSAieWVzIiAmIGRhdGExJGpvYl9ncm91cGVkID09ICJ1bmVtcGxveWVkIiksDQogIHN1bShkYXRhMSRsb2FuID09ICJubyIgJiBkYXRhMSRqb2JfZ3JvdXBlZCA9PSAidW5lbXBsb3llZCIpLA0KICBzdW0oZGF0YTEkbG9hbiA9PSAieWVzIiAmIGRhdGExJGpvYl9ncm91cGVkID09ICJvdGhlcnMiKSwNCiAgc3VtKGRhdGExJGxvYW4gPT0gIm5vIiAmIGRhdGExJGpvYl9ncm91cGVkID09ICJvdGhlcnMiKQ0KKSwNCmJ5cm93ID0gVFJVRSwgbnJvdyA9IDIsDQpkaW1uYW1lcyA9IGxpc3QoTG9hbiA9IGMoInllcyIsICJubyIpLCBKb2IgPSBjKCJ1bmVtcGxveWVkIiwgIm90aGVycyIpKSkNCg0KbWF0X2pvYg0KDQpycl9qb2IgPC0gcmlza3JhdGlvKG1hdF9qb2IpDQpycl9qb2IkbWVhc3VyZQ0KDQpvcl9qb2IgPC0gb2Rkc3JhdGlvKG1hdF9qb2IpDQpvcl9qb2IkbWVhc3VyZQ0KYGBgDQoNCg0KVHJvbmcgcGjDom4gdMOtY2ggbsOgeSwga2jDoWNoIGjDoG5nIMSRxrDhu6NjIGNoaWEgdGjDoG5oIGhhaSBuaMOzbSBuZ2jhu4EgbmdoaeG7h3A6IHRo4bqldCBuZ2hp4buHcCAodW5lbXBsb3llZCkgdsOgIGPDoWMgbmjDs20gbmdo4buBIGPDsm4gbOG6oWkgKG90aGVycykuIE5ow7NtIGtow6FjaCBow6BuZyBjw7MgdmF5IHRpw6p1IGTDuW5nIChMb2FuID0geWVzKSDEkcaw4bujYyBjaOG7jW4gbMOgbSBuaMOzbSB0aGFtIGNoaeG6v3UuDQoNCioqS+G6v3QgcXXhuqMgY2hvIHRo4bqleSoqDQoNCi0gTmd1eSBjxqEgdMawxqFuZyDEkeG7kWkgKFJSKSBsw6AgMC45MzcyLCBuZ2jEqWEgbMOgIHjDoWMgc3XhuqV0IGtow7RuZyB2YXkgdGnDqnUgZMO5bmcgY+G7p2EgbmjDs20gY8OybiBs4bqhaSBjaOG7iSBi4bqxbmcgOTMuNzIlIHNvIHbhu5tpIG5ow7NtIHRo4bqldCBuZ2hp4buHcC4gS2hv4bqjbmcgdGluIGPhuq15IDk1JSBsw6AgWzAuODgyMSA7IDAuOTk1OV0sIGNobyB0aOG6pXkgc+G7sSBraMOhYyBiaeG7h3QgY8OzIMO9IG5naMSpYSB0aOG7kW5nIGvDqi4NCg0KLSBUcm9uZyBraGkgxJHDsywgdOG7tyBz4buRIGNow6puaCAoT1IpIGzDoCAwLjYxMzEsIHThu6ljIGzDoCBvZGRzIGtow7RuZyB2YXkgdGnDqnUgZMO5bmcgY+G7p2EgbmjDs20gbmdo4buBIG5naGnhu4dwIGPDsm4gbOG6oWkgdGjhuqVwIGjGoW4ga2hv4bqjbmcgMzguNyUgc28gduG7m2kgbmjDs20gdGjhuqV0IG5naGnhu4dwLiBUdXkgbmhpw6puLCBraG/huqNuZyB0aW4gY+G6rXkgOTUlIGzDoCBbMC4zMjY0IDsgMS4wNTUwXSwgY8OzIGNo4bupYSAxLCBuw6puIGvhur90IHF14bqjIG7DoHkgY2jGsGEgxJHhu6cgYuG6sW5nIGNo4bupbmcgxJHhu4Mga+G6v3QgbHXhuq1uIGPDsyBz4buxIGtow6FjIGJp4buHdCB0aOG7kW5nIGvDqiDhu58gbeG7qWMgw70gbmdoxKlhIDUlLg0KDQpOaMawIHbhuq15LCBjw7MgdGjhu4Mga+G6v3QgbHXhuq1uIHLhurFuZyBuaMOzbSBraMOhY2ggaMOgbmcgdGjhuqV0IG5naGnhu4dwIGPDsyB4dSBoxrDhu5tuZyBraMO0bmcgdmF5IHRpw6p1IGTDuW5nIGNhbyBoxqFuIHNvIHbhu5tpIGPDoWMgbmjDs20gbmdo4buBIGPDsm4gbOG6oWksIHbDoCBz4buxIGtow6FjIGJp4buHdCBuw6B5IGPDsyDDvSBuZ2jEqWEgdGjhu5FuZyBrw6oga2hpIHjDqXQgdGhlbyBSUiwgbmjGsG5nIGNoxrBhIHLDtSByw6BuZyB0aGVvIE9SLg0KDQoNCi0tLQ0KDQojICoqSOG7kkkgUVVZIExPR0lTVElDKioNCg0KIyMgKipI4buTaSBxdXkgbG9naXN0aWMgxJHGoW4gYmnhur9uKioNCg0KKipHaeG6oyB0aHV54bq/dCBraeG7g20gxJHhu4tuaCoqDQoNCi0gKipI4oKAKio6IEJp4bq/biBraMO0bmcgY8OzIOG6o25oIGjGsOG7n25nIMSR4bq/biB4w6FjIHN14bqldCB2YXkgdGnDqnUgZMO5bmcuDQotICoqSOKCgSoqOiBCaeG6v24gY8OzIOG6o25oIGjGsOG7n25nIMSR4bq/biB4w6FjIHN14bqldCB2YXkgdGnDqnUgZMO5bmcuDQoNClRyxrDhu5tjIHRpw6puLCB0w6FjIGdp4bqjIHRo4buxYyBoaeG7h24gY8OhYyBtw7QgaMOsbmggaOG7k2kgcXV5IGxvZ2lzdGljIMSRxqFuIGJp4bq/biwgbeG7l2kgbcO0IGjDrG5oIGNo4buJIGJhbyBn4buTbSBt4buZdCBiaeG6v24gZ2nhuqNpIHRow61jaCBuaOG6sW0gcGjDom4gdMOtY2ggcmnDqm5nIGzhursg4bqjbmggaMaw4bufbmcgY+G7p2EgdOG7q25nIHnhur91IHThu5EgxJHhur9uIGto4bqjIG7Eg25nIHZheSB0acOqdSBkw7luZyAoYGxvYW5gKS4NCg0KYGBge3J9DQojIEjhu5NpIHF1eSDEkcahbiBiaeG6v24gduG7m2kgZWR1Y2F0aW9uDQptb2RlbF91bmlfZWR1IDwtIGdsbShsb2FuIH4gZWR1Y2F0aW9uLCBkYXRhID0gZGF0YTEsIGZhbWlseSA9IGJpbm9taWFsKQ0Kc3VtbWFyeShtb2RlbF91bmlfZWR1KQ0KYGBgDQoNCioqUGjGsMahbmcgdHLDrG5oIGxvZ2l0IMaw4bubYyBsxrDhu6NuZyoqDQoNClxbDQpcdGV4dHtsb2dpdH0oUChcdGV4dHtsb2FufSA9IFx0ZXh0e3llc30pKSA9IC0xLjgzICsgMC4zMSBcdGltZXMgXHRleHR7ZWR1Y2F0aW9uc2Vjb25kYXJ5fSAtIDAuMDggXHRpbWVzIFx0ZXh0e2VkdWNhdGlvbnRlcnRpYXJ5fQ0KXF0NCg0KKipEaeG7hW4gZ2nhuqNpIGjhu4cgc+G7kSBjw7Mgw70gbmdoxKlhIHRo4buRbmcga8OqKioNCg0KfCBCaeG6v24gICAgICAgICAgICAgICB8IE5ow7NtIHNvIHPDoW5oICAgICAgfCBI4buHIHPhu5EgKM6yKSB8IHAtdmFsdWUgfCBPZGRzIFJhdGlvIChlXs6yKSB8IERp4buFbiBnaeG6o2kgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCnwtLS0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tfC0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18DQp8IGVkdWNhdGlvbnNlY29uZGFyeSB8IFNvIHbhu5tpIHByaW1hcnkgICAgfCAwLjMxICAgICAgfCAwLjAxMSAgIHwgMS4zNyAgICAgICAgICAgICB8IE5nxrDhu51pIGjhu41jIHRydW5nIGjhu41jIGPDsyBvZGRzIHZheSBjYW8gaMahbiAzNyUgICAgIHwNCnwgZWR1Y2F0aW9udGVydGlhcnkgIHwgU28gduG7m2kgcHJpbWFyeSAgICB8IC0wLjA4ICAgICB8IDAuNTQxICAgfCAwLjkyICAgICAgICAgICAgIHwgS2jDtG5nIGPDsyDDvSBuZ2jEqWEgdGjhu5FuZyBrw6ogICAgICAgICAgICAgICAgICAgICAgICB8DQoNCioqS+G6v3QgbHXhuq1uKioNCg0KQmnhur9uIGBlZHVjYXRpb25zZWNvbmRhcnlgIGPDsyDhuqNuaCBoxrDhu59uZyDEkcOhbmcga+G7gyDEkeG6v24geMOhYyBzdeG6pXQgdmF5IHRpw6p1IGTDuW5nLiBOaOG7r25nIG5nxrDhu51pIGjhu41jIGjhur90IHRydW5nIGjhu41jIGPDsyBvZGRzIHZheSBjYW8gaMahbiAzNyUgc28gduG7m2kgbmfGsOG7nWkgY2jhu4kgaOG7jWMgdGnhu4N1IGjhu41jLiBUcm9uZyBraGkgxJHDsywgbmjDs20gY8OzIHRyw6xuaCDEkeG7mSDEkeG6oWkgaOG7jWMgdHLhu58gbMOqbiAoYHRlcnRpYXJ5YCkga2jDtG5nIGPDsyDhuqNuaCBoxrDhu59uZyDEkcOhbmcga+G7gyDEkeG6v24ga2jhuqMgbsSDbmcgdmF5Lg0KDQoqKk3DtCBow6xuaCBjw7MgZOG6oW5nOioqDQoNClxbDQpcbG9nIFxsZWZ0KCBcZnJhY3tQKGxvYW4gPSB5ZXMpfXsxIC0gUChsb2FuID0geWVzKX0gXHJpZ2h0KSA9IFxiZXRhXzAgKyBcYmV0YV8xIFxjZG90IGVkdWNhdGlvbg0KXF0NCg0KDQojIyAqKkjhu5NpIHF1eSBsb2dpc3RpYyDEkWEgYmnhur9uKioNCg0KU2F1IGtoaSB0aOG7sWMgaGnhu4duIHBow6JuIHTDrWNoIG5ndXkgY8ahIHTGsMahbmcgxJHhu5FpIChSZWxhdGl2ZSBSaXNrKSB2w6AgdOG7tyBz4buRIGNow6puaCAoT2RkcyBSYXRpbykgxJHhu4Mga2jDoW0gcGjDoSBt4buRaSBsacOqbiBo4buHIGdp4buvYSBow6BuaCB2aSB2YXkgdGnDqnUgZMO5bmcgduG7m2kgdOG7q25nIGJp4bq/biDEkeG7mWMgbOG6rXAsIGLGsOG7m2MgdGnhur9wIHRoZW8gbMOgIHjDonkgZOG7sW5nIG3DtCBow6xuaCBo4buTaSBxdXkgbG9naXN0aWMgbmjhurFtIMSRw6FuaCBnacOhIMSR4buTbmcgdGjhu51pIHTDoWMgxJHhu5luZyBj4bunYSBjw6FjIHnhur91IHThu5EgbsOgeSDEkeG6v24ga2jhuqMgbsSDbmcgdmF5IHRpw6p1IGTDuW5nIGPhu6dhIGtow6FjaCBow6BuZy4NCg0KTcO0IGjDrG5oIGjhu5NpIHF1eSBsb2dpc3RpYyBz4butIGThu6VuZyBow6BtIGxpw6puIGvhur90IGxvZ2l0IMSR4buDIG3DtCBow6xuaCBow7NhIGxvZy1vZGRzIGPhu6dhIGjDoG5oIHZpIHZheSB0acOqdSBkw7luZy4gQ+G7pSB0aOG7gywgbcO0IGjDrG5oIGPDsyBk4bqhbmc6DQoNClxbDQpcbG9nXGxlZnQoIFxmcmFje1AobG9hbiA9IHllcyl9ezEgLSBQKGxvYW4gPSB5ZXMpfSBccmlnaHQpID0gXGJldGFfMCArIFxiZXRhXzEgXGNkb3Qgam9iICsgXGJldGFfMiBcY2RvdCBlZHVjYXRpb24gKyBcYmV0YV8zIFxjZG90IG1hcml0YWwgKyBcYmV0YV80IFxjZG90IGRlZmF1bHQNClxdDQoNCioqR2nhuqMgdGh1eeG6v3Qga2nhu4NtIMSR4buLbmgqKg0KDQpW4bubaSB04burbmcgYmnhur9uIMSR4buZYyBs4bqtcCwgdGEgdGjhu7FjIGhp4buHbiBraeG7g20gxJHhu4tuaDoNCg0KLSAkSF8wJDogQmnhur9uIGtow7RuZyBjw7Mg4bqjbmggaMaw4bufbmcgxJHhur9uIHjDoWMgc3XhuqV0IHZheSB0acOqdSBkw7luZyAoJFxiZXRhID0gMCQpDQotICRIXzEkOiBCaeG6v24gY8OzIOG6o25oIGjGsOG7n25nIMSR4bq/biB4w6FjIHN14bqldCB2YXkgdGnDqnUgZMO5bmcgKCRcYmV0YSBcbmUgMCQpDQoNCg0KTeG7qWMgw70gbmdoxKlhIHRo4buRbmcga8OqIMSRxrDhu6NjIHPhu60gZOG7pW5nIGzDoCA1JSAozrEgPSAwLjA1KS4gTuG6v3UgKnAtdmFsdWUqIDwgMC4wNSwgdGEgYsOhYyBi4buPIGdp4bqjIHRodXnhur90IEjigoAuDQoNCmBgYHtyfQ0KIyBI4buTaSBxdXkgbG9naXN0aWMNCm1vZGVsX2xvZ2l0IDwtIGdsbShsb2FuIH4gam9iICsgZWR1Y2F0aW9uICsgbWFyaXRhbCArIGRlZmF1bHQsDQogICAgICAgICAgICAgICAgICAgZGF0YSA9IGRhdGExLA0KICAgICAgICAgICAgICAgICAgIGZhbWlseSA9IGJpbm9taWFsKQ0KDQojIFTDs20gdOG6r3Qga+G6v3QgcXXhuqMNCnN1bW1hcnkobW9kZWxfbG9naXQpDQpgYGANCg0KIyMjICoqUGjDom4gdMOtY2gga+G6v3QgcXXhuqMgbcO0IGjDrG5oIGjhu5NpIHF1eSBsb2dpc3RpYyoqDQoNCk3DtCBow6xuaCBo4buTaSBxdXkgbG9naXN0aWMgxJHGsOG7o2MgeMOieSBk4buxbmcgbmjhurFtIHBow6JuIHTDrWNoIHjDoWMgc3XhuqV0IGtow6FjaCBow6BuZyDEkcSDbmcga8O9IHZheSB0acOqdSBkw7luZyAobG9hbiA9IHllcykgZOG7sWEgdHLDqm4gY8OhYyBiaeG6v24gxJHhu4tuaCB0w61uaDogbmdo4buBIG5naGnhu4dwIChqb2IpLCB0csOsbmggxJHhu5kgaOG7jWMgduG6pW4gKGVkdWNhdGlvbiksIHTDrG5oIHRy4bqhbmcgaMO0biBuaMOibiAobWFyaXRhbCkgdsOgIGzhu4tjaCBz4butIHTDrW4gZOG7pW5nIChkZWZhdWx0KS4gTeG7qWMgw70gbmdoxKlhIMSRxrDhu6NjIHPhu60gZOG7pW5nIGzDoCA1JSAozrEgPSAwLjA1KS4NCg0KDQoqKkLhuqNuZyB04buVbmcgaOG7o3AgY8OhYyBiaeG6v24gY8OzIMO9IG5naMSpYSB0aOG7kW5nIGvDqiAoa8OobSBPZGRzIFJhdGlvKSoqDQoNCnwgQmnhur9uICAgICAgICAgICAgICAgfCBOaMOzbSBzbyBzw6FuaCAgICAgICAgICAgICAgfCBI4buHIHPhu5EgKM6yKSB8IHAtdmFsdWUgIHwgT2RkcyBSYXRpbyAoZV7OsikgfCBEaeG7hW4gZ2nhuqNpIGNoaSB0aeG6v3QgfA0KfC0tLS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLXwtLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS18DQp8IGBqb2JzdHVkZW50YCAgICAgICB8IFNvIHbhu5tpIGBhZG1pbi5gICAgICAgICAgICB8IC0yLjU5ICAgICB8IDAuMDExICAgIHwgMC4wNzUgICAgICAgICAgICB8IFNpbmggdmnDqm4gY8OzIG9kZHMgdmF5IGNo4buJIGLhurFuZyA3LjUlIHNvIHbhu5tpIG5ow7NtIGjDoG5oIGNow61uaCDihpIgcuG6pXQgw610IMSRxINuZyBrw70gdmF5LiB8DQp8IGBqb2J1bmVtcGxveWVkYCAgICB8IFNvIHbhu5tpIGBhZG1pbi5gICAgICAgICAgICB8IC0wLjY5ICAgICB8IDAuMDMwICAgIHwgMC41MCAgICAgICAgICAgICB8IE5nxrDhu51pIHRo4bqldCBuZ2hp4buHcCBjw7Mgb2RkcyB2YXkgYuG6sW5nIG3hu5l0IG7hu61hIG5ow7NtIGjDoG5oIGNow61uaCDihpIga2jhuqMgbsSDbmcgdmF5IHRo4bqlcCBoxqFuLiB8DQp8IGBqb2JlbnRyZXByZW5ldXJgICB8IFNvIHbhu5tpIGBhZG1pbi5gICAgICAgICAgICB8IDAuNDUgICAgICB8IDAuMDQ2ICAgIHwgMS41NyAgICAgICAgICAgICB8IE5nxrDhu51pIHThu7EgZG9hbmggY8OzIG9kZHMgdmF5IGNhbyBoxqFuIDU3JSDihpIgY8OzIHh1IGjGsOG7m25nIHZheSB0acOqdSBkw7luZyBuaGnhu4F1IGjGoW4uIHwNCnwgYGVkdWNhdGlvbnNlY29uZGFyeWAgfCBTbyB24bubaSBgcHJpbWFyeWAgICAgICAgIHwgMC4zMyAgICAgIHwgMC4wMTUgICAgfCAxLjM5ICAgICAgICAgICAgIHwgS2jDoWNoIGjDoG5nIGjhu41jIGjhur90IHRydW5nIGjhu41jIGPDsyBvZGRzIHZheSBjYW8gaMahbiAzOSUgc28gduG7m2kgbmfGsOG7nWkgY2jhu4kgaOG7jWMgdGnhu4N1IGjhu41jLiB8DQp8IGBtYXJpdGFsc2luZ2xlYCAgICB8IFNvIHbhu5tpIGBkaXZvcmNlZGAgICAgICAgICB8IC0wLjMzICAgICB8IDAuMDI1ICAgIHwgMC43MiAgICAgICAgICAgICB8IE5nxrDhu51pIMSR4buZYyB0aMOibiBjw7Mgb2RkcyB2YXkgdGjhuqVwIGjGoW4ga2hv4bqjbmcgMjglIHNvIHbhu5tpIG5nxrDhu51pIMSRw6MgbHkgaMO0bi4gfA0KfCBgZGVmYXVsdHllc2AgICAgICAgfCBTbyB24bubaSBgZGVmYXVsdCA9IG5vYCAgICAgfCAwLjk0ICAgICAgfCA8IDAuMDAxICB8IDIuNTUgICAgICAgICAgICAgfCBOZ8aw4budaSBjw7MgbuG7oyB44bqldSBjw7Mgb2RkcyB2YXkgY2FvIGfhuqVwIDIuNTUgbOG6p24gbmfGsOG7nWkga2jDtG5nIGPDsyBu4bujIHjhuqV1IOKGkiB0w6FjIMSR4buZbmcgbeG6oW5oLiB8DQoNCioqS+G6v3QgcXXhuqMgdOG7qyBtw7QgaMOsbmggbG9naXQgbmjGsCBzYXU6KioNCg0KTcO0IGjDrG5oIGjhu5NpIHF1eSBsb2dpc3RpYyDEkcaw4bujYyBz4butIGThu6VuZyBuaOG6sW0gcGjDom4gdMOtY2gga2jhuqMgbsSDbmcga2jDoWNoIGjDoG5nIMSRxINuZyBrw70gdmF5IHRpw6p1IGTDuW5nIChsb2FuID0geWVzKSBk4buxYSB0csOqbiBjw6FjIMSR4bq3YyDEkWnhu4NtIGPDoSBuaMOibiBuaMawIG5naOG7gSBuZ2hp4buHcCwgdHLDrG5oIMSR4buZIGjhu41jIHbhuqVuLCB0w6xuaCB0cuG6oW5nIGjDtG4gbmjDom4gdsOgIGzhu4tjaCBz4butIHTDrW4gZOG7pW5nLiBN4bupYyDDvSBuZ2jEqWEgxJHGsOG7o2MgeMOpdCBsw6AgNSUgKM6xID0gMC4wNSkuDQoNClBoxrDGoW5nIHRyw6xuaCBsb2dpdCDEkcaw4bujYyDGsOG7m2MgbMaw4bujbmcgbmjGsCBzYXU6DQoNCioqbG9naXQoUChsb2FuID0geWVzKSkgPSAtMS41OSAtIDIuNTnDl2pvYnN0dWRlbnQgLSAwLjY5w5dqb2J1bmVtcGxveWVkICsgMC40NcOXam9iZW50cmVwcmVuZXVyICsgMC4zM8OXZWR1Y2F0aW9uc2Vjb25kYXJ5IC0gMC4zM8OXbWFyaXRhbHNpbmdsZSArIDAuOTTDl2RlZmF1bHR5ZXMqKg0KDQoqKkjhu4cgc+G7kSBjaOG6t24gKEludGVyY2VwdCkqKjogIA0KDQotIEjhu4cgc+G7kSA9ICoqLTEuNTkqKiAgDQotIEtoaSBraMOhY2ggaMOgbmcgdGh14buZYyBuaMOzbSB0aGFtIGNoaeG6v3UgKCpqb2IgPSBhZG1pbi4qLCAqZWR1Y2F0aW9uID0gcHJpbWFyeSosICptYXJpdGFsID0gZGl2b3JjZWQqLCAqZGVmYXVsdCA9IG5vKiksIGxvZyhvZGRzKSB2YXkgdGnDqnUgZMO5bmcgbMOgIC0xLjU5LiAgDQotIE9kZHMgdMawxqFuZyDhu6luZyA9IGBleHAoLTEuNTkpIOKJiCAwLjIwNGAsIHjDoWMgc3XhuqV0IHZheSBsw6AgYDAuMjA0IC8gKDEgKyAwLjIwNCkg4omIIDE3JWAuICANCi0g4oaSIE5ow7NtIHRoYW0gY2hp4bq/dSBjw7MgeMOhYyBzdeG6pXQgdmF5IGtow6EgdGjhuqVwLg0KDQotLS0NCg0KKipCaeG6v24gYGpvYnN0dWRlbnRgKio6ICANCg0KLSBI4buHIHPhu5EgPSAqKi0yLjU5KiogIA0KLSBPZGRzIHJhdGlvID0gYGV4cCgtMi41OSkg4omIIDAuMDc1YCAgDQotIFNvIHbhu5tpIG5ow7NtIGjDoG5oIGNow61uaCwgc2luaCB2acOqbiBjw7MgbG9nKG9kZHMpIHZheSB0aOG6pXAgaMahbiAyLjU5IMSRxqFuIHbhu4ssIGhheSBvZGRzIHZheSBjaOG7iSBi4bqxbmcgNy41JSBuaMOzbSBhZG1pbi4gIA0KLSDihpIgU2luaCB2acOqbiAqKnLhuqV0IMOtdCB2YXkgdGnDqnUgZMO5bmcqKi4NCg0KLS0tDQoNCioqQmnhur9uIGBqb2J1bmVtcGxveWVkYCoqOiAgDQoNCi0gSOG7hyBz4buRID0gKiotMC42OSoqICANCi0gT2RkcyByYXRpbyA9IGBleHAoLTAuNjkpIOKJiCAwLjUwYCAgDQotIFNvIHbhu5tpIG5ow7NtIGjDoG5oIGNow61uaCwgbmfGsOG7nWkgdGjhuqV0IG5naGnhu4dwIGPDsyBsb2cob2RkcykgdGjhuqVwIGjGoW4gMC42OSwgdOG7qWMgb2RkcyB2YXkgY2jhu4kgYuG6sW5nIG3hu5l0IG7hu61hLiAgDQotIOKGkiBOZ8aw4budaSB0aOG6pXQgbmdoaeG7h3AgKipraMOzIHRp4bq/cCBj4bqtbiB2YXkgdGnDqnUgZMO5bmcgaMahbioqLg0KDQotLS0NCg0KKipCaeG6v24gYGpvYmVudHJlcHJlbmV1cmAqKjogDQoNCi0gSOG7hyBz4buRID0gKiowLjQ1KiogIA0KLSBPZGRzIHJhdGlvID0gYGV4cCgwLjQ1KSDiiYggMS41N2AgIA0KLSBTbyB24bubaSBuaMOzbSBow6BuaCBjaMOtbmgsIG5nxrDhu51pIHThu7EgZG9hbmggY8OzIGxvZyhvZGRzKSBjYW8gaMahbiAwLjQ1LCB04bupYyBvZGRzIHZheSBjYW8gaMahbiA1NyUuICANCi0g4oaSIE5nxrDhu51pIHThu7EgZG9hbmggKipjw7MgeHUgaMaw4bubbmcgdmF5IHRpw6p1IGTDuW5nIG5oaeG7gXUgaMahbioqLg0KDQotLS0NCg0KKipCaeG6v24gYGVkdWNhdGlvbnNlY29uZGFyeWAqKjogIA0KDQotIEjhu4cgc+G7kSA9ICoqMC4zMyoqICANCi0gT2RkcyByYXRpbyA9IGBleHAoMC4zMykg4omIIDEuMzlgICANCi0gU28gduG7m2kgbmfGsOG7nWkgaOG7jWMgdGnhu4N1IGjhu41jLCBuZ8aw4budaSBo4buNYyB0cnVuZyBo4buNYyBjw7Mgb2RkcyB2YXkgY2FvIGjGoW4gMzklLiAgDQotIOKGkiBUcsOsbmggxJHhu5kgaOG7jWMgduG6pW4gdHJ1bmcgaOG7jWMgKip0xINuZyBraOG6oyBuxINuZyB2YXkgdGnDqnUgZMO5bmcqKi4NCg0KLS0tDQoNCioqQmnhur9uIGBtYXJpdGFsc2luZ2xlYCoqOiANCg0KLSBI4buHIHPhu5EgPSAqKi0wLjMzKiogIA0KLSBPZGRzIHJhdGlvID0gYGV4cCgtMC4zMykg4omIIDAuNzJgICANCi0gU28gduG7m2kgbmfGsOG7nWkgxJHDoyBseSBow7RuLCBuZ8aw4budaSDEkeG7mWMgdGjDom4gY8OzIG9kZHMgdmF5IHRo4bqlcCBoxqFuIDI4JS4gIA0KLSDihpIgTmfGsOG7nWkgxJHhu5ljIHRow6JuICoqw610IHZheSB0acOqdSBkw7luZyBoxqFuIG5nxrDhu51pIGx5IGjDtG4qKi4NCg0KLS0tDQoNCioqQmnhur9uIGBkZWZhdWx0eWVzYCoqOiANCg0KLSBI4buHIHPhu5EgPSAqKjAuOTQqKiAgDQotIE9kZHMgcmF0aW8gPSBgZXhwKDAuOTQpIOKJiCAyLjU1YCAgDQotIFNvIHbhu5tpIG5nxrDhu51pIGtow7RuZyBjw7MgbuG7oyB44bqldSwgbmfGsOG7nWkgY8OzIG7hu6MgeOG6pXUgY8OzIG9kZHMgdmF5ICoqZ+G6pXAgMi41NSBs4bqnbioqLiAgDQotIOKGkiBN4bq3YyBkw7kgbmfGsOG7o2MgduG7m2kga+G7syB24buNbmcgbMO9IHRodXnhur90LCBr4bq/dCBxdeG6oyBjaG8gdGjhuqV5IG5nxrDhu51pIGPDsyBu4bujIHjhuqV1ICoqduG6q24gY8OzIG5odSBj4bqndSBob+G6t2Mga2jhuqMgbsSDbmcgdmF5IGNhbyBoxqFuKiogdHJvbmcgdOG6rXAgZOG7ryBsaeG7h3UgbsOgeS4NCg0KLS0tDQoNCioqS+G6v3QgbHXhuq1uKioNCg0KVOG6pXQgY+G6oyBjw6FjIGJp4bq/biB0csOqbiDEkeG7gXUgY8OzIOG6o25oIGjGsOG7n25nIMSRw6FuZyBr4buDIMSR4bq/biBraOG6oyBuxINuZyB2YXkgdGnDqnUgZMO5bmcuIEjhu4cgc+G7kSDDom0gY2hvIHRo4bqleSBvZGRzIHZheSBnaeG6o20gc28gduG7m2kgbmjDs20gdGhhbSBjaGnhur91LCB0cm9uZyBraGkgaOG7hyBz4buRIGTGsMahbmcgcGjhuqNuIMOhbmggeHUgaMaw4bubbmcgdMSDbmcuIFZp4buHYyBwaMOibiB0w61jaCBj4bulIHRo4buDIHThu6tuZyBo4buHIHPhu5EgbmjGsCB0csOqbiBnacO6cCBoaeG7g3UgcsO1ICoqYWkgbMOgIMSR4buRaSB0xrDhu6NuZyBk4buFIHZheSBob+G6t2Mga2jDsyB2YXkqKiwgdOG7qyDEkcOzIGjhu5cgdHLhu6MgcmEgcXV54bq/dCDEkeG7i25oIGNobyBuZ8OibiBow6BuZyBob+G6t2MgdOG7lSBjaOG7qWMgdMOtbiBk4bulbmcuDQoNCg0KLS0tDQoNCiMjIyAqKlThu5VuZyBr4bq/dCBtw7QgaMOsbmggaOG7k2kgcXV5IGxvZ2lzdGljKioNCg0KLSBN4buZdCBz4buRIMSR4bq3YyDEkWnhu4NtIGPDoSBuaMOibiBuaMawICoqbmdo4buBIG5naGnhu4dwKiosICoqdHLDrG5oIMSR4buZIGjhu41jIHbhuqVuKiosICoqdMOsbmggdHLhuqFuZyBow7RuIG5ow6JuKiosIHbDoCAqKmzhu4tjaCBz4butIHTDrW4gZOG7pW5nKiogY8OzIOG6o25oIGjGsOG7n25nIMSRw6FuZyBr4buDIMSR4bq/biB4w6FjIHN14bqldCB2YXkgdGnDqnUgZMO5bmcuDQotIMSQ4bq3YyBiaeG7h3QsICoqZGVmYXVsdCoqIGzDoCB54bq/dSB04buRIHF1YW4gdHLhu41uZyBuaOG6pXQsIHbhu5tpIG3hu6ljIG9kZHMgcmF0aW8gPiAyLjUuDQotICoqU2luaCB2acOqbioqIHbDoCAqKm5nxrDhu51pIHRo4bqldCBuZ2hp4buHcCoqIGPDsyBraOG6oyBuxINuZyB2YXkgdGjhuqVwLCBwaOG6o24gw6FuaCBo4bqhbiBjaOG6vyB0cm9uZyB0aeG6v3AgY+G6rW4gdMOtbiBk4bulbmcuDQotICoqVHLDrG5oIMSR4buZIGjhu41jIHbhuqVuIHRydW5nIGjhu41jKiogZ2nDunAgdMSDbmcga2jhuqMgbsSDbmcgdGnhur9wIGPhuq1uIHZheSwgdHJvbmcga2hpIHRyw6xuaCDEkeG7mSDEkeG6oWkgaOG7jWMga2jDtG5nIHThuqFvIHJhIHPhu7Ega2jDoWMgYmnhu4d0IMSRw6FuZyBr4buDIHRyb25nIG3DtCBow6xuaC4NCg0KDQotLS0NCg0KIyAqKkjhu5JJIFFVWSBQUk9CSVQqKg0KDQojIyAqKkjhu5NpIHF1eSBQcm9iaXQgxJHGoW4gYmnhur9uKioNCg0KKipHaeG6oyB0aHV54bq/dCBraeG7g20gxJHhu4tuaCoqDQoNCi0gKipI4oKAKio6IEJp4bq/biBraMO0bmcgY8OzIOG6o25oIGjGsOG7n25nIMSR4bq/biB4w6FjIHN14bqldCB2YXkgdGnDqnUgZMO5bmcuICANCi0gKipI4oKBKio6IEJp4bq/biBjw7Mg4bqjbmggaMaw4bufbmcgxJHhur9uIHjDoWMgc3XhuqV0IHZheSB0acOqdSBkw7luZy4NCg0KVMOhYyBnaeG6oyB0aOG7sWMgaGnhu4duIGjhu5NpIHF1eSBQcm9iaXQgxJHGoW4gYmnhur9uIHbhu5tpIGJp4bq/biBnaeG6o2kgdGjDrWNoIGzDoCBgZWR1Y2F0aW9uYCDEkeG7gyBraeG7g20gxJHhu4tuaCDhuqNuaCBoxrDhu59uZyBj4bunYSB0csOsbmggxJHhu5kgaOG7jWMgduG6pW4gxJHhur9uIHjDoWMgc3XhuqV0IHZheSB0acOqdSBkw7luZyAoYGxvYW5gKS4NCg0KYGBge3J9DQojIEjhu5NpIHF1eSBQcm9iaXQgxJHGoW4gYmnhur9uIHbhu5tpIGVkdWNhdGlvbg0KbW9kZWxfcHJvYml0X2VkdSA8LSBnbG0obG9hbiB+IGVkdWNhdGlvbiwgZGF0YSA9IGRhdGExLCBmYW1pbHkgPSBiaW5vbWlhbChsaW5rID0gInByb2JpdCIpKQ0Kc3VtbWFyeShtb2RlbF9wcm9iaXRfZWR1KQ0KYGBgDQoNCioqUGjGsMahbmcgdHLDrG5oIFByb2JpdCDEkcaw4bujYyDGsOG7m2MgbMaw4bujbmcqKg0KDQpcWw0KXFBoaV57LTF9KFAoXHRleHR7bG9hbn0gPSBcdGV4dHt5ZXN9KSkgPSAtMS4wOSArIDAuMTcgXHRpbWVzIFx0ZXh0e2VkdWNhdGlvbnNlY29uZGFyeX0gLSAwLjA1IFx0aW1lcyBcdGV4dHtlZHVjYXRpb250ZXJ0aWFyeX0NClxdDQoNCioqQuG6o25nIHTDs20gdOG6r3QgY8OhYyBiaeG6v24gY8OzIMO9IG5naMSpYSB0aOG7kW5nIGvDqioqDQoNCnwgQmnhur9uICAgICAgICAgICAgICAgfCBOaMOzbSBzbyBzw6FuaCAgICB8IEjhu4cgc+G7kSAozrIpIHwgcC12YWx1ZSB8IERp4buFbiBnaeG6o2kgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQp8LS0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tfC0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfA0KfCBlZHVjYXRpb25zZWNvbmRhcnkgfCBTbyB24bubaSBwcmltYXJ5ICAgfCAwLjE3ICAgICAgfCAwLjAxMCAgIHwgTmfGsOG7nWkgaOG7jWMgdHJ1bmcgaOG7jWMgY8OzIHByb2JpdCBjYW8gaMahbiAwLjE3IMSRxqFuIHbhu4sg4oaSIHjDoWMgc3XhuqV0IHZheSB0xINuZy4gfA0KfCBlZHVjYXRpb250ZXJ0aWFyeSAgfCBTbyB24bubaSBwcmltYXJ5ICAgfCAtMC4wNSAgICAgfCAwLjU0MSAgIHwgS2jDtG5nIGPDsyDDvSBuZ2jEqWEgdGjhu5FuZyBrw6ouICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KDQoqKkvhur90IGx14bqtbioqDQoNCkvhur90IHF14bqjIGjhu5NpIHF1eSBQcm9iaXQgY2hvIHRo4bqleSB0csOsbmggxJHhu5kgaOG7jWMgduG6pW4gYuG6rWMgdHJ1bmcgaOG7jWMgKCpzZWNvbmRhcnkqKSBjw7Mg4bqjbmggaMaw4bufbmcgxJHDoW5nIGvhu4MgxJHhur9uIHjDoWMgc3XhuqV0IHZheSB0acOqdSBkw7luZy4gQ+G7pSB0aOG7gywgaOG7hyBz4buRIMaw4bubYyBsxrDhu6NuZyBsw6AgKiowLjE3KiogKCpwKiA9IDAuMDEwKSwgY2hvIHRo4bqleSAqKm5nxrDhu51pIGjhu41jIGjhur90IHRydW5nIGjhu41jIGPDsyBraOG6oyBuxINuZyB2YXkgY2FvIGjGoW4qKiBzbyB24bubaSBuZ8aw4budaSBjaOG7iSBo4buNYyB0aeG7g3UgaOG7jWMuIFRyb25nIGtoaSDEkcOzLCBuaMOzbSBo4buNYyDEkeG6oWkgaOG7jWMgdHLhu58gbMOqbiAoKnRlcnRpYXJ5KikgKipraMO0bmcgY8OzIOG6o25oIGjGsOG7n25nIHRo4buRbmcga8OqIHLDtSBy4buHdCoqICgqcCogPSAwLjU0MSkuDQoNCg0KIyMgKipI4buTaSBxdXkgUHJvYml0IMSRYSBiaeG6v24qKg0KDQpTYXUga2hpIHRo4buxYyBoaeG7h24gbcO0IGjDrG5oIGjhu5NpIHF1eSBsb2dpc3RpYywgdMOhYyBnaeG6oyB0aeG6v3AgdOG7pWMgdHJp4buDbiBraGFpIG3DtCBow6xuaCAqKmjhu5NpIHF1eSBQcm9iaXQqKiBuaOG6sW0ga2nhu4NtIMSR4buLbmggdMOtbmggbmjhuqV0IHF1w6FuIHbDoCDEkeG7mSBuaOG6oXkgY+G7p2EgY8OhYyBr4bq/dCBxdeG6oy4gTcO0IGjDrG5oIFByb2JpdCBz4butIGThu6VuZyBow6BtIGxpw6puIGvhur90IGzDoCAqKnBow6JuIHBo4buRaSBjaHXhuqluIHTDrWNoIGzFqXkqKiAkXFBoaShcY2RvdCkkIMSR4buDIG3DtCBwaOG7j25nIHjDoWMgc3XhuqV0IGtow6FjaCBow6BuZyB2YXkgdGnDqnUgZMO5bmcgKGBsb2FuID0geWVzYCkgZOG7sWEgdHLDqm4gY8OhYyBiaeG6v24gxJHhu5ljIGzhuq1wOiBgam9iYCAobmdo4buBIG5naGnhu4dwKSwgYGVkdWNhdGlvbmAgKHRyw6xuaCDEkeG7mSBo4buNYyB24bqlbiksIGBtYXJpdGFsYCAodMOsbmggdHLhuqFuZyBow7RuIG5ow6JuKSB2w6AgYGRlZmF1bHRgIChs4buLY2ggc+G7rSBu4bujIHF1w6EgaOG6oW4pLg0KDQpNw7QgaMOsbmggY8OzIGThuqFuZzoNCg0KJCQNClAoXHRleHR7bG9hbn1faSA9IDEgXG1pZCBYX2kpID0gXFBoaShcYmV0YV8wICsgXGJldGFfMSBcY2RvdCBcdGV4dHtqb2J9X2kgKyBcYmV0YV8yIFxjZG90IFx0ZXh0e2VkdWNhdGlvbn1faSArIFxiZXRhXzMgXGNkb3QgXHRleHR7bWFyaXRhbH1faSArIFxiZXRhXzQgXGNkb3QgXHRleHR7ZGVmYXVsdH1faSkNCiQkDQoNClRyb25nIMSRw7M6DQoNCi0gJFxQaGkoXGNkb3QpJCBsw6AgaMOgbSBwaMOibiBwaOG7kWkgdMOtY2ggbMWpeSBjaHXhuqluIGNodeG6qW4gaMOzYSAoQ0RGKSwNCi0gJFhfaSQgbMOgIHZlY3RvciBjw6FjIGJp4bq/biDEkeG7mWMgbOG6rXAgY2hvIGPDoSBuaMOibiAkaSQuDQoNCiMjIyAqKkvhur90IHF14bqjIGjhu5NpIHF1eSoqDQoNCioqR2nhuqMgdGh1eeG6v3Qga2nhu4NtIMSR4buLbmgqKg0KDQpW4bubaSB04burbmcgYmnhur9uIMSR4buZYyBs4bqtcCwgdGEgdGjhu7FjIGhp4buHbiBraeG7g20gxJHhu4tuaDoNCg0KLSAkSF8wJDogQmnhur9uIGtow7RuZyBjw7Mg4bqjbmggaMaw4bufbmcgxJHhur9uIHjDoWMgc3XhuqV0IHZheSB0acOqdSBkw7luZyAoJFxiZXRhID0gMCQpDQotICRIXzEkOiBCaeG6v24gY8OzIOG6o25oIGjGsOG7n25nIMSR4bq/biB4w6FjIHN14bqldCB2YXkgdGnDqnUgZMO5bmcgKCRcYmV0YSBcbmUgMCQpDQoNCk3hu6ljIMO9IG5naMSpYSBz4butIGThu6VuZyBsw6AgJFxhbHBoYSA9IDAuMDUkLiBO4bq/dSBwdmFsdWUgPCAwLjA1LCBiw6FjIGLhu48gJEhfMCQuDQoNCioqS+G6v3QgcXXhuqMgbcO0IGjDrG5oIFByb2JpdCoqDQoNCmBgYHtyfQ0KIyBDaOG6oXkgbcO0IGjDrG5oIHByb2JpdA0KbW9kZWxfcHJvYml0IDwtIGdsbShsb2FuIH4gam9iICsgZWR1Y2F0aW9uICsgbWFyaXRhbCArIGRlZmF1bHQsDQogICAgICAgICAgICAgICAgICAgIGRhdGEgPSBkYXRhMSwNCiAgICAgICAgICAgICAgICAgICAgZmFtaWx5ID0gYmlub21pYWwobGluayA9ICJwcm9iaXQiKSkNCg0KIyBIaeG7g24gdGjhu4sga+G6v3QgcXXhuqMNCnN1bW1hcnkobW9kZWxfcHJvYml0KQ0KYGBgDQoNCiMjIyAqKlBow6JuIHTDrWNoIGvhur90IHF14bqjIHRoZW8gdOG7q25nIG5ow7NtIGJp4bq/bioqDQoNCk3DtCBow6xuaCBo4buTaSBxdXkgbG9naXN0aWMgxJHGsOG7o2MgeMOieSBk4buxbmcgbmjhurFtIHBow6JuIHTDrWNoIHjDoWMgc3XhuqV0IGtow6FjaCBow6BuZyDEkcSDbmcga8O9IHZheSB0acOqdSBkw7luZyAobG9hbiA9IHllcykgZOG7sWEgdHLDqm4gY8OhYyBiaeG6v24gxJHhu4tuaCB0w61uaDogbmdo4buBIG5naGnhu4dwIChqb2IpLCB0csOsbmggxJHhu5kgaOG7jWMgduG6pW4gKGVkdWNhdGlvbiksIHTDrG5oIHRy4bqhbmcgaMO0biBuaMOibiAobWFyaXRhbCkgdsOgIGzhu4tjaCBz4butIHTDrW4gZOG7pW5nIChkZWZhdWx0KS4gTeG7qWMgw70gbmdoxKlhIMSRxrDhu6NjIHPhu60gZOG7pW5nIGzDoCA1JSAozrEgPSAwLjA1KS4NCg0KDQoqKkLhuqNuZyB04buVbmcgaOG7o3AgY8OhYyBiaeG6v24gY8OzIMO9IG5naMSpYSB0aOG7kW5nIGvDqiAobcO0IGjDrG5oIFByb2JpdCkqKg0KDQp8IEJp4bq/biAgICAgICAgICAgICAgIHwgTmjDs20gc28gc8OhbmggICAgICAgICAgICAgIHwgSOG7hyBz4buRICjOsikgfCBwLXZhbHVlICB8IERp4buFbiBnaeG6o2kgY2hpIHRp4bq/dCB8DQp8LS0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tfC0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tfA0KfCBqb2JzdHVkZW50ICAgICAgICAgfCBTbyB24bubaSBhZG1pbi4gICAgICAgICAgICAgfCAtMS4xOSAgICAgfCAwLjAwMjUgICB8IFNpbmggdmnDqm4gY8OzIHjDoWMgc3XhuqV0IHZheSB0acOqdSBkw7luZyB0aOG6pXAgaMahbiDEkcOhbmcga+G7gyBzbyB24bubaSBuaMOzbSBow6BuaCBjaMOtbmguIHwNCnwgam9idW5lbXBsb3llZCAgICAgIHwgU28gduG7m2kgYWRtaW4uICAgICAgICAgICAgIHwgLTAuMzcgICAgIHwgMC4wMjUyICAgfCBOZ8aw4budaSB0aOG6pXQgbmdoaeG7h3AgY8OzIHjDoWMgc3XhuqV0IHZheSB0acOqdSBkw7luZyB0aOG6pXAgaMahbiBzbyB24bubaSBuaMOzbSBow6BuaCBjaMOtbmguIHwNCnwgam9iZW50cmVwcmVuZXVyICAgIHwgU28gduG7m2kgYWRtaW4uICAgICAgICAgICAgIHwgMC4yNiAgICAgIHwgMC4wNTA5ICAgfCBOZ8aw4budaSB04buxIGRvYW5oIGPDsyB4w6FjIHN14bqldCB2YXkgdGnDqnUgZMO5bmcgY2FvIGjGoW4gbeG7mXQgY2jDunQgc28gduG7m2kgbmjDs20gaMOgbmggY2jDrW5oLiB8DQp8IGVkdWNhdGlvbnNlY29uZGFyeSB8IFNvIHbhu5tpIHByaW1hcnkgICAgICAgICAgICB8IDAuMTggICAgICB8IDAuMDE0NSAgIHwgTmfGsOG7nWkgaOG7jWMgdHJ1bmcgaOG7jWMgY8OzIHjDoWMgc3XhuqV0IHZheSBjYW8gaMahbiBzbyB24bubaSBuZ8aw4budaSBjaOG7iSBo4buNYyB0aeG7g3UgaOG7jWMuIHwNCnwgbWFyaXRhbHNpbmdsZSAgICAgIHwgU28gduG7m2kgZGl2b3JjZWQgICAgICAgICAgIHwgLTAuMTkgICAgIHwgMC4wMjM0ICAgfCBOZ8aw4budaSDEkeG7mWMgdGjDom4gY8OzIHjDoWMgc3XhuqV0IHZheSB0aOG6pXAgaMahbiBzbyB24bubaSBuZ8aw4budaSDEkcOjIGx5IGjDtG4uIHwNCnwgZGVmYXVsdHllcyAgICAgICAgIHwgU28gduG7m2kgZGVmYXVsdCA9IG5vICAgICAgIHwgMC41NSAgICAgIHwgMC4wMDA0ICAgfCBOZ8aw4budaSBjw7MgbuG7oyB44bqldSBjw7MgeMOhYyBzdeG6pXQgdmF5IHRpw6p1IGTDuW5nIGNhbyBoxqFuIMSRw6FuZyBr4buDLiB8DQoNCg0KDQoqKlBoxrDGoW5nIHRyw6xuaCBQcm9iaXQgxJHGsOG7o2MgxrDhu5tjIGzGsOG7o25nIG5oxrAgc2F1OioqDQoNCioqcHJvYml0KFAobG9hbiA9IHllcykpID0gLTAuOTUgLSAxLjE5w5dqb2JzdHVkZW50IC0gMC4zN8OXam9idW5lbXBsb3llZCArIDAuMjbDl2pvYmVudHJlcHJlbmV1ciArIDAuMTjDl2VkdWNhdGlvbnNlY29uZGFyeSAtIDAuMTnDl21hcml0YWxzaW5nbGUgKyAwLjU1w5dkZWZhdWx0eWVzKioNCg0KDQoqKkjhu4cgc+G7kSBjaOG6t24gKEludGVyY2VwdCkqKjogIA0KDQotIEjhu4cgc+G7kSA9ICoqLTAuOTUqKiAgDQotIEtoaSBraMOhY2ggaMOgbmcgdGh14buZYyBuaMOzbSB0aGFtIGNoaeG6v3UgKCpqb2IgPSBhZG1pbi4qLCAqZWR1Y2F0aW9uID0gcHJpbWFyeSosICptYXJpdGFsID0gZGl2b3JjZWQqLCAqZGVmYXVsdCA9IG5vKiksIHByb2JpdCBj4bunYSB4w6FjIHN14bqldCB2YXkgdGnDqnUgZMO5bmcgbMOgIC0wLjk1LiAgDQotIFThu6sgZ2nDoSB0cuG7iyBuw6B5LCB4w6FjIHN14bqldCB2YXkgbMOgIGBwbm9ybSgtMC45NSkg4omIIDE3JWAuICANCi0g4oaSIE5ow7NtIHRoYW0gY2hp4bq/dSBjw7MgeMOhYyBzdeG6pXQgdmF5ICoqa2jDoSB0aOG6pXAqKi4NCg0KLS0tDQoNCioqQmnhur9uIGBqb2JzdHVkZW50YCoqOg0KDQotIEjhu4cgc+G7kSA9ICoqLTEuMTkqKiAgDQotIFNvIHbhu5tpIG5ow7NtIGjDoG5oIGNow61uaCwgc2luaCB2acOqbiBjw7MgcHJvYml0IChjaHXhuqluIGjDs2EpIHRo4bqlcCBoxqFuIDEuMTkgxJFp4buDbS4gIA0KLSBYw6FjIHN14bqldCB0xrDGoW5nIOG7qW5nIGdp4bqjbSBt4bqhbmg6IGBwbm9ybSgtMC45NSAtIDEuMTkpIOKJiCBwbm9ybSgtMi4xNCkg4omIIDEuNiVgLiAgDQotIOKGkiBTaW5oIHZpw6puICoqcuG6pXQgw610IHZheSB0acOqdSBkw7luZyoqIHRyb25nIG3huqt1IGto4bqjbyBzw6F0Lg0KDQotLS0NCg0KKipCaeG6v24gYGpvYnVuZW1wbG95ZWRgKio6DQoNCi0gSOG7hyBz4buRID0gKiotMC4zNyoqICANCi0gTmfGsOG7nWkgdGjhuqV0IG5naGnhu4dwIGPDsyBwcm9iaXQgdGjhuqVwIGjGoW4gMC4zNyBzbyB24bubaSBuaMOzbSBow6BuaCBjaMOtbmguICANCi0gWMOhYyBzdeG6pXQgdmF5IGdp4bqjbSB04burIDE3JSBjw7JuIGtob+G6o25nIGBwbm9ybSgtMC45NSAtIDAuMzcpIOKJiCBwbm9ybSgtMS4zMikg4omIIDklYC4gIA0KLSDihpIgTmfGsOG7nWkgdGjhuqV0IG5naGnhu4dwICoqw610IGPDsyBraOG6oyBuxINuZyB2YXkgaMahbioqLg0KDQotLS0NCg0KKipCaeG6v24gYGpvYmVudHJlcHJlbmV1cmAqKjoNCg0KLSBI4buHIHPhu5EgPSAqKjAuMjYqKiAgDQotIE5nxrDhu51pIHThu7EgZG9hbmggY8OzIHByb2JpdCBjYW8gaMahbiAwLjI2IMSRaeG7g20gc28gduG7m2kgbmjDs20gaMOgbmggY2jDrW5oLiAgDQotIFjDoWMgc3XhuqV0IHZheSB0xINuZyB04burIDE3JSBsw6puIGtob+G6o25nIGBwbm9ybSgtMC45NSArIDAuMjYpIOKJiCBwbm9ybSgtMC42OSkg4omIIDI0JWAuICANCi0g4oaSIE5nxrDhu51pIHThu7EgZG9hbmggKipjw7MgeHUgaMaw4bubbmcgdmF5IHRpw6p1IGTDuW5nIG5oaeG7gXUgaMahbioqLg0KDQotLS0NCg0KKipCaeG6v24gYGVkdWNhdGlvbnNlY29uZGFyeWAqKjoNCg0KLSBI4buHIHPhu5EgPSAqKjAuMTgqKiAgDQotIE5nxrDhu51pIGjhu41jIGjhur90IHRydW5nIGjhu41jIGPDsyBwcm9iaXQgY2FvIGjGoW4gMC4xOCBzbyB24bubaSBuZ8aw4budaSBo4buNYyB0aeG7g3UgaOG7jWMuICANCi0gWMOhYyBzdeG6pXQgdmF5IHTEg25nIHThu6sgMTclIGzDqm4ga2hv4bqjbmcgYHBub3JtKC0wLjk1ICsgMC4xOCkg4omIIHBub3JtKC0wLjc3KSDiiYggMjIlYC4gIA0KLSDihpIgVHLDrG5oIMSR4buZIGjhu41jIHbhuqVuIHRydW5nIGjhu41jICoqdMSDbmcgeMOhYyBzdeG6pXQgdmF5IHRpw6p1IGTDuW5nKiouDQoNCi0tLQ0KDQoqKkJp4bq/biBgbWFyaXRhbHNpbmdsZWAqKjoNCg0KLSBI4buHIHPhu5EgPSAqKi0wLjE5KiogIA0KLSBOZ8aw4budaSDEkeG7mWMgdGjDom4gY8OzIHByb2JpdCB0aOG6pXAgaMahbiAwLjE5IHNvIHbhu5tpIG5nxrDhu51pIMSRw6MgbHkgaMO0bi4gIA0KLSBYw6FjIHN14bqldCB2YXkgZ2nhuqNtIHThu6sgMTclIHh14buRbmcga2hv4bqjbmcgYHBub3JtKC0wLjk1IC0gMC4xOSkg4omIIHBub3JtKC0xLjE0KSDiiYggMTMlYC4gIA0KLSDihpIgTmfGsOG7nWkgxJHhu5ljIHRow6JuICoqw610IHZheSB0acOqdSBkw7luZyBoxqFuIG5nxrDhu51pIGx5IGjDtG4qKi4NCg0KLS0tDQoNCioqQmnhur9uIGBkZWZhdWx0eWVzYCoqOg0KDQotIEjhu4cgc+G7kSA9ICoqMC41NSoqICANCi0gTmfGsOG7nWkgY8OzIG7hu6MgeOG6pXUgY8OzIHByb2JpdCBjYW8gaMahbiAwLjU1IHNvIHbhu5tpIG5nxrDhu51pIGtow7RuZyBu4bujIHjhuqV1LiAgDQotIFjDoWMgc3XhuqV0IHZheSB0xINuZyB04burIDE3JSBsw6puIGtob+G6o25nIGBwbm9ybSgtMC45NSArIDAuNTUpIOKJiCBwbm9ybSgtMC40MCkg4omIIDM0JWAuICANCi0g4oaSIE5nxrDhu51pIGPDsyBu4bujIHjhuqV1ICoqduG6q24gY8OzIGto4bqjIG7Eg25nIHZheSBjYW8gaMahbioqLCBwaOG6o24gw6FuaCBuaHUgY+G6p3UgdmF5IGNhbyBob+G6t2MgY2jDrW5oIHPDoWNoIHBow6ogZHV54buHdCDEkeG6t2MgYmnhu4d0Lg0KDQotLS0NCg0KIyMjICoqS+G6v3QgbHXhuq1uKioNCg0KTcO0IGjDrG5oIFByb2JpdCBjaG8gdGjhuqV5IG5oaeG7gXUgxJHhurdjIMSRaeG7g20gY8OhIG5ow6JuIGPDsyDhuqNuaCBoxrDhu59uZyDEkcOhbmcga+G7gyDEkeG6v24geMOhYyBzdeG6pXQgdmF5IHRpw6p1IGTDuW5nLiBDw6FjIGjhu4cgc+G7kSDDom0gY2hvIHRo4bqleSB4dSBoxrDhu5tuZyAqKmdp4bqjbSB4w6FjIHN14bqldCB2YXkqKiwgdHJvbmcga2hpIGjhu4cgc+G7kSBkxrDGoW5nIGNobyB0aOG6pXkgKip0xINuZyB4w6FjIHN14bqldCB2YXkqKi4gUGjDom4gdMOtY2ggY2hpIHRp4bq/dCB04burbmcgeeG6v3UgdOG7kSBuaMawIHRyw6puIGN1bmcgY+G6pXAgZ8OzYyBuaMOsbiBzw6J1IHPhuq9jIGNobyBjw6FjIG5nw6JuIGjDoG5nIGtoaSDEkcOhbmggZ2nDoSBo4buTIHPGoSB2YXkgY+G7p2Ega2jDoWNoIGjDoG5nLg0KDQoNCiMgKipI4buSSSBRVVkgQ0xPR0xPRyoqDQoNCk3DtCBow6xuaCBo4buTaSBxdXkgQ2xvZ2xvZyAoKmNvbXBsZW1lbnRhcnkgbG9nLWxvZyByZWdyZXNzaW9uKikgbMOgIG3hu5l0IGThuqFuZyBj4bunYSBtw7QgaMOsbmggaOG7k2kgcXV5IG5o4buLIHBow6JuLCB0xrDGoW5nIHThu7EgbmjGsCBMb2dpdCB2w6AgUHJvYml0LCBuaMawbmcgc+G7rSBk4bulbmcgbeG7mXQgaMOgbSBsacOqbiBr4bq/dCBwaGkgxJHhu5FpIHjhu6luZyDigJMgxJHhurdjIGJp4buHdCBwaMO5IGjhu6NwIGtoaSB4w6FjIHN14bqldCB44bqjeSByYSBz4buxIGtp4buHbiBxdWFuIHTDom0gcuG6pXQgbmjhu48gKGhp4bq/bSBn4bq3cCkgaG/hurdjIHLhuqV0IGzhu5tuIChn4bqnbiBuaMawIGNo4bqvYyBjaOG6r24pLg0KDQoqKkjDoG0gbGnDqm4ga+G6v3QgQ2xvZ2xvZyoqDQoNCk3DtCBow6xuaCBjw7MgZOG6oW5nIHRvw6FuIGjhu41jIG5oxrAgc2F1Og0KDQpcWw0KXGxvZ1xsZWZ0Wy1cbG9nKDEgLSBQKFkgPSAxKSlccmlnaHRdID0gXGJldGFfMCArIFxiZXRhXzEgWF8xICsgXGJldGFfMiBYXzIgKyBcY2RvdHMgKyBcYmV0YV9rIFhfaw0KXF0NCg0KaGF5IHZp4bq/dCBs4bqhaSB0aGVvIHjDoWMgc3XhuqV0Og0KDQpcWw0KUChZID0gMSB8IFgpID0gMSAtIFxleHBcbGVmdFstXGV4cFxsZWZ0KFxiZXRhXzAgKyBcYmV0YV8xIFhfMSArIFxjZG90cyArIFxiZXRhX2sgWF9rIFxyaWdodClccmlnaHRdDQpcXQ0KDQpUcm9uZyBuZ2hpw6puIGPhu6l1IG7DoHksIHRhIMOhcCBk4bulbmcgbcO0IGjDrG5oIGNobyBiaeG6v24gcGjhu6UgdGh14buZYzoNCg0KLSBcKCBZID0gXHRleHR7bG9hbn0gXCk6IGJp4bq/biBuaOG7iyBwaMOibiAoMSA9IGPDsyB2YXkgdGnDqnUgZMO5bmcsIDAgPSBraMO0bmcgdmF5KS4NCg0KQ8OhYyBiaeG6v24gxJHhu5ljIGzhuq1wIGfhu5NtOiBgam9iYCwgYGVkdWNhdGlvbmAsIGBtYXJpdGFsYCwgYGRlZmF1bHRgLg0KDQpcWw0KXGxvZ1stXGxvZygxIC0gUChcdGV4dHtsb2FufSA9IDEpKV0gPSBcYmV0YV8wICsgXGJldGFfMSBcY2RvdCBcdGV4dHtqb2J9ICsgXGJldGFfMiBcY2RvdCBcdGV4dHtlZHVjYXRpb259ICsgXGJldGFfMyBcY2RvdCBcdGV4dHttYXJpdGFsfSArIFxiZXRhXzQgXGNkb3QgXHRleHR7ZGVmYXVsdH0NClxdDQoNCiMjICoqSOG7k2kgcXV5IENsb2dsb2cgxJHGoW4gYmnhur9uKioNCg0KKipHaeG6oyB0aHV54bq/dCBraeG7g20gxJHhu4tuaCoqICANCi0gKipI4oKAKio6IFRyw6xuaCDEkeG7mSBo4buNYyB24bqlbiBraMO0bmcg4bqjbmggaMaw4bufbmcgxJHhur9uIHjDoWMgc3XhuqV0IHZheSB0acOqdSBkw7luZy4gIA0KLSAqKkjigoEqKjogVHLDrG5oIMSR4buZIGjhu41jIHbhuqVuIGPDsyDhuqNuaCBoxrDhu59uZyDEkeG6v24geMOhYyBzdeG6pXQgdmF5IHRpw6p1IGTDuW5nLiAgDQoNCmBgYHtyfQ0KIyBI4buTaSBxdXkgQ2xvZ2xvZyDEkcahbiBiaeG6v24gduG7m2kgYmnhur9uIGVkdWNhdGlvbg0KbW9kZWxfY2xvZ2xvZ19lZHUgPC0gZ2xtKGxvYW4gfiBlZHVjYXRpb24sIGRhdGEgPSBkYXRhMSwgZmFtaWx5ID0gYmlub21pYWwobGluayA9ICJjbG9nbG9nIikpDQpzdW1tYXJ5KG1vZGVsX2Nsb2dsb2dfZWR1KQ0KYGBgDQoNCioqUGjGsMahbmcgdHLDrG5oIENsb2dsb2cgxJHGsOG7o2MgxrDhu5tjIGzGsOG7o25nKioNCg0KXFsNClxsb2coLVxsb2coMSAtIFAoXHRleHR7bG9hbn0gPSBcdGV4dHt5ZXN9KSkpID0gLTEuOTAgKyAwLjI5IFx0aW1lcyBcdGV4dHtlZHVjYXRpb25zZWNvbmRhcnl9IC0gMC4wOCBcdGltZXMgXHRleHR7ZWR1Y2F0aW9udGVydGlhcnl9DQpcXQ0KDQoqKkLhuqNuZyB0w7NtIHThuq90IGPDoWMgYmnhur9uIGPDsyDDvSBuZ2jEqWEgdGjhu5FuZyBrw6oqKg0KDQp8IEJp4bq/biAgICAgICAgICAgICAgIHwgTmjDs20gc28gc8OhbmggIHwgSOG7hyBz4buRICjOsikgfCBwLXZhbHVlIHwgRGnhu4VuIGdp4bqjaSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCnwtLS0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tfC0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfA0KfCBlZHVjYXRpb25zZWNvbmRhcnkgfCBTbyB24bubaSBwcmltYXJ5IHwgMC4yOSAgICAgIHwgMC4wMTE5ICB8IE5nxrDhu51pIGjhu41jIHRydW5nIGjhu41jIGPDsyBjbG9nbG9nIGNhbyBoxqFuIDAuMjkg4oaSIHjDoWMgc3XhuqV0IHZheSB0xINuZy4gICAgICAgfA0KfCBlZHVjYXRpb250ZXJ0aWFyeSAgfCBTbyB24bubaSBwcmltYXJ5IHwgLTAuMDggICAgIHwgMC41NDAzICB8IEtow7RuZyBjw7Mgw70gbmdoxKlhIHRo4buRbmcga8OqLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCg0KKipL4bq/dCBsdeG6rW4qKg0KDQpL4bq/dCBxdeG6oyBo4buTaSBxdXkgKipDbG9nbG9nIMSRxqFuIGJp4bq/bioqIGNobyB0aOG6pXkgbmjDs20gY8OzIHRyw6xuaCDEkeG7mSBo4buNYyB24bqlbiAqKnRydW5nIGjhu41jIChzZWNvbmRhcnkpKiogY8OzIOG6o25oIGjGsOG7n25nICoqY8OzIMO9IG5naMSpYSB0aOG7kW5nIGvDqioqIMSR4bq/biBraOG6oyBuxINuZyB2YXkgdGnDqnUgZMO5bmcgKCpwKiA9IDAuMDExOSkuICANCkPhu6UgdGjhu4MsIGjhu4cgc+G7kSDGsOG7m2MgbMaw4bujbmcgbMOgICoqMC4yOSoqLCBjaG8gdGjhuqV5IG5ow7NtIG7DoHkgY8OzIGdpw6EgdHLhu4sgY2xvZ2xvZyBjYW8gaMahbiwgdOG7qWMgbMOgICoqeMOhYyBzdeG6pXQgdmF5IHRpw6p1IGTDuW5nIGNhbyBoxqFuKiogc28gduG7m2kgbmjDs20gY2jhu4kgaOG7jWMgdGnhu4N1IGjhu41jIChwcmltYXJ5KS4gIA0KTmfGsOG7o2MgbOG6oWksIG5ow7NtIGjhu41jICoqxJHhuqFpIGjhu41jIHRy4bufIGzDqm4gKHRlcnRpYXJ5KSoqIGPDsyBo4buHIHPhu5Egw6JtIG5o4bq5IHbDoCAqKmtow7RuZyBjw7Mgw70gbmdoxKlhIHRo4buRbmcga8OqKiogKCpwKiA9IDAuNTQwMykuDQoNCiMjICoqSOG7k2kgcXV5IENsb2dsb2cgxJFhIGJp4bq/bioqDQoNCiMjIyAqKkvhur90IHF14bqjIGjhu5NpIHF1eSoqDQoNCioqR2nhuqMgdGh1eeG6v3Qga2nhu4NtIMSR4buLbmgqKg0KDQpW4bubaSBt4buXaSBiaeG6v24gxJHhu5ljIGzhuq1wIFwoIFhfaiBcKSwgdGEga2nhu4NtIMSR4buLbmg6DQoNCi0gKipI4oKAKio6IEJp4bq/biDEkeG7mWMgbOG6rXAga2jDtG5nIOG6o25oIGjGsOG7n25nIMSR4bq/biB4w6FjIHN14bqldCB2YXkgdGnDqnUgZMO5bmcNCi0gKipI4oKBKio6IEJp4bq/biDEkeG7mWMgbOG6rXAgY8OzIOG6o25oIGjGsOG7n25nIMSR4bq/biB4w6FjIHN14bqldCB2YXkgdGnDqnUgZMO5bmcNCg0KROG7sWEgdsOgbyAqKnAtdmFsdWUqKiB0cm9uZyBr4bq/dCBxdeG6oyDGsOG7m2MgbMaw4bujbmcsIHRhIMSRxrBhIHJhIHF1eeG6v3QgxJHhu4tuaCBiw6FjIGLhu48gaGF5IGdp4buvIEjigoAgdOG6oWkgbeG7qWMgw70gbmdoxKlhIM6xICh0aMaw4budbmcgbMOgIDAuMDUpLg0KDQoqKsav4bubYyBsxrDhu6NuZyBtw7QgaMOsbmgqKg0KDQpNw7QgaMOsbmggxJHGsOG7o2MgxrDhu5tjIGzGsOG7o25nIGLhurFuZyBwaMawxqFuZyBwaMOhcCAqKnThu5FpIMSRYSBow7NhIGjDoG0gaOG7o3AgbMO9IChNYXhpbXVtIExpa2VsaWhvb2QgRXN0aW1hdGlvbiAtIE1MRSkqKi4NCg0KYGBge3J9DQojIEjhu5NpIHF1eSBjbG9nbG9nDQptb2RlbF9jbG9nbG9nIDwtIGdsbShsb2FuIH4gam9iICsgZWR1Y2F0aW9uICsgbWFyaXRhbCArIGRlZmF1bHQsDQogICAgICAgICAgICAgICAgICAgICBkYXRhID0gZGF0YTEsDQogICAgICAgICAgICAgICAgICAgICBmYW1pbHkgPSBiaW5vbWlhbChsaW5rID0gImNsb2dsb2ciKSkNCg0KIyBUw7NtIHThuq90IGvhur90IHF14bqjDQpzdW1tYXJ5KG1vZGVsX2Nsb2dsb2cpDQoNCmBgYA0KDQojIyAqKlBow6JuIHTDrWNoIGvhur90IHF14bqjIHRoZW8gdOG7q25nIG5ow7NtIGJp4bq/bioqDQoNClRyb25nIHBo4bqnbiBuw6B5LCB0YSDEkWkgc8OidSBwaMOibiB0w61jaCDDvSBuZ2jEqWEgdGjhu5FuZyBrw6ogdsOgIHRo4buxYyB0aeG7hW4gY+G7p2EgdOG7q25nIG5ow7NtIGJp4bq/biDEkeG7mWMgbOG6rXAgdHJvbmcgbcO0IGjDrG5oIENsb2dsb2cuIE3hu5dpIGjhu4cgc+G7kSBwaOG6o24gw6FuaCB0w6FjIMSR4buZbmcgY+G7p2EgYmnhur9uIMSR4buZYyBs4bqtcCB0xrDGoW5nIOG7qW5nIMSR4bq/biBsb2dbLWxvZygxIC0gUChsb2FuID0geWVzKSldLCB24bubaSBjw6FjIG5ow7NtIHRoYW0gY2hp4bq/dSDEkcOjIMSRxrDhu6NjIHjDoWMgxJHhu4tuaCByw7UuDQoNCioqQuG6o25nIHThu5VuZyBo4bujcCBjw6FjIGJp4bq/biBjw7Mgw70gbmdoxKlhIHRo4buRbmcga8OqIChtw7QgaMOsbmggQ2xvZ2xvZykqKg0KDQp8IEJp4bq/biAgICAgICAgICAgICAgIHwgTmjDs20gc28gc8OhbmggICAgICAgICAgICAgIHwgSOG7hyBz4buRICjOsikgfCBwLXZhbHVlICB8IGV4cCjOsikgKGhhemFyZCByYXRpbykgfCBEaeG7hW4NCiBnaeG6o2kgY2hpIHRp4bq/dCB8DQp8LS0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tfC0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLXwNCnwgam9ic3R1ZGVudCAgICAgICAgIHwgU28gduG7m2kgYWRtaW4uICAgICAgICAgICAgIHwgLTIuNTAgICAgIHwgMC4wMTMgICAgfCAwLjA4MiAgICAgICAgICAgICAgICAgIHwgU2luaCB2acOqbiBjw7MgeMOhYyBzdeG6pXQgdmF5IGPhu7FjIHRo4bqlcCAoaGF6YXJkIGNo4buJIGLhurFuZyA4LjIlIHNvIHbhu5tpIG5ow7NtIGjDoG5oIGNow61uaCkuIHwNCnwgam9idW5lbXBsb3llZCAgICAgIHwgU28gduG7m2kgYWRtaW4uICAgICAgICAgICAgIHwgLTAuNjMgICAgIHwgMC4wMzMgICAgfCAwLjUzICAgICAgICAgICAgICAgICAgIHwgTmfGsOG7nWkgdGjhuqV0IG5naGnhu4dwIGPDsyB4w6FjIHN14bqldCB2YXkgdGjhuqVwIGjGoW4ga2hv4bqjbmcgNDclLiB8DQp8IGpvYmVudHJlcHJlbmV1ciAgICB8IFNvIHbhu5tpIGFkbWluLiAgICAgICAgICAgICB8IDAuMzkgICAgICB8IDAuMDQ2ICAgIHwgMS40OCAgICAgICAgICAgICAgICAgICB8IE5nxrDhu51pIHThu7EgZG9hbmggY8OzIHjDoWMgc3XhuqV0IHZheSBjYW8gaMahbiA0OCUuIHwNCnwgZWR1Y2F0aW9uc2Vjb25kYXJ5IHwgU28gduG7m2kgcHJpbWFyeSAgICAgICAgICAgIHwgMC4zMCAgICAgIHwgMC4wMTYgICAgfCAxLjM1ICAgICAgICAgICAgICAgICAgIHwgTmfGsOG7nWkgaOG7jWMgdHJ1bmcgaOG7jWMgY8OzIHjDoWMgc3XhuqV0IHZheSBjYW8gaMahbiAzNSUgc28gduG7m2kgbmfGsOG7nWkgY2jhu4kgaOG7jWMgdGnhu4N1IGjhu41jLiB8DQp8IG1hcml0YWxzaW5nbGUgICAgICB8IFNvIHbhu5tpIGRpdm9yY2VkICAgICAgICAgICB8IC0wLjMwICAgICB8IDAuMDI2ICAgIHwgMC43NCAgICAgICAgICAgICAgICAgICB8IE5nxrDhu51pIMSR4buZYyB0aMOibiBjw7MgeMOhYyBzdeG6pXQgdmF5IHRo4bqlcCBoxqFuIGtob+G6o25nIDI2JS4gfA0KfCBkZWZhdWx0eWVzICAgICAgICAgfCBTbyB24bubaSBkZWZhdWx0ID0gbm8gICAgICAgfCAwLjgwICAgICAgfCA8MC4wMDEgICB8IDIuMjMgICAgICAgICAgICAgICAgICAgfCBOZ8aw4budaSBjw7MgbuG7oyB44bqldSBjw7MgeMOhYyBzdeG6pXQgdmF5IGNhbyBn4bqlcCAyLjIzIGzhuqduIG5nxrDhu51pIGtow7RuZyBjw7MgbuG7oyB44bqldS4gfA0KDQoqKlBoxrDGoW5nIHRyw6xuaCBDbG9nbG9nIMSRxrDhu6NjIMaw4bubYyBsxrDhu6NuZyBuaMawIHNhdSoqDQoNCioqY2xvZ2xvZyhQKGxvYW4gPSB5ZXMpKSA9IC0xLjY4IC0gMi41MMOXam9ic3R1ZGVudCAtIDAuNjPDl2pvYnVuZW1wbG95ZWQgKyAwLjM5w5dqb2JlbnRyZXByZW5ldXIgKyAwLjMww5dlZHVjYXRpb25zZWNvbmRhcnkgLSAwLjMww5dtYXJpdGFsc2luZ2xlICsgMC44MMOXZGVmYXVsdHllcyoqDQoNCi0tLQ0KDQoqKkjhu4cgc+G7kSBjaOG6t24gKEludGVyY2VwdCkqKg0KDQotIEjhu4cgc+G7kSA9ICoqLTEuNjgqKiAgDQotIEtoaSBraMOhY2ggaMOgbmcgdGh14buZYyBuaMOzbSB0aGFtIGNoaeG6v3UgKCpqb2IgPSBhZG1pbi4qLCAqZWR1Y2F0aW9uID0gcHJpbWFyeSosICptYXJpdGFsID0gZGl2b3JjZWQqLCAqZGVmYXVsdCA9IG5vKiksIGNsb2dsb2coUCkgPSAtMS42OCAgDQotIFjDoWMgc3XhuqV0IHTGsMahbmcg4bupbmc6IGAxIC0gZXhwKC1leHAoLTEuNjgpKSDiiYggMC4xOGAgIA0KLSDihpIgTmjDs20gdGhhbSBjaGnhur91IGPDsyB4w6FjIHN14bqldCB2YXkgdGnDqnUgZMO5bmcga2hv4bqjbmcgKioxOCUqKg0KDQotLS0NCg0KKipCaeG6v24gYGpvYnN0dWRlbnRgKioNCg0KLSBI4buHIHPhu5EgPSAqKi0yLjUwKiogIA0KLSBTbyB24bubaSBuaMOzbSBow6BuaCBjaMOtbmgsIHNpbmggdmnDqm4gY8OzIGNsb2dsb2coUCkgdGjhuqVwIGjGoW4gMi41MCAgDQotIFThu7cgc+G7kSBoYXphcmQgPSBgZXhwKC0yLjUwKSDiiYggMC4wODJgICANCi0g4oaSIFNpbmggdmnDqm4gKipy4bqldCDDrXQgdmF5IHRpw6p1IGTDuW5nKioNCg0KLS0tDQoNCioqQmnhur9uIGBqb2J1bmVtcGxveWVkYCoqDQoNCi0gSOG7hyBz4buRID0gKiotMC42MyoqICANCi0gU28gduG7m2kgbmjDs20gaMOgbmggY2jDrW5oLCBuZ8aw4budaSB0aOG6pXQgbmdoaeG7h3AgY8OzIGNsb2dsb2coUCkgdGjhuqVwIGjGoW4gMC42MyAgDQotIFThu7cgc+G7kSBoYXphcmQgPSBgZXhwKC0wLjYzKSDiiYggMC41M2AgIA0KLSDihpIgTmfGsOG7nWkgdGjhuqV0IG5naGnhu4dwICoqa2jDsyB0aeG6v3AgY+G6rW4gdmF5IGjGoW4qKg0KDQotLS0NCg0KKipCaeG6v24gYGpvYmVudHJlcHJlbmV1cmAqKg0KDQotIEjhu4cgc+G7kSA9ICoqMC4zOSoqICANCi0gU28gduG7m2kgbmjDs20gaMOgbmggY2jDrW5oLCBuZ8aw4budaSB04buxIGRvYW5oIGPDsyBjbG9nbG9nKFApIGNhbyBoxqFuIDAuMzkgIA0KLSBU4bu3IHPhu5EgaGF6YXJkID0gYGV4cCgwLjM5KSDiiYggMS40OGAgIA0KLSDihpIgTmfGsOG7nWkgdOG7sSBkb2FuaCAqKmPDsyB4dSBoxrDhu5tuZyB2YXkgbmhp4buBdSBoxqFuKioNCg0KLS0tDQoNCioqQmnhur9uIGBlZHVjYXRpb25zZWNvbmRhcnlgKioNCg0KLSBI4buHIHPhu5EgPSAqKjAuMzAqKiAgDQotIFNvIHbhu5tpIG5nxrDhu51pIGjhu41jIHRp4buDdSBo4buNYywgbmfGsOG7nWkgaOG7jWMgdHJ1bmcgaOG7jWMgY8OzIGNsb2dsb2coUCkgY2FvIGjGoW4gMC4zMCAgDQotIFThu7cgc+G7kSBoYXphcmQgPSBgZXhwKDAuMzApIOKJiCAxLjM1YCAgDQotIOKGkiBUcsOsbmggxJHhu5kgaOG7jWMgduG6pW4gdHJ1bmcgaOG7jWMgKip0xINuZyB4w6FjIHN14bqldCB2YXkgdGnDqnUgZMO5bmcqKg0KDQotLS0NCg0KKipCaeG6v24gYG1hcml0YWxzaW5nbGVgKioNCg0KLSBI4buHIHPhu5EgPSAqKi0wLjMwKiogIA0KLSBTbyB24bubaSBuZ8aw4budaSDEkcOjIGx5IGjDtG4sIG5nxrDhu51pIMSR4buZYyB0aMOibiBjw7MgY2xvZ2xvZyhQKSB0aOG6pXAgaMahbiAwLjMwICANCi0gVOG7tyBz4buRIGhhemFyZCA9IGBleHAoLTAuMzApIOKJiCAwLjc0YCAgDQotIOKGkiBOZ8aw4budaSDEkeG7mWMgdGjDom4gKirDrXQgdmF5IHRpw6p1IGTDuW5nIGjGoW4qKiBuZ8aw4budaSBseSBow7RuDQoNCi0tLQ0KDQoqKkJp4bq/biBgZGVmYXVsdHllc2AqKg0KDQotIEjhu4cgc+G7kSA9ICoqMC44MCoqICANCi0gU28gduG7m2kgbmfGsOG7nWkga2jDtG5nIGPDsyBu4bujIHjhuqV1LCBuZ8aw4budaSBjw7MgbuG7oyB44bqldSBjw7MgY2xvZ2xvZyhQKSBjYW8gaMahbiAwLjgwICANCi0gVOG7tyBz4buRIGhhemFyZCA9IGBleHAoMC44MCkg4omIIDIuMjNgICANCi0g4oaSIE5nxrDhu51pIGPDsyBu4bujIHjhuqV1ICoqY8OzIHjDoWMgc3XhuqV0IHZheSBjYW8gaMahbioqLCBuZ8aw4bujYyBr4buzIHbhu41uZyBuaMawbmcgbmjhuqV0IHF1w6FuIHF1YSBjw6FjIG3DtCBow6xuaA0KDQotLS0NCg0KKipL4bq/dCBsdeG6rW4gY2h1bmcgdOG7qyBtw7QgaMOsbmggQ2xvZ2xvZyoqDQoNCkPDoWMgYmnhur9uIGBqb2JzdHVkZW50YCwgYGpvYnVuZW1wbG95ZWRgLCBgam9iZW50cmVwcmVuZXVyYCwgYGVkdWNhdGlvbnNlY29uZGFyeWAsIGBtYXJpdGFsc2luZ2xlYCwgdsOgIGBkZWZhdWx0eWVzYCDEkeG7gXUg4bqjbmggaMaw4bufbmcgY8OzIMO9IG5naMSpYSB0aOG7kW5nIGvDqiDEkeG6v24ga2jhuqMgbsSDbmcgdmF5IHRpw6p1IGTDuW5nLiAgDQpNw7QgaMOsbmggY2xvZ2xvZyBwaMO5IGjhu6NwIGtoaSB4w6FjIHN14bqldCB44bqjeSByYSBz4buxIGtp4buHbiB0aOG6pXAsIHbDoCBr4bq/dCBxdeG6oyB0aHUgxJHGsOG7o2Mga2jDoSBuaOG6pXQgcXXDoW4gduG7m2kgbcO0IGjDrG5oIGxvZ2l0IHbDoCBwcm9iaXQuICANCuKGkiBHacO6cCB0xINuZyDEkeG7mSB0aW4gY+G6rXkgdHJvbmcgcGjDom4gdMOtY2ggdsOgIHJhIHF1eeG6v3QgxJHhu4tuaC4NCg0KDQotLS0NCg0KIyAqKlNPIFPDgU5IIEPDgUMgQ0jhu4ggU+G7kCBD4bumQSBCQSBNw5QgSMOMTkgqKg0KDQpgYGB7ciBtb2RlbF9jb21wYXJpc29uLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KDQojIFNvIHPDoW5oIEFJQyBnaeG7r2EgY8OhYyBtw7QgaMOsbmgNCmFpY19yZXN1bHRzIDwtIEFJQyhtb2RlbF9sb2dpdCwgbW9kZWxfcHJvYml0LCBtb2RlbF9jbG9nbG9nKQ0KDQojIFNvIHPDoW5oIExvZy1MaWtlbGlob29kDQpsbF9sb2dpdCA8LSBsb2dMaWsobW9kZWxfbG9naXQpDQpsbF9wcm9iaXQgPC0gbG9nTGlrKG1vZGVsX3Byb2JpdCkNCmxsX2Nsb2dsb2cgPC0gbG9nTGlrKG1vZGVsX2Nsb2dsb2cpDQoNCiMgQ8OgaSBnw7NpIHbDoCB0w61uaCBQc2V1ZG8gUsKyDQppZiAoIXJlcXVpcmUocHNjbCkpIGluc3RhbGwucGFja2FnZXMoInBzY2wiKQ0KbGlicmFyeShwc2NsKQ0KDQpyMl9sb2dpdCA8LSBwUjIobW9kZWxfbG9naXQpWyJNY0ZhZGRlbiJdDQpyMl9wcm9iaXQgPC0gcFIyKG1vZGVsX3Byb2JpdClbIk1jRmFkZGVuIl0NCnIyX2Nsb2dsb2cgPC0gcFIyKG1vZGVsX2Nsb2dsb2cpWyJNY0ZhZGRlbiJdDQoNCiMgVOG7lW5nIGjhu6NwIGvhur90IHF14bqjIHbDoG8gYuG6o25nDQpjb21wYXJpc29uX3RhYmxlIDwtIGRhdGEuZnJhbWUoDQogIE1vZGVsID0gYygiTG9naXQiLCAiUHJvYml0IiwgIkNsb2dsb2ciKSwNCiAgQUlDID0gcm91bmQoYWljX3Jlc3VsdHMkQUlDLCAyKSwNCiAgTG9nTGlrZWxpaG9vZCA9IGMocm91bmQobGxfbG9naXRbMV0sIDIpLA0KICAgICAgICAgICAgICAgICAgICByb3VuZChsbF9wcm9iaXRbMV0sIDIpLA0KICAgICAgICAgICAgICAgICAgICByb3VuZChsbF9jbG9nbG9nWzFdLCAyKSksDQogIE1jRmFkZGVuX1IyID0gcm91bmQoYyhyMl9sb2dpdCwgcjJfcHJvYml0LCByMl9jbG9nbG9nKSwgNCkNCikNCg0KIyBIaeG7g24gdGjhu4sgYuG6o25nIGvhur90IHF14bqjDQprbml0cjo6a2FibGUoY29tcGFyaXNvbl90YWJsZSwgY2FwdGlvbiA9ICJTbyBzw6FuaCBiYSBtw7QgaMOsbmggbmjhu4sgcGjDom4iKQ0KDQpgYGANCg0KKipOaOG6rW4geMOpdCoqDQoNCsSQ4buDIGzhu7FhIGNo4buNbiBtw7QgaMOsbmggaOG7k2kgcXV5IG5o4buLIHBow6JuIHBow7kgaOG7o3AsIGJhIG3DtCBow6xuaCDEkcaw4bujYyDEkcOhbmggZ2nDoSB0aGVvIGPDoWMgdGnDqnUgY2jDrTogQWthaWtlIEluZm9ybWF0aW9uIENyaXRlcmlvbiAoQUlDKSwgTG9nLUxpa2VsaWhvb2QgdsOgIFBzZXVkbyBSwrIgY+G7p2EgTWNGYWRkZW4uDQoNCi0gQUlDOiBNw7QgaMOsbmggbG9naXQgdsOgIHByb2JpdCDEkeG7gXUgY8OzIGdpw6EgdHLhu4sgQUlDIHRo4bqlcCBuaOG6pXQgKDM3MzIuMjYpLCBjaG8gdGjhuqV5IMSR4buZIHBow7kgaOG7o3AgbcO0IGjDrG5oIHTGsMahbmcgxJHGsMahbmcgdsOgIHThu5F0IGjGoW4gbcO0IGjDrG5oIGNsb2dsb2cgKDM3MzIuNTMpLg0KDQotIExvZy1MaWtlbGlob29kOiBIYWkgbcO0IGjDrG5oIGxvZ2l0IHbDoCBwcm9iaXQgY8O5bmcgxJHhuqF0IGdpw6EgdHLhu4sgbG9nLWxpa2VsaWhvb2QgY2FvIGjGoW4gbeG7mXQgY2jDunQgc28gduG7m2kgY2xvZ2xvZyAow610IMOibSBoxqFuKSwgcGjhuqNuIMOhbmgga2jhuqMgbsSDbmcga2jhu5twIGThu68gbGnhu4d1IHThu5F0IGjGoW4gbmjhurkuDQoNCi0gTWNGYWRkZW7igJlzIFLCsjogQ+G6oyBsb2dpdCB2w6AgcHJvYml0IGPDsyBjw7luZyBnacOhIHRy4buLIFLCsiBsw6AgMC4wMjE1LCBuaOG7iW5oIGjGoW4gc28gduG7m2kgY2xvZ2xvZyAoMC4wMjE0KS4gVHV5IG5oacOqbiwgY8OhYyBnacOhIHRy4buLIG7DoHkgxJHhu4F1IHTGsMahbmcgxJHhu5FpIHRo4bqlcCwgcGjhuqNuIMOhbmgga2jhuqMgbsSDbmcgZ2nhuqNpIHRow61jaCBiaeG6v24gcGjhu6UgdGh14buZYyBjw7JuIGjhuqFuIGNo4bq/Lg0KDQoqKkvhur90IGx14bqtbioqDQoNClRyb25nIGLhu5FpIGPhuqNuaCBiYSBtw7QgaMOsbmggY8OzIGhp4buHdSBxdeG6oyBk4buxIMSRb8OhbiBn4bqnbiBuaMawIHTGsMahbmcgxJHGsMahbmcsIG3DtCBow6xuaCBsb2dpdCDEkcaw4bujYyB4ZW0gbMOgIGzhu7FhIGNo4buNbiBwaMO5IGjhu6NwIGjGoW4uIERvIMSRw7MsIG3DtCBow6xuaCBsb2dpdCBz4bq9IMSRxrDhu6NjIHPhu60gZOG7pW5nIGNobyBjw6FjIHBow6JuIHTDrWNoIHbDoCBzdXkgbHXhuq1uIHRp4bq/cCB0aGVvIHRyb25nIG5naGnDqm4gY+G7qXUgbsOgeS4NCg0KLS0tDQoNCg0KDQoNCg0KDQoNCg0KDQo=