library(tidyverse)
library(ggplot2)
library(epitools)
library(DescTools)
library(DT)
library(energy)
library(readxl)

1.Về Bộ Dữ Liệu

Mô tả

Bộ dữ liệu có tên “A Statistical Research on the Effects of Mental Health on Students’ CGPA” được thu thập thông qua khảo sát trực tuyến bằng Google Forms với đối tượng là sinh viên tại Đại học Hồi giáo Quốc tế Malaysia (International Islamic University Malaysia - IIUM). Mục tiêu của nghiên cứu là phân tích mối quan hệ giữa sức khỏe tinh thần (mental health) và kết quả học tập (CGPA) của sinh viên.

Bộ dữ liệu nhằm hỗ trợ nghiên cứu mối liên hệ giữa các yếu tố liên quan đến sức khỏe tinh thần – như mức độ căng thẳng, lo âu, trầm cảm – với kết quả học tập (thể hiện qua điểm trung bình tích lũy – CGPA) của sinh viên. Đây là một vấn đề mang tính thời sự, đặc biệt trong bối cảnh học tập áp lực và các vấn đề tâm lý ngày càng được quan tâm trong môi trường đại học.

#Đọc dữ liệu từ file CSV
data <- read.csv("C:/Users/Hoang Quyen/Downloads/Student Mental health.csv")
#Hiển thị cấu trúc dữ liệu
str(data)
## 'data.frame':    101 obs. of  11 variables:
##  $ Timestamp                                   : chr  "8/7/2020 12:02" "8/7/2020 12:04" "8/7/2020 12:05" "8/7/2020 12:06" ...
##  $ Choose.your.gender                          : chr  "Female" "Male" "Male" "Female" ...
##  $ Age                                         : int  18 21 19 22 23 19 23 18 19 18 ...
##  $ What.is.your.course.                        : chr  "Engineering" "Islamic education" "BIT" "Laws" ...
##  $ Your.current.year.of.Study                  : chr  "year 1" "year 2" "Year 1" "year 3" ...
##  $ What.is.your.CGPA.                          : chr  "3.00 - 3.49" "3.00 - 3.49" "3.00 - 3.49" "3.00 - 3.49" ...
##  $ Marital.status                              : chr  "No" "No" "No" "Yes" ...
##  $ Do.you.have.Depression.                     : chr  "Yes" "No" "Yes" "Yes" ...
##  $ Do.you.have.Anxiety.                        : chr  "No" "Yes" "Yes" "No" ...
##  $ Do.you.have.Panic.attack.                   : chr  "Yes" "No" "Yes" "No" ...
##  $ Did.you.seek.any.specialist.for.a.treatment.: chr  "No" "No" "No" "No" ...
View(data)
#Hiển thị 5 dòng đầu và cuối
head(data, 5)
##        Timestamp Choose.your.gender Age What.is.your.course.
## 1 8/7/2020 12:02             Female  18          Engineering
## 2 8/7/2020 12:04               Male  21    Islamic education
## 3 8/7/2020 12:05               Male  19                  BIT
## 4 8/7/2020 12:06             Female  22                 Laws
## 5 8/7/2020 12:13               Male  23         Mathemathics
##   Your.current.year.of.Study What.is.your.CGPA. Marital.status
## 1                     year 1        3.00 - 3.49             No
## 2                     year 2        3.00 - 3.49             No
## 3                     Year 1        3.00 - 3.49             No
## 4                     year 3        3.00 - 3.49            Yes
## 5                     year 4        3.00 - 3.49             No
##   Do.you.have.Depression. Do.you.have.Anxiety. Do.you.have.Panic.attack.
## 1                     Yes                   No                       Yes
## 2                      No                  Yes                        No
## 3                     Yes                  Yes                       Yes
## 4                     Yes                   No                        No
## 5                      No                   No                        No
##   Did.you.seek.any.specialist.for.a.treatment.
## 1                                           No
## 2                                           No
## 3                                           No
## 4                                           No
## 5                                           No
tail(data, 5)
##               Timestamp Choose.your.gender Age What.is.your.course.
## 97  13/07/2020 19:56:49             Female  21                  BCS
## 98  13/07/2020 21:21:42               Male  18          Engineering
## 99  13/07/2020 21:22:56             Female  19             Nursing 
## 100 13/07/2020 21:23:57             Female  23     Pendidikan Islam
## 101 18/07/2020 20:16:21               Male  20   Biomedical science
##     Your.current.year.of.Study What.is.your.CGPA. Marital.status
## 97                      year 1        3.50 - 4.00             No
## 98                      Year 2        3.00 - 3.49             No
## 99                      Year 3        3.50 - 4.00            Yes
## 100                     year 4        3.50 - 4.00             No
## 101                     Year 2        3.00 - 3.49             No
##     Do.you.have.Depression. Do.you.have.Anxiety. Do.you.have.Panic.attack.
## 97                       No                  Yes                        No
## 98                      Yes                  Yes                        No
## 99                      Yes                   No                       Yes
## 100                      No                   No                        No
## 101                      No                   No                        No
##     Did.you.seek.any.specialist.for.a.treatment.
## 97                                            No
## 98                                            No
## 99                                            No
## 100                                           No
## 101                                           No

Bộ dữ liệu được thu thập thông qua khảo sát sinh viên tại Đại học Hồi giáo Quốc tế Malaysia (IIUM) với mục tiêu phân tích mối quan hệ giữa sức khỏe tinh thần và kết quả học tập. Dữ liệu bao gồm 101 quan sát, tương ứng với 101 sinh viên, và **11 biến*

Các biến được phân loại như sau:

  • Biến định lượng (1 biến):

  • Age: Tuổi hiện tại của sinh viên (kiểu số thực, liên tục).

  • Biến định tính (10 biến):

    • Trong đó có:

    • 2 biến định tính có thứ bậc (ordinal):

    • What is your CGPA?: Điểm trung bình tích lũy, được ghi nhận theo các khoảng giá trị.

  • Your current year of Study: Năm học hiện tại (Year 1 đến Year 4+).

  • 8 biến định tính định danh (nominal):

    • Bao gồm các thông tin cá nhân, tình trạng sức khỏe tinh thần, tình trạng hôn nhân,…
Tên biến Loại dữ liệu Mô tả ngắn
Timestamp Định tính Thời gian sinh viên hoàn thành khảo sát.
Choose your gender Định tính Giới tính của sinh viên.
Age Định lượng Tuổi hiện tại của sinh viên.
What is your course? Định tính Ngành học của sinh viên.
Your current year of Study Định tính Năm học hiện tại của sinh viên.
What is your CGPA? Định tính Điểm trung bình tích lũy, được ghi nhận theo nhóm CGPA.
Marital status Định tính Tình trạng hôn nhân của sinh viên.
Do you have Depression? Định tính Sinh viên có bị trầm cảm hay không.
Do you have Anxiety? Định tính Sinh viên có bị lo âu hay không.
Do you have Panic attack? Định tính Sinh viên có từng trải qua cơn hoảng loạn hay không.
Did you seek any specialist for a treatment? Định tính Sinh viên có từng tìm đến chuyên gia tâm lý hay không.
# Đổi tên các biến cho gọn gàng, dễ xử lý
names(data)[names(data) == "Timestamp"] <- "timestamp"
names(data)[names(data) == "Choose.your.gender"] <- "Gender"
names(data)[names(data) == "Age"] <- "age"
names(data)[names(data) == "What.is.your.course."] <- "Course"
names(data)[names(data) == "Your.current.year.of.Study"] <- "Year_of_Study"
names(data)[names(data) == "What.is.your.CGPA."] <- "cgpa"
names(data)[names(data) == "Marital.status"] <- "Marital_status"
names(data)[names(data) == "Do.you.have.Depression."] <- "Depression"
names(data)[names(data) == "Do.you.have.Anxiety."] <- "Anxiety"
names(data)[names(data) == "Do.you.have.Panic.attack."] <- "Panic_attack"
names(data)[names(data) == "Did.you.seek.any.specialist.for.a.treatment."] <- "seek_treatment"
names(data)
##  [1] "timestamp"      "Gender"         "age"            "Course"        
##  [5] "Year_of_Study"  "cgpa"           "Marital_status" "Depression"    
##  [9] "Anxiety"        "Panic_attack"   "seek_treatment"

Thang phân nhóm CGPA**

Để thuận tiện cho việc phân tích và so sánh, biến CGPA đã được phân nhóm thành 5 cấp độ học lực như sau:

Khoảng CGPA Mức học lực
0.00 – 1.99 Weak (Yếu)
2.00 – 2.49 Below Average (Trung bình dưới)
2.50 – 2.99 Average (Trung bình)
3.00 – 3.49 Good (Khá)
3.50 – 4.00 Excellent (Giỏi)

Việc phân nhóm giúp xác định xu hướng học lực theo các yếu tố sức khỏe tinh thần và dễ dàng trình bày kết quả thống kê mô tả hoặc hồi quy thứ bậc.

unique(data$cgpa)
## [1] "3.00 - 3.49"  "3.50 - 4.00"  "3.50 - 4.00 " "2.50 - 2.99"  "2.00 - 2.49" 
## [6] "0 - 1.99"
# Cách dùng base R với ifelse lồng nhau
data$cgpa_level <- ifelse(data$cgpa == "0 - 1.99", "Weak",
                   ifelse(data$cgpa == "2.00 - 2.49", "Below Average",
                   ifelse(data$cgpa == "2.50 - 2.99", "Average",
                   ifelse(data$cgpa == "3.00 - 3.49", "Good",
                   ifelse(data$cgpa == "3.50 - 4.00", "Excellent", NA)))))
names(data)
##  [1] "timestamp"      "Gender"         "age"            "Course"        
##  [5] "Year_of_Study"  "cgpa"           "Marital_status" "Depression"    
##  [9] "Anxiety"        "Panic_attack"   "seek_treatment" "cgpa_level"
data$Year_of_Study <- dplyr::recode(data$Year_of_Study,
  "year 1" = "Year 1",
  "Year 1" = "Year 1",
  "year 2" = "Year 2",
  "Year 2" = "Year 2",
  "year 3" = "Year 3",
  "Year 3" = "Year 3",
  "year 4" = "Year 4",
  "Year 4" = "Year 4"
)
# Danh sách tên các biến định tính
categorical_vars <- c( "Gender", "Course", "Year_of_Study", "Marital_status",
                      "Depression", "Anxiety", "Panic_attack", "seek_treatment", "cgpa_level")

# Chuyển tất cả thành factor
data[categorical_vars] <- lapply(data[categorical_vars], as.factor)
str(data)
## 'data.frame':    101 obs. of  12 variables:
##  $ timestamp     : chr  "8/7/2020 12:02" "8/7/2020 12:04" "8/7/2020 12:05" "8/7/2020 12:06" ...
##  $ Gender        : Factor w/ 2 levels "Female","Male": 1 2 2 1 2 2 1 1 1 2 ...
##  $ age           : int  18 21 19 22 23 19 23 18 19 18 ...
##  $ Course        : Factor w/ 49 levels "Accounting ",..: 19 25 9 36 39 19 42 4 22 24 ...
##  $ Year_of_Study : Factor w/ 4 levels "Year 1","Year 2",..: 1 2 1 3 4 2 2 1 2 1 ...
##  $ cgpa          : chr  "3.00 - 3.49" "3.00 - 3.49" "3.00 - 3.49" "3.00 - 3.49" ...
##  $ Marital_status: Factor w/ 2 levels "No","Yes": 1 1 1 2 1 1 2 1 1 1 ...
##  $ Depression    : Factor w/ 2 levels "No","Yes": 2 1 2 2 1 1 2 1 1 1 ...
##  $ Anxiety       : Factor w/ 2 levels "No","Yes": 1 2 2 1 1 1 1 2 1 2 ...
##  $ Panic_attack  : Factor w/ 2 levels "No","Yes": 2 1 2 1 1 2 2 1 1 2 ...
##  $ seek_treatment: Factor w/ 2 levels "No","Yes": 1 1 1 1 1 1 1 1 1 1 ...
##  $ cgpa_level    : Factor w/ 5 levels "Average","Below Average",..: 4 4 4 4 4 3 NA 3 1 3 ...

2. THỐNG KÊ MÔ TẢ

2.1 Depression (Trầm cảm)

# Tần suất
freq_dep <- table(data$Depression)

# Tỷ lệ phần trăm
percent_dep <- round(prop.table(freq_dep) * 100, 2)

# Kết hợp tần suất và phần trăm thành 1 bảng
summary_table <- data.frame(
  Mức_độ = names(freq_dep),
  Tần_suất = as.vector(freq_dep),
  Tỷ_lệ_phần_trăm = as.vector(percent_dep)
)

# In bảng
cat("📋 Bảng tần suất và tỷ lệ phần trăm cho Depression:\n")
## 📋 Bảng tần suất và tỷ lệ phần trăm cho Depression:
print(summary_table, row.names = FALSE)
##  Mức_độ Tần_suất Tỷ_lệ_phần_trăm
##      No       66           65.35
##     Yes       35           34.65

Kết quả

  • Trong 101 sinh viên tham gia khảo sát, có 66 sinh viên (65.35%) không có biểu hiện trầm cảm.

  • Có 35 sinh viên cho biết họ có biểu hiện trầm cảm, chiểm 34.65% số người tham gia khảo sát.

# Biểu đồ
library(ggplot2)
## Warning: package 'ggplot2' was built under R version 4.4.3
ggplot(data, aes(x = Depression, fill = Depression)) +
  geom_bar() +
  labs(title = "Tần suất Trầm cảm (Depression)", x = "Trầm cảm", y = "Số lượng") +
  scale_fill_manual(values = c("steelblue", "salmon")) +
  theme_minimal()

Nhận xét * Dựa vào biểu đồ ta thấy số sinh viên không bị trầm cảm gần gấp dôi số sinh viên có trầm cảm. Kết hợp với kết quả thống kê trên cho thấy tỷ lệ sinh viên có biểu hiện trầm cảm chiếm khoảng 1/3 tổng mẫu khảo sát. Đây là một vấn đề sức khỏe tâm thần cần được theo dõi và phân tích sâu hơn, đặc biệt khi nghiên cứu các yếu tố ảnh hưởng đến học tập và đời sống sinh viên.

2.2 Anxiety (Lo âu)

# Tần suất
freq_anx <- table(data$Anxiety)

# Tỷ lệ phần trăm
percent_anx <- round(prop.table(freq_anx) * 100, 2)
# Tạo bảng tổng hợp
summary_anx <- data.frame(
  Mức_độ = names(freq_anx),
  Tần_suất = as.vector(freq_anx),
  Tỷ_lệ_phần_trăm = as.vector(percent_anx)
)

# In bảng đẹp
cat("\n📋 Bảng tổng hợp tần suất và tỷ lệ phần trăm cho Anxiety:\n")
## 
## 📋 Bảng tổng hợp tần suất và tỷ lệ phần trăm cho Anxiety:
print(summary_anx, row.names = FALSE)
##  Mức_độ Tần_suất Tỷ_lệ_phần_trăm
##      No       67           66.34
##     Yes       34           33.66

Nhận xét

Trong tổng số 101 sinh viên tham gia khảo sát:

  • Có 67 sinh viên (chiếm 66.34%) cho biết không có biểu hiện lo âu.

  • Ngược lại, có 34 sinh viên (chiếm 33.66%) cho biết có biểu hiện lo âu.

# Biểu đồ
ggplot(data, aes(x = Anxiety, fill = Anxiety)) +
  geom_bar() +
  labs(title = "Tần suất Lo âu (Anxiety)", x = "Lo âu", y = "Số lượng") +
  scale_fill_manual(values = c("skyblue", "lightyellow")) +
  theme_minimal()

Nhận xét * Dựa vào biểu đồ trên cho thấy số lượng sinh viên có biểu hiện lo âu thấp hơn sinh viên không có biểu hiển lo âu trong mẫu quan sát. Kết hợp với phần thống kê mô tả trước đó cho thấy, tỷ lệ sinh viên có biểu hiện lo âu chiếm khoảng 1/3 tổng số mẫu khảo sát, cho thấy đây là một vấn đề tâm lý đáng lưu ý trong cộng đồng sinh viên. Mặc dù phần lớn sinh viên không gặp phải tình trạng này, tỷ lệ sinh viên lo âu vẫn đủ lớn để cần được quan tâm trong các phân tích tiếp theo, đặc biệt khi đánh giá tác động đến kết quả học tập và chất lượng cuộc sống.

3. THỐNG KÊ SUY DIỄN

3.1 Depression

Mục tiêu kiểm định

Xác định xem tỷ lệ sinh viên có biểu hiện trầm cảmkhác với một tỷ lệ giả định ban đầu (50%) hay không. Biến Depression được mã hóa là "Yes" hoặc "No", với:

  • \(x = 35\): số sinh viên có biểu hiện trầm cảm
  • \(n = 101\): tổng số sinh viên có dữ liệu hợp lệ

Giả thuyết thống kê được đặt như sau :

\[ \begin{cases} H_0: p = 0.5 & \text{(Tỷ lệ sinh viên bị trầm cảm bằng 50%)} \\ H_1: p \ne 0.5 & \text{(Tỷ lệ sinh viên bị trầm cảm khác 50%)} \end{cases} \]

x <- sum(data$Depression == "Yes")
n <- sum(!is.na(data$Depression))

# Kiểm định 1 tỷ lệ (H0: p = 0.5)
prop.test(x = x, n = n, p = 0.5, alternative = "two.sided")
## 
##  1-sample proportions test with continuity correction
## 
## data:  x out of n, null probability 0.5
## X-squared = 8.9109, df = 1, p-value = 0.002835
## alternative hypothesis: true p is not equal to 0.5
## 95 percent confidence interval:
##  0.2564252 0.4484779
## sample estimates:
##         p 
## 0.3465347

Kết quả

  • Tỷ lệ mẫu:

\[ \hat{p} = \frac{35}{101} \approx 0.3465 \text{ (tức 34.65%)} \]

  • Giá trị thống kê kiểm định (chi bình phương): \(X^2 = 8.9109\)

  • p-value: \(\text{p-value} = 0.002835\)

  • Khoảng tin cậy 95% cho tỷ lệ p:

\[ (0.2564; \, 0.4485) \]

  • Vì p-value = 0.002835 < 0.05, ta bác bỏ giả thuyết H₀ ở mức ý nghĩa 5%.

  • Có bằng chứng thống kê cho thấy tỷ lệ sinh viên bị trầm cảm khác 50%.

  • Khoảng tin cậy 95% cho tỷ lệ thực tế nằm trong khoảng 25.6% đến 44.85%, không bao gồm 50%, càng củng cố kết luận bác bỏ H₀.

  • Tỷ lệ mẫu là 34.65%, tức là trầm cảm là vấn đề hiện hữu nhưng không chiếm đa số trong mẫu khảo sát.

    Với mức ý nghĩa 5%, có đủ bằng chứng thống kê để bác bỏ giả thuyết rằng tỷ lệ sinh viên bị trầm cảm là 50%. Tỷ lệ trầm cảm thực tế ước tính là khoảng 34.65%, với khoảng tin cậy 95% nằm trong [25.6%, 44.9%]. Điều này cho thấy rằng tỷ lệ trầm cảm trong cộng đồng sinh viên khảo sát thấp hơn đáng kể so với giả định 50% ban đầu.

3.2 Anxiety

Mục tiêu là kiểm định xem tỷ lệ sinh viên có biểu hiện lo âu có khác với tỷ lệ giả định là 50% hay không.

Từ dữ liệu:

  • Biến Anxiety được mã hóa với hai giá trị "Yes" hoặc "No".
  • \(x_2 = 34\): số sinh viên có biểu hiện lo âu.
  • \(n_2 = 101\): tổng số sinh viên có dữ liệu hợp lệ.

Giả thuyết thống kê \[ \begin{cases} H_0: p = 0.5 & \text{(Tỷ lệ sinh viên bị lo âu bằng 50%)} \\ H_1: p \ne 0.5 & \text{(Tỷ lệ sinh viên bị lo âu khác 50%)} \end{cases} \]

x2 <- sum(data$Anxiety == "Yes")
n2 <- sum(!is.na(data$Anxiety))
# Kiểm định p > 0.5
prop.test(x = x2, n = n2, p = 0.5, alternative = "two.sided")
## 
##  1-sample proportions test with continuity correction
## 
## data:  x2 out of n2, null probability 0.5
## X-squared = 10.139, df = 1, p-value = 0.001452
## alternative hypothesis: true p is not equal to 0.5
## 95 percent confidence interval:
##  0.2475169 0.4383520
## sample estimates:
##         p 
## 0.3366337

Kết quả * Tỷ lệ mẫu:

\[ \hat{p} = \frac{34}{101} \approx 0.3366 \text{ (tức 33.66%)} \]

  • Giá trị thống kê kiểm định (Chi-squared): \(X^2 = 10.139\)

  • p-value: \(p = 0.001452\)

  • Khoảng tin cậy 95% cho tỷ lệ p:

\[ (0.2475; \, 0.4384) \]

  • p-value = 0.001452 < 0.05, ta bác bỏ giả thuyết H₀ ở mức ý nghĩa 5%.
  • bằng chứng thống kê cho thấy tỷ lệ sinh viên có biểu hiện lo âu khác 50%.
  • Khoảng tin cậy 95% cho tỷ lệ thực tế là từ 24.75% đến 43.84%, không chứa giá trị 0.5.
  • Tỷ lệ mẫu là 33.66%, tức là khoảng 1/3 sinh viên có biểu hiện lo âu.

Kết quả kiểm định chỉ ra rằng với mức ý nghĩa 5%, có đủ bằng chứng để bác bỏ giả thuyết rằng tỷ lệ sinh viên có biểu hiện lo âu là 50%. Tỷ lệ lo âu thực tế ước tính là khoảng 33.66%, với khoảng tin cậy 95% từ 24.75% đến 43.84%, thấp hơn đáng kể 50%. Điều này cho thấy vấn đề lo âu là hiện hữu nhưng không chiếm đa số trong nhóm sinh viên khảo sát.

4. MỐI LIÊN HỆ GIỮA 2 BIẾN

4.1 Depression và Gender

# Bảng chéo
tbl <- table(data$Gender, data$Depression)
addmargins(tbl)
##         
##           No Yes Sum
##   Female  46  29  75
##   Male    20   6  26
##   Sum     66  35 101

Tỷ lệ trầm cảm theo giới:

  • Tỷ lệ trầm cảm theo giới tính nữ: \(\frac{29}{75} \approx 38.7\%\)
  • Tỷ lệ trầm cảm theo giới tính nam: \(\frac{6}{26} \approx 23.1\%\)
# Chi bình phương
chisq.test(tbl)
## 
##  Pearson's Chi-squared test with Yates' continuity correction
## 
## data:  tbl
## X-squared = 1.4409, df = 1, p-value = 0.23

Kết quả * Chi-squared = 1.4409, df = 1 * p-value = 0.23

Diễn giải:

  • Với \(p = 0.23 > 0.05\), không đủ bằng chứng để bác bỏ H₀.
  • Tức là, chưa có bằng chứng thống kê cho thấy có mối liên hệ giữa giới tính và tình trạng trầm cảm.
  • Nói cách khác, tỷ lệ trầm cảm giữa nam và nữ khác nhau về mặt quan sát, nhưng chưa khác nhau có ý nghĩa thống kê.
# Hiệu hai tỷ lệ
prop.test(c(tbl["Female", "Yes"], tbl["Male", "Yes"]),
          c(sum(tbl["Female", ]), sum(tbl["Male", ])))
## 
##  2-sample test for equality of proportions with continuity correction
## 
## data:  c(tbl["Female", "Yes"], tbl["Male", "Yes"]) out of c(sum(tbl["Female", ]), sum(tbl["Male", ]))
## X-squared = 1.4409, df = 1, p-value = 0.23
## alternative hypothesis: two.sided
## 95 percent confidence interval:
##  -0.06589412  0.37768899
## sample estimates:
##    prop 1    prop 2 
## 0.3866667 0.2307692
  • Tỷ lệ trầm cảm ở nữ (p1) = 0.3867, ở nam (p2) = 0.2308
  • Hiệu tỷ lệ ước lượng = 15.6%
    • 95% CI của hiệu tỷ lệ: (-6.6%, 37.8%)

    • p-value = 0.23

      Giải thích:

      • Khoảng tin cậy bao gồm 0 ⇒ không có sự khác biệt có ý nghĩa thống kê giữa 2 giới.
    • Kết quả này phù hợp với kiểm định chi-squared ở trên.

library(epitools)
library(DescTools)             # chạy mỗi khi mở lại R
## Warning: package 'DescTools' was built under R version 4.4.3
# Tính Risk Ratio (RR)
riskratio(tbl)
## $data
##         
##          No Yes Total
##   Female 46  29    75
##   Male   20   6    26
##   Total  66  35   101
## 
## $measure
##         risk ratio with 95% C.I.
##          estimate     lower    upper
##   Female 1.000000        NA       NA
##   Male   0.596817 0.2798223 1.272917
## 
## $p.value
##         two-sided
##          midp.exact fisher.exact chi.square
##   Female         NA           NA         NA
##   Male    0.1574026    0.2312876  0.1500096
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "Unconditional MLE & normal approximation (Wald) CI"
  • RR (Male vs Female) = 0.597

    • 95% CI: (0.280; 1.273)
    • p-value (chi-square) = 0.15

    Diễn giải:

    • Sinh viên nam có nguy cơ bị trầm cảm thấp hơn 40.3% so với nữ, nhưng khoảng tin cậy chứa giá trị 1, nên không có ý nghĩa thống kê.
  • p-value = 0.15 > 0.05 ⇒ không đủ bằng chứng để kết luận sự khác biệt về nguy cơ.

# Tính Odds Ratio (OR)
oddsratio(tbl)
## $data
##         
##          No Yes Total
##   Female 46  29    75
##   Male   20   6    26
##   Total  66  35   101
## 
## $measure
##         odds ratio with 95% C.I.
##           estimate     lower    upper
##   Female 1.0000000        NA       NA
##   Male   0.4859993 0.1591083 1.306885
## 
## $p.value
##         two-sided
##          midp.exact fisher.exact chi.square
##   Female         NA           NA         NA
##   Male    0.1574026    0.2312876  0.1500096
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "median-unbiased estimate & mid-p exact CI"
  • OR (Male vs Female) = 0.486

    • 95% CI: (0.159; 1.307)
    • p-value = 0.15

    Diễn giải:

    • Sinh viên nam có odds trầm cảm thấp hơn 51.4% so với nữ (odds là xác suất bị trầm cảm chia cho không bị).
    • Tuy nhiên, khoảng tin cậy chứa 1, và p-value > 0.05 ⇒ không có ý nghĩa thống kê.

    Mặc dù tỷ lệ sinh viên nữ có biểu hiện trầm cảm cao hơn sinh viên nam trong quan sát (38.7% vs. 23.1%), nhưng kết quả các kiểm định thống kê (Chi-squared, kiểm định hai tỷ lệ, RR, OR) đều cho thấy sự khác biệt này chưa có ý nghĩa thống kê tại mức α = 5%. Do đó, chưa có đủ bằng chứng để kết luận rằng giới tính có ảnh hưởng đến tỷ lệ trầm cảm trong mẫu khảo sát này.

4.2 Anxiety và Marital_status

tbl2 <- table(data$Marital_status, data$Anxiety)
addmargins(tbl2)
##      
##        No Yes Sum
##   No   58  27  85
##   Yes   9   7  16
##   Sum  67  34 101

Trong 101 sinh viên:

  • 16 người đã kết hôn, trong đó 7 người (43.75%) có lo âu.
  • 85 người độc thân, trong đó 27 người (31.76%) có lo âu.
chisq.test(tbl2)
## 
##  Pearson's Chi-squared test with Yates' continuity correction
## 
## data:  tbl2
## X-squared = 0.4126, df = 1, p-value = 0.5207
  • Chi-squared = 0.4126, df = 1

  • p-value = 0.5207

    Diễn giải:

    • \(H_0\): Không có mối liên hệ giữa tình trạng hôn nhân và lo âu.
    • \(p = 0.5207 > 0.05\)Không bác bỏ H₀.
    • Chưa có bằng chứng thống kê cho thấy tình trạng hôn nhân ảnh hưởng đến tình trạng lo âu.
prop.test(
  c(tbl2["Yes", "Yes"], tbl2["No", "Yes"]),
  c(sum(tbl2["Yes", ]), sum(tbl2["No", ]))
)
## 
##  2-sample test for equality of proportions with continuity correction
## 
## data:  c(tbl2["Yes", "Yes"], tbl2["No", "Yes"]) out of c(sum(tbl2["Yes", ]), sum(tbl2["No", ]))
## X-squared = 0.4126, df = 1, p-value = 0.5207
## alternative hypothesis: two.sided
## 95 percent confidence interval:
##  -0.1797304  0.4194363
## sample estimates:
##    prop 1    prop 2 
## 0.4375000 0.3176471
  • Tỷ lệ có lo âu ở người đã kết hôn: \(\frac{7}{16} = 43.75\%\)
    • Tỷ lệ có lo âu ở người chưa kết hôn: \(\frac{27}{85} = 31.76\%\)
    • Hiệu tỷ lệ ước lượng = 11.99%
    • 95% CI cho hiệu tỷ lệ: (-17.97%; 41.94%)
    • p-value = 0.5207
    Khoảng tin cậy chứa 0 ⇒ chưa có sự khác biệt đáng kể giữa hai nhóm.
# Tính Risk Ratio (RR)
riskratio(tbl2)
## $data
##        
##         No Yes Total
##   No    58  27    85
##   Yes    9   7    16
##   Total 67  34   101
## 
## $measure
##      risk ratio with 95% C.I.
##       estimate     lower    upper
##   No  1.000000        NA       NA
##   Yes 1.377315 0.7284284 2.604231
## 
## $p.value
##      two-sided
##       midp.exact fisher.exact chi.square
##   No          NA           NA         NA
##   Yes   0.369388    0.3939337  0.3520173
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "Unconditional MLE & normal approximation (Wald) CI"
  • RR (married vs unmarried) = 1.377

    • 95% CI: (0.728; 2.604)
    • p-value (chi-square) = 0.352

    Người đã kết hôn có nguy cơ bị lo âu cao hơn 37.7% so với người chưa kết hôn, nhưng:

    • Khoảng tin cậy chứa 1không có ý nghĩa thống kê.
# Tính Odds Ratio (OR)
oddsratio(tbl2)
## $data
##        
##         No Yes Total
##   No    58  27    85
##   Yes    9   7    16
##   Total 67  34   101
## 
## $measure
##      odds ratio with 95% C.I.
##       estimate     lower   upper
##   No  1.000000        NA      NA
##   Yes 1.667771 0.5340521 5.03645
## 
## $p.value
##      two-sided
##       midp.exact fisher.exact chi.square
##   No          NA           NA         NA
##   Yes   0.369388    0.3939337  0.3520173
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "median-unbiased estimate & mid-p exact CI"
  • OR = 1.668
    • 95% CI: (0.534; 5.036)
    • p-value = 0.352
    Người đã kết hôn có odds lo âu cao hơn 1.67 lần so với người chưa kết hôn. Tuy nhiên, p > 0.05 và khoảng tin cậy chứa 1 ⇒ không có ý nghĩa thống kê.

Mặc dù tỷ lệ sinh viên đã kết hôn có biểu hiện lo âu (43.75%) cao hơn so với sinh viên độc thân (31.76%), các kiểm định thống kê (Chi-squared, kiểm định hai tỷ lệ, RR và OR) đều cho thấy sự khác biệt này không có ý nghĩa thống kê ở mức ý nghĩa 5%. Điều này cho thấy tình trạng hôn nhân không có mối liên hệ rõ ràng với tình trạng lo âu trong mẫu khảo sát hiện tại.

5. HỒI QUY LOGISTIC

5.1 Đơn biến:

Kết quả mô hình hồi quy nhị phân với hàm liên kết logit:

Mục tiêu phân tích

Xem xét xem năm học (Year_of_Study) có ảnh hưởng đến khả năng bị trầm cảm của sinh viên không. → Sử dụng mô hình hồi quy logistic.

Ý nghĩa của hệ số hồi quy logistic

Trong hồi quy logistic, mỗi hệ số cho biết mức thay đổi log-odds bị trầm cảm so với nhóm tham chiếu (Year 1). Sau khi lấy exponential của hệ số, ta sẽ có odds ratio (tỷ lệ cược).

logit_model1 <- glm(Depression ~ Year_of_Study, data = data, family = binomial(link = "logit"))
summary(logit_model1)
## 
## Call:
## glm(formula = Depression ~ Year_of_Study, family = binomial(link = "logit"), 
##     data = data)
## 
## Coefficients:
##                     Estimate Std. Error z value Pr(>|z|)  
## (Intercept)          -0.7282     0.3254  -2.238   0.0252 *
## Year_of_StudyYear 2   0.2582     0.5181   0.498   0.6182  
## Year_of_StudyYear 3   0.3918     0.5266   0.744   0.4569  
## Year_of_StudyYear 4  -1.2177     1.1175  -1.090   0.2759  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 130.35  on 100  degrees of freedom
## Residual deviance: 127.54  on  97  degrees of freedom
## AIC: 135.54
## 
## Number of Fisher Scoring iterations: 4

🔍 Tính xác suất từ log-odds bằng công thức:

\[ p = \frac{e^{\text{log-odds}}}{1 + e^{\text{log-odds}}} \]

*Diễn giải từng hệ số**

(Intercept) = –0.7282

  • Đây là log-odds bị trầm cảm của nhóm tham chiếu (sinh viên năm 1).
  • Đổi sang xác suất:

\[ p = \frac{e^{-0.7282}}{1 + e^{-0.7282}} ≈ 0.325 \]

Sinh viên năm 1 có xác suất bị trầm cảm khoảng 32.5%

Year 2: Estimate = +0.2582

  • So với sinh viên năm 1, log-odds bị trầm cảm của năm 2 tăng thêm 0.2582 đơn vị.
  • Odds ratio:

\[ \exp(0.2582) ≈ 1.294 \]

Sinh viên năm 2 có odds bị trầm cảm cao hơn 29.4% so với năm 1. * Tuy nhiên, p-value = 0.6182 > 0.05 → không có ý nghĩa thống kê. → Không thể kết luận có sự khác biệt.

Year 3: Estimate = +0.3918

  • So với sinh viên năm 1, log-odds bị trầm cảm tăng +0.3918 đơn vị.
  • Odds ratio:

\[ \exp(0.3918) ≈ 1.479 \]

Sinh viên năm 3 có odds bị trầm cảm cao hơn 47.9% so với năm 1. * p-value = 0.4569 > 0.05 → cũng không đủ ý nghĩa thống kê.

Year 4: Estimate = –1.2177

  • So với sinh viên năm 1, log-odds bị trầm cảm giảm 1.2177 đơn vị.
  • Odds ratio:

\[ \exp(-1.2177) ≈ 0.296 \]

Sinh viên năm 4 có odds bị trầm cảm thấp hơn ~70.4% so với năm 1. * Nhưng p-value = 0.2759 > 0.05 → vẫn không có ý nghĩa thống kê.

Tổng kết trực quan

Nhóm Hệ số ước lượng (log-odds) Odds ratio Diễn giải ngắn Ý nghĩa thống kê
Year 1 –0.7282 (Intercept) Tỷ lệ trầm cảm nền: ~32.5% ✅ Có ý nghĩa
Year 2 +0.2582 1.294 Odds trầm cảm ↑ 29.4% so với Year 1 ❌ Không rõ ràng
Year 3 +0.3918 1.479 Odds trầm cảm ↑ 47.9% so với Year 1 ❌ Không rõ ràng
Year 4 –1.2177 0.296 Odds trầm cảm ↓ ~70.4% so với Year 1 ❌ Không rõ ràng

Mục tiêu mô hình

Xem xét mối quan hệ giữa năm học (Year_of_Study) và xác suất bị trầm cảm (Depression) thông qua mô hình hồi quy nhị phân với liên kết probit.

Trong mô hình này:

  • Phép biến đổi liên kết là hàm chuẩn nghịch đảo Φ⁻¹(p).
  • Mỗi hệ số thể hiện mức thay đổi trong đơn vị z-score (chuẩn hóa) của xác suất trầm cảm so với nhóm tham chiếu (Year 1).

Kết quả mô hình hồi quy nhị phân với hàm liên kết probit:

probit_model1 <- glm(Depression ~ Year_of_Study, data = data, family = binomial(link = "probit"))
summary(probit_model1)
## 
## Call:
## glm(formula = Depression ~ Year_of_Study, family = binomial(link = "probit"), 
##     data = data)
## 
## Coefficients:
##                     Estimate Std. Error z value Pr(>|z|)  
## (Intercept)          -0.4521     0.1984  -2.279   0.0227 *
## Year_of_StudyYear 2   0.1588     0.3189   0.498   0.6186  
## Year_of_StudyYear 3   0.2417     0.3254   0.743   0.4576  
## Year_of_StudyYear 4  -0.6982     0.6017  -1.160   0.2459  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 130.35  on 100  degrees of freedom
## Residual deviance: 127.54  on  97  degrees of freedom
## AIC: 135.54
## 
## Number of Fisher Scoring iterations: 4

Diễn giải từng hệ số

(Intercept) = –0.4521

  • Đây là z-score tương ứng với xác suất trầm cảm của nhóm sinh viên năm 1.
  • Đổi sang xác suất:

\[ p = \Phi(-0.4521) ≈ 0.325 \]

Sinh viên năm 1 có xác suất bị trầm cảm khoảng 32.5%.

p-value = 0.0227 → có ý nghĩa thống kê ở mức 5%.

Year 2: Estimate = +0.1588

  • So với sinh viên năm 1, sinh viên năm 2 có z-score tăng thêm 0.1588.
  • Xác suất tương đối:

\[ p = \Phi(-0.4521 + 0.1588) ≈ \Phi(-0.2933) ≈ 0.385 \]

→ Xác suất trầm cảm tăng nhẹ lên khoảng 38.5%.

p-value = 0.6186không đủ bằng chứng thống kê.

Year 3: Estimate = +0.2417

  • So với năm 1, z-score tăng thêm 0.2417.
  • Xác suất:

\[ \Phi(-0.4521 + 0.2417) ≈ \Phi(-0.2104) ≈ 0.417 \]

Xác suất trầm cảm ~41.7% cho sinh viên năm 3.

p-value = 0.4576 → không có ý nghĩa thống kê.

Year 4: Estimate = –0.6982

  • So với năm 1, z-score giảm thêm 0.6982.
  • Tổng z-score:

\[ -0.4521 - 0.6982 = -1.1503 \Rightarrow p ≈ \Phi(-1.1503) ≈ 0.125 \]

Xác suất bị trầm cảm giảm xuống ~12.5%.

p-value = 0.2459 → cũng không có ý nghĩa thống kê.

Tóm tắt bảng diễn giải

Nhóm Z-score (tổng) Xác suất bị trầm cảm (ước tính) So với Year 1 Ý nghĩa thống kê
Year 1 –0.4521 32.5% ✅ Có
Year 2 –0.2933 38.5% ↑ nhẹ ❌ Không
Year 3 –0.2104 41.7% ↑ nhẹ ❌ Không
Year 4 –1.1503 12.5% ↓ rõ rệt ❌ Không

Kết quả dự báo từ mô hình liên kết logit

Sử dụng mô hình hồi quy logistic để dự đoán xác suất bị trầm cảm (Depression) dựa trên biến Year_of_Study.

new_student <- data.frame(Year_of_Study = "Year 4")
# Probability prediction (type = "response")
predict(logit_model1, newdata = new_student, type = "response")
##     1 
## 0.125

Dựa trên mô hình hồi quy logistic, sinh viên năm 4 có xác suất bị trầm cảm khoảng 12.5%.

# Log-odds prediction (type = "link")
predict(logit_model1, newdata = new_student, type = "link")
##        1 
## -1.94591

Giá trị log-odds tương ứng với xác suất trên là –1.94591, tức là mức độ rủi ro bị trầm cảm của sinh viên năm 4 là rất thấp so với trung bình.

# Contribution of each predictor (type = "terms")
predict(logit_model1, newdata = new_student, type = "terms")
##   Year_of_Study
## 1     -1.280792
## attr(,"constant")
## [1] -0.6651185

Nhóm “Year 4” làm giảm log-odds đi 1.2808 đơn vị so với nhóm tham chiếu là sinh viên năm 1.

Kết luận > So với sinh viên năm 1, sinh viên năm 4 có nguy cơ bị trầm cảm thấp hơn đáng kể. Cụ thể, mô hình ước tính rằng một sinh viên năm 4 có khoảng 12.5% khả năng bị trầm cảm, thấp hơn gần 22 điểm phần trăm so với sinh viên năm 1. Tuy nhiên, để khẳng định mối liên hệ này có ý nghĩa thống kê hay không, cần xem xét thêm giá trị pđộ tin cậy của mô hình.

# Probability prediction (type = "response")
predict(probit_model1, newdata = new_student, type = "response")
##     1 
## 0.125

Kết quả dự báo từ mô hình liên kết probit

# Z-score prediction (type = "link")
predict(probit_model1, newdata = new_student, type = "link")
##         1 
## -1.150349

Dự đoán khả năng bị trầm cảm của một sinh viên năm 4 dựa trên mô hình hồi quy probit.

# Contribution of each predictor (type = "terms")
predict(probit_model1, newdata = new_student, type = "terms")
##   Year_of_Study
## 1    -0.7412075
## attr(,"constant")
## [1] -0.4091419

Kết luận

Theo mô hình hồi quy probit, sinh viên năm 4 có xác suất bị trầm cảm là 12.5%, thấp hơn đáng kể so với sinh viên năm 1 (nhóm tham chiếu). Z-score tương ứng là –1.15, cho thấy nguy cơ trầm cảm của sinh viên năm 4 là thấp hơn trung bình. Phần đóng góp của nhóm “Year 4” đã làm giảm Z-score khoảng 0.74 đơn vị, so với nhóm tham chiếu.

5.2 Đa biến

Kết quả mô hình hồi quy nhị phân với hàm liên kết logit:

Mục tiêu: Dự đoán khả năng bị trầm cảm của sinh viên dựa trên hai yếu tố:

  • Có từng bị hoảng loạn (Panic attack) hay không.
  • Có bị lo âu (Anxiety) hay không.
logit_model2 <- glm(Depression ~ Panic_attack+ Anxiety, data = data, family = binomial(link = "logit"))
summary(logit_model2)
## 
## Call:
## glm(formula = Depression ~ Panic_attack + Anxiety, family = binomial(link = "logit"), 
##     data = data)
## 
## Coefficients:
##                 Estimate Std. Error z value Pr(>|z|)    
## (Intercept)      -1.4501     0.3420  -4.240 2.23e-05 ***
## Panic_attackYes   1.0594     0.4611   2.297   0.0216 *  
## AnxietyYes        1.1762     0.4575   2.571   0.0101 *  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 130.35  on 100  degrees of freedom
## Residual deviance: 117.56  on  98  degrees of freedom
## AIC: 123.56
## 
## Number of Fisher Scoring iterations: 4

Ý nghĩa từng hệ số hồi quy (logit scale):

(Intercept) = -1.4501 → Đây là log-odds bị trầm cảm khi cả hai yếu tố Panic attack = NoAnxiety = No. ⇒ Xác suất bị trầm cảm ở nhóm này là:

\[ \hat{p}_0 = \frac{1}{1 + \exp(1.4501)} \approx 0.19 \quad \text{(tức khoảng 19%)} \]

Panic_attackYes = 1.0594 → Nếu một sinh viên từng trải qua hoảng loạn, thì log-odds bị trầm cảm tăng thêm 1.0594 đơn vị so với người chưa từng hoảng loạn.

Diễn giải theo odds (tỷ số khả năng):

\[ \exp(1.0594) \approx 2.885 \]

→ Nghĩa là sinh viên từng bị hoảng loạn có khả năng bị trầm cảm cao gấp ~2.9 lần so với người không bị hoảng loạn.

Kết quả này có ý nghĩa thống kê (p = 0.0216 < 0.05).

AnxietyYes = 1.1762 → Nếu một sinh viên bị lo âu, thì log-odds bị trầm cảm tăng thêm 1.1762 đơn vị so với người không lo âu.

Diễn giải theo odds:

\[ \exp(1.1762) \approx 3.242 \]

→ Tức là sinh viên bị lo âu có khả năng bị trầm cảm cao hơn khoảng 3.2 lần so với người không bị lo âu. Kết quả có ý nghĩa thống kê (p = 0.0101 < 0.05).

Tóm lại * Nếu một sinh viên không có lo âu và cũng chưa từng hoảng loạn, xác suất bị trầm cảm là khoảng 19%. * Nếu sinh viên từng bị hoảng loạn, xác suất tăng lên khoảng 40%. * Nếu có lo âu, xác suất tăng lên khoảng 43%. * Nếu sinh viên vừa lo âu vừa bị hoảng loạn, xác suất bị trầm cảm tăng vọt lên khoảng 69%.

Kết quả mô hình hồi quy nhị phân với hàm liên kết probit:

probit_model2 <- glm(Depression ~ Panic_attack+ Anxiety, data = data, family = binomial(link = "probit"))
summary(probit_model2)
## 
## Call:
## glm(formula = Depression ~ Panic_attack + Anxiety, family = binomial(link = "probit"), 
##     data = data)
## 
## Coefficients:
##                 Estimate Std. Error z value Pr(>|z|)    
## (Intercept)      -0.8755     0.1961  -4.465    8e-06 ***
## Panic_attackYes   0.6402     0.2788   2.296  0.02166 *  
## AnxietyYes        0.7130     0.2766   2.577  0.00995 ** 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 130.35  on 100  degrees of freedom
## Residual deviance: 117.65  on  98  degrees of freedom
## AIC: 123.65
## 
## Number of Fisher Scoring iterations: 4

Intercept) = -0.8755

  • Đây là z-score (từ phân phối chuẩn chuẩn hóa) ứng với xác suất bị trầm cảm của nhóm:

  • Không bị hoảng loạn (Panic_attack = No)

  • Không bị lo âu (Anxiety = No)

  • Để tìm xác suất bị trầm cảm ở nhóm này:

\[ P_0 = \Phi(-0.8755) \approx 0.19 \quad \text{(tức khoảng 19%)} \]

(Trong đó \(\Phi\) là hàm tích lũy chuẩn)

Panic_attackYes = 0.6402

  • Nghĩa là nếu sinh viên từng bị hoảng loạn, thì z-score bị trầm cảm tăng thêm 0.6402.

  • Điều này tương ứng với xác suất bị trầm cảm tăng lên đáng kể.

  • Ví dụ: nếu giữ Anxiety = No, xác suất bị trầm cảm sẽ tăng từ 19% lên khoảng 34%.

  • p-value = 0.02166 < 0.05 ⇒ Có ý nghĩa thống kê.

AnxietyYes = 0.7130

  • Nếu sinh viên có lo âu, thì z-score bị trầm cảm tăng thêm 0.7130 so với người không lo âu.
  • Tức xác suất bị trầm cảm tăng lên rõ rệt – ví dụ có thể tăng từ 19% lên khoảng 36% (giữ các yếu tố còn lại không đổi).
  • p-value = 0.00995 < 0.01 ⇒ Ý nghĩa thống kê mạnh.

Tóm tắt theo xác suất (ước lượng gần đúng):

Trạng thái Xác suất bị trầm cảm
Không hoảng loạn, không lo âu ≈ 19%
Có hoảng loạn, không lo âu ≈ 34%
Không hoảng loạn, có lo âu ≈ 36%
Có hoảng loạn lo âu ≈ 60–65%

Kết luận:

  • Mô hình probit cho kết quả tương tự mô hình logit, nhưng sử dụng phân phối chuẩn thay vì logistic.
  • Cả hai yếu tố Panic attackAnxiety đều có tác động tích cực và có ý nghĩa thống kê đến khả năng bị trầm cảm.
  • Những sinh viên có cả hai triệu chứng có nguy cơ trầm cảm tăng mạnh, cần được quan tâm hỗ trợ sớm.

Kết quả dự báo từ mô hình logistic regression với hai biến độc lập Panic_attackAnxiety, khi cả hai đều bằng "Yes".

new_student2 <- data.frame(Panic_attack = "Yes", Anxiety = "Yes")
# Probability prediction (type = "response")
predict(logit_model2, newdata = new_student2, type = "response")
##         1 
## 0.6868588

Sinh viên có cả lo âu và hoảng loạn được dự báo có xác suất ≈ 68.7% bị trầm cảm. Đây là một xác suất cao, vượt ngưỡng 50%, cho thấy nguy cơ rõ ràng.

# Log-odds prediction (type = "link")
predict(logit_model2, newdata = new_student2, type = "link")
##         1 
## 0.7854746

Giá trị này là log-odds (tức logit – đầu ra của mô hình tuyến tính):

\[ \text{logit}(p) = \log\left( \frac{p}{1 - p} \right) = 0.7855 \]

Bạn có thể chuyển về xác suất như sau:

\[ p = \frac{e^{0.7855}}{1 + e^{0.7855}} \approx 0.687 \]

# Contribution of each predictor (type = "terms")
predict(logit_model2, newdata = new_student2, type = "terms")
##   Panic_attack  Anxiety
## 1     0.713257 0.780254
## attr(,"constant")
## [1] -0.7080364

Công thức tuyến tính:

\[ \text{logit}(p) = -0.7080 + 0.7133 + 0.7803 = 0.7855 \]

Kết luận: Mỗi biến (lo âu và hoảng loạn) đều làm tăng log-odds, dẫn đến xác suất bị trầm cảm tăng mạnh.

*Tóm tắt lời giải dễ hiểu**:

Một sinh viên có lo âutừng trải qua hoảng loạn được mô hình dự đoán có xác suất bị trầm cảm là khoảng 69%. Cả hai yếu tố này đều góp phần làm tăng nguy cơ bị trầm cảm rõ rệt. Điều này cho thấy sự tác động đáng kể của sức khỏe tinh thần đến trạng thái trầm cảm của sinh viên.

Kết quả dự báo từ mô hình probit với hai biến độc lập Panic_attackAnxiety, khi cả hai biến đều có giá trị "Yes".

# Probability prediction (type = "response")
predict(probit_model2, newdata = new_student2, type = "response")
##         1 
## 0.6835641

Sinh viên này có xác suất bị trầm cảm là ≈ 68.4% theo mô hình hồi quy probit. Điều này tương đối cao (vượt quá 50%), cho thấy sinh viên có nguy cơ bị trầm cảm khi có cả lo âu và hoảng loạn.

# Z-score prediction (type = "link")
predict(probit_model2, newdata = new_student2, type = "link")
##         1 
## 0.4776887

Đây là giá trị đầu ra của tổ hợp tuyến tính (linear predictor) theo liên kết probit, tức là:

\[ Z = \Phi^{-1}(p) = 0.4777 \]

Muốn tính xác suất:

\[ p = \Phi(0.4777) \approx 0.6836 \]

→ Đây là Z-score tương ứng với xác suất ≈ 68.4% theo phân phối chuẩn chuẩn hóa.

# Contribution of each predictor (type = "terms")
predict(probit_model2, newdata = new_student2, type = "terms")
##   Panic_attack   Anxiety
## 1    0.4310459 0.4729738
## attr(,"constant")
## [1] -0.4263311

Mô hình tuyến tính có dạng:

\[ Z = \beta_0 + \beta_1 \cdot \text{Panic\_attack} + \beta_2 \cdot \text{Anxiety} \]

Trong trường hợp này:

  • Intercept (β₀) = -0.4263
  • Panic_attack = Yes → đóng góp +0.4310
  • Anxiety = Yes → đóng góp +0.4730

👉 Tổng Z-score (linear predictor):

\[ Z = -0.4263 + 0.4310 + 0.4730 ≈ 0.478 \]

Xác suất tương ứng:

\[ p = \Phi(0.478) ≈ 68.4\% \]

Kết luận:

Theo mô hình probit, một sinh viên có lo âu và đã từng bị hoảng loạn có xác suất ≈ 68.4% bị trầm cảm. Hai yếu tố AnxietyPanic_attack đều đóng góp tích cực vào xác suất, làm tăng đáng kể nguy cơ trầm cảm. Điều này phù hợp với trực giác và nhấn mạnh vai trò quan trọng của sức khỏe tinh thần trong chẩn đoán trầm cảm.

LS0tDQp0aXRsZTogIlBow6JuIHTDrWNoIGThu68gbGnhu4d1IMSR4buLbmggdMOtbmgiDQphdXRob3I6ICJIb8OgbmcgUXV5w6puIg0KZGF0ZTogICJgciBmb3JtYXQoU3lzLnRpbWUoKSwgJyVIOiVNOiVTLCAlZCAtICVtIC0gJVknKWAiDQpvdXRwdXQ6DQogIGh0bWxfZG9jdW1lbnQ6DQogICAgY29kZV9mb2xkaW5nOiBoaWRlDQogICAgY29kZV9kb3dubG9hZDogdHJ1ZQ0KICAgIG51bWJlcl9zZWN0aW9uczogZmFsc2UgIA0KICAgIHRvYzogdHJ1ZQ0KICAgIHRvY19kZXB0aDogNQ0KICAgIHRvY19mbG9hdDoNCiAgICAgIGNvbGxhcHNlZDogdHJ1ZQ0KICAgICAgc21vb3RoX3Njcm9sbDogdHJ1ZQ0KICB3b3JkX2RvY3VtZW50Og0KICAgIHRvYzogdHJ1ZQ0KLS0tDQoNCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQ0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBUUlVFKQ0KYGBgDQoNCg0KYGBgIHtjc3MsIGVjaG8gPSBGQUxTRX0NCmgxIHsNCiAgZm9udC1mYW1pbHk6ICJUaW1lcyBOZXcgUm9tYW4iLCBUaW1lcywgc2VyaWY7DQogIGZvbnQtc2l6ZTogMzJweDsNCiAgZm9udC13ZWlnaHQ6IGJvbGQ7DQogIH0NCg0KaDIgew0KICBmb250LWZhbWlseTogIlRpbWVzIE5ldyBSb21hbiIsIFRpbWVzLCBzZXJpZjsNCiAgZm9udC1zaXplOiAyOHB4Ow0KICBmb250LXdlaWdodDogYm9sZDsNCiANCn0NCg0KaDMgew0KICBmb250LWZhbWlseTogIlRpbWVzIE5ldyBSb21hbiIsIFRpbWVzLCBzZXJpZjsNCiAgZm9udC1zaXplOiAyNHB4Ow0KICBmb250LXdlaWdodDogYm9sZDsNCiAgZm9udC1zdHlsZTogaXRhbGljOw0KfQ0KDQpoNCB7Zm9udC1mYW1pbHk6ICJUaW1lcyBOZXcgUm9tYW4iLCBUaW1lcywgc2VyaWY7DQogIGZvbnQtc2l6ZTogMjBweDsNCiAgZm9udC1zdHlsZTogaXRhbGljOw0KICB9DQoNCmJvZHkgew0KICBmb250LWZhbWlseTogIlRpbWVzIE5ldyBSb21hbiIsIFRpbWVzLCBzZXJpZjsNCiAgZm9udC1zaXplOiAxOHB4Ow0KICANCn0NCnA6bm90KGgxKTpub3QoaDIpOm5vdChoMyk6bm90KGg0KTpub3QoaDUpIHsNCiAgdGV4dC1pbmRlbnQ6IDJlbTt9DQpwIHsNCiAgdGV4dC1hbGlnbjoganVzdGlmeTsNCiAgfQ0KLnRvY2lmeS1oZWFkZXIgew0KICBmb250LXdlaWdodDogYm9sZDsNCn0NCg0KYGBgICAgDQoNCg0KYGBge3IgZWNobz1UUlVFLCBldmFsPUZBTFNFfQ0KbGlicmFyeSh0aWR5dmVyc2UpDQpsaWJyYXJ5KGdncGxvdDIpDQpsaWJyYXJ5KGVwaXRvb2xzKQ0KbGlicmFyeShEZXNjVG9vbHMpDQpsaWJyYXJ5KERUKQ0KbGlicmFyeShlbmVyZ3kpDQpsaWJyYXJ5KHJlYWR4bCkNCmBgYA0KLS0tDQoNCiMgMS4qKlbhu4EgQuG7mSBE4buvIExp4buHdSoqIA0KDQoqKk3DtCB04bqjKioNCg0KQuG7mSBk4buvIGxp4buHdSBjw7MgdMOqbiAiQSBTdGF0aXN0aWNhbCBSZXNlYXJjaCBvbiB0aGUgRWZmZWN0cyBvZiBNZW50YWwgSGVhbHRoIG9uIFN0dWRlbnRz4oCZIENHUEEiIMSRxrDhu6NjIHRodSB0aOG6rXAgdGjDtG5nIHF1YSBraOG6o28gc8OhdCB0cuG7sWMgdHV54bq/biBi4bqxbmcgR29vZ2xlIEZvcm1zIHbhu5tpIMSR4buRaSB0xrDhu6NuZyBsw6Agc2luaCB2acOqbiB04bqhaSDEkOG6oWkgaOG7jWMgSOG7k2kgZ2nDoW8gUXXhu5FjIHThur8gTWFsYXlzaWEgKEludGVybmF0aW9uYWwgSXNsYW1pYyBVbml2ZXJzaXR5IE1hbGF5c2lhIC0gSUlVTSkuIE3hu6VjIHRpw6p1IGPhu6dhIG5naGnDqm4gY+G7qXUgbMOgIHBow6JuIHTDrWNoIG3hu5FpIHF1YW4gaOG7hyBnaeG7r2Egc+G7qWMga2jhu49lIHRpbmggdGjhuqduIChtZW50YWwgaGVhbHRoKSB2w6Aga+G6v3QgcXXhuqMgaOG7jWMgdOG6rXAgKENHUEEpIGPhu6dhIHNpbmggdmnDqm4uDQoNCkLhu5kgZOG7ryBsaeG7h3UgbmjhurFtIGjhu5cgdHLhu6MgbmdoacOqbiBj4bupdSBt4buRaSBsacOqbiBo4buHIGdp4buvYSBjw6FjIHnhur91IHThu5EgbGnDqm4gcXVhbiDEkeG6v24gc+G7qWMga2jhu49lIHRpbmggdGjhuqduIOKAkyBuaMawIG3hu6ljIMSR4buZIGPEg25nIHRo4bqzbmcsIGxvIMOidSwgdHLhuqdtIGPhuqNtIOKAkyB24bubaSBr4bq/dCBxdeG6oyBo4buNYyB04bqtcCAodGjhu4MgaGnhu4duIHF1YSDEkWnhu4NtIHRydW5nIGLDrG5oIHTDrWNoIGzFqXkg4oCTIENHUEEpIGPhu6dhIHNpbmggdmnDqm4uIMSQw6J5IGzDoCBt4buZdCB24bqlbiDEkeG7gSBtYW5nIHTDrW5oIHRo4budaSBz4buxLCDEkeG6t2MgYmnhu4d0IHRyb25nIGLhu5FpIGPhuqNuaCBo4buNYyB04bqtcCDDoXAgbOG7sWMgdsOgIGPDoWMgduG6pW4gxJHhu4EgdMOibSBsw70gbmfDoHkgY8OgbmcgxJHGsOG7o2MgcXVhbiB0w6JtIHRyb25nIG3DtGkgdHLGsOG7nW5nIMSR4bqhaSBo4buNYy4NCg0KYGBge3J9DQojxJDhu41jIGThu68gbGnhu4d1IHThu6sgZmlsZSBDU1YNCmRhdGEgPC0gcmVhZC5jc3YoIkM6L1VzZXJzL0hvYW5nIFF1eWVuL0Rvd25sb2Fkcy9TdHVkZW50IE1lbnRhbCBoZWFsdGguY3N2IikNCiNIaeG7g24gdGjhu4sgY+G6pXUgdHLDumMgZOG7ryBsaeG7h3UNCnN0cihkYXRhKQ0KVmlldyhkYXRhKQ0KYGBgDQoNCmBgYHtyfQ0KI0hp4buDbiB0aOG7iyA1IGTDsm5nIMSR4bqndSB2w6AgY3Xhu5FpDQpoZWFkKGRhdGEsIDUpDQp0YWlsKGRhdGEsIDUpDQpgYGANCg0KIELhu5kgZOG7ryBsaeG7h3UgxJHGsOG7o2MgdGh1IHRo4bqtcCB0aMO0bmcgcXVhIGto4bqjbyBzw6F0IHNpbmggdmnDqm4gdOG6oWkgKirEkOG6oWkgaOG7jWMgSOG7k2kgZ2nDoW8gUXXhu5FjIHThur8gTWFsYXlzaWEgKElJVU0pKiogduG7m2kgbeG7pWMgdGnDqnUgcGjDom4gdMOtY2ggbeG7kWkgcXVhbiBo4buHIGdp4buvYSAqKnPhu6ljIGto4buPZSB0aW5oIHRo4bqnbiB2w6Aga+G6v3QgcXXhuqMgaOG7jWMgdOG6rXAqKi4gROG7ryBsaeG7h3UgYmFvIGfhu5NtICoqMTAxIHF1YW4gc8OhdCoqLCB0xrDGoW5nIOG7qW5nIHbhu5tpIDEwMSBzaW5oIHZpw6puLCB2w6AgKioxMSBiaeG6v24qDQoNCkPDoWMgYmnhur9uIMSRxrDhu6NjIHBow6JuIGxv4bqhaSBuaMawIHNhdToNCiAgDQogICogKipCaeG6v24gxJHhu4tuaCBsxrDhu6NuZyAoMSBiaeG6v24pKio6DQogIA0KICAqIGBBZ2VgOiBUdeG7lWkgaGnhu4duIHThuqFpIGPhu6dhIHNpbmggdmnDqm4gKGtp4buDdSBz4buRIHRo4buxYywgbGnDqm4gdOG7pWMpLg0KDQoqICoqQmnhur9uIMSR4buLbmggdMOtbmggKDEwIGJp4bq/bikqKjoNCiAgDQogICogVHJvbmcgxJHDsyBjw7M6DQogIA0KICAqICoqMiBiaeG6v24gxJHhu4tuaCB0w61uaCBjw7MgdGjhu6kgYuG6rWMgKG9yZGluYWwpKio6DQogIA0KICAqIGBXaGF0IGlzIHlvdXIgQ0dQQT9gOiDEkGnhu4NtIHRydW5nIGLDrG5oIHTDrWNoIGzFqXksIMSRxrDhu6NjIGdoaSBuaOG6rW4gdGhlbyBjw6FjIGtob+G6o25nIGdpw6EgdHLhu4suDQoqIGBZb3VyIGN1cnJlbnQgeWVhciBvZiBTdHVkeWA6IE7Eg20gaOG7jWMgaGnhu4duIHThuqFpIChZZWFyIDEgxJHhur9uIFllYXIgNCspLg0KKiAqKjggYmnhur9uIMSR4buLbmggdMOtbmggxJHhu4tuaCBkYW5oIChub21pbmFsKSoqOg0KICANCiAgKiBCYW8gZ+G7k20gY8OhYyB0aMO0bmcgdGluIGPDoSBuaMOibiwgdMOsbmggdHLhuqFuZyBz4bupYyBraOG7j2UgdGluaCB0aOG6p24sIHTDrG5oIHRy4bqhbmcgaMO0biBuaMOibiwuLi4NCg0KDQp8ICoqVMOqbiBiaeG6v24qKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAqKkxv4bqhaSBk4buvIGxp4buHdSoqIHwgKipNw7QgdOG6oyBuZ+G6r24qKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCnwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8IC0tLS0tLS0tLS0tLS0tLS0gfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwNCnwgYFRpbWVzdGFtcGAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IMSQ4buLbmggdMOtbmggICAgICAgIHwgVGjhu51pIGdpYW4gc2luaCB2acOqbiBob8OgbiB0aMOgbmgga2jhuqNvIHPDoXQuICAgICAgICAgICAgICAgIHwNCnwgYENob29zZSB5b3VyIGdlbmRlcmAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IMSQ4buLbmggdMOtbmggICAgICAgIHwgR2nhu5tpIHTDrW5oIGPhu6dhIHNpbmggdmnDqm4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQp8IGBBZ2VgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCDEkOG7i25oIGzGsOG7o25nICAgICAgIHwgVHXhu5VpIGhp4buHbiB04bqhaSBj4bunYSBzaW5oIHZpw6puLiAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQp8IGBXaGF0IGlzIHlvdXIgY291cnNlP2AgICAgICAgICAgICAgICAgICAgICAgICAgfCDEkOG7i25oIHTDrW5oICAgICAgICB8IE5nw6BuaCBo4buNYyBj4bunYSBzaW5oIHZpw6puLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KfCBgWW91ciBjdXJyZW50IHllYXIgb2YgU3R1ZHlgICAgICAgICAgICAgICAgICAgIHwgxJDhu4tuaCB0w61uaCAgICAgICAgfCBOxINtIGjhu41jIGhp4buHbiB04bqhaSBj4bunYSBzaW5oIHZpw6puLiAgICAgICAgICAgICAgICAgICAgICAgICB8DQp8IGBXaGF0IGlzIHlvdXIgQ0dQQT9gICAgICAgICAgICAgICAgICAgICAgICAgICAgfCDEkOG7i25oIHTDrW5oICAgICAgICB8IMSQaeG7g20gdHJ1bmcgYsOsbmggdMOtY2ggbMWpeSwgxJHGsOG7o2MgZ2hpIG5o4bqtbiB0aGVvIG5ow7NtIENHUEEuIHwNCnwgYE1hcml0YWwgc3RhdHVzYCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IMSQ4buLbmggdMOtbmggICAgICAgIHwgVMOsbmggdHLhuqFuZyBow7RuIG5ow6JuIGPhu6dhIHNpbmggdmnDqm4uICAgICAgICAgICAgICAgICAgICAgIHwNCnwgYERvIHlvdSBoYXZlIERlcHJlc3Npb24/YCAgICAgICAgICAgICAgICAgICAgICB8IMSQ4buLbmggdMOtbmggICAgICAgIHwgU2luaCB2acOqbiBjw7MgYuG7iyB0cuG6p20gY+G6o20gaGF5IGtow7RuZy4gICAgICAgICAgICAgICAgICAgICB8DQp8IGBEbyB5b3UgaGF2ZSBBbnhpZXR5P2AgICAgICAgICAgICAgICAgICAgICAgICAgfCDEkOG7i25oIHTDrW5oICAgICAgICB8IFNpbmggdmnDqm4gY8OzIGLhu4sgbG8gw6J1IGhheSBraMO0bmcuICAgICAgICAgICAgICAgICAgICAgICAgfA0KfCBgRG8geW91IGhhdmUgUGFuaWMgYXR0YWNrP2AgICAgICAgICAgICAgICAgICAgIHwgxJDhu4tuaCB0w61uaCAgICAgICAgfCBTaW5oIHZpw6puIGPDsyB04burbmcgdHLhuqNpIHF1YSBjxqFuIGhv4bqjbmcgbG/huqFuIGhheSBraMO0bmcuICAgIHwNCnwgYERpZCB5b3Ugc2VlayBhbnkgc3BlY2lhbGlzdCBmb3IgYSB0cmVhdG1lbnQ/YCB8IMSQ4buLbmggdMOtbmggICAgICAgIHwgU2luaCB2acOqbiBjw7MgdOG7q25nIHTDrG0gxJHhur9uIGNodXnDqm4gZ2lhIHTDom0gbMO9IGhheSBraMO0bmcuICB8DQoNCg0KDQpgYGB7cn0NCiMgxJDhu5VpIHTDqm4gY8OhYyBiaeG6v24gY2hvIGfhu41uIGfDoG5nLCBk4buFIHjhu60gbMO9DQpuYW1lcyhkYXRhKVtuYW1lcyhkYXRhKSA9PSAiVGltZXN0YW1wIl0gPC0gInRpbWVzdGFtcCINCm5hbWVzKGRhdGEpW25hbWVzKGRhdGEpID09ICJDaG9vc2UueW91ci5nZW5kZXIiXSA8LSAiR2VuZGVyIg0KbmFtZXMoZGF0YSlbbmFtZXMoZGF0YSkgPT0gIkFnZSJdIDwtICJhZ2UiDQpuYW1lcyhkYXRhKVtuYW1lcyhkYXRhKSA9PSAiV2hhdC5pcy55b3VyLmNvdXJzZS4iXSA8LSAiQ291cnNlIg0KbmFtZXMoZGF0YSlbbmFtZXMoZGF0YSkgPT0gIllvdXIuY3VycmVudC55ZWFyLm9mLlN0dWR5Il0gPC0gIlllYXJfb2ZfU3R1ZHkiDQpuYW1lcyhkYXRhKVtuYW1lcyhkYXRhKSA9PSAiV2hhdC5pcy55b3VyLkNHUEEuIl0gPC0gImNncGEiDQpuYW1lcyhkYXRhKVtuYW1lcyhkYXRhKSA9PSAiTWFyaXRhbC5zdGF0dXMiXSA8LSAiTWFyaXRhbF9zdGF0dXMiDQpuYW1lcyhkYXRhKVtuYW1lcyhkYXRhKSA9PSAiRG8ueW91LmhhdmUuRGVwcmVzc2lvbi4iXSA8LSAiRGVwcmVzc2lvbiINCm5hbWVzKGRhdGEpW25hbWVzKGRhdGEpID09ICJEby55b3UuaGF2ZS5BbnhpZXR5LiJdIDwtICJBbnhpZXR5Ig0KbmFtZXMoZGF0YSlbbmFtZXMoZGF0YSkgPT0gIkRvLnlvdS5oYXZlLlBhbmljLmF0dGFjay4iXSA8LSAiUGFuaWNfYXR0YWNrIg0KbmFtZXMoZGF0YSlbbmFtZXMoZGF0YSkgPT0gIkRpZC55b3Uuc2Vlay5hbnkuc3BlY2lhbGlzdC5mb3IuYS50cmVhdG1lbnQuIl0gPC0gInNlZWtfdHJlYXRtZW50Ig0KbmFtZXMoZGF0YSkNCmBgYA0KDQpUaGFuZyBwaMOibiBuaMOzbSBDR1BBKioNCiAgDQogIMSQ4buDIHRodeG6rW4gdGnhu4duIGNobyB2aeG7h2MgcGjDom4gdMOtY2ggdsOgIHNvIHPDoW5oLCBiaeG6v24gYENHUEFgIMSRw6MgxJHGsOG7o2MgcGjDom4gbmjDs20gdGjDoG5oIDUgY+G6pXAgxJHhu5kgaOG7jWMgbOG7sWMgbmjGsCBzYXU6DQogIA0KICB8ICoqS2hv4bqjbmcgQ0dQQSoqIHwgKipN4bupYyBo4buNYyBs4buxYyoqICAgICAgICAgICAgICAgICB8DQogIHwgLS0tLS0tLS0tLS0tLS0tIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8DQogIHwgMC4wMCDigJMgMS45OSAgICAgfCBXZWFrIChZ4bq/dSkgICAgICAgICAgICAgICAgICAgICAgfA0KICB8IDIuMDAg4oCTIDIuNDkgICAgIHwgQmVsb3cgQXZlcmFnZSAoVHJ1bmcgYsOsbmggZMaw4bubaSkgfA0KICB8IDIuNTAg4oCTIDIuOTkgICAgIHwgQXZlcmFnZSAoVHJ1bmcgYsOsbmgpICAgICAgICAgICAgfA0KICB8IDMuMDAg4oCTIDMuNDkgICAgIHwgR29vZCAoS2jDoSkgICAgICAgICAgICAgICAgICAgICAgfA0KICB8IDMuNTAg4oCTIDQuMDAgICAgIHwgRXhjZWxsZW50IChHaeG7j2kpICAgICAgICAgICAgICAgIHwNCiAgDQogIFZp4buHYyBwaMOibiBuaMOzbSBnacO6cCB4w6FjIMSR4buLbmggeHUgaMaw4bubbmcgaOG7jWMgbOG7sWMgdGhlbyBjw6FjIHnhur91IHThu5Egc+G7qWMga2jhu49lIHRpbmggdGjhuqduIHbDoCBk4buFIGTDoG5nIHRyw6xuaCBiw6B5IGvhur90IHF14bqjIHRo4buRbmcga8OqIG3DtCB04bqjIGhv4bq3YyBo4buTaSBxdXkgdGjhu6kgYuG6rWMuDQoNCg0KYGBge3J9DQp1bmlxdWUoZGF0YSRjZ3BhKQ0KDQojIEPDoWNoIGTDuW5nIGJhc2UgUiB24bubaSBpZmVsc2UgbOG7k25nIG5oYXUNCmRhdGEkY2dwYV9sZXZlbCA8LSBpZmVsc2UoZGF0YSRjZ3BhID09ICIwIC0gMS45OSIsICJXZWFrIiwNCiAgICAgICAgICAgICAgICAgICBpZmVsc2UoZGF0YSRjZ3BhID09ICIyLjAwIC0gMi40OSIsICJCZWxvdyBBdmVyYWdlIiwNCiAgICAgICAgICAgICAgICAgICBpZmVsc2UoZGF0YSRjZ3BhID09ICIyLjUwIC0gMi45OSIsICJBdmVyYWdlIiwNCiAgICAgICAgICAgICAgICAgICBpZmVsc2UoZGF0YSRjZ3BhID09ICIzLjAwIC0gMy40OSIsICJHb29kIiwNCiAgICAgICAgICAgICAgICAgICBpZmVsc2UoZGF0YSRjZ3BhID09ICIzLjUwIC0gNC4wMCIsICJFeGNlbGxlbnQiLCBOQSkpKSkpDQpgYGANCg0KDQpgYGB7cn0NCm5hbWVzKGRhdGEpDQpgYGANCmBgYHtyfQ0KZGF0YSRZZWFyX29mX1N0dWR5IDwtIGRwbHlyOjpyZWNvZGUoZGF0YSRZZWFyX29mX1N0dWR5LA0KICAieWVhciAxIiA9ICJZZWFyIDEiLA0KICAiWWVhciAxIiA9ICJZZWFyIDEiLA0KICAieWVhciAyIiA9ICJZZWFyIDIiLA0KICAiWWVhciAyIiA9ICJZZWFyIDIiLA0KICAieWVhciAzIiA9ICJZZWFyIDMiLA0KICAiWWVhciAzIiA9ICJZZWFyIDMiLA0KICAieWVhciA0IiA9ICJZZWFyIDQiLA0KICAiWWVhciA0IiA9ICJZZWFyIDQiDQopDQoNCmBgYA0KDQoNCmBgYHtyfQ0KIyBEYW5oIHPDoWNoIHTDqm4gY8OhYyBiaeG6v24gxJHhu4tuaCB0w61uaA0KY2F0ZWdvcmljYWxfdmFycyA8LSBjKCAiR2VuZGVyIiwgIkNvdXJzZSIsICJZZWFyX29mX1N0dWR5IiwgIk1hcml0YWxfc3RhdHVzIiwNCiAgICAgICAgICAgICAgICAgICAgICAiRGVwcmVzc2lvbiIsICJBbnhpZXR5IiwgIlBhbmljX2F0dGFjayIsICJzZWVrX3RyZWF0bWVudCIsICJjZ3BhX2xldmVsIikNCg0KIyBDaHV54buDbiB04bqldCBj4bqjIHRow6BuaCBmYWN0b3INCmRhdGFbY2F0ZWdvcmljYWxfdmFyc10gPC0gbGFwcGx5KGRhdGFbY2F0ZWdvcmljYWxfdmFyc10sIGFzLmZhY3RvcikNCmBgYA0KDQpgYGB7cn0NCnN0cihkYXRhKQ0KYGBgDQoNCi0tLQ0KDQojIyAqKjIuIFRI4buQTkcgS8OKIE3DlCBU4bqiKioNCg0KIyMjIDIuMSBEZXByZXNzaW9uIChUcuG6p20gY+G6o20pDQoNCmBgYHtyfQ0KIyBU4bqnbiBzdeG6pXQNCmZyZXFfZGVwIDwtIHRhYmxlKGRhdGEkRGVwcmVzc2lvbikNCg0KIyBU4bu3IGzhu4cgcGjhuqduIHRyxINtDQpwZXJjZW50X2RlcCA8LSByb3VuZChwcm9wLnRhYmxlKGZyZXFfZGVwKSAqIDEwMCwgMikNCg0KIyBL4bq/dCBo4bujcCB04bqnbiBzdeG6pXQgdsOgIHBo4bqnbiB0csSDbSB0aMOgbmggMSBi4bqjbmcNCnN1bW1hcnlfdGFibGUgPC0gZGF0YS5mcmFtZSgNCiAgTeG7qWNfxJHhu5kgPSBuYW1lcyhmcmVxX2RlcCksDQogIFThuqduX3N14bqldCA9IGFzLnZlY3RvcihmcmVxX2RlcCksDQogIFThu7dfbOG7h19waOG6p25fdHLEg20gPSBhcy52ZWN0b3IocGVyY2VudF9kZXApDQopDQoNCiMgSW4gYuG6o25nDQpjYXQoIvCfk4sgQuG6o25nIHThuqduIHN14bqldCB2w6AgdOG7tyBs4buHIHBo4bqnbiB0csSDbSBjaG8gRGVwcmVzc2lvbjpcbiIpDQpwcmludChzdW1tYXJ5X3RhYmxlLCByb3cubmFtZXMgPSBGQUxTRSkNCg0KDQpgYGANCg0KKipL4bq/dCBxdeG6oyoqDQoNCiAgKiBUcm9uZyAxMDEgc2luaCB2acOqbiB0aGFtIGdpYSBraOG6o28gc8OhdCwgY8OzIDY2IHNpbmggdmnDqm4gKDY1LjM1JSkga2jDtG5nIGPDsyBiaeG7g3UgaGnhu4duIHRy4bqnbSBj4bqjbS4gDQoNCiAgKiBDw7MgMzUgc2luaCB2acOqbiBjaG8gYmnhur90IGjhu40gY8OzIGJp4buDdSBoaeG7h24gdHLhuqdtIGPhuqNtLCBjaGnhu4NtIDM0LjY1JSBz4buRIG5nxrDhu51pIHRoYW0gZ2lhIGto4bqjbyBzw6F0Lg0KICANCmBgYHtyfQ0KIyBCaeG7g3UgxJHhu5MNCmxpYnJhcnkoZ2dwbG90MikNCmdncGxvdChkYXRhLCBhZXMoeCA9IERlcHJlc3Npb24sIGZpbGwgPSBEZXByZXNzaW9uKSkgKw0KICBnZW9tX2JhcigpICsNCiAgbGFicyh0aXRsZSA9ICJU4bqnbiBzdeG6pXQgVHLhuqdtIGPhuqNtIChEZXByZXNzaW9uKSIsIHggPSAiVHLhuqdtIGPhuqNtIiwgeSA9ICJT4buRIGzGsOG7o25nIikgKw0KICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjKCJzdGVlbGJsdWUiLCAic2FsbW9uIikpICsNCiAgdGhlbWVfbWluaW1hbCgpDQpgYGANCg0KKipOaOG6rW4geMOpdCoqDQogICogROG7sWEgdsOgbyBiaeG7g3UgxJHhu5MgdGEgdGjhuqV5IHPhu5Egc2luaCB2acOqbiBraMO0bmcgYuG7iyB0cuG6p20gY+G6o20gZ+G6p24gZ+G6pXAgZMO0aSBz4buRIHNpbmggdmnDqm4gY8OzIHRy4bqnbSBj4bqjbS4gS+G6v3QgaOG7o3AgduG7m2kga+G6v3QgcXXhuqMgdGjhu5FuZyBrw6ogdHLDqm4gY2hvIHRo4bqleSB04bu3IGzhu4cgc2luaCB2acOqbiBjw7MgYmnhu4N1IGhp4buHbiB0cuG6p20gY+G6o20gY2hp4bq/bSBraG/huqNuZyAxLzMgdOG7lW5nIG3huqt1IGto4bqjbyBzw6F0LiDEkMOieSBsw6AgbeG7mXQgduG6pW4gxJHhu4Egc+G7qWMga2jhu49lIHTDom0gdGjhuqduIGPhuqduIMSRxrDhu6NjIHRoZW8gZMO1aSB2w6AgcGjDom4gdMOtY2ggc8OidSBoxqFuLCDEkeG6t2MgYmnhu4d0IGtoaSBuZ2hpw6puIGPhu6l1IGPDoWMgeeG6v3UgdOG7kSDhuqNuaCBoxrDhu59uZyDEkeG6v24gaOG7jWMgdOG6rXAgdsOgIMSR4budaSBz4buRbmcgc2luaCB2acOqbi4NCg0KIyMjIDIuMiBBbnhpZXR5IChMbyDDonUpDQoNCmBgYHtyfQ0KIyBU4bqnbiBzdeG6pXQNCmZyZXFfYW54IDwtIHRhYmxlKGRhdGEkQW54aWV0eSkNCg0KIyBU4bu3IGzhu4cgcGjhuqduIHRyxINtDQpwZXJjZW50X2FueCA8LSByb3VuZChwcm9wLnRhYmxlKGZyZXFfYW54KSAqIDEwMCwgMikNCiMgVOG6oW8gYuG6o25nIHThu5VuZyBo4bujcA0Kc3VtbWFyeV9hbnggPC0gZGF0YS5mcmFtZSgNCiAgTeG7qWNfxJHhu5kgPSBuYW1lcyhmcmVxX2FueCksDQogIFThuqduX3N14bqldCA9IGFzLnZlY3RvcihmcmVxX2FueCksDQogIFThu7dfbOG7h19waOG6p25fdHLEg20gPSBhcy52ZWN0b3IocGVyY2VudF9hbngpDQopDQoNCiMgSW4gYuG6o25nIMSR4bq5cA0KY2F0KCJcbvCfk4sgQuG6o25nIHThu5VuZyBo4bujcCB04bqnbiBzdeG6pXQgdsOgIHThu7cgbOG7hyBwaOG6p24gdHLEg20gY2hvIEFueGlldHk6XG4iKQ0KcHJpbnQoc3VtbWFyeV9hbngsIHJvdy5uYW1lcyA9IEZBTFNFKQ0KDQpgYGANCg0KDQoqKk5o4bqtbiB4w6l0KioNCg0KVHJvbmcgdOG7lW5nIHPhu5EgMTAxIHNpbmggdmnDqm4gdGhhbSBnaWEga2jhuqNvIHPDoXQ6DQoNCiAgKiBDw7MgNjcgc2luaCB2acOqbiAoY2hp4bq/bSA2Ni4zNCUpIGNobyBiaeG6v3Qga2jDtG5nIGPDsyBiaeG7g3UgaGnhu4duIGxvIMOidS4NCg0KICAqIE5nxrDhu6NjIGzhuqFpLCBjw7MgMzQgc2luaCB2acOqbiAoY2hp4bq/bSAzMy42NiUpIGNobyBiaeG6v3QgY8OzIGJp4buDdSBoaeG7h24gbG8gw6J1Lg0KDQoNCg0KYGBge3J9DQojIEJp4buDdSDEkeG7kw0KZ2dwbG90KGRhdGEsIGFlcyh4ID0gQW54aWV0eSwgZmlsbCA9IEFueGlldHkpKSArDQogIGdlb21fYmFyKCkgKw0KICBsYWJzKHRpdGxlID0gIlThuqduIHN14bqldCBMbyDDonUgKEFueGlldHkpIiwgeCA9ICJMbyDDonUiLCB5ID0gIlPhu5EgbMaw4bujbmciKSArDQogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGMoInNreWJsdWUiLCAibGlnaHR5ZWxsb3ciKSkgKw0KICB0aGVtZV9taW5pbWFsKCkNCmBgYA0KDQoqKk5o4bqtbiB4w6l0KioNCiAgKiBE4buxYSB2w6BvIGJp4buDdSDEkeG7kyB0csOqbiBjaG8gdGjhuqV5IHPhu5EgbMaw4bujbmcgc2luaCB2acOqbiBjw7MgYmnhu4N1IGhp4buHbiBsbyDDonUgdGjhuqVwIGjGoW4gc2luaCB2acOqbiBraMO0bmcgY8OzIGJp4buDdSBoaeG7g24gbG8gw6J1IHRyb25nIG3huqt1IHF1YW4gc8OhdC4gS+G6v3QgaOG7o3AgduG7m2kgcGjhuqduIHRo4buRbmcga8OqIG3DtCB04bqjIHRyxrDhu5tjIMSRw7MgY2hvIHRo4bqleSwgdOG7tyBs4buHIHNpbmggdmnDqm4gY8OzIGJp4buDdSBoaeG7h24gbG8gw6J1IGNoaeG6v20ga2hv4bqjbmcgMS8zIHThu5VuZyBz4buRIG3huqt1IGto4bqjbyBzw6F0LCBjaG8gdGjhuqV5IMSRw6J5IGzDoCBt4buZdCB24bqlbiDEkeG7gSB0w6JtIGzDvSDEkcOhbmcgbMawdSDDvSB0cm9uZyBj4buZbmcgxJHhu5NuZyBzaW5oIHZpw6puLiBN4bq3YyBkw7kgcGjhuqduIGzhu5tuIHNpbmggdmnDqm4ga2jDtG5nIGfhurdwIHBo4bqjaSB0w6xuaCB0cuG6oW5nIG7DoHksIHThu7cgbOG7hyBzaW5oIHZpw6puIGxvIMOidSB24bqrbiDEkeG7pyBs4bubbiDEkeG7gyBj4bqnbiDEkcaw4bujYyBxdWFuIHTDom0gdHJvbmcgY8OhYyBwaMOibiB0w61jaCB0aeG6v3AgdGhlbywgxJHhurdjIGJp4buHdCBraGkgxJHDoW5oIGdpw6EgdMOhYyDEkeG7mW5nIMSR4bq/biBr4bq/dCBxdeG6oyBo4buNYyB04bqtcCB2w6AgY2jhuqV0IGzGsOG7o25nIGN14buZYyBz4buRbmcuDQoNCiMjICoqMy4gVEjhu5BORyBLw4ogU1VZIERJ4buETioqDQoNCiMjIyAzLjEgRGVwcmVzc2lvbg0KDQoqKk3hu6VjIHRpw6p1IGtp4buDbSDEkeG7i25oKioNCiAgDQogIFjDoWMgxJHhu4tuaCB4ZW0gdOG7tyBs4buHIHNpbmggdmnDqm4gKipjw7MgYmnhu4N1IGhp4buHbiB0cuG6p20gY+G6o20qKiBjw7MgKipraMOhYyoqIHbhu5tpIG3hu5l0IHThu7cgbOG7hyBnaeG6oyDEkeG7i25oIGJhbiDEkeG6p3UgKDUwJSkgaGF5IGtow7RuZy4NCiAgQmnhur9uIERlcHJlc3Npb24gxJHGsOG7o2MgbcOjIGjDs2EgbMOgIGAiWWVzImAgaG/hurdjIGAiTm8iYCwgduG7m2k6DQogIA0KICAqICR4ID0gMzUkOiBz4buRIHNpbmggdmnDqm4gY8OzIGJp4buDdSBoaeG7h24gdHLhuqdtIGPhuqNtDQoqICRuID0gMTAxJDogdOG7lW5nIHPhu5Egc2luaCB2acOqbiBjw7MgZOG7ryBsaeG7h3UgaOG7o3AgbOG7hw0KDQoNCioqR2nhuqMgdGh1eeG6v3QgdGjhu5FuZyBrw6ogxJHGsOG7o2MgxJHhurd0IG5oxrAgc2F1IDoqKg0KDQokJA0KICBcYmVnaW57Y2FzZXN9IEhfMDogcCA9IDAuNSAmIFx0ZXh0eyhU4bu3IGzhu4cgc2luaCB2acOqbiBi4buLIHRy4bqnbSBj4bqjbSBi4bqxbmcgNTAlKX0gXFwgSF8xOiBwIFxuZSAwLjUgJiBcdGV4dHsoVOG7tyBs4buHIHNpbmggdmnDqm4gYuG7iyB0cuG6p20gY+G6o20ga2jDoWMgNTAlKX0gXGVuZHtjYXNlc30NCiQkDQoNCmBgYHtyfQ0KeCA8LSBzdW0oZGF0YSREZXByZXNzaW9uID09ICJZZXMiKQ0KbiA8LSBzdW0oIWlzLm5hKGRhdGEkRGVwcmVzc2lvbikpDQoNCiMgS2nhu4NtIMSR4buLbmggMSB04bu3IGzhu4cgKEgwOiBwID0gMC41KQ0KcHJvcC50ZXN0KHggPSB4LCBuID0gbiwgcCA9IDAuNSwgYWx0ZXJuYXRpdmUgPSAidHdvLnNpZGVkIikNCmBgYA0KDQoqKkvhur90IHF14bqjKioNCg0KICogKipU4bu3IGzhu4cgbeG6q3U6KioNCiAgDQogICQkDQogIFxoYXR7cH0gPSBcZnJhY3szNX17MTAxfSBcYXBwcm94IDAuMzQ2NSBcdGV4dHsgKHThu6ljIDM0LjY1JSl9DQokJA0KICANCiAgKiAqKkdpw6EgdHLhu4sgdGjhu5FuZyBrw6oga2nhu4NtIMSR4buLbmggKGNoaSBiw6xuaCBwaMawxqFuZyk6KioNCiAgJFheMiA9IDguOTEwOSQNCiAgDQogICogKipwLXZhbHVlOioqDQogICRcdGV4dHtwLXZhbHVlfSA9IDAuMDAyODM1JA0KICANCiAgKiAqKktob+G6o25nIHRpbiBj4bqteSA5NSUgY2hvIHThu7cgbOG7hyBwOioqDQogIA0KICAkJA0KICAoMC4yNTY0OyBcLCAwLjQ0ODUpDQokJA0KDQogKiAqKlbDrCBwLXZhbHVlID0gMC4wMDI4MzUgPCAwLjA1KiosIHRhICoqYsOhYyBi4buPIGdp4bqjIHRodXnhur90IEjigoAqKiDhu58gbeG7qWMgw70gbmdoxKlhIDUlLg0KKiBDw7MgYuG6sW5nIGNo4bupbmcgdGjhu5FuZyBrw6ogY2hvIHRo4bqleSAqKnThu7cgbOG7hyBzaW5oIHZpw6puIGLhu4sgdHLhuqdtIGPhuqNtIGtow6FjIDUwJSoqLg0KKiBLaG/huqNuZyB0aW4gY+G6rXkgOTUlIGNobyB04bu3IGzhu4cgdGjhu7FjIHThur8gbuG6sW0gdHJvbmcga2hv4bqjbmcgKioyNS42JSDEkeG6v24gNDQuODUlKiosICoqa2jDtG5nIGJhbyBn4buTbSA1MCUqKiwgY8OgbmcgY+G7p25nIGPhu5Ega+G6v3QgbHXhuq1uIGLDoWMgYuG7jyBI4oKALg0KKiBU4bu3IGzhu4cgbeG6q3UgbMOgICoqMzQuNjUlKiosIHThu6ljIGzDoCAqKnRy4bqnbSBj4bqjbSBsw6AgduG6pW4gxJHhu4EgaGnhu4duIGjhu691IG5oxrBuZyBraMO0bmcgY2hp4bq/bSDEkWEgc+G7kSoqIHRyb25nIG3huqt1IGto4bqjbyBzw6F0Lg0KICANCiAgPiBW4bubaSBt4bupYyDDvSBuZ2jEqWEgNSUsIGPDsyDEkeG7pyBi4bqxbmcgY2jhu6luZyB0aOG7kW5nIGvDqiDEkeG7gyBiw6FjIGLhu48gZ2nhuqMgdGh1eeG6v3QgcuG6sW5nIHThu7cgbOG7hyBzaW5oIHZpw6puIGLhu4sgdHLhuqdtIGPhuqNtIGzDoCA1MCUuIFThu7cgbOG7hyB0cuG6p20gY+G6o20gdGjhu7FjIHThur8gxrDhu5tjIHTDrW5oIGzDoCAqKmtob+G6o25nIDM0LjY1JSoqLCB24bubaSBraG/huqNuZyB0aW4gY+G6rXkgOTUlIG7hurFtIHRyb25nICoqXFsyNS42JSwgNDQuOSVdKiouIMSQaeG7gXUgbsOgeSBjaG8gdGjhuqV5IHLhurFuZyAqKnThu7cgbOG7hyB0cuG6p20gY+G6o20gdHJvbmcgY+G7mW5nIMSR4buTbmcgc2luaCB2acOqbiBraOG6o28gc8OhdCB0aOG6pXAgaMahbiDEkcOhbmcga+G7gyBzbyB24bubaSBnaeG6oyDEkeG7i25oIDUwJSBiYW4gxJHhuqd1KiouDQoNCg0KIyMjIDMuMiBBbnhpZXR5DQoNCk3hu6VjIHRpw6p1IGzDoCBraeG7g20gxJHhu4tuaCB4ZW0gKip04bu3IGzhu4cgc2luaCB2acOqbiBjw7MgYmnhu4N1IGhp4buHbiBsbyDDonUgY8OzIGtow6FjIHbhu5tpIHThu7cgbOG7hyBnaeG6oyDEkeG7i25oIGzDoCA1MCUgaGF5IGtow7RuZyoqLg0KDQpU4burIGThu68gbGnhu4d1Og0KICANCiAgKiBCaeG6v24gYEFueGlldHlgIMSRxrDhu6NjIG3DoyBow7NhIHbhu5tpIGhhaSBnacOhIHRy4buLIGAiWWVzImAgaG/hurdjIGAiTm8iYC4NCiogJHhfMiA9IDM0JDogc+G7kSBzaW5oIHZpw6puIGPDsyBiaeG7g3UgaGnhu4duIGxvIMOidS4NCiogJG5fMiA9IDEwMSQ6IHThu5VuZyBz4buRIHNpbmggdmnDqm4gY8OzIGThu68gbGnhu4d1IGjhu6NwIGzhu4cuDQoNCioqR2nhuqMgdGh1eeG6v3QgdGjhu5FuZyBrw6oqKg0KJCQNCiAgXGJlZ2lue2Nhc2VzfQ0KSF8wOiBwID0gMC41ICYgXHRleHR7KFThu7cgbOG7hyBzaW5oIHZpw6puIGLhu4sgbG8gw6J1IGLhurFuZyA1MCUpfSBcXA0KSF8xOiBwIFxuZSAwLjUgJiBcdGV4dHsoVOG7tyBs4buHIHNpbmggdmnDqm4gYuG7iyBsbyDDonUga2jDoWMgNTAlKX0NClxlbmR7Y2FzZXN9DQokJA0KDQpgYGB7cn0NCngyIDwtIHN1bShkYXRhJEFueGlldHkgPT0gIlllcyIpDQpuMiA8LSBzdW0oIWlzLm5hKGRhdGEkQW54aWV0eSkpDQojIEtp4buDbSDEkeG7i25oIHAgPiAwLjUNCnByb3AudGVzdCh4ID0geDIsIG4gPSBuMiwgcCA9IDAuNSwgYWx0ZXJuYXRpdmUgPSAidHdvLnNpZGVkIikNCmBgYA0KDQoqKkvhur90IHF14bqjKioNCiAqICoqVOG7tyBs4buHIG3huqt1OioqDQogIA0KICAkJA0KICBcaGF0e3B9ID0gXGZyYWN7MzR9ezEwMX0gXGFwcHJveCAwLjMzNjYgXHRleHR7ICh04bupYyAzMy42NiUpfQ0KJCQNCiAgDQogICogKipHacOhIHRy4buLIHRo4buRbmcga8OqIGtp4buDbSDEkeG7i25oIChDaGktc3F1YXJlZCk6KioNCiAgJFheMiA9IDEwLjEzOSQNCiAgDQogICogKipwLXZhbHVlOioqDQogICRwID0gMC4wMDE0NTIkDQogIA0KICAqICoqS2hv4bqjbmcgdGluIGPhuq15IDk1JSBjaG8gdOG7tyBs4buHIHA6KioNCiAgDQogICQkDQogICgwLjI0NzU7IFwsIDAuNDM4NCkNCiQkDQoNCiAgKiBWw6wgKipwLXZhbHVlID0gMC4wMDE0NTIgPCAwLjA1KiosIHRhICoqYsOhYyBi4buPIGdp4bqjIHRodXnhur90IEjigoAqKiDhu58gbeG7qWMgw70gbmdoxKlhIDUlLg0KKiBDw7MgKipi4bqxbmcgY2jhu6luZyB0aOG7kW5nIGvDqioqIGNobyB0aOG6pXkgKip04bu3IGzhu4cgc2luaCB2acOqbiBjw7MgYmnhu4N1IGhp4buHbiBsbyDDonUga2jDoWMgNTAlKiouDQoqIEtob+G6o25nIHRpbiBj4bqteSA5NSUgY2hvIHThu7cgbOG7hyB0aOG7sWMgdOG6vyBsw6AgKip04burIDI0Ljc1JSDEkeG6v24gNDMuODQlKiosIGtow7RuZyBjaOG7qWEgZ2nDoSB0cuG7iyAwLjUuDQoqIFThu7cgbOG7hyBt4bqrdSBsw6AgKiozMy42NiUqKiwgdOG7qWMgbMOgICoqa2hv4bqjbmcgMS8zIHNpbmggdmnDqm4gY8OzIGJp4buDdSBoaeG7h24gbG8gw6J1KiouDQoNCiA+IEvhur90IHF14bqjIGtp4buDbSDEkeG7i25oIGNo4buJIHJhIHLhurFuZyB24bubaSBt4bupYyDDvSBuZ2jEqWEgNSUsIGPDsyDEkeG7pyBi4bqxbmcgY2jhu6luZyDEkeG7gyBiw6FjIGLhu48gZ2nhuqMgdGh1eeG6v3QgcuG6sW5nICoqdOG7tyBs4buHIHNpbmggdmnDqm4gY8OzIGJp4buDdSBoaeG7h24gbG8gw6J1IGzDoCA1MCUqKi4gVOG7tyBs4buHIGxvIMOidSB0aOG7sWMgdOG6vyDGsOG7m2MgdMOtbmggbMOgICoqa2hv4bqjbmcgMzMuNjYlKiosIHbhu5tpIGtob+G6o25nIHRpbiBj4bqteSA5NSUgdOG7qyAqKjI0Ljc1JSDEkeG6v24gNDMuODQlKiosIHRo4bqlcCBoxqFuIMSRw6FuZyBr4buDIDUwJS4gxJBp4buBdSBuw6B5IGNobyB0aOG6pXkgKip24bqlbiDEkeG7gSBsbyDDonUgbMOgIGhp4buHbiBo4buvdSBuaMawbmcga2jDtG5nIGNoaeG6v20gxJFhIHPhu5EqKiB0cm9uZyBuaMOzbSBzaW5oIHZpw6puIGto4bqjbyBzw6F0Lg0KDQoNCiMjICoqNC4gTeG7kEkgTEnDik4gSOG7hiBHSeG7rkEgMiBCSeG6vk4qKg0KDQojIyMgNC4xIERlcHJlc3Npb24gdsOgIEdlbmRlcg0KDQpgYGB7cn0NCiMgQuG6o25nIGNow6lvDQp0YmwgPC0gdGFibGUoZGF0YSRHZW5kZXIsIGRhdGEkRGVwcmVzc2lvbikNCmFkZG1hcmdpbnModGJsKQ0KYGBgDQoNCioqVOG7tyBs4buHIHRy4bqnbSBj4bqjbSB0aGVvIGdp4bubaToqKg0KICANCiAgKiBU4bu3IGzhu4cgdHLhuqdtIGPhuqNtIHRoZW8gZ2nhu5tpIHTDrW5oIG7hu686ICRcZnJhY3syOX17NzV9IFxhcHByb3ggMzguN1wlJA0KICAqIFThu7cgbOG7hyB0cuG6p20gY+G6o20gdGhlbyBnaeG7m2kgdMOtbmggbmFtOiAkXGZyYWN7Nn17MjZ9IFxhcHByb3ggMjMuMVwlJA0KIA0KDQpgYGB7cn0NCiMgQ2hpIGLDrG5oIHBoxrDGoW5nDQpjaGlzcS50ZXN0KHRibCkNCmBgYA0KKipL4bq/dCBxdeG6oyoqDQoqICoqQ2hpLXNxdWFyZWQgPSAxLjQ0MDkqKiwgZGYgPSAxDQoqICoqcC12YWx1ZSA9IDAuMjMqKg0KICANCioqRGnhu4VuIGdp4bqjaSoqOg0KICANCiAgKiBW4bubaSAkcCA9IDAuMjMgPiAwLjA1JCwgKipraMO0bmcgxJHhu6cgYuG6sW5nIGNo4bupbmcgxJHhu4MgYsOhYyBi4buPIEjigoAqKi4NCiogVOG7qWMgbMOgLCAqKmNoxrBhIGPDsyBi4bqxbmcgY2jhu6luZyB0aOG7kW5nIGvDqiBjaG8gdGjhuqV5IGPDsyBt4buRaSBsacOqbiBo4buHIGdp4buvYSBnaeG7m2kgdMOtbmggdsOgIHTDrG5oIHRy4bqhbmcgdHLhuqdtIGPhuqNtKiouDQoqIE7Ds2kgY8OhY2gga2jDoWMsIHThu7cgbOG7hyB0cuG6p20gY+G6o20gZ2nhu69hIG5hbSB2w6AgbuG7ryAqKmtow6FjIG5oYXUgduG7gSBt4bq3dCBxdWFuIHPDoXQqKiwgbmjGsG5nICoqY2jGsGEga2jDoWMgbmhhdSBjw7Mgw70gbmdoxKlhIHRo4buRbmcga8OqKiouDQoNCg0KYGBge3J9DQojIEhp4buHdSBoYWkgdOG7tyBs4buHDQpwcm9wLnRlc3QoYyh0YmxbIkZlbWFsZSIsICJZZXMiXSwgdGJsWyJNYWxlIiwgIlllcyJdKSwNCiAgICAgICAgICBjKHN1bSh0YmxbIkZlbWFsZSIsIF0pLCBzdW0odGJsWyJNYWxlIiwgXSkpKQ0KDQpgYGANCg0KKiAqKlThu7cgbOG7hyB0cuG6p20gY+G6o20g4bufIG7hu68gKHAxKSA9IDAuMzg2NyoqLCDhu58gbmFtIChwMikgPSAwLjIzMDgNCiogKipIaeG7h3UgdOG7tyBs4buHIMaw4bubYyBsxrDhu6NuZyA9IDE1LjYlKioNCiAgKiAqKjk1JSBDSSBj4bunYSBoaeG7h3UgdOG7tyBs4buHOiAoLTYuNiUsIDM3LjglKSoqDQogICogKipwLXZhbHVlID0gMC4yMyoqDQogICAgDQogICAgKipHaeG6o2kgdGjDrWNoKio6DQogICAgDQogICAgKiBLaG/huqNuZyB0aW4gY+G6rXkgYmFvIGfhu5NtIDAg4oeSICoqa2jDtG5nIGPDsyBz4buxIGtow6FjIGJp4buHdCBjw7Mgw70gbmdoxKlhIHRo4buRbmcga8OqIGdp4buvYSAyIGdp4bubaSoqLg0KICAqIEvhur90IHF14bqjIG7DoHkgKipwaMO5IGjhu6NwIHbhu5tpIGtp4buDbSDEkeG7i25oIGNoaS1zcXVhcmVkIOG7nyB0csOqbioqLg0KICANCg0KDQpgYGB7cn0NCmxpYnJhcnkoZXBpdG9vbHMpDQpsaWJyYXJ5KERlc2NUb29scykgICAgICAgICAgICAgIyBjaOG6oXkgbeG7l2kga2hpIG3hu58gbOG6oWkgUg0KIyBUw61uaCBSaXNrIFJhdGlvIChSUikNCnJpc2tyYXRpbyh0YmwpDQpgYGANCg0KICogKipSUiAoTWFsZSB2cyBGZW1hbGUpID0gMC41OTcqKg0KICAgICogKio5NSUgQ0k6ICgwLjI4MDsgMS4yNzMpKioNCiAgICAqICoqcC12YWx1ZSAoY2hpLXNxdWFyZSkgPSAwLjE1KioNCiAgICANCiAgICAqKkRp4buFbiBnaeG6o2kqKjoNCiAgICANCiAgICAqIFNpbmggdmnDqm4gbmFtIGPDsyAqKm5ndXkgY8ahIGLhu4sgdHLhuqdtIGPhuqNtIHRo4bqlcCBoxqFuIDQwLjMlIHNvIHbhu5tpIG7hu68qKiwgbmjGsG5nIGtob+G6o25nIHRpbiBj4bqteSAqKmNo4bupYSBnacOhIHRy4buLIDEqKiwgbsOqbiAqKmtow7RuZyBjw7Mgw70gbmdoxKlhIHRo4buRbmcga8OqKiouDQogICogcC12YWx1ZSA9IDAuMTUgPiAwLjA1IOKHkiAqKmtow7RuZyDEkeG7pyBi4bqxbmcgY2jhu6luZyDEkeG7gyBr4bq/dCBsdeG6rW4gc+G7sSBraMOhYyBiaeG7h3QgduG7gSBuZ3V5IGPGoSoqLg0KICANCg0KYGBge3J9DQojIFTDrW5oIE9kZHMgUmF0aW8gKE9SKQ0Kb2Rkc3JhdGlvKHRibCkNCg0KYGBgDQoNCiogKipPUiAoTWFsZSB2cyBGZW1hbGUpID0gMC40ODYqKg0KICAgICogKio5NSUgQ0k6ICgwLjE1OTsgMS4zMDcpKioNCiAgICAqICoqcC12YWx1ZSA9IDAuMTUqKg0KICAgIA0KICAgICoqRGnhu4VuIGdp4bqjaSoqOg0KICAgIA0KICAgICogU2luaCB2acOqbiBuYW0gY8OzICoqb2RkcyB0cuG6p20gY+G6o20gdGjhuqVwIGjGoW4gNTEuNCUqKiBzbyB24bubaSBu4buvIChvZGRzIGzDoCB4w6FjIHN14bqldCBi4buLIHRy4bqnbSBj4bqjbSBjaGlhIGNobyBraMO0bmcgYuG7iykuDQogICogVHV5IG5oacOqbiwgKipraG/huqNuZyB0aW4gY+G6rXkgY2jhu6lhIDEqKiwgdsOgIHAtdmFsdWUgPiAwLjA1IOKHkiAqKmtow7RuZyBjw7Mgw70gbmdoxKlhIHRo4buRbmcga8OqKiouDQogIA0KICAgPiBN4bq3YyBkw7kgdOG7tyBs4buHIHNpbmggdmnDqm4gbuG7ryBjw7MgYmnhu4N1IGhp4buHbiB0cuG6p20gY+G6o20gY2FvIGjGoW4gc2luaCB2acOqbiBuYW0gdHJvbmcgcXVhbiBzw6F0ICgzOC43JSB2cy4gMjMuMSUpLCBuaMawbmcga+G6v3QgcXXhuqMgY8OhYyBraeG7g20gxJHhu4tuaCB0aOG7kW5nIGvDqiAoQ2hpLXNxdWFyZWQsIGtp4buDbSDEkeG7i25oIGhhaSB04bu3IGzhu4csIFJSLCBPUikgxJHhu4F1IGNobyB0aOG6pXkgc+G7sSBraMOhYyBiaeG7h3QgbsOgeSAqKmNoxrBhIGPDsyDDvSBuZ2jEqWEgdGjhu5FuZyBrw6ogdOG6oWkgbeG7qWMgzrEgPSA1JSoqLiBEbyDEkcOzLCBjaMawYSBjw7MgxJHhu6cgYuG6sW5nIGNo4bupbmcgxJHhu4Mga+G6v3QgbHXhuq1uIHLhurFuZyAqKmdp4bubaSB0w61uaCBjw7Mg4bqjbmggaMaw4bufbmcgxJHhur9uIHThu7cgbOG7hyB0cuG6p20gY+G6o20gdHJvbmcgbeG6q3Uga2jhuqNvIHPDoXQgbsOgeSoqLg0KICANCiAgDQoNCiMjIyA0LjIgQW54aWV0eSB2w6AgTWFyaXRhbF9zdGF0dXMNCg0KYGBge3J9DQp0YmwyIDwtIHRhYmxlKGRhdGEkTWFyaXRhbF9zdGF0dXMsIGRhdGEkQW54aWV0eSkNCmFkZG1hcmdpbnModGJsMikNCmBgYA0KDQpUcm9uZyAxMDEgc2luaCB2acOqbjoNCiAgDQogICogMTYgbmfGsOG7nWkgxJHDoyBr4bq/dCBow7RuLCB0cm9uZyDEkcOzIDcgbmfGsOG7nWkgKDQzLjc1JSkgY8OzIGxvIMOidS4NCiAgKiA4NSBuZ8aw4budaSDEkeG7mWMgdGjDom4sIHRyb25nIMSRw7MgMjcgbmfGsOG7nWkgKDMxLjc2JSkgY8OzIGxvIMOidS4NCg0KYGBge3J9DQpjaGlzcS50ZXN0KHRibDIpDQpgYGANCg0KKiAqKkNoaS1zcXVhcmVkID0gMC40MTI2KiosIGRmID0gMQ0KKiAqKnAtdmFsdWUgPSAwLjUyMDcqKg0KICANCiAgKipEaeG7hW4gZ2nhuqNpKio6DQogIA0KICAqICRIXzAkOiBLaMO0bmcgY8OzIG3hu5FpIGxpw6puIGjhu4cgZ2nhu69hIHTDrG5oIHRy4bqhbmcgaMO0biBuaMOibiB2w6AgbG8gw6J1Lg0KICAqICRwID0gMC41MjA3ID4gMC4wNSQg4oeSICoqS2jDtG5nIGLDoWMgYuG7jyBI4oKAKiouDQogICogKipDaMawYSBjw7MgYuG6sW5nIGNo4bupbmcgdGjhu5FuZyBrw6oqKiBjaG8gdGjhuqV5ICoqdMOsbmggdHLhuqFuZyBow7RuIG5ow6JuIOG6o25oIGjGsOG7n25nIMSR4bq/biB0w6xuaCB0cuG6oW5nIGxvIMOidSoqLg0KDQoNCmBgYHtyfQ0KcHJvcC50ZXN0KA0KICBjKHRibDJbIlllcyIsICJZZXMiXSwgdGJsMlsiTm8iLCAiWWVzIl0pLA0KICBjKHN1bSh0YmwyWyJZZXMiLCBdKSwgc3VtKHRibDJbIk5vIiwgXSkpDQopDQpgYGANCg0KKiAqKlThu7cgbOG7hyBjw7MgbG8gw6J1IOG7nyBuZ8aw4budaSDEkcOjIGvhur90IGjDtG4qKjogJFxmcmFjezd9ezE2fSA9IDQzLjc1XCUkDQogICogKipU4bu3IGzhu4cgY8OzIGxvIMOidSDhu58gbmfGsOG7nWkgY2jGsGEga+G6v3QgaMO0bioqOiAkXGZyYWN7Mjd9ezg1fSA9IDMxLjc2XCUkDQogICogKipIaeG7h3UgdOG7tyBs4buHIMaw4bubYyBsxrDhu6NuZyA9IDExLjk5JSoqDQogICogKio5NSUgQ0kgY2hvIGhp4buHdSB04bu3IGzhu4c6ICgtMTcuOTclOyA0MS45NCUpKioNCiAgKiAqKnAtdmFsdWUgPSAwLjUyMDcqKg0KICAgIA0KICAqKktob+G6o25nIHRpbiBj4bqteSBjaOG7qWEgMCDih5IgY2jGsGEgY8OzIHPhu7Ega2jDoWMgYmnhu4d0IMSRw6FuZyBr4buDKiogZ2nhu69hIGhhaSBuaMOzbS4NCiAgDQoNCg0KYGBge3J9DQojIFTDrW5oIFJpc2sgUmF0aW8gKFJSKQ0Kcmlza3JhdGlvKHRibDIpDQpgYGANCg0KICogKipSUiAobWFycmllZCB2cyB1bm1hcnJpZWQpID0gMS4zNzcqKg0KICAgICogKio5NSUgQ0k6ICgwLjcyODsgMi42MDQpKioNCiAgICAqICoqcC12YWx1ZSAoY2hpLXNxdWFyZSkgPSAwLjM1MioqDQogICAgDQogICAgTmfGsOG7nWkgxJHDoyBr4bq/dCBow7RuIGPDsyAqKm5ndXkgY8ahIGLhu4sgbG8gw6J1IGNhbyBoxqFuIDM3LjclKiogc28gduG7m2kgbmfGsOG7nWkgY2jGsGEga+G6v3QgaMO0biwgbmjGsG5nOg0KICAgIA0KICAgICogS2hv4bqjbmcgdGluIGPhuq15ICoqY2jhu6lhIDEqKiDih5IgKipraMO0bmcgY8OzIMO9IG5naMSpYSB0aOG7kW5nIGvDqioqLg0KDQoNCmBgYHtyfQ0KIyBUw61uaCBPZGRzIFJhdGlvIChPUikNCm9kZHNyYXRpbyh0YmwyKQ0KDQpgYGANCg0KKiAqKk9SID0gMS42NjgqKg0KICAgICogKio5NSUgQ0k6ICgwLjUzNDsgNS4wMzYpKioNCiAgICAqICoqcC12YWx1ZSA9IDAuMzUyKioNCiAgICANCiAgICBOZ8aw4budaSDEkcOjIGvhur90IGjDtG4gY8OzIG9kZHMgbG8gw6J1ICoqY2FvIGjGoW4gMS42NyBs4bqnbioqIHNvIHbhu5tpIG5nxrDhu51pIGNoxrBhIGvhur90IGjDtG4uIFR1eSBuaGnDqm4sIHAgPiAwLjA1IHbDoCBraG/huqNuZyB0aW4gY+G6rXkgY2jhu6lhIDEg4oeSICoqa2jDtG5nIGPDsyDDvSBuZ2jEqWEgdGjhu5FuZyBrw6oqKi4NCiAgDQogPiBN4bq3YyBkw7kgdOG7tyBs4buHIHNpbmggdmnDqm4gxJHDoyBr4bq/dCBow7RuIGPDsyBiaeG7g3UgaGnhu4duIGxvIMOidSAoNDMuNzUlKSBjYW8gaMahbiBzbyB24bubaSBzaW5oIHZpw6puIMSR4buZYyB0aMOibiAoMzEuNzYlKSwgY8OhYyBraeG7g20gxJHhu4tuaCB0aOG7kW5nIGvDqiAoQ2hpLXNxdWFyZWQsIGtp4buDbSDEkeG7i25oIGhhaSB04bu3IGzhu4csIFJSIHbDoCBPUikgxJHhu4F1IGNobyB0aOG6pXkgKipz4buxIGtow6FjIGJp4buHdCBuw6B5IGtow7RuZyBjw7Mgw70gbmdoxKlhIHRo4buRbmcga8OqKiog4bufIG3hu6ljIMO9IG5naMSpYSA1JS4gxJBp4buBdSBuw6B5IGNobyB0aOG6pXkgKip0w6xuaCB0cuG6oW5nIGjDtG4gbmjDom4ga2jDtG5nIGPDsyBt4buRaSBsacOqbiBo4buHIHLDtSByw6BuZyB24bubaSB0w6xuaCB0cuG6oW5nIGxvIMOidSoqIHRyb25nIG3huqt1IGto4bqjbyBzw6F0IGhp4buHbiB04bqhaS4NCiAgDQoNCiMjICoqNS4gSOG7kkkgUVVZIExPR0lTVElDKioNCg0KIyMjIDUuMSDEkMahbiBiaeG6v246IA0KIyMjIyBL4bq/dCBxdeG6oyBtw7QgaMOsbmggKipo4buTaSBxdXkgbmjhu4sgcGjDom4gduG7m2kgaMOgbSBsacOqbiBr4bq/dCBsb2dpdCoqOg0KDQoqKk3hu6VjIHRpw6p1IHBow6JuIHTDrWNoKioNCiAgDQogIFhlbSB4w6l0IHhlbSAqKm7Eg20gaOG7jWMgKFllYXJcX29mXF9TdHVkeSkqKiBjw7Mg4bqjbmggaMaw4bufbmcgxJHhur9uICoqa2jhuqMgbsSDbmcgYuG7iyB0cuG6p20gY+G6o20qKiBj4bunYSBzaW5oIHZpw6puIGtow7RuZy4NCuKGkiBT4butIGThu6VuZyAqKm3DtCBow6xuaCBo4buTaSBxdXkgbG9naXN0aWMqKi4NCg0KKirDnSBuZ2jEqWEgY+G7p2EgaOG7hyBz4buRIGjhu5NpIHF1eSBsb2dpc3RpYyoqDQogIA0KICBUcm9uZyBo4buTaSBxdXkgbG9naXN0aWMsICoqbeG7l2kgaOG7hyBz4buRKiogY2hvIGJp4bq/dCAqKm3hu6ljIHRoYXkgxJHhu5VpIGxvZy1vZGRzIGLhu4sgdHLhuqdtIGPhuqNtKiogc28gduG7m2kgbmjDs20gdGhhbSBjaGnhur91ICgqKlllYXIgMSoqKS4NClNhdSBraGkgbOG6pXkgKipleHBvbmVudGlhbCoqIGPhu6dhIGjhu4cgc+G7kSwgdGEgc+G6vSBjw7MgKipvZGRzIHJhdGlvKiogKHThu7cgbOG7hyBjxrDhu6NjKS4NCg0KDQoNCmBgYHtyfQ0KbG9naXRfbW9kZWwxIDwtIGdsbShEZXByZXNzaW9uIH4gWWVhcl9vZl9TdHVkeSwgZGF0YSA9IGRhdGEsIGZhbWlseSA9IGJpbm9taWFsKGxpbmsgPSAibG9naXQiKSkNCnN1bW1hcnkobG9naXRfbW9kZWwxKQ0KYGBgDQogID4g8J+UjSAqKlTDrW5oIHjDoWMgc3XhuqV0IHThu6sgbG9nLW9kZHMgYuG6sW5nIGPDtG5nIHRo4bupYyoqOg0KICANCiAgJCQNCiAgcCA9IFxmcmFje2Vee1x0ZXh0e2xvZy1vZGRzfX19ezEgKyBlXntcdGV4dHtsb2ctb2Rkc319fQ0KJCQNCg0KKkRp4buFbiBnaeG6o2kgdOG7q25nIGjhu4cgc+G7kSoqDQogIA0KICAoSW50ZXJjZXB0KSA9IOKAkzAuNzI4Mg0KICANCiAgKiDEkMOieSBsw6AgKipsb2ctb2RkcyoqIGLhu4sgdHLhuqdtIGPhuqNtIGPhu6dhICoqbmjDs20gdGhhbSBjaGnhur91IChzaW5oIHZpw6puIG7Eg20gMSkqKi4NCiAgKiDEkOG7lWkgc2FuZyB4w6FjIHN14bqldDoNCiAgDQogICQkDQogIHAgPSBcZnJhY3tlXnstMC43MjgyfX17MSArIGVeey0wLjcyODJ9fSDiiYggMC4zMjUNCiQkDQogIA0KICDihpIgKipTaW5oIHZpw6puIG7Eg20gMSBjw7MgeMOhYyBzdeG6pXQgYuG7iyB0cuG6p20gY+G6o20ga2hv4bqjbmcgMzIuNSUqKg0KDQpZZWFyIDI6IEVzdGltYXRlID0gKiorMC4yNTgyKioNCiAgDQogICogU28gduG7m2kgc2luaCB2acOqbiBuxINtIDEsICoqbG9nLW9kZHMgYuG7iyB0cuG6p20gY+G6o20gY+G7p2EgbsSDbSAyIHTEg25nIHRow6ptIDAuMjU4MiDEkcahbiB24buLKiouDQogICogT2RkcyByYXRpbzoNCiAgDQogICQkDQogIFxleHAoMC4yNTgyKSDiiYggMS4yOTQNCiQkDQogIA0KICDihpIgKipTaW5oIHZpw6puIG7Eg20gMiBjw7Mgb2RkcyBi4buLIHRy4bqnbSBj4bqjbSBjYW8gaMahbiAyOS40JSoqIHNvIHbhu5tpIG7Eg20gMS4NCiAgKiBUdXkgbmhpw6puLCAqKnAtdmFsdWUgPSAwLjYxODIgPiAwLjA1Kiog4oaSIGtow7RuZyBjw7Mgw70gbmdoxKlhIHRo4buRbmcga8OqLg0KICDihpIgS2jDtG5nIHRo4buDIGvhur90IGx14bqtbiBjw7Mgc+G7sSBraMOhYyBiaeG7h3QuDQoNClllYXIgMzogRXN0aW1hdGUgPSAqKiswLjM5MTgqKg0KICANCiAgKiBTbyB24bubaSBzaW5oIHZpw6puIG7Eg20gMSwgbG9nLW9kZHMgYuG7iyB0cuG6p20gY+G6o20gdMSDbmcgKiorMC4zOTE4KiogxJHGoW4gduG7iy4NCiAgKiBPZGRzIHJhdGlvOg0KICANCiAgJCQNCiAgXGV4cCgwLjM5MTgpIOKJiCAxLjQ3OQ0KJCQNCiAgDQogIOKGkiAqKlNpbmggdmnDqm4gbsSDbSAzIGPDsyBvZGRzIGLhu4sgdHLhuqdtIGPhuqNtIGNhbyBoxqFuIDQ3LjklKiogc28gduG7m2kgbsSDbSAxLg0KICAqICoqcC12YWx1ZSA9IDAuNDU2OSA+IDAuMDUqKiDihpIgY8Wpbmcga2jDtG5nIMSR4bunIMO9IG5naMSpYSB0aOG7kW5nIGvDqi4NCg0KICANClllYXIgNDogRXN0aW1hdGUgPSAqKuKAkzEuMjE3NyoqDQogIA0KICAqIFNvIHbhu5tpIHNpbmggdmnDqm4gbsSDbSAxLCAqKmxvZy1vZGRzIGLhu4sgdHLhuqdtIGPhuqNtIGdp4bqjbSAxLjIxNzcgxJHGoW4gduG7iyoqLg0KICAqIE9kZHMgcmF0aW86DQogIA0KICAkJA0KICBcZXhwKC0xLjIxNzcpIOKJiCAwLjI5Ng0KJCQNCiAgDQogIOKGkiAqKlNpbmggdmnDqm4gbsSDbSA0IGPDsyBvZGRzIGLhu4sgdHLhuqdtIGPhuqNtIHRo4bqlcCBoxqFuIFx+NzAuNCUqKiBzbyB24bubaSBuxINtIDEuDQoqIE5oxrBuZyAqKnAtdmFsdWUgPSAwLjI3NTkgPiAwLjA1Kiog4oaSIHbhuqtuIGtow7RuZyBjw7Mgw70gbmdoxKlhIHRo4buRbmcga8OqLg0KDQoNCioqVOG7lW5nIGvhur90IHRy4buxYyBxdWFuKioNCiAgDQogIHwgTmjDs20gICB8IEjhu4cgc+G7kSDGsOG7m2MgbMaw4bujbmcgKGxvZy1vZGRzKSB8IE9kZHMgcmF0aW8gfCBEaeG7hW4gZ2nhuqNpIG5n4bqvbiAgICAgICAgICAgICAgICAgICAgICAgIHwgw50gbmdoxKlhIHRo4buRbmcga8OqIHwNCiAgfCAtLS0tLS0gfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8IC0tLS0tLS0tLS0gfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwgLS0tLS0tLS0tLS0tLS0tLSB8DQogIHwgWWVhciAxIHwg4oCTMC43MjgyIChJbnRlcmNlcHQpICAgICAgICB8IOKAkyAgICAgICAgICB8IFThu7cgbOG7hyB0cuG6p20gY+G6o20gbuG7gW46IFx+MzIuNSUgICAgICAgICAgIHwg4pyFIEPDsyDDvSBuZ2jEqWEgICAgIHwNCiAgfCBZZWFyIDIgfCArMC4yNTgyICAgICAgICAgICAgICAgICAgICB8IDEuMjk0ICAgICAgfCBPZGRzIHRy4bqnbSBj4bqjbSDihpEgMjkuNCUgc28gduG7m2kgWWVhciAxICAgfCDinYwgS2jDtG5nIHLDtSByw6BuZyAgfA0KICB8IFllYXIgMyB8ICswLjM5MTggICAgICAgICAgICAgICAgICAgIHwgMS40NzkgICAgICB8IE9kZHMgdHLhuqdtIGPhuqNtIOKGkSA0Ny45JSBzbyB24bubaSBZZWFyIDEgICB8IOKdjCBLaMO0bmcgcsO1IHLDoG5nICB8DQogIHwgWWVhciA0IHwg4oCTMS4yMTc3ICAgICAgICAgICAgICAgICAgICB8IDAuMjk2ICAgICAgfCBPZGRzIHRy4bqnbSBj4bqjbSDihpMgXH43MC40JSBzbyB24bubaSBZZWFyIDEgfCDinYwgS2jDtG5nIHLDtSByw6BuZyAgfA0KDQoNCg0KKipN4bulYyB0acOqdSBtw7QgaMOsbmgqKg0KICANCiAgWGVtIHjDqXQgbeG7kWkgcXVhbiBo4buHIGdp4buvYSAqKm7Eg20gaOG7jWMgKFllYXJcX29mXF9TdHVkeSkqKiB2w6AgeMOhYyBzdeG6pXQgKipi4buLIHRy4bqnbSBj4bqjbSAoRGVwcmVzc2lvbikqKiB0aMO0bmcgcXVhIG3DtCBow6xuaCBo4buTaSBxdXkgbmjhu4sgcGjDom4gduG7m2kgKipsacOqbiBr4bq/dCBwcm9iaXQqKi4NCg0KVHJvbmcgbcO0IGjDrG5oIG7DoHk6DQogIA0KICAqIFBow6lwIGJp4bq/biDEkeG7lWkgbGnDqm4ga+G6v3QgbMOgICoqaMOgbSBjaHXhuqluIG5naOG7i2NoIMSR4bqjbyDOpuKBu8K5KHApKiouDQoqIE3hu5dpIGjhu4cgc+G7kSB0aOG7gyBoaeG7h24gKipt4bupYyB0aGF5IMSR4buVaSB0cm9uZyDEkcahbiB24buLIHotc2NvcmUgKGNodeG6qW4gaMOzYSkqKiBj4bunYSB4w6FjIHN14bqldCB0cuG6p20gY+G6o20gc28gduG7m2kgbmjDs20gdGhhbSBjaGnhur91IChZZWFyIDEpLg0KDQojIyMjIEvhur90IHF14bqjIG3DtCBow6xuaCAqKmjhu5NpIHF1eSBuaOG7iyBwaMOibiB24bubaSBow6BtIGxpw6puIGvhur90IHByb2JpdCoqOg0KDQpgYGB7cn0NCnByb2JpdF9tb2RlbDEgPC0gZ2xtKERlcHJlc3Npb24gfiBZZWFyX29mX1N0dWR5LCBkYXRhID0gZGF0YSwgZmFtaWx5ID0gYmlub21pYWwobGluayA9ICJwcm9iaXQiKSkNCnN1bW1hcnkocHJvYml0X21vZGVsMSkNCmBgYA0KDQoqKkRp4buFbiBnaeG6o2kgdOG7q25nIGjhu4cgc+G7kSoqDQogIA0KKEludGVyY2VwdCkgPSDigJMwLjQ1MjENCiAgDQogICogxJDDonkgbMOgICoqei1zY29yZSoqIHTGsMahbmcg4bupbmcgduG7m2kgeMOhYyBzdeG6pXQgdHLhuqdtIGPhuqNtIGPhu6dhICoqbmjDs20gc2luaCB2acOqbiBuxINtIDEqKi4NCiAgKiDEkOG7lWkgc2FuZyB4w6FjIHN14bqldDoNCiAgDQogICQkDQogIHAgPSBcUGhpKC0wLjQ1MjEpIOKJiCAwLjMyNQ0KJCQNCiAgDQogICoqU2luaCB2acOqbiBuxINtIDEgY8OzIHjDoWMgc3XhuqV0IGLhu4sgdHLhuqdtIGPhuqNtIGtob+G6o25nIDMyLjUlKiouDQoNCiAgKipwLXZhbHVlID0gMC4wMjI3Kiog4oaSIGPDsyDDvSBuZ2jEqWEgdGjhu5FuZyBrw6og4bufIG3hu6ljIDUlLg0KDQogIFllYXIgMjogRXN0aW1hdGUgPSArMC4xNTg4DQogIA0KICAqIFNvIHbhu5tpIHNpbmggdmnDqm4gbsSDbSAxLCBzaW5oIHZpw6puIG7Eg20gMiBjw7MgKip6LXNjb3JlIHTEg25nIHRow6ptIDAuMTU4OCoqLg0KICAqIFjDoWMgc3XhuqV0IHTGsMahbmcgxJHhu5FpOg0KICANCiAgJCQNCiAgcCA9IFxQaGkoLTAuNDUyMSArIDAuMTU4OCkg4omIIFxQaGkoLTAuMjkzMykg4omIIDAuMzg1DQokJA0KICANCiAg4oaSIFjDoWMgc3XhuqV0IHRy4bqnbSBj4bqjbSB0xINuZyBuaOG6uSBsw6puIGtob+G6o25nICoqMzguNSUqKi4NCg0KICAqKnAtdmFsdWUgPSAwLjYxODYqKiDihpIgKipraMO0bmcgxJHhu6cgYuG6sW5nIGNo4bupbmcgdGjhu5FuZyBrw6oqKi4NCg0KICBZZWFyIDM6IEVzdGltYXRlID0gKzAuMjQxNw0KICANCiAgKiBTbyB24bubaSBuxINtIDEsIHotc2NvcmUgdMSDbmcgdGjDqm0gKiowLjI0MTcqKi4NCiAgKiBYw6FjIHN14bqldDoNCiAgDQogICQkDQogIFxQaGkoLTAuNDUyMSArIDAuMjQxNykg4omIIFxQaGkoLTAuMjEwNCkg4omIIDAuNDE3DQokJA0KICANCiAg4oaSICoqWMOhYyBzdeG6pXQgdHLhuqdtIGPhuqNtIFx+NDEuNyUqKiBjaG8gc2luaCB2acOqbiBuxINtIDMuDQoNCiAgKipwLXZhbHVlID0gMC40NTc2Kiog4oaSIGtow7RuZyBjw7Mgw70gbmdoxKlhIHRo4buRbmcga8OqLg0KDQogIFllYXIgNDogRXN0aW1hdGUgPSDigJMwLjY5ODINCiAgDQogICogU28gduG7m2kgbsSDbSAxLCB6LXNjb3JlIGdp4bqjbSB0aMOqbSAqKjAuNjk4MioqLg0KICAqIFThu5VuZyB6LXNjb3JlOg0KICANCiAgJCQNCiAgLTAuNDUyMSAtIDAuNjk4MiA9IC0xLjE1MDMNClxSaWdodGFycm93IHAg4omIIFxQaGkoLTEuMTUwMykg4omIIDAuMTI1DQokJA0KICANCiAg4oaSICoqWMOhYyBzdeG6pXQgYuG7iyB0cuG6p20gY+G6o20gZ2nhuqNtIHh14buRbmcgXH4xMi41JSoqLg0KDQogICoqcC12YWx1ZSA9IDAuMjQ1OSoqIOKGkiBjxaluZyBraMO0bmcgY8OzIMO9IG5naMSpYSB0aOG7kW5nIGvDqi4NCg0KKipUw7NtIHThuq90IGLhuqNuZyBkaeG7hW4gZ2nhuqNpKioNCiAgDQogIHwgTmjDs20gICB8IFotc2NvcmUgKHThu5VuZykgfCBYw6FjIHN14bqldCBi4buLIHRy4bqnbSBj4bqjbSAoxrDhu5tjIHTDrW5oKSB8IFNvIHbhu5tpIFllYXIgMSB8IMOdIG5naMSpYSB0aOG7kW5nIGvDqiB8DQogIHwgLS0tLS0tIHwgLS0tLS0tLS0tLS0tLS0gfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwgLS0tLS0tLS0tLS0tLSB8IC0tLS0tLS0tLS0tLS0tLS0gfA0KICB8IFllYXIgMSB8IOKAkzAuNDUyMSAgICAgICAgfCAzMi41JSAgICAgICAgICAgICAgICAgICAgICAgICAgIHwg4oCUICAgICAgICAgICAgIHwg4pyFIEPDsyAgICAgICAgICAgICB8DQogIHwgWWVhciAyIHwg4oCTMC4yOTMzICAgICAgICB8IDM4LjUlICAgICAgICAgICAgICAgICAgICAgICAgICAgfCDihpEgbmjhurkgICAgICAgICB8IOKdjCBLaMO0bmcgICAgICAgICAgfA0KICB8IFllYXIgMyB8IOKAkzAuMjEwNCAgICAgICAgfCA0MS43JSAgICAgICAgICAgICAgICAgICAgICAgICAgIHwg4oaRIG5o4bq5ICAgICAgICAgfCDinYwgS2jDtG5nICAgICAgICAgIHwNCiAgfCBZZWFyIDQgfCDigJMxLjE1MDMgICAgICAgIHwgMTIuNSUgICAgICAgICAgICAgICAgICAgICAgICAgICB8IOKGkyByw7UgcuG7h3QgICAgICB8IOKdjCBLaMO0bmcgICAgICAgICAgfA0KICANCiMjIyMgS+G6v3QgcXXhuqMgZOG7sSBiw6FvIHThu6sgbcO0IGjDrG5oIGxpw6puIGvhur90IGxvZ2l0DQoNClPhu60gZOG7pW5nIG3DtCBow6xuaCBo4buTaSBxdXkgbG9naXN0aWMgxJHhu4MgZOG7sSDEkW/DoW4gKip4w6FjIHN14bqldCBi4buLIHRy4bqnbSBj4bqjbSoqIChgRGVwcmVzc2lvbmApIGThu7FhIHRyw6puIGJp4bq/biBgWWVhcl9vZl9TdHVkeWAuDQoNCg0KYGBge3J9DQpuZXdfc3R1ZGVudCA8LSBkYXRhLmZyYW1lKFllYXJfb2ZfU3R1ZHkgPSAiWWVhciA0IikNCmBgYA0KDQoNCmBgYHtyfQ0KIyBQcm9iYWJpbGl0eSBwcmVkaWN0aW9uICh0eXBlID0gInJlc3BvbnNlIikNCnByZWRpY3QobG9naXRfbW9kZWwxLCBuZXdkYXRhID0gbmV3X3N0dWRlbnQsIHR5cGUgPSAicmVzcG9uc2UiKQ0KYGBgDQo+IEThu7FhIHRyw6puIG3DtCBow6xuaCBo4buTaSBxdXkgbG9naXN0aWMsIHNpbmggdmnDqm4gbsSDbSA0IGPDsyAqKnjDoWMgc3XhuqV0IGLhu4sgdHLhuqdtIGPhuqNtIGtob+G6o25nIDEyLjUlKiouDQoNCg0KYGBge3J9DQojIExvZy1vZGRzIHByZWRpY3Rpb24gKHR5cGUgPSAibGluayIpDQpwcmVkaWN0KGxvZ2l0X21vZGVsMSwgbmV3ZGF0YSA9IG5ld19zdHVkZW50LCB0eXBlID0gImxpbmsiKQ0KYGBgDQo+IEdpw6EgdHLhu4sgbG9nLW9kZHMgdMawxqFuZyDhu6luZyB24bubaSB4w6FjIHN14bqldCB0csOqbiBsw6AgKirigJMxLjk0NTkxKiosIHThu6ljIGzDoCBt4bupYyDEkeG7mSBy4bunaSBybyBi4buLIHRy4bqnbSBj4bqjbSBj4bunYSBzaW5oIHZpw6puIG7Eg20gNCBsw6AgKipy4bqldCB0aOG6pXAqKiBzbyB24bubaSB0cnVuZyBiw6xuaC4NCg0KDQpgYGB7cn0NCiMgQ29udHJpYnV0aW9uIG9mIGVhY2ggcHJlZGljdG9yICh0eXBlID0gInRlcm1zIikNCnByZWRpY3QobG9naXRfbW9kZWwxLCBuZXdkYXRhID0gbmV3X3N0dWRlbnQsIHR5cGUgPSAidGVybXMiKQ0KDQpgYGANCj4gTmjDs20gIlllYXIgNCIgbMOgbSAqKmdp4bqjbSBsb2ctb2RkcyDEkWkgMS4yODA4IMSRxqFuIHbhu4sqKiBzbyB24bubaSBuaMOzbSB0aGFtIGNoaeG6v3UgbMOgIHNpbmggdmnDqm4gbsSDbSAxLg0KDQoqKkvhur90IGx14bqtbioqDQo+IFNvIHbhu5tpIHNpbmggdmnDqm4gbsSDbSAxLCBzaW5oIHZpw6puIG7Eg20gNCBjw7MgKipuZ3V5IGPGoSBi4buLIHRy4bqnbSBj4bqjbSB0aOG6pXAgaMahbiDEkcOhbmcga+G7gyoqLiBD4bulIHRo4buDLCBtw7QgaMOsbmggxrDhu5tjIHTDrW5oIHLhurFuZyBt4buZdCBzaW5oIHZpw6puIG7Eg20gNCBjw7Mga2hv4bqjbmcgKioxMi41JSBraOG6oyBuxINuZyBi4buLIHRy4bqnbSBj4bqjbSoqLCB0aOG6pXAgaMahbiBn4bqnbiAqKjIyIMSRaeG7g20gcGjhuqduIHRyxINtKiogc28gduG7m2kgc2luaCB2acOqbiBuxINtIDEuIFR1eSBuaGnDqm4sIMSR4buDIGto4bqzbmcgxJHhu4tuaCBt4buRaSBsacOqbiBo4buHIG7DoHkgY8OzIMO9IG5naMSpYSB0aOG7kW5nIGvDqiBoYXkga2jDtG5nLCBj4bqnbiB4ZW0geMOpdCB0aMOqbSAqKmdpw6EgdHLhu4sgcCoqIHbDoCAqKsSR4buZIHRpbiBj4bqteSoqIGPhu6dhIG3DtCBow6xuaC4NCg0KYGBge3J9DQojIFByb2JhYmlsaXR5IHByZWRpY3Rpb24gKHR5cGUgPSAicmVzcG9uc2UiKQ0KcHJlZGljdChwcm9iaXRfbW9kZWwxLCBuZXdkYXRhID0gbmV3X3N0dWRlbnQsIHR5cGUgPSAicmVzcG9uc2UiKQ0KYGBgDQojIyMjIEvhur90IHF14bqjIGThu7EgYsOhbyB04burIG3DtCBow6xuaCBsacOqbiBr4bq/dCBwcm9iaXQNCg0KYGBge3J9DQojIFotc2NvcmUgcHJlZGljdGlvbiAodHlwZSA9ICJsaW5rIikNCnByZWRpY3QocHJvYml0X21vZGVsMSwgbmV3ZGF0YSA9IG5ld19zdHVkZW50LCB0eXBlID0gImxpbmsiKQ0KYGBgDQpE4buxIMSRb8OhbiAqKmto4bqjIG7Eg25nIGLhu4sgdHLhuqdtIGPhuqNtKiogY+G7p2EgbeG7mXQgc2luaCB2acOqbiBuxINtIDQgZOG7sWEgdHLDqm4gbcO0IGjDrG5oICoqaOG7k2kgcXV5IHByb2JpdCoqLg0KDQpgYGB7cn0NCiMgQ29udHJpYnV0aW9uIG9mIGVhY2ggcHJlZGljdG9yICh0eXBlID0gInRlcm1zIikNCnByZWRpY3QocHJvYml0X21vZGVsMSwgbmV3ZGF0YSA9IG5ld19zdHVkZW50LCB0eXBlID0gInRlcm1zIikNCg0KYGBgDQoqKkvhur90IGx14bqtbioqDQogIA0KICA+IFRoZW8gbcO0IGjDrG5oIGjhu5NpIHF1eSAqKnByb2JpdCoqLCBzaW5oIHZpw6puIG7Eg20gNCBjw7MgKip4w6FjIHN14bqldCBi4buLIHRy4bqnbSBj4bqjbSBsw6AgMTIuNSUqKiwgdGjhuqVwIGjGoW4gxJHDoW5nIGvhu4Mgc28gduG7m2kgc2luaCB2acOqbiBuxINtIDEgKG5ow7NtIHRoYW0gY2hp4bq/dSkuIFotc2NvcmUgdMawxqFuZyDhu6luZyBsw6Ag4oCTMS4xNSwgY2hvIHRo4bqleSBuZ3V5IGPGoSB0cuG6p20gY+G6o20gY+G7p2Egc2luaCB2acOqbiBuxINtIDQgbMOgIHRo4bqlcCBoxqFuIHRydW5nIGLDrG5oLiBQaOG6p24gxJHDs25nIGfDs3AgY+G7p2EgbmjDs20g4oCcWWVhciA04oCdIMSRw6MgbMOgbSAqKmdp4bqjbSBaLXNjb3JlIGtob+G6o25nIDAuNzQgxJHGoW4gduG7iyoqLCBzbyB24bubaSBuaMOzbSB0aGFtIGNoaeG6v3UuDQoNCg0KIyMjIDUuMiDEkGEgYmnhur9uDQoNCiMjIyMgS+G6v3QgcXXhuqMgbcO0IGjDrG5oICoqaOG7k2kgcXV5IG5o4buLIHBow6JuIHbhu5tpIGjDoG0gbGnDqm4ga+G6v3QgbG9naXQqKjoNCg0KTeG7pWMgdGnDqnU6DQogIEThu7EgxJFvw6FuIGto4bqjIG7Eg25nICoqYuG7iyB0cuG6p20gY+G6o20qKiBj4bunYSBzaW5oIHZpw6puIGThu7FhIHRyw6puIGhhaSB54bq/dSB04buROg0KICANCiAgKiBDw7MgdOG7q25nIGLhu4sgKipob+G6o25nIGxv4bqhbiAoUGFuaWMgYXR0YWNrKSoqIGhheSBraMO0bmcuDQogICogQ8OzIGLhu4sgKipsbyDDonUgKEFueGlldHkpKiogaGF5IGtow7RuZy4NCg0KYGBge3J9DQpsb2dpdF9tb2RlbDIgPC0gZ2xtKERlcHJlc3Npb24gfiBQYW5pY19hdHRhY2srIEFueGlldHksIGRhdGEgPSBkYXRhLCBmYW1pbHkgPSBiaW5vbWlhbChsaW5rID0gImxvZ2l0IikpDQpzdW1tYXJ5KGxvZ2l0X21vZGVsMikNCg0KYGBgDQoNCioqw50gbmdoxKlhIHThu6tuZyBo4buHIHPhu5EgaOG7k2kgcXV5IChsb2dpdCBzY2FsZSk6KioNCiAgDQogICoqKEludGVyY2VwdCkgPSAtMS40NTAxKioNCiAg4oaSIMSQw6J5IGzDoCAqKmxvZy1vZGRzKiogYuG7iyB0cuG6p20gY+G6o20ga2hpIGPhuqMgaGFpIHnhur91IHThu5EgKipQYW5pYyBhdHRhY2sgPSBObyoqIHbDoCAqKkFueGlldHkgPSBObyoqLg0K4oeSIFjDoWMgc3XhuqV0IGLhu4sgdHLhuqdtIGPhuqNtIOG7nyBuaMOzbSBuw6B5IGzDoDoNCiAgDQogICQkDQogIFxoYXR7cH1fMCA9IFxmcmFjezF9ezEgKyBcZXhwKDEuNDUwMSl9IFxhcHByb3ggMC4xOSBccXVhZCBcdGV4dHsodOG7qWMga2hv4bqjbmcgMTklKX0NCiQkDQogIA0KDQogICoqUGFuaWNcX2F0dGFja1llcyA9IDEuMDU5NCoqDQogIOKGkiBO4bq/dSBt4buZdCBzaW5oIHZpw6puICoqdOG7q25nIHRy4bqjaSBxdWEgaG/huqNuZyBsb+G6oW4qKiwgdGjDrCAqKmxvZy1vZGRzKiogYuG7iyB0cuG6p20gY+G6o20gKip0xINuZyB0aMOqbSAxLjA1OTQgxJHGoW4gduG7iyoqIHNvIHbhu5tpIG5nxrDhu51pIGNoxrBhIHThu6tuZyBob+G6o25nIGxv4bqhbi4NCg0KICBEaeG7hW4gZ2nhuqNpIHRoZW8gb2RkcyAodOG7tyBz4buRIGto4bqjIG7Eg25nKToNCiAgDQogICQkDQogIFxleHAoMS4wNTk0KSBcYXBwcm94IDIuODg1DQokJA0KICANCiAg4oaSIE5naMSpYSBsw6Agc2luaCB2acOqbiB04burbmcgYuG7iyBob+G6o25nIGxv4bqhbiAqKmPDsyBraOG6oyBuxINuZyBi4buLIHRy4bqnbSBj4bqjbSBjYW8gZ+G6pXAgXH4yLjkgbOG6p24qKiBzbyB24bubaSBuZ8aw4budaSBraMO0bmcgYuG7iyBob+G6o25nIGxv4bqhbi4NCg0KICBL4bq/dCBxdeG6oyBuw6B5IGPDsyDDvSBuZ2jEqWEgdGjhu5FuZyBrw6ogKHAgPSAwLjAyMTYgPCAwLjA1KS4NCg0KICAqKkFueGlldHlZZXMgPSAxLjE3NjIqKg0KICDihpIgTuG6v3UgbeG7mXQgc2luaCB2acOqbiAqKmLhu4sgbG8gw6J1KiosIHRow6wgKipsb2ctb2RkcyoqIGLhu4sgdHLhuqdtIGPhuqNtICoqdMSDbmcgdGjDqm0gMS4xNzYyIMSRxqFuIHbhu4sqKiBzbyB24bubaSBuZ8aw4budaSBraMO0bmcgbG8gw6J1Lg0KDQogIERp4buFbiBnaeG6o2kgdGhlbyBvZGRzOg0KICANCiAgJCQNCiAgXGV4cCgxLjE3NjIpIFxhcHByb3ggMy4yNDINCiQkDQogIA0KICDihpIgVOG7qWMgbMOgIHNpbmggdmnDqm4gYuG7iyBsbyDDonUgKipjw7Mga2jhuqMgbsSDbmcgYuG7iyB0cuG6p20gY+G6o20gY2FvIGjGoW4ga2hv4bqjbmcgMy4yIGzhuqduKiogc28gduG7m2kgbmfGsOG7nWkga2jDtG5nIGLhu4sgbG8gw6J1Lg0KS+G6v3QgcXXhuqMgY8OzIMO9IG5naMSpYSB0aOG7kW5nIGvDqiAocCA9IDAuMDEwMSA8IDAuMDUpLg0KDQoqKlTDs20gbOG6oWkqKg0KKiBO4bq/dSBt4buZdCBzaW5oIHZpw6puICoqa2jDtG5nIGPDsyBsbyDDonUgdsOgIGPFqW5nIGNoxrBhIHThu6tuZyBob+G6o25nIGxv4bqhbioqLCB4w6FjIHN14bqldCBi4buLIHRy4bqnbSBj4bqjbSBsw6Aga2hv4bqjbmcgKioxOSUqKi4NCiogTuG6v3Ugc2luaCB2acOqbiAqKnThu6tuZyBi4buLIGhv4bqjbmcgbG/huqFuKiosIHjDoWMgc3XhuqV0IHTEg25nIGzDqm4ga2hv4bqjbmcgKio0MCUqKi4NCiogTuG6v3UgKipjw7MgbG8gw6J1KiosIHjDoWMgc3XhuqV0IHTEg25nIGzDqm4ga2hv4bqjbmcgKio0MyUqKi4NCiogTuG6v3Ugc2luaCB2acOqbiAqKnbhu6thIGxvIMOidSB24burYSBi4buLIGhv4bqjbmcgbG/huqFuKiosIHjDoWMgc3XhuqV0IGLhu4sgdHLhuqdtIGPhuqNtIHTEg25nIHbhu410IGzDqm4ga2hv4bqjbmcgKio2OSUqKi4NCg0KIyMjIyBL4bq/dCBxdeG6oyBtw7QgaMOsbmggKipo4buTaSBxdXkgbmjhu4sgcGjDom4gduG7m2kgaMOgbSBsacOqbiBr4bq/dCBwcm9iaXQqKjoNCmBgYHtyfQ0KcHJvYml0X21vZGVsMiA8LSBnbG0oRGVwcmVzc2lvbiB+IFBhbmljX2F0dGFjaysgQW54aWV0eSwgZGF0YSA9IGRhdGEsIGZhbWlseSA9IGJpbm9taWFsKGxpbmsgPSAicHJvYml0IikpDQpzdW1tYXJ5KHByb2JpdF9tb2RlbDIpDQoNCmBgYA0KDQpJbnRlcmNlcHQpID0gKiotMC44NzU1KioNCiAgDQogICogxJDDonkgbMOgIHotc2NvcmUgKHThu6sgcGjDom4gcGjhu5FpIGNodeG6qW4gY2h14bqpbiBow7NhKSDhu6luZyB24bubaSAqKnjDoWMgc3XhuqV0IGLhu4sgdHLhuqdtIGPhuqNtKiogY+G7p2EgbmjDs206DQogIA0KICAqIEtow7RuZyBi4buLIGhv4bqjbmcgbG/huqFuIChgUGFuaWNfYXR0YWNrID0gTm9gKQ0KICAqIEtow7RuZyBi4buLIGxvIMOidSAoYEFueGlldHkgPSBOb2ApDQoNCiAgKiDEkOG7gyB0w6xtIHjDoWMgc3XhuqV0IGLhu4sgdHLhuqdtIGPhuqNtIOG7nyBuaMOzbSBuw6B5Og0KICANCiAgJCQNCiAgUF8wID0gXFBoaSgtMC44NzU1KSBcYXBwcm94IDAuMTkgXHF1YWQgXHRleHR7KHThu6ljIGtob+G6o25nIDE5JSl9DQokJA0KICANCiAgKCpUcm9uZyDEkcOzKiAkXFBoaSQgKmzDoCBow6BtIHTDrWNoIGzFqXkgY2h14bqpbiopDQoNCiAgUGFuaWNcX2F0dGFja1llcyA9ICoqMC42NDAyKioNCiAgDQogICogTmdoxKlhIGzDoCBu4bq/dSBzaW5oIHZpw6puICoqdOG7q25nIGLhu4sgaG/huqNuZyBsb+G6oW4qKiwgdGjDrCAqKnotc2NvcmUqKiBi4buLIHRy4bqnbSBj4bqjbSAqKnTEg25nIHRow6ptIDAuNjQwMioqLg0KDQogICogxJBp4buBdSBuw6B5IHTGsMahbmcg4bupbmcgduG7m2kgKip4w6FjIHN14bqldCBi4buLIHRy4bqnbSBj4bqjbSB0xINuZyBsw6puIMSRw6FuZyBr4buDKiouDQoNCiAgKiBWw60gZOG7pTogbuG6v3UgZ2nhu68gYEFueGlldHkgPSBOb2AsIHjDoWMgc3XhuqV0IGLhu4sgdHLhuqdtIGPhuqNtIHPhur0gdMSDbmcgdOG7qyAxOSUgbMOqbiBraG/huqNuZyAqKjM0JSoqLg0KDQogICogKipwLXZhbHVlID0gMC4wMjE2NiA8IDAuMDUqKiDih5IgQ8OzIMO9IG5naMSpYSB0aOG7kW5nIGvDqi4NCg0KICBBbnhpZXR5WWVzID0gKiowLjcxMzAqKg0KICANCiAgKiBO4bq/dSBzaW5oIHZpw6puICoqY8OzIGxvIMOidSoqLCB0aMOsICoqei1zY29yZSoqIGLhu4sgdHLhuqdtIGPhuqNtIHTEg25nIHRow6ptICoqMC43MTMwKiogc28gduG7m2kgbmfGsOG7nWkga2jDtG5nIGxvIMOidS4NCiAgKiBU4bupYyB4w6FjIHN14bqldCBi4buLIHRy4bqnbSBj4bqjbSAqKnTEg25nIGzDqm4gcsO1IHLhu4d0Kiog4oCTIHbDrSBk4bulIGPDsyB0aOG7gyB0xINuZyB04burIDE5JSBsw6puIGtob+G6o25nICoqMzYlKiogKGdp4buvIGPDoWMgeeG6v3UgdOG7kSBjw7JuIGzhuqFpIGtow7RuZyDEkeG7lWkpLg0KICAqICoqcC12YWx1ZSA9IDAuMDA5OTUgPCAwLjAxKiog4oeSIMOdIG5naMSpYSB0aOG7kW5nIGvDqiBt4bqhbmguDQoNCiAgKipUw7NtIHThuq90IHRoZW8geMOhYyBzdeG6pXQgKMaw4bubYyBsxrDhu6NuZyBn4bqnbiDEkcO6bmcpOioqDQogIA0KICB8IFRy4bqhbmcgdGjDoWkgICAgICAgICAgICAgICAgICAgIHwgWMOhYyBzdeG6pXQgYuG7iyB0cuG6p20gY+G6o20gfA0KICB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0gfA0KICB8IEtow7RuZyBob+G6o25nIGxv4bqhbiwga2jDtG5nIGxvIMOidSB8IOKJiCAxOSUgICAgICAgICAgICAgICAgfA0KICB8IEPDsyBob+G6o25nIGxv4bqhbiwga2jDtG5nIGxvIMOidSAgICB8IOKJiCAzNCUgICAgICAgICAgICAgICAgfA0KICB8IEtow7RuZyBob+G6o25nIGxv4bqhbiwgY8OzIGxvIMOidSAgICB8IOKJiCAzNiUgICAgICAgICAgICAgICAgfA0KICB8IEPDsyBob+G6o25nIGxv4bqhbiAqKnbDoCoqIGxvIMOidSAgICB8IOKJiCA2MOKAkzY1JSAgICAgICAgICAgICB8DQogIA0KICAqKkvhur90IGx14bqtbjoqKg0KICANCiogTcO0IGjDrG5oICoqcHJvYml0KiogY2hvIGvhur90IHF14bqjICoqdMawxqFuZyB04buxIG3DtCBow6xuaCBsb2dpdCoqLCBuaMawbmcgc+G7rSBk4bulbmcgcGjDom4gcGjhu5FpIGNodeG6qW4gdGhheSB2w6wgbG9naXN0aWMuDQoqIEPhuqMgaGFpIHnhur91IHThu5EgKipQYW5pYyBhdHRhY2sqKiB2w6AgKipBbnhpZXR5KiogxJHhu4F1ICoqY8OzIHTDoWMgxJHhu5luZyB0w61jaCBj4buxYyB2w6AgY8OzIMO9IG5naMSpYSB0aOG7kW5nIGvDqioqIMSR4bq/biBraOG6oyBuxINuZyBi4buLIHRy4bqnbSBj4bqjbS4NCiogTmjhu69uZyBzaW5oIHZpw6puIGPDsyAqKmPhuqMgaGFpIHRyaeG7h3UgY2jhu6luZyoqIGPDsyBuZ3V5IGPGoSB0cuG6p20gY+G6o20gKip0xINuZyBt4bqhbmgqKiwgY+G6p24gxJHGsOG7o2MgcXVhbiB0w6JtIGjhu5cgdHLhu6Mgc+G7m20uDQoNCiMjIyMgS+G6v3QgcXXhuqMgZOG7sSBiw6FvIHThu6sgbcO0IGjDrG5oICoqbG9naXN0aWMgcmVncmVzc2lvbioqIHbhu5tpIGhhaSBiaeG6v24gxJHhu5ljIGzhuq1wIGBQYW5pY19hdHRhY2tgIHbDoCBgQW54aWV0eWAsIGtoaSBj4bqjIGhhaSDEkeG7gXUgYuG6sW5nIGAiWWVzImAuDQoNCmBgYHtyfQ0KbmV3X3N0dWRlbnQyIDwtIGRhdGEuZnJhbWUoUGFuaWNfYXR0YWNrID0gIlllcyIsIEFueGlldHkgPSAiWWVzIikNCmBgYA0KDQoNCmBgYHtyfQ0KIyBQcm9iYWJpbGl0eSBwcmVkaWN0aW9uICh0eXBlID0gInJlc3BvbnNlIikNCnByZWRpY3QobG9naXRfbW9kZWwyLCBuZXdkYXRhID0gbmV3X3N0dWRlbnQyLCB0eXBlID0gInJlc3BvbnNlIikNCmBgYA0KPiBTaW5oIHZpw6puIGPDsyBj4bqjIGxvIMOidSB2w6AgaG/huqNuZyBsb+G6oW4gxJHGsOG7o2MgZOG7sSBiw6FvIGPDsyB4w6FjIHN14bqldCAqKuKJiCA2OC43JSoqIGLhu4sgdHLhuqdtIGPhuqNtLiDEkMOieSBsw6AgbeG7mXQgeMOhYyBzdeG6pXQgY2FvLCAqKnbGsOG7o3QgbmfGsOG7oW5nIDUwJSoqLCBjaG8gdGjhuqV5IG5ndXkgY8ahIHLDtSByw6BuZy4NCg0KDQpgYGB7cn0NCiMgTG9nLW9kZHMgcHJlZGljdGlvbiAodHlwZSA9ICJsaW5rIikNCnByZWRpY3QobG9naXRfbW9kZWwyLCBuZXdkYXRhID0gbmV3X3N0dWRlbnQyLCB0eXBlID0gImxpbmsiKQ0KYGBgDQo+IEdpw6EgdHLhu4sgbsOgeSBsw6AgKipsb2ctb2RkcyoqICh04bupYyBsb2dpdCDigJMgxJHhuqd1IHJhIGPhu6dhIG3DtCBow6xuaCB0dXnhur9uIHTDrW5oKToNCiAgDQogICQkDQogIFx0ZXh0e2xvZ2l0fShwKSA9IFxsb2dcbGVmdCggXGZyYWN7cH17MSAtIHB9IFxyaWdodCkgPSAwLjc4NTUNCiQkDQogIA0KICBC4bqhbiBjw7MgdGjhu4MgY2h1eeG7g24gduG7gSB4w6FjIHN14bqldCBuaMawIHNhdToNCiAgDQogICQkDQogIHAgPSBcZnJhY3tlXnswLjc4NTV9fXsxICsgZV57MC43ODU1fX0gXGFwcHJveCAwLjY4Nw0KJCQNCg0KYGBge3J9DQojIENvbnRyaWJ1dGlvbiBvZiBlYWNoIHByZWRpY3RvciAodHlwZSA9ICJ0ZXJtcyIpDQpwcmVkaWN0KGxvZ2l0X21vZGVsMiwgbmV3ZGF0YSA9IG5ld19zdHVkZW50MiwgdHlwZSA9ICJ0ZXJtcyIpDQoNCmBgYA0KPiBDw7RuZyB0aOG7qWMgdHV54bq/biB0w61uaDoNCiAgDQogICQkDQogIFx0ZXh0e2xvZ2l0fShwKSA9IC0wLjcwODAgKyAwLjcxMzMgKyAwLjc4MDMgPSAwLjc4NTUNCiQkDQoNCkvhur90IGx14bqtbjogTeG7l2kgYmnhur9uIChsbyDDonUgdsOgIGhv4bqjbmcgbG/huqFuKSAqKsSR4buBdSBsw6BtIHTEg25nIGxvZy1vZGRzKiosIGThuqtuIMSR4bq/biB4w6FjIHN14bqldCBi4buLIHRy4bqnbSBj4bqjbSB0xINuZyBt4bqhbmguDQoNCipUw7NtIHThuq90IGzhu51pIGdp4bqjaSBk4buFIGhp4buDdSoqOg0KICANCiAgPiBN4buZdCBzaW5oIHZpw6puIGPDsyAqKmxvIMOidSoqIHbDoCAqKnThu6tuZyB0cuG6o2kgcXVhIGhv4bqjbmcgbG/huqFuKiogxJHGsOG7o2MgbcO0IGjDrG5oIGThu7EgxJFvw6FuIGPDsyAqKnjDoWMgc3XhuqV0IGLhu4sgdHLhuqdtIGPhuqNtIGzDoCBraG/huqNuZyA2OSUqKi4gQ+G6oyBoYWkgeeG6v3UgdOG7kSBuw6B5IMSR4buBdSBnw7NwIHBo4bqnbiAqKmzDoG0gdMSDbmcgbmd1eSBjxqEgYuG7iyB0cuG6p20gY+G6o20qKiByw7UgcuG7h3QuIMSQaeG7gXUgbsOgeSBjaG8gdGjhuqV5IHPhu7EgKip0w6FjIMSR4buZbmcgxJHDoW5nIGvhu4MgY+G7p2Egc+G7qWMga2jhu49lIHRpbmggdGjhuqduIMSR4bq/biB0cuG6oW5nIHRow6FpIHRy4bqnbSBj4bqjbSoqIGPhu6dhIHNpbmggdmnDqm4uDQoNCiMjIyMgIEvhur90IHF14bqjIGThu7EgYsOhbyB04burIG3DtCBow6xuaCAqKnByb2JpdCoqIHbhu5tpIGhhaSBiaeG6v24gxJHhu5ljIGzhuq1wIGBQYW5pY19hdHRhY2tgIHbDoCBgQW54aWV0eWAsIGtoaSBj4bqjIGhhaSBiaeG6v24gxJHhu4F1IGPDsyBnacOhIHRy4buLIGAiWWVzImAuDQoNCg0KYGBge3J9DQojIFByb2JhYmlsaXR5IHByZWRpY3Rpb24gKHR5cGUgPSAicmVzcG9uc2UiKQ0KcHJlZGljdChwcm9iaXRfbW9kZWwyLCBuZXdkYXRhID0gbmV3X3N0dWRlbnQyLCB0eXBlID0gInJlc3BvbnNlIikNCmBgYA0KDQpTaW5oIHZpw6puIG7DoHkgY8OzIHjDoWMgc3XhuqV0IGLhu4sgdHLhuqdtIGPhuqNtIGzDoCAqKuKJiCA2OC40JSoqIHRoZW8gbcO0IGjDrG5oIGjhu5NpIHF1eSAqKnByb2JpdCoqLiDEkGnhu4F1IG7DoHkgdMawxqFuZyDEkeG7kWkgY2FvICh2xrDhu6N0IHF1w6EgNTAlKSwgY2hvIHRo4bqleSBzaW5oIHZpw6puIGPDsyBuZ3V5IGPGoSBi4buLIHRy4bqnbSBj4bqjbSAqKmtoaSBjw7MgY+G6oyBsbyDDonUgdsOgIGhv4bqjbmcgbG/huqFuKiouDQoNCg0KYGBge3J9DQojIFotc2NvcmUgcHJlZGljdGlvbiAodHlwZSA9ICJsaW5rIikNCnByZWRpY3QocHJvYml0X21vZGVsMiwgbmV3ZGF0YSA9IG5ld19zdHVkZW50MiwgdHlwZSA9ICJsaW5rIikNCmBgYA0KDQrEkMOieSBsw6AgZ2nDoSB0cuG7iyDEkeG6p3UgcmEgY+G7p2EgdOG7lSBo4bujcCB0dXnhur9uIHTDrW5oIChsaW5lYXIgcHJlZGljdG9yKSB0aGVvICoqbGnDqm4ga+G6v3QgcHJvYml0KiosIHThu6ljIGzDoDoNCiAgDQogICQkDQogIFogPSBcUGhpXnstMX0ocCkgPSAwLjQ3NzcNCiQkDQogIA0KICBNdeG7kW4gdMOtbmggeMOhYyBzdeG6pXQ6DQogIA0KICAkJA0KICBwID0gXFBoaSgwLjQ3NzcpIFxhcHByb3ggMC42ODM2DQokJA0KICANCiAg4oaSIMSQw6J5IGzDoCAqKlotc2NvcmUqKiB0xrDGoW5nIOG7qW5nIHbhu5tpIHjDoWMgc3XhuqV0ICoq4omIIDY4LjQlKiogdGhlbyBwaMOibiBwaOG7kWkgY2h14bqpbiBjaHXhuqluIGjDs2EuDQoNCg0KYGBge3J9DQojIENvbnRyaWJ1dGlvbiBvZiBlYWNoIHByZWRpY3RvciAodHlwZSA9ICJ0ZXJtcyIpDQpwcmVkaWN0KHByb2JpdF9tb2RlbDIsIG5ld2RhdGEgPSBuZXdfc3R1ZGVudDIsIHR5cGUgPSAidGVybXMiKQ0KDQpgYGANCg0KTcO0IGjDrG5oIHR1eeG6v24gdMOtbmggY8OzIGThuqFuZzoNCiAgDQogICQkDQogIFogPSBcYmV0YV8wICsgXGJldGFfMSBcY2RvdCBcdGV4dHtQYW5pY1xfYXR0YWNrfSArIFxiZXRhXzIgXGNkb3QgXHRleHR7QW54aWV0eX0NCiQkDQogIA0KICBUcm9uZyB0csaw4budbmcgaOG7o3AgbsOgeToNCiAgDQoqIEludGVyY2VwdCAoYM6y4oKAYCkgPSAtMC40MjYzDQoqIFBhbmljXF9hdHRhY2sgPSBZZXMg4oaSIMSRw7NuZyBnw7NwICswLjQzMTANCiogQW54aWV0eSA9IFllcyDihpIgxJHDs25nIGfDs3AgKzAuNDczMA0KDQrwn5GJIFThu5VuZyBaLXNjb3JlIChsaW5lYXIgcHJlZGljdG9yKToNCiAgDQogICQkDQogIFogPSAtMC40MjYzICsgMC40MzEwICsgMC40NzMwIOKJiCAwLjQ3OA0KJCQNCiAgDQogIFjDoWMgc3XhuqV0IHTGsMahbmcg4bupbmc6DQogIA0KICAkJA0KICBwID0gXFBoaSgwLjQ3OCkg4omIIDY4LjRcJQ0KJCQNCg0KKipL4bq/dCBsdeG6rW4qKjoNCiAgDQo+IFRoZW8gbcO0IGjDrG5oIHByb2JpdCwgbeG7mXQgc2luaCB2acOqbiBjw7MgKipsbyDDonUqKiB2w6AgxJHDoyB04burbmcgKipi4buLIGhv4bqjbmcgbG/huqFuKiogY8OzIHjDoWMgc3XhuqV0ICoq4omIIDY4LjQlKiogYuG7iyB0cuG6p20gY+G6o20uDQo+IEhhaSB54bq/dSB04buRICoqQW54aWV0eSoqIHbDoCAqKlBhbmljXF9hdHRhY2sqKiDEkeG7gXUgKirEkcOzbmcgZ8OzcCB0w61jaCBj4buxYyB2w6BvIHjDoWMgc3XhuqV0KiosIGzDoG0gKip0xINuZyDEkcOhbmcga+G7gyBuZ3V5IGPGoSB0cuG6p20gY+G6o20qKi4NCj4gxJBp4buBdSBuw6B5IHBow7kgaOG7o3AgduG7m2kgdHLhu7FjIGdpw6FjIHbDoCBuaOG6pW4gbeG6oW5oIHZhaSB0csOyIHF1YW4gdHLhu41uZyBj4bunYSBz4bupYyBraOG7j2UgdGluaCB0aOG6p24gdHJvbmcgY2jhuqluIMSRb8OhbiB0cuG6p20gY+G6o20uDQo=