## 
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
## Warning: package 'ggplot2' was built under R version 4.3.3
## Warning: package 'psych' was built under R version 4.3.3
## 
## Attaching package: 'psych'
## The following objects are masked from 'package:ggplot2':
## 
##     %+%, alpha
## Warning: package 'DescTools' was built under R version 4.3.3
## 
## Attaching package: 'DescTools'
## The following objects are masked from 'package:psych':
## 
##     AUC, ICC, SD
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ forcats   1.0.0     ✔ stringr   1.5.1
## ✔ lubridate 1.9.3     ✔ tibble    3.2.1
## ✔ purrr     1.0.2     ✔ tidyr     1.3.0
## ✔ readr     2.1.5     
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ psych::%+%()    masks ggplot2::%+%()
## ✖ psych::alpha()  masks ggplot2::alpha()
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag()    masks stats::lag()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
## 
## Attaching package: 'scales'
## 
## 
## The following object is masked from 'package:purrr':
## 
##     discard
## 
## 
## The following object is masked from 'package:readr':
## 
##     col_factor
## 
## 
## The following objects are masked from 'package:psych':
## 
##     alpha, rescale
## Warning: package 'AER' was built under R version 4.3.3
## Loading required package: car
## Warning: package 'car' was built under R version 4.3.3
## Loading required package: carData
## Warning: package 'carData' was built under R version 4.3.3
## 
## Attaching package: 'car'
## 
## The following object is masked from 'package:purrr':
## 
##     some
## 
## The following object is masked from 'package:DescTools':
## 
##     Recode
## 
## The following object is masked from 'package:psych':
## 
##     logit
## 
## The following object is masked from 'package:dplyr':
## 
##     recode
## 
## Loading required package: lmtest
## Warning: package 'lmtest' was built under R version 4.3.3
## Loading required package: zoo
## Warning: package 'zoo' was built under R version 4.3.3
## 
## Attaching package: 'zoo'
## 
## The following objects are masked from 'package:base':
## 
##     as.Date, as.Date.numeric
## 
## Loading required package: sandwich
## Warning: package 'sandwich' was built under R version 4.3.3
## Loading required package: survival
## 
## Attaching package: 'survival'
## 
## The following object is masked from 'package:epitools':
## 
##     ratetable
## Warning: package 'Ecdat' was built under R version 4.3.3
## Loading required package: Ecfun
## Warning: package 'Ecfun' was built under R version 4.3.3
## 
## Attaching package: 'Ecfun'
## 
## The following object is masked from 'package:DescTools':
## 
##     BoxCox
## 
## The following object is masked from 'package:base':
## 
##     sign
## 
## 
## Attaching package: 'Ecdat'
## 
## The following object is masked from 'package:carData':
## 
##     Mroz
## 
## The following object is masked from 'package:datasets':
## 
##     Orange
## Warning: package 'datarium' was built under R version 4.3.3
## Warning: package 'ISLR' was built under R version 4.3.3

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

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

Trong bối cảnh thị trường lao động ngày càng biến động mạnh mẽ bởi các tác động của quá trình toàn cầu hóa và tự động hóa thì công đoàn giữa vai trò như một thiết chế đại diện cho quyền lợi người lao động là một tổ chức không thể thiếu. Việc tham gia công đoàn không chỉ phản ánh mức độ gắn kết xã hội giữa người lao động mà còn là một yếu tố tác động đến mức lương và điều kiện, môi trường làm việc. Tuy nhiên việc tham gia công đoàn không chỉ dựa trên yếu tố kinh tế mà còn chịu ảnh hưởng bởi nhiều đặc điểm nhân khẩu học như giới tính, chủng tộc, trình độ học vấn, khu vực sinh sống và tình trạng hôn nhân.
Tại Hoa kỳ, tỷ lệ tham gia công đoàn đã giảm dần trong những thập kỷ gần đây, nhưng mức độ tham gia vẫn có sự khác biệt giữa những nhóm dân cư khác nhau. Việc hiểu rõ các yếu tố nhâu khẩu học ảnh hướng đến khả năng tham gia công đoàn sẽ giúp các nhà hoạt định chính sách lao động, các tổ chức công đoàn thiết kế chiến lược phù hợp nhằm nâng cao tỷ lệ đại diện và đảm bảo công bằng trong tiếp cận quyền lợi lao động.
Bộ dữ liệu Wages từ Ecdat là một bộ dữ liệu phù hợp để thực hiện nghiên cứu này, vì nó cung cấp thông tin chi tiết về các đặc điểm nhân khẩu học, tình trạng lao động và mối liên hệ với việc tham gia công đoàn. Việc sử dụng các phương pháp thống kê và mô hình hóa kinh tế lượng để phân tích tác động của các biến định tính như giới tính (sex), chủng tộc (black), tình trạng hôn nhân (married), khu vực cư trú (south, smsa) đến quyết định tham gia công đoàn (union) sẽ mang lại những kết quả có giá trị thực tiễn và góp phần làm sáng tỏ mối quan hệ giữa nhân khẩu học và hành vi tham gia tổ chức lao động.

1.2 Mục tiêu nghiên cứu

Mục tiêu của nghiên cứu này là phân tích sự tác động của các yếu tố nhân khẩu học ảnh hướng đến việc tham gia công đoàn của người lao động tại Hoa Kỳ, thông qua việc sử dụng dữ liệu khảo sát và các phương pháp phân tích định lượng.

1.3 Đối tượng và phạm vi nghiên cứu

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

Đối tượng nghiên cứu trong đề tài là người lao động tại Hoa Kỳ, với các đặc điểm nhân khẩu học cụ thể như giới tính, tình trạng hôn nhân, ngành nghề, khu vực cư trú, chủng tộc. Trong đó, biến phụ thuộc chính trong nghiên cứu là biến định tính union, biến thể hiện việc người lao động có tham gia công đoàn hay không.

  • Phạm vi nghiên cứu

Phạm vi của đề tài nghiên cứu tập trung vào thị trường lao động tại Hoa Kỳ. Với bộ dữ liệu gồm 4165 người lao động thực hiện khảo sát với tổng 12 biến.

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

Nghiên cứu sử dụng phương pháp nghiên cứu thống kê và các mô hình hồi quy để phân tích trên bộ dữ liệu Wages. Từ nhận hiểu rõ về sự tác động và mức độ tác động của các yếu tố nhân khẩu học đến quyết định tham gia công đoàn của người lao động tại Hoa Kỳ.

1.5 Kết cấu nghiên cứu

Chương 1: Tổng quan nghiên cứu.
Chương 2: Dữ liệu nghiên cứu.
Chương 3: Phân tích và đưa ra kết quả.

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

2.1 Tổng quan về bộ dữ liệu Wages

Bộ dữ liệu Wages được lấy từ package Ecdat, chứa thông tin về các đặt điểm nhân khẩu học, quá trình làm việc và thu nhập của người lao động tại Hoa Kỳ. Bộ dữ liệu Wages chứa 12 biến với tổng cộng 4165 quan sát.
Dữ liệu này thường được sử dụng trong phân tích kinh tế lao động và các mô hình kinh tế lượng để kiểm định tác động của giới tính, chủng tộc, học vấn và tình trạng hôn nhân đến thu nhập.

d <- Wages
datatable(Wages)
  • Ý nghĩa các biến trong bộ dữ liệu

Dưới đây là giải thích chi tiết về các biến trong bộ dữ liệu:

Biến định lượng (Quantitative Variables)

Tên biến Kiểu dữ liệu Ý nghĩa
exp Numeric Số năm kinh nghiệm làm việc toàn thời gian.
wks Numeric Số tuần làm việc của cá nhân trong một năm.
ed Numeric Số năm học vấn (trình độ học vấn) của cá nhân.
lwage Numeric Logarit tự nhiên của tiền lương.

Biến định tính (Qualitative Variables)

Tên biến Kiểu dữ liệu Ý nghĩa
bluecol factor Loại công việc: 1 (nhóm ngành lao động chân tay hoặc kỹ thuật), 0 (nhóm ngành văn phòng, hành chính, chuyên môn).
ind integer Ngành công nghiệp: 1 (sản xuất), 0 (không phải sản xuất).
south factor Khu vực cư trú: Yes (miền Nam Hoa Kỳ), No (không phải miền Nam Hoa Kỳ).
smsa factor Khu vực đô thị: Yes (cư trú trong Khu vực thống kê đô thị tiêu chuẩn), No (không cư trú trong Khu vực thống kê đô thị tiêu chuẩn).
married factor Tình trạng hôn nhân: Yes (đã kết hôn), No (chưa kết hôn).
sex factor Giới tính của cá nhân: male, female.
union factor Thành viên công đoàn: Yes (có), No (không).
black factor Chủng tộc: Yes (người da đen), No (không phải người da đen).
  • Kết luận

Bộ dữ liệu Wages có cấu trúc rõ ràng, đa dạng về biến và quy mô mẫu lớn, thích hợp để sử dụng trong các mô hình kinh tế định lượng. Là một bộ dữ liệu có giá trị thực tiễn cao, phục vụ tốt cho việc nghiên cứu và mô hình hóa trong lĩnh vực kinh tế lao động và chính sách thị trường lao động.

2.2 Quan sát dữ liệu định tính của bộ dữ liệu Wages

  • Cấu trúc bộ dữ liệu
# Lọc dữ liệu định tính
d1 <- subset(d, select=-c(exp,wks,ed,lwage))
# Hiển thị cấu trúc dữ liệu
str(d1)
## 'data.frame':    4165 obs. of  8 variables:
##  $ bluecol: Factor w/ 2 levels "no","yes": 1 1 1 1 1 1 1 2 2 2 ...
##  $ ind    : int  0 0 0 0 1 1 1 0 0 1 ...
##  $ south  : Factor w/ 2 levels "no","yes": 2 2 2 2 2 2 2 1 1 1 ...
##  $ smsa   : Factor w/ 2 levels "no","yes": 1 1 1 1 1 1 1 1 1 1 ...
##  $ married: Factor w/ 2 levels "no","yes": 2 2 2 2 2 2 2 2 2 2 ...
##  $ sex    : Factor w/ 2 levels "female","male": 2 2 2 2 2 2 2 2 2 2 ...
##  $ union  : Factor w/ 2 levels "no","yes": 1 1 1 1 1 1 1 1 1 2 ...
##  $ black  : Factor w/ 2 levels "no","yes": 1 1 1 1 1 1 1 1 1 1 ...

Dữ liệu đã được làm sạchsắp xếp rõ ràng. Hầu hết các biến phân loại đã được mã hóa dưới dạng factor, điều này cực kỳ thuận tiệnphù hợp để sử dụng trong các mô hình hồi quy hoặc các phân tích định lượng khác. Điều này cho thấy bộ dữ liệu Wages có thể dùng để phân tích chuyên sâu. Riêng biến ind đang ở dạng dữ liệu biến nhị phân dạng số (integer). Do nghiên cứu cần thực hiện hồi quy tuyến tính,logistic và các mô hình mà ý nghĩa định tính của biến quan trọng hơn giá trị số nên cần thực hiện chuyển dạng dữ liệu của biến ind từ integer sang factor.

  • Chuyển dạng dữ liệu của biến ind
d1$ind <- factor(d1$ind, levels = c(0, 1), labels = c("non-industrial", "industrial"))
str(d1)
## 'data.frame':    4165 obs. of  8 variables:
##  $ bluecol: Factor w/ 2 levels "no","yes": 1 1 1 1 1 1 1 2 2 2 ...
##  $ ind    : Factor w/ 2 levels "non-industrial",..: 1 1 1 1 2 2 2 1 1 2 ...
##  $ south  : Factor w/ 2 levels "no","yes": 2 2 2 2 2 2 2 1 1 1 ...
##  $ smsa   : Factor w/ 2 levels "no","yes": 1 1 1 1 1 1 1 1 1 1 ...
##  $ married: Factor w/ 2 levels "no","yes": 2 2 2 2 2 2 2 2 2 2 ...
##  $ sex    : Factor w/ 2 levels "female","male": 2 2 2 2 2 2 2 2 2 2 ...
##  $ union  : Factor w/ 2 levels "no","yes": 1 1 1 1 1 1 1 1 1 2 ...
##  $ black  : Factor w/ 2 levels "no","yes": 1 1 1 1 1 1 1 1 1 1 ...

Sau chuyển dạng dữ biệu integer của biến ind với hai trạng thái 10 sang dạng dữ liệu factor thì biến ind là biến nhị phân với hai trạng thái. Trạng thái 0 tương ứng với non-industrial, trạng thái 1 tương ứng với industrial

  • Kiểm tra bộ dữ liệu có bị thiếu giá trị hay không
print("Kiểm tra bộ dữ liệu có các giá trị thiếu hay không:")
## [1] "Kiểm tra bộ dữ liệu có các giá trị thiếu hay không:"
z <- is.na(d1)
datatable(z)
print("Số giá trị bị thiếu:")
## [1] "Số giá trị bị thiếu:"
sum(is.na(d1))
## [1] 0

Bộ dữ liệu Wages không có giá trị bị thiếu ở các biến định tính - các biến dạng factor đã được định danh đầy đủ, không có giá trị rỗng hoặc không xác định. Cho thấy bộ dữ liệu có chất lượng tốt.


3 CHƯƠNG 3: PHÂN TÍCH VÀ ĐƯA RA KẾT QUẢ

3.1 Thống kê mô tả biến phụ thuộc và biến độc lập

3.1.1 Biến phụ thuộc: biếnunion

Biến union là một biến định tính nhị phân với hai giá trị. “No” là người lao động không tham gia công đoàn và “Yes” là người lao động tham gia công đoàn. Biến này giúp phân biệt giữa những người lao động được khảo sát có những người lao động nào nhận được sự hỗ trợ từ tổ chức công đoàn về mặt quyền lợi, thương lượng lương, điều kiện việc làm,… và những người nào không có. Một yếu tố có thể ảnh hưởng đến điều kiện lao động và phúc lợi.

  • Bảng tần số
table(d1$union)
## 
##   no  yes 
## 2649 1516
  • Bảng tần suất
union1 <- table(d1$union)/sum(nrow(d1))
union1
## 
##        no       yes 
## 0.6360144 0.3639856
  • Trực quan hóa
# Chuyển thành data frame để ggplot xử lý
union_df <- as.data.frame(union1)
colnames(union_df) <- c("union", "proportion")

# Đổi nhãn thành tiếng Việt
union_df$union <- factor(union_df$union,
                         levels = c("no", "yes"),
                         labels = c("Không tham gia công đoàn", "Tham gia công đoàn"))


ggplot(union_df, aes(x = union, y = proportion, fill = union)) +
  geom_col(width = 0.6) +
  geom_text(aes(label = paste0(round(proportion * 100, 1), "%")),
            vjust = -0.3, size = 5, fontface = "bold") +
  labs(title = "Tỷ lệ người lao động theo tình trạng tham gia công đoàn",
       x = "Tình trạng tham gia công đoàn",
       y = "Tỷ lệ") +
   scale_fill_manual(values = c("Không tham gia công đoàn" = "lightgreen",
                               "Tham gia công đoàn" = "darkgreen")) +
  ylim(0, max(union_df$proportion) + 0.05) +
  theme_minimal()

Nhận xét:
Tỷ lệ người lao động không tham gia công đoàn chiếm phần lớn trong bộ dữ liệu này, cụ thể là 63.6%, tương ứng với 2649 người và tỷ lệ người lao động tham gia công đoàn chiếm phần nhỏ hơn, với 36.4% tương ứng với 1516 người. Co thấy đa số người lao động được khảo sát trong bộ dữ liệu này không phải là thành viên của công đoàn. Tỷ lệ không tham gia công đoàn gần gấp đôi tỷ lệ tham gia.

3.1.2 Biến độc lập

Biến bluecol
Biến bluecol (Blue-collar workers: thuật ngữ chỉ những người làm công việc lao động chân tay hoặc kỹ thuật): là một biến định tính nhị phân cho biết người lao động có làm công việc thuộc nhóm lao động chân tay hoặc kỹ thuật hay không.

  • Bảng tần số
table(d1$bluecol)
## 
##   no  yes 
## 2036 2129
  • Bảng tần suất
bluecol1 <- table(d1$bluecol)/sum(nrow(d1))
bluecol1
## 
##        no       yes 
## 0.4888355 0.5111645

Vậy trong bộ dữ liệu này có 48.8835534% người lao động không làm việc trong nhóm ngành lao động chân tay và kỹ thuật và 51.1164466% người lao động làm việc trong nhóm ngành lao động chân tay và kỹ thuật.

  • Trực quan hóa
pie(bluecol1,
    labels = paste(names(bluecol1), round(bluecol1*100,2), "%"),
    main = "Biểu đồ tròn: Tỷ lệ người lao động làm việc trong nhóm ngành lao động chân tay và kỹ thuật") 

  • Nhận xét:
    Bảng tần suất cho thấy có tổng cộng 2129 người lao động có loại công việc thuộc nhóm ngành lao động chân tay hoặc kỹ thuật trong tổng số 4165 người lao động thực hiện khảo sát. Từ đó, tỷ lệ phần trăm của mỗi nhóm được tính toán chính xác, cho thấy nhóm công nhân thuộc ngành lao động chân tay hoặc kỹ thuật chiếm khoảng 51.12% và nhóm còn lại là 48.88%. Biểu đồ tròn được sử dụng để trực quan hóa các tỷ lệ này. Minh họa trực quan cho thấy số lượng và tỷ lệ của hai trạng thái của biến bluecol là khá cân bằng và nhóm công nhân lao động chân tay hoặc kỹ thuật chiếm ưu thế hơn một chút.

Biến ind
Biến Ind xác định người lao động có làm việc trong ngành sản suất hay không. Là một biến nhị phân với hai trạng thái lần lượt là làm việc trong ngành sản xuất (industrial) và không làm việc trong ngành sản suất (non-industrial).

  • Bảng tần số
table(d1$ind)
## 
## non-industrial     industrial 
##           2518           1647
  • Bảng tần suất
ind1 <- table(d1$ind)/sum(nrow(d1))
ind1
## 
## non-industrial     industrial 
##      0.6045618      0.3954382

Vậy trong bộ dữ liệu này có 60.4561825% người lao động không làm việc trong ngành sản xuất và 39.5438175% người lao động làm việc trong ngành sản xuất.

  • Trực quan hóa
pie(ind1,
    labels = paste(names(ind1), round(ind1*100,2), "%"),
    main = "Biểu đồ tròn: Tỷ lệ người lao động làm việc trong ngành sản xuất",col=c("lightblue", "blue")) 

  • Nhận xét:
    Số lượng người lao động không làm việc trong ngành công nghiệp sản xuất trong khảo sát chiếm phần lớn, cụ thể là 2518 người lao động trên tổng số 4165 người tham gia khảo sát. Tỷ lệ phần trăm của nhóm non-industrial chiếm khoảng 60.46% và còn lại 39.54% người lao động làm việc trong ngành sản xuất. Biểu đồ tròn minh họa trực quan một cách chính xác các số liệu được tính toán ở bảng tần số và bảng tần suất.

Biến south
Biến south thể hiện khu vực địa lý nơi cư trú của người lao động, cụ thể hơn là xác định người lao động đó có sống ở miền Nam Hoa Kỳ hay không. Là một biến nhị phân với biểu hiện Yes là người lao động cư trú tại miền Nam Hoa Kỳ và No là người lao động không cư trú tại miền Nam Hoa Kỳ.

  • Bảng tần số
table(d1$south)
## 
##   no  yes 
## 2956 1209
  • Bảng tần suất
south1 <- table(d1$south)/sum(nrow(d1))
south1
## 
##        no       yes 
## 0.7097239 0.2902761

Vậy trong bộ dữ liệu này có 70.972389% người lao động không cư trú tại miền Nam Hoa Kỳ và 29.027611% người lao động cư trú tại miền Nam Hoa kỳ.

  • Trực quan hóa
# Chuyển thành data frame để ggplot xử lý
south_df <- as.data.frame(south1)
colnames(south_df) <- c("south", "proportion")

# Đổi nhãn thành tiếng Việt
south_df$south <- factor(south_df$south,
                         levels = c("no", "yes"),
                         labels = c("Không cư trú tại miền Nam", "Cư trú tại miền Nam"))


ggplot(south_df, aes(x = south, y = proportion, fill = south)) +
  geom_col(width = 0.6) +
  geom_text(aes(label = paste0(round(proportion * 100, 1), "%")),
            vjust = -0.3, size = 5, fontface = "bold") +
  labs(title = "Tỷ lệ người lao động theo khu vực cư trú",
       x = "Khu vực cư trú",
       y = "Tỷ lệ",
       fill = "Khu vực cư trú") +
  scale_fill_manual(values = c("Không cư trú tại miền Nam" = "pink",
                               "Cư trú tại miền Nam" = "steelblue")) +
  scale_y_continuous(labels = scales::percent_format(accuracy = 1),
                     limits = c(0, max(south_df$proportion) + 0.1)) +
  theme_minimal(base_size = 14)

  • Nhận xét:
    Trong bộ dữ liệu này, đa số người lao động không cư trú tại miền Nam Hoa Kỳ, cụ là 70.79%, tương ứng với 2956 người trong tổng số người lao động được khảo sát, chỉ có 29.03% người lao động cư trú tại miền Nam Hoa Kỳ. Có thể thấy được phần lớn lực lượng lao động trong bộ dữ liệu này tập trung ở các khu vực khác của Hoa Kỳ. Điều này được minh họa trực quan bằng biểu đồ.

Biến smsa
Biến smsa là một biến nhị phân biểu thị liệu người lao động có cư trú tại khu vực đô thị lớn của Hoa Kỳ hay không. Với biệu hiện “No” là người lao động không cư trú tại vùng đô thị lớn (tức là người lao động sinh sống tại khu vực nông thôn hoặc thị trấn nhỏ) và biểu hiện “Yes” là người lao động cư trú tại vùng đô thị lớn.

  • Bảng tần số
table(d1$smsa)
## 
##   no  yes 
## 1442 2723
  • Bảng tần suất
smsa1 <- table(d1$smsa)/sum(nrow(d1))
smsa1
## 
##        no       yes 
## 0.3462185 0.6537815

Vậy trong bộ dữ liệu này có 34.6218487% người lao động không cư trú tại vùng đô thị lớn của Hoa Kỳ và 29.027611% người lao động cư trú tại vùng đô thị lớn của Hoa kỳ.

  • Trực quan hóa
# Chuyển thành data frame để ggplot xử lý
smsa_df <- as.data.frame(smsa1)
colnames(smsa_df) <- c("smsa", "proportion")

# Đổi nhãn thành tiếng Việt
smsa_df$smsa <- factor(smsa_df$smsa,
                         levels = c("no", "yes"),
                         labels = c("Không sống ở đô thị lớn", "Sống ở đô thị lớn"))


ggplot(smsa_df, aes(x = smsa, y = proportion, fill = smsa)) +
  geom_col(width = 0.6) +
  geom_text(aes(label = paste0(round(proportion * 100, 1), "%")),
            vjust = -0.3, size = 5, fontface = "bold") +
  labs(title = "Tỷ lệ người lao động theo vùng đô thị",
       x = "Vùng đô thị",
       y = "Tỷ lệ") +
  scale_fill_manual(values = c("Không sống ở đô thị lớn" = "orange",
                               "Sống ở đô thị lớn" = "steelblue")) +
  ylim(0, max(smsa_df$proportion) + 0.05) +
  theme_minimal()

  • Nhận xét:
    Tỷ lệ người lao động cư trú tại vùng đô thị lớn chiếm phần lớn với 65.4% và 34.6% còn lại là tỷ lệ người lao động cư trú tại các khu vực nông thôn và thị trấn nhỏ. Cho thấy được một xu hướng rõ rệt tập trung của người lao động tại các vùng đô thị lớn. Với hơn 2/3 số người lao động được khảo sát cư trú tại các khu vực này, phản ánh sự tập trung của cơ hội việc làm, dịch vụ và các tiện ích khác ở các thành phố lớn.

Biến married
Biến married là một biến nhị phân biểu thị trạng thái hôn nhân của người lao động được khảo sát. Với trạng thái “No” là chưa kết hơn và “Yes” là đã kết hôn.

  • Bảng tần số
table(d1$married)
## 
##   no  yes 
##  773 3392
  • Bảng tần suất
married1 <- table(d1$married)/ sum(nrow(d1))
married1
## 
##        no       yes 
## 0.1855942 0.8144058
  • Trực quan hóa
# Chuyển thành data frame để ggplot xử lý
married_df <- as.data.frame(married1)
colnames(married_df) <- c("married", "proportion")

# Đổi nhãn thành tiếng Việt
married_df$married <- factor(married_df$married,
                         levels = c("no", "yes"),
                         labels = c("Chưa kết hôn", "Đã kết hôn"))


ggplot(married_df, aes(x = married, y = proportion, fill = married)) +
  geom_col(width = 0.6) +
  geom_text(aes(label = paste0(round(proportion * 100, 1), "%")),
            vjust = -0.3, size = 5, fontface = "bold") +
  labs(title = "Tỷ lệ người lao động theo tình trạng hôn nhân",
       x = "Trạng thái hôn nhân",
       y = "Tỷ lệ") +
   scale_fill_manual(values = c("Chưa kết hôn" = "lightblue",
                               "Đã kết hôn" = "darkblue")) +
  ylim(0, max(married_df$proportion) + 0.05) +
  theme_minimal()

  • Nhận xét:
    Tỷ lệ người đã kết hôn chiếm đa số với 81.4%, tương ứng với 3392 người lao động được khảo sát. Chỉ còn lại 18.6% tỷ lệ người lao động, tương ứng với 773 người chưa kết hôn. Điều này cho thấy phần lớn người lao động tại Hoa Kỳ được khảo sát trong tập dữ liệu này đã kết hôn và tỷ lệ người lao động đã kết hôn cao gấp 4 lần so với tỷ lệ người chưa kết hôn.

Biến sex
Biến sex trong bộ dữ liệu này là một biến nhị phân cho biết giới tính của từng người lao động tại Hoa Kỳ được khảo sát. Với trạng thái “female” là giới tính nữ và “male” là giới tính nam.

  • Bảng tần số
table(d1$sex)
## 
## female   male 
##    469   3696
  • Bảng tần suất
sex1 <- table(d1$sex)/sum(nrow(d1))
sex1
## 
##   female     male 
## 0.112605 0.887395
  • Trực quan hóa
# Chuyển thành data frame để ggplot xử lý
sex_df <- as.data.frame(sex1)
colnames(sex_df) <- c("sex", "proportion")

# Đổi nhãn thành tiếng Việt
sex_df$sex <- factor(sex_df$sex,
                         levels = c("female", "male"),
                         labels = c("Giới tính nữ", "Giới tính nam"))


ggplot(sex_df, aes(x = sex, y = proportion, fill = sex)) +
  geom_col(width = 0.6) +
  geom_text(aes(label = paste0(round(proportion * 100, 1), "%")),
            vjust = -0.3, size = 5, fontface = "bold") +
  labs(title = "Tỷ lệ người lao động theo tình trạng giới tính",
       x = "Tình trạng giới tính",
       y = "Tỷ lệ") +
   scale_fill_manual(values = c("Giới tính nữ" = "orange",
                               "Giới tính nam" = "seagreen")) +
  ylim(0, max(sex_df$proportion) + 0.05) +
  theme_minimal()

  • Nhận xét:
    Tỷ lệ người lao động nam chiếm phần áp đảo với 88.7%, tương ứng 3696 người và tỷ lệ người lao động nữ chỉ chiếm 11.3%, tương ứng với 469 người. Điều này cho thấy số lượng người lao động nam được khảo sát trong bộ dữ liệu này đông hơn rất nhiều so với người lao động nữ, cao gấp gần 8 lần.

Biến black
Biến black biểu thị người lao động có phải là người da đen hay không. Với “No” là người lao động không phải là người da đen và “Yes” là người lao động là người da đen.

  • Bảng tần số
table(d1$black)
## 
##   no  yes 
## 3864  301
  • Bảng tần suất
black1 <- table(d1$black)/sum(nrow(d1))
black1
## 
##         no        yes 
## 0.92773109 0.07226891
  • Trực quan hóa
# Chuyển thành data frame để ggplot xử lý
black_df <- as.data.frame(black1)
colnames(black_df) <- c("black", "proportion")

# Đổi nhãn thành tiếng Việt
black_df$black <- factor(black_df$black,
                         levels = c("no", "yes"),
                         labels = c("Không phải người da đen", "Người da đen"))


ggplot(black_df, aes(x = black, y = proportion, fill = black)) +
  geom_col(width = 0.6) +
  geom_text(aes(label = paste0(round(proportion * 100, 1), "%")),
            vjust = -0.3, size = 5, fontface = "bold") +
  labs(title = "Tỷ lệ người lao động theo tình trạng chủng tộc",
       x = "Tình trạng chủng tộc",
       y = "Tỷ lệ") +
   scale_fill_manual(values = c("Không phải người da đen" = "salmon",
                               "Người da đen" = "red")) +
  ylim(0, max(black_df$proportion) + 0.05) +
  theme_minimal()

  • Nhận xét:
    Tỷ lệ người lao động không phải là người da đen chiếm phần lớn áp đảo với 92.8%, tương ứng 3864 người. Chỉ có 7.2% tương ứng 301 người lao động được khảo sát là người da đen. Có sự chênh lệch lớn về tỷ lệ chủng tộc trong bộ dữ liệu người lao động được khảo sát này, với nhóm không phải là người da đen chiếm ưu thế rõ rệt.

3.2 Phân tích mối quan hệ giữa việc tham gia công đoàn của người lao động với các đặc điểm nhân khẩu học khác

3.2.1 Kiểm định tính độc lập của biến phụ thuộc là biến union

Kiểm định Chi bình phương (Chi-squared test) được sử dụng để đánh giá mối quan hệ giữa hai biến. Cụ thể là kiểm định này xác định hai biến có độc lập với nhau không.
Giả thuyết kiểm định:
\[ \begin{cases} H_0: \text{Hai biến là độc lập (không có mối liên hệ).} \\ H_1: \text{Hai biến không độc lập (mối liên hệ).} \end{cases} \] Thống kê Chi bình phương:
\[ \chi^2 = \sum \frac{(O_{ij} - E_{ij})^2}{E_{ij}} \]
Trong đó:
\(O_{ij}\) là tần suất quan sát,
Giá trị kỳ vọng \(E_{ij}\) tại ô \((i, j)\) được tính bằng công thức:\[ E_{ij} = \frac{n_i \times n_{j}}{n} \] Với:
\(n_{i}\): tổng tần suất hàng \(i\),
\(n_{j}\): tổng tần suất cột \(j\),
\(n\): tổng tất cả quan sát.
Biến union và biến bluecol
Giả thuyết:
\[ \begin{cases} H_0: \text{union và bluecol là độc lập.} \\ H_1: \text{union và bluecol là không độc lập.} \end{cases} \]

chisq.test(table(d1$union,d1$bluecol))
## 
##  Pearson's Chi-squared test with Yates' continuity correction
## 
## data:  table(d1$union, d1$bluecol)
## X-squared = 594.86, df = 1, p-value < 2.2e-16

Nhận xét:Kết quả kiểm định cho thấy p-value \(< 2.2 \times 10^{-16}\), vậy p-value \(<0.05\). Bác bỏ giả thuyết \(H_0\). Kết luận được rằng có mối quan hệ có ý nghĩa thống kê giữa việc người lao động có tham gia công đoàn (union) hay không và việc họ có làm việc thuộc nhóm ngành chân tay hoặc kỹ thuật hay không.

  • Biến union và biến ind
    Giả thuyết:
    \[ \begin{cases} H_0: \text{union và ind là độc lập.} \\ H_1: \text{union và ind là không độc lập.} \end{cases} \]
chisq.test(table(d1$union,d1$ind))
## 
##  Pearson's Chi-squared test with Yates' continuity correction
## 
## data:  table(d1$union, d1$ind)
## X-squared = 88.732, df = 1, p-value < 2.2e-16

Nhận xét: Kết quả kiểm định cho thấy p-value \(< 2.2 \times 10^{-16}\), vậy p-value \(<0.05\). Bác bỏ giả thuyết \(H_0\). Kết luận được rằng có mối quan hệ có ý nghĩa thống kê giữa việc người lao động có tham gia công đoàn hay không và việc họ có làm việc trong ngành sản xuất hay không.

  • Biến union và biến south
    Giả thuyết:
    \[ \begin{cases} H_0: \text{union và south là độc lập.} \\ H_1: \text{union và south là không độc lập.} \end{cases} \]
chisq.test(table(d1$union,d1$south))
## 
##  Pearson's Chi-squared test with Yates' continuity correction
## 
## data:  table(d1$union, d1$south)
## X-squared = 109.61, df = 1, p-value < 2.2e-16

Nhận xét: Kết quả kiểm định cho thấy p-value \(< 2.2 \times 10^{-16}\), vậy p-value \(<0.05\). Bác bỏ giả thuyết \(H_0\). Kết luận được rằng có mối quan hệ có ý nghĩa thống kê giữa việc người lao động có tham gia công đoàn hay không và việc họ có cư trú tại miền Nam Hoa Kỳ hay không.

  • Biến union và biến smsa
    Giả thuyết:
    \[ \begin{cases} H_0: \text{union và smsa là độc lập.} \\ H_1: \text{union và smsa là không độc lập.} \end{cases} \]
chisq.test(table(d1$union,d1$smsa))
## 
##  Pearson's Chi-squared test with Yates' continuity correction
## 
## data:  table(d1$union, d1$smsa)
## X-squared = 2.9485, df = 1, p-value = 0.08596

Nhận xét: Kết quả kiểm định cho thấy p-value \(=0.08596\), vậy p-value \(>0.05\). Không có cơ sở bác bỏ giả thuyết \(H_0\). Kết luận được rằng không có mối quan hệ có ý nghĩa thống kê giữa việc người lao động có tham gia công đoàn hay không và việc họ có cư trú tại các vùng đô thị lớn của Hoa Kỳ hay không.

  • Biến union và biến married
    Giả thuyết:
    \[ \begin{cases} H_0: \text{union và married là độc lập.} \\ H_1: \text{union và married là không độc lập.} \end{cases} \]
chisq.test(table(d1$union,d1$married))
## 
##  Pearson's Chi-squared test with Yates' continuity correction
## 
## data:  table(d1$union, d1$married)
## X-squared = 54.181, df = 1, p-value = 1.828e-13

Nhận xét: Kết quả kiểm định cho thấy p-value \(=1.828 \times e^{-13}\), vậy p-value \(<0.05\). Bác bỏ giả thuyết \(H_0\). Kết luận được rằng có mối quan hệ có ý nghĩa thống kê giữa việc người lao động có tham gia công đoàn hay không và tình trạng hôn nhân của họ.

  • Biến union và biến sex
    Giả thuyết:
    \[ \begin{cases} H_0: \text{union và sex là độc lập.} \\ H_1: \text{union và sex là không độc lập.} \end{cases} \]
chisq.test(table(d1$union,d1$sex))
## 
##  Pearson's Chi-squared test with Yates' continuity correction
## 
## data:  table(d1$union, d1$sex)
## X-squared = 52.63, df = 1, p-value = 4.027e-13

Nhận xét: Kết quả kiểm định cho thấy p-value \(= 4.027 \times e^{-13}\), vậy p-value \(<0.05\). Bác bỏ giả thuyết \(H_0\). Kết luận được rằng có mối quan hệ có ý nghĩa thống kê giữa việc người lao động có tham gia công đoàn hay không và giới tính của họ.

  • Biến union và biến black
    Giả thuyết:
    \[ \begin{cases} H_0: \text{union và black là độc lập.} \\ H_1: \text{union và black là không độc lập.} \end{cases} \]
chisq.test(table(d1$union,d1$black))
## 
##  Pearson's Chi-squared test with Yates' continuity correction
## 
## data:  table(d1$union, d1$black)
## X-squared = 8.8659, df = 1, p-value = 0.002906

Nhận xét: Kết quả kiểm định cho thấy p-value \(=0.002906\), vậy p-value \(<0.05\). Bác bỏ giả thuyết \(H_0\). Kết luận được rằng có mối quan hệ có ý nghĩa thống kê giữa việc người lao động có tham gia công đoàn hay không và chủng tộc của họ.

Kết luận: Sau khi thực hiện kiểm định tính độc lập cho các cặp biến, kết quả nhận được cho thấy chỉ có duy nhất biến smsa là không có ảnh hướng đến biến union. Tiếp theo thực hiện thống kê mô tả hai biến để có cái nhìn rõ ràng hơn về mức độ ảnh hưởng của các đặc điểm nhân khẩu học khác lên đặc điểm tình trạng tham gia công đoàn của người lao động được khảo sát.

3.2.2 Thống kê mô tả 2 biến

3.2.2.1 Biến union và biến bluecol

  • Bảng tần suất chéo
# Bảng tần suất chéo với nhãn rõ ràng, không tạo thêm cột
s <- table(factor(d1$union, levels = c("no", "yes"), 
                  labels = c("Non-union", "Union")),
           factor(d1$bluecol, levels = c("no", "yes"), 
                  labels = c("Non-blue-collar", "Blue-collar")))
addmargins(s)
##            
##             Non-blue-collar Blue-collar  Sum
##   Non-union            1674         975 2649
##   Union                 362        1154 1516
##   Sum                  2036        2129 4165
  • Bảng tần suất chéo theo tỷ lệ hàng
s1 <- prop.table(s, margin=1)
s1
##            
##             Non-blue-collar Blue-collar
##   Non-union       0.6319366   0.3680634
##   Union           0.2387863   0.7612137
  • Trực quan hóa
s2 <- as.data.frame(s1)
colnames(s2) <- c("union", "bluecol", "Proportion")

ggplot(s2, aes(x = bluecol, y = Proportion, fill = union)) +
  geom_bar(stat = "identity", position = "dodge") +
  labs(
    title = "Tỷ lệ tham gia công đoàn theo loại lao động",
    x = "Loại lao động",
    y = "Tỷ lệ",
    fill = "Tình trạng tham gia công đoàn"
  ) +
  theme_minimal() +
  scale_y_continuous(labels = scales::percent) +
  scale_fill_manual(values = c("Non-union" = "darkblue", "Union" = "pink")) +
  geom_text(aes(label = scales::percent(Proportion, accuracy = 0.1)),
            position = position_dodge(width = 0.9),
            vjust = -0.3, size=5, fontface = "bold")

Nhận xét:
Các bảng tần suất và biểu đồ trên minh họa mối quan hệ giữa tình trạng tham gia công đoàn (union) và ngành nghề của người lao động (bluecol), có thể nhận thấy được sự phân hóa rõ rệt, trong khi 63.2% (1674/2036) người lao động thuộc nhóm “Non_blue_collar” không tham gia công đoàn, chỉ có 23.9% (362/2036) trong số họ là thành viên công đoàn. Ngược lại, đối với nhóm “Blue_collar”, tỷ lệ tham gia công đoàn lên đến 76.1% (1154/2129), cao hơn đáng kể so với tỷ lệ không tham gia là 36.8% (975/2129). Điều này cho thấy công đoàn có sức ảnh hưởng và sự hiện diện mạnh mẽ đáng kể trong các ngành nghề lao động chân tây hoặc kỹ thuật hơn so với các ngành nghề văn phòng, hành chính hoặc chuyên môn.

3.2.2.2 Biến union và biến ind

  • Bảng tần suất chéo
f <- table(d1$union,d1$ind)
addmargins(f)
##      
##       non-industrial industrial  Sum
##   no            1745        904 2649
##   yes            773        743 1516
##   Sum           2518       1647 4165
  • Bảng tần suất chéo theo tỷ lệ hàng
f1 <- prop.table(f, margin=1)
f1
##      
##       non-industrial industrial
##   no       0.6587391  0.3412609
##   yes      0.5098945  0.4901055
  • Trực quan hóa
f2 <- as.data.frame(f1)
colnames(f2) <- c("union", "ind", "Proportion")

ggplot(f2, aes(x = ind, y = Proportion, fill = union)) +
  geom_bar(stat = "identity", position = "dodge") +
  labs(
    title = "So sáng tỷ lệ tham gia công đoàn giữa ngành công nghiệp và phi công nghiệp",
    x = "Ngành nghề",
    y = "Tỷ lệ",
    fill = "Tình trạng tham gia công đoàn"
  ) +
  theme_minimal() +
  scale_y_continuous(labels = scales::percent) +scale_x_discrete(labels = c("non-industrial" = "Phi công nghiệp", "industrial" = "Công nghiệp")) +
  scale_fill_manual(values = c("no" = "salmon", "yes" = "darkblue")) +
  geom_text(aes(label = scales::percent(Proportion, accuracy = 0.1)),
            position = position_dodge(width = 0.9),
             vjust = -0.3, size=5, fontface = "bold")

Nhận xét: Trong tổng số 4165 người lao động được khảo sát tại Hoa Kỳ, mặc dù số lượng người không tham gia công đoàn chiếm đa số (2649 người) so với người tham gia (1516 người) và số lượng lao động trong nhóm ngành phi công nghiệp (2518 người) cũng đông hơn nhóm ngành công nghiệp (1647 người) nhưng tỷ lệ tham gia công đoàn lại thể hiện sự khác biệt đáng kể giữa hai nhóm ngành. Cụ thể, trong khi 65.9% người lao động trong nhóm ngành phi công nghiệp không phải là thành viên công đoàn và chỉ có 51% tham gia, thì ở ngành công nghiệp, tỷ lệ tham gia công đoàn là 49%, cao hơn so với tỷ lệ không tham gia là 34.1%. Điều này chỉ ra rằng, người lao động trong ngành công nghiệp sản xuất có xu hướng gia nhập công đoàn nhiều hơn những người làm việc trong các lĩnh vực phi công nghiệp. Phản ảnh sự đặc thù về điều kiện lao động hoặc nhận thức về lợi ích của việc tham gia công đoàn trong từng nhóm ngành nghề khác nhau.

3.2.2.3 Biến union và biến south

  • Bảng tần suất chéo
# Bảng tần suất chéo với nhãn rõ ràng
g <- table(factor(d1$union, levels = c("no", "yes"), 
                  labels = c("Không tham gia công đoàn", "Tham gia công đoàn")),
           factor(d1$south, levels = c("no", "yes"), 
                  labels = c("Không sống tại miền Nam", "Sống tại miền Nam")))
addmargins(g)
##                           
##                            Không sống tại miền Nam Sống tại miền Nam  Sum
##   Không tham gia công đoàn                    1732               917 2649
##   Tham gia công đoàn                          1224               292 1516
##   Sum                                         2956              1209 4165
  • Bảng tần suất chéo theo tỷ lệ hàng
g1 <- prop.table(g, margin=1)
g1
##                           
##                            Không sống tại miền Nam Sống tại miền Nam
##   Không tham gia công đoàn               0.6538316         0.3461684
##   Tham gia công đoàn                     0.8073879         0.1926121
  • Trực quan hóa
df <- as.data.frame(g1)
colnames(df) <- c("Union", "South", "Proportion")

# Vẽ biểu đồ
ggplot(df, aes(x = Union, y = Proportion, fill = South)) +
  geom_col(position = "dodge") +
  geom_text(aes(label = scales::percent(Proportion, accuracy = 0.1)), 
            position = position_dodge(width = 0.9), vjust = -0.5, size = 5,fontface = "bold") +
  labs(title = "Tỷ lệ tham gia công đoàn theo khu vực cư trú",
       x = "Tình trạng công đoàn",
       y = "Tỷ lệ",
       fill = "Khu vực cư trú") +
  scale_fill_manual(values = c("Không sống tại miền Nam" = "salmon", 
                               "Sống tại miền Nam" = "blue")) +
  ylim(0, 1) +
  theme_minimal()

Nhận xét:
Trong số những người không tham gia công đoàn, 65.4% tỷ lệ người lao động không số tại miền Nam Hoa kỳ, trong khi 34.6% sống tại miền Nam Hoa Kỳ. Điều đáng chú ý là trong nhóm tham gia công đoàn, đại đa số (80.7%) không sống tại miền Nam và chỉ có 19.3% đến từ miền Nam Hoa Kỳ. Cho thấy những lao động sống bên ngoài khu vực miền Nam Hoa kỳ có khả năng tham gia công đoàn cao hơn đáng kể so với những người sống tại miền Nam.

3.2.2.4 Biến union và biến married

  • Bảng tần suất chéo
# Bảng tần suất chéo với nhãn rõ ràng
j <- table(factor(d1$union, levels = c("no", "yes"), 
                  labels = c("Non-union", "Union")),
           factor(d1$married, levels = c("no", "yes"), 
                  labels = c("Single", "Married")))
addmargins(j)
##            
##             Single Married  Sum
##   Non-union    581    2068 2649
##   Union        192    1324 1516
##   Sum          773    3392 4165
  • Bảng tần suất chéo theo tỷ lệ hàng
j1 <- prop.table(j, margin=1)
j1
##            
##                Single   Married
##   Non-union 0.2193280 0.7806720
##   Union     0.1266491 0.8733509
  • Trực quan hóa
j2 <- as.data.frame(j1)
colnames(j2) <- c("union", "married", "Proportion")

ggplot(j2, aes(x = union, y = Proportion, fill = married)) +
  geom_bar(stat = "identity", position = "dodge") +
  labs(
    title = "Tỷ lệ tham gia công đoàn theo tình trạng hôn nhân",
    x = "Tình trạng tham gia công đoàn",
    y = "Tỷ lệ",
    fill = "Tình trạng hôn nhân"
  ) +
  theme_minimal() +
  scale_y_continuous(labels = scales::percent)  +
  scale_fill_manual(values = c("Single" = "yellow", "Married" = "darkblue")) +
  geom_text(aes(label = scales::percent(Proportion, accuracy = 0.1)),
            position = position_dodge(width = 0.9),
             vjust = -0.3, size=5, fontface = "bold")

Nhận xét:
Khi xem xét mối quan hệ giữa hai biến, trong số những người không tham gia công đoàn, 78.1% đã kết hôn và 21.9% độc thân. Tuy nhiên, trong nhóm những người tham gia công đoàn, tỷ lệ người đã kết hôn thậm chí còn cao hơn, chiếm tới 87.3%, trong khi chỉ có 12.7% là người độc thân. Có thể thấy được, những người đã kết hôn có xu hướng tham gia công đoàn nhiều hơn đáng kẻ so với những người độc thân.

3.2.2.5 Biến union và biến sex

Bảng tuần suất chéo

# Bảng tần suất chéo với nhãn rõ ràng
k <- table(factor(d1$union, levels = c("no", "yes"), 
                  labels = c("Non-union", "Union")),
           factor(d1$sex, levels = c("female", "male"), 
                  labels = c("female", "male")))
addmargins(k)
##            
##             female male  Sum
##   Non-union    370 2279 2649
##   Union         99 1417 1516
##   Sum          469 3696 4165

Bảng tuần suất chéo theo tỷ lệ hàng

k1 <- prop.table(k, margin=1)
k1
##            
##                 female       male
##   Non-union 0.13967535 0.86032465
##   Union     0.06530343 0.93469657

Trực quan hóa

k2 <- as.data.frame(k1)
colnames(k2) <- c("union", "sex", "Proportion")

ggplot(k2, aes(x = union, y = Proportion, fill = sex)) +
  geom_bar(stat = "identity", position = "dodge") +
  labs(
    title = "Tỷ lệ tham gia công đoàn theo tình trạng giới tính",
    x = "Tình trạng tham gia công đoàn",
    y = "Tỷ lệ",
    fill = "Tình trạng giới tính"
  ) +
  theme_minimal() +
  scale_y_continuous(labels = scales::percent) +
  scale_fill_manual(values = c("female" = "yellow", "male" = "darkgreen")) +
  geom_text(aes(label = scales::percent(Proportion, accuracy = 0.1)),
            position = position_dodge(width = 0.9),
            vjust = -0.3, size=5, fontface = "bold")

Nhận xét:
Trong nhóm những người không tham gia công đoàn, nam giới chiếm 86% (2279 người), trong khi nữ giới chiếm 14% (370 người). Trong nhóm những người tham gia công đoàn: nam giới chiếm tới chiếm 93.5% (1417 người) và nữ giới chiếm 6.5% (99 người). Cả trong nhóm tham gia công đoàn và không tham gia công đoàn thì nam giới luôn là nhóm chiếm phần lớn hơn.

3.2.2.6 Biến union và biến black

Bảng tần suất chéo

# Bảng tần suất chéo với nhãn rõ ràng
l <- table(factor(d1$union, levels = c("no", "yes"), 
                  labels = c("Non-union", "Union")),
           factor(d1$black, levels = c("no", "yes"), 
                  labels = c("Non-black", "Black")))
addmargins(l)
##            
##             Non-black Black  Sum
##   Non-union      2482   167 2649
##   Union          1382   134 1516
##   Sum            3864   301 4165

Bảng tuần suất chéo theo tỷ lệ hàng

l1 <- prop.table(l, margin=1)
l1
##            
##              Non-black      Black
##   Non-union 0.93695734 0.06304266
##   Union     0.91160950 0.08839050

Trực quan hóa

l2 <- as.data.frame(l1)
colnames(l2) <- c("union", "black", "Proportion")

ggplot(l2, aes(x = union, y = Proportion, fill = black)) +
  geom_bar(stat = "identity", position = "dodge") +
  labs(
    title = "Tỷ lệ tham gia công đoàn theo tình trạng chủng tộc",
    x = "Tình trạng tham gia công đoàn",
    y = "Tỷ lệ",
    fill = "Tình trạng chủng tộc"
  ) +
  theme_minimal() +
  scale_y_continuous(labels = scales::percent) +
  scale_fill_manual(values = c("Non-black" = "pink", "Black" = "gray")) +
  geom_text(aes(label = scales::percent(Proportion, accuracy = 0.1)),
            position = position_dodge(width = 0.9),
            vjust = -0.3, size=5, fontface = "bold")

Nhận xét:
Nhóm những người không tham gia công đoàn, những người lao động không thuộc chủng tộc người da đen chiếm tỷ lệ áp đảo là 93.7% và người lao động thuộc chủng tộc người da đen chỉ chiếm 6.3%. Và tương tự, những người lao động không phải người da đen cũng chiếm tỷ lệ rất cao 91.2%, trong khi người da đen chiếm 8.8%. Cho thấy trong cả hai nhóm, người không phải người da đen đều chiếm tỷ áp đảo so với người da đen.

3.2.3 Relative Risk

Relative Risk (RR), hay còn gọi là nguy cơ tương đối. Là một chỉ số thống kê để so sánh xác suất một sự kiện (ví dụ: tham gia công đoàn) giữa hai nhóm đối tượng khác nhau, trong đó một nhóm là đặc điểm hoặc yếu tố được quan tâm (ví dụ như đặc điểm người lao động là nam, là người da đen, đã kết hôn,…).
Nói cách khác, RR cho biết nguy cơ xảy ra sự kiện ở nhóm có yếu tố được quan tâm cao hơn, thấp hơn, hay bằng với nhóm không phải yếu tố được quan tâm.
\[ RR = \frac{P(\text{Sự kiện xảy ra } | \text{ Nhóm có yếu tố})}{\text{P(Sự kiện xảy ra } | \text{ Nhóm không có yếu tố)}} \] Trong đó:

  • Tử số là xác suất xảy ra sự kiện ở nhóm có đặc điểm hoặc yếu tố được quan tâm.

  • Mẫu số là xác suất xảy ra sự kiện ở nhóm không có đặc điểm hoặc yếu tố cần quan tâm.

Diễn giải:

  • Nếu \(RR=1\): không có sự khác biệt về nguy cơ giữa hai nhóm.

  • Nếu \(RR>1\): Nhóm có yếu tố cần quan tâm có nguy cơ xảy ra sự kiện cao hơn so với nhóm không có yếu tố cần quan tâm.

  • Nếu \(RR<1\): Nhóm có yếu tố cần quan tâm có nguy cơ xảy ra sự kiện thấp hơn so với nhóm không có yếu tố cần quan tâm.

Ví dụ:
\[ RR = \frac{P(\text{Tham gia công đoàn } | \text{ Giới tính nam})}{\text{P(Tham gia công đoàn } | \text{ Giới tính nữ)}} \]
Diễn giải:

  • Nếu \(RR=1\): Không có sự khác biệt về khả năng tham gia công đoàn giữa nam và nữ.

  • Nếu \(RR>1\): Nam giới có khả năng tham gia công đoàn cao hơn nữ giới.

  • Nếu \(RR<1\): Nam giới có khả năng tham gia công đoàn thấp hơn so với nữ giới.

3.2.3.1 Biến union và biến bluecol

  • TH1: Nhóm lao động chân tay làm tham chiếu.
    \[ RR = \frac{P(\text{Non-union } | \text{ Non-blue-collar})}{\text{P(Non-union } | \text{ Blue-collar)}} \]
p <- table(factor(d1$bluecol, levels = c("no", "yes"), 
                  labels = c("Non-blue-collar", "Blue-collar")),
           factor(d1$union, levels = c("no", "yes"), 
                  labels = c("Non-union", "Union")))
riskratio(p,rev="b")
## $data
##                  
##                   Union Non-union Total
##   Blue-collar      1154       975  2129
##   Non-blue-collar   362      1674  2036
##   Total            1516      2649  4165
## 
## $measure
##                  risk ratio with 95% C.I.
##                   estimate    lower    upper
##   Blue-collar     1.000000       NA       NA
##   Non-blue-collar 1.795348 1.707047 1.888218
## 
## $p.value
##                  two-sided
##                   midp.exact  fisher.exact   chi.square
##   Blue-collar             NA            NA           NA
##   Non-blue-collar          0 1.622863e-136 1.00038e-131
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "Unconditional MLE & normal approximation (Wald) CI"

Nhận xét:

Có sự khác biệt giữa khả năng không tham gia công đoàn ở hai biểu hiện của biến bluecol. Kết quả thu được RR \(\approx 1.8\). Tức là những người không làm việc trong nhóm lao động chân tay có khả năng không tham gia công đoàn cao hơn 1.8 lần so với những người trong nhóm lao động chân tay.

Khoảng tin cậy cho thấy rằng, với độ tin cậy 95%, chúng ta có thể kết luận rằng khả năng người lao động không tham gia công đoàn của người không thuộc nhóm lao động chân tay cao hơn từ 1.707 đến 1.888 lần so với người thuộc nhóm lao động chân tay.

Kết quả kiểm định Chi-square cho thấy có mối liên hệ có ý nghĩa thống kê giữa loại lao động và khả năng tham gia công đoàn. Điều này cho thấy việc là lao động chân tay hay không có ảnh hưởng đáng kể đến khả năng không tham gia công đoàn.

  • TH2: Không thuộc nhóm lao động chân tay làm tham chiếu.

\[ RR = \frac{P(\text{Union } | \text{ Blue-collar})}{\text{P(Union } | \text{ Non-blue-collar)}} \]

riskratio(p)
## $data
##                  
##                   Non-union Union Total
##   Non-blue-collar      1674   362  2036
##   Blue-collar           975  1154  2129
##   Total                2649  1516  4165
## 
## $measure
##                  risk ratio with 95% C.I.
##                   estimate    lower    upper
##   Non-blue-collar 1.000000       NA       NA
##   Blue-collar     3.048592 2.755063 3.373395
## 
## $p.value
##                  two-sided
##                   midp.exact  fisher.exact   chi.square
##   Non-blue-collar         NA            NA           NA
##   Blue-collar              0 1.622863e-136 1.00038e-131
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "Unconditional MLE & normal approximation (Wald) CI"

Nhận xét:

Có sự khác biệt về khả năng tham gia công đoàn ở hai biểu hiện của biến bluecol. Kết quả nhận được cho thấy những người thuộc nhóm lao động chân tay có khả năng tham gia công đoàn cao hơn 3.05 lần so với những người không thuộc nhóm lao động chân tay.

Với độ tin cậy 95%, khả năng tham gia công đoàn ở nhóm lao động chân tay có thể cao hơn khoảng từ 2.76 đến 3.37 lần so với nhóm không lao động chân tay.

Kết quả kiểm định cho thấy có mối liên hệ giữa loại lao động và khả năng tham gia công đoàn.

3.2.3.2 Biến union và biến ind

  • TH1: Không thuộc nhóm ngành sản xuất làm tham chiếu.
    \[ RR = \frac{P(\text{Union } | \text{ industrial})}{\text{P(Union } | \text{ non-industrial)}} \]
p1 <- table(d1$ind,
           factor(d1$union, levels = c("no", "yes"), 
                  labels = c("Non-union", "Union")))
riskratio(p1)
## $data
##                 
##                  Non-union Union Total
##   non-industrial      1745   773  2518
##   industrial           904   743  1647
##   Total               2649  1516  4165
## 
## $measure
##                 risk ratio with 95% C.I.
##                  estimate    lower    upper
##   non-industrial 1.000000       NA       NA
##   industrial     1.469506 1.357533 1.590716
## 
## $p.value
##                 two-sided
##                  midp.exact fisher.exact   chi.square
##   non-industrial         NA           NA           NA
##   industrial              0     5.01e-21 3.301405e-21
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "Unconditional MLE & normal approximation (Wald) CI"

Nhận xét:

Kết quả cho thấy giá trị Relative Risk nhận được là 1.47, lớn hơn 1. Tức là những người lao động thuộc nhóm ngành sản xuất có khả năng tham gia công đoàn cao hơn 1.47 lần so với những người không thuộc nhóm ngành sản xuất.

Với độ tin cậy 95%, khả năng tham gia công đoàn ở nhóm ngành sản xuất có thể cao hơn từ 1.357 đến 1.59 lần so với nhóm không thuộc ngành sản xuất.

Kết quả kiểm định Chi-square cho thấy có mối liên hệ thống kê giữa ngành nghề và khả năng tham gia công đoàn.

  • TH2: nhóm ngành sản xuất làm tham chiếu.

\[ RR = \frac{P(\text{Non-union } | \text{ non-industrial})}{\text{P(Non-union } | \text{ industrial)}} \]

riskratio(p1,rev="b")
## $data
##                 
##                  Union Non-union Total
##   industrial       743       904  1647
##   non-industrial   773      1745  2518
##   Total           1516      2649  4165
## 
## $measure
##                 risk ratio with 95% C.I.
##                  estimate    lower    upper
##   industrial     1.000000       NA       NA
##   non-industrial 1.262597 1.199916 1.328553
## 
## $p.value
##                 two-sided
##                  midp.exact fisher.exact   chi.square
##   industrial             NA           NA           NA
##   non-industrial          0     5.01e-21 3.301405e-21
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "Unconditional MLE & normal approximation (Wald) CI"

Nhận xét:

Giá trị Relative Risk là 1.263, lớn hơn 1. Nghĩa là những người lao động không thuộc nhóm ngành sản xuất có khả năng không tham gia công đoàn cao hơn 1.263 lần so với những người thuộc nhóm ngành sản xuất.

Với mức tin cậy 95%, khả năng không tham gia công đoàn ở nhóm không thuộc ngành sản xuất cao cao hơn từ khoảng 1.1999 đến 1.329 lần so với nhóm thuộc ngành sản xuất.

Kết quả kiểm định cho thấy có mối quan hệ có ý nghĩa thống kê giữa ngành nghề và khả năng không tham gia công đoàn.

3.2.3.3 Biến union và biến south

  • TH1: Không cư trú tại miền Nam Hoa Kỳ làm tham chiếu.
    \[ RR = \frac{P(\text{Union } | \text{ Cư trú tại miền Nam Hoa Kỳ})}{\text{P(Union } | \text{ Không cư trú tại miền Nam Hoa Kỳ)}} \]
p2 <- table(factor(d1$south, levels = c("no", "yes"), 
                  labels = c("Không cư trú tại miền Nam", "Cư trú tại miền Nam")),
           factor(d1$union, levels = c("no", "yes"), 
                  labels = c("Non-union", "Union")))
riskratio(p2)
## $data
##                            
##                             Non-union Union Total
##   Không cư trú tại miền Nam      1732  1224  2956
##   Cư trú tại miền Nam             917   292  1209
##   Total                          2649  1516  4165
## 
## $measure
##                            risk ratio with 95% C.I.
##                              estimate     lower    upper
##   Không cư trú tại miền Nam 1.0000000        NA       NA
##   Cư trú tại miền Nam       0.5832833 0.5232012 0.650265
## 
## $p.value
##                            two-sided
##                             midp.exact fisher.exact  chi.square
##   Không cư trú tại miền Nam         NA           NA          NA
##   Cư trú tại miền Nam                0 1.068543e-26 8.18368e-26
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "Unconditional MLE & normal approximation (Wald) CI"

Nhận xét:

Giá trị Relative Risk nhận được là 0.5833, nhỏ hơn 1. Những người lao động cư trú tại miền Nam Hoa Kỳ có khả năng tham gia công đoàn thấp hơn 0.5833 lần so với những người không cư trú tại miền Nam Hoa Kỳ.

Với độ tin cậy 95%, khả năng tham gia công đoàn của nhóm người lao động cư trú tại miền Nam thấp hơn từ khoảng 0.523 đến 0.65 lần so với nhóm những người không cư trú tại miền Nam Hoa Kỳ.
Kết quả kiểm định Chi-square cho thấy có mối liên hệ có ý nghĩa thống kê giữa khu vực cư trú và khả năng tham gia công đoàn.

  • TH2: Cư trú tại khu vực miền Nam làm tham chiếu.

\[ RR = \frac{P(\text{Non-union } | \text{ Không cư trú tại miền Nam Hoa Kỳ})}{\text{P(Non-union } | \text{ Cư trú tại miền Nam Hoa Kỳ)}} \]

riskratio(p2,rev="b")
## $data
##                            
##                             Union Non-union Total
##   Cư trú tại miền Nam         292       917  1209
##   Không cư trú tại miền Nam  1224      1732  2956
##   Total                      1516      2649  4165
## 
## $measure
##                            risk ratio with 95% C.I.
##                              estimate     lower     upper
##   Cư trú tại miền Nam       1.0000000        NA        NA
##   Không cư trú tại miền Nam 0.7725034 0.7392993 0.8071989
## 
## $p.value
##                            two-sided
##                             midp.exact fisher.exact  chi.square
##   Cư trú tại miền Nam               NA           NA          NA
##   Không cư trú tại miền Nam          0 1.068543e-26 8.18368e-26
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "Unconditional MLE & normal approximation (Wald) CI"

Nhận xét:

Giá trị của Relative Risk là 0.773, nhỏ hơn 1. Nghĩa là những người lao động không cư trú tại miền Nam Hoa kỳ có khả năng không tham gia công đoàn thấp hơn 0.773 lần so với những người lao động cư trú tại miền Nam Hoa kỳ.

Với độ tin cậy 95%, khả năng không tham gia công đoàn của những người không cư trú tại miền Nam thấp hơn khoảng từ 0.74 đến 0.807 lần so với những người cư trú tại miền Nam Hoa kỳ.

Kết quả kiểm định Chi-square cho thấy có mối liên hệ có ý nghĩa thống kê giữa khu vực cư trú và khả năng không tham gia công đoàn.

3.2.3.4 Biến union và biến married

  • TH1: Chưa kết hôn làm tham chiếu.
    \[ RR = \frac{P(\text{Union } | \text{ Đã kết hôn})}{\text{P(Union } | \text{ Chưa kết hôn)}} \]
p3 <- table(factor(d1$married, levels = c("no", "yes"), 
                  labels = c("Chưa kết hôn", "Đã kết hôn")),
           factor(d1$union, levels = c("no", "yes"), 
                  labels = c("Non-union", "Union")))
riskratio(p3)
## $data
##               
##                Non-union Union Total
##   Chưa kết hôn       581   192   773
##   Đã kết hôn        2068  1324  3392
##   Total             2649  1516  4165
## 
## $measure
##               risk ratio with 95% C.I.
##                estimate    lower    upper
##   Chưa kết hôn 1.000000       NA       NA
##   Đã kết hôn   1.571486 1.380409 1.789011
## 
## $p.value
##               two-sided
##                  midp.exact fisher.exact   chi.square
##   Chưa kết hôn           NA           NA           NA
##   Đã kết hôn   3.863576e-14 5.029762e-14 1.339327e-13
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "Unconditional MLE & normal approximation (Wald) CI"

Nhận xét:

Giá trị Relative Risk nhận được là 1.57, lớn hơn 1. Những người lao đông đã kết hôn có khả năng tham gia công đoàn cao hơn 1.57 lần so với những người lao động chưa kết hôn.

Độ tin cậy 95%, khả năng tham gia công đoàn của những người lao động đã kết hôn cao hơn khoảng từ 1.38 đến 1.79 lần so với những người lao động chưa kết hôn.

Kết quả kiểm định cho thấy có mối quan hệ có ý nghĩa thống kê giữa tình trạng hôn nhân và khả năng tham gia công đoàn.

  • TH2: Đã kết hôn làm tham chiếu.
    \[ RR = \frac{P(\text{Non-union } | \text{ Chưa kết hôn})}{\text{P(Non-union } | \text{ Đã kết hôn)}} \]
riskratio(p3,rev="b")
## $data
##               
##                Union Non-union Total
##   Đã kết hôn    1324      2068  3392
##   Chưa kết hôn   192       581   773
##   Total         1516      2649  4165
## 
## $measure
##               risk ratio with 95% C.I.
##                estimate    lower    upper
##   Đã kết hôn   1.000000       NA       NA
##   Chưa kết hôn 1.232826 1.174279 1.294293
## 
## $p.value
##               two-sided
##                  midp.exact fisher.exact   chi.square
##   Đã kết hôn             NA           NA           NA
##   Chưa kết hôn 3.863576e-14 5.029762e-14 1.339327e-13
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "Unconditional MLE & normal approximation (Wald) CI"

Nhận xét:

Giá trị Relative Risk nhận được là 1.233, lớn hơn 1. Những người lao động chưa kết hôn có khả năng không tham gia công đoàn cao hơn 1.233 lần so với những người lao động đã kết hôn.

Với độ tin cậy 95%, khả năng không tham gia công đoàn của những người lao động chưa kết hôn cao hơn khoảng từ 1.174 đến 1.29 lần so với những người lao động đã kết hôn.

Kết quả kiểm định Chi-square cho thấy có mối quan hệ có ý nghĩa thống kê giữa tình trạng hôn nhân với khả năng không tham gia công đoàn.

3.2.3.5 Biến union và biến sex

TH1: Giới tính nữ làm tham chiếu
\[ RR = \frac{P(\text{Union } | \text{ male})}{\text{P(Union } | \text{ female)}} \]

p4 <- table(d1$sex,
           factor(d1$union, levels = c("no", "yes"), 
                  labels = c("Non-union", "Union")))
riskratio(p4)
## $data
##         
##          Non-union Union Total
##   female       370    99   469
##   male        2279  1417  3696
##   Total       2649  1516  4165
## 
## $measure
##         risk ratio with 95% C.I.
##          estimate    lower    upper
##   female  1.00000       NA       NA
##   male    1.81625 1.517551 2.173741
## 
## $p.value
##         two-sided
##            midp.exact fisher.exact   chi.square
##   female           NA           NA           NA
##   male   3.819167e-14 4.377756e-14 2.760744e-13
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "Unconditional MLE & normal approximation (Wald) CI"

Nhận xét:

Giá trị Relative Risk nhận được là 1.82, lớn hơn 1. Những người lao động nam có khả năng tham gia công đoàn cao hơn 1.82 lần so với những người lao động có giới tính nữ.

Với độ tin cậy 95%, khả năng tham gia công đoàn của người lao động nam cao hơn từ 1.52 đến 2.17 lần so với người lao động nữ.

Kết quả kiểm định Chi-square cho thấy có mối quan hệ có ý nghĩa thống kê giữa giới tính và khả năng tham gia công đoàn.

TH2: Giới tính nam làm tham chiếu
\[ RR = \frac{P(\text{Non-union } | \text{ female})}{\text{P(Non-union } | \text{ male)}} \]

riskratio(p4, rev="b")
## $data
##         
##          Union Non-union Total
##   male    1417      2279  3696
##   female    99       370   469
##   Total   1516      2649  4165
## 
## $measure
##         risk ratio with 95% C.I.
##          estimate    lower    upper
##   male    1.00000       NA       NA
##   female  1.27943 1.213057 1.349435
## 
## $p.value
##         two-sided
##            midp.exact fisher.exact   chi.square
##   male             NA           NA           NA
##   female 3.819167e-14 4.377756e-14 2.760744e-13
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "Unconditional MLE & normal approximation (Wald) CI"

Nhận xét:

Giá trị Relative Risk nhận được là 1.28, lớn hơn 1. Những người lao động nữ có khả năng không tham gia công đoàn cao hơn 1.28 lần so với những người lao động nam.

Với độ tin cậy 95%, khả năng không tham gia công đoàn của những người lao động nữ cao hơn so với những người lao động nam khoảng từ 1.21 đến 1.35 lần.

Kết quả kiểm định Chi-square cho thấy có mối quan hệ có ý nghĩa thống kê giữa giới tính và khả năng không tham gia công đoàn.

3.2.3.6 Biến union và biến black

  • TH1: Không phải người da đen làm tham chiếu.
    \[ RR = \frac{P(\text{Union } | \text{ Người da đen})}{\text{P(Union } | \text{ Không phải người da đen)}} \]
p5 <- table(factor(d1$black, levels = c("no", "yes"), 
                  labels = c("Không phải người da đen", "Người da đen")),
           factor(d1$union, levels = c("no", "yes"), 
                  labels = c("Non-union", "Union")))
riskratio(p5)
## $data
##                          
##                           Non-union Union Total
##   Không phải người da đen      2482  1382  3864
##   Người da đen                  167   134   301
##   Total                        2649  1516  4165
## 
## $measure
##                          risk ratio with 95% C.I.
##                           estimate    lower    upper
##   Không phải người da đen 1.000000       NA       NA
##   Người da đen            1.244708 1.089691 1.421777
## 
## $p.value
##                          two-sided
##                            midp.exact fisher.exact  chi.square
##   Không phải người da đen          NA           NA          NA
##   Người da đen            0.002686077  0.002795506 0.002367777
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "Unconditional MLE & normal approximation (Wald) CI"

Nhận xét:

Giá trị Relative Risk là 1.245, lớn hơn 1. Những người lao động là người da đen có khả năng tham gia công đoàn cao hơn 1.245 lần so với những người lao động không phải là người da đen.

Với độ tin cậy 95%, khả năng tham gia công đoàn của người da đen cao hơn so với những người không phải người da đen khoảng từ 1.089 đến 1.422 lần.

Kết quả kiểm định Chi-square cho thấy có mối quan hệ có ý nghĩa thống kê giữa chủng tộc và khả năng tham gia công đoàn.

  • TH2: Chủng tộc là người da đen làm tham chiếu.

\[ RR = \frac{P(\text{Non-union } | \text{ Không phải người da đen})}{\text{P(Non-union } | \text{ Người da đen)}} \]

riskratio(p5,rev="b")
## $data
##                          
##                           Union Non-union Total
##   Người da đen              134       167   301
##   Không phải người da đen  1382      2482  3864
##   Total                    1516      2649  4165
## 
## $measure
##                          risk ratio with 95% C.I.
##                           estimate    lower    upper
##   Người da đen             1.00000       NA       NA
##   Không phải người da đen  1.15775 1.043504 1.284504
## 
## $p.value
##                          two-sided
##                            midp.exact fisher.exact  chi.square
##   Người da đen                     NA           NA          NA
##   Không phải người da đen 0.002686077  0.002795506 0.002367777
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "Unconditional MLE & normal approximation (Wald) CI"

Nhận xét:

Giá trị Relative Risk là 1.158, cao hơn 1. Những người lao động không phải người da đen có khả năng không tham gia công đoàn cao hơn 1.158 lần so với những người da đen.

Với độ tin cậy 95%, khả năng không tham gia công đoàn của những người lao động không phải người da đen cao hơn so với người lao động da đen là khoảng từ 1.044 đến 1.285 lần.

Kết quả kiểm định Chi-square cho thấy có mối liên hệ có ý nghĩa thống kê giữa chủng tộc và khả năng không tham gia công đoàn.

Tổng hợp Relative Risk (RR) cho khả năng tham gia công đoàn của người lao động tại Hoa Kỳ:

Biến độc lập Tham chiếu So sánh với Relative Risk (RR) Giải thích
bluecol (lao động chân tay) Không phải lao động chân tay Lao động chân tay 3.05 Lao động chân tay có khả năng tham gia công đoàn cao hơn 3.05 lần so với người không lao động chân tay.
ind (ngành sản xuất) Không thuộc ngành sản xuất Thuộc ngành sản xuất 1.47 Người làm trong ngành sản xuất có khả năng tham gia công đoàn cao hơn 1.47 lần so với người khác.
south (khu vực miền Nam) Không cư trú miền Nam Cư trú tại miền Nam 0.583 Người sống tại miền Nam có khả năng tham gia công đoàn thấp hơn 0.5833 lần.
married (tình trạng hôn nhân) Chưa kết hôn Đã kết hôn 1.57 Người đã kết hôn có khả năng tham gia công đoàn cao hơn 1.57 lần so với người chưa kết hôn.
sex (giới tính) Nữ Nam 1.82 Nam giới có khả năng tham gia công đoàn cao hơn 1.82 lần so với nữ giới.
black (chủng tộc) Không phải người da đen Người da đen 1.245 Người da đen có khả năng tham gia công đoàn cao hơn 1.245 lần so với người không phải da đen.

3.2.4 Odds ratio

Odds - tỷ lệ chênh lệch: là tỷ lệ giữa xảy ra sự kiện và xác suất không xảy ra sự kiện.

Nếu xác suất xảy ra sự kiện là \(p\) thì” \[ \text{Odds} = \frac{p}{1-p} \]

Odds Ratio - tỷ lệ chênh lệch giữa hai nhóm: là tỷ số giữa hai Odds, dùng để so sánh xác suất xảy ra giữa kiện giữa nhóm có biểu hiện cần quan tâm và nhóm không có biểu hiện cần quan tâm.

\[ \text{OR} = \frac{\frac{P(\text{Sự kiện xảy ra } | \text{ Nhóm có biểu hiện cần quan tâm})}{P(\text{Không xảy ra sự kiện } | \text{ Nhóm có biểu hiện cần quan tâm})}}{\frac{P(\text{Sự kiện xảy ra } | \text{ Nhóm không có biểu hiện cần quan tâm})}{P(\text{Không xảy ra sự kiện} | \text{ Nhóm không có biểu hiện quan tâm})}} \] Hay viết gọn hơn:
\[ \text{OR} = \frac{\text{Odds}(\text{Sự kiện xảy ra } | \text{ Nhóm có biểu hiện cần quan tâm})}{\text{Odds}(\text{Sự kiện xảy ra } | \text{ nhóm không có biểu hiện cần quan tâm})} \] Diễn giải:

  • Nếu \(OR=1\): odds xảy ra sự kiện ở hai nhóm là như nhau.

  • Nếu \(OR>1\): nhóm có biểu hiện cần quan tâm có khả năng xảy ra sự kiện cao hơn nhóm không có biểu hiện cần quan tâm.

  • Nếu \(OR<1\): nhóm có biểu hiện cần quan tâm có khả năng xảy ra sự kiện thấp hơn nhóm không có biểu hiện cần quan tâm.

3.2.4.1 Biến union và biến bluecol

p11 <- table(factor(d1$union, levels = c("no", "yes"), 
                  labels = c("Non-union", "Union")),factor(d1$bluecol, levels = c("no", "yes"), 
                  labels = c("Non-blue-collar", "Blue-collar")))
oddsratio(p11)
## $data
##            
##             Non-blue-collar Blue-collar Total
##   Non-union            1674         975  2649
##   Union                 362        1154  1516
##   Total                2036        2129  4165
## 
## $measure
##            odds ratio with 95% C.I.
##             estimate    lower    upper
##   Non-union 1.000000       NA       NA
##   Union     5.469562 4.749438 6.310394
## 
## $p.value
##            two-sided
##             midp.exact  fisher.exact   chi.square
##   Non-union         NA            NA           NA
##   Union              0 1.622863e-136 1.00038e-131
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "median-unbiased estimate & mid-p exact CI"

Nhận xét:

Giá trị \(OR=5.47\), tức là tỷ lệ chênh để một người lao động tham gia công đoàn làm việc trong nhóm lao động chân tay so với một người lao động tham gia công đoàn không làm loại công việc chân tay cao hơn 5.47 lần tỷ lệ chênh tương ứng của người không tham gia công đoàn.

Nói cách khác, người tham gia công đoàn có khả năng làm việc trong nhóm lao động chân tay cap hơn gấp hơn 5 lần so với người không tham công đoàn.

Khoảng tin cậy của OR với độ tin cậy 95% là (4.75; 6.31), không chứa giá trị 1, nên sự khác biệt về odds loại lao động giữa 2 nhóm là có ý nghĩa thống kê.

Các giá trị p-value của các kiểm định khẳng định sự khác biệt odds là có ý nghĩa thống kê mạnh.

3.2.4.2 BIến union và biến ind

p6 <- table(factor(d1$union, levels = c("no", "yes"), 
                  labels = c("Non-union", "Union")),d1$ind)
oddsratio(p6)
## $data
##            
##             non-industrial industrial Total
##   Non-union           1745        904  2649
##   Union                773        743  1516
##   Total               2518       1647  4165
## 
## $measure
##            odds ratio with 95% C.I.
##             estimate    lower    upper
##   Non-union 1.000000       NA       NA
##   Union     1.855052 1.630995 2.110364
## 
## $p.value
##            two-sided
##             midp.exact fisher.exact   chi.square
##   Non-union         NA           NA           NA
##   Union              0     5.01e-21 3.301405e-21
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "median-unbiased estimate & mid-p exact CI"

Nhận xét:

Odds ratio \(=1.855\), điều này có nghĩa là tỷ lệ chênh lệch để một người lao động tham gia công đoàn không làm việc trong ngành sản xuất so với người lao động tham gia công đoàn làm việc trong ngành sản xuất cho hơn 1.855 lần so với người lao động không tham gia công đoàn.

Nói cách khác, người tham gia công đoàn có khả năng không làm việc trong ngành sản xuất cao hơn gần gấp đôi so với người không tham gia công đoàn.

Khoảng tin cậy của OR là (1.631;2.110), không chứa giá trị 1, có thể kết luận sự khác biệt này có ý nghĩa thống kê ở mức tin cậy 95%.

Các giá trị p-value cho kiểm định ý nghĩa OR gần như bằng 0, có thể kết luận rằng sự khác biệt odds giữa nhóm tham gia công đoàn và nhóm không tham gia công đoàn là có ý nghĩa thống kê.

Khoảng tin cậy 95% cho odds ratio là (1.631;2.11), không bao gồm giá trị 1, cho thấy sự khác biệt này có ý nghĩa thống kê.

3.2.4.3 Biến union và biến south

p7 <- table(factor(d1$union, levels = c("no", "yes"), 
                  labels = c("Non-union", "Union")),factor(d1$south, levels = c("no", "yes"), 
                  labels = c("non-south", "south")))
oddsratio(p7)
## $data
##            
##             non-south south Total
##   Non-union      1732   917  2649
##   Union          1224   292  1516
##   Total          2956  1209  4165
## 
## $measure
##            odds ratio with 95% C.I.
##             estimate     lower     upper
##   Non-union 1.000000        NA        NA
##   Union     0.450803 0.3872669 0.5235685
## 
## $p.value
##            two-sided
##             midp.exact fisher.exact  chi.square
##   Non-union         NA           NA          NA
##   Union              0 1.068543e-26 8.18368e-26
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "median-unbiased estimate & mid-p exact CI"

Nhận xét:

Giá trị \(OR=0.451\), có nghĩa là tỷ lệ chênh lệch để một người lao động tham gia công đoàn không sống tại miền Nam Hoa Kỳ so với người lao động tham gia công đoàn sống tại miền Nam Hoa Kỳ chỉ bằng khoảng 45.1% tỷ lệ chênh của người không tham gia công đoàn.

Nói cách khác, người tham gia công đoàn có khả năng sống tại miền Nam thấp hơn 55% so với người không tham gia công đoàn.

Khoảng tin cậy của OR với độ tin cậy 95% là (0.3873;0.5236), không chứa giá trị 1, cho thấy sự khác biệt đáng kể về odds giữa nhóm tham gia công đoàn và không tham gia công đoàn là có ý nghĩa thống kê.

Giá trị p-value từ các kiểm định đều gần bằng 0, càng khẳng định rằng odds giữa hai nhóm là có ý nghĩa.

3.2.4.4 Biến union và biến married

p8 <- table(factor(d1$union, levels = c("no", "yes"), 
                  labels = c("Non-union", "Union")),factor(d1$married, levels = c("no", "yes"), 
                  labels = c("Single", "Married")))
oddsratio(p8)
## $data
##            
##             Single Married Total
##   Non-union    581    2068  2649
##   Union        192    1324  1516
##   Total        773    3392  4165
## 
## $measure
##            odds ratio with 95% C.I.
##             estimate    lower    upper
##   Non-union 1.000000       NA       NA
##   Union     1.936146 1.624601 2.316163
## 
## $p.value
##            two-sided
##               midp.exact fisher.exact   chi.square
##   Non-union           NA           NA           NA
##   Union     3.863576e-14 5.029762e-14 1.339327e-13
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "median-unbiased estimate & mid-p exact CI"

Nhận xét:

Giá trị \(OR=1.936\), tức là tỷ lệ chênh để một người lao động tham gia công đoàn chưa kết hôn so với người lao động tham gia công đoàn đã kết hôn cao hơn gần 1.94 lần so với người không tham gia công đoàn.

Nói cách khác, người tham gia công đoàn có khả năng độc thân cao hơn gần gấp đôi so với người không tham gia công đoàn.

Khoảng tin cậy của OR là (1.625;2.316), không chứa 1, do đó sự khác biệt odds về trạng thái hôn nhân giữa nhóm tham gia công đoàn và không tham gia công đoàn là có ý nghĩa thống kê.
Các giá trị p-value của các kiểm định đều thấp hơn so với 0.05, kết luận sự khác biệt là có ý nghĩa thống kê mạnh.

3.2.4.5 Biến union và biến sex

p9 <- table(factor(d1$union, levels = c("no", "yes"), 
                  labels = c("Non-union", "Union")),d1$sex)
oddsratio(p9)
## $data
##            
##             female male Total
##   Non-union    370 2279  2649
##   Union         99 1417  1516
##   Total        469 3696  4165
## 
## $measure
##            odds ratio with 95% C.I.
##             estimate    lower    upper
##   Non-union 1.000000       NA       NA
##   Union     2.320732 1.848487 2.939374
## 
## $p.value
##            two-sided
##               midp.exact fisher.exact   chi.square
##   Non-union           NA           NA           NA
##   Union     3.819167e-14 4.377756e-14 2.760744e-13
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "median-unbiased estimate & mid-p exact CI"

Nhận xét:

Giá trị \(OR=2.32\), tức là tỷ lệ chênh để một người lao động nữ tham gia công đoàn so với người lao động nam tham gia công đoàn cao hơn khoảng 2.32 lần odds tương ứng với nhóm không tham gia công đoàn.

Nói cách khác, người tham gia công đoàn có khả năng là nữ cao hơn 2 lần so với người không tham gia công đoàn.

Khoảng tin cậy của OR là (1.85; 2.94),không chứa 1, do đó sự khác biệt odds về trạng thái hôn nhân giữa nhóm tham gia công đoàn và không tham gia công đoàn là có ý nghĩa thống kê.

Các giá trị p-value của các kiểm định đều thấp hơn so với 0.05, kết luận sự khác biệt là có ý nghĩa thống kê mạnh.

3.2.4.6 Biến union và biến black

p10 <- table(factor(d1$union, levels = c("no", "yes"), 
                  labels = c("Non-union", "Union")),factor(d1$black, levels = c("no", "yes"), 
                  labels = c("non-black", "black")))
oddsratio(p10)
## $data
##            
##             non-black black Total
##   Non-union      2482   167  2649
##   Union          1382   134  1516
##   Total          3864   301  4165
## 
## $measure
##            odds ratio with 95% C.I.
##             estimate    lower    upper
##   Non-union 1.000000       NA       NA
##   Union     1.441248 1.136079 1.825309
## 
## $p.value
##            two-sided
##              midp.exact fisher.exact  chi.square
##   Non-union          NA           NA          NA
##   Union     0.002686077  0.002795506 0.002367777
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "median-unbiased estimate & mid-p exact CI"

Nhận xét:
Giá trị \(OR=1.441\), cho thấy tỷ lệ chênh để một người lao động tham gia công đoàn là người da đen so với người lao động tham gia công đoàn không phải là người da đen cao hơn khoảng 1.441 lần odds tương ứng của nhóm không tham gia công đoàn.

Nói cách khác, người tham công đoàn có khả năng là người da đen cao hơn khoảng 44% so với người không tham gia công đoàn.

Khoảng tin cậy của OR là (1.136;1825), không chứa giá trị 1, sự khác biệt về odds chủng tộc giữa hai nhóm có ý nghĩa thống kê.

Các giá trị thu được từ các kiểm định đều cho thấy sự khác biệt về odds có ý nghĩa thống kê.

Bảng tổng hợp Odds Ratio (OR) cho khả năng tham gia công đoàn của người lao động tại Hoa Kỳ:

Biến độc lập Tham chiếu So sánh với Odds Ratio (OR) Giải thích
bluecol (lao động chân tay) Không phải lao động chân tay Lao động chân tay 3.97 Người thuộc nhóm lao động chân tay có odds tham gia công đoàn cao hơn 3.97 lần so với người không thuộc nhóm lao động chân tay.
ind (ngành sản xuất) Không thuộc ngành sản xuất Thuộc ngành sản xuất 2.11 Người trong ngành sản xuất có odds tham gia công đoàn cao hơn 2.11 lần so với người ngoài ngành.
south (khu vực miền Nam) Không cư trú tại miền Nam Cư trú tại miền Nam 0.452 Người sống tại miền Nam có odds tham gia công đoàn thấp hơn 0.452 lần so với nơi khác.
married (tình trạng hôn nhân) Chưa kết hôn Đã kết hôn 1.41 Người đã kết hôn có odds tham gia công đoàn cao hơn 1.41 lần so với người chưa kết hôn.
sex (giới tính) Nữ Nam 1.61 Nam giới có odds tham gia công đoàn cao hơn 1.61 lần so với nữ giới.
black (chủng tộc) Không phải người da đen Người da đen 1.86 Người da đen có odds tham gia công đoàn cao hơn 1.86 lần so với người không phải da đen.

3.2.5 Mô hình Logit

3.2.5.1 Biến bluecol

📌 Thành phần mô hình:

  • Random component:
    \(Y \sim \text{Bernoulli}(p)\)

  • Systematic component:
    \(\eta = \beta_0 + \beta_1 \times \text{bluecol}\)

  • Link function:
    \(g(p) = \log\left(\frac{p}{1-p}\right)\)

📌 Phương trình mô hình:

\[ \log \left(\frac{p_i}{1-p_i}\right) = \beta_0 + \beta_1 \times \text{bluecol}_i \]

Trong đó:

  • \(p_i\) là xác suất người lao động thứ \(i\) tham gia công đoàn

  • \(\text{bluecol}_i\) là biến loại lao động: no hoặc yes

  • \(\beta_0\) là hệ số chặn (intercept)

  • \(\beta_1\) là hệ số ảnh hưởng của loại lao động đến xác suất tham gia công đoàn

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

d1$union_bin <- ifelse(d1$union == "yes", 1, 0)   

logit_model1 <- glm(union_bin ~ bluecol, data = d1, family = binomial(link = "logit"))
summary(logit_model1)
## 
## Call:
## glm(formula = union_bin ~ bluecol, family = binomial(link = "logit"), 
##     data = d1)
## 
## Coefficients:
##             Estimate Std. Error z value Pr(>|z|)    
## (Intercept) -1.53133    0.05796  -26.42   <2e-16 ***
## bluecolyes   1.69988    0.07247   23.46   <2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 5461.8  on 4164  degrees of freedom
## Residual deviance: 4842.2  on 4163  degrees of freedom
## AIC: 4846.2
## 
## Number of Fisher Scoring iterations: 4

Nhận xét:

Ta có hàm hồi quy :
\(\log \left(\frac{p_i}{1-p_i}\right) = -1.53133 + 1.69988 \times \text{bluecol}_i\)
Trong đó:

  • \(\beta_0=-1.53133\) là giá trị log-odds của việc tham gia công đoàn khi người lao động không thuộc nhóm lao động chân tay. Tức là người lao động không thuộc nhóm lao động chân tay có khoảng \[ p = \frac{e^{-1.53133}}{1 + e^{-1.53133}}\times100 \approx 17.8 \% \] khả năng tham gia công đoàn.

  • \(\beta_1=1.69988\): khi bluecolyes thay đổi từ 0 sang 1 thì giá trị log-odds của việc tham gia công đoàn tăng thêm 1.69988. Ý nghĩa là người lao động thuộc nhóm lao động chân tay có tỷ lệ chênh tham gia công đoàn cao gấp khoảng \(OR=e^{1.69988}\approx 5.48\) lần so với nhóm không làm việc lao động chân tay.

  • Dự báo

new_worker1 <- data.frame(bluecol = "no")
predict(logit_model1, newdata = new_worker1, type = "response")
##         1 
## 0.1777996

Kết quả dự báo nhận được phù hợp với kết quả đã được tính toán trước đó, nhóm lao động không làm công việc chân tay có xu hướng ít tham gia công đoàn hơn nhóm làm công việc chân tay.

3.2.5.2 Biến ind

📌 Thành phần mô hình:

  • Random component:
    \(Y \sim \text{Bernoulli}(p)\)

  • Systematic component:
    \(\eta = \beta_0 + \beta_1 \times \text{ind}\)

  • Link function:
    \(g(p) = \log\left(\frac{p}{1-p}\right)\)

📌 Phương trình mô hình:

\[ \log \left(\frac{p_i}{1-p_i}\right) = \beta_0 + \beta_1 \times \text{ind}_i \]
Trong đó:

  • \(p_i\) là xác suất người lao động thứ \(i\) tham gia công đoàn

  • \(\text{ind}_i\) là biến ngành nghề: non-industrial hoặc industrial

  • \(\beta_0\) là hệ số chặn (intercept)

  • \(\beta_1\) là hệ số ảnh hưởng của ngành nghề đến xác suất tham gia công đoàn

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

logit_model2 <- glm(union_bin ~ ind, data = d1, family = binomial(link = "logit"))
summary(logit_model2)
## 
## Call:
## glm(formula = union_bin ~ ind, family = binomial(link = "logit"), 
##     data = d1)
## 
## Coefficients:
##               Estimate Std. Error z value Pr(>|z|)    
## (Intercept)   -0.81423    0.04321 -18.845   <2e-16 ***
## indindustrial  0.61810    0.06572   9.405   <2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 5461.8  on 4164  degrees of freedom
## Residual deviance: 5373.0  on 4163  degrees of freedom
## AIC: 5377
## 
## Number of Fisher Scoring iterations: 4

Nhận xét:

Ta có hàm hồi quy :
\(\log \left(\frac{p_i}{1-p_i}\right) = -0.81423 + 0.61610 \times \text{ind}_i\)
Trong đó:

  • \(\beta_0=-0.81423\) là giá trị log-odds của việc tham gia công đoàn khi người lao động không làm việc trong ngành sản xuất. Tức là người lao động ngoài ngành sản xuất có xác suất tham gia công đoàn là khoảng \[ p = \frac{e^{-0.81423}}{1 + e^{-0.81423}}\times 100 \approx 30.7 \% \].

  • \(\beta_1=0.61810\): khi ind thay đổi từ non-industrial sang industrial thì giá trị log-odds của việc tham gia công đoàn tăng thêm 0.61810. Ý nghĩa là người lao động trong ngành sản xuất có tỷ lệ chênh tham gia công đoàn cao gấp khoảng \(OR=e^{0.61810}\approx 1.855\) lần so với những người lao động ngoài ngành sản xuất.

  • Dư báo

new_worker2 <- data.frame(ind = "non-industrial")
predict(logit_model2, newdata = new_worker2, type = "response")
##         1 
## 0.3069897

Kết quả dự báo nhận được phù hợp với kết quả đã được tính toán trước đó, với mô hình hồi quy logistic sử dụng biến ind làm biến giải thích, xác suất dự đoán để một người lao động ngoài ngành sản xuất tham gia công đoàn là khoảng 30.7%.

3.2.5.3 Biến south

📌 Thành phần mô hình:

  • Random component:
    \(Y \sim \text{Bernoulli}(p)\)

  • Systematic component:
    \(\eta = \beta_0 + \beta_1 \times \text{south}\)

  • Link function:
    \(g(p) = \log\left(\frac{p}{1-p}\right)\)

📌 Phương trình mô hình:

\[ \log \left(\frac{p_i}{1-p_i}\right) = \beta_0 + \beta_1 \times \text{south}_i \]
Trong đó:

  • \(p_i\) là xác suất người lao động thứ \(i\) tham gia công đoàn

  • \(\text{south}_i\) là biến khu vực cư trú: no hoặc yes

  • \(\beta_0\) là hệ số chặn (intercept)

  • \(\beta_1\) là hệ số ảnh hưởng của khu vực cư trú đến xác suất tham gia công đoàn

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

logit_model3 <- glm(union_bin ~ south, data = d1, family = binomial(link = "logit"))
summary(logit_model3)
## 
## Call:
## glm(formula = union_bin ~ south, family = binomial(link = "logit"), 
##     data = d1)
## 
## Coefficients:
##             Estimate Std. Error z value Pr(>|z|)    
## (Intercept) -0.34715    0.03734  -9.297   <2e-16 ***
## southyes    -0.79720    0.07687 -10.370   <2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 5461.8  on 4164  degrees of freedom
## Residual deviance: 5346.9  on 4163  degrees of freedom
## AIC: 5350.9
## 
## Number of Fisher Scoring iterations: 4

Nhận xét:

Ta có hàm hồi quy :
\(\log \left(\frac{p_i}{1-p_i}\right) = -0.34715 -0.79720 \times \text{south}_i\)
Trong đó:

  • \(\beta_0=-0.34715\) là giá trị log-odds của việc tham gia công đoàn khi người lao động không cư trú tại miền Nam Hoa Kỳ. Tức là người lao động không sống tại miền Nam có xác suất tham gia công đoàn là khoảng \[ p = \frac{e^{-0.34715}}{1 + e^{-0.34715}}\times 100 \approx 41.4 \% \].

  • \(\beta_1=-0.79720\): khi south thay đổi từ no sang yes thì giá trị log-odds của việc tham gia công đoàn giảm đi 0.79720. Ý nghĩa là người lao động không cư trú tại miền nam có tỷ lệ chênh tham gia công đoàn thấp khoảng \(OR=e^{-0.79720}\approx 0.451\) lần so với những người lao động cư trú tại miền Nam.

  • Dự báo

new_worker3 <- data.frame(south = "no")
predict(logit_model3, newdata = new_worker3, type = "response")
##         1 
## 0.4140731

Kết quả dự báo nhận được phù hợp với kết quả đã được tính toán trước đó, Mô hình hồi quy logistic dự đoán rằng một người lao động không sống ở miền Nam có xác suất tham gia công đoàn là khoảng 41.4%.

3.2.5.4 Biến married

📌 Thành phần mô hình:

  • Random component:
    \(Y \sim \text{Bernoulli}(p)\)

  • Systematic component:
    \(\eta = \beta_0 + \beta_1 \times \text{married}\)

  • Link function:
    \(g(p) = \log\left(\frac{p}{1-p}\right)\)

📌 Phương trình mô hình:

\[ \log \left(\frac{p_i}{1-p_i}\right) = \beta_0 + \beta_1 \times \text{married}_i \]
Trong đó:

  • \(p_i\) là xác suất người lao động thứ \(i\) tham gia công đoàn

  • \(\text{married}_i\) là biến tình trạng hôn nhân: no hoặc yes

  • \(\beta_0\) là hệ số chặn (intercept)

  • \(\beta_1\) là hệ số ảnh hưởng của tình trạng hôn nhân đến xác suất tham gia công đoàn.

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

logit_model4 <- glm(union_bin ~ married, data = d1, family = binomial(link = "logit"))
summary(logit_model4)
## 
## Call:
## glm(formula = union_bin ~ married, family = binomial(link = "logit"), 
##     data = d1)
## 
## Coefficients:
##             Estimate Std. Error z value Pr(>|z|)    
## (Intercept) -1.10726    0.08324 -13.301  < 2e-16 ***
## marriedyes   0.66133    0.09038   7.317 2.53e-13 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 5461.8  on 4164  degrees of freedom
## Residual deviance: 5404.4  on 4163  degrees of freedom
## AIC: 5408.4
## 
## Number of Fisher Scoring iterations: 4

Nhận xét:

Ta có hàm hồi quy :
\(\log \left(\frac{p_i}{1-p_i}\right) = -1.10726 + 0.66133 \times \text{married}_i\)
Trong đó:

  • \(\beta_0=-1.10726\) là giá trị log-odds của việc tham gia công đoàn khi người lao động chưa kết hôn. Tức là người lao động chưa kết hôn có xác suất tham gia công đoàn là khoảng \[ p = \frac{e^{-1.10726}}{1 + e^{-1.10726}}\times 100 \approx 24.8 \% \].

  • \(\beta_1=0.66133\): khi married thay đổi từ no sang yes thì giá trị log-odds của việc tham gia công đoàn tăng thêm 0.66133. Ý nghĩa là người lao động đã kết hôn có tỷ lệ chênh tham gia công đoàn cao gấp khoảng \(OR=e^{0.66133}\approx 1.937\) lần so với những người lao động chưa kết hôn.

  • Dự báo

new_worker4 <- data.frame(married = "no")
predict(logit_model4, newdata = new_worker4, type = "response")
##         1 
## 0.2483829

Kết quả dự báo nhận được phù hợp với kết quả đã được tính toán trước đó, khi người lao động chưa kết hôn, thì xác suất dự đoán họ tham gia công đoàn là khoảng 24.8%.

3.2.5.5 Biến sex

📌 Thành phần mô hình:

  • Random component:
    \(Y \sim \text{Bernoulli}(p)\)

  • Systematic component:
    \(\eta = \beta_0 + \beta_1 \times \text{sex}\)

  • Link function:
    \(g(p) = \log\left(\frac{p}{1-p}\right)\)

📌 Phương trình mô hình:

\[ \log \left(\frac{p_i}{1-p_i}\right) = \beta_0 + \beta_1 \times \text{sex}_i \]
Trong đó:

  • \(p_i\) là xác suất người lao động thứ \(i\) tham gia công đoàn

  • \(\text{sex}_i\) là biến giới tính: female hoặc male

  • \(\beta_0\) là hệ số chặn (intercept)

  • \(\beta_1\) là hệ số ảnh hưởng của giới tính đến xác suất tham gia công đoàn.

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

logit_model5 <- glm(union_bin ~ sex, data = d1, family = binomial(link = "logit"))
summary(logit_model5)
## 
## Call:
## glm(formula = union_bin ~ sex, family = binomial(link = "logit"), 
##     data = d1)
## 
## Coefficients:
##             Estimate Std. Error z value Pr(>|z|)    
## (Intercept)  -1.3184     0.1132 -11.651  < 2e-16 ***
## sexmale       0.8432     0.1181   7.139 9.37e-13 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 5461.8  on 4164  degrees of freedom
## Residual deviance: 5404.3  on 4163  degrees of freedom
## AIC: 5408.3
## 
## Number of Fisher Scoring iterations: 4

Nhận xét:

Ta có hàm hồi quy :
\(\log \left(\frac{p_i}{1-p_i}\right) = -1.3184 + 0.8432 \times \text{sex}_i\)
Trong đó:

  • \(\beta_0=-1.3184\) là giá trị log-odds của việc tham gia công đoàn khi người lao động là nữ. Tức là người lao động nữ có xác suất tham gia công đoàn là khoảng \[ p = \frac{e^{-1.3184}}{1 + e^{-1.3184}}\times 100 \approx 21.1 \% \].

  • \(\beta_1=0.8432\): khi sex thay đổi từ female sang male thì giá trị log-odds của việc tham gia công đoàn tăng thêm 0.8432. Ý nghĩa là người lao động nam có tỷ lệ chênh tham gia công đoàn cao gấp khoảng \(OR=e^{0.8432}\approx 2.32\) lần so với những người lao động nữ.

  • Dự báo

new_worker5 <- data.frame(sex = "female")
predict(logit_model5, newdata = new_worker5, type = "response")
##         1 
## 0.2110874

Kết quả dự báo nhận được phù hợp với kết quả đã được tính toán trước đó, mô hình dự đoán rằng một người lao động nữ có xác suất tham gia công đoàn là khoảng 21.1%.

3.2.5.6 Biến black

📌 Thành phần mô hình:

  • Random component:
    \(Y \sim \text{Bernoulli}(p)\)

  • Systematic component:
    \(\eta = \beta_0 + \beta_1 \times \text{black}\)

  • Link function:
    \(g(p) = \log\left(\frac{p}{1-p}\right)\)

📌 Phương trình mô hình:

\[ \log \left(\frac{p_i}{1-p_i}\right) = \beta_0 + \beta_1 \times \text{black}_i \]
Trong đó:

  • \(p_i\) là xác suất người lao động thứ \(i\) tham gia công đoàn

  • \(\text{black}_i\) là biến chủng tộc: no hoặc yes

  • \(\beta_0\) là hệ số chặn (intercept)

  • \(\beta_1\) là hệ số ảnh hưởng của chủng tộc đến xác suất tham gia công đoàn

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

logit_model6 <- glm(union_bin ~ black, data = d1, family = binomial(link = "logit"))
summary(logit_model6)
## 
## Call:
## glm(formula = union_bin ~ black, family = binomial(link = "logit"), 
##     data = d1)
## 
## Coefficients:
##             Estimate Std. Error z value Pr(>|z|)    
## (Intercept) -0.58553    0.03356 -17.446  < 2e-16 ***
## blackyes     0.36538    0.12074   3.026  0.00248 ** 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 5461.8  on 4164  degrees of freedom
## Residual deviance: 5452.8  on 4163  degrees of freedom
## AIC: 5456.8
## 
## Number of Fisher Scoring iterations: 4

Nhận xét:

Ta có hàm hồi quy :
\(\log \left(\frac{p_i}{1-p_i}\right) = -0.58553 + 0.36538 \times \text{black}_i\)
Trong đó:

  • \(\beta_0=-0.58553\) là giá trị log-odds của việc tham gia công đoàn khi người lao động không phải người da đen. Tức là người lao động không phải người da đen có xác suất tham gia công đoàn là khoảng \[ p = \frac{e^{-0.58553}}{1 + e^{-0.58553}}\times 100 \approx 35.8 \% \].

  • \(\beta_1=0.36538\): khi black thay đổi từ no sang yes thì giá trị log-odds của việc tham gia công đoàn tăng thêm 0.36538. Ý nghĩa là người lao động da đen có tỷ lệ chênh tham gia công đoàn cao gấp khoảng \(OR=e^{0.36538}\approx 1.44\) lần so với những người lao động không phải da đen.

  • Dự báo

new_worker6 <- data.frame(black = "no")
predict(logit_model6, newdata = new_worker6, type = "response")
##         1 
## 0.3576605

Kết quả dự báo nhận được phù hợp với kết quả đã được tính toán trước đó, một người lao động không phải là người da đen có xác suất tham gia công đoàn khoảng 35.8%.

3.2.6 Mô hình hồi quy probit

3.2.6.1 Biến bluecol

📌 Thành phần mô hình:

  • Random component:
    \(Y \sim \text{Bernoulli}(p)\)

  • Systematic component:
    \(\eta = \beta_0 + \beta_1 \times \text{bluecol}\)

  • Link function:
    \(g(p) = \Phi^{-1}(p)\)

📌 Phương trình mô hình:

\[ \Phi^{-1}(p_i) = \beta_0 + \beta_1 \times \text{bluecol}_i \]
Trong đó:

  • \(\Phi^{-1}\) là hàm phân phối tích lũy chuẩn nghịch đảo (inverse CDF)

  • Các ký hiệu khác như mô hình Logistic (áp dụng cho trường hợp này là mô hình Probit, với \(p_i\) là xác suất người lao động thứ \(i\) tham gia công đoàn, \(\text{bluecol}_i\) là biến loại lao động, \(\beta_0\) là hệ số chặn và \(\beta_1\) là hệ số ảnh hưởng của loại lao động).

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

probit_model1 <- glm(union_bin ~ bluecol, data = d1, family = binomial(link = "probit"))
summary(probit_model1)
## 
## Call:
## glm(formula = union_bin ~ bluecol, family = binomial(link = "probit"), 
##     data = d1)
## 
## Coefficients:
##             Estimate Std. Error z value Pr(>|z|)    
## (Intercept) -0.92378    0.03254  -28.39   <2e-16 ***
## bluecolyes   1.02935    0.04242   24.26   <2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 5461.8  on 4164  degrees of freedom
## Residual deviance: 4842.2  on 4163  degrees of freedom
## AIC: 4846.2
## 
## Number of Fisher Scoring iterations: 3

Phương trình hồi quy probit:
\[ \Phi^{-1}(p_i) = -0.92378 + 1.02935 \times \text{bluecol}_i \] Nhận xét:
Với người không làm việc trong nhóm lao động chân tay thì giá trị kỳ vọng của biến ẩn trong mô hình là –0.92378. Xác suất thực tế tham gia công đoàn: \[ \text{Pr}(\text{union} = 1 \ | \ \text{bluecol} = \text{"no"}) = \Phi(-0.92378) \approx 0.1779 \], tức khoảng 17.8% khả năng tham gia công đoàn nếu người lao động không thuộc nhóm ngành lao động chân tay.

  • \(\beta_1=1.02935\): đại diện cho khuynh hướng tham gia công đoàn, khi người lao động làm việc trong nhóm lao động chân tay so với nhóm không làm việc chân tay. Cho thấy rằng nếu một người làm việc trong ngành lao động chân tay, thì giá trị ngưỡng tăng thêm khoảng 1.03, từ đó làm tăng xác suất tham gia công đoàn.

  • Dự báo:

Dự báo với typr = response

new_worker11 <- data.frame(bluecol = "no")
predict(probit_model1, newdata = new_worker11, type = "response")
##         1 
## 0.1777996

Nếu một người không làm việc trong ngành lao động chân tay, thì xác suất họ tham gia công đoàn theo ước lượng từ mô hình probit là khoảng 17.78%.

3.2.6.2 Biến ind

Thành phần mô hình:

  • Random component:
    \(Y \sim \text{Bernoulli}(p)\)

  • Systematic component:
    \(\eta = \beta_0 + \beta_1 \times \text{ind}\)

  • Link function:
    \(g(p) = \Phi^{-1}(p)\)

📌 Phương trình mô hình:

\[ \Phi^{-1}(p_i) = \beta_0 + \beta_1 \times \text{ind}_i \]
Trong đó:

  • \(\Phi^{-1}\) là hàm phân phối tích lũy chuẩn nghịch đảo (inverse CDF)

  • Các ký hiệu khác như mô hình Logistic (áp dụng cho trường hợp này là mô hình Probit, với \(p_i\) là xác suất người lao động thứ \(i\) tham gia công đoàn, \(\text{ind}_i\) là biến ngành nghề, \(\beta_0\) là hệ số chặn và \(\beta_1\) là hệ số ảnh hưởng của ngành nghề).

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

probit_model2 <- glm(union_bin ~ ind, data = d1, family = binomial(link = "probit"))
summary(probit_model2)
## 
## Call:
## glm(formula = union_bin ~ ind, family = binomial(link = "probit"), 
##     data = d1)
## 
## Coefficients:
##               Estimate Std. Error z value Pr(>|z|)    
## (Intercept)   -0.50440    0.02617 -19.277   <2e-16 ***
## indindustrial  0.38158    0.04054   9.412   <2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 5461.8  on 4164  degrees of freedom
## Residual deviance: 5373.0  on 4163  degrees of freedom
## AIC: 5377
## 
## Number of Fisher Scoring iterations: 4

Phương trình hồi quy probit:
\[ \Phi^{-1}(p_i) = -0.50440 + 0.38158 \times \text{ind}_i \] Nhận xét:
Với người không làm việc trong ngành công nghiệp thì giá trị kỳ vọng của biến ẩn trong mô hình là –0.50440. Xác suất thực tế tham gia công đoàn: \[ \text{Pr}(\text{union} = 1 \ | \ \text{ind} = \text{"non-industrial"}) = \Phi(-0.50440) \approx 0.307 \], tức khoảng 30.7% khả năng tham gia công đoàn đối với người lao động không làm trong ngành công nghiệp.

  • \(\beta_1=0.38158\): đại diện cho sự thay đổi trong giá trị biến ẩn khi người lao động làm việc trong ngành công nghiệp so với người không làm trong ngành này. Cụ thể, nếu một người làm trong ngành công nghiệp, giá trị ngưỡng latent tăng thêm khoảng 0.38 đơn vị, từ đó làm tăng xác suất tham gia công đoàn.

  • Dự báo:

Dự báo với typr = response

new_worker12 <- data.frame(ind = "non-industrial")
predict(probit_model2, newdata = new_worker12, type = "response")
##         1 
## 0.3069897

Với người lao động không làm trong ngành công nghiệp, mô hình probit ước tính xác suất tham gia công đoàn là khoảng 30.7%.

3.2.6.3 Biến south

📌 Thành phần mô hình:

  • Random component:
    \(Y \sim \text{Bernoulli}(p)\)

  • Systematic component:
    \(\eta = \beta_0 + \beta_1 \times \text{south}\)

  • Link function:
    \(g(p) = \Phi^{-1}(p)\)

📌 Phương trình mô hình:

\[ \Phi^{-1}(p_i) = \beta_0 + \beta_1 \times \text{south}_i \] Trong đó:

  • \(\Phi^{-1}\) là hàm phân phối tích lũy chuẩn nghịch đảo (inverse CDF)

  • Các ký hiệu khác như mô hình Logistic (áp dụng cho trường hợp này là mô hình Probit, với \(p_i\) là xác suất người lao động thứ \(i\) tham gia công đoàn, \(\text{south}_i\) là biến khu vực cư trú, \(\beta_0\) là hệ số chặn và \(\beta_1\) là hệ số ảnh hưởng của khu vực cư trú).

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

probit_model3 <- glm(union_bin ~ south, data = d1, family = binomial(link = "probit"))
summary(probit_model3)
## 
## Call:
## glm(formula = union_bin ~ south, family = binomial(link = "probit"), 
##     data = d1)
## 
## Coefficients:
##             Estimate Std. Error z value Pr(>|z|)    
## (Intercept) -0.21708    0.02325  -9.337   <2e-16 ***
## southyes    -0.48434    0.04580 -10.575   <2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 5461.8  on 4164  degrees of freedom
## Residual deviance: 5346.9  on 4163  degrees of freedom
## AIC: 5350.9
## 
## Number of Fisher Scoring iterations: 4

Phương trình hồi quy probit:
\[ \Phi^{-1}(p_i) = -0.21708 - 0.48434 \times \text{south}_i \] Nhận xét:
Với người không cư trú tại miền Nam thì giá trị kỳ vọng của biến ẩn trong mô hình là –0.21708. Xác suất thực tế tham gia công đoàn: \[ \text{Pr}(\text{union} = 1 \ | \ \text{south} = \text{"no"}) = \Phi(-0.21708) \approx 0.414 \], tức khoảng 41.4% khả năng tham gia công đoàn đối với người lao động không cư trú tại miền Nam.

  • \(\beta_1=0.48434\): đại diện cho sự thay đổi trong giá trị biến ẩn khi người lao động cư trú ở miền Nam so với người không sống ở miền Nam. Cụ thể, nếu một người sống ở miền Nam, giá trị ngưỡng latent sẽ giảm đi khoảng 0.48 đơn vị, từ đó làm giảm xác suất tham gia công đoàn..

  • Dự báo:

Dự báo với typr = response

new_worker13 <- data.frame(south = "no")
predict(probit_model3, newdata = new_worker13, type = "response")
##         1 
## 0.4140731

Với người lao động không sống ở miền Nam, mô hình probit ước tính xác suất tham gia công đoàn là khoảng 41.4%.

3.2.6.4 Biến married

📌 Thành phần mô hình:

  • Random component:
    \(Y \sim \text{Bernoulli}(p)\)

  • Systematic component:
    \(\eta = \beta_0 + \beta_1 \times \text{married}\)

  • Link function:
    \(g(p) = \Phi^{-1}(p)\)

📌 Phương trình mô hình:

\[ \Phi^{-1}(p_i) = \beta_0 + \beta_1 \times \text{married}_i \]
Trong đó:

  • \(\Phi^{-1}\) là hàm phân phối tích lũy chuẩn nghịch đảo (inverse CDF)

  • Các ký hiệu khác như mô hình Logistic (áp dụng cho trường hợp này là mô hình Probit, với \(p_i\) là xác suất người lao động thứ \(i\) tham gia công đoàn, \(\text{married}_i\) là biến tình trạng hôn nhân, \(\beta_0\) là hệ số chặn và \(\beta_1\) là hệ số ảnh hưởng của tình trạng hôn nhân).

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

probit_model4 <- glm(union_bin ~ married, data = d1, family = binomial(link = "probit"))
summary(probit_model4)
## 
## Call:
## glm(formula = union_bin ~ married, family = binomial(link = "probit"), 
##     data = d1)
## 
## Coefficients:
##             Estimate Std. Error z value Pr(>|z|)    
## (Intercept) -0.67959    0.04907 -13.848  < 2e-16 ***
## marriedyes   0.40113    0.05371   7.469  8.1e-14 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 5461.8  on 4164  degrees of freedom
## Residual deviance: 5404.4  on 4163  degrees of freedom
## AIC: 5408.4
## 
## Number of Fisher Scoring iterations: 4

Phương trình hồi quy probit:
\[ \Phi^{-1}(p_i) = -0.67959 + 0.40113 \times \text{married}_i \] Nhận xét:
Với người chưa kết hôn thì giá trị kỳ vọng của biến ẩn trong mô hình là –0.67959. Xác suất thực tế tham gia công đoàn: \[ \text{Pr}(\text{union} = 1 \ | \ \text{married} = \text{"no"}) = \Phi(-0.67959) \approx 0.248 \], tức khoảng 24.8% khả năng tham gia công đoàn đối với người lao động chưa kết hôn.

  • \(\beta_1=0.40113\): đại diện cho sự thay đổi trong giá trị biến ẩn khi người lao động đã kết hôn so với người chưa kết hôn. Cụ thể, nếu một người đã kết hôn, giá trị ngưỡng latent sẽ tăng thêm khoảng 0.40 đơn vị, từ đó làm tăng xác suất tham gia công đoàn.

  • Dự báo:

Dự báo với typr = response

new_worker14 <- data.frame(married = "no")
predict(probit_model4, newdata = new_worker14, type = "response")
##         1 
## 0.2483829

Với người lao động chưa kết hôn, thì mô hình probit ước tính xác suất tham gia công đoàn là khoảng 24.8%.

3.2.6.5 Biến sex

📌 Thành phần mô hình:

  • Random component:
    \(Y \sim \text{Bernoulli}(p)\)

  • Systematic component:
    \(\eta = \beta_0 + \beta_1 \times \text{sex}\)

  • Link function:
    \(g(p) = \Phi^{-1}(p)\)

📌 Phương trình mô hình:

\[ \Phi^{-1}(p_i) = \beta_0 + \beta_1 \times \text{sex}_i \]
Trong đó:

  • \(\Phi^{-1}\) là hàm phân phối tích lũy chuẩn nghịch đảo (inverse CDF)

  • Các ký hiệu khác như mô hình Logistic (áp dụng cho trường hợp này là mô hình Probit, với \(p_i\) là xác suất người lao động thứ \(i\) tham gia công đoàn, \(\text{sex}_i\) là biến giới tính, \(\beta_0\) là hệ số chặn và \(\beta_1\) là hệ số ảnh hưởng của giới tính).

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

probit_model5 <- glm(union_bin ~ sex, data = d1, family = binomial(link = "probit"))
summary(probit_model5)
## 
## Call:
## glm(formula = union_bin ~ sex, family = binomial(link = "probit"), 
##     data = d1)
## 
## Coefficients:
##             Estimate Std. Error z value Pr(>|z|)    
## (Intercept) -0.80265    0.06518 -12.313  < 2e-16 ***
## sexmale      0.50606    0.06847   7.391 1.46e-13 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 5461.8  on 4164  degrees of freedom
## Residual deviance: 5404.3  on 4163  degrees of freedom
## AIC: 5408.3
## 
## Number of Fisher Scoring iterations: 4

Phương trình hồi quy probit:
\[ \Phi^{-1}(p_i) = -0.80265 + 0.50606 \times \text{sex}_i \] Nhận xét:

Với người lao động là nữ thì giá trị kỳ vọng của biến ẩn trong mô hình là –0.80265. Xác suất thực tế tham gia công đoàn: \[ \text{Pr}(\text{union} = 1 \ | \ \text{sex} = \text{"female"}) = \Phi(-0.80265) \approx 0.211 \], tức khoảng 21.1% khả năng tham gia công đoàn nếu người lao động là nữ.

  • \(\beta_1=0.50606\): đại diện cho sự thay đổi trong giá trị latent khi người lao động là nam so với nữ. Cụ thể, nếu một người lao động là nam thì giá trị ẩn tăng thêm khoảng 0.51 đơn vị, từ đó làm tăng xác suất tham gia công đoàn.

  • Dự báo:

Dự báo với typr = response

new_worker15 <- data.frame(sex = "female")
predict(probit_model5, newdata = new_worker15, type = "response")
##         1 
## 0.2110874

Nếu một người lao động là nữ, thì xác suất họ tham gia công đoàn theo ước lượng từ mô hình probit là khoảng 21.1%.

3.2.6.6 Biến black

📌 Thành phần mô hình:

  • Random component:
    \(Y \sim \text{Bernoulli}(p)\)

  • Systematic component:
    \(\eta = \beta_0 + \beta_1 \times \text{black}\)

  • Link function:
    \(g(p) = \Phi^{-1}(p)\)

📌 Phương trình mô hình:

\[ \Phi^{-1}(p_i) = \beta_0 + \beta_1 \times \text{black}_i \]

Trong đó:

  • \(\Phi^{-1}\) là hàm phân phối tích lũy chuẩn nghịch đảo (inverse CDF)

  • Các ký hiệu khác như mô hình Logistic (áp dụng cho trường hợp này là mô hình Probit, với \(p_i\) là xác suất người lao động thứ \(i\) tham gia công đoàn, \(\text{black}_i\) là biến chủng tộc, \(\beta_0\) là hệ số chặn và \(\beta_1\) là hệ số ảnh hưởng của chủng tộc).

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

probit_model6 <- glm(union_bin ~ black, data = d1, family = binomial(link = "probit"))
summary(probit_model6)
## 
## Call:
## glm(formula = union_bin ~ black, family = binomial(link = "probit"), 
##     data = d1)
## 
## Coefficients:
##             Estimate Std. Error z value Pr(>|z|)    
## (Intercept) -0.36472    0.02066  -17.66  < 2e-16 ***
## blackyes     0.22688    0.07538    3.01  0.00261 ** 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 5461.8  on 4164  degrees of freedom
## Residual deviance: 5452.8  on 4163  degrees of freedom
## AIC: 5456.8
## 
## Number of Fisher Scoring iterations: 4

Phương trình hồi quy probit:
\[ \Phi^{-1}(p_i) = -0.36472 + 0.22688 \times \text{black}_i \] Nhận xét:

Với người không phải là người da đen thì giá trị kỳ vọng của biến ẩn trong mô hình là –0.36472. Xác suất thực tế tham gia công đoàn: \[ \text{Pr}(\text{union} = 1 \ | \ \text{black} = \text{"no"}) = \Phi(-0.36472) \approx 0.3578 \], tức khoảng 35.78% khả năng tham gia công đoàn nếu người lao động không phải người da đen.

  • \(\beta_1=1.022688\): đại diện cho khuynh hướng tham gia công đoàn khi người lao động là người da đen so với người không phải da đen. Cho thấy rằng nếu một người là người da đen, thì giá trị ngưỡng tăng thêm khoảng 0.227, từ đó làm tăng xác suất tham gia công đoàn.

  • Dự báo:

Dự báo với typr = response

new_worker16 <- data.frame(black = "no")
predict(probit_model6, newdata = new_worker16, type = "response")
##         1 
## 0.3576605

Nếu một người không phải là người da đen, thì xác suất họ tham gia công đoàn theo ước lượng từ mô hình probit là khoảng 35.8%.

3.2.7 Mô hình Cloglog

3.2.7.1 Biến bluecol

📌 Thành phần mô hình:

  • Random component:
    \(Y \sim \text{Bernoulli}(p)\)

  • Systematic component:
    \(\eta = \beta_0 + \beta_1 \times \text{bluecol}\)

  • Link function:
    \(g(p) = \log(-\log(1-p))\)

📌 Phương trình mô hình:

\[ \log \left( -\log(1-p_i) \right) = \beta_0 + \beta_1 \times \text{bluecol}_i \]

  • Ước lượng mô hình:
cloglog_model21 <- glm(union_bin ~ bluecol, data = d1, family = binomial(link = "cloglog"))
summary(cloglog_model21)
## 
## Call:
## glm(formula = union_bin ~ bluecol, family = binomial(link = "cloglog"), 
##     data = d1)
## 
## Coefficients:
##             Estimate Std. Error z value Pr(>|z|)    
## (Intercept) -1.63081    0.05264  -30.98   <2e-16 ***
## bluecolyes   1.38359    0.06069   22.80   <2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 5461.8  on 4164  degrees of freedom
## Residual deviance: 4842.2  on 4163  degrees of freedom
## AIC: 4846.2
## 
## Number of Fisher Scoring iterations: 5

\[ \log \left( -\log(1-p_i) \right) = -1.63081 + 1.38359 \times \text{bluecol}_i \] Nhận xét:

  • Với người không làm việc trong nhóm lao động chân tay giá trị kỳ vọng của biến ẩn theo mô hình cloglog là -1.63081. Do đó, xác suất tham gia công đoàn được tính bằng: \[ \text{Pr}(\text{union} = 1 \ | \ \text{bluecol} = \text{"no"}) = 1 - \exp(-\exp(-1.63081)) \approx 0.1694 \], tức khoảng 16.9% khả năng tham gia công đoàn với người không làm việc chân tay.

  • \(\beta=1.38359\): cho biết mức thay đổi của giá trị log(-log(1 - p)) khi người lao động làm việc trong nhóm lao động chân tay so với người không làm. Khi đó, giá trị ngưỡng tăng thêm khoảng 1.38, làm tăng đáng kể xác suất tham gia công đoàn. Nói cách khác, người làm việc chân tay có xu hướng tham gia công đoàn cao hơn đáng kể so với người không làm việc chân tay.

  • Dự báo:

new_worker21 <- data.frame(bluecol = "no")
predict(cloglog_model21, newdata = new_worker21, type = "response")
##         1 
## 0.1777996

Nếu người lao động không thuộc nhóm lao động chân tay thì khả năng tham gia công đoàn là 17.8%.

3.2.7.2 Biến ind

📌 Thành phần mô hình:

  • Random component:
    \(Y \sim \text{Bernoulli}(p)\)

  • Systematic component:
    \(\eta = \beta_0 + \beta_1 \times \text{ind}\)

  • Link function:
    \(g(p) = \log(-\log(1-p))\)

📌 Phương trình mô hình:

\[ \log \left( -\log(1-p_i) \right) = \beta_0 + \beta_1 \times \text{ind}_i \]

  • Ước lượng mô hình:
cloglog_model22 <- glm(union_bin ~ ind, data = d1, family = binomial(link = "cloglog"))
summary(cloglog_model22)
## 
## Call:
## glm(formula = union_bin ~ ind, family = binomial(link = "cloglog"), 
##     data = d1)
## 
## Coefficients:
##               Estimate Std. Error z value Pr(>|z|)    
## (Intercept)   -1.00318    0.03617  -27.74   <2e-16 ***
## indindustrial  0.49216    0.05191    9.48   <2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 5461.8  on 4164  degrees of freedom
## Residual deviance: 5373.0  on 4163  degrees of freedom
## AIC: 5377
## 
## Number of Fisher Scoring iterations: 5

\[ \log \left( -\log(1-p_i) \right) = -1.00318 + 0.49216 \times \text{ind}_i \] Nhận xét:

  • Với người không làm việc trong ngành công nghiệp, giá trị kỳ vọng của biến ẩn theo mô hình cloglog là −1.00318. Do đó, xác suất tham gia công đoàn được tính bằng: \[ \text{Pr}(\text{union} = 1 \ | \ \text{ind} = \text{"non-industrial"}) = 1 - \exp(-\exp(−1.00318)) \approx 0.264 \], tức khoảng 26.4% khả năng tham gia công đoàn đối với người lao động không làm trong ngành công nghiệp.

  • \(\beta=0.49216\): đại diện cho mức thay đổi ngưỡng tham gia công đoàn khi người lao động làm việc trong ngành công nghiệp so với nhóm không làm trong ngành công nghiệp. Giá trị dương của hệ số này cho thấy nếu người lao động thuộc ngành công nghiệp, thì giá trị hàm liên kết tăng thêm khoảng 0.49, từ đó làm tăng xác suất tham gia công đoàn.

  • Dự báo:

new_worker22 <- data.frame(ind = "non-industrial")
predict(cloglog_model22, newdata = new_worker22, type = "response")
##         1 
## 0.3069897

Nếu người lao động không thuộc nhóm ngành sản xuất thì khả năng tham gia công đoàn là 30.7%.
#### Biến south 📌 Thành phần mô hình:

  • Random component:
    \(Y \sim \text{Bernoulli}(p)\)

  • Systematic component:
    \(\eta = \beta_0 + \beta_1 \times \text{south}\)

  • Link function:
    \(g(p) = \log(-\log(1-p))\)

📌 Phương trình mô hình:

\[ \log \left( -\log(1-p_i) \right) = \beta_0 + \beta_1 \times \text{south}_i \]

  • Ước lượng mô hình:
cloglog_model23 <- glm(union_bin ~ south, data = d1, family = binomial(link = "cloglog"))
summary(cloglog_model23)
## 
## Call:
## glm(formula = union_bin ~ south, family = binomial(link = "cloglog"), 
##     data = d1)
## 
## Coefficients:
##             Estimate Std. Error z value Pr(>|z|)    
## (Intercept) -0.62631    0.02892  -21.65   <2e-16 ***
## southyes    -0.65945    0.06545  -10.08   <2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 5461.8  on 4164  degrees of freedom
## Residual deviance: 5346.9  on 4163  degrees of freedom
## AIC: 5350.9
## 
## Number of Fisher Scoring iterations: 5

\[ \log \left( -\log(1-p_i) \right) = −0.62631 + −0.65945 \times \text{south}_i \] Nhận xét:

  • Với người không sống ở miền Nam , giá trị kỳ vọng của biến ẩn theo mô hình cloglog là − 0.62631 −0.62631. Do đó, xác suất tham gia công đoàn được tính bằng: \[ \text{Pr}(\text{union} = 1 \ | \ \text{south} = \text{"no"}) = 1 - \exp(-\exp(− 0.62631 −0.62631)) \approx 0.356 \], tức khoảng 35.6% khả năng tham gia công đoàn nếu người lao động không sống ở miền Nam.

  • \(\beta=−0.65945\): biểu thị sự thay đổi trong giá trị ngưỡng khi người lao động sống ở miền Nam so với người không sống ở miền Nam. Giá trị âm của hệ số này cho thấy người sống ở miền Nam có xu hướng có xác suất tham gia công đoàn thấp hơn, vì giá trị hàm liên kết giảm, dẫn đến xác suất tham gia giảm.

  • Dự báo:

new_worker23 <- data.frame(south = "no")
predict(cloglog_model23, newdata = new_worker23, type = "response")
##         1 
## 0.4140731

Nếu người lao động không cư trú tại miền Nam thì khả năng tham gia công đoàn là 41.4%.

3.2.7.3 Biến married

📌 Thành phần mô hình:

  • Random component:
    \(Y \sim \text{Bernoulli}(p)\)

  • Systematic component:
    \(\eta = \beta_0 + \beta_1 \times \text{married}\)

  • Link function:
    \(g(p) = \log(-\log(1-p))\)

📌 Phương trình mô hình:

\[ \log \left( -\log(1-p_i) \right) = \beta_0 + \beta_1 \times \text{married}_i \]

  • Ước lượng mô hình:
cloglog_model24 <- glm(union_bin ~ married, data = d1, family = binomial(link = "cloglog"))
summary(cloglog_model24)
## 
## Call:
## glm(formula = union_bin ~ married, family = binomial(link = "cloglog"), 
##     data = d1)
## 
## Coefficients:
##             Estimate Std. Error z value Pr(>|z|)    
## (Intercept) -1.25341    0.07241  -17.31  < 2e-16 ***
## marriedyes   0.54989    0.07755    7.09 1.34e-12 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 5461.8  on 4164  degrees of freedom
## Residual deviance: 5404.4  on 4163  degrees of freedom
## AIC: 5408.4
## 
## Number of Fisher Scoring iterations: 5

\[ \log \left( -\log(1-p_i) \right) = −1.25341 + 0.54989 \times \text{married}_i \] Nhận xét:

  • Với người chưa kết hôn, giá trị kỳ vọng của biến ẩn theo mô hình cloglog là −1.25341. Do đó, xác suất tham gia công đoàn được tính bằng: \[ \text{Pr}(\text{union} = 1 \ | \ \text{marriedl} = \text{"no"}) = 1 - \exp(-\exp(−1.25341)) \approx 0.213 \], tức khoảng 21.3% khả năng tham gia công đoàn nếu người lao động chưa kết hôn.

  • \(\beta=0.54989\): biểu thị mức thay đổi trong giá trị ngưỡng tham gia công đoàn khi người lao động đã kết hôn so với người chưa kết hôn. Hệ số dương này cho thấy người đã kết hôn có xu hướng có xác suất tham gia công đoàn cao hơn, nhờ giá trị hàm liên kết tăng lên làm xác suất tiến gần đến 1 hơn.

  • Dự báo:

new_worker24 <- data.frame(married = "no")
predict(cloglog_model24, newdata = new_worker24, type = "response")
##         1 
## 0.2483829

Nếu người lao động chưa kết hôn thì khả năng tham gia công đoàn là 24.8%.

3.2.7.4 Biến sex

📌 Thành phần mô hình:

  • Random component:
    \(Y \sim \text{Bernoulli}(p)\)

  • Systematic component:
    \(\eta = \beta_0 + \beta_1 \times \text{sex}\)

  • Link function:
    \(g(p) = \log(-\log(1-p))\)

📌 Phương trình mô hình:

\[ \log \left( -\log(1-p_i) \right) = \beta_0 + \beta_1 \times \text{sex}_i \]

  • Ước lượng mô hình:
cloglog_model25 <- glm(union_bin ~ sex, data = d1, family = binomial(link = "cloglog"))
summary(cloglog_model25)
## 
## Call:
## glm(formula = union_bin ~ sex, family = binomial(link = "cloglog"), 
##     data = d1)
## 
## Coefficients:
##             Estimate Std. Error z value Pr(>|z|)    
## (Intercept)  -1.4393     0.1007 -14.287  < 2e-16 ***
## sexmale       0.7126     0.1042   6.836 8.17e-12 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 5461.8  on 4164  degrees of freedom
## Residual deviance: 5404.3  on 4163  degrees of freedom
## AIC: 5408.3
## 
## Number of Fisher Scoring iterations: 5

\[ \log \left( -\log(1-p_i) \right) = −1.4393 + 0.7126 \times \text{sex}_i \] Nhận xét:

  • Với nữ giới, giá trị kỳ vọng của biến ẩn theo mô hình cloglog là −1.4393. Do đó, xác suất tham gia công đoàn được tính bằng: \[ \text{Pr}(\text{union} = 1 \ | \ \text{sex} = \text{"female"}) = 1 - \exp(-\exp(−1.4393)) \approx 0.18 \], tức khoảng 18% khả năng tham gia công đoàn nếu người lao động là nữ.

  • \(\beta=0.7126\): biểu thị sự thay đổi giá trị ngưỡng khi người lao động là nam giới so với nữ giới. Hệ số dương này cho thấy nam giới có xu hướng có xác suất tham gia công đoàn cao hơn đáng kể so với nữ giới, do giá trị hàm liên kết tăng lên kéo xác suất tiến gần đến 1 hơn..

  • Dự báo:

new_worker25 <- data.frame(sex = "female")
predict(cloglog_model25, newdata = new_worker25, type = "response")
##         1 
## 0.2110874

Nếu người lao động là nữ giới thì khả năng tham gia công đoàn là 21.1%.

3.2.7.5 Biến black

📌 Thành phần mô hình:

  • Random component:
    \(Y \sim \text{Bernoulli}(p)\)

  • Systematic component:
    \(\eta = \beta_0 + \beta_1 \times \text{black}\)

  • Link function:
    \(g(p) = \log(-\log(1-p))\)

📌 Phương trình mô hình:

\[ \log \left( -\log(1-p_i) \right) = \beta_0 + \beta_1 \times \text{black}_i \]

  • Ước lượng mô hình:
cloglog_model26 <- glm(union_bin ~ black, data = d1, family = binomial(link = "cloglog"))
summary(cloglog_model26)
## 
## Call:
## glm(formula = union_bin ~ black, family = binomial(link = "cloglog"), 
##     data = d1)
## 
## Coefficients:
##             Estimate Std. Error z value Pr(>|z|)    
## (Intercept) -0.81500    0.02712 -30.052  < 2e-16 ***
## blackyes     0.28587    0.09174   3.116  0.00183 ** 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 5461.8  on 4164  degrees of freedom
## Residual deviance: 5452.8  on 4163  degrees of freedom
## AIC: 5456.8
## 
## Number of Fisher Scoring iterations: 5

\[ \log \left( -\log(1-p_i) \right) = −0.81500 + 0.28587 \times \text{black}_i \]

Nhận xét:

  • Với người không phải là người da đen, giá trị kỳ vọng của biến ẩn theo mô hình cloglog là −0.81500. Do đó, xác suất tham gia công đoàn được tính bằng: \[ \text{Pr}(\text{union} = 1 \ | \ \text{black} = \text{"no"}) = 1 - \exp(-\exp(−0.81500)) \approx 0.306 \], tức khoảng 30.6% khả năng tham gia công đoàn nếu người lao động không phải là người da đen.

  • \(\beta=0.28587\): biểu thị sự thay đổi giá trị ngưỡng khi người lao động là người da đen so với không phải. Hệ số dương này cho thấy người lao động là người da đen có xu hướng có xác suất tham gia công đoàn cao hơn, do giá trị hàm liên kết tăng lên kéo xác suất tiến gần đến 1 hơn.

  • Dự báo:

new_worker26 <- data.frame(black = "no")
predict(cloglog_model26, newdata = new_worker26, type = "response")
##         1 
## 0.3576605

Nếu người lao động không phải là người da đen thì khả năng tham gia công đoàn là 35.7%.

3.2.8 Mô hình hồi quy bội

3.2.8.1 Mô hình Logit

logit_model31 <- glm(union_bin ~ bluecol + ind + south + married + sex + black, data = d1, family = binomial(link = "logit"))
summary(logit_model31)
## 
## Call:
## glm(formula = union_bin ~ bluecol + ind + south + married + sex + 
##     black, family = binomial(link = "logit"), data = d1)
## 
## Coefficients:
##               Estimate Std. Error z value Pr(>|z|)    
## (Intercept)   -2.13582    0.14147 -15.097  < 2e-16 ***
## bluecolyes     1.73416    0.07666  22.622  < 2e-16 ***
## indindustrial  0.19094    0.07403   2.579 0.009898 ** 
## southyes      -1.04577    0.08532 -12.257  < 2e-16 ***
## marriedyes     0.46988    0.13967   3.364 0.000768 ***
## sexmale        0.37611    0.18285   2.057 0.039696 *  
## blackyes       0.66653    0.14144   4.712 2.45e-06 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 5461.8  on 4164  degrees of freedom
## Residual deviance: 4614.3  on 4158  degrees of freedom
## AIC: 4628.3
## 
## Number of Fisher Scoring iterations: 4

Phương trình hồi quy:
\[ \log\left(\frac{P(\text{union}=1)}{1-P(\text{union}=1)}\right) = -2.136 + 1.734 \cdot \text{bluecolyes} + 0.191 \cdot \text{indindustrial} - 1.046 \cdot \text{southyes} + 0.470 \cdot \text{marriedyes} + 0.376 \cdot \text{sexmale} + 0.667 \cdot \text{blackyes} \]
Intercept (-2.136): Đây là logit của xác suất tham gia công đoàn khi tất cả các biến độc lập bằng 0 (người không lao động chân tay, không làm ngành công nghiệp, không sống ở miền Nam, chưa kết hôn, là nữ, và không phải người da đen).

bluecolyes = 1.734 (p < 0.001): Người lao động chân tay (blue-collar) có log odds tham gia công đoàn cao hơn người không chân tay là 1.734 đơn vị. Odds ratio = \(e^{1.734} \approx 5.66\), tức là cao hơn khoảng 5.66 lần.

industrial = 0.191 (p \(\approx\) 0.0099): Người làm trong ngành công nghiệp có odds tham gia công đoàn cao hơn khoảng \(e^{0.191} \approx 1.21\) lần.

southyes = -1.046 (p < 0.001): Người sống ở miền Nam có odds tham gia công đoàn thấp hơn người không sống ở miền Nam, với odds giảm khoảng \(e^{-1.046} \approx 0.35\) lần, tức giảm 65%.

marriedyes = 0.470 (p \(\approx\) 0.00077): Người đã kết hôn có odds tham gia công đoàn cao hơn người chưa kết hôn, với odds cao hơn khoảng \(e^{0.470} \approx 1.60\) lần.

sexmale = 0.376 (p \(\approx\) 0.04): Nam giới có odds tham gia công đoàn cao hơn nữ giới khoảng \(e^{0.376} \approx 1.46\) lần.

blackyes = 0.667 (p < 0.001): Người da đen có odds tham gia công đoàn cao hơn người không phải da đen khoảng \(e^{0.667} \approx 1.95\) lần.

3.2.8.2 Mô hình Probit

probit_model32 <- glm(union_bin ~ bluecol + ind + south + married + sex + black, data = d1, family = binomial(link = "probit"))
summary(probit_model32)
## 
## Call:
## glm(formula = union_bin ~ bluecol + ind + south + married + sex + 
##     black, family = binomial(link = "probit"), data = d1)
## 
## Coefficients:
##               Estimate Std. Error z value Pr(>|z|)    
## (Intercept)   -1.23046    0.07910 -15.556  < 2e-16 ***
## bluecolyes     1.04038    0.04472  23.263  < 2e-16 ***
## indindustrial  0.10058    0.04446   2.262  0.02369 *  
## southyes      -0.63340    0.05012 -12.638  < 2e-16 ***
## marriedyes     0.27461    0.08248   3.329  0.00087 ***
## sexmale        0.19008    0.10578   1.797  0.07235 .  
## blackyes       0.41434    0.08442   4.908 9.21e-07 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 5461.8  on 4164  degrees of freedom
## Residual deviance: 4617.6  on 4158  degrees of freedom
## AIC: 4631.6
## 
## Number of Fisher Scoring iterations: 4

\[ \Phi^{-1}(P(\text{union\_bin}=1)) = -1.23046 + 1.04038 \cdot \text{bluecolyes} + 0.10058 \cdot \text{indindustrial} - 0.63340 \cdot \text{southyes} + 0.27461 \cdot \text{marriedyes} + 0.19008 \cdot \text{sexmale} + 0.41434 \cdot \text{blackyes} \]

bluecolyes = 1.0404: Lao động chân tay có khả năng tham gia công đoàn cao hơn đáng kể so với lao động không chân tay.
indindustrial = 0.1006: Làm việc trong ngành công nghiệp làm tăng nhẹ khả năng tham gia công đoàn so với ngoài ngành.
southyes = -0.6334: Người sống ở miền Nam có khả năng tham gia công đoàn thấp hơn đáng kể so với người không sống ở miền Nam.
marriedyes = 0.2746: Người đã kết hôn có khả năng tham gia công đoàn cao hơn người chưa kết hôn.
sexmale = 0.1901: Nam giới có khả năng tham gia công đoàn cao hơn nữ, nhưng mức ảnh hưởng không mạnh.
blackyes = 0.4143: Người da đen có khả năng tham gia công đoàn cao hơn người không da đen.

3.2.8.3 Mô hình Cloglog

cloglog_model33 <- glm(union_bin ~ bluecol + ind + south + married + sex + black, data = d1, family = binomial(link = "cloglog"))
summary(cloglog_model33)
## 
## Call:
## glm(formula = union_bin ~ bluecol + ind + south + married + sex + 
##     black, family = binomial(link = "cloglog"), data = d1)
## 
## Coefficients:
##               Estimate Std. Error z value Pr(>|z|)    
## (Intercept)   -2.18235    0.11880 -18.370  < 2e-16 ***
## bluecolyes     1.38074    0.06211  22.232  < 2e-16 ***
## indindustrial  0.19355    0.05419   3.571 0.000355 ***
## southyes      -0.80602    0.06693 -12.043  < 2e-16 ***
## marriedyes     0.34997    0.10742   3.258 0.001122 ** 
## sexmale        0.37301    0.14671   2.542 0.011007 *  
## blackyes       0.56663    0.10005   5.664 1.48e-08 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 5461.8  on 4164  degrees of freedom
## Residual deviance: 4600.5  on 4158  degrees of freedom
## AIC: 4614.5
## 
## Number of Fisher Scoring iterations: 6

\[ \log(-\log(1-P(\text{union\_bin}=1))) = -2.1824 + 1.3807 \cdot \text{bluecolyes} + 0.1936 \cdot \text{indindustrial} - 0.8060 \cdot \text{southyes} + 0.3500 \cdot \text{marriedyes} + 0.3730 \cdot \text{sexmale} + 0.5666 \cdot \text{blackyes} \]

bluecolyes = 1.3807: Người lao động chân tay có xác suất tham gia công đoàn cao hơn nhiều so với lao động không chân tay (hiệu ứng mạnh và rất có ý nghĩa).
indindustrial = 0.1936: Làm việc trong ngành công nghiệp làm tăng xác suất tham gia công đoàn.
southyes = -0.8060: Sống ở miền Nam làm giảm đáng kể xác suất tham gia công đoàn.
marriedyes = 0.3500: Người đã kết hôn có xác suất tham gia công đoàn cao hơn người chưa kết hôn.
sexmale = 0.3730: Nam giới có khả năng tham gia công đoàn cao hơn nữ.
blackyes = 0.5666: Người da đen có xác suất tham gia công đoàn cao hơn người không da đen.

3.2.9 Đánh giá mô hình hồi quy bội

3.2.9.1 Chỉ số AIC

AIC(logit_model31)
## [1] 4628.306
AIC(probit_model32)
## [1] 4631.645
AIC(cloglog_model33)
## [1] 4614.499

Nhận xét:Mô hình Logit và Probit đều không phù hợp bằng mô hình Cloglog trong việc giải thích sự tác động của các đặc điểm nhân khẩu học đến quyết định tham gia công đoàn của người lao động tại Hoa Kỳ. Vì mô hình Cloglog có AIC thấp nhất, phù hợp nhất với dữ liệu, tức là cân bằng tốt giữa độ phù hợp và độ phức tạp của mô hình.

3.2.9.2 Hệ số Brier Score

Brier Score là một chỉ số để đánh giá độ chính xác của mô hình dự báo xác suất nhị phân. Nó đo trung bình bình phương sai số giữa xác suất dự báo và giá trị thực tế (0 hoặc 1).

Công thức Brier Score:

\[ \text{Brier Score} = \frac{1}{N} \sum_{i=1}^N (\hat{p}_i - y_i)^2 \]

Trong đó:

  • \(N\): số lượng quan sát
  • \(\hat{p}_i\): xác suất dự báo cho quan sát thứ \(i\)
  • \(y_i\): giá trị thực tế (0 hoặc 1)

Ý nghĩa:

  • Giá trị Brier Score nằm trong khoảng \([0,1]\)
  • Giá trị càng nhỏ càng tốt
    → Cho thấy mô hình dự báo xác suất gần với giá trị thực tế.
BrierScore(logit_model31)
## [1] 0.1863312
BrierScore(probit_model32)
## [1] 0.1867089
BrierScore(cloglog_model33)
## [1] 0.1856089

Nhận xét:Mô hình Cloglog có chỉ số Brier Score thấp nhất, cho thấy nó dự báo xác suất gần nhất với dữ liệu thực tế so với hai mô hình còn lại.

Kết luận: mô hình Cloglog đều có chỉ số AIC và Brier Score thấp nhất trong 3 mô hình. Cho thấy mô hình Cloglog có hiệu suất dự báo tốt nhất.

3.2.9.3 Dự báo của mô hình cloglog

new_worker33 <- data.frame(
  bluecol = "yes",
  ind = "industrial",
  south = "yes",
  married = "yes",
  sex = "male",
  black = "yes")
new_worker34 <- data.frame(
  bluecol = "no",
  ind = "non-industrial",
  south = "no",
  married = "no",
  sex = "female",
  black = "no")
# Dự báo xác suất tham gia công đoàn
predict(cloglog_model33, newdata = new_worker33, type = "response")
##         1 
## 0.5864454
predict(cloglog_model33, newdata = new_worker34, type = "response")
##         1 
## 0.1066499

📌 Nhận xét:
Mô hình cloglog cho thấy với các đặc điểm nhân khẩu học như người lao động nam, đã kết hôn, thuộc loại lao động chân tay, làm việc trong ngành sản xuất và sinh sống tại miền Nam Hoa Kỳ thì xác suất tham gia công đoàn là \(\approx 58.6\%\).

Mô hình cloglog cho thấy với các đặc điểm nhân khẩu học như người lao động nữ, chưa kết hôn, không thuộc loại lao động chân tay, không làm việc trong ngành sản xuất và không sống tại miền Nam Hoa Kỳ thì xác suất tham gia công đoàn là \(\approx 10.665\%\).

3.3 Kết luận

Trong nghiên cứu này, tác giả thực hiện phân tích tác động của các đặc điểm nhân khẩu học đến khả năng tham gia công đoàn của người lao động tại Hoa Kỳ. Dựa trên bộ dữ liệu Wages với biến union là biến phụ thuộc, tác giả thực hiện thống kê mô tả biến union với từng biến độc lập như bluecol, ind, south,smsa, married, sex, black để hiểu rõ hơn về mối quan hệ giữa các biến. Cụ thể, khi kiểm định mối liên hệ giữa biến phụ thuộc và các biến độc lập thì hầu hết các cặp biến đều có mối liên hệ có ý nghĩa thống kê, chỉ riêng biến định tính smsa là không có mối liên hệ có ý nghĩa thống kê với biến union.

Khi thực hiện phân tích tỷ lệ nguy cơ tương đối và tỷ lệ chênh lêch, kết quả nhận được đều cho thấy các đặc điểm nhân khẩu học có ảnh hưởng rõ rệt đến quyết định tham gia công đoàn của người lao động tại Hoa Kỳ. Chi tiết hơn, người lao động thuộc nhóm lao động chân tay có khả năng tham gia công đoàn cao hơn từ 1.8 lần đến 3 lần so với nhóm còn lại, đồng thời có odds cao gấp 5,47 lần. Người làm trong ngành sản xuất, người đã kết hôn, nam giới và người da đen đều có xác suất và odds tham gia công đoàn cao hơn so với nhóm đối chiếu. Ngược lại, người sống tại miền Nam Hoa Kỳ có khả năng tham gia công đoàn thấp hơn, chỉ số relative risk chỉ khoảng 0.58. Nhưng kết quả này cho thấy đặc điểm nhân khẩu học là yếu tố chi phối hành vi tham gia công đoàn.

Tác giả tiếp tục thực hiện phân tích hồi quy đơn biến cho thấy từng yếu tố nhân khẩu học như nghề nghiệp, ngành nghề, khu vực cư trú, tình trạng hôn nhân, giới tính và chủng tộc đều có ảnh hưởng riêng và có ý nghĩa thống kê đến xác suất tham gia công đoàn. Khi đưa vào mô hình hồi quy đa biến (logit, probit, cloglog), các kết quả vẫn giữ nguyên xu hướng và ý nghĩa thống kê, cho thấy độ ổn định của các yếu tố này trong việc giải thích hành vi tham gia công đoàn. Trong đó, người lao động là lao động chân tay, làm việc trong ngành sản xuất, đã kết hôn, là nam giới, người da đen đều có xác suất tham gia công đoàn cao hơn. Riêng biến south có ảnh hưởng ngược chiều, làm giảm xác suất tham gia công đoàn. Trong ba mô hình logit, probit, cloglog thì mô hình cloglog cho kết quả phù hợp nhất, thể hiện qua giá trị AIC và Brier Score thấp nhất, xác suất tham gia công đoàn được dự báo bằng mô hình hồi quy đa biến cloglog ở các biến đặc trưng tích cực là 58.6%. Như vậy có thể kết luận rằng các đặc điểm nhân khẩu học có tác động mạnh đến quyết định tham gia công đoàn của người lao động tại Hoa Kỳ.

3.4 Đóng góp của nghiên cứu

Nghiên cứu đã cung cấp một cái nhìn toàn diện về mối quan hệ giữa các đặc điểm nhân khẩu học và quyết định tham gia công đoàn của người lao động tại Hoa Kỳ, thông qua việc kết hợp phân tích thống kê mô tả, phân tích tỷ lệ rủi ro tương đối (Relative Risk), tỷ lệ chênh lệch (Odds Ratio) và các mô hình hồi quy thống kê (logit, probit, cloglog). Việc sử dụng đồng thời các phương pháp định lượng này giúp kiểm chứng tính nhất quán và độ tin cậy của kết quả, qua đó củng cố thêm bằng chứng thực nghiệm về ảnh hưởng của yếu tố cá nhân đến hành vi tham gia tổ chức công đoàn.

Cụ thể, nghiên cứu đã chỉ ra rằng các yếu tố như nghề nghiệp (lao động chân tay), ngành nghề (sản xuất), giới tính (nam), tình trạng hôn nhân (đã kết hôn), chủng tộc (người da đen) và khu vực cư trú (ngoài miền Nam Hoa Kỳ) đều có vai trò quan trọng trong việc dự báo khả năng tham gia công đoàn. Những phát hiện này có thể đóng vai trò tham chiếu quan trọng cho các nhà hoạch định chính sách lao động – công đoàn tại Hoa Kỳ trong việc xác định nhóm đối tượng cần được quan tâm, hỗ trợ hoặc vận động để tăng cường sự tham gia vào công đoàn, qua đó góp phần nâng cao hiệu quả đại diện và bảo vệ quyền lợi cho người lao động.
Ngoài ra, nghiên cứu còn có giá trị thực tiễn trong việc đề xuất phương pháp phân tích định lượng ứng dụng vào lĩnh vực xã hội học lao động, đặc biệt là trong bối cảnh dữ liệu điều tra mẫu lớn. Việc chứng minh rằng mô hình cloglog cho kết quả phù hợp hơn trong dự báo hành vi tham gia công đoàn cũng là một đóng góp phương pháp đáng chú ý cho các nghiên cứu tương tự sau này.

LS0tDQp0aXRsZTogIlRp4buDdSBsdeG6rW4gUGjDom4gdMOtY2ggZOG7ryBsaeG7h3UgxJHhu4tuaCB0w61uaCINCmF1dGhvcjogIlBo4bqhbSBOZ+G7jWMgTWluaCBDaMOidSAtIDIyMjEwMDM3NjYiDQpkYXRlOiAiMjAyNS0wNS0xOSINCm91dHB1dDoNCiAgaHRtbF9kb2N1bWVudDoNCiAgICBjb2RlX2Rvd25sb2FkOiB0cnVlDQogICAgY29kZV9mb2xkaW5nOiBoaWRlDQogICAgbnVtYmVyX3NlY3Rpb25zOiB5ZXMNCiAgICB0aGVtOiAiZGVmYXVsdCINCiAgICB0b2NfZGVwdGg6IDMNCiAgICB0b2M6IHRydWUNCiAgICB0b2NfZmxvYXQ6IHRydWUNCi0tLQ0KDQpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRX0NCmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gVFJVRSkNCmBgYA0KDQo8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSJzdHlsZS5jc3MiPg0KDQpgYGB7cixlY2hvPUZBTFNFfQ0KbGlicmFyeShEVCkNCmxpYnJhcnkoZHBseXIpDQpsaWJyYXJ5KGdncGxvdDIpDQpsaWJyYXJ5KHN0YXRzKQ0KbGlicmFyeShwc3ljaCkNCmxpYnJhcnkoRGVzY1Rvb2xzKQ0KbGlicmFyeSh0aWR5dmVyc2UpDQpsaWJyYXJ5KHNjYWxlcykNCmxpYnJhcnkoZXBpdG9vbHMpDQpsaWJyYXJ5KEFFUikNCmxpYnJhcnkoRWNkYXQpDQpsaWJyYXJ5KGRhdGFyaXVtKQ0KbGlicmFyeShJU0xSKQ0KYGBgDQoNCiMgQ0jGr8agTkcgMTogVOG7lE5HIFFVQU4gTkdIScOKTiBD4buoVQ0KIyMgTMOtIGRvIGNo4buNbiDEkeG7gSB0w6BpDQpUcm9uZyBi4buRaSBj4bqjbmggdGjhu4sgdHLGsOG7nW5nIGxhbyDEkeG7mW5nIG5nw6B5IGPDoG5nIGJp4bq/biDEkeG7mW5nIG3huqFuaCBt4bq9IGLhu59pIGPDoWMgdMOhYyDEkeG7mW5nIGPhu6dhIHF1w6EgdHLDrG5oIHRvw6BuIGPhuqd1IGjDs2EgdsOgIHThu7EgxJHhu5luZyBow7NhIHRow6wgY8O0bmcgxJFvw6BuIGdp4buvYSB2YWkgdHLDsiBuaMawIG3hu5l0IHRoaeG6v3QgY2jhur8gxJHhuqFpIGRp4buHbiBjaG8gcXV54buBbiBs4bujaSBuZ8aw4budaSBsYW8gxJHhu5luZyBsw6AgbeG7mXQgdOG7lSBjaOG7qWMga2jDtG5nIHRo4buDIHRoaeG6v3UuIFZp4buHYyB0aGFtIGdpYSBjw7RuZyDEkW/DoG4ga2jDtG5nIGNo4buJIHBo4bqjbiDDoW5oIG3hu6ljIMSR4buZIGfhuq9uIGvhur90IHjDoyBo4buZaSBnaeG7r2EgbmfGsOG7nWkgbGFvIMSR4buZbmcgbcOgIGPDsm4gbMOgIG3hu5l0IHnhur91IHThu5EgdMOhYyDEkeG7mW5nIMSR4bq/biBt4bupYyBsxrDGoW5nIHbDoCDEkWnhu4F1IGtp4buHbiwgbcO0aSB0csaw4budbmcgbMOgbSB2aeG7h2MuIFR1eSBuaGnDqm4gdmnhu4djIHRoYW0gZ2lhIGPDtG5nIMSRb8OgbiBraMO0bmcgY2jhu4kgZOG7sWEgdHLDqm4geeG6v3UgdOG7kSBraW5oIHThur8gbcOgIGPDsm4gY2jhu4t1IOG6o25oIGjGsOG7n25nIGLhu59pIG5oaeG7gXUgxJHhurdjIMSRaeG7g20gbmjDom4ga2jhuql1IGjhu41jIG5oxrAgZ2nhu5tpIHTDrW5oLCBjaOG7p25nIHThu5ljLCB0csOsbmggxJHhu5kgaOG7jWMgduG6pW4sIGtodSB24buxYyBzaW5oIHPhu5FuZyB2w6AgdMOsbmggdHLhuqFuZyBow7RuIG5ow6JuLiAgIA0KVOG6oWkgSG9hIGvhu7MsIHThu7cgbOG7hyB0aGFtIGdpYSBjw7RuZyDEkW/DoG4gxJHDoyBnaeG6o20gZOG6p24gdHJvbmcgbmjhu69uZyB0aOG6rXAga+G7tyBn4bqnbiDEkcOieSwgbmjGsG5nIG3hu6ljIMSR4buZIHRoYW0gZ2lhIHbhuqtuIGPDsyBz4buxIGtow6FjIGJp4buHdCBnaeG7r2Egbmjhu69uZyBuaMOzbSBkw6JuIGPGsCBraMOhYyBuaGF1LiBWaeG7h2MgaGnhu4N1IHLDtSBjw6FjIHnhur91IHThu5EgbmjDonUga2jhuql1IGjhu41jIOG6o25oIGjGsOG7m25nIMSR4bq/biBraOG6oyBuxINuZyB0aGFtIGdpYSBjw7RuZyDEkW/DoG4gc+G6vSBnacO6cCBjw6FjIG5ow6AgaG/huqF0IMSR4buLbmggY2jDrW5oIHPDoWNoIGxhbyDEkeG7mW5nLCBjw6FjIHThu5UgY2jhu6ljIGPDtG5nIMSRb8OgbiB0aGnhur90IGvhur8gY2hp4bq/biBsxrDhu6NjIHBow7kgaOG7o3AgbmjhurFtIG7Dom5nIGNhbyB04bu3IGzhu4cgxJHhuqFpIGRp4buHbiB2w6AgxJHhuqNtIGLhuqNvIGPDtG5nIGLhurFuZyB0cm9uZyB0aeG6v3AgY+G6rW4gcXV54buBbiBs4bujaSBsYW8gxJHhu5luZy4gICANCkLhu5kgZOG7ryBsaeG7h3UgKipXYWdlcyoqIHThu6sgRWNkYXQgbMOgIG3hu5l0IGLhu5kgZOG7ryBsaeG7h3UgcGjDuSBo4bujcCDEkeG7gyB0aOG7sWMgaGnhu4duIG5naGnDqm4gY+G7qXUgbsOgeSwgdsOsIG7DsyBjdW5nIGPhuqVwIHRow7RuZyB0aW4gY2hpIHRp4bq/dCB24buBIGPDoWMgxJHhurdjIMSRaeG7g20gbmjDom4ga2jhuql1IGjhu41jLCB0w6xuaCB0cuG6oW5nIGxhbyDEkeG7mW5nIHbDoCBt4buRaSBsacOqbiBo4buHIHbhu5tpIHZp4buHYyB0aGFtIGdpYSBjw7RuZyDEkW/DoG4uIFZp4buHYyBz4butIGThu6VuZyBjw6FjIHBoxrDGoW5nIHBow6FwIHRo4buRbmcga8OqIHbDoCBtw7QgaMOsbmggaMOzYSBraW5oIHThur8gbMaw4bujbmcgxJHhu4MgcGjDom4gdMOtY2ggdMOhYyDEkeG7mW5nIGPhu6dhIGPDoWMgYmnhur9uIMSR4buLbmggdMOtbmggbmjGsCBnaeG7m2kgdMOtbmggKHNleCksIGNo4bunbmcgdOG7mWMgKGJsYWNrKSwgdMOsbmggdHLhuqFuZyBow7RuIG5ow6JuIChtYXJyaWVkKSwga2h1IHbhu7FjIGPGsCB0csO6IChzb3V0aCwgc21zYSkgxJHhur9uIHF1eeG6v3QgxJHhu4tuaCB0aGFtIGdpYSBjw7RuZyDEkW/DoG4gKHVuaW9uKSBz4bq9IG1hbmcgbOG6oWkgbmjhu69uZyBr4bq/dCBxdeG6oyBjw7MgZ2nDoSB0cuG7iyB0aOG7sWMgdGnhu4VuIHbDoCBnw7NwIHBo4bqnbiBsw6BtIHPDoW5nIHThu48gbeG7kWkgcXVhbiBo4buHIGdp4buvYSBuaMOibiBraOG6qXUgaOG7jWMgdsOgIGjDoG5oIHZpIHRoYW0gZ2lhIHThu5UgY2jhu6ljIGxhbyDEkeG7mW5nLiAgIA0KDQojIyBN4bulYyB0acOqdSBuZ2hpw6puIGPhu6l1DQpN4bulYyB0acOqdSBj4bunYSBuZ2hpw6puIGPhu6l1IG7DoHkgbMOgIHBow6JuIHTDrWNoIHPhu7EgdMOhYyDEkeG7mW5nIGPhu6dhIGPDoWMgeeG6v3UgdOG7kSBuaMOibiBraOG6qXUgaOG7jWMg4bqjbmggaMaw4bubbmcgxJHhur9uIHZp4buHYyB0aGFtIGdpYSBjw7RuZyDEkW/DoG4gY+G7p2EgbmfGsOG7nWkgbGFvIMSR4buZbmcgdOG6oWkgSG9hIEvhu7MsIHRow7RuZyBxdWEgdmnhu4djIHPhu60gZOG7pW5nIGThu68gbGnhu4d1IGto4bqjbyBzw6F0IHbDoCBjw6FjIHBoxrDGoW5nIHBow6FwIHBow6JuIHTDrWNoIMSR4buLbmggbMaw4bujbmcuICAgDQoNCiMjIMSQ4buRaSB0xrDhu6NuZyB2w6AgcGjhuqFtIHZpIG5naGnDqm4gY+G7qXUgICANCg0KKiAqKsSQ4buRaSB0xrDhu6NuZyBuZ2hpw6puIGPhu6l1KiogICANCg0KxJDhu5FpIHTGsOG7o25nIG5naGnDqm4gY+G7qXUgdHJvbmcgxJHhu4EgdMOgaSBsw6AgbmfGsOG7nWkgbGFvIMSR4buZbmcgdOG6oWkgSG9hIEvhu7MsIHbhu5tpIGPDoWMgxJHhurdjIMSRaeG7g20gbmjDom4ga2jhuql1IGjhu41jIGPhu6UgdGjhu4MgbmjGsCBnaeG7m2kgdMOtbmgsIHTDrG5oIHRy4bqhbmcgaMO0biBuaMOibiwgbmfDoG5oIG5naOG7gSwga2h1IHbhu7FjIGPGsCB0csO6LCBjaOG7p25nIHThu5ljLiBUcm9uZyDEkcOzLCBiaeG6v24gcGjhu6UgdGh14buZYyBjaMOtbmggdHJvbmcgbmdoacOqbiBj4bupdSBsw6AgYmnhur9uIMSR4buLbmggdMOtbmggYHVuaW9uYCwgYmnhur9uIHRo4buDIGhp4buHbiB2aeG7h2MgbmfGsOG7nWkgbGFvIMSR4buZbmcgY8OzIHRoYW0gZ2lhIGPDtG5nIMSRb8OgbiBoYXkga2jDtG5nLiAgICANCg0KKiAqKlBo4bqhbSB2aSBuZ2hpw6puIGPhu6l1KiogICANCg0KUGjhuqFtIHZpIGPhu6dhIMSR4buBIHTDoGkgbmdoacOqbiBj4bupdSB04bqtcCB0cnVuZyB2w6BvIHRo4buLIHRyxrDhu51uZyBsYW8gxJHhu5luZyB04bqhaSBIb2EgS+G7sy4gVuG7m2kgYuG7mSBk4buvIGxp4buHdSBn4buTbSA0MTY1IG5nxrDhu51pIGxhbyDEkeG7mW5nIHRo4buxYyBoaeG7h24ga2jhuqNvIHPDoXQgduG7m2kgdOG7lW5nIDEyIGJp4bq/bi4gICANCg0KIyMgUGjGsMahbmcgcGjDoXAgbmdoacOqbiBj4bupdQ0KTmdoacOqbiBj4bupdSBz4butIGThu6VuZyBwaMawxqFuZyBwaMOhcCBuZ2hpw6puIGPhu6l1IHRo4buRbmcga8OqIHbDoCBjw6FjIG3DtCBow6xuaCBo4buTaSBxdXkgxJHhu4MgcGjDom4gdMOtY2ggdHLDqm4gYuG7mSBk4buvIGxp4buHdSBXYWdlcy4gVOG7qyBuaOG6rW4gaGnhu4N1IHLDtSB24buBIHPhu7EgdMOhYyDEkeG7mW5nIHbDoCBt4bupYyDEkeG7mSB0w6FjIMSR4buZbmcgY+G7p2EgY8OhYyB54bq/dSB04buRIG5ow6JuIGto4bqpdSBo4buNYyDEkeG6v24gcXV54bq/dCDEkeG7i25oIHRoYW0gZ2lhIGPDtG5nIMSRb8OgbiBj4bunYSBuZ8aw4budaSBsYW8gxJHhu5luZyB04bqhaSBIb2EgS+G7sy4gICAgDQoNCiMjIEvhur90IGPhuqV1IG5naGnDqm4gY+G7qXUNCkNoxrDGoW5nIDE6IFThu5VuZyBxdWFuIG5naGnDqm4gY+G7qXUuICAgIA0KQ2jGsMahbmcgMjogROG7ryBsaeG7h3UgbmdoacOqbiBj4bupdS4gICANCkNoxrDGoW5nIDM6IFBow6JuIHTDrWNoIHbDoCDEkcawYSByYSBr4bq/dCBxdeG6oy4gICANCg0KIyBDSMavxqBORyAyOiBE4buuIExJ4buGVSBOR0hJw4pOIEPhu6hVDQojIyBU4buVbmcgcXVhbiB24buBIGLhu5kgZOG7ryBsaeG7h3UgV2FnZXMgIA0KDQpC4buZIGThu68gbGnhu4d1ICoqV2FnZXMqKiDEkcaw4bujYyBs4bqleSB04burIHBhY2thZ2UgYEVjZGF0YCwgY2jhu6lhIHRow7RuZyB0aW4gduG7gSBjw6FjIMSR4bq3dCDEkWnhu4NtIG5ow6JuIGto4bqpdSBo4buNYywgcXXDoSB0csOsbmggbMOgbSB2aeG7h2MgdsOgIHRodSBuaOG6rXAgY+G7p2EgbmfGsOG7nWkgbGFvIMSR4buZbmcgdOG6oWkgSG9hIEvhu7MuIELhu5kgZOG7ryBsaeG7h3UgV2FnZXMgY2jhu6lhIDEyIGJp4bq/biB24bubaSB04buVbmcgY+G7mW5nIDQxNjUgcXVhbiBzw6F0LiAgICAgIA0KROG7ryBsaeG7h3UgbsOgeSB0aMaw4budbmcgxJHGsOG7o2Mgc+G7rSBk4bulbmcgdHJvbmcgcGjDom4gdMOtY2gga2luaCB04bq/IGxhbyDEkeG7mW5nIHbDoCBjw6FjIG3DtCBow6xuaCBraW5oIHThur8gbMaw4bujbmcgxJHhu4Mga2nhu4NtIMSR4buLbmggdMOhYyDEkeG7mW5nIGPhu6dhICoqZ2nhu5tpIHTDrW5oLCBjaOG7p25nIHThu5ljLCBo4buNYyB24bqlbiB2w6AgdMOsbmggdHLhuqFuZyBow7RuIG5ow6JuKiogxJHhur9uIHRodSBuaOG6rXAuICAgDQoNCmBgYHtyLGVjaG89VFJVRX0NCg0KZCA8LSBXYWdlcw0KZGF0YXRhYmxlKFdhZ2VzKQ0KYGBgDQoNCiogKirDnSBuZ2jEqWEgY8OhYyBiaeG6v24gdHJvbmcgYuG7mSBk4buvIGxp4buHdSoqICAgDQoNCkTGsOG7m2kgxJHDonkgbMOgIGdp4bqjaSB0aMOtY2ggY2hpIHRp4bq/dCB24buBIGPDoWMgYmnhur9uIHRyb25nIGLhu5kgZOG7ryBsaeG7h3U6ICAgDQoNCiAqKkJp4bq/biDEkeG7i25oIGzGsOG7o25nIChRdWFudGl0YXRpdmUgVmFyaWFibGVzKSoqICAgDQoNCnwgVMOqbiBiaeG6v24gfCBLaeG7g3UgZOG7ryBsaeG7h3UgfCDDnSBuZ2jEqWEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KfC0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfA0KfCBgZXhwYCAgICB8IE51bWVyaWMgICAgICB8IFPhu5EgbsSDbSBraW5oIG5naGnhu4dtIGzDoG0gdmnhu4djIHRvw6BuIHRo4budaSBnaWFuLiAgIHwNCnwgYHdrc2AgICAgfCBOdW1lcmljICAgICAgfCBT4buRIHR14bqnbiBsw6BtIHZp4buHYyBj4bunYSBjw6EgbmjDom4gdHJvbmcgbeG7mXQgbsSDbS4gICAgfA0KfCBgZWRgICAgICB8IE51bWVyaWMgICAgICB8IFPhu5EgbsSDbSBo4buNYyB24bqlbiAodHLDrG5oIMSR4buZIGjhu41jIHbhuqVuKSBj4bunYSBjw6EgbmjDom4uIHwNCnwgYGx3YWdlYCAgfCBOdW1lcmljICAgICAgfCBMb2dhcml0IHThu7Egbmhpw6puIGPhu6dhIHRp4buBbiBsxrDGoW5nLiAgICAgICAgICAgICAgfA0KDQogKipCaeG6v24gxJHhu4tuaCB0w61uaCAoUXVhbGl0YXRpdmUgVmFyaWFibGVzKSoqICAgDQoNCnwgVMOqbiBiaeG6v24gICB8IEtp4buDdSBk4buvIGxp4buHdSB8IMOdIG5naMSpYSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KfC0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfA0KfCBgYmx1ZWNvbGAgIHwgZmFjdG9yICAgICAgfCBMb+G6oWkgY8O0bmcgdmnhu4djOiAxIChuaMOzbSBuZ8OgbmggbGFvIMSR4buZbmcgY2jDom4gdGF5IGhv4bq3YyBr4bu5IHRodeG6rXQpLCAwIChuaMOzbSBuZ8OgbmggdsSDbiBwaMOybmcsIGjDoG5oIGNow61uaCwgY2h1ecOqbiBtw7RuKS4gfA0KfCBgaW5kYCAgICAgIHwgaW50ZWdlciAgICAgIHwgTmfDoG5oIGPDtG5nIG5naGnhu4dwOiAxIChz4bqjbiB4deG6pXQpLCAwIChraMO0bmcgcGjhuqNpIHPhuqNuIHh14bqldCkuICAgICAgICAgICAgIHwNCnwgYHNvdXRoYCAgICB8IGZhY3RvciAgICAgIHwgS2h1IHbhu7FjIGPGsCB0csO6OiBZZXMgKG1p4buBbiBOYW0gSG9hIEvhu7MpLCBObyAoa2jDtG5nIHBo4bqjaSBtaeG7gW4gTmFtIEhvYSBL4buzKS4gfA0KfCBgc21zYWAgICAgIHwgZmFjdG9yICAgICAgfCBLaHUgduG7sWMgxJHDtCB0aOG7izogWWVzIChjxrAgdHLDuiB0cm9uZyBLaHUgduG7sWMgdGjhu5FuZyBrw6ogxJHDtCB0aOG7iyB0acOqdSBjaHXhuqluKSwgTm8gKGtow7RuZyBjxrAgdHLDuiB0cm9uZyBLaHUgduG7sWMgdGjhu5FuZyBrw6ogxJHDtCB0aOG7iyB0acOqdSBjaHXhuqluKS4gfA0KfCBgbWFycmllZGAgIHwgZmFjdG9yICAgICAgfCBUw6xuaCB0cuG6oW5nIGjDtG4gbmjDom46IFllcyAoxJHDoyBr4bq/dCBow7RuKSwgTm8gKGNoxrBhIGvhur90IGjDtG4pLiAgICAgICAgICAgIHwNCnwgYHNleGAgICAgICB8IGZhY3RvciAgICAgICB8IEdp4bubaSB0w61uaCBj4bunYSBjw6EgbmjDom46IG1hbGUsIGZlbWFsZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQp8IGB1bmlvbmAgICAgfCBmYWN0b3IgICAgICB8IFRow6BuaCB2acOqbiBjw7RuZyDEkW/DoG46IFllcyAoY8OzKSwgTm8gKGtow7RuZykuICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KfCBgYmxhY2tgICAgIHwgZmFjdG9yICAgICB8IENo4bunbmcgdOG7mWM6IFllcyAobmfGsOG7nWkgZGEgxJFlbiksIE5vIChraMO0bmcgcGjhuqNpIG5nxrDhu51pIGRhIMSRZW4pLiAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgfA0KDQoqICoqS+G6v3QgbHXhuq1uKioNCg0KQuG7mSBk4buvIGxp4buHdSAqKldhZ2VzKiogY8OzIGPhuqV1IHRyw7pjIHLDtSByw6BuZywgxJFhIGThuqFuZyB24buBIGJp4bq/biB2w6AgcXV5IG3DtCBt4bqrdSBs4bubbiwgdGjDrWNoIGjhu6NwIMSR4buDIHPhu60gZOG7pW5nIHRyb25nIGPDoWMgbcO0IGjDrG5oIGtpbmggdOG6vyDEkeG7i25oIGzGsOG7o25nLiBMw6AgbeG7mXQgYuG7mSBk4buvIGxp4buHdSBjw7MgZ2nDoSB0cuG7iyB0aOG7sWMgdGnhu4VuIGNhbywgcGjhu6VjIHbhu6UgdOG7kXQgY2hvIHZp4buHYyBuZ2hpw6puIGPhu6l1IHbDoCBtw7QgaMOsbmggaMOzYSB0cm9uZyBsxKluaCB24buxYyBraW5oIHThur8gbGFvIMSR4buZbmcgdsOgIGNow61uaCBzw6FjaCB0aOG7iyB0csaw4budbmcgbGFvIMSR4buZbmcuICAgICAgDQoNCiMjIFF1YW4gc8OhdCBk4buvIGxp4buHdSDEkeG7i25oIHTDrW5oIGPhu6dhIGLhu5kgZOG7ryBsaeG7h3UgV2FnZXMNCg0KKiBD4bqldSB0csO6YyBi4buZIGThu68gbGnhu4d1ICAgDQoNCmBgYHtyLGVjaG89VFJVRX0NCiMgTOG7jWMgZOG7ryBsaeG7h3UgxJHhu4tuaCB0w61uaA0KZDEgPC0gc3Vic2V0KGQsIHNlbGVjdD0tYyhleHAsd2tzLGVkLGx3YWdlKSkNCiMgSGnhu4NuIHRo4buLIGPhuqV1IHRyw7pjIGThu68gbGnhu4d1DQpzdHIoZDEpDQpgYGANCkThu68gbGnhu4d1IMSRw6MgxJHGsOG7o2MgKipsw6BtIHPhuqFjaCoqIHbDoCAqKnPhuq9wIHjhur9wIHLDtSByw6BuZyoqLiBI4bqndSBo4bq/dCBjw6FjICoqYmnhur9uIHBow6JuIGxv4bqhaSoqIMSRw6MgxJHGsOG7o2MgKiptw6MgaMOzYSBkxrDhu5tpIGThuqFuZyBmYWN0b3IqKiwgxJFp4buBdSBuw6B5IGPhu7FjIGvhu7MgKip0aHXhuq1uIHRp4buHbioqIHbDoCAqKnBow7kgaOG7o3AqKiDEkeG7gyBz4butIGThu6VuZyB0cm9uZyBjw6FjICoqbcO0IGjDrG5oIGjhu5NpIHF1eSoqIGhv4bq3YyBjw6FjICoqcGjDom4gdMOtY2ggxJHhu4tuaCBsxrDhu6NuZyoqIGtow6FjLiDEkGnhu4F1IG7DoHkgY2hvIHRo4bqleSBi4buZIGThu68gbGnhu4d1IFdhZ2VzIGPDsyB0aOG7gyBkw7luZyDEkeG7gyBwaMOibiB0w61jaCBjaHV5w6puIHPDonUuIFJpw6puZyBiaeG6v24gYGluZGAgxJFhbmcg4bufIGThuqFuZyBk4buvIGxp4buHdSBiaeG6v24gbmjhu4sgcGjDom4gZOG6oW5nIHPhu5EgKGludGVnZXIpLiBEbyBuZ2hpw6puIGPhu6l1IGPhuqduIHRo4buxYyBoaeG7h24gaOG7k2kgcXV5IHR1eeG6v24gdMOtbmgsbG9naXN0aWMgdsOgIGPDoWMgbcO0IGjDrG5oIG3DoCDDvSBuZ2jEqWEgxJHhu4tuaCB0w61uaCBj4bunYSBiaeG6v24gcXVhbiB0cuG7jW5nIGjGoW4gZ2nDoSB0cuG7iyBz4buRIG7Dqm4gY+G6p24gdGjhu7FjIGhp4buHbiBjaHV54buDbiBk4bqhbmcgZOG7ryBsaeG7h3UgY+G7p2EgYmnhur9uIGBpbmRgIHThu6sgKippbnRlZ2VyKiogc2FuZyAqKmZhY3RvcioqLiAgIA0KDQoqICpDaHV54buDbiBk4bqhbmcgZOG7ryBsaeG7h3UgY+G7p2EgYmnhur9uIGBpbmRgKiAgIA0KYGBge3IsZWNobz1UUlVFfQ0KZDEkaW5kIDwtIGZhY3RvcihkMSRpbmQsIGxldmVscyA9IGMoMCwgMSksIGxhYmVscyA9IGMoIm5vbi1pbmR1c3RyaWFsIiwgImluZHVzdHJpYWwiKSkNCnN0cihkMSkNCmBgYA0KU2F1IGNodXnhu4NuIGThuqFuZyBk4buvIGJp4buHdSBpbnRlZ2VyIGPhu6dhIGJp4bq/biBgaW5kYCB24bubaSBoYWkgdHLhuqFuZyB0aMOhaSAqMSogdsOgICowKiBzYW5nIGThuqFuZyBk4buvIGxp4buHdSBmYWN0b3IgdGjDrCBiaeG6v24gYGluZGAgbMOgIGJp4bq/biBuaOG7iyBwaMOibiB24bubaSBoYWkgdHLhuqFuZyB0aMOhaS4gVHLhuqFuZyB0aMOhaSAqKjAqKiB0xrDGoW5nIOG7qW5nIHbhu5tpICoqbm9uLWluZHVzdHJpYWwqKiwgdHLhuqFuZyB0aMOhaSAqKjEqKiB0xrDGoW5nIOG7qW5nIHbhu5tpICoqaW5kdXN0cmlhbCoqICAgDQoNCiogS2nhu4NtIHRyYSBi4buZIGThu68gbGnhu4d1IGPDsyBi4buLIHRoaeG6v3UgZ2nDoSB0cuG7iyBoYXkga2jDtG5nICAgDQoNCmBgYHtyLGVjaG89VFJVRX0NCnByaW50KCJLaeG7g20gdHJhIGLhu5kgZOG7ryBsaeG7h3UgY8OzIGPDoWMgZ2nDoSB0cuG7iyB0aGnhur91IGhheSBraMO0bmc6IikNCnogPC0gaXMubmEoZDEpDQpkYXRhdGFibGUoeikNCnByaW50KCJT4buRIGdpw6EgdHLhu4sgYuG7iyB0aGnhur91OiIpDQpzdW0oaXMubmEoZDEpKQ0KYGBgDQpC4buZIGThu68gbGnhu4d1ICoqV2FnZXMqKiBraMO0bmcgY8OzIGdpw6EgdHLhu4sgYuG7iyB0aGnhur91IOG7nyBjw6FjIGJp4bq/biDEkeG7i25oIHTDrW5oIC0gY8OhYyBiaeG6v24gZOG6oW5nIGBmYWN0b3JgIMSRw6MgxJHGsOG7o2MgxJHhu4tuaCBkYW5oIMSR4bqneSDEkeG7pywga2jDtG5nIGPDsyBnacOhIHRy4buLIHLhu5duZyBob+G6t2Mga2jDtG5nIHjDoWMgxJHhu4tuaC4gQ2hvIHRo4bqleSBi4buZIGThu68gbGnhu4d1IGPDsyBjaOG6pXQgbMaw4bujbmcgdOG7kXQuICAgDQoNCioqKiAgIA0KIyBDSMavxqBORyAzOiBQSMOCTiBUw41DSCBWw4AgxJDGr0EgUkEgS+G6vlQgUVXhuqINCiMjIFRo4buRbmcga8OqIG3DtCB04bqjIGJp4bq/biBwaOG7pSB0aHXhu5ljIHbDoCBiaeG6v24gxJHhu5ljIGzhuq1wDQojIyMgQmnhur9uIHBo4bulIHRodeG7mWM6IGJp4bq/bmB1bmlvbmANCkJp4bq/biBgdW5pb25gIGzDoCBt4buZdCBiaeG6v24gxJHhu4tuaCB0w61uaCBuaOG7iyBwaMOibiB24bubaSBoYWkgZ2nDoSB0cuG7iy4gIk5vIiBsw6AgbmfGsOG7nWkgbGFvIMSR4buZbmcga2jDtG5nIHRoYW0gZ2lhIGPDtG5nIMSRb8OgbiB2w6AgIlllcyIgbMOgIG5nxrDhu51pIGxhbyDEkeG7mW5nIHRoYW0gZ2lhIGPDtG5nIMSRb8Ogbi4gQmnhur9uIG7DoHkgZ2nDunAgcGjDom4gYmnhu4d0IGdp4buvYSBuaOG7r25nIG5nxrDhu51pIGxhbyDEkeG7mW5nIMSRxrDhu6NjIGto4bqjbyBzw6F0IGPDsyBuaOG7r25nIG5nxrDhu51pIGxhbyDEkeG7mW5nIG7DoG8gbmjhuq1uIMSRxrDhu6NjIHPhu7EgaOG7lyB0cuG7oyB04burIHThu5UgY2jhu6ljIGPDtG5nIMSRb8OgbiB24buBIG3hurd0IHF1eeG7gW4gbOG7o2ksIHRoxrDGoW5nIGzGsOG7o25nIGzGsMahbmcsIMSRaeG7gXUga2nhu4duIHZp4buHYyBsw6BtLC4uLiB2w6Agbmjhu69uZyBuZ8aw4budaSBuw6BvIGtow7RuZyBjw7MuIE3hu5l0IHnhur91IHThu5EgY8OzIHRo4buDIOG6o25oIGjGsOG7n25nIMSR4bq/biDEkWnhu4F1IGtp4buHbiBsYW8gxJHhu5luZyB2w6AgcGjDumMgbOG7o2kuICAgDQoNCiogKkLhuqNuZyB04bqnbiBz4buRKiAgIA0KYGBge3IsZWNobz1UUlVFfQ0KDQp0YWJsZShkMSR1bmlvbikNCg0KYGBgDQoNCiogKkLhuqNuZyB04bqnbiBzdeG6pXQqICAgDQpgYGB7cixlY2hvPVRSVUV9DQoNCnVuaW9uMSA8LSB0YWJsZShkMSR1bmlvbikvc3VtKG5yb3coZDEpKQ0KdW5pb24xDQoNCmBgYA0KDQoqICpUcuG7sWMgcXVhbiBow7NhKiAgIA0KYGBge3IsZWNobz1UUlVFfQ0KDQojIENodXnhu4NuIHRow6BuaCBkYXRhIGZyYW1lIMSR4buDIGdncGxvdCB44butIGzDvQ0KdW5pb25fZGYgPC0gYXMuZGF0YS5mcmFtZSh1bmlvbjEpDQpjb2xuYW1lcyh1bmlvbl9kZikgPC0gYygidW5pb24iLCAicHJvcG9ydGlvbiIpDQoNCiMgxJDhu5VpIG5ow6NuIHRow6BuaCB0aeG6v25nIFZp4buHdA0KdW5pb25fZGYkdW5pb24gPC0gZmFjdG9yKHVuaW9uX2RmJHVuaW9uLA0KICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVscyA9IGMoIm5vIiwgInllcyIpLA0KICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoIktow7RuZyB0aGFtIGdpYSBjw7RuZyDEkW/DoG4iLCAiVGhhbSBnaWEgY8O0bmcgxJFvw6BuIikpDQoNCg0KZ2dwbG90KHVuaW9uX2RmLCBhZXMoeCA9IHVuaW9uLCB5ID0gcHJvcG9ydGlvbiwgZmlsbCA9IHVuaW9uKSkgKw0KICBnZW9tX2NvbCh3aWR0aCA9IDAuNikgKw0KICBnZW9tX3RleHQoYWVzKGxhYmVsID0gcGFzdGUwKHJvdW5kKHByb3BvcnRpb24gKiAxMDAsIDEpLCAiJSIpKSwNCiAgICAgICAgICAgIHZqdXN0ID0gLTAuMywgc2l6ZSA9IDUsIGZvbnRmYWNlID0gImJvbGQiKSArDQogIGxhYnModGl0bGUgPSAiVOG7tyBs4buHIG5nxrDhu51pIGxhbyDEkeG7mW5nIHRoZW8gdMOsbmggdHLhuqFuZyB0aGFtIGdpYSBjw7RuZyDEkW/DoG4iLA0KICAgICAgIHggPSAiVMOsbmggdHLhuqFuZyB0aGFtIGdpYSBjw7RuZyDEkW/DoG4iLA0KICAgICAgIHkgPSAiVOG7tyBs4buHIikgKw0KICAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gYygiS2jDtG5nIHRoYW0gZ2lhIGPDtG5nIMSRb8OgbiIgPSAibGlnaHRncmVlbiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRoYW0gZ2lhIGPDtG5nIMSRb8OgbiIgPSAiZGFya2dyZWVuIikpICsNCiAgeWxpbSgwLCBtYXgodW5pb25fZGYkcHJvcG9ydGlvbikgKyAwLjA1KSArDQogIHRoZW1lX21pbmltYWwoKQ0KDQoNCmBgYA0KDQoqKk5o4bqtbiB4w6l0OioqICAgDQpU4bu3IGzhu4cgbmfGsOG7nWkgbGFvIMSR4buZbmcga2jDtG5nIHRoYW0gZ2lhIGPDtG5nIMSRb8OgbiBjaGnhur9tIHBo4bqnbiBs4bubbiB0cm9uZyBi4buZIGThu68gbGnhu4d1IG7DoHksIGPhu6UgdGjhu4MgbMOgIDYzLjYlLCB0xrDGoW5nIOG7qW5nIHbhu5tpIDI2NDkgbmfGsOG7nWkgdsOgIHThu7cgbOG7hyBuZ8aw4budaSBsYW8gxJHhu5luZyB0aGFtIGdpYSBjw7RuZyDEkW/DoG4gY2hp4bq/bSBwaOG6p24gbmjhu48gaMahbiwgduG7m2kgMzYuNCUgdMawxqFuZyDhu6luZyB24bubaSAxNTE2IG5nxrDhu51pLiBDbyB0aOG6pXkgxJFhIHPhu5EgbmfGsOG7nWkgbGFvIMSR4buZbmcgxJHGsOG7o2Mga2jhuqNvIHPDoXQgdHJvbmcgYuG7mSBk4buvIGxp4buHdSBuw6B5IGtow7RuZyBwaOG6o2kgbMOgIHRow6BuaCB2acOqbiBj4bunYSBjw7RuZyDEkW/DoG4uIFThu7cgbOG7hyBraMO0bmcgdGhhbSBnaWEgY8O0bmcgxJFvw6BuIGfhuqduIGfhuqVwIMSRw7RpIHThu7cgbOG7hyB0aGFtIGdpYS4gICAgDQoNCiMjIyBCaeG6v24gxJHhu5ljIGzhuq1wDQoqKkJp4bq/biBgYmx1ZWNvbGAqKiAgIA0KQmnhur9uIGBibHVlY29sYCAoQmx1ZS1jb2xsYXIgd29ya2VyczogdGh14bqtdCBuZ+G7ryBjaOG7iSBuaOG7r25nIG5nxrDhu51pIGzDoG0gY8O0bmcgdmnhu4djIGxhbyDEkeG7mW5nIGNow6JuIHRheSBob+G6t2Mga+G7uSB0aHXhuq10KTogbMOgIG3hu5l0IGJp4bq/biDEkeG7i25oIHTDrW5oIG5o4buLIHBow6JuIGNobyBiaeG6v3QgbmfGsOG7nWkgbGFvIMSR4buZbmcgY8OzIGzDoG0gY8O0bmcgdmnhu4djIHRodeG7mWMgbmjDs20gbGFvIMSR4buZbmcgY2jDom4gdGF5IGhv4bq3YyBr4bu5IHRodeG6rXQgaGF5IGtow7RuZy4gICANCg0KKiAqQuG6o25nIHThuqduIHPhu5EqICAgICAgDQpgYGB7cixlY2hvPVRSVUV9DQp0YWJsZShkMSRibHVlY29sKQ0KYGBgDQoNCiogKkLhuqNuZyB04bqnbiBzdeG6pXQqICAgDQoNCmBgYHtyLGVjaG89VFJVRX0NCmJsdWVjb2wxIDwtIHRhYmxlKGQxJGJsdWVjb2wpL3N1bShucm93KGQxKSkNCmJsdWVjb2wxDQpgYGANCiBW4bqteSB0cm9uZyBi4buZIGThu68gbGnhu4d1IG7DoHkgY8OzIGByIHRhYmxlKGQxJGJsdWVjb2wpWzFdL3N1bShucm93KGQxKSkqMTAwYFwlIG5nxrDhu51pIGxhbyDEkeG7mW5nIGtow7RuZyBsw6BtIHZp4buHYyB0cm9uZyBuaMOzbSBuZ8OgbmggbGFvIMSR4buZbmcgY2jDom4gdGF5IHbDoCBr4bu5IHRodeG6rXQgdsOgICBgciB0YWJsZShkMSRibHVlY29sKSBbMl0vc3VtKG5yb3coZDEpKSoxMDBgXCUgbmfGsOG7nWkgbGFvIMSR4buZbmcgbMOgbSB2aeG7h2MgdHJvbmcgbmjDs20gbmfDoG5oIGxhbyDEkeG7mW5nIGNow6JuIHRheSB2w6Aga+G7uSB0aHXhuq10LiAgICAgDQoNCiogKlRy4buxYyBxdWFuIGjDs2EqICAgDQpgYGB7cixlY2hvPVRSVUV9DQpwaWUoYmx1ZWNvbDEsDQogICAgbGFiZWxzID0gcGFzdGUobmFtZXMoYmx1ZWNvbDEpLCByb3VuZChibHVlY29sMSoxMDAsMiksICIlIiksDQogICAgbWFpbiA9ICJCaeG7g3UgxJHhu5MgdHLDsm46IFThu7cgbOG7hyBuZ8aw4budaSBsYW8gxJHhu5luZyBsw6BtIHZp4buHYyB0cm9uZyBuaMOzbSBuZ8OgbmggbGFvIMSR4buZbmcgY2jDom4gdGF5IHbDoCBr4bu5IHRodeG6rXQiKSANCmBgYA0KICAgIA0KKiAqTmjhuq1uIHjDqXQ6KiAgIA0KQuG6o25nIHThuqduIHN14bqldCBjaG8gdGjhuqV5IGPDsyB04buVbmcgY+G7mW5nIDIxMjkgbmfGsOG7nWkgbGFvIMSR4buZbmcgY8OzIGxv4bqhaSBjw7RuZyB2aeG7h2MgdGh14buZYyBuaMOzbSBuZ8OgbmggbGFvIMSR4buZbmcgY2jDom4gdGF5IGhv4bq3YyBr4bu5IHRodeG6rXQgdHJvbmcgdOG7lW5nIHPhu5EgNDE2NSBuZ8aw4budaSBsYW8gxJHhu5luZyB0aOG7sWMgaGnhu4duIGto4bqjbyBzw6F0LiBU4burIMSRw7MsIHThu7cgbOG7hyBwaOG6p24gdHLEg20gY+G7p2EgbeG7l2kgbmjDs20gxJHGsOG7o2MgdMOtbmggdG/DoW4gY2jDrW5oIHjDoWMsIGNobyB0aOG6pXkgbmjDs20gY8O0bmcgbmjDom4gdGh14buZYyBuZ8OgbmggbGFvIMSR4buZbmcgY2jDom4gdGF5IGhv4bq3YyBr4bu5IHRodeG6rXQgY2hp4bq/bSBraG/huqNuZyA1MS4xMiUgdsOgIG5ow7NtIGPDsm4gbOG6oWkgbMOgIDQ4Ljg4JS4gQmnhu4N1IMSR4buTIHRyw7JuIMSRxrDhu6NjIHPhu60gZOG7pW5nIMSR4buDIHRy4buxYyBxdWFuIGjDs2EgY8OhYyB04bu3IGzhu4cgbsOgeS4gTWluaCBo4buNYSB0cuG7sWMgcXVhbiBjaG8gdGjhuqV5IHPhu5EgbMaw4bujbmcgdsOgIHThu7cgbOG7hyBj4bunYSBoYWkgdHLhuqFuZyB0aMOhaSBj4bunYSBiaeG6v24gYGJsdWVjb2xgIGzDoCBraMOhIGPDom4gYuG6sW5nIHbDoCBuaMOzbSBjw7RuZyBuaMOibiBsYW8gxJHhu5luZyBjaMOibiB0YXkgaG/hurdjIGvhu7kgdGh14bqtdCBjaGnhur9tIMawdSB0aOG6vyBoxqFuIG3hu5l0IGNow7p0LiAgIA0KDQoqKkJp4bq/biBgaW5kYCoqICAgDQpCaeG6v24gYEluZGAgeMOhYyDEkeG7i25oIG5nxrDhu51pIGxhbyDEkeG7mW5nIGPDsyBsw6BtIHZp4buHYyB0cm9uZyBuZ8Ogbmggc+G6o24gc3XhuqV0IGhheSBraMO0bmcuIEzDoCBt4buZdCBiaeG6v24gbmjhu4sgcGjDom4gduG7m2kgaGFpIHRy4bqhbmcgdGjDoWkgbOG6p24gbMaw4bujdCBsw6AgbMOgbSB2aeG7h2MgdHJvbmcgbmfDoG5oIHPhuqNuIHh14bqldCAoaW5kdXN0cmlhbCkgdsOgIGtow7RuZyBsw6BtIHZp4buHYyB0cm9uZyBuZ8Ogbmggc+G6o24gc3XhuqV0IChub24taW5kdXN0cmlhbCkuICAgDQoNCiogKkLhuqNuZyB04bqnbiBz4buRKiAgIA0KDQpgYGB7cixlY2hvPVRSVUV9DQp0YWJsZShkMSRpbmQpDQpgYGANCiogKkLhuqNuZyB04bqnbiBzdeG6pXQqICAgDQoNCmBgYHtyLGVjaG89VFJVRX0NCmluZDEgPC0gdGFibGUoZDEkaW5kKS9zdW0obnJvdyhkMSkpDQppbmQxDQpgYGANClbhuq15IHRyb25nIGLhu5kgZOG7ryBsaeG7h3UgbsOgeSBjw7MgYHIgdGFibGUoZDEkaW5kKVsxXS9zdW0obnJvdyhkMSkpKjEwMGBcJSBuZ8aw4budaSBsYW8gxJHhu5luZyBraMO0bmcgbMOgbSB2aeG7h2MgdHJvbmcgbmfDoG5oIHPhuqNuIHh14bqldCB2w6AgIGByIHRhYmxlKGQxJGluZCkgWzJdL3N1bShucm93KGQxKSkqMTAwYFwlIG5nxrDhu51pIGxhbyDEkeG7mW5nIGzDoG0gdmnhu4djIHRyb25nIG5nw6BuaCBz4bqjbiB4deG6pXQuICAgICANCg0KKiAqVHLhu7FjIHF1YW4gaMOzYSogICANCmBgYHtyLGVjaG89VFJVRX0NCnBpZShpbmQxLA0KICAgIGxhYmVscyA9IHBhc3RlKG5hbWVzKGluZDEpLCByb3VuZChpbmQxKjEwMCwyKSwgIiUiKSwNCiAgICBtYWluID0gIkJp4buDdSDEkeG7kyB0csOybjogVOG7tyBs4buHIG5nxrDhu51pIGxhbyDEkeG7mW5nIGzDoG0gdmnhu4djIHRyb25nIG5nw6BuaCBz4bqjbiB4deG6pXQiLGNvbD1jKCJsaWdodGJsdWUiLCAiYmx1ZSIpKSANCmBgYA0KICAgIA0KKiAqTmjhuq1uIHjDqXQ6KiAgDQpT4buRIGzGsOG7o25nIG5nxrDhu51pIGxhbyDEkeG7mW5nIGtow7RuZyBsw6BtIHZp4buHYyB0cm9uZyBuZ8OgbmggY8O0bmcgbmdoaeG7h3Agc+G6o24geHXhuqV0IHRyb25nIGto4bqjbyBzw6F0IGNoaeG6v20gcGjhuqduIGzhu5tuLCBj4bulIHRo4buDIGzDoCAyNTE4IG5nxrDhu51pIGxhbyDEkeG7mW5nIHRyw6puIHThu5VuZyBz4buRIDQxNjUgbmfGsOG7nWkgdGhhbSBnaWEga2jhuqNvIHPDoXQuIFThu7cgbOG7hyBwaOG6p24gdHLEg20gY+G7p2EgbmjDs20gYG5vbi1pbmR1c3RyaWFsYCBjaGnhur9tIGtob+G6o25nIDYwLjQ2JSB2w6AgY8OybiBs4bqhaSAzOS41NCUgbmfGsOG7nWkgbGFvIMSR4buZbmcgbMOgbSB2aeG7h2MgdHJvbmcgbmfDoG5oIHPhuqNuIHh14bqldC4gQmnhu4N1IMSR4buTIHRyw7JuIG1pbmggaOG7jWEgdHLhu7FjIHF1YW4gbeG7mXQgY8OhY2ggY2jDrW5oIHjDoWMgY8OhYyBz4buRIGxp4buHdSDEkcaw4bujYyB0w61uaCB0b8OhbiDhu58gYuG6o25nIHThuqduIHPhu5EgdsOgIGLhuqNuZyB04bqnbiBzdeG6pXQuICAgDQoNCioqKiAgIA0KDQoqKkJp4bq/biBgc291dGhgKiogICANCkJp4bq/biBgc291dGhgIHRo4buDIGhp4buHbiBraHUgduG7sWMgxJHhu4thIGzDvSBuxqFpIGPGsCB0csO6IGPhu6dhIG5nxrDhu51pIGxhbyDEkeG7mW5nLCBj4bulIHRo4buDIGjGoW4gbMOgIHjDoWMgxJHhu4tuaCBuZ8aw4budaSBsYW8gxJHhu5luZyDEkcOzIGPDsyBz4buRbmcg4bufIG1p4buBbiBOYW0gSG9hIEvhu7MgaGF5IGtow7RuZy4gTMOgIG3hu5l0IGJp4bq/biBuaOG7iyBwaMOibiB24bubaSBiaeG7g3UgaGnhu4duIFllcyBsw6AgbmfGsOG7nWkgbGFvIMSR4buZbmcgY8awIHRyw7ogdOG6oWkgbWnhu4FuIE5hbSBIb2EgS+G7syB2w6AgTm8gbMOgIG5nxrDhu51pIGxhbyDEkeG7mW5nIGtow7RuZyBjxrAgdHLDuiB04bqhaSBtaeG7gW4gTmFtIEhvYSBL4buzLiAgICAgIA0KDQoqICpC4bqjbmcgdOG6p24gc+G7kSogICANCg0KYGBge3IsZWNobz1UUlVFfQ0KdGFibGUoZDEkc291dGgpDQpgYGANCiogKkLhuqNuZyB04bqnbiBzdeG6pXQqICAgDQoNCmBgYHtyLGVjaG89VFJVRX0NCnNvdXRoMSA8LSB0YWJsZShkMSRzb3V0aCkvc3VtKG5yb3coZDEpKQ0Kc291dGgxDQpgYGANClbhuq15IHRyb25nIGLhu5kgZOG7ryBsaeG7h3UgbsOgeSBjw7MgYHIgdGFibGUoZDEkc291dGgpWzFdL3N1bShucm93KGQxKSkqMTAwYFwlIG5nxrDhu51pIGxhbyDEkeG7mW5nIGtow7RuZyBjxrAgdHLDuiB04bqhaSBtaeG7gW4gTmFtIEhvYSBL4buzIHbDoCAgYHIgdGFibGUoZDEkc291dGgpIFsyXS9zdW0obnJvdyhkMSkpKjEwMGBcJSBuZ8aw4budaSBsYW8gxJHhu5luZyBjxrAgdHLDuiB04bqhaSBtaeG7gW4gTmFtIEhvYSBr4buzLiAgICAgDQoNCiogKlRy4buxYyBxdWFuIGjDs2EqICAgDQpgYGB7cixlY2hvPVRSVUV9DQojIENodXnhu4NuIHRow6BuaCBkYXRhIGZyYW1lIMSR4buDIGdncGxvdCB44butIGzDvQ0Kc291dGhfZGYgPC0gYXMuZGF0YS5mcmFtZShzb3V0aDEpDQpjb2xuYW1lcyhzb3V0aF9kZikgPC0gYygic291dGgiLCAicHJvcG9ydGlvbiIpDQoNCiMgxJDhu5VpIG5ow6NuIHRow6BuaCB0aeG6v25nIFZp4buHdA0Kc291dGhfZGYkc291dGggPC0gZmFjdG9yKHNvdXRoX2RmJHNvdXRoLA0KICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVscyA9IGMoIm5vIiwgInllcyIpLA0KICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoIktow7RuZyBjxrAgdHLDuiB04bqhaSBtaeG7gW4gTmFtIiwgIkPGsCB0csO6IHThuqFpIG1p4buBbiBOYW0iKSkNCg0KDQpnZ3Bsb3Qoc291dGhfZGYsIGFlcyh4ID0gc291dGgsIHkgPSBwcm9wb3J0aW9uLCBmaWxsID0gc291dGgpKSArDQogIGdlb21fY29sKHdpZHRoID0gMC42KSArDQogIGdlb21fdGV4dChhZXMobGFiZWwgPSBwYXN0ZTAocm91bmQocHJvcG9ydGlvbiAqIDEwMCwgMSksICIlIikpLA0KICAgICAgICAgICAgdmp1c3QgPSAtMC4zLCBzaXplID0gNSwgZm9udGZhY2UgPSAiYm9sZCIpICsNCiAgbGFicyh0aXRsZSA9ICJU4bu3IGzhu4cgbmfGsOG7nWkgbGFvIMSR4buZbmcgdGhlbyBraHUgduG7sWMgY8awIHRyw7oiLA0KICAgICAgIHggPSAiS2h1IHbhu7FjIGPGsCB0csO6IiwNCiAgICAgICB5ID0gIlThu7cgbOG7hyIsDQogICAgICAgZmlsbCA9ICJLaHUgduG7sWMgY8awIHRyw7oiKSArDQogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGMoIktow7RuZyBjxrAgdHLDuiB04bqhaSBtaeG7gW4gTmFtIiA9ICJwaW5rIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ8awIHRyw7ogdOG6oWkgbWnhu4FuIE5hbSIgPSAic3RlZWxibHVlIikpICsNCiAgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscyA9IHNjYWxlczo6cGVyY2VudF9mb3JtYXQoYWNjdXJhY3kgPSAxKSwNCiAgICAgICAgICAgICAgICAgICAgIGxpbWl0cyA9IGMoMCwgbWF4KHNvdXRoX2RmJHByb3BvcnRpb24pICsgMC4xKSkgKw0KICB0aGVtZV9taW5pbWFsKGJhc2Vfc2l6ZSA9IDE0KQ0KYGBgICAgDQoNCiogKk5o4bqtbiB4w6l0OiogICANClRyb25nIGLhu5kgZOG7ryBsaeG7h3UgbsOgeSwgxJFhIHPhu5EgbmfGsOG7nWkgbGFvIMSR4buZbmcga2jDtG5nIGPGsCB0csO6IHThuqFpIG1p4buBbiBOYW0gSG9hIEvhu7MsIGPhu6UgbMOgIDcwLjc5JSwgdMawxqFuZyDhu6luZyB24bubaSAyOTU2IG5nxrDhu51pIHRyb25nIHThu5VuZyBz4buRIG5nxrDhu51pIGxhbyDEkeG7mW5nIMSRxrDhu6NjIGto4bqjbyBzw6F0LCBjaOG7iSBjw7MgMjkuMDMlIG5nxrDhu51pIGxhbyDEkeG7mW5nIGPGsCB0csO6IHThuqFpIG1p4buBbiBOYW0gSG9hIEvhu7MuIEPDsyB0aOG7gyB0aOG6pXkgxJHGsOG7o2MgcGjhuqduIGzhu5tuIGzhu7FjIGzGsOG7o25nIGxhbyDEkeG7mW5nIHRyb25nIGLhu5kgZOG7ryBsaeG7h3UgbsOgeSB04bqtcCB0cnVuZyDhu58gY8OhYyBraHUgduG7sWMga2jDoWMgY+G7p2EgSG9hIEvhu7MuIMSQaeG7gXUgbsOgeSDEkcaw4bujYyBtaW5oIGjhu41hIHRy4buxYyBxdWFuIGLhurFuZyBiaeG7g3UgxJHhu5MuICAgIA0KDQoqKkJp4bq/biBgc21zYWAqKiAgIA0KQmnhur9uIGBzbXNhYCBsw6AgbeG7mXQgYmnhur9uIG5o4buLIHBow6JuIGJp4buDdSB0aOG7iyBsaeG7h3UgbmfGsOG7nWkgbGFvIMSR4buZbmcgY8OzIGPGsCB0csO6IHThuqFpIGtodSB24buxYyDEkcO0IHRo4buLIGzhu5tuIGPhu6dhIEhvYSBL4buzIGhheSBraMO0bmcuIFbhu5tpIGJp4buHdSBoaeG7h24gIk5vIiBsw6AgbmfGsOG7nWkgbGFvIMSR4buZbmcga2jDtG5nIGPGsCB0csO6IHThuqFpIHbDuW5nIMSRw7QgdGjhu4sgbOG7m24gKHThu6ljIGzDoCBuZ8aw4budaSBsYW8gxJHhu5luZyBzaW5oIHPhu5FuZyB04bqhaSBraHUgduG7sWMgbsO0bmcgdGjDtG4gaG/hurdjIHRo4buLIHRy4bqlbiBuaOG7jykgdsOgIGJp4buDdSBoaeG7h24gIlllcyIgbMOgIG5nxrDhu51pIGxhbyDEkeG7mW5nIGPGsCB0csO6IHThuqFpIHbDuW5nIMSRw7QgdGjhu4sgbOG7m24uICAgDQoNCiogKkLhuqNuZyB04bqnbiBz4buRKiAgIA0KYGBge3IsZWNobz1UUlVFfQ0KdGFibGUoZDEkc21zYSkNCmBgYA0KKiAqQuG6o25nIHThuqduIHN14bqldCogICANCg0KYGBge3IsZWNobz1UUlVFfQ0Kc21zYTEgPC0gdGFibGUoZDEkc21zYSkvc3VtKG5yb3coZDEpKQ0Kc21zYTENCmBgYA0KVuG6rXkgdHJvbmcgYuG7mSBk4buvIGxp4buHdSBuw6B5IGPDsyBgciB0YWJsZShkMSRzbXNhKVsxXS9zdW0obnJvdyhkMSkpKjEwMGBcJSBuZ8aw4budaSBsYW8gxJHhu5luZyBraMO0bmcgY8awIHRyw7ogdOG6oWkgdsO5bmcgxJHDtCB0aOG7iyBs4bubbiBj4bunYSBIb2EgS+G7syB2w6AgIGByIHRhYmxlKGQxJHNvdXRoKSBbMl0vc3VtKG5yb3coZDEpKSoxMDBgXCUgbmfGsOG7nWkgbGFvIMSR4buZbmcgY8awIHRyw7ogdOG6oWkgdsO5bmcgxJHDtCB0aOG7iyBs4bubbiBj4bunYSBIb2Ega+G7sy4gICANCg0KKiAqVHLhu7FjIHF1YW4gaMOzYSogICANCmBgYHtyLGVjaG89VFJVRX0NCiMgQ2h1eeG7g24gdGjDoG5oIGRhdGEgZnJhbWUgxJHhu4MgZ2dwbG90IHjhu60gbMO9DQpzbXNhX2RmIDwtIGFzLmRhdGEuZnJhbWUoc21zYTEpDQpjb2xuYW1lcyhzbXNhX2RmKSA8LSBjKCJzbXNhIiwgInByb3BvcnRpb24iKQ0KDQojIMSQ4buVaSBuaMOjbiB0aMOgbmggdGnhur9uZyBWaeG7h3QNCnNtc2FfZGYkc21zYSA8LSBmYWN0b3Ioc21zYV9kZiRzbXNhLA0KICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVscyA9IGMoIm5vIiwgInllcyIpLA0KICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoIktow7RuZyBz4buRbmcg4bufIMSRw7QgdGjhu4sgbOG7m24iLCAiU+G7kW5nIOG7nyDEkcO0IHRo4buLIGzhu5tuIikpDQoNCg0KZ2dwbG90KHNtc2FfZGYsIGFlcyh4ID0gc21zYSwgeSA9IHByb3BvcnRpb24sIGZpbGwgPSBzbXNhKSkgKw0KICBnZW9tX2NvbCh3aWR0aCA9IDAuNikgKw0KICBnZW9tX3RleHQoYWVzKGxhYmVsID0gcGFzdGUwKHJvdW5kKHByb3BvcnRpb24gKiAxMDAsIDEpLCAiJSIpKSwNCiAgICAgICAgICAgIHZqdXN0ID0gLTAuMywgc2l6ZSA9IDUsIGZvbnRmYWNlID0gImJvbGQiKSArDQogIGxhYnModGl0bGUgPSAiVOG7tyBs4buHIG5nxrDhu51pIGxhbyDEkeG7mW5nIHRoZW8gdsO5bmcgxJHDtCB0aOG7iyIsDQogICAgICAgeCA9ICJWw7luZyDEkcO0IHRo4buLIiwNCiAgICAgICB5ID0gIlThu7cgbOG7hyIpICsNCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gYygiS2jDtG5nIHPhu5FuZyDhu58gxJHDtCB0aOG7iyBs4bubbiIgPSAib3JhbmdlIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU+G7kW5nIOG7nyDEkcO0IHRo4buLIGzhu5tuIiA9ICJzdGVlbGJsdWUiKSkgKw0KICB5bGltKDAsIG1heChzbXNhX2RmJHByb3BvcnRpb24pICsgMC4wNSkgKw0KICB0aGVtZV9taW5pbWFsKCkNCmBgYA0KDQoqICpOaOG6rW4geMOpdDoqICAgDQpU4bu3IGzhu4cgbmfGsOG7nWkgbGFvIMSR4buZbmcgY8awIHRyw7ogdOG6oWkgdsO5bmcgxJHDtCB0aOG7iyBs4bubbiBjaGnhur9tIHBo4bqnbiBs4bubbiB24bubaSA2NS40JSB2w6AgMzQuNiUgY8OybiBs4bqhaSBsw6AgdOG7tyBs4buHIG5nxrDhu51pIGxhbyDEkeG7mW5nIGPGsCB0csO6IHThuqFpIGPDoWMga2h1IHbhu7FjIG7DtG5nIHRow7RuIHbDoCB0aOG7iyB0cuG6pW4gbmjhu48uIENobyB0aOG6pXkgxJHGsOG7o2MgbeG7mXQgeHUgaMaw4bubbmcgcsO1IHLhu4d0IHThuq1wIHRydW5nIGPhu6dhIG5nxrDhu51pIGxhbyDEkeG7mW5nIHThuqFpIGPDoWMgdsO5bmcgxJHDtCB0aOG7iyBs4bubbi4gVuG7m2kgaMahbiAyLzMgc+G7kSBuZ8aw4budaSBsYW8gxJHhu5luZyDEkcaw4bujYyBraOG6o28gc8OhdCBjxrAgdHLDuiB04bqhaSBjw6FjIGtodSB24buxYyBuw6B5LCBwaOG6o24gw6FuaCBz4buxIHThuq1wIHRydW5nIGPhu6dhIGPGoSBo4buZaSB2aeG7h2MgbMOgbSwgZOG7i2NoIHbhu6UgdsOgIGPDoWMgdGnhu4duIMOtY2gga2jDoWMg4bufIGPDoWMgdGjDoG5oIHBo4buRIGzhu5tuLiAgIA0KDQoqKkJp4bq/biBgbWFycmllZGAqKiAgIA0KQmnhur9uIGBtYXJyaWVkYCBsw6AgbeG7mXQgYmnhur9uIG5o4buLIHBow6JuIGJp4buDdSB0aOG7iyB0cuG6oW5nIHRow6FpIGjDtG4gbmjDom4gY+G7p2EgbmfGsOG7nWkgbGFvIMSR4buZbmcgxJHGsOG7o2Mga2jhuqNvIHPDoXQuIFbhu5tpIHRy4bqhbmcgdGjDoWkgIk5vIiBsw6AgY2jGsGEga+G6v3QgaMahbiB2w6AgIlllcyIgbMOgIMSRw6Mga+G6v3QgaMO0bi4gICANCg0KKiAqQuG6o25nIHThuqduIHPhu5EqICAgDQpgYGB7cixlY2hvPVRSVUV9DQoNCnRhYmxlKGQxJG1hcnJpZWQpDQoNCmBgYA0KDQoqICpC4bqjbmcgdOG6p24gc3XhuqV0KiAgIA0KYGBge3IsZWNobz1UUlVFfQ0KDQptYXJyaWVkMSA8LSB0YWJsZShkMSRtYXJyaWVkKS8gc3VtKG5yb3coZDEpKQ0KbWFycmllZDENCmBgYA0KKiAqVHLhu7FjIHF1YW4gaMOzYSogICANCmBgYHtyLGVjaG89VFJVRX0NCg0KIyBDaHV54buDbiB0aMOgbmggZGF0YSBmcmFtZSDEkeG7gyBnZ3Bsb3QgeOG7rSBsw70NCm1hcnJpZWRfZGYgPC0gYXMuZGF0YS5mcmFtZShtYXJyaWVkMSkNCmNvbG5hbWVzKG1hcnJpZWRfZGYpIDwtIGMoIm1hcnJpZWQiLCAicHJvcG9ydGlvbiIpDQoNCiMgxJDhu5VpIG5ow6NuIHRow6BuaCB0aeG6v25nIFZp4buHdA0KbWFycmllZF9kZiRtYXJyaWVkIDwtIGZhY3RvcihtYXJyaWVkX2RmJG1hcnJpZWQsDQogICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzID0gYygibm8iLCAieWVzIiksDQogICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygiQ2jGsGEga+G6v3QgaMO0biIsICLEkMOjIGvhur90IGjDtG4iKSkNCg0KDQpnZ3Bsb3QobWFycmllZF9kZiwgYWVzKHggPSBtYXJyaWVkLCB5ID0gcHJvcG9ydGlvbiwgZmlsbCA9IG1hcnJpZWQpKSArDQogIGdlb21fY29sKHdpZHRoID0gMC42KSArDQogIGdlb21fdGV4dChhZXMobGFiZWwgPSBwYXN0ZTAocm91bmQocHJvcG9ydGlvbiAqIDEwMCwgMSksICIlIikpLA0KICAgICAgICAgICAgdmp1c3QgPSAtMC4zLCBzaXplID0gNSwgZm9udGZhY2UgPSAiYm9sZCIpICsNCiAgbGFicyh0aXRsZSA9ICJU4bu3IGzhu4cgbmfGsOG7nWkgbGFvIMSR4buZbmcgdGhlbyB0w6xuaCB0cuG6oW5nIGjDtG4gbmjDom4iLA0KICAgICAgIHggPSAiVHLhuqFuZyB0aMOhaSBow7RuIG5ow6JuIiwNCiAgICAgICB5ID0gIlThu7cgbOG7hyIpICsNCiAgIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGMoIkNoxrBhIGvhur90IGjDtG4iID0gImxpZ2h0Ymx1ZSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIsSQw6Mga+G6v3QgaMO0biIgPSAiZGFya2JsdWUiKSkgKw0KICB5bGltKDAsIG1heChtYXJyaWVkX2RmJHByb3BvcnRpb24pICsgMC4wNSkgKw0KICB0aGVtZV9taW5pbWFsKCkNCg0KYGBgICANCg0KKiAqTmjhuq1uIHjDqXQ6KiAgIA0KVOG7tyBs4buHIG5nxrDhu51pIMSRw6Mga+G6v3QgaMO0biBjaGnhur9tIMSRYSBz4buRIHbhu5tpIDgxLjQlLCB0xrDGoW5nIOG7qW5nIHbhu5tpIDMzOTIgbmfGsOG7nWkgbGFvIMSR4buZbmcgxJHGsOG7o2Mga2jhuqNvIHPDoXQuIENo4buJIGPDsm4gbOG6oWkgMTguNiUgdOG7tyBs4buHIG5nxrDhu51pIGxhbyDEkeG7mW5nLCB0xrDGoW5nIOG7qW5nIHbhu5tpIDc3MyBuZ8aw4budaSBjaMawYSBr4bq/dCBow7RuLiDEkGnhu4F1IG7DoHkgY2hvIHRo4bqleSBwaOG6p24gbOG7m24gbmfGsOG7nWkgbGFvIMSR4buZbmcgdOG6oWkgSG9hIEvhu7MgxJHGsOG7o2Mga2jhuqNvIHPDoXQgdHJvbmcgdOG6rXAgZOG7ryBsaeG7h3UgbsOgeSDEkcOjIGvhur90IGjDtG4gdsOgIHThu7cgbOG7hyBuZ8aw4budaSBsYW8gxJHhu5luZyDEkcOjIGvhur90IGjDtG4gY2FvIGfhuqVwIDQgbOG6p24gc28gduG7m2kgdOG7tyBs4buHIG5nxrDhu51pIGNoxrBhIGvhur90IGjDtG4uDQoNCioqQmnhur9uIGBzZXhgKiogICAgICANCkJp4bq/biBgc2V4YCB0cm9uZyBi4buZIGThu68gbGnhu4d1IG7DoHkgbMOgIG3hu5l0IGJp4bq/biBuaOG7iyBwaMOibiBjaG8gYmnhur90IGdp4bubaSB0w61uaCBj4bunYSB04burbmcgbmfGsOG7nWkgbGFvIMSR4buZbmcgdOG6oWkgSG9hIEvhu7MgxJHGsOG7o2Mga2jhuqNvIHPDoXQuIFbhu5tpIHRy4bqhbmcgdGjDoWkgImZlbWFsZSIgbMOgIGdp4bubaSB0w61uaCBu4buvIHbDoCAibWFsZSIgbMOgIGdp4bubaSB0w61uaCBuYW0uICAgIA0KDQoqICpC4bqjbmcgdOG6p24gc+G7kSogICANCmBgYHtyLGVjaG89VFJVRX0NCg0KdGFibGUoZDEkc2V4KQ0KDQpgYGANCg0KKiAqQuG6o25nIHThuqduIHN14bqldCogICANCmBgYHtyLGVjaG89VFJVRX0NCg0Kc2V4MSA8LSB0YWJsZShkMSRzZXgpL3N1bShucm93KGQxKSkNCnNleDENCg0KYGBgDQoNCiogKlRy4buxYyBxdWFuIGjDs2EqICAgDQpgYGB7cixlY2hvPVRSVUV9DQoNCiMgQ2h1eeG7g24gdGjDoG5oIGRhdGEgZnJhbWUgxJHhu4MgZ2dwbG90IHjhu60gbMO9DQpzZXhfZGYgPC0gYXMuZGF0YS5mcmFtZShzZXgxKQ0KY29sbmFtZXMoc2V4X2RmKSA8LSBjKCJzZXgiLCAicHJvcG9ydGlvbiIpDQoNCiMgxJDhu5VpIG5ow6NuIHRow6BuaCB0aeG6v25nIFZp4buHdA0Kc2V4X2RmJHNleCA8LSBmYWN0b3Ioc2V4X2RmJHNleCwNCiAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbHMgPSBjKCJmZW1hbGUiLCAibWFsZSIpLA0KICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoIkdp4bubaSB0w61uaCBu4buvIiwgIkdp4bubaSB0w61uaCBuYW0iKSkNCg0KDQpnZ3Bsb3Qoc2V4X2RmLCBhZXMoeCA9IHNleCwgeSA9IHByb3BvcnRpb24sIGZpbGwgPSBzZXgpKSArDQogIGdlb21fY29sKHdpZHRoID0gMC42KSArDQogIGdlb21fdGV4dChhZXMobGFiZWwgPSBwYXN0ZTAocm91bmQocHJvcG9ydGlvbiAqIDEwMCwgMSksICIlIikpLA0KICAgICAgICAgICAgdmp1c3QgPSAtMC4zLCBzaXplID0gNSwgZm9udGZhY2UgPSAiYm9sZCIpICsNCiAgbGFicyh0aXRsZSA9ICJU4bu3IGzhu4cgbmfGsOG7nWkgbGFvIMSR4buZbmcgdGhlbyB0w6xuaCB0cuG6oW5nIGdp4bubaSB0w61uaCIsDQogICAgICAgeCA9ICJUw6xuaCB0cuG6oW5nIGdp4bubaSB0w61uaCIsDQogICAgICAgeSA9ICJU4bu3IGzhu4ciKSArDQogICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjKCJHaeG7m2kgdMOtbmggbuG7ryIgPSAib3JhbmdlIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiR2nhu5tpIHTDrW5oIG5hbSIgPSAic2VhZ3JlZW4iKSkgKw0KICB5bGltKDAsIG1heChzZXhfZGYkcHJvcG9ydGlvbikgKyAwLjA1KSArDQogIHRoZW1lX21pbmltYWwoKQ0KDQoNCmBgYA0KDQoqICpOaOG6rW4geMOpdDoqICAgDQpU4bu3IGzhu4cgbmfGsOG7nWkgbGFvIMSR4buZbmcgbmFtIGNoaeG6v20gcGjhuqduIMOhcCDEkeG6o28gduG7m2kgODguNyUsIHTGsMahbmcg4bupbmcgMzY5NiBuZ8aw4budaSB2w6AgdOG7tyBs4buHIG5nxrDhu51pIGxhbyDEkeG7mW5nIG7hu68gY2jhu4kgY2hp4bq/bSAxMS4zJSwgdMawxqFuZyDhu6luZyB24bubaSA0NjkgbmfGsOG7nWkuIMSQaeG7gXUgbsOgeSBjaG8gdGjhuqV5IHPhu5EgbMaw4bujbmcgbmfGsOG7nWkgbGFvIMSR4buZbmcgbmFtIMSRxrDhu6NjIGto4bqjbyBzw6F0IHRyb25nIGLhu5kgZOG7ryBsaeG7h3UgbsOgeSDEkcO0bmcgaMahbiBy4bqldCBuaGnhu4F1IHNvIHbhu5tpIG5nxrDhu51pIGxhbyDEkeG7mW5nIG7hu68sIGNhbyBn4bqlcCBn4bqnbiA4IGzhuqduLiAgICANCg0KKipCaeG6v24gYGJsYWNrYCoqICAgICAgDQpCaeG6v24gYGJsYWNrYCBiaeG7g3UgdGjhu4sgbmfGsOG7nWkgbGFvIMSR4buZbmcgY8OzIHBo4bqjaSBsw6AgbmfGsOG7nWkgZGEgxJFlbiBoYXkga2jDtG5nLiBW4bubaSAiTm8iIGzDoCBuZ8aw4budaSBsYW8gxJHhu5luZyBraMO0bmcgcGjhuqNpIGzDoCBuZ8aw4budaSBkYSDEkWVuIHbDoCAiWWVzIiBsw6AgbmfGsOG7nWkgbGFvIMSR4buZbmcgbMOgIG5nxrDhu51pIGRhIMSRZW4uICAgICANCg0KKiAqQuG6o25nIHThuqduIHPhu5EqICAgDQpgYGB7cixlY2hvPVRSVUV9DQoNCnRhYmxlKGQxJGJsYWNrKQ0KDQpgYGANCg0KKiAqQuG6o25nIHThuqduIHN14bqldCogICANCmBgYHtyLGVjaG89VFJVRX0NCmJsYWNrMSA8LSB0YWJsZShkMSRibGFjaykvc3VtKG5yb3coZDEpKQ0KYmxhY2sxDQpgYGANCg0KKiAqVHLhu7FjIHF1YW4gaMOzYSogICAgDQpgYGB7cixlY2hvPVRSVUV9DQoNCiMgQ2h1eeG7g24gdGjDoG5oIGRhdGEgZnJhbWUgxJHhu4MgZ2dwbG90IHjhu60gbMO9DQpibGFja19kZiA8LSBhcy5kYXRhLmZyYW1lKGJsYWNrMSkNCmNvbG5hbWVzKGJsYWNrX2RmKSA8LSBjKCJibGFjayIsICJwcm9wb3J0aW9uIikNCg0KIyDEkOG7lWkgbmjDo24gdGjDoG5oIHRp4bq/bmcgVmnhu4d0DQpibGFja19kZiRibGFjayA8LSBmYWN0b3IoYmxhY2tfZGYkYmxhY2ssDQogICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzID0gYygibm8iLCAieWVzIiksDQogICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygiS2jDtG5nIHBo4bqjaSBuZ8aw4budaSBkYSDEkWVuIiwgIk5nxrDhu51pIGRhIMSRZW4iKSkNCg0KDQpnZ3Bsb3QoYmxhY2tfZGYsIGFlcyh4ID0gYmxhY2ssIHkgPSBwcm9wb3J0aW9uLCBmaWxsID0gYmxhY2spKSArDQogIGdlb21fY29sKHdpZHRoID0gMC42KSArDQogIGdlb21fdGV4dChhZXMobGFiZWwgPSBwYXN0ZTAocm91bmQocHJvcG9ydGlvbiAqIDEwMCwgMSksICIlIikpLA0KICAgICAgICAgICAgdmp1c3QgPSAtMC4zLCBzaXplID0gNSwgZm9udGZhY2UgPSAiYm9sZCIpICsNCiAgbGFicyh0aXRsZSA9ICJU4bu3IGzhu4cgbmfGsOG7nWkgbGFvIMSR4buZbmcgdGhlbyB0w6xuaCB0cuG6oW5nIGNo4bunbmcgdOG7mWMiLA0KICAgICAgIHggPSAiVMOsbmggdHLhuqFuZyBjaOG7p25nIHThu5ljIiwNCiAgICAgICB5ID0gIlThu7cgbOG7hyIpICsNCiAgIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGMoIktow7RuZyBwaOG6o2kgbmfGsOG7nWkgZGEgxJFlbiIgPSAic2FsbW9uIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTmfGsOG7nWkgZGEgxJFlbiIgPSAicmVkIikpICsNCiAgeWxpbSgwLCBtYXgoYmxhY2tfZGYkcHJvcG9ydGlvbikgKyAwLjA1KSArDQogIHRoZW1lX21pbmltYWwoKQ0KDQpgYGANCg0KKiAqTmjhuq1uIHjDqXQ6KiAgIA0KVOG7tyBs4buHIG5nxrDhu51pIGxhbyDEkeG7mW5nIGtow7RuZyBwaOG6o2kgbMOgIG5nxrDhu51pIGRhIMSRZW4gY2hp4bq/bSBwaOG6p24gbOG7m24gw6FwIMSR4bqjbyB24bubaSA5Mi44JSwgdMawxqFuZyDhu6luZyAzODY0IG5nxrDhu51pLiBDaOG7iSBjw7MgNy4yJSB0xrDGoW5nIOG7qW5nIDMwMSBuZ8aw4budaSBsYW8gxJHhu5luZyDEkcaw4bujYyBraOG6o28gc8OhdCBsw6AgbmfGsOG7nWkgZGEgxJFlbi4gQ8OzIHPhu7EgY2jDqm5oIGzhu4djaCBs4bubbiB24buBIHThu7cgbOG7hyBjaOG7p25nIHThu5ljIHRyb25nIGLhu5kgZOG7ryBsaeG7h3UgbmfGsOG7nWkgbGFvIMSR4buZbmcgxJHGsOG7o2Mga2jhuqNvIHPDoXQgbsOgeSwgduG7m2kgbmjDs20ga2jDtG5nIHBo4bqjaSBsw6AgbmfGsOG7nWkgZGEgxJFlbiBjaGnhur9tIMawdSB0aOG6vyByw7UgcuG7h3QuICAgDQoNCiMjIFBow6JuIHTDrWNoIG3hu5FpIHF1YW4gaOG7hyBnaeG7r2Egdmnhu4djIHRoYW0gZ2lhIGPDtG5nIMSRb8OgbiBj4bunYSBuZ8aw4budaSBsYW8gxJHhu5luZyB24bubaSBjw6FjIMSR4bq3YyDEkWnhu4NtIG5ow6JuIGto4bqpdSBo4buNYyBraMOhYyAgDQojIyMgS2nhu4NtIMSR4buLbmggdMOtbmggxJHhu5ljIGzhuq1wIGPhu6dhIGJp4bq/biBwaOG7pSB0aHXhu5ljIGzDoCBiaeG6v24gYHVuaW9uYA0KS2nhu4NtIMSR4buLbmggQ2hpIGLDrG5oIHBoxrDGoW5nIChDaGktc3F1YXJlZCB0ZXN0KSDEkcaw4bujYyBz4butIGThu6VuZyDEkeG7gyDEkcOhbmggZ2nDoSBt4buRaSBxdWFuIGjhu4cgZ2nhu69hIGhhaSBiaeG6v24uIEPhu6UgdGjhu4MgbMOgIGtp4buDbSDEkeG7i25oIG7DoHkgeMOhYyDEkeG7i25oIGhhaSBiaeG6v24gY8OzIMSR4buZYyBs4bqtcCB24bubaSBuaGF1IGtow7RuZy4gICANCkdp4bqjIHRodXnhur90IGtp4buDbSDEkeG7i25oOiAgIA0KICQkDQpcYmVnaW57Y2FzZXN9IA0KSF8wOiBcdGV4dHtIYWkgYmnhur9uIGzDoCDEkeG7mWMgbOG6rXAgKGtow7RuZyBjw7MgbeG7kWkgbGnDqm4gaOG7hykufSBcXA0KSF8xOiBcdGV4dHtIYWkgYmnhur9uIGtow7RuZyDEkeG7mWMgbOG6rXAgKG3hu5FpIGxpw6puIGjhu4cpLn0NClxlbmR7Y2FzZXN9DQogICQkDQpUaOG7kW5nIGvDqiBDaGkgYsOsbmggcGjGsMahbmc6ICAgICAgDQokJCBcY2hpXjIgPSBcc3VtIFxmcmFjeyhPX3tpan0gLSBFX3tpan0pXjJ9e0Vfe2lqfX0gJCQgICAgICAgDQpUcm9uZyDEkcOzOiAgIA0KKiRPX3tpan0kIGzDoCB04bqnbiBzdeG6pXQgcXVhbiBzw6F0LCAgICANCipHacOhIHRy4buLIGvhu7MgduG7jW5nICRFX3tpan0kIHThuqFpIMO0ICQoaSwgaikkIMSRxrDhu6NjIHTDrW5oIGLhurFuZyBjw7RuZyB0aOG7qWM6JCQgRV97aWp9ID0gXGZyYWN7bl9pIFx0aW1lcyBuX3tqfX17bn0gJCQgVuG7m2k6ICAgDQogICokbl97aX0kOiB04buVbmcgdOG6p24gc3XhuqV0IGjDoG5nICRpJCwgICANCiAgKiRuX3tqfSQ6IHThu5VuZyB04bqnbiBzdeG6pXQgY+G7mXQgJGokLCAgICANCiAgKiRuJDogdOG7lW5nIHThuqV0IGPhuqMgcXVhbiBzw6F0LiAgIA0KKiAqKkJp4bq/biBgdW5pb25gIHbDoCBiaeG6v24gYGJsdWVjb2xgKiogICANCkdp4bqjIHRodXnhur90OiAgIA0KJCQNClxiZWdpbntjYXNlc30gDQpIXzA6IFx0ZXh0e3VuaW9uIHbDoCBibHVlY29sIGzDoCDEkeG7mWMgbOG6rXAufSBcXA0KSF8xOiBcdGV4dHt1bmlvbiB2w6AgYmx1ZWNvbCBsw6Aga2jDtG5nIMSR4buZYyBs4bqtcC59DQpcZW5ke2Nhc2VzfQ0KJCQNCg0KYGBge3IsZWNobz1UUlVFfQ0KY2hpc3EudGVzdCh0YWJsZShkMSR1bmlvbixkMSRibHVlY29sKSkNCmBgYA0KKipOaOG6rW4geMOpdDoqKkvhur90IHF14bqjIGtp4buDbSDEkeG7i25oIGNobyB0aOG6pXkgcC12YWx1ZSAkPCAyLjIgXHRpbWVzIDEwXnstMTZ9JCwgduG6rXkgcC12YWx1ZSAkPDAuMDUkLiBCw6FjIGLhu48gZ2nhuqMgdGh1eeG6v3QgJEhfMCQuIEvhur90IGx14bqtbiDEkcaw4bujYyBy4bqxbmcgY8OzIG3hu5FpIHF1YW4gaOG7hyBjw7Mgw70gbmdoxKlhIHRo4buRbmcga8OqIGdp4buvYSB2aeG7h2MgbmfGsOG7nWkgbGFvIMSR4buZbmcgY8OzIHRoYW0gZ2lhIGPDtG5nIMSRb8OgbiAodW5pb24pIGhheSBraMO0bmcgdsOgIHZp4buHYyBo4buNIGPDsyBsw6BtIHZp4buHYyB0aHXhu5ljIG5ow7NtIG5nw6BuaCBjaMOibiB0YXkgaG/hurdjIGvhu7kgdGh14bqtdCBoYXkga2jDtG5nLiAgIA0KDQoqICoqQmnhur9uIGB1bmlvbmAgdsOgIGJp4bq/biBgaW5kYCoqICAgDQpHaeG6oyB0aHV54bq/dDogICANCiQkDQpcYmVnaW57Y2FzZXN9IA0KSF8wOiBcdGV4dHt1bmlvbiB2w6AgaW5kIGzDoCDEkeG7mWMgbOG6rXAufSBcXA0KSF8xOiBcdGV4dHt1bmlvbiB2w6AgaW5kIGzDoCBraMO0bmcgxJHhu5ljIGzhuq1wLn0NClxlbmR7Y2FzZXN9DQokJA0KDQpgYGB7cixlY2hvPVRSVUV9DQpjaGlzcS50ZXN0KHRhYmxlKGQxJHVuaW9uLGQxJGluZCkpDQpgYGANCioqTmjhuq1uIHjDqXQ6KiogS+G6v3QgcXXhuqMga2nhu4NtIMSR4buLbmggY2hvIHRo4bqleSBwLXZhbHVlICQ8IDIuMiBcdGltZXMgMTBeey0xNn0kLCB24bqteSBwLXZhbHVlICQ8MC4wNSQuIELDoWMgYuG7jyBnaeG6oyB0aHV54bq/dCAkSF8wJC4gS+G6v3QgbHXhuq1uIMSRxrDhu6NjIHLhurFuZyBjw7MgbeG7kWkgcXVhbiBo4buHIGPDsyDDvSBuZ2jEqWEgdGjhu5FuZyBrw6ogZ2nhu69hIHZp4buHYyBuZ8aw4budaSBsYW8gxJHhu5luZyBjw7MgdGhhbSBnaWEgY8O0bmcgxJFvw6BuIGhheSBraMO0bmcgdsOgIHZp4buHYyBo4buNIGPDsyBsw6BtIHZp4buHYyB0cm9uZyBuZ8Ogbmggc+G6o24geHXhuqV0IGhheSBraMO0bmcuICAgDQoNCiogKipCaeG6v24gYHVuaW9uYCB2w6AgYmnhur9uIGBzb3V0aGAqKiAgIA0KR2nhuqMgdGh1eeG6v3Q6ICAgDQokJA0KXGJlZ2lue2Nhc2VzfSANCkhfMDogXHRleHR7dW5pb24gdsOgIHNvdXRoIGzDoCDEkeG7mWMgbOG6rXAufSBcXA0KSF8xOiBcdGV4dHt1bmlvbiB2w6Agc291dGggbMOgIGtow7RuZyDEkeG7mWMgbOG6rXAufQ0KXGVuZHtjYXNlc30NCiQkDQoNCmBgYHtyLGVjaG89VFJVRX0NCmNoaXNxLnRlc3QodGFibGUoZDEkdW5pb24sZDEkc291dGgpKQ0KYGBgDQoqKk5o4bqtbiB4w6l0OioqIEvhur90IHF14bqjIGtp4buDbSDEkeG7i25oIGNobyB0aOG6pXkgcC12YWx1ZSAkPCAyLjIgXHRpbWVzIDEwXnstMTZ9JCwgduG6rXkgcC12YWx1ZSAkPDAuMDUkLiBCw6FjIGLhu48gZ2nhuqMgdGh1eeG6v3QgJEhfMCQuIEvhur90IGx14bqtbiDEkcaw4bujYyBy4bqxbmcgY8OzIG3hu5FpIHF1YW4gaOG7hyBjw7Mgw70gbmdoxKlhIHRo4buRbmcga8OqIGdp4buvYSB2aeG7h2MgbmfGsOG7nWkgbGFvIMSR4buZbmcgY8OzIHRoYW0gZ2lhIGPDtG5nIMSRb8OgbiBoYXkga2jDtG5nIHbDoCB2aeG7h2MgaOG7jSBjw7MgY8awIHRyw7ogdOG6oWkgbWnhu4FuIE5hbSBIb2EgS+G7syBoYXkga2jDtG5nLiAgIA0KDQoqICoqQmnhur9uIGB1bmlvbmAgdsOgIGJp4bq/biBgc21zYWAqKiAgIA0KR2nhuqMgdGh1eeG6v3Q6ICAgDQokJA0KXGJlZ2lue2Nhc2VzfSANCkhfMDogXHRleHR7dW5pb24gdsOgIHNtc2EgbMOgIMSR4buZYyBs4bqtcC59IFxcDQpIXzE6IFx0ZXh0e3VuaW9uIHbDoCBzbXNhIGzDoCBraMO0bmcgxJHhu5ljIGzhuq1wLn0NClxlbmR7Y2FzZXN9DQokJA0KDQpgYGB7cixlY2hvPVRSVUV9DQpjaGlzcS50ZXN0KHRhYmxlKGQxJHVuaW9uLGQxJHNtc2EpKQ0KYGBgDQoqKk5o4bqtbiB4w6l0OioqIEvhur90IHF14bqjIGtp4buDbSDEkeG7i25oIGNobyB0aOG6pXkgcC12YWx1ZSAkPTAuMDg1OTYkLCB24bqteSBwLXZhbHVlICQ+MC4wNSQuIEtow7RuZyBjw7MgY8ahIHPhu58gYsOhYyBi4buPIGdp4bqjIHRodXnhur90ICRIXzAkLiBL4bq/dCBsdeG6rW4gxJHGsOG7o2MgcuG6sW5nIGtow7RuZyBjw7MgbeG7kWkgcXVhbiBo4buHIGPDsyDDvSBuZ2jEqWEgdGjhu5FuZyBrw6ogZ2nhu69hIHZp4buHYyBuZ8aw4budaSBsYW8gxJHhu5luZyBjw7MgdGhhbSBnaWEgY8O0bmcgxJFvw6BuIGhheSBraMO0bmcgdsOgIHZp4buHYyBo4buNIGPDsyBjxrAgdHLDuiB04bqhaSBjw6FjIHbDuW5nIMSRw7QgdGjhu4sgbOG7m24gY+G7p2EgSG9hIEvhu7MgaGF5IGtow7RuZy4gICANCg0KKiAqKkJp4bq/biBgdW5pb25gIHbDoCBiaeG6v24gYG1hcnJpZWRgKiogICANCkdp4bqjIHRodXnhur90OiAgIA0KJCQNClxiZWdpbntjYXNlc30gDQpIXzA6IFx0ZXh0e3VuaW9uIHbDoCBtYXJyaWVkIGzDoCDEkeG7mWMgbOG6rXAufSBcXA0KSF8xOiBcdGV4dHt1bmlvbiB2w6AgbWFycmllZCBsw6Aga2jDtG5nIMSR4buZYyBs4bqtcC59DQpcZW5ke2Nhc2VzfQ0KJCQNCg0KYGBge3IsZWNobz1UUlVFfQ0KY2hpc3EudGVzdCh0YWJsZShkMSR1bmlvbixkMSRtYXJyaWVkKSkNCmBgYA0KKipOaOG6rW4geMOpdDoqKiBL4bq/dCBxdeG6oyBraeG7g20gxJHhu4tuaCBjaG8gdGjhuqV5IHAtdmFsdWUgJD0xLjgyOCBcdGltZXMgZV57LTEzfSQsIHbhuq15IHAtdmFsdWUgJDwwLjA1JC4gQsOhYyBi4buPIGdp4bqjIHRodXnhur90ICRIXzAkLiBL4bq/dCBsdeG6rW4gxJHGsOG7o2MgcuG6sW5nIGPDsyBt4buRaSBxdWFuIGjhu4cgY8OzIMO9IG5naMSpYSB0aOG7kW5nIGvDqiBnaeG7r2Egdmnhu4djIG5nxrDhu51pIGxhbyDEkeG7mW5nIGPDsyB0aGFtIGdpYSBjw7RuZyDEkW/DoG4gaGF5IGtow7RuZyB2w6AgdMOsbmggdHLhuqFuZyBow7RuIG5ow6JuIGPhu6dhIGjhu40uICAgDQoNCiogKipCaeG6v24gYHVuaW9uYCB2w6AgYmnhur9uIGBzZXhgKiogICANCkdp4bqjIHRodXnhur90OiAgIA0KJCQNClxiZWdpbntjYXNlc30gDQpIXzA6IFx0ZXh0e3VuaW9uIHbDoCBzZXggbMOgIMSR4buZYyBs4bqtcC59IFxcDQpIXzE6IFx0ZXh0e3VuaW9uIHbDoCBzZXggbMOgIGtow7RuZyDEkeG7mWMgbOG6rXAufQ0KXGVuZHtjYXNlc30NCiQkDQoNCmBgYHtyLGVjaG89VFJVRX0NCmNoaXNxLnRlc3QodGFibGUoZDEkdW5pb24sZDEkc2V4KSkNCmBgYA0KKipOaOG6rW4geMOpdDoqKiBL4bq/dCBxdeG6oyBraeG7g20gxJHhu4tuaCBjaG8gdGjhuqV5IHAtdmFsdWUgJD0gNC4wMjcgXHRpbWVzIGVeey0xM30kLCB24bqteSBwLXZhbHVlICQ8MC4wNSQuIELDoWMgYuG7jyBnaeG6oyB0aHV54bq/dCAkSF8wJC4gS+G6v3QgbHXhuq1uIMSRxrDhu6NjIHLhurFuZyBjw7MgbeG7kWkgcXVhbiBo4buHIGPDsyDDvSBuZ2jEqWEgdGjhu5FuZyBrw6ogZ2nhu69hIHZp4buHYyBuZ8aw4budaSBsYW8gxJHhu5luZyBjw7MgdGhhbSBnaWEgY8O0bmcgxJFvw6BuIGhheSBraMO0bmcgdsOgIGdp4bubaSB0w61uaCBj4bunYSBo4buNLiAgIA0KDQoqICoqQmnhur9uIGB1bmlvbmAgdsOgIGJp4bq/biBgYmxhY2tgKiogICANCkdp4bqjIHRodXnhur90OiAgIA0KJCQNClxiZWdpbntjYXNlc30gDQpIXzA6IFx0ZXh0e3VuaW9uIHbDoCBibGFjayBsw6AgxJHhu5ljIGzhuq1wLn0gXFwNCkhfMTogXHRleHR7dW5pb24gdsOgIGJsYWNrIGzDoCBraMO0bmcgxJHhu5ljIGzhuq1wLn0NClxlbmR7Y2FzZXN9DQokJA0KDQpgYGB7cixlY2hvPVRSVUV9DQpjaGlzcS50ZXN0KHRhYmxlKGQxJHVuaW9uLGQxJGJsYWNrKSkNCmBgYA0KKipOaOG6rW4geMOpdDoqKiBL4bq/dCBxdeG6oyBraeG7g20gxJHhu4tuaCBjaG8gdGjhuqV5IHAtdmFsdWUgJD0wLjAwMjkwNiQsIHbhuq15IHAtdmFsdWUgJDwwLjA1JC4gQsOhYyBi4buPIGdp4bqjIHRodXnhur90ICRIXzAkLiBL4bq/dCBsdeG6rW4gxJHGsOG7o2MgcuG6sW5nIGPDsyBt4buRaSBxdWFuIGjhu4cgY8OzIMO9IG5naMSpYSB0aOG7kW5nIGvDqiBnaeG7r2Egdmnhu4djIG5nxrDhu51pIGxhbyDEkeG7mW5nIGPDsyB0aGFtIGdpYSBjw7RuZyDEkW/DoG4gaGF5IGtow7RuZyB2w6AgY2jhu6duZyB04buZYyBj4bunYSBo4buNLiAgICAgIA0KDQoqKkvhur90IGx14bqtbjoqKiBTYXUga2hpIHRo4buxYyBoaeG7h24ga2nhu4NtIMSR4buLbmggdMOtbmggxJHhu5ljIGzhuq1wIGNobyBjw6FjIGPhurdwIGJp4bq/biwga+G6v3QgcXXhuqMgbmjhuq1uIMSRxrDhu6NjIGNobyB0aOG6pXkgY2jhu4kgY8OzIGR1eSBuaOG6pXQgYmnhur9uIHNtc2EgbMOgIGtow7RuZyBjw7Mg4bqjbmggaMaw4bubbmcgxJHhur9uIGJp4bq/biB1bmlvbi4gVGnhur9wIHRoZW8gdGjhu7FjIGhp4buHbiB0aOG7kW5nIGvDqiBtw7QgdOG6oyBoYWkgYmnhur9uIMSR4buDIGPDsyBjw6FpIG5ow6xuIHLDtSByw6BuZyBoxqFuIHbhu4EgbeG7qWMgxJHhu5kg4bqjbmggaMaw4bufbmcgY+G7p2EgY8OhYyDEkeG6t2MgxJFp4buDbSBuaMOibiBraOG6qXUgaOG7jWMga2jDoWMgbMOqbiDEkeG6t2MgxJFp4buDbSB0w6xuaCB0cuG6oW5nIHRoYW0gZ2lhIGPDtG5nIMSRb8OgbiBj4bunYSBuZ8aw4budaSBsYW8gxJHhu5luZyDEkcaw4bujYyBraOG6o28gc8OhdC4gICANCg0KIyMjIFRo4buRbmcga8OqIG3DtCB04bqjIDIgYmnhur9uIA0KDQojIyMjIEJp4bq/biBgdW5pb25gIHbDoCBiaeG6v24gYGJsdWVjb2xgDQoNCiogKkLhuqNuZyB04bqnbiBzdeG6pXQgY2jDqW8qICAgDQoNCmBgYHtyLGVjaG89VFJVRX0NCiMgQuG6o25nIHThuqduIHN14bqldCBjaMOpbyB24bubaSBuaMOjbiByw7UgcsOgbmcsIGtow7RuZyB04bqhbyB0aMOqbSBj4buZdA0KcyA8LSB0YWJsZShmYWN0b3IoZDEkdW5pb24sIGxldmVscyA9IGMoIm5vIiwgInllcyIpLCANCiAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoIk5vbi11bmlvbiIsICJVbmlvbiIpKSwNCiAgICAgICAgICAgZmFjdG9yKGQxJGJsdWVjb2wsIGxldmVscyA9IGMoIm5vIiwgInllcyIpLCANCiAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoIk5vbi1ibHVlLWNvbGxhciIsICJCbHVlLWNvbGxhciIpKSkNCmFkZG1hcmdpbnMocykNCmBgYA0KDQoqICpC4bqjbmcgdOG6p24gc3XhuqV0IGNow6lvIHRoZW8gdOG7tyBs4buHIGjDoG5nKiAgIA0KYGBge3IsZWNobz1UUlVFfQ0KczEgPC0gcHJvcC50YWJsZShzLCBtYXJnaW49MSkNCnMxDQpgYGANCg0KKiAqVHLhu7FjIHF1YW4gaMOzYSogICANCmBgYHtyLGVjaG89VFJVRX0NCg0KczIgPC0gYXMuZGF0YS5mcmFtZShzMSkNCmNvbG5hbWVzKHMyKSA8LSBjKCJ1bmlvbiIsICJibHVlY29sIiwgIlByb3BvcnRpb24iKQ0KDQpnZ3Bsb3QoczIsIGFlcyh4ID0gYmx1ZWNvbCwgeSA9IFByb3BvcnRpb24sIGZpbGwgPSB1bmlvbikpICsNCiAgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIsIHBvc2l0aW9uID0gImRvZGdlIikgKw0KICBsYWJzKA0KICAgIHRpdGxlID0gIlThu7cgbOG7hyB0aGFtIGdpYSBjw7RuZyDEkW/DoG4gdGhlbyBsb+G6oWkgbGFvIMSR4buZbmciLA0KICAgIHggPSAiTG/huqFpIGxhbyDEkeG7mW5nIiwNCiAgICB5ID0gIlThu7cgbOG7hyIsDQogICAgZmlsbCA9ICJUw6xuaCB0cuG6oW5nIHRoYW0gZ2lhIGPDtG5nIMSRb8OgbiINCiAgKSArDQogIHRoZW1lX21pbmltYWwoKSArDQogIHNjYWxlX3lfY29udGludW91cyhsYWJlbHMgPSBzY2FsZXM6OnBlcmNlbnQpICsNCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gYygiTm9uLXVuaW9uIiA9ICJkYXJrYmx1ZSIsICJVbmlvbiIgPSAicGluayIpKSArDQogIGdlb21fdGV4dChhZXMobGFiZWwgPSBzY2FsZXM6OnBlcmNlbnQoUHJvcG9ydGlvbiwgYWNjdXJhY3kgPSAwLjEpKSwNCiAgICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2Uod2lkdGggPSAwLjkpLA0KICAgICAgICAgICAgdmp1c3QgPSAtMC4zLCBzaXplPTUsIGZvbnRmYWNlID0gImJvbGQiKQ0KDQoNCmBgYA0KDQoqKk5o4bqtbiB4w6l0OioqICAgDQpDw6FjIGLhuqNuZyB04bqnbiBzdeG6pXQgdsOgIGJp4buDdSDEkeG7kyB0csOqbiBtaW5oIGjhu41hIG3hu5FpIHF1YW4gaOG7hyBnaeG7r2EgdMOsbmggdHLhuqFuZyB0aGFtIGdpYSBjw7RuZyDEkW/DoG4gKGB1bmlvbmApIHbDoCBuZ8Ogbmggbmdo4buBIGPhu6dhIG5nxrDhu51pIGxhbyDEkeG7mW5nIChgYmx1ZWNvbGApLCBjw7MgdGjhu4Mgbmjhuq1uIHRo4bqleSDEkcaw4bujYyBz4buxIHBow6JuIGjDs2EgcsO1IHLhu4d0LCB0cm9uZyBraGkgNjMuMiUgKDE2NzQvMjAzNikgbmfGsOG7nWkgbGFvIMSR4buZbmcgdGh14buZYyBuaMOzbSAiTm9uX2JsdWVfY29sbGFyIiBraMO0bmcgdGhhbSBnaWEgY8O0bmcgxJFvw6BuLCBjaOG7iSBjw7MgMjMuOSUgKDM2Mi8yMDM2KSB0cm9uZyBz4buRIGjhu40gbMOgIHRow6BuaCB2acOqbiBjw7RuZyDEkW/DoG4uIE5nxrDhu6NjIGzhuqFpLCDEkeG7kWkgduG7m2kgbmjDs20gIkJsdWVfY29sbGFyIiwgdOG7tyBs4buHIHRoYW0gZ2lhIGPDtG5nIMSRb8OgbiBsw6puIMSR4bq/biA3Ni4xJSAoMTE1NC8yMTI5KSwgY2FvIGjGoW4gxJHDoW5nIGvhu4Mgc28gduG7m2kgdOG7tyBs4buHIGtow7RuZyB0aGFtIGdpYSBsw6AgMzYuOCUgKDk3NS8yMTI5KS4gxJBp4buBdSBuw6B5IGNobyB0aOG6pXkgY8O0bmcgxJFvw6BuIGPDsyBz4bupYyDhuqNuaCBoxrDhu59uZyB2w6Agc+G7sSBoaeG7h24gZGnhu4duIG3huqFuaCBt4bq9IMSRw6FuZyBr4buDIHRyb25nIGPDoWMgbmfDoG5oIG5naOG7gSBsYW8gxJHhu5luZyBjaMOibiB0w6J5IGhv4bq3YyBr4bu5IHRodeG6rXQgaMahbiBzbyB24bubaSBjw6FjIG5nw6BuaCBuZ2jhu4EgdsSDbiBwaMOybmcsIGjDoG5oIGNow61uaCBob+G6t2MgY2h1ecOqbiBtw7RuLiAgICANCg0KIyMjIyBCaeG6v24gYHVuaW9uYCB2w6AgYmnhur9uIGBpbmRgDQoNCiogKkLhuqNuZyB04bqnbiBzdeG6pXQgY2jDqW8qDQoNCmBgYHtyLGVjaG89VFJVRX0NCmYgPC0gdGFibGUoZDEkdW5pb24sZDEkaW5kKQ0KYWRkbWFyZ2lucyhmKQ0KYGBgDQoqICpC4bqjbmcgdOG6p24gc3XhuqV0IGNow6lvIHRoZW8gdOG7tyBs4buHIGjDoG5nKiAgIA0KDQpgYGB7cixlY2hvPVRSVUV9DQoNCmYxIDwtIHByb3AudGFibGUoZiwgbWFyZ2luPTEpDQpmMQ0KDQpgYGANCg0KKiAqVHLhu7FjIHF1YW4gaMOzYSogICAgDQoNCmBgYHtyLGVjaG89VFJVRX0NCg0KDQpmMiA8LSBhcy5kYXRhLmZyYW1lKGYxKQ0KY29sbmFtZXMoZjIpIDwtIGMoInVuaW9uIiwgImluZCIsICJQcm9wb3J0aW9uIikNCg0KZ2dwbG90KGYyLCBhZXMoeCA9IGluZCwgeSA9IFByb3BvcnRpb24sIGZpbGwgPSB1bmlvbikpICsNCiAgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIsIHBvc2l0aW9uID0gImRvZGdlIikgKw0KICBsYWJzKA0KICAgIHRpdGxlID0gIlNvIHPDoW5nIHThu7cgbOG7hyB0aGFtIGdpYSBjw7RuZyDEkW/DoG4gZ2nhu69hIG5nw6BuaCBjw7RuZyBuZ2hp4buHcCB2w6AgcGhpIGPDtG5nIG5naGnhu4dwIiwNCiAgICB4ID0gIk5nw6BuaCBuZ2jhu4EiLA0KICAgIHkgPSAiVOG7tyBs4buHIiwNCiAgICBmaWxsID0gIlTDrG5oIHRy4bqhbmcgdGhhbSBnaWEgY8O0bmcgxJFvw6BuIg0KICApICsNCiAgdGhlbWVfbWluaW1hbCgpICsNCiAgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscyA9IHNjYWxlczo6cGVyY2VudCkgK3NjYWxlX3hfZGlzY3JldGUobGFiZWxzID0gYygibm9uLWluZHVzdHJpYWwiID0gIlBoaSBjw7RuZyBuZ2hp4buHcCIsICJpbmR1c3RyaWFsIiA9ICJDw7RuZyBuZ2hp4buHcCIpKSArDQogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGMoIm5vIiA9ICJzYWxtb24iLCAieWVzIiA9ICJkYXJrYmx1ZSIpKSArDQogIGdlb21fdGV4dChhZXMobGFiZWwgPSBzY2FsZXM6OnBlcmNlbnQoUHJvcG9ydGlvbiwgYWNjdXJhY3kgPSAwLjEpKSwNCiAgICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2Uod2lkdGggPSAwLjkpLA0KICAgICAgICAgICAgIHZqdXN0ID0gLTAuMywgc2l6ZT01LCBmb250ZmFjZSA9ICJib2xkIikNCg0KYGBgDQoNCioqTmjhuq1uIHjDqXQ6KioNClRyb25nIHThu5VuZyBz4buRIDQxNjUgbmfGsOG7nWkgbGFvIMSR4buZbmcgxJHGsOG7o2Mga2jhuqNvIHPDoXQgdOG6oWkgSG9hIEvhu7MsIG3hurdjIGTDuSBz4buRIGzGsOG7o25nIG5nxrDhu51pIGtow7RuZyB0aGFtIGdpYSBjw7RuZyDEkW/DoG4gY2hp4bq/bSDEkWEgc+G7kSAoMjY0OSBuZ8aw4budaSkgc28gduG7m2kgbmfGsOG7nWkgdGhhbSBnaWEgKDE1MTYgbmfGsOG7nWkpIHbDoCBz4buRIGzGsOG7o25nIGxhbyDEkeG7mW5nIHRyb25nIG5ow7NtIG5nw6BuaCBwaGkgY8O0bmcgbmdoaeG7h3AgKDI1MTggbmfGsOG7nWkpIGPFqW5nIMSRw7RuZyBoxqFuIG5ow7NtIG5nw6BuaCBjw7RuZyBuZ2hp4buHcCAoMTY0NyBuZ8aw4budaSkgbmjGsG5nIHThu7cgbOG7hyB0aGFtIGdpYSBjw7RuZyDEkW/DoG4gbOG6oWkgdGjhu4MgaGnhu4duIHPhu7Ega2jDoWMgYmnhu4d0IMSRw6FuZyBr4buDIGdp4buvYSBoYWkgbmjDs20gbmfDoG5oLiBD4bulIHRo4buDLCB0cm9uZyBraGkgNjUuOSUgbmfGsOG7nWkgbGFvIMSR4buZbmcgdHJvbmcgbmjDs20gbmfDoG5oIHBoaSBjw7RuZyBuZ2hp4buHcCBraMO0bmcgcGjhuqNpIGzDoCB0aMOgbmggdmnDqm4gY8O0bmcgxJFvw6BuIHbDoCBjaOG7iSBjw7MgNTElIHRoYW0gZ2lhLCB0aMOsIOG7nyBuZ8OgbmggY8O0bmcgbmdoaeG7h3AsIHThu7cgbOG7hyB0aGFtIGdpYSBjw7RuZyDEkW/DoG4gbMOgIDQ5JSwgY2FvIGjGoW4gc28gduG7m2kgdOG7tyBs4buHIGtow7RuZyB0aGFtIGdpYSBsw6AgMzQuMSUuIMSQaeG7gXUgbsOgeSBjaOG7iSByYSBy4bqxbmcsIG5nxrDhu51pIGxhbyDEkeG7mW5nIHRyb25nIG5nw6BuaCBjw7RuZyBuZ2hp4buHcCBz4bqjbiB4deG6pXQgY8OzIHh1IGjGsOG7m25nIGdpYSBuaOG6rXAgY8O0bmcgxJFvw6BuIG5oaeG7gXUgaMahbiBuaOG7r25nIG5nxrDhu51pIGzDoG0gdmnhu4djIHRyb25nIGPDoWMgbMSpbmggduG7sWMgcGhpIGPDtG5nIG5naGnhu4dwLiBQaOG6o24g4bqjbmggc+G7sSDEkeG6t2MgdGjDuSB24buBIMSRaeG7gXUga2nhu4duIGxhbyDEkeG7mW5nIGhv4bq3YyBuaOG6rW4gdGjhu6ljIHbhu4EgbOG7o2kgw61jaCBj4bunYSB2aeG7h2MgdGhhbSBnaWEgY8O0bmcgxJFvw6BuIHRyb25nIHThu6tuZyBuaMOzbSBuZ8Ogbmggbmdo4buBIGtow6FjIG5oYXUuICAgDQoNCiMjIyMgQmnhur9uIGB1bmlvbmAgdsOgIGJp4bq/biBgc291dGhgIA0KDQoqICpC4bqjbmcgdOG6p24gc3XhuqV0IGNow6lvKg0KDQpgYGB7cixlY2hvPVRSVUV9DQojIELhuqNuZyB04bqnbiBzdeG6pXQgY2jDqW8gduG7m2kgbmjDo24gcsO1IHLDoG5nDQpnIDwtIHRhYmxlKGZhY3RvcihkMSR1bmlvbiwgbGV2ZWxzID0gYygibm8iLCAieWVzIiksIA0KICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygiS2jDtG5nIHRoYW0gZ2lhIGPDtG5nIMSRb8OgbiIsICJUaGFtIGdpYSBjw7RuZyDEkW/DoG4iKSksDQogICAgICAgICAgIGZhY3RvcihkMSRzb3V0aCwgbGV2ZWxzID0gYygibm8iLCAieWVzIiksIA0KICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygiS2jDtG5nIHPhu5FuZyB04bqhaSBtaeG7gW4gTmFtIiwgIlPhu5FuZyB04bqhaSBtaeG7gW4gTmFtIikpKQ0KYWRkbWFyZ2lucyhnKQ0KYGBgDQoqICpC4bqjbmcgdOG6p24gc3XhuqV0IGNow6lvIHRoZW8gdOG7tyBs4buHIGjDoG5nKiAgIA0KDQpgYGB7cixlY2hvPVRSVUV9DQoNCmcxIDwtIHByb3AudGFibGUoZywgbWFyZ2luPTEpDQpnMQ0KDQpgYGANCg0KKiAqVHLhu7FjIHF1YW4gaMOzYSogICAgDQoNCmBgYHtyLGVjaG89VFJVRX0NCg0KZGYgPC0gYXMuZGF0YS5mcmFtZShnMSkNCmNvbG5hbWVzKGRmKSA8LSBjKCJVbmlvbiIsICJTb3V0aCIsICJQcm9wb3J0aW9uIikNCg0KIyBW4bq9IGJp4buDdSDEkeG7kw0KZ2dwbG90KGRmLCBhZXMoeCA9IFVuaW9uLCB5ID0gUHJvcG9ydGlvbiwgZmlsbCA9IFNvdXRoKSkgKw0KICBnZW9tX2NvbChwb3NpdGlvbiA9ICJkb2RnZSIpICsNCiAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IHNjYWxlczo6cGVyY2VudChQcm9wb3J0aW9uLCBhY2N1cmFjeSA9IDAuMSkpLCANCiAgICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2Uod2lkdGggPSAwLjkpLCB2anVzdCA9IC0wLjUsIHNpemUgPSA1LGZvbnRmYWNlID0gImJvbGQiKSArDQogIGxhYnModGl0bGUgPSAiVOG7tyBs4buHIHRoYW0gZ2lhIGPDtG5nIMSRb8OgbiB0aGVvIGtodSB24buxYyBjxrAgdHLDuiIsDQogICAgICAgeCA9ICJUw6xuaCB0cuG6oW5nIGPDtG5nIMSRb8OgbiIsDQogICAgICAgeSA9ICJU4bu3IGzhu4ciLA0KICAgICAgIGZpbGwgPSAiS2h1IHbhu7FjIGPGsCB0csO6IikgKw0KICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjKCJLaMO0bmcgc+G7kW5nIHThuqFpIG1p4buBbiBOYW0iID0gInNhbG1vbiIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJT4buRbmcgdOG6oWkgbWnhu4FuIE5hbSIgPSAiYmx1ZSIpKSArDQogIHlsaW0oMCwgMSkgKw0KICB0aGVtZV9taW5pbWFsKCkNCg0KYGBgDQoNCioqTmjhuq1uIHjDqXQ6KiogICANClRyb25nIHPhu5Egbmjhu69uZyBuZ8aw4budaSBraMO0bmcgdGhhbSBnaWEgY8O0bmcgxJFvw6BuLCA2NS40JSB04bu3IGzhu4cgbmfGsOG7nWkgbGFvIMSR4buZbmcga2jDtG5nIHPhu5EgdOG6oWkgbWnhu4FuIE5hbSBIb2Ega+G7sywgdHJvbmcga2hpIDM0LjYlIHPhu5FuZyB04bqhaSBtaeG7gW4gTmFtIEhvYSBL4buzLiDEkGnhu4F1IMSRw6FuZyBjaMO6IMO9IGzDoCB0cm9uZyBuaMOzbSB0aGFtIGdpYSBjw7RuZyDEkW/DoG4sIMSR4bqhaSDEkWEgc+G7kSAoODAuNyUpIGtow7RuZyBz4buRbmcgdOG6oWkgbWnhu4FuIE5hbSB2w6AgY2jhu4kgY8OzIDE5LjMlIMSR4bq/biB04burIG1p4buBbiBOYW0gSG9hIEvhu7MuIENobyB0aOG6pXkgbmjhu69uZyBsYW8gxJHhu5luZyBz4buRbmcgYsOqbiBuZ2/DoGkga2h1IHbhu7FjIG1p4buBbiBOYW0gSG9hIGvhu7MgY8OzIGto4bqjIG7Eg25nIHRoYW0gZ2lhIGPDtG5nIMSRb8OgbiBjYW8gaMahbiDEkcOhbmcga+G7gyBzbyB24bubaSBuaOG7r25nIG5nxrDhu51pIHPhu5FuZyB04bqhaSBtaeG7gW4gTmFtLiAgIA0KDQojIyMjIEJp4bq/biBgdW5pb25gIHbDoCBiaeG6v24gYG1hcnJpZWRgDQoNCiogKkLhuqNuZyB04bqnbiBzdeG6pXQgY2jDqW8qICAgIA0KDQpgYGB7cixlY2hvPVRSVUV9DQojIELhuqNuZyB04bqnbiBzdeG6pXQgY2jDqW8gduG7m2kgbmjDo24gcsO1IHLDoG5nDQpqIDwtIHRhYmxlKGZhY3RvcihkMSR1bmlvbiwgbGV2ZWxzID0gYygibm8iLCAieWVzIiksIA0KICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygiTm9uLXVuaW9uIiwgIlVuaW9uIikpLA0KICAgICAgICAgICBmYWN0b3IoZDEkbWFycmllZCwgbGV2ZWxzID0gYygibm8iLCAieWVzIiksIA0KICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygiU2luZ2xlIiwgIk1hcnJpZWQiKSkpDQphZGRtYXJnaW5zKGopDQpgYGANCg0KKiAqQuG6o25nIHThuqduIHN14bqldCBjaMOpbyB0aGVvIHThu7cgbOG7hyBow6BuZyogICANCg0KYGBge3IsZWNobz1UUlVFfQ0KDQpqMSA8LSBwcm9wLnRhYmxlKGosIG1hcmdpbj0xKQ0KajENCg0KYGBgDQoNCiogKlRy4buxYyBxdWFuIGjDs2EqICAgDQoNCmBgYHtyLGVjaG89VFJVRX0NCg0KajIgPC0gYXMuZGF0YS5mcmFtZShqMSkNCmNvbG5hbWVzKGoyKSA8LSBjKCJ1bmlvbiIsICJtYXJyaWVkIiwgIlByb3BvcnRpb24iKQ0KDQpnZ3Bsb3QoajIsIGFlcyh4ID0gdW5pb24sIHkgPSBQcm9wb3J0aW9uLCBmaWxsID0gbWFycmllZCkpICsNCiAgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIsIHBvc2l0aW9uID0gImRvZGdlIikgKw0KICBsYWJzKA0KICAgIHRpdGxlID0gIlThu7cgbOG7hyB0aGFtIGdpYSBjw7RuZyDEkW/DoG4gdGhlbyB0w6xuaCB0cuG6oW5nIGjDtG4gbmjDom4iLA0KICAgIHggPSAiVMOsbmggdHLhuqFuZyB0aGFtIGdpYSBjw7RuZyDEkW/DoG4iLA0KICAgIHkgPSAiVOG7tyBs4buHIiwNCiAgICBmaWxsID0gIlTDrG5oIHRy4bqhbmcgaMO0biBuaMOibiINCiAgKSArDQogIHRoZW1lX21pbmltYWwoKSArDQogIHNjYWxlX3lfY29udGludW91cyhsYWJlbHMgPSBzY2FsZXM6OnBlcmNlbnQpICArDQogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGMoIlNpbmdsZSIgPSAieWVsbG93IiwgIk1hcnJpZWQiID0gImRhcmtibHVlIikpICsNCiAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IHNjYWxlczo6cGVyY2VudChQcm9wb3J0aW9uLCBhY2N1cmFjeSA9IDAuMSkpLA0KICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IDAuOSksDQogICAgICAgICAgICAgdmp1c3QgPSAtMC4zLCBzaXplPTUsIGZvbnRmYWNlID0gImJvbGQiKQ0KDQpgYGANCg0KKipOaOG6rW4geMOpdDoqKiAgIA0KS2hpIHhlbSB4w6l0IG3hu5FpIHF1YW4gaOG7hyBnaeG7r2EgaGFpIGJp4bq/biwgdHJvbmcgc+G7kSBuaOG7r25nIG5nxrDhu51pIGtow7RuZyB0aGFtIGdpYSBjw7RuZyDEkW/DoG4sIDc4LjElIMSRw6Mga+G6v3QgaMO0biB2w6AgMjEuOSUgxJHhu5ljIHRow6JuLiBUdXkgbmhpw6puLCB0cm9uZyBuaMOzbSBuaOG7r25nIG5nxrDhu51pIHRoYW0gZ2lhIGPDtG5nIMSRb8OgbiwgdOG7tyBs4buHIG5nxrDhu51pIMSRw6Mga+G6v3QgaMO0biB0aOG6rW0gY2jDrSBjw7JuIGNhbyBoxqFuLCBjaGnhur9tIHThu5tpIDg3LjMlLCB0cm9uZyBraGkgY2jhu4kgY8OzIDEyLjclIGzDoCBuZ8aw4budaSDEkeG7mWMgdGjDom4uIEPDsyB0aOG7gyB0aOG6pXkgxJHGsOG7o2MsIG5o4buvbmcgbmfGsOG7nWkgxJHDoyBr4bq/dCBow7RuIGPDsyB4dSBoxrDhu5tuZyB0aGFtIGdpYSBjw7RuZyDEkW/DoG4gbmhp4buBdSBoxqFuIMSRw6FuZyBr4bq7IHNvIHbhu5tpIG5o4buvbmcgbmfGsOG7nWkgxJHhu5ljIHRow6JuLiAgICANCg0KIyMjIyBCaeG6v24gYHVuaW9uYCB2w6AgYmnhur9uIGBzZXhgICAgDQoNCipC4bqjbmcgdHXhuqduIHN14bqldCBjaMOpbyogICANCg0KYGBge3IsZWNobz1UUlVFfQ0KIyBC4bqjbmcgdOG6p24gc3XhuqV0IGNow6lvIHbhu5tpIG5ow6NuIHLDtSByw6BuZw0KayA8LSB0YWJsZShmYWN0b3IoZDEkdW5pb24sIGxldmVscyA9IGMoIm5vIiwgInllcyIpLCANCiAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoIk5vbi11bmlvbiIsICJVbmlvbiIpKSwNCiAgICAgICAgICAgZmFjdG9yKGQxJHNleCwgbGV2ZWxzID0gYygiZmVtYWxlIiwgIm1hbGUiKSwgDQogICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCJmZW1hbGUiLCAibWFsZSIpKSkNCmFkZG1hcmdpbnMoaykNCmBgYA0KDQoqQuG6o25nIHR14bqnbiBzdeG6pXQgY2jDqW8gdGhlbyB04bu3IGzhu4cgaMOgbmcqICAgDQpgYGB7cixlY2hvPVRSVUV9DQprMSA8LSBwcm9wLnRhYmxlKGssIG1hcmdpbj0xKQ0KazENCmBgYA0KDQoqVHLhu7FjIHF1YW4gaMOzYSogICANCg0KYGBge3IsZWNobz1UUlVFfQ0KazIgPC0gYXMuZGF0YS5mcmFtZShrMSkNCmNvbG5hbWVzKGsyKSA8LSBjKCJ1bmlvbiIsICJzZXgiLCAiUHJvcG9ydGlvbiIpDQoNCmdncGxvdChrMiwgYWVzKHggPSB1bmlvbiwgeSA9IFByb3BvcnRpb24sIGZpbGwgPSBzZXgpKSArDQogIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiLCBwb3NpdGlvbiA9ICJkb2RnZSIpICsNCiAgbGFicygNCiAgICB0aXRsZSA9ICJU4bu3IGzhu4cgdGhhbSBnaWEgY8O0bmcgxJFvw6BuIHRoZW8gdMOsbmggdHLhuqFuZyBnaeG7m2kgdMOtbmgiLA0KICAgIHggPSAiVMOsbmggdHLhuqFuZyB0aGFtIGdpYSBjw7RuZyDEkW/DoG4iLA0KICAgIHkgPSAiVOG7tyBs4buHIiwNCiAgICBmaWxsID0gIlTDrG5oIHRy4bqhbmcgZ2nhu5tpIHTDrW5oIg0KICApICsNCiAgdGhlbWVfbWluaW1hbCgpICsNCiAgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscyA9IHNjYWxlczo6cGVyY2VudCkgKw0KICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjKCJmZW1hbGUiID0gInllbGxvdyIsICJtYWxlIiA9ICJkYXJrZ3JlZW4iKSkgKw0KICBnZW9tX3RleHQoYWVzKGxhYmVsID0gc2NhbGVzOjpwZXJjZW50KFByb3BvcnRpb24sIGFjY3VyYWN5ID0gMC4xKSksDQogICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKHdpZHRoID0gMC45KSwNCiAgICAgICAgICAgIHZqdXN0ID0gLTAuMywgc2l6ZT01LCBmb250ZmFjZSA9ICJib2xkIikNCg0KYGBgDQoNCioqTmjhuq1uIHjDqXQ6KiogICANClRyb25nIG5ow7NtIG5o4buvbmcgbmfGsOG7nWkga2jDtG5nIHRoYW0gZ2lhIGPDtG5nIMSRb8OgbiwgbmFtIGdp4bubaSBjaGnhur9tIDg2JSAoMjI3OSBuZ8aw4budaSksIHRyb25nIGtoaSBu4buvIGdp4bubaSBjaGnhur9tIDE0JSAoMzcwIG5nxrDhu51pKS4gVHJvbmcgbmjDs20gbmjhu69uZyBuZ8aw4budaSB0aGFtIGdpYSBjw7RuZyDEkW/DoG46IG5hbSBnaeG7m2kgY2hp4bq/bSB04bubaSBjaGnhur9tIDkzLjUlICgxNDE3IG5nxrDhu51pKSB2w6AgbuG7ryBnaeG7m2kgY2hp4bq/bSA2LjUlICg5OSBuZ8aw4budaSkuIEPhuqMgdHJvbmcgbmjDs20gdGhhbSBnaWEgY8O0bmcgxJFvw6BuIHbDoCBraMO0bmcgdGhhbSBnaWEgY8O0bmcgxJFvw6BuIHRow6wgbmFtIGdp4bubaSBsdcO0biBsw6AgbmjDs20gY2hp4bq/bSBwaOG6p24gbOG7m24gaMahbi4gICANCg0KIyMjIyBCaeG6v24gYHVuaW9uYCB2w6AgYmnhur9uIGBibGFja2ANCg0KKkLhuqNuZyB04bqnbiBzdeG6pXQgY2jDqW8qICAgDQoNCmBgYHtyLGVjaG89VFJVRX0NCiMgQuG6o25nIHThuqduIHN14bqldCBjaMOpbyB24bubaSBuaMOjbiByw7UgcsOgbmcNCmwgPC0gdGFibGUoZmFjdG9yKGQxJHVuaW9uLCBsZXZlbHMgPSBjKCJubyIsICJ5ZXMiKSwgDQogICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCJOb24tdW5pb24iLCAiVW5pb24iKSksDQogICAgICAgICAgIGZhY3RvcihkMSRibGFjaywgbGV2ZWxzID0gYygibm8iLCAieWVzIiksIA0KICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygiTm9uLWJsYWNrIiwgIkJsYWNrIikpKQ0KYWRkbWFyZ2lucyhsKQ0KYGBgDQoNCipC4bqjbmcgdHXhuqduIHN14bqldCBjaMOpbyB0aGVvIHThu7cgbOG7hyBow6BuZyogICANCmBgYHtyLGVjaG89VFJVRX0NCmwxIDwtIHByb3AudGFibGUobCwgbWFyZ2luPTEpDQpsMQ0KYGBgDQoNCipUcuG7sWMgcXVhbiBow7NhKiAgIA0KDQpgYGB7cixlY2hvPVRSVUV9DQpsMiA8LSBhcy5kYXRhLmZyYW1lKGwxKQ0KY29sbmFtZXMobDIpIDwtIGMoInVuaW9uIiwgImJsYWNrIiwgIlByb3BvcnRpb24iKQ0KDQpnZ3Bsb3QobDIsIGFlcyh4ID0gdW5pb24sIHkgPSBQcm9wb3J0aW9uLCBmaWxsID0gYmxhY2spKSArDQogIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiLCBwb3NpdGlvbiA9ICJkb2RnZSIpICsNCiAgbGFicygNCiAgICB0aXRsZSA9ICJU4bu3IGzhu4cgdGhhbSBnaWEgY8O0bmcgxJFvw6BuIHRoZW8gdMOsbmggdHLhuqFuZyBjaOG7p25nIHThu5ljIiwNCiAgICB4ID0gIlTDrG5oIHRy4bqhbmcgdGhhbSBnaWEgY8O0bmcgxJFvw6BuIiwNCiAgICB5ID0gIlThu7cgbOG7hyIsDQogICAgZmlsbCA9ICJUw6xuaCB0cuG6oW5nIGNo4bunbmcgdOG7mWMiDQogICkgKw0KICB0aGVtZV9taW5pbWFsKCkgKw0KICBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzID0gc2NhbGVzOjpwZXJjZW50KSArDQogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGMoIk5vbi1ibGFjayIgPSAicGluayIsICJCbGFjayIgPSAiZ3JheSIpKSArDQogIGdlb21fdGV4dChhZXMobGFiZWwgPSBzY2FsZXM6OnBlcmNlbnQoUHJvcG9ydGlvbiwgYWNjdXJhY3kgPSAwLjEpKSwNCiAgICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2Uod2lkdGggPSAwLjkpLA0KICAgICAgICAgICAgdmp1c3QgPSAtMC4zLCBzaXplPTUsIGZvbnRmYWNlID0gImJvbGQiKQ0KDQpgYGANCg0KKipOaOG6rW4geMOpdDoqKiAgIA0KTmjDs20gbmjhu69uZyBuZ8aw4budaSBraMO0bmcgdGhhbSBnaWEgY8O0bmcgxJFvw6BuLCBuaOG7r25nIG5nxrDhu51pIGxhbyDEkeG7mW5nIGtow7RuZyB0aHXhu5ljIGNo4bunbmcgdOG7mWMgbmfGsOG7nWkgZGEgxJFlbiBjaGnhur9tIHThu7cgbOG7hyDDoXAgxJHhuqNvIGzDoCA5My43JSB2w6AgbmfGsOG7nWkgbGFvIMSR4buZbmcgdGh14buZYyBjaOG7p25nIHThu5ljIG5nxrDhu51pIGRhIMSRZW4gY2jhu4kgY2hp4bq/bSA2LjMlLiBWw6AgdMawxqFuZyB04buxLCBuaOG7r25nIG5nxrDhu51pIGxhbyDEkeG7mW5nIGtow7RuZyBwaOG6o2kgbmfGsOG7nWkgZGEgxJFlbiBjxaluZyBjaGnhur9tIHThu7cgbOG7hyBy4bqldCBjYW8gOTEuMiUsIHRyb25nIGtoaSBuZ8aw4budaSBkYSDEkWVuIGNoaeG6v20gOC44JS4gQ2hvIHRo4bqleSB0cm9uZyBj4bqjIGhhaSBuaMOzbSwgbmfGsOG7nWkga2jDtG5nIHBo4bqjaSBuZ8aw4budaSBkYSDEkWVuIMSR4buBdSBjaGnhur9tIHThu7cgw6FwIMSR4bqjbyBzbyB24bubaSBuZ8aw4budaSBkYSDEkWVuLiAgICANCg0KIyMjIFJlbGF0aXZlIFJpc2sNClJlbGF0aXZlIFJpc2sgKFJSKSwgaGF5IGPDsm4gZ+G7jWkgbMOgIG5ndXkgY8ahIHTGsMahbmcgxJHhu5FpLiBMw6AgbeG7mXQgY2jhu4kgc+G7kSB0aOG7kW5nIGvDqiDEkeG7gyBzbyBzw6FuaCB4w6FjIHN14bqldCBt4buZdCBz4buxIGtp4buHbiAodsOtIGThu6U6IHRoYW0gZ2lhIGPDtG5nIMSRb8OgbikgZ2nhu69hIGhhaSBuaMOzbSDEkeG7kWkgdMaw4bujbmcga2jDoWMgbmhhdSwgdHJvbmcgxJHDsyBt4buZdCBuaMOzbSBsw6AgxJHhurdjIMSRaeG7g20gaG/hurdjIHnhur91IHThu5EgxJHGsOG7o2MgcXVhbiB0w6JtICh2w60gZOG7pSBuaMawIMSR4bq3YyDEkWnhu4NtIG5nxrDhu51pIGxhbyDEkeG7mW5nIGzDoCBuYW0sIGzDoCBuZ8aw4budaSBkYSDEkWVuLCDEkcOjIGvhur90IGjDtG4sLi4uKS4gICAgDQpOw7NpIGPDoWNoIGtow6FjLCBSUiBjaG8gYmnhur90IG5ndXkgY8ahIHjhuqN5IHJhIHPhu7Ega2nhu4duIOG7nyBuaMOzbSBjw7MgeeG6v3UgdOG7kSDEkcaw4bujYyBxdWFuIHTDom0gY2FvIGjGoW4sIHRo4bqlcCBoxqFuLCBoYXkgYuG6sW5nIHbhu5tpIG5ow7NtIGtow7RuZyBwaOG6o2kgeeG6v3UgdOG7kSDEkcaw4bujYyBxdWFuIHTDom0uICAgIA0KJCQgUlIgPSBcZnJhY3tQKFx0ZXh0e1Phu7Ega2nhu4duIHjhuqN5IHJhIH0gfCBcdGV4dHsgTmjDs20gY8OzIHnhur91IHThu5F9KX17XHRleHR7UChT4buxIGtp4buHbiB44bqjeSByYSB9IHwgXHRleHR7IE5ow7NtIGtow7RuZyBjw7MgeeG6v3UgdOG7kSl9fSAkJA0KVHJvbmcgxJHDszogICAgDQoNCiogVOG7rSBz4buRIGzDoCB4w6FjIHN14bqldCB44bqjeSByYSBz4buxIGtp4buHbiDhu58gbmjDs20gY8OzIMSR4bq3YyDEkWnhu4NtIGhv4bq3YyB54bq/dSB04buRIMSRxrDhu6NjIHF1YW4gdMOibS4gICANCg0KKiBN4bqrdSBz4buRIGzDoCB4w6FjIHN14bqldCB44bqjeSByYSBz4buxIGtp4buHbiDhu58gbmjDs20ga2jDtG5nIGPDsyDEkeG6t2MgxJFp4buDbSBob+G6t2MgeeG6v3UgdOG7kSBj4bqnbiBxdWFuIHTDom0uICAgDQoNCkRp4buFbiBnaeG6o2k6ICAgDQoNCiogTuG6v3UgJFJSPTEkOiBraMO0bmcgY8OzIHPhu7Ega2jDoWMgYmnhu4d0IHbhu4Egbmd1eSBjxqEgZ2nhu69hIGhhaSBuaMOzbS4gICANCg0KKiBO4bq/dSAkUlI+MSQ6IE5ow7NtIGPDsyB54bq/dSB04buRIGPhuqduIHF1YW4gdMOibSBjw7Mgbmd1eSBjxqEgeOG6o3kgcmEgc+G7sSBraeG7h24gY2FvIGjGoW4gc28gduG7m2kgbmjDs20ga2jDtG5nIGPDsyB54bq/dSB04buRIGPhuqduIHF1YW4gdMOibS4gICANCg0KKiBO4bq/dSAkUlI8MSQ6IE5ow7NtIGPDsyB54bq/dSB04buRIGPhuqduIHF1YW4gdMOibSBjw7Mgbmd1eSBjxqEgeOG6o3kgcmEgc+G7sSBraeG7h24gdGjhuqVwIGjGoW4gc28gduG7m2kgbmjDs20ga2jDtG5nIGPDsyB54bq/dSB04buRIGPhuqduIHF1YW4gdMOibS4gICANCg0KVsOtIGThu6U6ICAgIA0KJCQgUlIgPSBcZnJhY3tQKFx0ZXh0e1RoYW0gZ2lhIGPDtG5nIMSRb8OgbiB9IHwgXHRleHR7IEdp4bubaSB0w61uaCBuYW19KX17XHRleHR7UChUaGFtIGdpYSBjw7RuZyDEkW/DoG4gfSB8IFx0ZXh0eyBHaeG7m2kgdMOtbmggbuG7ryl9fSAkJCAgICANCkRp4buFbiBnaeG6o2k6ICAgDQoNCiogTuG6v3UgJFJSPTEkOiBLaMO0bmcgY8OzIHPhu7Ega2jDoWMgYmnhu4d0IHbhu4Ega2jhuqMgbsSDbmcgdGhhbSBnaWEgY8O0bmcgxJFvw6BuIGdp4buvYSBuYW0gdsOgIG7hu68uICAgDQoNCiogTuG6v3UgJFJSPjEkOiBOYW0gZ2nhu5tpIGPDsyBraOG6oyBuxINuZyB0aGFtIGdpYSBjw7RuZyDEkW/DoG4gY2FvIGjGoW4gbuG7ryBnaeG7m2kuICAgDQoNCiogTuG6v3UgJFJSPDEkOiBOYW0gZ2nhu5tpIGPDsyBraOG6oyBuxINuZyB0aGFtIGdpYSBjw7RuZyDEkW/DoG4gdGjhuqVwIGjGoW4gc28gduG7m2kgbuG7ryBnaeG7m2kuICAgDQoNCiMjIyMgQmnhur9uIGB1bmlvbmAgdsOgIGJp4bq/biBgYmx1ZWNvbGANCg0KKiAqVEgxOiBOaMOzbSBsYW8gxJHhu5luZyBjaMOibiB0YXkgbMOgbSB0aGFtIGNoaeG6v3UuKiAgIA0KJCQgUlIgPSBcZnJhY3tQKFx0ZXh0e05vbi11bmlvbiB9IHwgXHRleHR7IE5vbi1ibHVlLWNvbGxhcn0pfXtcdGV4dHtQKE5vbi11bmlvbiB9IHwgXHRleHR7IEJsdWUtY29sbGFyKX19ICQkICAgIA0KDQpgYGB7cixlY2hvPVRSVUV9DQpwIDwtIHRhYmxlKGZhY3RvcihkMSRibHVlY29sLCBsZXZlbHMgPSBjKCJubyIsICJ5ZXMiKSwgDQogICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCJOb24tYmx1ZS1jb2xsYXIiLCAiQmx1ZS1jb2xsYXIiKSksDQogICAgICAgICAgIGZhY3RvcihkMSR1bmlvbiwgbGV2ZWxzID0gYygibm8iLCAieWVzIiksIA0KICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygiTm9uLXVuaW9uIiwgIlVuaW9uIikpKQ0Kcmlza3JhdGlvKHAscmV2PSJiIikNCg0KYGBgDQoNCioqTmjhuq1uIHjDqXQ6KiogICANCg0KQ8OzIHPhu7Ega2jDoWMgYmnhu4d0IGdp4buvYSBraOG6oyBuxINuZyBraMO0bmcgdGhhbSBnaWEgY8O0bmcgxJFvw6BuIOG7nyBoYWkgYmnhu4N1IGhp4buHbiBj4bunYSBiaeG6v24gYGJsdWVjb2xgLiBL4bq/dCBxdeG6oyB0aHUgxJHGsOG7o2MgUlIgJFxhcHByb3ggMS44JC4gVOG7qWMgbMOgIG5o4buvbmcgbmfGsOG7nWkga2jDtG5nIGzDoG0gdmnhu4djIHRyb25nIG5ow7NtIGxhbyDEkeG7mW5nIGNow6JuIHRheSBjw7Mga2jhuqMgbsSDbmcga2jDtG5nIHRoYW0gZ2lhIGPDtG5nIMSRb8OgbiBjYW8gaMahbiAxLjggbOG6p24gc28gduG7m2kgbmjhu69uZyBuZ8aw4budaSB0cm9uZyBuaMOzbSBsYW8gxJHhu5luZyBjaMOibiB0YXkuICAgDQoNCktob+G6o25nIHRpbiBj4bqteSBjaG8gdGjhuqV5IHLhurFuZywgduG7m2kgxJHhu5kgdGluIGPhuq15IDk1JSwgY2jDum5nIHRhIGPDsyB0aOG7gyBr4bq/dCBsdeG6rW4gcuG6sW5nIGto4bqjIG7Eg25nIG5nxrDhu51pIGxhbyDEkeG7mW5nIGtow7RuZyB0aGFtIGdpYSBjw7RuZyDEkW/DoG4gY+G7p2EgbmfGsOG7nWkga2jDtG5nIHRodeG7mWMgbmjDs20gbGFvIMSR4buZbmcgY2jDom4gdGF5IGNhbyBoxqFuIHThu6sgMS43MDcgxJHhur9uIDEuODg4IGzhuqduIHNvIHbhu5tpIG5nxrDhu51pIHRodeG7mWMgbmjDs20gbGFvIMSR4buZbmcgY2jDom4gdGF5LiAgICANCg0KS+G6v3QgcXXhuqMga2nhu4NtIMSR4buLbmggQ2hpLXNxdWFyZSBjaG8gdGjhuqV5IGPDsyBt4buRaSBsacOqbiBo4buHIGPDsyDDvSBuZ2jEqWEgdGjhu5FuZyBrw6ogZ2nhu69hIGxv4bqhaSBsYW8gxJHhu5luZyB2w6Aga2jhuqMgbsSDbmcgdGhhbSBnaWEgY8O0bmcgxJFvw6BuLiDEkGnhu4F1IG7DoHkgY2hvIHRo4bqleSB2aeG7h2MgbMOgIGxhbyDEkeG7mW5nIGNow6JuIHRheSBoYXkga2jDtG5nIGPDsyDhuqNuaCBoxrDhu59uZyDEkcOhbmcga+G7gyDEkeG6v24ga2jhuqMgbsSDbmcga2jDtG5nIHRoYW0gZ2lhIGPDtG5nIMSRb8Ogbi4gICANCg0KKiAqVEgyOiBLaMO0bmcgdGh14buZYyBuaMOzbSBsYW8gxJHhu5luZyBjaMOibiB0YXkgbMOgbSB0aGFtIGNoaeG6v3UuKiAgIA0KDQokJCBSUiA9IFxmcmFje1AoXHRleHR7VW5pb24gfSB8IFx0ZXh0eyBCbHVlLWNvbGxhcn0pfXtcdGV4dHtQKFVuaW9uIH0gfCBcdGV4dHsgTm9uLWJsdWUtY29sbGFyKX19ICQkDQpgYGB7cixlY2hvPVRSVUV9DQpyaXNrcmF0aW8ocCkNCmBgYA0KDQoqKk5o4bqtbiB4w6l0OioqICAgDQoNCkPDsyBz4buxIGtow6FjIGJp4buHdCB24buBIGto4bqjIG7Eg25nIHRoYW0gZ2lhIGPDtG5nIMSRb8OgbiDhu58gaGFpIGJp4buDdSBoaeG7h24gY+G7p2EgYmnhur9uIGBibHVlY29sYC4gS+G6v3QgcXXhuqMgbmjhuq1uIMSRxrDhu6NjIGNobyB0aOG6pXkgbmjhu69uZyBuZ8aw4budaSB0aHXhu5ljIG5ow7NtIGxhbyDEkeG7mW5nIGNow6JuIHRheSBjw7Mga2jhuqMgbsSDbmcgdGhhbSBnaWEgY8O0bmcgxJFvw6BuIGNhbyBoxqFuIDMuMDUgbOG6p24gc28gduG7m2kgbmjhu69uZyBuZ8aw4budaSBraMO0bmcgdGh14buZYyBuaMOzbSBsYW8gxJHhu5luZyBjaMOibiB0YXkuICAgDQoNClbhu5tpIMSR4buZIHRpbiBj4bqteSA5NSUsIGto4bqjIG7Eg25nIHRoYW0gZ2lhIGPDtG5nIMSRb8OgbiDhu58gbmjDs20gbGFvIMSR4buZbmcgY2jDom4gdGF5IGPDsyB0aOG7gyBjYW8gaMahbiBraG/huqNuZyB04burIDIuNzYgxJHhur9uIDMuMzcgbOG6p24gc28gduG7m2kgbmjDs20ga2jDtG5nIGxhbyDEkeG7mW5nIGNow6JuIHRheS4gICANCg0KS+G6v3QgcXXhuqMga2nhu4NtIMSR4buLbmggY2hvIHRo4bqleSBjw7MgbeG7kWkgbGnDqm4gaOG7hyBnaeG7r2EgbG/huqFpIGxhbyDEkeG7mW5nIHbDoCBraOG6oyBuxINuZyB0aGFtIGdpYSBjw7RuZyDEkW/DoG4uICAgDQoNCiMjIyMgQmnhur9uIGB1bmlvbmAgdsOgIGJp4bq/biBgaW5kYA0KKiAqVEgxOiBLaMO0bmcgdGh14buZYyBuaMOzbSBuZ8Ogbmggc+G6o24geHXhuqV0IGzDoG0gdGhhbSBjaGnhur91LiogICANCiQkIFJSID0gXGZyYWN7UChcdGV4dHtVbmlvbiB9IHwgXHRleHR7IGluZHVzdHJpYWx9KX17XHRleHR7UChVbmlvbiB9IHwgXHRleHR7IG5vbi1pbmR1c3RyaWFsKX19ICQkICAgDQoNCmBgYHtyLGVjaG89VFJVRX0NCnAxIDwtIHRhYmxlKGQxJGluZCwNCiAgICAgICAgICAgZmFjdG9yKGQxJHVuaW9uLCBsZXZlbHMgPSBjKCJubyIsICJ5ZXMiKSwgDQogICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCJOb24tdW5pb24iLCAiVW5pb24iKSkpDQpyaXNrcmF0aW8ocDEpDQpgYGANCioqTmjhuq1uIHjDqXQ6KiogICANCg0KS+G6v3QgcXXhuqMgY2hvIHRo4bqleSBnacOhIHRy4buLIFJlbGF0aXZlIFJpc2sgbmjhuq1uIMSRxrDhu6NjIGzDoCAxLjQ3LCBs4bubbiBoxqFuIDEuIFThu6ljIGzDoCBuaOG7r25nIG5nxrDhu51pIGxhbyDEkeG7mW5nIHRodeG7mWMgbmjDs20gbmfDoG5oIHPhuqNuIHh14bqldCBjw7Mga2jhuqMgbsSDbmcgdGhhbSBnaWEgY8O0bmcgxJFvw6BuIGNhbyBoxqFuIDEuNDcgbOG6p24gc28gduG7m2kgbmjhu69uZyBuZ8aw4budaSBraMO0bmcgdGh14buZYyBuaMOzbSBuZ8Ogbmggc+G6o24geHXhuqV0LiAgIA0KDQpW4bubaSDEkeG7mSB0aW4gY+G6rXkgOTUlLCBraOG6oyBuxINuZyB0aGFtIGdpYSBjw7RuZyDEkW/DoG4g4bufIG5ow7NtIG5nw6BuaCBz4bqjbiB4deG6pXQgY8OzIHRo4buDIGNhbyBoxqFuIHThu6sgMS4zNTcgxJHhur9uIDEuNTkgbOG6p24gc28gduG7m2kgbmjDs20ga2jDtG5nIHRodeG7mWMgbmfDoG5oIHPhuqNuIHh14bqldC4gICAgDQoNCiBL4bq/dCBxdeG6oyBraeG7g20gxJHhu4tuaCBDaGktc3F1YXJlIGNobyB0aOG6pXkgY8OzIG3hu5FpIGxpw6puIGjhu4cgdGjhu5FuZyBrw6ogZ2nhu69hIG5nw6BuaCBuZ2jhu4EgdsOgIGto4bqjIG7Eg25nIHRoYW0gZ2lhIGPDtG5nIMSRb8Ogbi4gICAgDQoNCiogKlRIMjogbmjDs20gbmfDoG5oIHPhuqNuIHh14bqldCBsw6BtIHRoYW0gY2hp4bq/dS4qICAgDQoNCiQkIFJSID0gXGZyYWN7UChcdGV4dHtOb24tdW5pb24gfSB8IFx0ZXh0eyBub24taW5kdXN0cmlhbH0pfXtcdGV4dHtQKE5vbi11bmlvbiB9IHwgXHRleHR7IGluZHVzdHJpYWwpfX0gJCQgICANCmBgYHtyLGVjaG89VFJVRX0NCnJpc2tyYXRpbyhwMSxyZXY9ImIiKQ0KYGBgDQoNCioqTmjhuq1uIHjDqXQ6KiogICANCg0KR2nDoSB0cuG7iyBSZWxhdGl2ZSBSaXNrIGzDoCAxLjI2MywgbOG7m24gaMahbiAxLiBOZ2jEqWEgbMOgIG5o4buvbmcgbmfGsOG7nWkgbGFvIMSR4buZbmcga2jDtG5nIHRodeG7mWMgbmjDs20gbmfDoG5oIHPhuqNuIHh14bqldCBjw7Mga2jhuqMgbsSDbmcga2jDtG5nIHRoYW0gZ2lhIGPDtG5nIMSRb8OgbiBjYW8gaMahbiAxLjI2MyBs4bqnbiBzbyB24bubaSBuaOG7r25nIG5nxrDhu51pIHRodeG7mWMgbmjDs20gbmfDoG5oIHPhuqNuIHh14bqldC4gICANCg0KVuG7m2kgbeG7qWMgdGluIGPhuq15IDk1JSwga2jhuqMgbsSDbmcga2jDtG5nIHRoYW0gZ2lhIGPDtG5nIMSRb8OgbiDhu58gbmjDs20ga2jDtG5nIHRodeG7mWMgbmfDoG5oIHPhuqNuIHh14bqldCBjYW8gY2FvIGjGoW4gdOG7qyBraG/huqNuZyAxLjE5OTkgxJHhur9uIDEuMzI5IGzhuqduIHNvIHbhu5tpIG5ow7NtIHRodeG7mWMgbmfDoG5oIHPhuqNuIHh14bqldC4gICANCg0KS+G6v3QgcXXhuqMga2nhu4NtIMSR4buLbmggY2hvIHRo4bqleSBjw7MgbeG7kWkgcXVhbiBo4buHIGPDsyDDvSBuZ2jEqWEgdGjhu5FuZyBrw6ogZ2nhu69hIG5nw6BuaCBuZ2jhu4EgdsOgIGto4bqjIG7Eg25nIGtow7RuZyB0aGFtIGdpYSBjw7RuZyDEkW/DoG4uICAgDQoNCiMjIyMgQmnhur9uIGB1bmlvbmAgdsOgIGJp4bq/biBgc291dGhgDQoqICpUSDE6IEtow7RuZyBjxrAgdHLDuiB04bqhaSBtaeG7gW4gTmFtIEhvYSBL4buzIGzDoG0gdGhhbSBjaGnhur91LiogICANCiQkIFJSID0gXGZyYWN7UChcdGV4dHtVbmlvbiB9IHwgXHRleHR7IEPGsCB0csO6IHThuqFpIG1p4buBbiBOYW0gSG9hIEvhu7N9KX17XHRleHR7UChVbmlvbiB9IHwgXHRleHR7IEtow7RuZyBjxrAgdHLDuiB04bqhaSBtaeG7gW4gTmFtIEhvYSBL4buzKX19ICQkICAgDQpgYGB7cixlY2hvPVRSVUV9DQpwMiA8LSB0YWJsZShmYWN0b3IoZDEkc291dGgsIGxldmVscyA9IGMoIm5vIiwgInllcyIpLCANCiAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoIktow7RuZyBjxrAgdHLDuiB04bqhaSBtaeG7gW4gTmFtIiwgIkPGsCB0csO6IHThuqFpIG1p4buBbiBOYW0iKSksDQogICAgICAgICAgIGZhY3RvcihkMSR1bmlvbiwgbGV2ZWxzID0gYygibm8iLCAieWVzIiksIA0KICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygiTm9uLXVuaW9uIiwgIlVuaW9uIikpKQ0Kcmlza3JhdGlvKHAyKQ0KDQpgYGANCg0KKipOaOG6rW4geMOpdDoqKiAgIA0KDQpHacOhIHRy4buLIFJlbGF0aXZlIFJpc2sgbmjhuq1uIMSRxrDhu6NjIGzDoCAwLjU4MzMsIG5o4buPIGjGoW4gMS4gTmjhu69uZyBuZ8aw4budaSBsYW8gxJHhu5luZyBjxrAgdHLDuiB04bqhaSBtaeG7gW4gTmFtIEhvYSBL4buzIGPDsyBraOG6oyBuxINuZyB0aGFtIGdpYSBjw7RuZyDEkW/DoG4gdGjhuqVwIGjGoW4gMC41ODMzIGzhuqduIHNvIHbhu5tpIG5o4buvbmcgbmfGsOG7nWkga2jDtG5nIGPGsCB0csO6IHThuqFpIG1p4buBbiBOYW0gSG9hIEvhu7MuICAgDQoNClbhu5tpIMSR4buZIHRpbiBj4bqteSA5NSUsIGto4bqjIG7Eg25nIHRoYW0gZ2lhIGPDtG5nIMSRb8OgbiBj4bunYSBuaMOzbSBuZ8aw4budaSBsYW8gxJHhu5luZyBjxrAgdHLDuiB04bqhaSBtaeG7gW4gTmFtIHRo4bqlcCBoxqFuIHThu6sga2hv4bqjbmcgMC41MjMgxJHhur9uIDAuNjUgbOG6p24gc28gduG7m2kgbmjDs20gbmjhu69uZyBuZ8aw4budaSBraMO0bmcgY8awIHRyw7ogdOG6oWkgbWnhu4FuIE5hbSBIb2EgS+G7sy4gICAgDQpL4bq/dCBxdeG6oyBraeG7g20gxJHhu4tuaCBDaGktc3F1YXJlIGNobyB0aOG6pXkgY8OzIG3hu5FpIGxpw6puIGjhu4cgY8OzIMO9IG5naMSpYSB0aOG7kW5nIGvDqiBnaeG7r2Ega2h1IHbhu7FjIGPGsCB0csO6IHbDoCBraOG6oyBuxINuZyB0aGFtIGdpYSBjw7RuZyDEkW/DoG4uICAgDQoNCiogKlRIMjogQ8awIHRyw7ogdOG6oWkga2h1IHbhu7FjIG1p4buBbiBOYW0gbMOgbSB0aGFtIGNoaeG6v3UuKiAgIA0KDQokJCBSUiA9IFxmcmFje1AoXHRleHR7Tm9uLXVuaW9uIH0gfCBcdGV4dHsgS2jDtG5nIGPGsCB0csO6IHThuqFpIG1p4buBbiBOYW0gSG9hIEvhu7N9KX17XHRleHR7UChOb24tdW5pb24gfSB8IFx0ZXh0eyBDxrAgdHLDuiB04bqhaSBtaeG7gW4gTmFtIEhvYSBL4buzKX19ICQkICAgDQpgYGB7cixlY2hvPVRSVUV9DQpyaXNrcmF0aW8ocDIscmV2PSJiIikNCmBgYA0KDQoqKk5o4bqtbiB4w6l0OioqICAgDQoNCkdpw6EgdHLhu4sgY+G7p2EgUmVsYXRpdmUgUmlzayBsw6AgMC43NzMsIG5o4buPIGjGoW4gMS4gTmdoxKlhIGzDoCBuaOG7r25nIG5nxrDhu51pIGxhbyDEkeG7mW5nIGtow7RuZyBjxrAgdHLDuiB04bqhaSBtaeG7gW4gTmFtIEhvYSBr4buzIGPDsyBraOG6oyBuxINuZyBraMO0bmcgdGhhbSBnaWEgY8O0bmcgxJFvw6BuIHRo4bqlcCBoxqFuIDAuNzczIGzhuqduIHNvIHbhu5tpIG5o4buvbmcgbmfGsOG7nWkgbGFvIMSR4buZbmcgY8awIHRyw7ogdOG6oWkgbWnhu4FuIE5hbSBIb2Ega+G7sy4gICANCg0KVuG7m2kgxJHhu5kgdGluIGPhuq15IDk1JSwga2jhuqMgbsSDbmcga2jDtG5nIHRoYW0gZ2lhIGPDtG5nIMSRb8OgbiBj4bunYSBuaOG7r25nIG5nxrDhu51pIGtow7RuZyBjxrAgdHLDuiB04bqhaSBtaeG7gW4gTmFtIHRo4bqlcCBoxqFuIGtob+G6o25nIHThu6sgMC43NCDEkeG6v24gMC44MDcgbOG6p24gc28gduG7m2kgbmjhu69uZyBuZ8aw4budaSBjxrAgdHLDuiB04bqhaSBtaeG7gW4gTmFtIEhvYSBr4buzLiAgIA0KDQpL4bq/dCBxdeG6oyBraeG7g20gxJHhu4tuaCBDaGktc3F1YXJlIGNobyB0aOG6pXkgY8OzIG3hu5FpIGxpw6puIGjhu4cgY8OzIMO9IG5naMSpYSB0aOG7kW5nIGvDqiBnaeG7r2Ega2h1IHbhu7FjIGPGsCB0csO6IHbDoCBraOG6oyBuxINuZyBraMO0bmcgdGhhbSBnaWEgY8O0bmcgxJFvw6BuLiAgIA0KDQojIyMjIEJp4bq/biBgdW5pb25gIHbDoCBiaeG6v24gYG1hcnJpZWRgDQoNCiogKlRIMTogQ2jGsGEga+G6v3QgaMO0biBsw6BtIHRoYW0gY2hp4bq/dS4qICAgDQokJCBSUiA9IFxmcmFje1AoXHRleHR7VW5pb24gfSB8IFx0ZXh0eyDEkMOjIGvhur90IGjDtG59KX17XHRleHR7UChVbmlvbiB9IHwgXHRleHR7IENoxrBhIGvhur90IGjDtG4pfX0gJCQgICANCiAgDQpgYGB7cixlY2hvPVRSVUV9DQpwMyA8LSB0YWJsZShmYWN0b3IoZDEkbWFycmllZCwgbGV2ZWxzID0gYygibm8iLCAieWVzIiksIA0KICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygiQ2jGsGEga+G6v3QgaMO0biIsICLEkMOjIGvhur90IGjDtG4iKSksDQogICAgICAgICAgIGZhY3RvcihkMSR1bmlvbiwgbGV2ZWxzID0gYygibm8iLCAieWVzIiksIA0KICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygiTm9uLXVuaW9uIiwgIlVuaW9uIikpKQ0Kcmlza3JhdGlvKHAzKQ0KDQpgYGANCioqTmjhuq1uIHjDqXQ6KiogICANCg0KR2nDoSB0cuG7iyBSZWxhdGl2ZSBSaXNrIG5o4bqtbiDEkcaw4bujYyBsw6AgMS41NywgbOG7m24gaMahbiAxLiBOaOG7r25nIG5nxrDhu51pIGxhbyDEkcO0bmcgxJHDoyBr4bq/dCBow7RuIGPDsyBraOG6oyBuxINuZyB0aGFtIGdpYSBjw7RuZyDEkW/DoG4gY2FvIGjGoW4gMS41NyBs4bqnbiBzbyB24bubaSBuaOG7r25nIG5nxrDhu51pIGxhbyDEkeG7mW5nIGNoxrBhIGvhur90IGjDtG4uICAgDQoNCsSQ4buZIHRpbiBj4bqteSA5NSUsIGto4bqjIG7Eg25nIHRoYW0gZ2lhIGPDtG5nIMSRb8OgbiBj4bunYSBuaOG7r25nIG5nxrDhu51pIGxhbyDEkeG7mW5nIMSRw6Mga+G6v3QgaMO0biBjYW8gaMahbiBraG/huqNuZyB04burIDEuMzggxJHhur9uIDEuNzkgbOG6p24gc28gduG7m2kgbmjhu69uZyBuZ8aw4budaSBsYW8gxJHhu5luZyBjaMawYSBr4bq/dCBow7RuLiAgIA0KDQpL4bq/dCBxdeG6oyBraeG7g20gxJHhu4tuaCBjaG8gdGjhuqV5IGPDsyBt4buRaSBxdWFuIGjhu4cgY8OzIMO9IG5naMSpYSB0aOG7kW5nIGvDqiBnaeG7r2EgdMOsbmggdHLhuqFuZyBow7RuIG5ow6JuIHbDoCBraOG6oyBuxINuZyB0aGFtIGdpYSBjw7RuZyDEkW/DoG4uICAgDQoNCiogKlRIMjogxJDDoyBr4bq/dCBow7RuIGzDoG0gdGhhbSBjaGnhur91LiogICANCiQkIFJSID0gXGZyYWN7UChcdGV4dHtOb24tdW5pb24gfSB8IFx0ZXh0eyBDaMawYSBr4bq/dCBow7RufSl9e1x0ZXh0e1AoTm9uLXVuaW9uIH0gfCBcdGV4dHsgxJDDoyBr4bq/dCBow7RuKX19ICQkDQoNCmBgYHtyLGVjaG89VFJVRX0NCnJpc2tyYXRpbyhwMyxyZXY9ImIiKQ0KYGBgDQoqKk5o4bqtbiB4w6l0OioqICAgDQoNCkdpw6EgdHLhu4sgUmVsYXRpdmUgUmlzayBuaOG6rW4gxJHGsOG7o2MgbMOgIDEuMjMzLCBs4bubbiBoxqFuIDEuIE5o4buvbmcgbmfGsOG7nWkgbGFvIMSR4buZbmcgY2jGsGEga+G6v3QgaMO0biBjw7Mga2jhuqMgbsSDbmcga2jDtG5nIHRoYW0gZ2lhIGPDtG5nIMSRb8OgbiBjYW8gaMahbiAxLjIzMyBs4bqnbiBzbyB24bubaSBuaOG7r25nIG5nxrDhu51pIGxhbyDEkeG7mW5nIMSRw6Mga+G6v3QgaMO0bi4gICANCg0KVuG7m2kgxJHhu5kgdGluIGPhuq15IDk1JSwga2jhuqMgbsSDbmcga2jDtG5nIHRoYW0gZ2lhIGPDtG5nIMSRb8OgbiBj4bunYSBuaOG7r25nIG5nxrDhu51pIGxhbyDEkeG7mW5nIGNoxrBhIGvhur90IGjDtG4gY2FvIGjGoW4ga2hv4bqjbmcgdOG7qyAxLjE3NCDEkeG6v24gMS4yOSBs4bqnbiBzbyB24bubaSBuaOG7r25nIG5nxrDhu51pIGxhbyDEkeG7mW5nIMSRw6Mga+G6v3QgaMO0bi4gICANCg0KS+G6v3QgcXXhuqMga2nhu4NtIMSR4buLbmggQ2hpLXNxdWFyZSBjaG8gdGjhuqV5IGPDsyBt4buRaSBxdWFuIGjhu4cgY8OzIMO9IG5naMSpYSB0aOG7kW5nIGvDqiBnaeG7r2EgdMOsbmggdHLhuqFuZyBow7RuIG5ow6JuIHbhu5tpIGto4bqjIG7Eg25nIGtow7RuZyB0aGFtIGdpYSBjw7RuZyDEkW/DoG4uICAgDQoNCiMjIyMgQmnhur9uIGB1bmlvbmAgdsOgIGJp4bq/biBgc2V4YA0KKlRIMTogR2nhu5tpIHTDrW5oIG7hu68gbMOgbSB0aGFtIGNoaeG6v3UqICAgDQokJCBSUiA9IFxmcmFje1AoXHRleHR7VW5pb24gfSB8IFx0ZXh0eyBtYWxlfSl9e1x0ZXh0e1AoVW5pb24gfSB8IFx0ZXh0eyBmZW1hbGUpfX0gJCQNCmBgYHtyLGVjaG89VFJVRX0NCnA0IDwtIHRhYmxlKGQxJHNleCwNCiAgICAgICAgICAgZmFjdG9yKGQxJHVuaW9uLCBsZXZlbHMgPSBjKCJubyIsICJ5ZXMiKSwgDQogICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCJOb24tdW5pb24iLCAiVW5pb24iKSkpDQpyaXNrcmF0aW8ocDQpDQoNCmBgYA0KKipOaOG6rW4geMOpdDoqKiAgIA0KDQpHacOhIHRy4buLIFJlbGF0aXZlIFJpc2sgbmjhuq1uIMSRxrDhu6NjIGzDoCAxLjgyLCBs4bubbiBoxqFuIDEuIE5o4buvbmcgbmfGsOG7nWkgbGFvIMSR4buZbmcgbmFtIGPDsyBraOG6oyBuxINuZyB0aGFtIGdpYSBjw7RuZyDEkW/DoG4gY2FvIGjGoW4gMS44MiBs4bqnbiBzbyB24bubaSBuaOG7r25nIG5nxrDhu51pIGxhbyDEkeG7mW5nIGPDsyBnaeG7m2kgdMOtbmggbuG7ry4gICANCg0KVuG7m2kgxJHhu5kgdGluIGPhuq15IDk1JSwga2jhuqMgbsSDbmcgdGhhbSBnaWEgY8O0bmcgxJFvw6BuIGPhu6dhIG5nxrDhu51pIGxhbyDEkeG7mW5nIG5hbSBjYW8gaMahbiB04burIDEuNTIgxJHhur9uIDIuMTcgbOG6p24gc28gduG7m2kgbmfGsOG7nWkgbGFvIMSR4buZbmcgbuG7ry4gICANCg0KS+G6v3QgcXXhuqMga2nhu4NtIMSR4buLbmggQ2hpLXNxdWFyZSBjaG8gdGjhuqV5IGPDsyBt4buRaSBxdWFuIGjhu4cgY8OzIMO9IG5naMSpYSB0aOG7kW5nIGvDqiBnaeG7r2EgZ2nhu5tpIHTDrW5oIHbDoCBraOG6oyBuxINuZyB0aGFtIGdpYSBjw7RuZyDEkW/DoG4uICAgDQoNCipUSDI6IEdp4bubaSB0w61uaCBuYW0gbMOgbSB0aGFtIGNoaeG6v3UqICAgDQokJCBSUiA9IFxmcmFje1AoXHRleHR7Tm9uLXVuaW9uIH0gfCBcdGV4dHsgZmVtYWxlfSl9e1x0ZXh0e1AoTm9uLXVuaW9uIH0gfCBcdGV4dHsgbWFsZSl9fSAkJA0KYGBge3IsZWNobz1UUlVFfQ0KDQpyaXNrcmF0aW8ocDQsIHJldj0iYiIpDQoNCmBgYA0KKipOaOG6rW4geMOpdDoqKiAgIA0KDQpHacOhIHRy4buLIFJlbGF0aXZlIFJpc2sgbmjhuq1uIMSRxrDhu6NjIGzDoCAxLjI4LCBs4bubbiBoxqFuIDEuIE5o4buvbmcgbmfGsOG7nWkgbGFvIMSR4buZbmcgbuG7ryBjw7Mga2jhuqMgbsSDbmcga2jDtG5nIHRoYW0gZ2lhIGPDtG5nIMSRb8OgbiBjYW8gaMahbiAxLjI4IGzhuqduIHNvIHbhu5tpIG5o4buvbmcgbmfGsOG7nWkgbGFvIMSR4buZbmcgbmFtLiAgIA0KDQpW4bubaSDEkeG7mSB0aW4gY+G6rXkgOTUlLCBraOG6oyBuxINuZyBraMO0bmcgdGhhbSBnaWEgY8O0bmcgxJFvw6BuIGPhu6dhIG5o4buvbmcgbmfGsOG7nWkgbGFvIMSR4buZbmcgbuG7ryBjYW8gaMahbiBzbyB24bubaSBuaOG7r25nIG5nxrDhu51pIGxhbyDEkeG7mW5nIG5hbSBraG/huqNuZyB04burIDEuMjEgxJHhur9uIDEuMzUgbOG6p24uICAgDQoNCkvhur90IHF14bqjIGtp4buDbSDEkeG7i25oIENoaS1zcXVhcmUgY2hvIHRo4bqleSBjw7MgbeG7kWkgcXVhbiBo4buHIGPDsyDDvSBuZ2jEqWEgdGjhu5FuZyBrw6ogZ2nhu69hIGdp4bubaSB0w61uaCB2w6Aga2jhuqMgbsSDbmcga2jDtG5nIHRoYW0gZ2lhIGPDtG5nIMSRb8Ogbi4gICANCg0KIyMjIyBCaeG6v24gYHVuaW9uYCB2w6AgYmnhur9uIGBibGFja2ANCg0KKiAqVEgxOiBLaMO0bmcgcGjhuqNpIG5nxrDhu51pIGRhIMSRZW4gbMOgbSB0aGFtIGNoaeG6v3UuKiAgIA0KJCQgUlIgPSBcZnJhY3tQKFx0ZXh0e1VuaW9uIH0gfCBcdGV4dHsgTmfGsOG7nWkgZGEgxJFlbn0pfXtcdGV4dHtQKFVuaW9uIH0gfCBcdGV4dHsgS2jDtG5nIHBo4bqjaSBuZ8aw4budaSBkYSDEkWVuKX19ICQkDQpgYGB7cixlY2hvPVRSVUV9DQpwNSA8LSB0YWJsZShmYWN0b3IoZDEkYmxhY2ssIGxldmVscyA9IGMoIm5vIiwgInllcyIpLCANCiAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoIktow7RuZyBwaOG6o2kgbmfGsOG7nWkgZGEgxJFlbiIsICJOZ8aw4budaSBkYSDEkWVuIikpLA0KICAgICAgICAgICBmYWN0b3IoZDEkdW5pb24sIGxldmVscyA9IGMoIm5vIiwgInllcyIpLCANCiAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoIk5vbi11bmlvbiIsICJVbmlvbiIpKSkNCnJpc2tyYXRpbyhwNSkNCg0KYGBgDQoNCioqTmjhuq1uIHjDqXQ6KiogICANCg0KR2nDoSB0cuG7iyBSZWxhdGl2ZSBSaXNrIGzDoCAxLjI0NSwgbOG7m24gaMahbiAxLiBOaOG7r25nIG5nxrDhu51pIGxhbyDEkeG7mW5nIGzDoCBuZ8aw4budaSBkYSDEkWVuIGPDsyBraOG6oyBuxINuZyB0aGFtIGdpYSBjw7RuZyDEkW/DoG4gY2FvIGjGoW4gMS4yNDUgbOG6p24gc28gduG7m2kgbmjhu69uZyBuZ8aw4budaSBsYW8gxJHhu5luZyBraMO0bmcgcGjhuqNpIGzDoCBuZ8aw4budaSBkYSDEkWVuLiAgIA0KDQpW4bubaSDEkeG7mSB0aW4gY+G6rXkgOTUlLCBraOG6oyBuxINuZyB0aGFtIGdpYSBjw7RuZyDEkW/DoG4gY+G7p2EgbmfGsOG7nWkgZGEgxJFlbiBjYW8gaMahbiBzbyB24bubaSBuaOG7r25nIG5nxrDhu51pIGtow7RuZyBwaOG6o2kgbmfGsOG7nWkgZGEgxJFlbiBraG/huqNuZyB04burIDEuMDg5IMSR4bq/biAxLjQyMiBs4bqnbi4gICANCg0KS+G6v3QgcXXhuqMga2nhu4NtIMSR4buLbmggQ2hpLXNxdWFyZSBjaG8gdGjhuqV5IGPDsyBt4buRaSBxdWFuIGjhu4cgY8OzIMO9IG5naMSpYSB0aOG7kW5nIGvDqiBnaeG7r2EgY2jhu6duZyB04buZYyB2w6Aga2jhuqMgbsSDbmcgdGhhbSBnaWEgY8O0bmcgxJFvw6BuLiAgIA0KDQoqICpUSDI6IENo4bunbmcgdOG7mWMgbMOgIG5nxrDhu51pIGRhIMSRZW4gbMOgbSB0aGFtIGNoaeG6v3UuKiAgIA0KDQokJCBSUiA9IFxmcmFje1AoXHRleHR7Tm9uLXVuaW9uIH0gfCBcdGV4dHsgS2jDtG5nIHBo4bqjaSBuZ8aw4budaSBkYSDEkWVufSl9e1x0ZXh0e1AoTm9uLXVuaW9uIH0gfCBcdGV4dHsgTmfGsOG7nWkgZGEgxJFlbil9fSAkJA0KYGBge3IsZWNobz1UUlVFfQ0Kcmlza3JhdGlvKHA1LHJldj0iYiIpDQpgYGANCg0KKipOaOG6rW4geMOpdDoqKiAgIA0KDQpHacOhIHRy4buLIFJlbGF0aXZlIFJpc2sgbMOgIDEuMTU4LCBjYW8gaMahbiAxLiBOaOG7r25nIG5nxrDhu51pIGxhbyDEkeG7mW5nIGtow7RuZyBwaOG6o2kgbmfGsOG7nWkgZGEgxJFlbiBjw7Mga2jhuqMgbsSDbmcga2jDtG5nIHRoYW0gZ2lhIGPDtG5nIMSRb8OgbiBjYW8gaMahbiAxLjE1OCBs4bqnbiBzbyB24bubaSBuaOG7r25nIG5nxrDhu51pIGRhIMSRZW4uICAgDQoNClbhu5tpIMSR4buZIHRpbiBj4bqteSA5NSUsIGto4bqjIG7Eg25nIGtow7RuZyB0aGFtIGdpYSBjw7RuZyDEkW/DoG4gY+G7p2Egbmjhu69uZyBuZ8aw4budaSBsYW8gxJHhu5luZyBraMO0bmcgcGjhuqNpIG5nxrDhu51pIGRhIMSRZW4gY2FvIGjGoW4gc28gduG7m2kgbmfGsOG7nWkgbGFvIMSR4buZbmcgZGEgxJFlbiBsw6Aga2hv4bqjbmcgdOG7qyAxLjA0NCDEkeG6v24gMS4yODUgbOG6p24uICAgDQoNCkvhur90IHF14bqjIGtp4buDbSDEkeG7i25oIENoaS1zcXVhcmUgY2hvIHRo4bqleSBjw7MgbeG7kWkgbGnDqm4gaOG7hyBjw7Mgw70gbmdoxKlhIHRo4buRbmcga8OqIGdp4buvYSBjaOG7p25nIHThu5ljIHbDoCBraOG6oyBuxINuZyBraMO0bmcgdGhhbSBnaWEgY8O0bmcgxJFvw6BuLiAgICANCg0KKipU4buVbmcgaOG7o3AgUmVsYXRpdmUgUmlzayAoUlIpIGNobyBraOG6oyBuxINuZyB0aGFtIGdpYSBjw7RuZyDEkW/DoG4gY+G7p2EgbmfGsOG7nWkgbGFvIMSR4buZbmcgdOG6oWkgSG9hIEvhu7M6KiogICANCg0KfCBCaeG6v24gxJHhu5ljIGzhuq1wICAgICAgICAgICAgICAgICB8IFRoYW0gY2hp4bq/dSAgICAgICAgICAgICAgfCBTbyBzw6FuaCB24bubaSAgICAgICAgICAgICAgfCBSZWxhdGl2ZSBSaXNrIChSUikgfCAgICAgICAgICAgICAgICAgICAgICAgICBHaeG6o2kgdGjDrWNoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQp8IDotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfCA6LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfCA6LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfCA6LS0tLS0tLS0tLS0tLS0tLS0gfCA6LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8DQp8IGJsdWVjb2wgKGxhbyDEkeG7mW5nIGNow6JuIHRheSkgICAgfCBLaMO0bmcgcGjhuqNpIGxhbyDEkeG7mW5nIGNow6JuIHRheSB8IExhbyDEkeG7mW5nIGNow6JuIHRheSAgICAgICAgIHwgMy4wNSAgICAgICAgICAgICAgIHwgTGFvIMSR4buZbmcgY2jDom4gdGF5IGPDsyBraOG6oyBuxINuZyB0aGFtIGdpYSBjw7RuZyDEkW/DoG4gY2FvIGjGoW4gMy4wNSBs4bqnbiBzbyB24bubaSBuZ8aw4budaSBraMO0bmcgbGFvIMSR4buZbmcgY2jDom4gdGF5LiAgICAgICAgICAgIHwNCnwgaW5kIChuZ8Ogbmggc+G6o24geHXhuqV0KSAgICAgICAgIHwgS2jDtG5nIHRodeG7mWMgbmfDoG5oIHPhuqNuIHh14bqldCB8IFRodeG7mWMgbmfDoG5oIHPhuqNuIHh14bqldCAgICAgIHwgMS40NyAgICAgICAgICAgICAgIHwgTmfGsOG7nWkgbMOgbSB0cm9uZyBuZ8Ogbmggc+G6o24geHXhuqV0IGPDsyBraOG6oyBuxINuZyB0aGFtIGdpYSBjw7RuZyDEkW/DoG4gY2FvIGjGoW4gMS40NyBs4bqnbiBzbyB24bubaSBuZ8aw4budaSBraMOhYy4gICAgICAgICAgICAgfA0KfCBzb3V0aCAoa2h1IHbhu7FjIG1p4buBbiBOYW0pICAgICB8IEtow7RuZyBjxrAgdHLDuiBtaeG7gW4gTmFtICAgICB8IEPGsCB0csO6IHThuqFpIG1p4buBbiBOYW0gICAgICAgfCAwLjU4MyAgICAgICAgICAgICB8IE5nxrDhu51pIHPhu5FuZyB04bqhaSBtaeG7gW4gTmFtIGPDsyBraOG6oyBuxINuZyB0aGFtIGdpYSBjw7RuZyDEkW/DoG4gdGjhuqVwIGjGoW4gMC41ODMzIGzhuqduLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KfCBtYXJyaWVkICh0w6xuaCB0cuG6oW5nIGjDtG4gbmjDom4pIHwgQ2jGsGEga+G6v3QgaMO0biAgICAgICAgICAgfCDEkMOjIGvhur90IGjDtG4gICAgICAgICAgICAgICB8IDEuNTcgICAgICAgICAgICAgICB8IE5nxrDhu51pIMSRw6Mga+G6v3QgaMO0biBjw7Mga2jhuqMgbsSDbmcgdGhhbSBnaWEgY8O0bmcgxJFvw6BuIGNhbyBoxqFuIDEuNTcgbOG6p24gc28gduG7m2kgbmfGsOG7nWkgY2jGsGEga+G6v3QgaMO0bi4gICAgICAgICAgICAgICAgIHwNCnwgc2V4IChnaeG7m2kgdMOtbmgpICAgICAgICAgICAgICB8IE7hu68gICAgICAgICAgICAgICAgICAgICAgIHwgTmFtICAgICAgICAgICAgICAgICAgICAgIHwgMS44MiAgICAgICAgICAgICAgIHwgTmFtIGdp4bubaSBjw7Mga2jhuqMgbsSDbmcgdGhhbSBnaWEgY8O0bmcgxJFvw6BuIGNhbyBoxqFuIDEuODIgbOG6p24gc28gduG7m2kgbuG7ryBnaeG7m2kuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQp8IGJsYWNrIChjaOG7p25nIHThu5ljKSAgICAgICAgICAgIHwgS2jDtG5nIHBo4bqjaSBuZ8aw4budaSBkYSDEkWVuICAgfCBOZ8aw4budaSBkYSDEkWVuICAgICAgICAgICAgIHwgMS4yNDUgICAgICAgICAgICAgIHwgTmfGsOG7nWkgZGEgxJFlbiBjw7Mga2jhuqMgbsSDbmcgdGhhbSBnaWEgY8O0bmcgxJFvw6BuIGNhbyBoxqFuIDEuMjQ1IGzhuqduIHNvIHbhu5tpIG5nxrDhu51pIGtow7RuZyBwaOG6o2kgZGEgxJFlbi4gICAgICAgICAgICAgICAgIHwNCg0KIyMjIE9kZHMgcmF0aW8NCg0KKipPZGRzIC0gdOG7tyBs4buHIGNow6puaCBs4buHY2gqKjogbMOgIHThu7cgbOG7hyBnaeG7r2EgeOG6o3kgcmEgc+G7sSBraeG7h24gdsOgIHjDoWMgc3XhuqV0IGtow7RuZyB44bqjeSByYSBz4buxIGtp4buHbi4gICANCg0KTuG6v3UgeMOhYyBzdeG6pXQgeOG6o3kgcmEgc+G7sSBraeG7h24gbMOgICRwJCB0aMOsIiANCiQkIFx0ZXh0e09kZHN9ID0gXGZyYWN7cH17MS1wfSAkJCAgIA0KDQoqKk9kZHMgUmF0aW8gLSB04bu3IGzhu4cgY2jDqm5oIGzhu4djaCBnaeG7r2EgaGFpIG5ow7NtKio6IGzDoCB04bu3IHPhu5EgZ2nhu69hIGhhaSBPZGRzLCBkw7luZyDEkeG7gyBzbyBzw6FuaCB4w6FjIHN14bqldCB44bqjeSByYSBnaeG7r2Ega2nhu4duIGdp4buvYSBuaMOzbSBjw7MgYmnhu4N1IGhp4buHbiBj4bqnbiBxdWFuIHTDom0gdsOgIG5ow7NtIGtow7RuZyBjw7MgYmnhu4N1IGhp4buHbiBj4bqnbiBxdWFuIHTDom0uICAgDQoNCiQkIFx0ZXh0e09SfSA9IFxmcmFje1xmcmFje1AoXHRleHR7U+G7sSBraeG7h24geOG6o3kgcmEgfSB8IFx0ZXh0eyBOaMOzbSBjw7MgYmnhu4N1IGhp4buHbiBj4bqnbiBxdWFuIHTDom19KX17UChcdGV4dHtLaMO0bmcgeOG6o3kgcmEgc+G7sSBraeG7h24gfSB8IFx0ZXh0eyBOaMOzbSBjw7MgYmnhu4N1IGhp4buHbiBj4bqnbiBxdWFuIHTDom19KX19e1xmcmFje1AoXHRleHR7U+G7sSBraeG7h24geOG6o3kgcmEgfSB8IFx0ZXh0eyBOaMOzbSBraMO0bmcgY8OzIGJp4buDdSBoaeG7h24gY+G6p24gcXVhbiB0w6JtfSl9e1AoXHRleHR7S2jDtG5nIHjhuqN5IHJhIHPhu7Ega2nhu4dufSB8IFx0ZXh0eyBOaMOzbSBraMO0bmcgY8OzIGJp4buDdSBoaeG7h24gcXVhbiB0w6JtfSl9fSAkJA0KSGF5IHZp4bq/dCBn4buNbiBoxqFuOiAgIA0KJCQgXHRleHR7T1J9ID0gXGZyYWN7XHRleHR7T2Rkc30oXHRleHR7U+G7sSBraeG7h24geOG6o3kgcmEgfSB8IFx0ZXh0eyBOaMOzbSBjw7MgYmnhu4N1IGhp4buHbiBj4bqnbiBxdWFuIHTDom19KX17XHRleHR7T2Rkc30oXHRleHR7U+G7sSBraeG7h24geOG6o3kgcmEgfSB8IFx0ZXh0eyBuaMOzbSBraMO0bmcgY8OzIGJp4buDdSBoaeG7h24gY+G6p24gcXVhbiB0w6JtfSl9ICQkDQpEaeG7hW4gZ2nhuqNpOiAgIA0KDQoqIE7hur91ICRPUj0xJDogb2RkcyB44bqjeSByYSBz4buxIGtp4buHbiDhu58gaGFpIG5ow7NtIGzDoCBuaMawIG5oYXUuICAgDQoNCiogTuG6v3UgJE9SPjEkOiBuaMOzbSBjw7MgYmnhu4N1IGhp4buHbiBj4bqnbiBxdWFuIHTDom0gY8OzIGto4bqjIG7Eg25nIHjhuqN5IHJhIHPhu7Ega2nhu4duIGNhbyBoxqFuIG5ow7NtIGtow7RuZyBjw7MgYmnhu4N1IGhp4buHbiBj4bqnbiBxdWFuIHTDom0uICAgDQoNCiogTuG6v3UgJE9SPDEkOiBuaMOzbSBjw7MgYmnhu4N1IGhp4buHbiBj4bqnbiBxdWFuIHTDom0gY8OzIGto4bqjIG7Eg25nIHjhuqN5IHJhIHPhu7Ega2nhu4duIHRo4bqlcCBoxqFuIG5ow7NtIGtow7RuZyBjw7MgYmnhu4N1IGhp4buHbiBj4bqnbiBxdWFuIHTDom0uICAgDQoNCiMjIyMgQmnhur9uIGB1bmlvbmAgdsOgIGJp4bq/biBgYmx1ZWNvbGANCmBgYHtyLGVjaG89VFJVRX0NCnAxMSA8LSB0YWJsZShmYWN0b3IoZDEkdW5pb24sIGxldmVscyA9IGMoIm5vIiwgInllcyIpLCANCiAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoIk5vbi11bmlvbiIsICJVbmlvbiIpKSxmYWN0b3IoZDEkYmx1ZWNvbCwgbGV2ZWxzID0gYygibm8iLCAieWVzIiksIA0KICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygiTm9uLWJsdWUtY29sbGFyIiwgIkJsdWUtY29sbGFyIikpKQ0Kb2Rkc3JhdGlvKHAxMSkNCg0KYGBgDQoqKk5o4bqtbiB4w6l0OioqICAgDQoNCkdpw6EgdHLhu4sgJE9SPTUuNDckLCB04bupYyBsw6AgdOG7tyBs4buHIGNow6puaCDEkeG7gyBt4buZdCBuZ8aw4budaSBsYW8gxJHhu5luZyB0aGFtIGdpYSBjw7RuZyDEkW/DoG4gbMOgbSB2aeG7h2MgdHJvbmcgbmjDs20gbGFvIMSR4buZbmcgY2jDom4gdGF5IHNvIHbhu5tpIG3hu5l0IG5nxrDhu51pIGxhbyDEkeG7mW5nIHRoYW0gZ2lhIGPDtG5nIMSRb8OgbiBraMO0bmcgbMOgbSBsb+G6oWkgY8O0bmcgdmnhu4djIGNow6JuIHRheSBjYW8gaMahbiA1LjQ3IGzhuqduIHThu7cgbOG7hyBjaMOqbmggdMawxqFuZyDhu6luZyBj4bunYSBuZ8aw4budaSBraMO0bmcgdGhhbSBnaWEgY8O0bmcgxJFvw6BuLiAgIA0KDQpOw7NpIGPDoWNoIGtow6FjLCBuZ8aw4budaSB0aGFtIGdpYSBjw7RuZyDEkW/DoG4gY8OzIGto4bqjIG7Eg25nIGzDoG0gdmnhu4djIHRyb25nIG5ow7NtIGxhbyDEkeG7mW5nIGNow6JuIHRheSBjYXAgaMahbiBn4bqlcCBoxqFuIDUgbOG6p24gc28gduG7m2kgbmfGsOG7nWkga2jDtG5nIHRoYW0gY8O0bmcgxJFvw6BuLiAgICANCg0KS2hv4bqjbmcgdGluIGPhuq15IGPhu6dhIE9SIHbhu5tpIMSR4buZIHRpbiBj4bqteSA5NSUgbMOgICg0Ljc1OyA2LjMxKSwga2jDtG5nIGNo4bupYSBnacOhIHRy4buLIDEsIG7Dqm4gc+G7sSBraMOhYyBiaeG7h3QgduG7gSBvZGRzIGxv4bqhaSBsYW8gxJHhu5luZyBnaeG7r2EgMiBuaMOzbSBsw6AgY8OzIMO9IG5naMSpYSB0aOG7kW5nIGvDqi4gICANCg0KQ8OhYyBnacOhIHRy4buLIHAtdmFsdWUgY+G7p2EgY8OhYyBraeG7g20gxJHhu4tuaCBraOG6s25nIMSR4buLbmggc+G7sSBraMOhYyBiaeG7h3Qgb2RkcyBsw6AgY8OzIMO9IG5naMSpYSB0aOG7kW5nIGvDqiBt4bqhbmguICAgDQoNCiMjIyMgQknhur9uIGB1bmlvbmAgdsOgIGJp4bq/biBgaW5kYA0KDQpgYGB7cixlY2hvPVRSVUV9DQpwNiA8LSB0YWJsZShmYWN0b3IoZDEkdW5pb24sIGxldmVscyA9IGMoIm5vIiwgInllcyIpLCANCiAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoIk5vbi11bmlvbiIsICJVbmlvbiIpKSxkMSRpbmQpDQpvZGRzcmF0aW8ocDYpDQoNCmBgYA0KKipOaOG6rW4geMOpdDoqKiAgIA0KDQpPZGRzIHJhdGlvICQ9MS44NTUkLCDEkWnhu4F1IG7DoHkgY8OzIG5naMSpYSBsw6AgdOG7tyBs4buHIGNow6puaCBs4buHY2ggxJHhu4MgbeG7mXQgbmfGsOG7nWkgbGFvIMSR4buZbmcgdGhhbSBnaWEgY8O0bmcgxJFvw6BuIGtow7RuZyBsw6BtIHZp4buHYyB0cm9uZyBuZ8Ogbmggc+G6o24geHXhuqV0IHNvIHbhu5tpIG5nxrDhu51pIGxhbyDEkeG7mW5nIHRoYW0gZ2lhIGPDtG5nIMSRb8OgbiBsw6BtIHZp4buHYyB0cm9uZyBuZ8Ogbmggc+G6o24geHXhuqV0IGNobyBoxqFuIDEuODU1IGzhuqduIHNvIHbhu5tpIG5nxrDhu51pIGxhbyDEkeG7mW5nIGtow7RuZyB0aGFtIGdpYSBjw7RuZyDEkW/DoG4uICAgDQoNCk7Ds2kgY8OhY2gga2jDoWMsIG5nxrDhu51pIHRoYW0gZ2lhIGPDtG5nIMSRb8OgbiBjw7Mga2jhuqMgbsSDbmcga2jDtG5nIGzDoG0gdmnhu4djIHRyb25nIG5nw6BuaCBz4bqjbiB4deG6pXQgY2FvIGjGoW4gZ+G6p24gZ+G6pXAgxJHDtGkgc28gduG7m2kgbmfGsOG7nWkga2jDtG5nIHRoYW0gZ2lhIGPDtG5nIMSRb8Ogbi4gICANCg0KS2hv4bqjbmcgdGluIGPhuq15IGPhu6dhIE9SIGzDoCAoMS42MzE7Mi4xMTApLCBraMO0bmcgY2jhu6lhIGdpw6EgdHLhu4sgMSwgY8OzIHRo4buDIGvhur90IGx14bqtbiBz4buxIGtow6FjIGJp4buHdCBuw6B5IGPDsyDDvSBuZ2jEqWEgdGjhu5FuZyBrw6og4bufIG3hu6ljIHRpbiBj4bqteSA5NSUuICAgDQoNCkPDoWMgZ2nDoSB0cuG7iyBwLXZhbHVlIGNobyBraeG7g20gxJHhu4tuaCDDvSBuZ2jEqWEgT1IgZ+G6p24gbmjGsCBi4bqxbmcgMCwgY8OzIHRo4buDIGvhur90IGx14bqtbiBy4bqxbmcgc+G7sSBraMOhYyBiaeG7h3Qgb2RkcyBnaeG7r2EgbmjDs20gdGhhbSBnaWEgY8O0bmcgxJFvw6BuIHbDoCBuaMOzbSBraMO0bmcgdGhhbSBnaWEgY8O0bmcgxJFvw6BuIGzDoCBjw7Mgw70gbmdoxKlhIHRo4buRbmcga8OqLiAgIA0KDQoNCktob+G6o25nIHRpbiBj4bqteSA5NSUgY2hvIG9kZHMgcmF0aW8gbMOgICgxLjYzMTsyLjExKSwga2jDtG5nIGJhbyBn4buTbSBnacOhIHRy4buLIDEsIGNobyB0aOG6pXkgc+G7sSBraMOhYyBiaeG7h3QgbsOgeSBjw7Mgw70gbmdoxKlhIHRo4buRbmcga8OqLg0KDQojIyMjIEJp4bq/biBgdW5pb25gIHbDoCBiaeG6v24gYHNvdXRoYA0KDQpgYGB7cixlY2hvPVRSVUV9DQpwNyA8LSB0YWJsZShmYWN0b3IoZDEkdW5pb24sIGxldmVscyA9IGMoIm5vIiwgInllcyIpLCANCiAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoIk5vbi11bmlvbiIsICJVbmlvbiIpKSxmYWN0b3IoZDEkc291dGgsIGxldmVscyA9IGMoIm5vIiwgInllcyIpLCANCiAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoIm5vbi1zb3V0aCIsICJzb3V0aCIpKSkNCm9kZHNyYXRpbyhwNykNCg0KYGBgDQoqKk5o4bqtbiB4w6l0OioqICAgDQoNCkdpw6EgdHLhu4sgJE9SPTAuNDUxJCwgY8OzIG5naMSpYSBsw6AgdOG7tyBs4buHIGNow6puaCBs4buHY2ggxJHhu4MgbeG7mXQgbmfGsOG7nWkgbGFvIMSR4buZbmcgdGhhbSBnaWEgY8O0bmcgxJFvw6BuIGtow7RuZyBz4buRbmcgdOG6oWkgbWnhu4FuIE5hbSBIb2EgS+G7syBzbyB24bubaSBuZ8aw4budaSBsYW8gxJHhu5luZyB0aGFtIGdpYSBjw7RuZyDEkW/DoG4gc+G7kW5nIHThuqFpIG1p4buBbiBOYW0gSG9hIEvhu7MgY2jhu4kgYuG6sW5nIGtob+G6o25nIDQ1LjElIHThu7cgbOG7hyBjaMOqbmggY+G7p2EgbmfGsOG7nWkga2jDtG5nIHRoYW0gZ2lhIGPDtG5nIMSRb8Ogbi4gICANCg0KTsOzaSBjw6FjaCBraMOhYywgbmfGsOG7nWkgdGhhbSBnaWEgY8O0bmcgxJFvw6BuIGPDsyBraOG6oyBuxINuZyBz4buRbmcgdOG6oWkgbWnhu4FuIE5hbSB0aOG6pXAgaMahbiA1NSUgc28gduG7m2kgbmfGsOG7nWkga2jDtG5nIHRoYW0gZ2lhIGPDtG5nIMSRb8Ogbi4gICANCg0KS2hv4bqjbmcgdGluIGPhuq15IGPhu6dhIE9SIHbhu5tpIMSR4buZIHRpbiBj4bqteSA5NSUgbMOgICgwLjM4NzM7MC41MjM2KSwga2jDtG5nIGNo4bupYSBnacOhIHRy4buLIDEsIGNobyB0aOG6pXkgc+G7sSBraMOhYyBiaeG7h3QgxJHDoW5nIGvhu4MgduG7gSBvZGRzIGdp4buvYSBuaMOzbSB0aGFtIGdpYSBjw7RuZyDEkW/DoG4gdsOgIGtow7RuZyB0aGFtIGdpYSBjw7RuZyDEkW/DoG4gbMOgIGPDsyDDvSBuZ2jEqWEgdGjhu5FuZyBrw6ouICAgDQoNCkdpw6EgdHLhu4sgcC12YWx1ZSB04burIGPDoWMga2nhu4NtIMSR4buLbmggxJHhu4F1IGfhuqduIGLhurFuZyAwLCBjw6BuZyBraOG6s25nIMSR4buLbmggcuG6sW5nIG9kZHMgZ2nhu69hIGhhaSBuaMOzbSBsw6AgY8OzIMO9IG5naMSpYS4gICANCg0KIyMjIyBCaeG6v24gYHVuaW9uYCB2w6AgYmnhur9uIGBtYXJyaWVkYA0KDQpgYGB7cixlY2hvPVRSVUV9DQpwOCA8LSB0YWJsZShmYWN0b3IoZDEkdW5pb24sIGxldmVscyA9IGMoIm5vIiwgInllcyIpLCANCiAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoIk5vbi11bmlvbiIsICJVbmlvbiIpKSxmYWN0b3IoZDEkbWFycmllZCwgbGV2ZWxzID0gYygibm8iLCAieWVzIiksIA0KICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygiU2luZ2xlIiwgIk1hcnJpZWQiKSkpDQpvZGRzcmF0aW8ocDgpDQoNCmBgYA0KKipOaOG6rW4geMOpdDoqKiAgIA0KDQpHacOhIHRy4buLICRPUj0xLjkzNiQsIHThu6ljIGzDoCB04bu3IGzhu4cgY2jDqm5oIMSR4buDIG3hu5l0IG5nxrDhu51pIGxhbyDEkeG7mW5nIHRoYW0gZ2lhIGPDtG5nIMSRb8OgbiBjaMawYSBr4bq/dCBow7RuIHNvIHbhu5tpIG5nxrDhu51pIGxhbyDEkeG7mW5nIHRoYW0gZ2lhIGPDtG5nIMSRb8OgbiDEkcOjIGvhur90IGjDtG4gY2FvIGjGoW4gZ+G6p24gMS45NCBs4bqnbiBzbyB24bubaSBuZ8aw4budaSBraMO0bmcgdGhhbSBnaWEgY8O0bmcgxJFvw6BuLiAgIA0KDQpOw7NpIGPDoWNoIGtow6FjLCBuZ8aw4budaSB0aGFtIGdpYSBjw7RuZyDEkW/DoG4gY8OzIGto4bqjIG7Eg25nIMSR4buZYyB0aMOibiBjYW8gaMahbiBn4bqnbiBn4bqlcCDEkcO0aSBzbyB24bubaSBuZ8aw4budaSBraMO0bmcgdGhhbSBnaWEgY8O0bmcgxJFvw6BuLiAgIA0KDQpLaG/huqNuZyB0aW4gY+G6rXkgY+G7p2EgT1IgbMOgICgxLjYyNTsyLjMxNiksIGtow7RuZyBjaOG7qWEgMSwgZG8gxJHDsyBz4buxIGtow6FjIGJp4buHdCBvZGRzIHbhu4EgdHLhuqFuZyB0aMOhaSBow7RuIG5ow6JuIGdp4buvYSBuaMOzbSB0aGFtIGdpYSBjw7RuZyDEkW/DoG4gdsOgIGtow7RuZyB0aGFtIGdpYSBjw7RuZyDEkW/DoG4gbMOgIGPDsyDDvSBuZ2jEqWEgdGjhu5FuZyBrw6ouICAgDQpDw6FjIGdpw6EgdHLhu4sgcC12YWx1ZSBj4bunYSBjw6FjIGtp4buDbSDEkeG7i25oIMSR4buBdSB0aOG6pXAgaMahbiBzbyB24bubaSAwLjA1LCBr4bq/dCBsdeG6rW4gc+G7sSBraMOhYyBiaeG7h3QgbMOgIGPDsyDDvSBuZ2jEqWEgdGjhu5FuZyBrw6ogbeG6oW5oLiAgIA0KDQojIyMjIEJp4bq/biBgdW5pb25gIHbDoCBiaeG6v24gYHNleGANCmBgYHtyLGVjaG89VFJVRX0NCnA5IDwtIHRhYmxlKGZhY3RvcihkMSR1bmlvbiwgbGV2ZWxzID0gYygibm8iLCAieWVzIiksIA0KICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygiTm9uLXVuaW9uIiwgIlVuaW9uIikpLGQxJHNleCkNCm9kZHNyYXRpbyhwOSkNCg0KYGBgDQoqKk5o4bqtbiB4w6l0OioqICAgDQoNCkdpw6EgdHLhu4sgJE9SPTIuMzIkLCB04bupYyBsw6AgdOG7tyBs4buHIGNow6puaCDEkeG7gyBt4buZdCBuZ8aw4budaSBsYW8gxJHhu5luZyBu4buvIHRoYW0gZ2lhIGPDtG5nIMSRb8OgbiBzbyB24bubaSBuZ8aw4budaSBsYW8gxJHhu5luZyBuYW0gdGhhbSBnaWEgY8O0bmcgxJFvw6BuIGNhbyBoxqFuIGtob+G6o25nIDIuMzIgbOG6p24gb2RkcyB0xrDGoW5nIOG7qW5nIHbhu5tpIG5ow7NtIGtow7RuZyB0aGFtIGdpYSBjw7RuZyDEkW/DoG4uICAgDQoNCk7Ds2kgY8OhY2gga2jDoWMsIG5nxrDhu51pIHRoYW0gZ2lhIGPDtG5nIMSRb8OgbiBjw7Mga2jhuqMgbsSDbmcgbMOgIG7hu68gY2FvIGjGoW4gMiBs4bqnbiBzbyB24bubaSBuZ8aw4budaSBraMO0bmcgdGhhbSBnaWEgY8O0bmcgxJFvw6BuLiAgIA0KDQpLaG/huqNuZyB0aW4gY+G6rXkgY+G7p2EgT1IgbMOgICgxLjg1OyAyLjk0KSxraMO0bmcgY2jhu6lhIDEsIGRvIMSRw7Mgc+G7sSBraMOhYyBiaeG7h3Qgb2RkcyB24buBIHRy4bqhbmcgdGjDoWkgaMO0biBuaMOibiBnaeG7r2EgbmjDs20gdGhhbSBnaWEgY8O0bmcgxJFvw6BuIHbDoCBraMO0bmcgdGhhbSBnaWEgY8O0bmcgxJFvw6BuIGzDoCBjw7Mgw70gbmdoxKlhIHRo4buRbmcga8OqLiAgIA0KDQpDw6FjIGdpw6EgdHLhu4sgcC12YWx1ZSBj4bunYSBjw6FjIGtp4buDbSDEkeG7i25oIMSR4buBdSB0aOG6pXAgaMahbiBzbyB24bubaSAwLjA1LCBr4bq/dCBsdeG6rW4gc+G7sSBraMOhYyBiaeG7h3QgbMOgIGPDsyDDvSBuZ2jEqWEgdGjhu5FuZyBrw6ogbeG6oW5oLiAgIA0KDQojIyMjIEJp4bq/biBgdW5pb25gIHbDoCBiaeG6v24gYGJsYWNrYA0KYGBge3IsZWNobz1UUlVFfQ0KcDEwIDwtIHRhYmxlKGZhY3RvcihkMSR1bmlvbiwgbGV2ZWxzID0gYygibm8iLCAieWVzIiksIA0KICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygiTm9uLXVuaW9uIiwgIlVuaW9uIikpLGZhY3RvcihkMSRibGFjaywgbGV2ZWxzID0gYygibm8iLCAieWVzIiksIA0KICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygibm9uLWJsYWNrIiwgImJsYWNrIikpKQ0Kb2Rkc3JhdGlvKHAxMCkNCg0KYGBgDQoqKk5o4bqtbiB4w6l0OioqICAgDQpHacOhIHRy4buLICRPUj0xLjQ0MSQsIGNobyB0aOG6pXkgdOG7tyBs4buHIGNow6puaCDEkeG7gyBt4buZdCBuZ8aw4budaSBsYW8gxJHhu5luZyB0aGFtIGdpYSBjw7RuZyDEkW/DoG4gbMOgIG5nxrDhu51pIGRhIMSRZW4gc28gduG7m2kgbmfGsOG7nWkgbGFvIMSR4buZbmcgdGhhbSBnaWEgY8O0bmcgxJFvw6BuIGtow7RuZyBwaOG6o2kgbMOgIG5nxrDhu51pIGRhIMSRZW4gY2FvIGjGoW4ga2hv4bqjbmcgMS40NDEgbOG6p24gb2RkcyB0xrDGoW5nIOG7qW5nIGPhu6dhIG5ow7NtIGtow7RuZyB0aGFtIGdpYSBjw7RuZyDEkW/DoG4uICAgIA0KDQpOw7NpIGPDoWNoIGtow6FjLCBuZ8aw4budaSB0aGFtIGPDtG5nIMSRb8OgbiBjw7Mga2jhuqMgbsSDbmcgbMOgIG5nxrDhu51pIGRhIMSRZW4gY2FvIGjGoW4ga2hv4bqjbmcgNDQlIHNvIHbhu5tpIG5nxrDhu51pIGtow7RuZyB0aGFtIGdpYSBjw7RuZyDEkW/DoG4uICAgDQoNCktob+G6o25nIHRpbiBj4bqteSBj4bunYSBPUiBsw6AgKDEuMTM2OzE4MjUpLCBraMO0bmcgY2jhu6lhIGdpw6EgdHLhu4sgMSwgc+G7sSBraMOhYyBiaeG7h3QgduG7gSBvZGRzIGNo4bunbmcgdOG7mWMgZ2nhu69hIGhhaSBuaMOzbSBjw7Mgw70gbmdoxKlhIHRo4buRbmcga8OqLiAgIA0KDQpDw6FjIGdpw6EgdHLhu4sgdGh1IMSRxrDhu6NjIHThu6sgY8OhYyBraeG7g20gxJHhu4tuaCDEkeG7gXUgY2hvIHRo4bqleSBz4buxIGtow6FjIGJp4buHdCB24buBIG9kZHMgY8OzIMO9IG5naMSpYSB0aOG7kW5nIGvDqi4gICANCg0KKipC4bqjbmcgdOG7lW5nIGjhu6NwIE9kZHMgUmF0aW8gKE9SKSBjaG8ga2jhuqMgbsSDbmcgdGhhbSBnaWEgY8O0bmcgxJFvw6BuIGPhu6dhIG5nxrDhu51pIGxhbyDEkeG7mW5nIHThuqFpIEhvYSBL4buzOioqICAgDQoNCnwgKipCaeG6v24gxJHhu5ljIGzhuq1wKiogICAgICAgICAgICAgICAgICB8ICoqVGhhbSBjaGnhur91KiogICAgICAgICAgICAgICB8ICoqU28gc8OhbmggduG7m2kqKiAgICAgIHwgKipPZGRzIFJhdGlvIChPUikqKiB8ICoqR2nhuqNpIHRow61jaCoqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQp8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfCAtLS0tLS0tLS0tLS0tLS0tLS0tLSB8IC0tLS0tLS0tLS0tLS0tLS0tLS0gfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfA0KfCAqKmJsdWVjb2wqKiAobGFvIMSR4buZbmcgY2jDom4gdGF5KSAgIHwgS2jDtG5nIHBo4bqjaSBsYW8gxJHhu5luZyBjaMOibiB0YXkgfCBMYW8gxJHhu5luZyBjaMOibiB0YXkgICAgfCAzLjk3ICAgICAgICAgICAgICAgIHwgTmfGsOG7nWkgIHRodeG7mWMgbmjDs20gbGFvIMSR4buZbmcgY2jDom4gdGF5IGPDsyBvZGRzIHRoYW0gZ2lhIGPDtG5nIMSRb8OgbiBjYW8gaMahbiAzLjk3IGzhuqduIHNvIHbhu5tpIG5nxrDhu51pIGtow7RuZyB0aHXhu5ljIG5ow7NtIGxhbyDEkeG7mW5nIGNow6JuIHRheS4gfA0KfCAqKmluZCoqIChuZ8Ogbmggc+G6o24geHXhuqV0KSAgICAgICAgICB8IEtow7RuZyB0aHXhu5ljIG5nw6BuaCBz4bqjbiB4deG6pXQgICB8IFRodeG7mWMgbmfDoG5oIHPhuqNuIHh14bqldCB8IDIuMTEgICAgICAgICAgICAgICAgfCBOZ8aw4budaSB0cm9uZyBuZ8Ogbmggc+G6o24geHXhuqV0IGPDsyBvZGRzIHRoYW0gZ2lhIGPDtG5nIMSRb8OgbiBjYW8gaMahbiAyLjExIGzhuqduIHNvIHbhu5tpIG5nxrDhu51pIG5nb8OgaSBuZ8OgbmguIHwNCnwgKipzb3V0aCoqIChraHUgduG7sWMgbWnhu4FuIE5hbSkgICAgICB8IEtow7RuZyBjxrAgdHLDuiB04bqhaSBtaeG7gW4gTmFtICAgIHwgQ8awIHRyw7ogdOG6oWkgbWnhu4FuIE5hbSAgfCAwLjQ1MiAgICAgICAgICAgICAgIHwgTmfGsOG7nWkgc+G7kW5nIHThuqFpIG1p4buBbiBOYW0gY8OzIG9kZHMgdGhhbSBnaWEgY8O0bmcgxJFvw6BuICoqdGjhuqVwIGjGoW4qKiAwLjQ1MiBs4bqnbiBzbyB24bubaSBuxqFpIGtow6FjLiAgICAgICB8DQp8ICoqbWFycmllZCoqICh0w6xuaCB0cuG6oW5nIGjDtG4gbmjDom4pIHwgQ2jGsGEga+G6v3QgaMO0biAgICAgICAgICAgICAgICAgfCDEkMOjIGvhur90IGjDtG4gICAgICAgICAgIHwgMS40MSAgICAgICAgICAgICAgICB8IE5nxrDhu51pIMSRw6Mga+G6v3QgaMO0biBjw7Mgb2RkcyB0aGFtIGdpYSBjw7RuZyDEkW/DoG4gY2FvIGjGoW4gMS40MSBs4bqnbiBzbyB24bubaSBuZ8aw4budaSBjaMawYSBr4bq/dCBow7RuLiAgICAgICAgICB8DQp8ICoqc2V4KiogKGdp4bubaSB0w61uaCkgICAgICAgICAgICAgICB8IE7hu68gICAgICAgICAgICAgICAgICAgICAgICAgICB8IE5hbSAgICAgICAgICAgICAgICAgIHwgMS42MSAgICAgICAgICAgICAgICB8IE5hbSBnaeG7m2kgY8OzIG9kZHMgdGhhbSBnaWEgY8O0bmcgxJFvw6BuIGNhbyBoxqFuIDEuNjEgbOG6p24gc28gduG7m2kgbuG7ryBnaeG7m2kuICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQp8ICoqYmxhY2sqKiAoY2jhu6duZyB04buZYykgICAgICAgICAgICAgfCBLaMO0bmcgcGjhuqNpIG5nxrDhu51pIGRhIMSRZW4gICAgICB8IE5nxrDhu51pIGRhIMSRZW4gICAgICAgICB8IDEuODYgICAgICAgICAgICAgICAgfCBOZ8aw4budaSBkYSDEkWVuIGPDsyBvZGRzIHRoYW0gZ2lhIGPDtG5nIMSRb8OgbiBjYW8gaMahbiAxLjg2IGzhuqduIHNvIHbhu5tpIG5nxrDhu51pIGtow7RuZyBwaOG6o2kgZGEgxJFlbi4gICAgICAgICB8DQoNCg0KIyMjIE3DtCBow6xuaCBMb2dpdA0KDQojIyMjIEJp4bq/biBgYmx1ZWNvbGAgICANCg0K8J+TjCBUaMOgbmggcGjhuqduIG3DtCBow6xuaDogICANCg0KKiBSYW5kb20gY29tcG9uZW50OiAgIA0KJFkgXHNpbSBcdGV4dHtCZXJub3VsbGl9KHApJCAgIA0KDQoqIFN5c3RlbWF0aWMgY29tcG9uZW50OiAgIA0KJFxldGEgPSBcYmV0YV8wICsgXGJldGFfMSBcdGltZXMgXHRleHR7Ymx1ZWNvbH0kICAgDQoNCiogTGluayBmdW5jdGlvbjogICANCiRnKHApID0gXGxvZ1xsZWZ0KFxmcmFje3B9ezEtcH1ccmlnaHQpJCAgIA0KDQrwn5OMIFBoxrDGoW5nIHRyw6xuaCBtw7QgaMOsbmg6ICAgDQoNCiQkDQpcbG9nIFxsZWZ0KFxmcmFje3BfaX17MS1wX2l9XHJpZ2h0KSA9IFxiZXRhXzAgKyBcYmV0YV8xIFx0aW1lcyBcdGV4dHtibHVlY29sfV9pDQokJCAgIA0KDQpUcm9uZyDEkcOzOiAgIA0KDQoqICRwX2kkIGzDoCB4w6FjIHN14bqldCBuZ8aw4budaSBsYW8gxJHhu5luZyB0aOG7qSAkaSQgdGhhbSBnaWEgY8O0bmcgxJFvw6BuICAgDQoqICRcdGV4dHtibHVlY29sfV9pJCBsw6AgYmnhur9uIGxv4bqhaSBsYW8gxJHhu5luZzogYG5vYCBob+G6t2MgYHllc2AgICANCiogJFxiZXRhXzAkIGzDoCBo4buHIHPhu5EgY2jhurduIChpbnRlcmNlcHQpICAgDQoqICRcYmV0YV8xJCBsw6AgaOG7hyBz4buRIOG6o25oIGjGsOG7n25nIGPhu6dhIGxv4bqhaSBsYW8gxJHhu5luZyDEkeG6v24geMOhYyBzdeG6pXQgdGhhbSBnaWEgY8O0bmcgxJFvw6BuICAgDQoNCiogKsav4bubYyBsxrDhu6NuZyBtw7QgaMOsbmg6KiAgIA0KYGBge3IsZWNobz1UUlVFfQ0KDQpkMSR1bmlvbl9iaW4gPC0gaWZlbHNlKGQxJHVuaW9uID09ICJ5ZXMiLCAxLCAwKSAgIA0KDQpsb2dpdF9tb2RlbDEgPC0gZ2xtKHVuaW9uX2JpbiB+IGJsdWVjb2wsIGRhdGEgPSBkMSwgZmFtaWx5ID0gYmlub21pYWwobGluayA9ICJsb2dpdCIpKQ0Kc3VtbWFyeShsb2dpdF9tb2RlbDEpDQoNCmBgYA0KKipOaOG6rW4geMOpdDoqKiAgIA0KDQpUYSBjw7MgaMOgbSBo4buTaSBxdXkgOiAgIA0KJFxsb2cgXGxlZnQoXGZyYWN7cF9pfXsxLXBfaX1ccmlnaHQpID0gLTEuNTMxMzMgKyAxLjY5OTg4IFx0aW1lcyBcdGV4dHtibHVlY29sfV9pJCAgIA0KVHJvbmcgxJHDszogICANCg0KKiAkXGJldGFfMD0tMS41MzEzMyQgbMOgIGdpw6EgdHLhu4sgbG9nLW9kZHMgY+G7p2Egdmnhu4djIHRoYW0gZ2lhIGPDtG5nIMSRb8OgbiBraGkgbmfGsOG7nWkgbGFvIMSR4buZbmcga2jDtG5nIHRodeG7mWMgbmjDs20gbGFvIMSR4buZbmcgY2jDom4gdGF5LiBU4bupYyBsw6AgbmfGsOG7nWkgbGFvIMSR4buZbmcga2jDtG5nIHRodeG7mWMgbmjDs20gbGFvIMSR4buZbmcgY2jDom4gdGF5IGPDsyBraG/huqNuZyAkJCBwID0gXGZyYWN7ZV57LTEuNTMxMzN9fXsxICsgZV57LTEuNTMxMzN9fVx0aW1lczEwMCBcYXBwcm94IDE3LjggXCUgJCQga2jhuqMgbsSDbmcgdGhhbSBnaWEgY8O0bmcgxJFvw6BuLiAgICANCg0KKiAkXGJldGFfMT0xLjY5OTg4JDoga2hpIGBibHVlY29seWVzYCB0aGF5IMSR4buVaSB04burIDAgc2FuZyAxIHRow6wgZ2nDoSB0cuG7iyBsb2ctb2RkcyBj4bunYSB2aeG7h2MgdGhhbSBnaWEgY8O0bmcgxJFvw6BuIHTEg25nIHRow6ptIDEuNjk5ODguIMOdIG5naMSpYSBsw6AgbmfGsOG7nWkgbGFvIMSR4buZbmcgdGh14buZYyBuaMOzbSBsYW8gxJHhu5luZyBjaMOibiB0YXkgY8OzIHThu7cgbOG7hyBjaMOqbmggdGhhbSBnaWEgY8O0bmcgxJFvw6BuIGNhbyBn4bqlcCBraG/huqNuZyAkT1I9ZV57MS42OTk4OH1cYXBwcm94IDUuNDgkIGzhuqduIHNvIHbhu5tpIG5ow7NtIGtow7RuZyBsw6BtIHZp4buHYyBsYW8gxJHhu5luZyBjaMOibiB0YXkuICAgDQoNCiogKkThu7EgYsOhbyogICANCmBgYHtyLGVjaG89VFJVRX0NCm5ld193b3JrZXIxIDwtIGRhdGEuZnJhbWUoYmx1ZWNvbCA9ICJubyIpDQpwcmVkaWN0KGxvZ2l0X21vZGVsMSwgbmV3ZGF0YSA9IG5ld193b3JrZXIxLCB0eXBlID0gInJlc3BvbnNlIikNCmBgYA0KS+G6v3QgcXXhuqMgZOG7sSBiw6FvIG5o4bqtbiDEkcaw4bujYyBwaMO5IGjhu6NwIHbhu5tpIGvhur90IHF14bqjIMSRw6MgxJHGsOG7o2MgdMOtbmggdG/DoW4gdHLGsOG7m2MgxJHDsywgbmjDs20gbGFvIMSR4buZbmcga2jDtG5nIGzDoG0gY8O0bmcgdmnhu4djIGNow6JuIHRheSBjw7MgeHUgaMaw4bubbmcgw610IHRoYW0gZ2lhIGPDtG5nIMSRb8OgbiBoxqFuIG5ow7NtIGzDoG0gY8O0bmcgdmnhu4djIGNow6JuIHRheS4gICAgDQoNCiMjIyMgQmnhur9uIGBpbmRgDQrwn5OMIFRow6BuaCBwaOG6p24gbcO0IGjDrG5oOiAgIA0KDQoqIFJhbmRvbSBjb21wb25lbnQ6ICAgDQokWSBcc2ltIFx0ZXh0e0Jlcm5vdWxsaX0ocCkkICAgDQoNCiogU3lzdGVtYXRpYyBjb21wb25lbnQ6ICAgDQokXGV0YSA9IFxiZXRhXzAgKyBcYmV0YV8xIFx0aW1lcyBcdGV4dHtpbmR9JCAgIA0KDQoqIExpbmsgZnVuY3Rpb246ICAgDQokZyhwKSA9IFxsb2dcbGVmdChcZnJhY3twfXsxLXB9XHJpZ2h0KSQgICANCg0K8J+TjCBQaMawxqFuZyB0csOsbmggbcO0IGjDrG5oOiAgIA0KDQokJA0KXGxvZyBcbGVmdChcZnJhY3twX2l9ezEtcF9pfVxyaWdodCkgPSBcYmV0YV8wICsgXGJldGFfMSBcdGltZXMgXHRleHR7aW5kfV9pDQokJCAgIA0KVHJvbmcgxJHDszogICANCg0KKiAkcF9pJCBsw6AgeMOhYyBzdeG6pXQgbmfGsOG7nWkgbGFvIMSR4buZbmcgdGjhu6kgJGkkIHRoYW0gZ2lhIGPDtG5nIMSRb8OgbiAgIA0KKiAkXHRleHR7aW5kfV9pJCBsw6AgYmnhur9uIG5nw6BuaCBuZ2jhu4E6IGBub24taW5kdXN0cmlhbGAgaG/hurdjIGBpbmR1c3RyaWFsYCAgIA0KKiAkXGJldGFfMCQgbMOgIGjhu4cgc+G7kSBjaOG6t24gKGludGVyY2VwdCkgICANCiogJFxiZXRhXzEkIGzDoCBo4buHIHPhu5Eg4bqjbmggaMaw4bufbmcgY+G7p2EgbmfDoG5oIG5naOG7gSDEkeG6v24geMOhYyBzdeG6pXQgdGhhbSBnaWEgY8O0bmcgxJFvw6BuICAgDQoNCiogKsav4bubYyBsxrDhu6NuZyBtw7QgaMOsbmg6KiAgIA0KYGBge3IsZWNobz1UUlVFfQ0KDQpsb2dpdF9tb2RlbDIgPC0gZ2xtKHVuaW9uX2JpbiB+IGluZCwgZGF0YSA9IGQxLCBmYW1pbHkgPSBiaW5vbWlhbChsaW5rID0gImxvZ2l0IikpDQpzdW1tYXJ5KGxvZ2l0X21vZGVsMikNCg0KYGBgDQoqKk5o4bqtbiB4w6l0OioqICAgDQoNClRhIGPDsyBow6BtIGjhu5NpIHF1eSA6ICAgDQokXGxvZyBcbGVmdChcZnJhY3twX2l9ezEtcF9pfVxyaWdodCkgPSAtMC44MTQyMyArIDAuNjE2MTAgXHRpbWVzIFx0ZXh0e2luZH1faSQgICANClRyb25nIMSRw7M6ICAgDQoNCiogJFxiZXRhXzA9LTAuODE0MjMkIGzDoCBnacOhIHRy4buLIGxvZy1vZGRzIGPhu6dhIHZp4buHYyB0aGFtIGdpYSBjw7RuZyDEkW/DoG4ga2hpIG5nxrDhu51pIGxhbyDEkeG7mW5nIGtow7RuZyBsw6BtIHZp4buHYyB0cm9uZyBuZ8Ogbmggc+G6o24geHXhuqV0LiBU4bupYyBsw6AgbmfGsOG7nWkgbGFvIMSR4buZbmcgbmdvw6BpIG5nw6BuaCBz4bqjbiB4deG6pXQgY8OzIHjDoWMgc3XhuqV0IHRoYW0gZ2lhIGPDtG5nIMSRb8OgbiBsw6Aga2hv4bqjbmcgJCQgcCA9IFxmcmFje2Veey0wLjgxNDIzfX17MSArIGVeey0wLjgxNDIzfX1cdGltZXMgMTAwIFxhcHByb3ggMzAuNyBcJSAkJC4gICAgDQoqICRcYmV0YV8xPTAuNjE4MTAkOiBraGkgYGluZGAgdGhheSDEkeG7lWkgdOG7qyBub24taW5kdXN0cmlhbCBzYW5nIGluZHVzdHJpYWwgdGjDrCBnacOhIHRy4buLIGxvZy1vZGRzIGPhu6dhIHZp4buHYyB0aGFtIGdpYSBjw7RuZyDEkW/DoG4gdMSDbmcgdGjDqm0gMC42MTgxMC4gw50gbmdoxKlhIGzDoCBuZ8aw4budaSBsYW8gxJHhu5luZyB0cm9uZyBuZ8Ogbmggc+G6o24geHXhuqV0IGPDsyB04bu3IGzhu4cgY2jDqm5oIHRoYW0gZ2lhIGPDtG5nIMSRb8OgbiBjYW8gZ+G6pXAga2hv4bqjbmcgJE9SPWVeezAuNjE4MTB9XGFwcHJveCAxLjg1NSQgbOG6p24gc28gduG7m2kgbmjhu69uZyBuZ8aw4budaSBsYW8gxJHhu5luZyBuZ2/DoGkgbmfDoG5oIHPhuqNuIHh14bqldC4gICANCg0KKiAqRMawIGLDoW8qICAgDQpgYGB7cixlY2hvPVRSVUV9DQpuZXdfd29ya2VyMiA8LSBkYXRhLmZyYW1lKGluZCA9ICJub24taW5kdXN0cmlhbCIpDQpwcmVkaWN0KGxvZ2l0X21vZGVsMiwgbmV3ZGF0YSA9IG5ld193b3JrZXIyLCB0eXBlID0gInJlc3BvbnNlIikNCmBgYA0KS+G6v3QgcXXhuqMgZOG7sSBiw6FvIG5o4bqtbiDEkcaw4bujYyBwaMO5IGjhu6NwIHbhu5tpIGvhur90IHF14bqjIMSRw6MgxJHGsOG7o2MgdMOtbmggdG/DoW4gdHLGsOG7m2MgxJHDsywgduG7m2kgbcO0IGjDrG5oIGjhu5NpIHF1eSBsb2dpc3RpYyBz4butIGThu6VuZyBiaeG6v24gaW5kIGzDoG0gYmnhur9uIGdp4bqjaSB0aMOtY2gsIHjDoWMgc3XhuqV0IGThu7EgxJFvw6FuIMSR4buDIG3hu5l0IG5nxrDhu51pIGxhbyDEkeG7mW5nIG5nb8OgaSBuZ8Ogbmggc+G6o24geHXhuqV0IHRoYW0gZ2lhIGPDtG5nIMSRb8OgbiBsw6Aga2hv4bqjbmcgMzAuNyUuICAgDQoNCiMjIyMgQmnhur9uIGBzb3V0aGANCvCfk4wgVGjDoG5oIHBo4bqnbiBtw7QgaMOsbmg6ICAgDQoNCiogUmFuZG9tIGNvbXBvbmVudDogICANCiRZIFxzaW0gXHRleHR7QmVybm91bGxpfShwKSQgICANCg0KKiBTeXN0ZW1hdGljIGNvbXBvbmVudDogICANCiRcZXRhID0gXGJldGFfMCArIFxiZXRhXzEgXHRpbWVzIFx0ZXh0e3NvdXRofSQgICANCg0KKiBMaW5rIGZ1bmN0aW9uOiAgIA0KJGcocCkgPSBcbG9nXGxlZnQoXGZyYWN7cH17MS1wfVxyaWdodCkkICAgDQoNCvCfk4wgUGjGsMahbmcgdHLDrG5oIG3DtCBow6xuaDogICANCg0KJCQNClxsb2cgXGxlZnQoXGZyYWN7cF9pfXsxLXBfaX1ccmlnaHQpID0gXGJldGFfMCArIFxiZXRhXzEgXHRpbWVzIFx0ZXh0e3NvdXRofV9pDQokJCAgIA0KVHJvbmcgxJHDszogICANCg0KKiAkcF9pJCBsw6AgeMOhYyBzdeG6pXQgbmfGsOG7nWkgbGFvIMSR4buZbmcgdGjhu6kgJGkkIHRoYW0gZ2lhIGPDtG5nIMSRb8OgbiAgIA0KKiAkXHRleHR7c291dGh9X2kkIGzDoCBiaeG6v24ga2h1IHbhu7FjIGPGsCB0csO6OiBgbm9gIGhv4bq3YyBgeWVzYCAgIA0KKiAkXGJldGFfMCQgbMOgIGjhu4cgc+G7kSBjaOG6t24gKGludGVyY2VwdCkgICANCiogJFxiZXRhXzEkIGzDoCBo4buHIHPhu5Eg4bqjbmggaMaw4bufbmcgY+G7p2Ega2h1IHbhu7FjIGPGsCB0csO6IMSR4bq/biB4w6FjIHN14bqldCB0aGFtIGdpYSBjw7RuZyDEkW/DoG4gICANCg0KKiAqxq/hu5tjIGzGsOG7o25nIG3DtCBow6xuaDoqICAgDQpgYGB7cixlY2hvPVRSVUV9DQoNCmxvZ2l0X21vZGVsMyA8LSBnbG0odW5pb25fYmluIH4gc291dGgsIGRhdGEgPSBkMSwgZmFtaWx5ID0gYmlub21pYWwobGluayA9ICJsb2dpdCIpKQ0Kc3VtbWFyeShsb2dpdF9tb2RlbDMpDQoNCmBgYA0KKipOaOG6rW4geMOpdDoqKiAgIA0KDQpUYSBjw7MgaMOgbSBo4buTaSBxdXkgOiAgIA0KJFxsb2cgXGxlZnQoXGZyYWN7cF9pfXsxLXBfaX1ccmlnaHQpID0gLTAuMzQ3MTUgLTAuNzk3MjAgXHRpbWVzIFx0ZXh0e3NvdXRofV9pJCAgIA0KVHJvbmcgxJHDszogICANCg0KKiAkXGJldGFfMD0tMC4zNDcxNSQgbMOgIGdpw6EgdHLhu4sgbG9nLW9kZHMgY+G7p2Egdmnhu4djIHRoYW0gZ2lhIGPDtG5nIMSRb8OgbiBraGkgbmfGsOG7nWkgbGFvIMSR4buZbmcga2jDtG5nIGPGsCB0csO6IHThuqFpIG1p4buBbiBOYW0gSG9hIEvhu7MuIFThu6ljIGzDoCBuZ8aw4budaSBsYW8gxJHhu5luZyBraMO0bmcgc+G7kW5nIHThuqFpIG1p4buBbiBOYW0gY8OzIHjDoWMgc3XhuqV0IHRoYW0gZ2lhIGPDtG5nIMSRb8OgbiBsw6Aga2hv4bqjbmcgJCQgcCA9IFxmcmFje2Veey0wLjM0NzE1fX17MSArIGVeey0wLjM0NzE1fX1cdGltZXMgMTAwIFxhcHByb3ggNDEuNCBcJSAkJC4gICAgDQoqICRcYmV0YV8xPS0wLjc5NzIwJDoga2hpIGBzb3V0aGAgdGhheSDEkeG7lWkgdOG7qyBubyBzYW5nIHllcyB0aMOsIGdpw6EgdHLhu4sgbG9nLW9kZHMgY+G7p2Egdmnhu4djIHRoYW0gZ2lhIGPDtG5nIMSRb8OgbiBnaeG6o20gxJFpIDAuNzk3MjAuIMOdIG5naMSpYSBsw6AgbmfGsOG7nWkgbGFvIMSR4buZbmcga2jDtG5nIGPGsCB0csO6IHThuqFpIG1p4buBbiBuYW0gY8OzIHThu7cgbOG7hyBjaMOqbmggdGhhbSBnaWEgY8O0bmcgxJFvw6BuIHRo4bqlcCBraG/huqNuZyAkT1I9ZV57LTAuNzk3MjB9XGFwcHJveCAwLjQ1MSQgbOG6p24gc28gduG7m2kgbmjhu69uZyBuZ8aw4budaSBsYW8gxJHhu5luZyBjxrAgdHLDuiB04bqhaSBtaeG7gW4gTmFtLiAgIA0KDQoqICpE4buxIGLDoW8qICAgDQpgYGB7cixlY2hvPVRSVUV9DQpuZXdfd29ya2VyMyA8LSBkYXRhLmZyYW1lKHNvdXRoID0gIm5vIikNCnByZWRpY3QobG9naXRfbW9kZWwzLCBuZXdkYXRhID0gbmV3X3dvcmtlcjMsIHR5cGUgPSAicmVzcG9uc2UiKQ0KYGBgDQpL4bq/dCBxdeG6oyBk4buxIGLDoW8gbmjhuq1uIMSRxrDhu6NjIHBow7kgaOG7o3AgduG7m2kga+G6v3QgcXXhuqMgxJHDoyDEkcaw4bujYyB0w61uaCB0b8OhbiB0csaw4bubYyDEkcOzLCBNw7QgaMOsbmggaOG7k2kgcXV5IGxvZ2lzdGljIGThu7EgxJFvw6FuIHLhurFuZyBt4buZdCBuZ8aw4budaSBsYW8gxJHhu5luZyBraMO0bmcgc+G7kW5nIOG7nyBtaeG7gW4gTmFtIGPDsyB4w6FjIHN14bqldCB0aGFtIGdpYSBjw7RuZyDEkW/DoG4gbMOgIGtob+G6o25nIDQxLjQlLiAgIA0KDQojIyMjIEJp4bq/biBgbWFycmllZGANCvCfk4wgVGjDoG5oIHBo4bqnbiBtw7QgaMOsbmg6ICAgDQoNCiogUmFuZG9tIGNvbXBvbmVudDogICANCiRZIFxzaW0gXHRleHR7QmVybm91bGxpfShwKSQgICANCg0KKiBTeXN0ZW1hdGljIGNvbXBvbmVudDogICANCiRcZXRhID0gXGJldGFfMCArIFxiZXRhXzEgXHRpbWVzIFx0ZXh0e21hcnJpZWR9JCAgIA0KDQoqIExpbmsgZnVuY3Rpb246ICAgDQokZyhwKSA9IFxsb2dcbGVmdChcZnJhY3twfXsxLXB9XHJpZ2h0KSQgICANCg0K8J+TjCBQaMawxqFuZyB0csOsbmggbcO0IGjDrG5oOiAgIA0KDQokJA0KXGxvZyBcbGVmdChcZnJhY3twX2l9ezEtcF9pfVxyaWdodCkgPSBcYmV0YV8wICsgXGJldGFfMSBcdGltZXMgXHRleHR7bWFycmllZH1faQ0KJCQgICANClRyb25nIMSRw7M6ICAgDQoNCiogJHBfaSQgbMOgIHjDoWMgc3XhuqV0IG5nxrDhu51pIGxhbyDEkeG7mW5nIHRo4bupICRpJCB0aGFtIGdpYSBjw7RuZyDEkW/DoG4gICANCiogJFx0ZXh0e21hcnJpZWR9X2kkIGzDoCBiaeG6v24gdMOsbmggdHLhuqFuZyBow7RuIG5ow6JuOiBgbm9gIGhv4bq3YyBgeWVzYCAgIA0KKiAkXGJldGFfMCQgbMOgIGjhu4cgc+G7kSBjaOG6t24gKGludGVyY2VwdCkgICANCiogJFxiZXRhXzEkIGzDoCBo4buHIHPhu5Eg4bqjbmggaMaw4bufbmcgY+G7p2EgdMOsbmggdHLhuqFuZyBow7RuIG5ow6JuIMSR4bq/biB4w6FjIHN14bqldCB0aGFtIGdpYSBjw7RuZyDEkW/DoG4uICAgDQoNCiogKsav4bubYyBsxrDhu6NuZyBtw7QgaMOsbmg6KiAgIA0KYGBge3IsZWNobz1UUlVFfQ0KDQpsb2dpdF9tb2RlbDQgPC0gZ2xtKHVuaW9uX2JpbiB+IG1hcnJpZWQsIGRhdGEgPSBkMSwgZmFtaWx5ID0gYmlub21pYWwobGluayA9ICJsb2dpdCIpKQ0Kc3VtbWFyeShsb2dpdF9tb2RlbDQpDQoNCmBgYA0KKipOaOG6rW4geMOpdDoqKiAgIA0KDQpUYSBjw7MgaMOgbSBo4buTaSBxdXkgOiAgIA0KJFxsb2cgXGxlZnQoXGZyYWN7cF9pfXsxLXBfaX1ccmlnaHQpID0gLTEuMTA3MjYgKyAwLjY2MTMzIFx0aW1lcyBcdGV4dHttYXJyaWVkfV9pJCAgIA0KVHJvbmcgxJHDszogICANCg0KKiAkXGJldGFfMD0tMS4xMDcyNiQgbMOgIGdpw6EgdHLhu4sgbG9nLW9kZHMgY+G7p2Egdmnhu4djIHRoYW0gZ2lhIGPDtG5nIMSRb8OgbiBraGkgbmfGsOG7nWkgbGFvIMSR4buZbmcgY2jGsGEga+G6v3QgaMO0bi4gVOG7qWMgbMOgIG5nxrDhu51pIGxhbyDEkeG7mW5nIGNoxrBhIGvhur90IGjDtG4gY8OzIHjDoWMgc3XhuqV0IHRoYW0gZ2lhIGPDtG5nIMSRb8OgbiBsw6Aga2hv4bqjbmcgJCQgcCA9IFxmcmFje2Veey0xLjEwNzI2fX17MSArIGVeey0xLjEwNzI2fX1cdGltZXMgMTAwIFxhcHByb3ggMjQuOCBcJSAkJC4gICAgDQoqICRcYmV0YV8xPTAuNjYxMzMkOiBraGkgYG1hcnJpZWRgIHRoYXkgxJHhu5VpIHThu6sgbm8gc2FuZyB5ZXMgdGjDrCBnacOhIHRy4buLIGxvZy1vZGRzIGPhu6dhIHZp4buHYyB0aGFtIGdpYSBjw7RuZyDEkW/DoG4gdMSDbmcgdGjDqm0gMC42NjEzMy4gw50gbmdoxKlhIGzDoCBuZ8aw4budaSBsYW8gxJHhu5luZyDEkcOjIGvhur90IGjDtG4gY8OzIHThu7cgbOG7hyBjaMOqbmggdGhhbSBnaWEgY8O0bmcgxJFvw6BuIGNhbyBn4bqlcCBraG/huqNuZyAkT1I9ZV57MC42NjEzM31cYXBwcm94IDEuOTM3JCBs4bqnbiBzbyB24bubaSBuaOG7r25nIG5nxrDhu51pIGxhbyDEkeG7mW5nIGNoxrBhIGvhur90IGjDtG4uICAgDQoNCiogKkThu7EgYsOhbyogICANCmBgYHtyLGVjaG89VFJVRX0NCm5ld193b3JrZXI0IDwtIGRhdGEuZnJhbWUobWFycmllZCA9ICJubyIpDQpwcmVkaWN0KGxvZ2l0X21vZGVsNCwgbmV3ZGF0YSA9IG5ld193b3JrZXI0LCB0eXBlID0gInJlc3BvbnNlIikNCmBgYA0KS+G6v3QgcXXhuqMgZOG7sSBiw6FvIG5o4bqtbiDEkcaw4bujYyBwaMO5IGjhu6NwIHbhu5tpIGvhur90IHF14bqjIMSRw6MgxJHGsOG7o2MgdMOtbmggdG/DoW4gdHLGsOG7m2MgxJHDsywga2hpIG5nxrDhu51pIGxhbyDEkeG7mW5nIGNoxrBhIGvhur90IGjDtG4sIHRow6wgeMOhYyBzdeG6pXQgZOG7sSDEkW/DoW4gaOG7jSB0aGFtIGdpYSBjw7RuZyDEkW/DoG4gbMOgIGtob+G6o25nIDI0LjglLiAgIA0KDQojIyMjIEJp4bq/biBgc2V4YA0K8J+TjCBUaMOgbmggcGjhuqduIG3DtCBow6xuaDogICANCg0KKiBSYW5kb20gY29tcG9uZW50OiAgIA0KJFkgXHNpbSBcdGV4dHtCZXJub3VsbGl9KHApJCAgIA0KDQoqIFN5c3RlbWF0aWMgY29tcG9uZW50OiAgIA0KJFxldGEgPSBcYmV0YV8wICsgXGJldGFfMSBcdGltZXMgXHRleHR7c2V4fSQgICANCg0KKiBMaW5rIGZ1bmN0aW9uOiAgIA0KJGcocCkgPSBcbG9nXGxlZnQoXGZyYWN7cH17MS1wfVxyaWdodCkkICAgDQoNCvCfk4wgUGjGsMahbmcgdHLDrG5oIG3DtCBow6xuaDogICANCg0KJCQNClxsb2cgXGxlZnQoXGZyYWN7cF9pfXsxLXBfaX1ccmlnaHQpID0gXGJldGFfMCArIFxiZXRhXzEgXHRpbWVzIFx0ZXh0e3NleH1faQ0KJCQgICANClRyb25nIMSRw7M6ICAgDQoNCiogJHBfaSQgbMOgIHjDoWMgc3XhuqV0IG5nxrDhu51pIGxhbyDEkeG7mW5nIHRo4bupICRpJCB0aGFtIGdpYSBjw7RuZyDEkW/DoG4gICANCiogJFx0ZXh0e3NleH1faSQgbMOgIGJp4bq/biBnaeG7m2kgdMOtbmg6IGBmZW1hbGVgIGhv4bq3YyBgbWFsZWAgICANCiogJFxiZXRhXzAkIGzDoCBo4buHIHPhu5EgY2jhurduIChpbnRlcmNlcHQpICAgDQoqICRcYmV0YV8xJCBsw6AgaOG7hyBz4buRIOG6o25oIGjGsOG7n25nIGPhu6dhIGdp4bubaSB0w61uaCDEkeG6v24geMOhYyBzdeG6pXQgdGhhbSBnaWEgY8O0bmcgxJFvw6BuLiAgIA0KDQoqICrGr+G7m2MgbMaw4bujbmcgbcO0IGjDrG5oOiogICANCmBgYHtyLGVjaG89VFJVRX0NCg0KbG9naXRfbW9kZWw1IDwtIGdsbSh1bmlvbl9iaW4gfiBzZXgsIGRhdGEgPSBkMSwgZmFtaWx5ID0gYmlub21pYWwobGluayA9ICJsb2dpdCIpKQ0Kc3VtbWFyeShsb2dpdF9tb2RlbDUpDQoNCmBgYA0KKipOaOG6rW4geMOpdDoqKiAgIA0KDQpUYSBjw7MgaMOgbSBo4buTaSBxdXkgOiAgIA0KJFxsb2cgXGxlZnQoXGZyYWN7cF9pfXsxLXBfaX1ccmlnaHQpID0gLTEuMzE4NCArIDAuODQzMiBcdGltZXMgXHRleHR7c2V4fV9pJCAgIA0KVHJvbmcgxJHDszogICANCg0KKiAkXGJldGFfMD0tMS4zMTg0JCBsw6AgZ2nDoSB0cuG7iyBsb2ctb2RkcyBj4bunYSB2aeG7h2MgdGhhbSBnaWEgY8O0bmcgxJFvw6BuIGtoaSBuZ8aw4budaSBsYW8gxJHhu5luZyBsw6AgbuG7ry4gVOG7qWMgbMOgIG5nxrDhu51pIGxhbyDEkeG7mW5nIG7hu68gY8OzIHjDoWMgc3XhuqV0IHRoYW0gZ2lhIGPDtG5nIMSRb8OgbiBsw6Aga2hv4bqjbmcgJCQgcCA9IFxmcmFje2Veey0xLjMxODR9fXsxICsgZV57LTEuMzE4NH19XHRpbWVzIDEwMCBcYXBwcm94IDIxLjEgXCUgJCQuICAgIA0KKiAkXGJldGFfMT0wLjg0MzIkOiBraGkgYHNleGAgdGhheSDEkeG7lWkgdOG7qyBmZW1hbGUgc2FuZyBtYWxlIHRow6wgZ2nDoSB0cuG7iyBsb2ctb2RkcyBj4bunYSB2aeG7h2MgdGhhbSBnaWEgY8O0bmcgxJFvw6BuIHTEg25nIHRow6ptIDAuODQzMi4gw50gbmdoxKlhIGzDoCBuZ8aw4budaSBsYW8gxJHhu5luZyBuYW0gY8OzIHThu7cgbOG7hyBjaMOqbmggdGhhbSBnaWEgY8O0bmcgxJFvw6BuIGNhbyBn4bqlcCBraG/huqNuZyAkT1I9ZV57MC44NDMyfVxhcHByb3ggMi4zMiQgbOG6p24gc28gduG7m2kgbmjhu69uZyBuZ8aw4budaSBsYW8gxJHhu5luZyBu4buvLiAgIA0KDQoqICpE4buxIGLDoW8qICAgDQpgYGB7cixlY2hvPVRSVUV9DQpuZXdfd29ya2VyNSA8LSBkYXRhLmZyYW1lKHNleCA9ICJmZW1hbGUiKQ0KcHJlZGljdChsb2dpdF9tb2RlbDUsIG5ld2RhdGEgPSBuZXdfd29ya2VyNSwgdHlwZSA9ICJyZXNwb25zZSIpDQpgYGANCkvhur90IHF14bqjIGThu7EgYsOhbyBuaOG6rW4gxJHGsOG7o2MgcGjDuSBo4bujcCB24bubaSBr4bq/dCBxdeG6oyDEkcOjIMSRxrDhu6NjIHTDrW5oIHRvw6FuIHRyxrDhu5tjIMSRw7MsIG3DtCBow6xuaCBk4buxIMSRb8OhbiBy4bqxbmcgbeG7mXQgbmfGsOG7nWkgbGFvIMSR4buZbmcgbuG7ryBjw7MgeMOhYyBzdeG6pXQgdGhhbSBnaWEgY8O0bmcgxJFvw6BuIGzDoCBraG/huqNuZyAyMS4xJS4gICANCg0KIyMjIyBCaeG6v24gYGJsYWNrYA0K8J+TjCBUaMOgbmggcGjhuqduIG3DtCBow6xuaDogICANCg0KKiBSYW5kb20gY29tcG9uZW50OiAgIA0KJFkgXHNpbSBcdGV4dHtCZXJub3VsbGl9KHApJCAgIA0KDQoqIFN5c3RlbWF0aWMgY29tcG9uZW50OiAgIA0KJFxldGEgPSBcYmV0YV8wICsgXGJldGFfMSBcdGltZXMgXHRleHR7YmxhY2t9JCAgIA0KDQoqIExpbmsgZnVuY3Rpb246ICAgDQokZyhwKSA9IFxsb2dcbGVmdChcZnJhY3twfXsxLXB9XHJpZ2h0KSQgICANCg0K8J+TjCBQaMawxqFuZyB0csOsbmggbcO0IGjDrG5oOiAgIA0KDQokJA0KXGxvZyBcbGVmdChcZnJhY3twX2l9ezEtcF9pfVxyaWdodCkgPSBcYmV0YV8wICsgXGJldGFfMSBcdGltZXMgXHRleHR7YmxhY2t9X2kNCiQkICAgDQpUcm9uZyDEkcOzOiAgIA0KDQoqICRwX2kkIGzDoCB4w6FjIHN14bqldCBuZ8aw4budaSBsYW8gxJHhu5luZyB0aOG7qSAkaSQgdGhhbSBnaWEgY8O0bmcgxJFvw6BuICAgDQoqICRcdGV4dHtibGFja31faSQgbMOgIGJp4bq/biBjaOG7p25nIHThu5ljOiBgbm9gIGhv4bq3YyBgeWVzYCAgIA0KKiAkXGJldGFfMCQgbMOgIGjhu4cgc+G7kSBjaOG6t24gKGludGVyY2VwdCkgICANCiogJFxiZXRhXzEkIGzDoCBo4buHIHPhu5Eg4bqjbmggaMaw4bufbmcgY+G7p2EgY2jhu6duZyB04buZYyDEkeG6v24geMOhYyBzdeG6pXQgdGhhbSBnaWEgY8O0bmcgxJFvw6BuICAgDQoNCiogKsav4bubYyBsxrDhu6NuZyBtw7QgaMOsbmg6KiAgIA0KYGBge3IsZWNobz1UUlVFfQ0KDQpsb2dpdF9tb2RlbDYgPC0gZ2xtKHVuaW9uX2JpbiB+IGJsYWNrLCBkYXRhID0gZDEsIGZhbWlseSA9IGJpbm9taWFsKGxpbmsgPSAibG9naXQiKSkNCnN1bW1hcnkobG9naXRfbW9kZWw2KQ0KDQpgYGANCioqTmjhuq1uIHjDqXQ6KiogICANCg0KVGEgY8OzIGjDoG0gaOG7k2kgcXV5IDogICANCiRcbG9nIFxsZWZ0KFxmcmFje3BfaX17MS1wX2l9XHJpZ2h0KSA9IC0wLjU4NTUzICsgMC4zNjUzOCBcdGltZXMgXHRleHR7YmxhY2t9X2kkICAgDQpUcm9uZyDEkcOzOiAgIA0KDQoqICRcYmV0YV8wPS0wLjU4NTUzJCBsw6AgZ2nDoSB0cuG7iyBsb2ctb2RkcyBj4bunYSB2aeG7h2MgdGhhbSBnaWEgY8O0bmcgxJFvw6BuIGtoaSBuZ8aw4budaSBsYW8gxJHhu5luZyBraMO0bmcgcGjhuqNpIG5nxrDhu51pIGRhIMSRZW4uIFThu6ljIGzDoCBuZ8aw4budaSBsYW8gxJHhu5luZyBraMO0bmcgcGjhuqNpIG5nxrDhu51pIGRhIMSRZW4gY8OzIHjDoWMgc3XhuqV0IHRoYW0gZ2lhIGPDtG5nIMSRb8OgbiBsw6Aga2hv4bqjbmcgJCQgcCA9IFxmcmFje2Veey0wLjU4NTUzfX17MSArIGVeey0wLjU4NTUzfX1cdGltZXMgMTAwIFxhcHByb3ggMzUuOCBcJSAkJC4gICAgDQoqICRcYmV0YV8xPTAuMzY1MzgkOiBraGkgYGJsYWNrYCB0aGF5IMSR4buVaSB04burIG5vIHNhbmcgeWVzIHRow6wgZ2nDoSB0cuG7iyBsb2ctb2RkcyBj4bunYSB2aeG7h2MgdGhhbSBnaWEgY8O0bmcgxJFvw6BuIHTEg25nIHRow6ptIDAuMzY1MzguIMOdIG5naMSpYSBsw6AgbmfGsOG7nWkgbGFvIMSR4buZbmcgZGEgxJFlbiBjw7MgdOG7tyBs4buHIGNow6puaCB0aGFtIGdpYSBjw7RuZyDEkW/DoG4gY2FvIGfhuqVwIGtob+G6o25nICRPUj1lXnswLjM2NTM4fVxhcHByb3ggMS40NCQgbOG6p24gc28gduG7m2kgbmjhu69uZyBuZ8aw4budaSBsYW8gxJHhu5luZyBraMO0bmcgcGjhuqNpIGRhIMSRZW4uICAgDQoNCiogKkThu7EgYsOhbyogICANCmBgYHtyLGVjaG89VFJVRX0NCm5ld193b3JrZXI2IDwtIGRhdGEuZnJhbWUoYmxhY2sgPSAibm8iKQ0KcHJlZGljdChsb2dpdF9tb2RlbDYsIG5ld2RhdGEgPSBuZXdfd29ya2VyNiwgdHlwZSA9ICJyZXNwb25zZSIpDQpgYGANCkvhur90IHF14bqjIGThu7EgYsOhbyBuaOG6rW4gxJHGsOG7o2MgcGjDuSBo4bujcCB24bubaSBr4bq/dCBxdeG6oyDEkcOjIMSRxrDhu6NjIHTDrW5oIHRvw6FuIHRyxrDhu5tjIMSRw7MsIG3hu5l0IG5nxrDhu51pIGxhbyDEkeG7mW5nIGtow7RuZyBwaOG6o2kgbMOgIG5nxrDhu51pIGRhIMSRZW4gY8OzIHjDoWMgc3XhuqV0IHRoYW0gZ2lhIGPDtG5nIMSRb8OgbiBraG/huqNuZyAzNS44JS4gICANCg0KIyMjIE3DtCBow6xuaCBo4buTaSBxdXkgcHJvYml0ICAgICANCg0KIyMjIyBCaeG6v24gYGJsdWVjb2xgICAgIA0KDQrwn5OMIFRow6BuaCBwaOG6p24gbcO0IGjDrG5oOiAgIA0KDQoqIFJhbmRvbSBjb21wb25lbnQ6ICAgDQokWSBcc2ltIFx0ZXh0e0Jlcm5vdWxsaX0ocCkkICAgDQoNCiogU3lzdGVtYXRpYyBjb21wb25lbnQ6ICAgDQokXGV0YSA9IFxiZXRhXzAgKyBcYmV0YV8xIFx0aW1lcyBcdGV4dHtibHVlY29sfSQgICANCg0KKiBMaW5rIGZ1bmN0aW9uOiAgIA0KJGcocCkgPSBcUGhpXnstMX0ocCkkICAgICAgDQoNCvCfk4wgUGjGsMahbmcgdHLDrG5oIG3DtCBow6xuaDogICANCg0KJCQNClxQaGleey0xfShwX2kpID0gXGJldGFfMCArIFxiZXRhXzEgXHRpbWVzIFx0ZXh0e2JsdWVjb2x9X2kNCiQkICAgDQpUcm9uZyDEkcOzOiAgIA0KDQoqICRcUGhpXnstMX0kIGzDoCBow6BtIHBow6JuIHBo4buRaSB0w61jaCBsxal5IGNodeG6qW4gbmdo4buLY2ggxJHhuqNvIChpbnZlcnNlIENERikgICANCg0KKiBDw6FjIGvDvSBoaeG7h3Uga2jDoWMgbmjGsCBtw7QgaMOsbmggTG9naXN0aWMgKMOhcCBk4bulbmcgY2hvIHRyxrDhu51uZyBo4bujcCBuw6B5IGzDoCBtw7QgaMOsbmggUHJvYml0LCB24bubaSAkcF9pJCBsw6AgeMOhYyBzdeG6pXQgbmfGsOG7nWkgbGFvIMSR4buZbmcgdGjhu6kgJGkkIHRoYW0gZ2lhIGPDtG5nIMSRb8OgbiwgJFx0ZXh0e2JsdWVjb2x9X2kkIGzDoCBiaeG6v24gbG/huqFpIGxhbyDEkeG7mW5nLCAkXGJldGFfMCQgbMOgIGjhu4cgc+G7kSBjaOG6t24gdsOgICRcYmV0YV8xJCBsw6AgaOG7hyBz4buRIOG6o25oIGjGsOG7n25nIGPhu6dhIGxv4bqhaSBsYW8gxJHhu5luZykuICAgDQoNCiogKsav4bubYyBsxrDhu6NuZyBtw7QgaMOsbmg6KiAgIA0KDQpgYGB7cixlY2hvPVRSVUV9DQoNCnByb2JpdF9tb2RlbDEgPC0gZ2xtKHVuaW9uX2JpbiB+IGJsdWVjb2wsIGRhdGEgPSBkMSwgZmFtaWx5ID0gYmlub21pYWwobGluayA9ICJwcm9iaXQiKSkNCnN1bW1hcnkocHJvYml0X21vZGVsMSkNCg0KYGBgDQoNCipQaMawxqFuZyB0csOsbmggaOG7k2kgcXV5IHByb2JpdDoqICAgDQokJA0KXFBoaV57LTF9KHBfaSkgPSAtMC45MjM3OCArIDEuMDI5MzUgXHRpbWVzIFx0ZXh0e2JsdWVjb2x9X2kNCiQkDQoqKk5o4bqtbiB4w6l0OioqICAgDQpW4bubaSBuZ8aw4budaSBraMO0bmcgbMOgbSB2aeG7h2MgdHJvbmcgbmjDs20gbGFvIMSR4buZbmcgY2jDom4gdGF5IHRow6wgZ2nDoSB0cuG7iyBr4buzIHbhu41uZyBj4bunYSBiaeG6v24g4bqpbiB0cm9uZyBtw7QgaMOsbmggbMOgIOKAkzAuOTIzNzguIFjDoWMgc3XhuqV0IHRo4buxYyB04bq/IHRoYW0gZ2lhIGPDtG5nIMSRb8OgbjogJCQgXHRleHR7UHJ9KFx0ZXh0e3VuaW9ufSA9IDEgXCB8IFwgXHRleHR7Ymx1ZWNvbH0gPSBcdGV4dHsibm8ifSkgPSBcUGhpKC0wLjkyMzc4KSBcYXBwcm94IDAuMTc3OSAkJCwgdOG7qWMga2hv4bqjbmcgMTcuOCUga2jhuqMgbsSDbmcgdGhhbSBnaWEgY8O0bmcgxJFvw6BuIG7hur91IG5nxrDhu51pIGxhbyDEkeG7mW5nIGtow7RuZyB0aHXhu5ljIG5ow7NtIG5nw6BuaCBsYW8gxJHhu5luZyBjaMOibiB0YXkuICAgDQoNCiogJFxiZXRhXzE9MS4wMjkzNSQ6IMSR4bqhaSBkaeG7h24gY2hvIGtodXluaCBoxrDhu5tuZyB0aGFtIGdpYSBjw7RuZyDEkW/DoG4sIGtoaSBuZ8aw4budaSBsYW8gxJHhu5luZyBsw6BtIHZp4buHYyB0cm9uZyBuaMOzbSBsYW8gxJHhu5luZyBjaMOibiB0YXkgc28gduG7m2kgbmjDs20ga2jDtG5nIGzDoG0gdmnhu4djIGNow6JuIHRheS4gQ2hvIHRo4bqleSBy4bqxbmcgbuG6v3UgbeG7mXQgbmfGsOG7nWkgbMOgbSB2aeG7h2MgdHJvbmcgbmfDoG5oIGxhbyDEkeG7mW5nIGNow6JuIHRheSwgdGjDrCBnacOhIHRy4buLIG5nxrDhu6FuZyB0xINuZyB0aMOqbSBraG/huqNuZyAxLjAzLCB04burIMSRw7MgbMOgbSB0xINuZyB4w6FjIHN14bqldCB0aGFtIGdpYSBjw7RuZyDEkW/DoG4uICAgIA0KDQoqICpE4buxIGLDoW86KiAgIA0KDQoqKkThu7EgYsOhbyB24bubaSBgdHlwciA9IHJlc3BvbnNlYCoqICAgDQoNCmBgYHtyLGVjaG89VFJVRX0NCm5ld193b3JrZXIxMSA8LSBkYXRhLmZyYW1lKGJsdWVjb2wgPSAibm8iKQ0KcHJlZGljdChwcm9iaXRfbW9kZWwxLCBuZXdkYXRhID0gbmV3X3dvcmtlcjExLCB0eXBlID0gInJlc3BvbnNlIikNCmBgYA0KTuG6v3UgbeG7mXQgbmfGsOG7nWkga2jDtG5nIGzDoG0gdmnhu4djIHRyb25nIG5nw6BuaCBsYW8gxJHhu5luZyBjaMOibiB0YXksIHRow6wgeMOhYyBzdeG6pXQgaOG7jSB0aGFtIGdpYSBjw7RuZyDEkW/DoG4gdGhlbyDGsOG7m2MgbMaw4bujbmcgdOG7qyBtw7QgaMOsbmggcHJvYml0IGzDoCBraG/huqNuZyAxNy43OCUuICAgIA0KDQojIyMjIEJp4bq/biBgaW5kYA0KDQogVGjDoG5oIHBo4bqnbiBtw7QgaMOsbmg6ICAgDQoNCiogUmFuZG9tIGNvbXBvbmVudDogICANCiRZIFxzaW0gXHRleHR7QmVybm91bGxpfShwKSQgICANCg0KKiBTeXN0ZW1hdGljIGNvbXBvbmVudDogICANCiRcZXRhID0gXGJldGFfMCArIFxiZXRhXzEgXHRpbWVzIFx0ZXh0e2luZH0kICAgDQoNCiogTGluayBmdW5jdGlvbjogICANCiRnKHApID0gXFBoaV57LTF9KHApJCAgICAgIA0KDQrwn5OMIFBoxrDGoW5nIHRyw6xuaCBtw7QgaMOsbmg6ICAgDQoNCiQkDQpcUGhpXnstMX0ocF9pKSA9IFxiZXRhXzAgKyBcYmV0YV8xIFx0aW1lcyBcdGV4dHtpbmR9X2kNCiQkICAgDQpUcm9uZyDEkcOzOiAgIA0KDQoqICRcUGhpXnstMX0kIGzDoCBow6BtIHBow6JuIHBo4buRaSB0w61jaCBsxal5IGNodeG6qW4gbmdo4buLY2ggxJHhuqNvIChpbnZlcnNlIENERikgICANCg0KKiBDw6FjIGvDvSBoaeG7h3Uga2jDoWMgbmjGsCBtw7QgaMOsbmggTG9naXN0aWMgKMOhcCBk4bulbmcgY2hvIHRyxrDhu51uZyBo4bujcCBuw6B5IGzDoCBtw7QgaMOsbmggUHJvYml0LCB24bubaSAkcF9pJCBsw6AgeMOhYyBzdeG6pXQgbmfGsOG7nWkgbGFvIMSR4buZbmcgdGjhu6kgJGkkIHRoYW0gZ2lhIGPDtG5nIMSRb8OgbiwgJFx0ZXh0e2luZH1faSQgbMOgIGJp4bq/biBuZ8Ogbmggbmdo4buBLCAkXGJldGFfMCQgbMOgIGjhu4cgc+G7kSBjaOG6t24gdsOgICRcYmV0YV8xJCBsw6AgaOG7hyBz4buRIOG6o25oIGjGsOG7n25nIGPhu6dhIG5nw6BuaCBuZ2jhu4EpLiAgIA0KDQoqICrGr+G7m2MgbMaw4bujbmcgbcO0IGjDrG5oOiogICANCg0KYGBge3IsZWNobz1UUlVFfQ0KDQpwcm9iaXRfbW9kZWwyIDwtIGdsbSh1bmlvbl9iaW4gfiBpbmQsIGRhdGEgPSBkMSwgZmFtaWx5ID0gYmlub21pYWwobGluayA9ICJwcm9iaXQiKSkNCnN1bW1hcnkocHJvYml0X21vZGVsMikNCg0KYGBgDQoNCipQaMawxqFuZyB0csOsbmggaOG7k2kgcXV5IHByb2JpdDoqICAgDQokJA0KXFBoaV57LTF9KHBfaSkgPSAtMC41MDQ0MCArIDAuMzgxNTggXHRpbWVzIFx0ZXh0e2luZH1faQ0KJCQNCioqTmjhuq1uIHjDqXQ6KiogICANClbhu5tpIG5nxrDhu51pIGtow7RuZyBsw6BtIHZp4buHYyB0cm9uZyBuZ8OgbmggY8O0bmcgbmdoaeG7h3AgIHRow6wgZ2nDoSB0cuG7iyBr4buzIHbhu41uZyBj4bunYSBiaeG6v24g4bqpbiB0cm9uZyBtw7QgaMOsbmggbMOgIOKAkzAuNTA0NDAuIFjDoWMgc3XhuqV0IHRo4buxYyB04bq/IHRoYW0gZ2lhIGPDtG5nIMSRb8OgbjogJCQgXHRleHR7UHJ9KFx0ZXh0e3VuaW9ufSA9IDEgXCB8IFwgXHRleHR7aW5kfSA9IFx0ZXh0eyJub24taW5kdXN0cmlhbCJ9KSA9IFxQaGkoLTAuNTA0NDApIFxhcHByb3ggMC4zMDcgJCQsIHThu6ljIGtob+G6o25nIDMwLjclIGto4bqjIG7Eg25nIHRoYW0gZ2lhIGPDtG5nIMSRb8OgbiDEkeG7kWkgduG7m2kgbmfGsOG7nWkgbGFvIMSR4buZbmcga2jDtG5nIGzDoG0gdHJvbmcgbmfDoG5oIGPDtG5nIG5naGnhu4dwLiAgIA0KDQoqICRcYmV0YV8xPTAuMzgxNTgkOiDEkeG6oWkgZGnhu4duIGNobyBz4buxIHRoYXkgxJHhu5VpIHRyb25nIGdpw6EgdHLhu4sgYmnhur9uIOG6qW4ga2hpIG5nxrDhu51pIGxhbyDEkeG7mW5nIGzDoG0gdmnhu4djIHRyb25nIG5nw6BuaCBjw7RuZyBuZ2hp4buHcCBzbyB24bubaSBuZ8aw4budaSBraMO0bmcgbMOgbSB0cm9uZyBuZ8OgbmggbsOgeS4gQ+G7pSB0aOG7gywgbuG6v3UgbeG7mXQgbmfGsOG7nWkgbMOgbSB0cm9uZyBuZ8OgbmggY8O0bmcgbmdoaeG7h3AsIGdpw6EgdHLhu4sgbmfGsOG7oW5nIGxhdGVudCB0xINuZyB0aMOqbSBraG/huqNuZyAwLjM4IMSRxqFuIHbhu4ssIHThu6sgxJHDsyBsw6BtIHTEg25nIHjDoWMgc3XhuqV0IHRoYW0gZ2lhIGPDtG5nIMSRb8Ogbi4gICAgDQoNCiogKkThu7EgYsOhbzoqICAgDQoNCioqROG7sSBiw6FvIHbhu5tpIGB0eXByID0gcmVzcG9uc2VgKiogICANCg0KYGBge3IsZWNobz1UUlVFfQ0KbmV3X3dvcmtlcjEyIDwtIGRhdGEuZnJhbWUoaW5kID0gIm5vbi1pbmR1c3RyaWFsIikNCnByZWRpY3QocHJvYml0X21vZGVsMiwgbmV3ZGF0YSA9IG5ld193b3JrZXIxMiwgdHlwZSA9ICJyZXNwb25zZSIpDQpgYGANClbhu5tpIG5nxrDhu51pIGxhbyDEkeG7mW5nIGtow7RuZyBsw6BtIHRyb25nIG5nw6BuaCBjw7RuZyBuZ2hp4buHcCwgbcO0IGjDrG5oIHByb2JpdCDGsOG7m2MgdMOtbmggeMOhYyBzdeG6pXQgdGhhbSBnaWEgY8O0bmcgxJFvw6BuIGzDoCBraG/huqNuZyAzMC43JS4gICAgDQoNCiMjIyMgQmnhur9uIGBzb3V0aGANCvCfk4wgVGjDoG5oIHBo4bqnbiBtw7QgaMOsbmg6ICAgDQoNCiogUmFuZG9tIGNvbXBvbmVudDogICANCiRZIFxzaW0gXHRleHR7QmVybm91bGxpfShwKSQgICANCg0KKiBTeXN0ZW1hdGljIGNvbXBvbmVudDogICANCiRcZXRhID0gXGJldGFfMCArIFxiZXRhXzEgXHRpbWVzIFx0ZXh0e3NvdXRofSQgICANCg0KKiBMaW5rIGZ1bmN0aW9uOiAgIA0KJGcocCkgPSBcUGhpXnstMX0ocCkkICAgICAgDQoNCvCfk4wgUGjGsMahbmcgdHLDrG5oIG3DtCBow6xuaDogICANCg0KJCQNClxQaGleey0xfShwX2kpID0gXGJldGFfMCArIFxiZXRhXzEgXHRpbWVzIFx0ZXh0e3NvdXRofV9pDQokJCANClRyb25nIMSRw7M6ICAgDQoNCiogJFxQaGleey0xfSQgbMOgIGjDoG0gcGjDom4gcGjhu5FpIHTDrWNoIGzFqXkgY2h14bqpbiBuZ2jhu4tjaCDEkeG6o28gKGludmVyc2UgQ0RGKSAgIA0KDQoqIEPDoWMga8O9IGhp4buHdSBraMOhYyBuaMawIG3DtCBow6xuaCBMb2dpc3RpYyAow6FwIGThu6VuZyBjaG8gdHLGsOG7nW5nIGjhu6NwIG7DoHkgbMOgIG3DtCBow6xuaCBQcm9iaXQsIHbhu5tpICRwX2kkIGzDoCB4w6FjIHN14bqldCBuZ8aw4budaSBsYW8gxJHhu5luZyB0aOG7qSAkaSQgdGhhbSBnaWEgY8O0bmcgxJFvw6BuLCAkXHRleHR7c291dGh9X2kkIGzDoCBiaeG6v24ga2h1IHbhu7FjIGPGsCB0csO6LCAkXGJldGFfMCQgbMOgIGjhu4cgc+G7kSBjaOG6t24gdsOgICRcYmV0YV8xJCBsw6AgaOG7hyBz4buRIOG6o25oIGjGsOG7n25nIGPhu6dhIGtodSB24buxYyBjxrAgdHLDuikuICAgDQoNCiogKsav4bubYyBsxrDhu6NuZyBtw7QgaMOsbmg6KiAgIA0KDQpgYGB7cixlY2hvPVRSVUV9DQoNCnByb2JpdF9tb2RlbDMgPC0gZ2xtKHVuaW9uX2JpbiB+IHNvdXRoLCBkYXRhID0gZDEsIGZhbWlseSA9IGJpbm9taWFsKGxpbmsgPSAicHJvYml0IikpDQpzdW1tYXJ5KHByb2JpdF9tb2RlbDMpDQoNCmBgYA0KKlBoxrDGoW5nIHRyw6xuaCBo4buTaSBxdXkgcHJvYml0OiogICANCiQkDQpcUGhpXnstMX0ocF9pKSA9IC0wLjIxNzA4IC0gMC40ODQzNCBcdGltZXMgXHRleHR7c291dGh9X2kNCiQkDQoqKk5o4bqtbiB4w6l0OioqICAgDQpW4bubaSBuZ8aw4budaSBraMO0bmcgY8awIHRyw7ogdOG6oWkgbWnhu4FuIE5hbSAgdGjDrCBnacOhIHRy4buLIGvhu7MgduG7jW5nIGPhu6dhIGJp4bq/biDhuqluIHRyb25nIG3DtCBow6xuaCBsw6Ag4oCTMC4yMTcwOC4gWMOhYyBzdeG6pXQgdGjhu7FjIHThur8gdGhhbSBnaWEgY8O0bmcgxJFvw6BuOiAkJCBcdGV4dHtQcn0oXHRleHR7dW5pb259ID0gMSBcIHwgXCBcdGV4dHtzb3V0aH0gPSBcdGV4dHsibm8ifSkgPSBcUGhpKC0wLjIxNzA4KSBcYXBwcm94IDAuNDE0ICQkLCB04bupYyBraG/huqNuZyA0MS40JSBraOG6oyBuxINuZyB0aGFtIGdpYSBjw7RuZyDEkW/DoG4gxJHhu5FpIHbhu5tpIG5nxrDhu51pIGxhbyDEkeG7mW5nIGtow7RuZyBjxrAgdHLDuiB04bqhaSBtaeG7gW4gTmFtLiAgIA0KDQoqICRcYmV0YV8xPTAuNDg0MzQkOiDEkeG6oWkgZGnhu4duIGNobyBz4buxIHRoYXkgxJHhu5VpIHRyb25nIGdpw6EgdHLhu4sgYmnhur9uIOG6qW4ga2hpIG5nxrDhu51pIGxhbyDEkeG7mW5nIGPGsCB0csO6IOG7nyBtaeG7gW4gTmFtIHNvIHbhu5tpIG5nxrDhu51pIGtow7RuZyBz4buRbmcg4bufIG1p4buBbiBOYW0uIEPhu6UgdGjhu4MsIG7hur91IG3hu5l0IG5nxrDhu51pIHPhu5FuZyDhu58gbWnhu4FuIE5hbSwgZ2nDoSB0cuG7iyBuZ8aw4buhbmcgbGF0ZW50IHPhur0gZ2nhuqNtIMSRaSBraG/huqNuZyAwLjQ4IMSRxqFuIHbhu4ssIHThu6sgxJHDsyBsw6BtIGdp4bqjbSB4w6FjIHN14bqldCB0aGFtIGdpYSBjw7RuZyDEkW/DoG4uLiAgICANCg0KKiAqROG7sSBiw6FvOiogICANCg0KKipE4buxIGLDoW8gduG7m2kgYHR5cHIgPSByZXNwb25zZWAqKiAgIA0KDQpgYGB7cixlY2hvPVRSVUV9DQpuZXdfd29ya2VyMTMgPC0gZGF0YS5mcmFtZShzb3V0aCA9ICJubyIpDQpwcmVkaWN0KHByb2JpdF9tb2RlbDMsIG5ld2RhdGEgPSBuZXdfd29ya2VyMTMsIHR5cGUgPSAicmVzcG9uc2UiKQ0KYGBgDQpW4bubaSBuZ8aw4budaSBsYW8gxJHhu5luZyBraMO0bmcgc+G7kW5nIOG7nyBtaeG7gW4gTmFtLCBtw7QgaMOsbmggcHJvYml0IMaw4bubYyB0w61uaCB4w6FjIHN14bqldCB0aGFtIGdpYSBjw7RuZyDEkW/DoG4gbMOgIGtob+G6o25nIDQxLjQlLiAgICANCg0KIyMjIyBCaeG6v24gYG1hcnJpZWRgDQrwn5OMIFRow6BuaCBwaOG6p24gbcO0IGjDrG5oOiAgIA0KDQoqIFJhbmRvbSBjb21wb25lbnQ6ICAgDQokWSBcc2ltIFx0ZXh0e0Jlcm5vdWxsaX0ocCkkICAgDQoNCiogU3lzdGVtYXRpYyBjb21wb25lbnQ6ICAgDQokXGV0YSA9IFxiZXRhXzAgKyBcYmV0YV8xIFx0aW1lcyBcdGV4dHttYXJyaWVkfSQgICANCg0KKiBMaW5rIGZ1bmN0aW9uOiAgIA0KJGcocCkgPSBcUGhpXnstMX0ocCkkICAgICAgDQoNCvCfk4wgUGjGsMahbmcgdHLDrG5oIG3DtCBow6xuaDogICANCg0KJCQNClxQaGleey0xfShwX2kpID0gXGJldGFfMCArIFxiZXRhXzEgXHRpbWVzIFx0ZXh0e21hcnJpZWR9X2kNCiQkICAgDQpUcm9uZyDEkcOzOiAgIA0KDQoqICRcUGhpXnstMX0kIGzDoCBow6BtIHBow6JuIHBo4buRaSB0w61jaCBsxal5IGNodeG6qW4gbmdo4buLY2ggxJHhuqNvIChpbnZlcnNlIENERikgICANCg0KKiBDw6FjIGvDvSBoaeG7h3Uga2jDoWMgbmjGsCBtw7QgaMOsbmggTG9naXN0aWMgKMOhcCBk4bulbmcgY2hvIHRyxrDhu51uZyBo4bujcCBuw6B5IGzDoCBtw7QgaMOsbmggUHJvYml0LCB24bubaSAkcF9pJCBsw6AgeMOhYyBzdeG6pXQgbmfGsOG7nWkgbGFvIMSR4buZbmcgdGjhu6kgJGkkIHRoYW0gZ2lhIGPDtG5nIMSRb8OgbiwgJFx0ZXh0e21hcnJpZWR9X2kkIGzDoCBiaeG6v24gdMOsbmggdHLhuqFuZyBow7RuIG5ow6JuLCAkXGJldGFfMCQgbMOgIGjhu4cgc+G7kSBjaOG6t24gdsOgICRcYmV0YV8xJCBsw6AgaOG7hyBz4buRIOG6o25oIGjGsOG7n25nIGPhu6dhIHTDrG5oIHRy4bqhbmcgaMO0biBuaMOibikuICAgDQoNCiogKsav4bubYyBsxrDhu6NuZyBtw7QgaMOsbmg6KiAgIA0KDQpgYGB7cixlY2hvPVRSVUV9DQoNCnByb2JpdF9tb2RlbDQgPC0gZ2xtKHVuaW9uX2JpbiB+IG1hcnJpZWQsIGRhdGEgPSBkMSwgZmFtaWx5ID0gYmlub21pYWwobGluayA9ICJwcm9iaXQiKSkNCnN1bW1hcnkocHJvYml0X21vZGVsNCkNCg0KYGBgDQoNCipQaMawxqFuZyB0csOsbmggaOG7k2kgcXV5IHByb2JpdDoqICAgDQokJA0KXFBoaV57LTF9KHBfaSkgPSAtMC42Nzk1OSArIDAuNDAxMTMgXHRpbWVzIFx0ZXh0e21hcnJpZWR9X2kNCiQkDQoqKk5o4bqtbiB4w6l0OioqICAgDQpW4bubaSBuZ8aw4budaSBjaMawYSBr4bq/dCBow7RuICB0aMOsIGdpw6EgdHLhu4sga+G7syB24buNbmcgY+G7p2EgYmnhur9uIOG6qW4gdHJvbmcgbcO0IGjDrG5oIGzDoCDigJMwLjY3OTU5LiBYw6FjIHN14bqldCB0aOG7sWMgdOG6vyB0aGFtIGdpYSBjw7RuZyDEkW/DoG46ICQkIFx0ZXh0e1ByfShcdGV4dHt1bmlvbn0gPSAxIFwgfCBcIFx0ZXh0e21hcnJpZWR9ID0gXHRleHR7Im5vIn0pID0gXFBoaSgtMC42Nzk1OSkgXGFwcHJveCAwLjI0OCAkJCwgdOG7qWMga2hv4bqjbmcgMjQuOCUga2jhuqMgbsSDbmcgdGhhbSBnaWEgY8O0bmcgxJFvw6BuIMSR4buRaSB24bubaSBuZ8aw4budaSBsYW8gxJHhu5luZyBjaMawYSBr4bq/dCBow7RuLiAgIA0KDQoqICRcYmV0YV8xPTAuNDAxMTMkOiDEkeG6oWkgZGnhu4duIGNobyBz4buxIHRoYXkgxJHhu5VpIHRyb25nIGdpw6EgdHLhu4sgYmnhur9uIOG6qW4ga2hpIG5nxrDhu51pIGxhbyDEkeG7mW5nIMSRw6Mga+G6v3QgaMO0biBzbyB24bubaSBuZ8aw4budaSBjaMawYSBr4bq/dCBow7RuLiBD4bulIHRo4buDLCBu4bq/dSBt4buZdCBuZ8aw4budaSDEkcOjIGvhur90IGjDtG4sIGdpw6EgdHLhu4sgbmfGsOG7oW5nIGxhdGVudCBz4bq9IHTEg25nIHRow6ptIGtob+G6o25nIDAuNDAgxJHGoW4gduG7iywgdOG7qyDEkcOzIGzDoG0gdMSDbmcgeMOhYyBzdeG6pXQgdGhhbSBnaWEgY8O0bmcgxJFvw6BuLiAgICANCg0KKiAqROG7sSBiw6FvOiogICANCg0KKipE4buxIGLDoW8gduG7m2kgYHR5cHIgPSByZXNwb25zZWAqKiAgIA0KDQpgYGB7cixlY2hvPVRSVUV9DQpuZXdfd29ya2VyMTQgPC0gZGF0YS5mcmFtZShtYXJyaWVkID0gIm5vIikNCnByZWRpY3QocHJvYml0X21vZGVsNCwgbmV3ZGF0YSA9IG5ld193b3JrZXIxNCwgdHlwZSA9ICJyZXNwb25zZSIpDQpgYGANClbhu5tpIG5nxrDhu51pIGxhbyDEkeG7mW5nIGNoxrBhIGvhur90IGjDtG4sIHRow6wgbcO0IGjDrG5oIHByb2JpdCDGsOG7m2MgdMOtbmggeMOhYyBzdeG6pXQgdGhhbSBnaWEgY8O0bmcgxJFvw6BuIGzDoCBraG/huqNuZyAyNC44JS4gICAgDQoNCiMjIyMgQmnhur9uIGBzZXhgDQrwn5OMIFRow6BuaCBwaOG6p24gbcO0IGjDrG5oOiAgIA0KDQoqIFJhbmRvbSBjb21wb25lbnQ6ICAgDQokWSBcc2ltIFx0ZXh0e0Jlcm5vdWxsaX0ocCkkICAgDQoNCiogU3lzdGVtYXRpYyBjb21wb25lbnQ6ICAgDQokXGV0YSA9IFxiZXRhXzAgKyBcYmV0YV8xIFx0aW1lcyBcdGV4dHtzZXh9JCAgIA0KDQoqIExpbmsgZnVuY3Rpb246ICAgDQokZyhwKSA9IFxQaGleey0xfShwKSQgICAgICANCg0K8J+TjCBQaMawxqFuZyB0csOsbmggbcO0IGjDrG5oOiAgIA0KDQokJA0KXFBoaV57LTF9KHBfaSkgPSBcYmV0YV8wICsgXGJldGFfMSBcdGltZXMgXHRleHR7c2V4fV9pDQokJCAgIA0KVHJvbmcgxJHDszogICANCg0KKiAkXFBoaV57LTF9JCBsw6AgaMOgbSBwaMOibiBwaOG7kWkgdMOtY2ggbMWpeSBjaHXhuqluIG5naOG7i2NoIMSR4bqjbyAoaW52ZXJzZSBDREYpICAgDQoqIEPDoWMga8O9IGhp4buHdSBraMOhYyBuaMawIG3DtCBow6xuaCBMb2dpc3RpYyAow6FwIGThu6VuZyBjaG8gdHLGsOG7nW5nIGjhu6NwIG7DoHkgbMOgIG3DtCBow6xuaCBQcm9iaXQsIHbhu5tpICRwX2kkIGzDoCB4w6FjIHN14bqldCBuZ8aw4budaSBsYW8gxJHhu5luZyB0aOG7qSAkaSQgdGhhbSBnaWEgY8O0bmcgxJFvw6BuLCAkXHRleHR7c2V4fV9pJCBsw6AgYmnhur9uIGdp4bubaSB0w61uaCwgJFxiZXRhXzAkIGzDoCBo4buHIHPhu5EgY2jhurduIHbDoCAkXGJldGFfMSQgbMOgIGjhu4cgc+G7kSDhuqNuaCBoxrDhu59uZyBj4bunYSBnaeG7m2kgdMOtbmgpLiAgIA0KDQoqICrGr+G7m2MgbMaw4bujbmcgbcO0IGjDrG5oOiogICANCg0KYGBge3IsZWNobz1UUlVFfQ0KDQpwcm9iaXRfbW9kZWw1IDwtIGdsbSh1bmlvbl9iaW4gfiBzZXgsIGRhdGEgPSBkMSwgZmFtaWx5ID0gYmlub21pYWwobGluayA9ICJwcm9iaXQiKSkNCnN1bW1hcnkocHJvYml0X21vZGVsNSkNCg0KYGBgDQoNCipQaMawxqFuZyB0csOsbmggaOG7k2kgcXV5IHByb2JpdDoqICAgDQokJA0KXFBoaV57LTF9KHBfaSkgPSAtMC44MDI2NSArIDAuNTA2MDYgXHRpbWVzIFx0ZXh0e3NleH1faQ0KJCQNCioqTmjhuq1uIHjDqXQ6KiogICANCg0KVuG7m2kgbmfGsOG7nWkgbGFvIMSR4buZbmcgbMOgIG7hu68gdGjDrCBnacOhIHRy4buLIGvhu7MgduG7jW5nIGPhu6dhIGJp4bq/biDhuqluIHRyb25nIG3DtCBow6xuaCBsw6Ag4oCTMC44MDI2NS4gWMOhYyBzdeG6pXQgdGjhu7FjIHThur8gdGhhbSBnaWEgY8O0bmcgxJFvw6BuOiAkJCBcdGV4dHtQcn0oXHRleHR7dW5pb259ID0gMSBcIHwgXCBcdGV4dHtzZXh9ID0gXHRleHR7ImZlbWFsZSJ9KSA9IFxQaGkoLTAuODAyNjUpIFxhcHByb3ggMC4yMTEgJCQsIHThu6ljIGtob+G6o25nIDIxLjElIGto4bqjIG7Eg25nIHRoYW0gZ2lhIGPDtG5nIMSRb8OgbiBu4bq/dSBuZ8aw4budaSBsYW8gxJHhu5luZyBsw6AgbuG7ry4gICANCg0KKiAkXGJldGFfMT0wLjUwNjA2JDogxJHhuqFpIGRp4buHbiBjaG8gc+G7sSB0aGF5IMSR4buVaSB0cm9uZyBnacOhIHRy4buLIGxhdGVudCBraGkgbmfGsOG7nWkgbGFvIMSR4buZbmcgbMOgIG5hbSBzbyB24bubaSBu4buvLiBD4bulIHRo4buDLCBu4bq/dSBt4buZdCBuZ8aw4budaSBsYW8gxJHhu5luZyBsw6AgbmFtIHRow6wgZ2nDoSB0cuG7iyDhuqluIHTEg25nIHRow6ptIGtob+G6o25nIDAuNTEgxJHGoW4gduG7iywgdOG7qyDEkcOzIGzDoG0gdMSDbmcgeMOhYyBzdeG6pXQgdGhhbSBnaWEgY8O0bmcgxJFvw6BuLiAgICANCg0KKiAqROG7sSBiw6FvOiogICANCg0KKipE4buxIGLDoW8gduG7m2kgYHR5cHIgPSByZXNwb25zZWAqKiAgIA0KDQpgYGB7cixlY2hvPVRSVUV9DQpuZXdfd29ya2VyMTUgPC0gZGF0YS5mcmFtZShzZXggPSAiZmVtYWxlIikNCnByZWRpY3QocHJvYml0X21vZGVsNSwgbmV3ZGF0YSA9IG5ld193b3JrZXIxNSwgdHlwZSA9ICJyZXNwb25zZSIpDQpgYGANCk7hur91IG3hu5l0IG5nxrDhu51pIGxhbyDEkeG7mW5nIGzDoCBu4buvLCB0aMOsIHjDoWMgc3XhuqV0IGjhu40gdGhhbSBnaWEgY8O0bmcgxJFvw6BuIHRoZW8gxrDhu5tjIGzGsOG7o25nIHThu6sgbcO0IGjDrG5oIHByb2JpdCBsw6Aga2hv4bqjbmcgMjEuMSUuICAgIA0KDQojIyMjIEJp4bq/biBgYmxhY2tgDQrwn5OMIFRow6BuaCBwaOG6p24gbcO0IGjDrG5oOiAgIA0KDQoqIFJhbmRvbSBjb21wb25lbnQ6ICAgDQokWSBcc2ltIFx0ZXh0e0Jlcm5vdWxsaX0ocCkkICAgDQoNCiogU3lzdGVtYXRpYyBjb21wb25lbnQ6ICAgDQokXGV0YSA9IFxiZXRhXzAgKyBcYmV0YV8xIFx0aW1lcyBcdGV4dHtibGFja30kICAgDQoNCiogTGluayBmdW5jdGlvbjogICANCiRnKHApID0gXFBoaV57LTF9KHApJCAgICAgIA0KDQrwn5OMIFBoxrDGoW5nIHRyw6xuaCBtw7QgaMOsbmg6ICAgDQoNCiQkDQpcUGhpXnstMX0ocF9pKSA9IFxiZXRhXzAgKyBcYmV0YV8xIFx0aW1lcyBcdGV4dHtibGFja31faQ0KJCQgICANCg0KVHJvbmcgxJHDszogICANCg0KKiAkXFBoaV57LTF9JCBsw6AgaMOgbSBwaMOibiBwaOG7kWkgdMOtY2ggbMWpeSBjaHXhuqluIG5naOG7i2NoIMSR4bqjbyAoaW52ZXJzZSBDREYpICAgDQoNCiogQ8OhYyBrw70gaGnhu4d1IGtow6FjIG5oxrAgbcO0IGjDrG5oIExvZ2lzdGljICjDoXAgZOG7pW5nIGNobyB0csaw4budbmcgaOG7o3AgbsOgeSBsw6AgbcO0IGjDrG5oIFByb2JpdCwgduG7m2kgJHBfaSQgbMOgIHjDoWMgc3XhuqV0IG5nxrDhu51pIGxhbyDEkeG7mW5nIHRo4bupICRpJCB0aGFtIGdpYSBjw7RuZyDEkW/DoG4sICRcdGV4dHtibGFja31faSQgbMOgIGJp4bq/biBjaOG7p25nIHThu5ljLCAkXGJldGFfMCQgbMOgIGjhu4cgc+G7kSBjaOG6t24gdsOgICRcYmV0YV8xJCBsw6AgaOG7hyBz4buRIOG6o25oIGjGsOG7n25nIGPhu6dhIGNo4bunbmcgdOG7mWMpLiAgIA0KDQoqICrGr+G7m2MgbMaw4bujbmcgbcO0IGjDrG5oOiogICANCg0KYGBge3IsZWNobz1UUlVFfQ0KDQpwcm9iaXRfbW9kZWw2IDwtIGdsbSh1bmlvbl9iaW4gfiBibGFjaywgZGF0YSA9IGQxLCBmYW1pbHkgPSBiaW5vbWlhbChsaW5rID0gInByb2JpdCIpKQ0Kc3VtbWFyeShwcm9iaXRfbW9kZWw2KQ0KDQpgYGANCg0KKlBoxrDGoW5nIHRyw6xuaCBo4buTaSBxdXkgcHJvYml0OiogICANCiQkDQpcUGhpXnstMX0ocF9pKSA9IC0wLjM2NDcyICsgMC4yMjY4OCBcdGltZXMgXHRleHR7YmxhY2t9X2kNCiQkDQoqKk5o4bqtbiB4w6l0OioqICAgDQoNClbhu5tpIG5nxrDhu51pIGtow7RuZyBwaOG6o2kgbMOgIG5nxrDhu51pIGRhIMSRZW4gdGjDrCBnacOhIHRy4buLIGvhu7MgduG7jW5nIGPhu6dhIGJp4bq/biDhuqluIHRyb25nIG3DtCBow6xuaCBsw6Ag4oCTMC4zNjQ3Mi4gWMOhYyBzdeG6pXQgdGjhu7FjIHThur8gdGhhbSBnaWEgY8O0bmcgxJFvw6BuOiAkJCBcdGV4dHtQcn0oXHRleHR7dW5pb259ID0gMSBcIHwgXCBcdGV4dHtibGFja30gPSBcdGV4dHsibm8ifSkgPSBcUGhpKC0wLjM2NDcyKSBcYXBwcm94IDAuMzU3OCAkJCwgdOG7qWMga2hv4bqjbmcgMzUuNzglIGto4bqjIG7Eg25nIHRoYW0gZ2lhIGPDtG5nIMSRb8OgbiBu4bq/dSBuZ8aw4budaSBsYW8gxJHhu5luZyBraMO0bmcgcGjhuqNpIG5nxrDhu51pIGRhIMSRZW4uICAgDQoNCiogJFxiZXRhXzE9MS4wMjI2ODgkOiDEkeG6oWkgZGnhu4duIGNobyBraHV5bmggaMaw4bubbmcgdGhhbSBnaWEgY8O0bmcgxJFvw6BuIGtoaSBuZ8aw4budaSBsYW8gxJHhu5luZyBsw6AgbmfGsOG7nWkgZGEgxJFlbiBzbyB24bubaSBuZ8aw4budaSBraMO0bmcgcGjhuqNpIGRhIMSRZW4uIENobyB0aOG6pXkgcuG6sW5nIG7hur91IG3hu5l0IG5nxrDhu51pIGzDoCBuZ8aw4budaSBkYSDEkWVuLCB0aMOsIGdpw6EgdHLhu4sgbmfGsOG7oW5nIHTEg25nIHRow6ptIGtob+G6o25nIDAuMjI3LCB04burIMSRw7MgbMOgbSB0xINuZyB4w6FjIHN14bqldCB0aGFtIGdpYSBjw7RuZyDEkW/DoG4uICAgIA0KDQoqICpE4buxIGLDoW86KiAgIA0KDQoqKkThu7EgYsOhbyB24bubaSBgdHlwciA9IHJlc3BvbnNlYCoqICAgDQoNCmBgYHtyLGVjaG89VFJVRX0NCm5ld193b3JrZXIxNiA8LSBkYXRhLmZyYW1lKGJsYWNrID0gIm5vIikNCnByZWRpY3QocHJvYml0X21vZGVsNiwgbmV3ZGF0YSA9IG5ld193b3JrZXIxNiwgdHlwZSA9ICJyZXNwb25zZSIpDQpgYGANCk7hur91IG3hu5l0IG5nxrDhu51pIGtow7RuZyBwaOG6o2kgbMOgIG5nxrDhu51pIGRhIMSRZW4sIHRow6wgeMOhYyBzdeG6pXQgaOG7jSB0aGFtIGdpYSBjw7RuZyDEkW/DoG4gdGhlbyDGsOG7m2MgbMaw4bujbmcgdOG7qyBtw7QgaMOsbmggcHJvYml0IGzDoCBraG/huqNuZyAzNS44JS4gICAgDQoNCiMjIyBNw7QgaMOsbmggQ2xvZ2xvZw0KDQojIyMjIEJp4bq/biBgYmx1ZWNvbGANCvCfk4wgVGjDoG5oIHBo4bqnbiBtw7QgaMOsbmg6ICAgDQoNCiogUmFuZG9tIGNvbXBvbmVudDogICANCiRZIFxzaW0gXHRleHR7QmVybm91bGxpfShwKSQgICANCg0KKiBTeXN0ZW1hdGljIGNvbXBvbmVudDogICANCiRcZXRhID0gXGJldGFfMCArIFxiZXRhXzEgXHRpbWVzIFx0ZXh0e2JsdWVjb2x9JCAgIA0KDQoqIExpbmsgZnVuY3Rpb246ICAgDQokZyhwKSA9IFxsb2coLVxsb2coMS1wKSkkICAgICAgICAgDQoNCvCfk4wgUGjGsMahbmcgdHLDrG5oIG3DtCBow6xuaDogICANCg0KJCQNClxsb2cgXGxlZnQoIC1cbG9nKDEtcF9pKSBccmlnaHQpID0gXGJldGFfMCArIFxiZXRhXzEgXHRpbWVzIFx0ZXh0e2JsdWVjb2x9X2kNCiQkICAgICANCg0KKiAqxq/hu5tjIGzGsOG7o25nIG3DtCBow6xuaDoqICAgDQoNCmBgYHtyLGVjaG89VFJVRX0NCg0KY2xvZ2xvZ19tb2RlbDIxIDwtIGdsbSh1bmlvbl9iaW4gfiBibHVlY29sLCBkYXRhID0gZDEsIGZhbWlseSA9IGJpbm9taWFsKGxpbmsgPSAiY2xvZ2xvZyIpKQ0Kc3VtbWFyeShjbG9nbG9nX21vZGVsMjEpDQoNCmBgYA0KJCQNClxsb2cgXGxlZnQoIC1cbG9nKDEtcF9pKSBccmlnaHQpID0gLTEuNjMwODEgKyAxLjM4MzU5IFx0aW1lcyBcdGV4dHtibHVlY29sfV9pDQokJA0KKipOaOG6rW4geMOpdDoqKiAgIA0KDQoqIFbhu5tpIG5nxrDhu51pIGtow7RuZyBsw6BtIHZp4buHYyB0cm9uZyBuaMOzbSBsYW8gxJHhu5luZyBjaMOibiB0YXkgZ2nDoSB0cuG7iyBr4buzIHbhu41uZyBj4bunYSBiaeG6v24g4bqpbiB0aGVvIG3DtCBow6xuaCBjbG9nbG9nIGzDoCAtMS42MzA4MS4gRG8gxJHDsywgeMOhYyBzdeG6pXQgdGhhbSBnaWEgY8O0bmcgxJFvw6BuIMSRxrDhu6NjIHTDrW5oIGLhurFuZzogDQokJCBcdGV4dHtQcn0oXHRleHR7dW5pb259ID0gMSBcIHwgXCBcdGV4dHtibHVlY29sfSA9IFx0ZXh0eyJubyJ9KSA9IDEgLSBcZXhwKC1cZXhwKC0xLjYzMDgxKSkgXGFwcHJveCAwLjE2OTQgJCQsIHThu6ljIGtob+G6o25nIDE2LjklIGto4bqjIG7Eg25nIHRoYW0gZ2lhIGPDtG5nIMSRb8OgbiB24bubaSBuZ8aw4budaSBraMO0bmcgbMOgbSB2aeG7h2MgY2jDom4gdGF5LiAgIA0KDQoqICRcYmV0YT0xLjM4MzU5JDogY2hvIGJp4bq/dCBt4bupYyB0aGF5IMSR4buVaSBj4bunYSBnacOhIHRy4buLIGxvZygtbG9nKDEgLSBwKSkga2hpIG5nxrDhu51pIGxhbyDEkeG7mW5nIGzDoG0gdmnhu4djIHRyb25nIG5ow7NtIGxhbyDEkeG7mW5nIGNow6JuIHRheSBzbyB24bubaSBuZ8aw4budaSBraMO0bmcgbMOgbS4gS2hpIMSRw7MsIGdpw6EgdHLhu4sgbmfGsOG7oW5nIHTEg25nIHRow6ptIGtob+G6o25nIDEuMzgsIGzDoG0gdMSDbmcgxJHDoW5nIGvhu4MgeMOhYyBzdeG6pXQgdGhhbSBnaWEgY8O0bmcgxJFvw6BuLiBOw7NpIGPDoWNoIGtow6FjLCBuZ8aw4budaSBsw6BtIHZp4buHYyBjaMOibiB0YXkgY8OzIHh1IGjGsOG7m25nIHRoYW0gZ2lhIGPDtG5nIMSRb8OgbiBjYW8gaMahbiDEkcOhbmcga+G7gyBzbyB24bubaSBuZ8aw4budaSBraMO0bmcgbMOgbSB2aeG7h2MgY2jDom4gdGF5LiAgIA0KDQoqICpE4buxIGLDoW86KiAgIA0KDQpgYGB7cixlY2hvPVRSVUV9DQpuZXdfd29ya2VyMjEgPC0gZGF0YS5mcmFtZShibHVlY29sID0gIm5vIikNCnByZWRpY3QoY2xvZ2xvZ19tb2RlbDIxLCBuZXdkYXRhID0gbmV3X3dvcmtlcjIxLCB0eXBlID0gInJlc3BvbnNlIikNCmBgYA0KTuG6v3UgbmfGsOG7nWkgbGFvIMSR4buZbmcga2jDtG5nIHRodeG7mWMgbmjDs20gbGFvIMSR4buZbmcgY2jDom4gdGF5IHRow6wga2jhuqMgbsSDbmcgdGhhbSBnaWEgY8O0bmcgxJFvw6BuIGzDoCAxNy44JS4gICANCg0KIyMjIyBCaeG6v24gYGluZGANCg0K8J+TjCBUaMOgbmggcGjhuqduIG3DtCBow6xuaDogICANCg0KKiBSYW5kb20gY29tcG9uZW50OiAgIA0KJFkgXHNpbSBcdGV4dHtCZXJub3VsbGl9KHApJCAgIA0KDQoqIFN5c3RlbWF0aWMgY29tcG9uZW50OiAgIA0KJFxldGEgPSBcYmV0YV8wICsgXGJldGFfMSBcdGltZXMgXHRleHR7aW5kfSQgICANCg0KKiBMaW5rIGZ1bmN0aW9uOiAgIA0KJGcocCkgPSBcbG9nKC1cbG9nKDEtcCkpJCAgICAgICAgIA0KDQrwn5OMIFBoxrDGoW5nIHRyw6xuaCBtw7QgaMOsbmg6ICAgDQoNCiQkDQpcbG9nIFxsZWZ0KCAtXGxvZygxLXBfaSkgXHJpZ2h0KSA9IFxiZXRhXzAgKyBcYmV0YV8xIFx0aW1lcyBcdGV4dHtpbmR9X2kNCiQkICAgICANCg0KKiAqxq/hu5tjIGzGsOG7o25nIG3DtCBow6xuaDoqICAgDQoNCmBgYHtyLGVjaG89VFJVRX0NCg0KY2xvZ2xvZ19tb2RlbDIyIDwtIGdsbSh1bmlvbl9iaW4gfiBpbmQsIGRhdGEgPSBkMSwgZmFtaWx5ID0gYmlub21pYWwobGluayA9ICJjbG9nbG9nIikpDQpzdW1tYXJ5KGNsb2dsb2dfbW9kZWwyMikNCg0KYGBgDQoNCiQkDQpcbG9nIFxsZWZ0KCAtXGxvZygxLXBfaSkgXHJpZ2h0KSA9IC0xLjAwMzE4ICsgMC40OTIxNiBcdGltZXMgXHRleHR7aW5kfV9pDQokJA0KKipOaOG6rW4geMOpdDoqKiAgIA0KDQoqIFbhu5tpIG5nxrDhu51pIGtow7RuZyBsw6BtIHZp4buHYyB0cm9uZyBuZ8OgbmggY8O0bmcgbmdoaeG7h3AsIGdpw6EgdHLhu4sga+G7syB24buNbmcgY+G7p2EgYmnhur9uIOG6qW4gdGhlbyBtw7QgaMOsbmggY2xvZ2xvZyBsw6Ag4oiSMS4wMDMxOC4gRG8gxJHDsywgeMOhYyBzdeG6pXQgdGhhbSBnaWEgY8O0bmcgxJFvw6BuIMSRxrDhu6NjIHTDrW5oIGLhurFuZzogDQokJCBcdGV4dHtQcn0oXHRleHR7dW5pb259ID0gMSBcIHwgXCBcdGV4dHtpbmR9ID0gXHRleHR7Im5vbi1pbmR1c3RyaWFsIn0pID0gMSAtIFxleHAoLVxleHAo4oiSMS4wMDMxOCkpIFxhcHByb3ggMC4yNjQgJCQsIHThu6ljIGtob+G6o25nIDI2LjQlIGto4bqjIG7Eg25nIHRoYW0gZ2lhIGPDtG5nIMSRb8OgbiDEkeG7kWkgduG7m2kgbmfGsOG7nWkgbGFvIMSR4buZbmcga2jDtG5nIGzDoG0gdHJvbmcgbmfDoG5oIGPDtG5nIG5naGnhu4dwLiAgIA0KDQoqICRcYmV0YT0wLjQ5MjE2JDogxJHhuqFpIGRp4buHbiBjaG8gbeG7qWMgdGhheSDEkeG7lWkgbmfGsOG7oW5nIHRoYW0gZ2lhIGPDtG5nIMSRb8OgbiBraGkgbmfGsOG7nWkgbGFvIMSR4buZbmcgbMOgbSB2aeG7h2MgdHJvbmcgbmfDoG5oIGPDtG5nIG5naGnhu4dwIHNvIHbhu5tpIG5ow7NtIGtow7RuZyBsw6BtIHRyb25nIG5nw6BuaCBjw7RuZyBuZ2hp4buHcC4gR2nDoSB0cuG7iyBkxrDGoW5nIGPhu6dhIGjhu4cgc+G7kSBuw6B5IGNobyB0aOG6pXkgbuG6v3UgbmfGsOG7nWkgbGFvIMSR4buZbmcgdGh14buZYyBuZ8OgbmggY8O0bmcgbmdoaeG7h3AsIHRow6wgZ2nDoSB0cuG7iyBow6BtIGxpw6puIGvhur90IHTEg25nIHRow6ptIGtob+G6o25nIDAuNDksIHThu6sgxJHDsyBsw6BtIHTEg25nIHjDoWMgc3XhuqV0IHRoYW0gZ2lhIGPDtG5nIMSRb8Ogbi4gICANCg0KKiAqROG7sSBiw6FvOiogICANCg0KYGBge3IsZWNobz1UUlVFfQ0KbmV3X3dvcmtlcjIyIDwtIGRhdGEuZnJhbWUoaW5kID0gIm5vbi1pbmR1c3RyaWFsIikNCnByZWRpY3QoY2xvZ2xvZ19tb2RlbDIyLCBuZXdkYXRhID0gbmV3X3dvcmtlcjIyLCB0eXBlID0gInJlc3BvbnNlIikNCmBgYA0KTuG6v3UgbmfGsOG7nWkgbGFvIMSR4buZbmcga2jDtG5nIHRodeG7mWMgbmjDs20gbmfDoG5oIHPhuqNuIHh14bqldCB0aMOsIGto4bqjIG7Eg25nIHRoYW0gZ2lhIGPDtG5nIMSRb8OgbiBsw6AgMzAuNyUuICAgDQojIyMjIEJp4bq/biBgc291dGhgDQrwn5OMIFRow6BuaCBwaOG6p24gbcO0IGjDrG5oOiAgIA0KDQoqIFJhbmRvbSBjb21wb25lbnQ6ICAgDQokWSBcc2ltIFx0ZXh0e0Jlcm5vdWxsaX0ocCkkICAgDQoNCiogU3lzdGVtYXRpYyBjb21wb25lbnQ6ICAgDQokXGV0YSA9IFxiZXRhXzAgKyBcYmV0YV8xIFx0aW1lcyBcdGV4dHtzb3V0aH0kICAgDQoNCiogTGluayBmdW5jdGlvbjogICANCiRnKHApID0gXGxvZygtXGxvZygxLXApKSQgICAgICAgICANCg0K8J+TjCBQaMawxqFuZyB0csOsbmggbcO0IGjDrG5oOiAgIA0KDQokJA0KXGxvZyBcbGVmdCggLVxsb2coMS1wX2kpIFxyaWdodCkgPSBcYmV0YV8wICsgXGJldGFfMSBcdGltZXMgXHRleHR7c291dGh9X2kNCiQkICAgICANCg0KKiAqxq/hu5tjIGzGsOG7o25nIG3DtCBow6xuaDoqICAgDQoNCmBgYHtyLGVjaG89VFJVRX0NCg0KY2xvZ2xvZ19tb2RlbDIzIDwtIGdsbSh1bmlvbl9iaW4gfiBzb3V0aCwgZGF0YSA9IGQxLCBmYW1pbHkgPSBiaW5vbWlhbChsaW5rID0gImNsb2dsb2ciKSkNCnN1bW1hcnkoY2xvZ2xvZ19tb2RlbDIzKQ0KDQpgYGANCg0KJCQNClxsb2cgXGxlZnQoIC1cbG9nKDEtcF9pKSBccmlnaHQpID0g4oiSMC42MjYzMSArIOKIkjAuNjU5NDUgXHRpbWVzIFx0ZXh0e3NvdXRofV9pDQokJA0KKipOaOG6rW4geMOpdDoqKiAgIA0KDQoqIFbhu5tpIG5nxrDhu51pIGtow7RuZyBz4buRbmcg4bufIG1p4buBbiBOYW0gLCBnacOhIHRy4buLIGvhu7MgduG7jW5nIGPhu6dhIGJp4bq/biDhuqluIHRoZW8gbcO0IGjDrG5oIGNsb2dsb2cgbMOgIOKIkg0KMC42MjYzMQ0K4oiSMC42MjYzMS4gRG8gxJHDsywgeMOhYyBzdeG6pXQgdGhhbSBnaWEgY8O0bmcgxJFvw6BuIMSRxrDhu6NjIHTDrW5oIGLhurFuZzogDQokJCBcdGV4dHtQcn0oXHRleHR7dW5pb259ID0gMSBcIHwgXCBcdGV4dHtzb3V0aH0gPSBcdGV4dHsibm8ifSkgPSAxIC0gXGV4cCgtXGV4cCjiiJINCjAuNjI2MzENCuKIkjAuNjI2MzEpKSBcYXBwcm94IDAuMzU2ICQkLCB04bupYyBraG/huqNuZyAzNS42JSBraOG6oyBuxINuZyB0aGFtIGdpYSBjw7RuZyDEkW/DoG4gbuG6v3UgbmfGsOG7nWkgbGFvIMSR4buZbmcga2jDtG5nIHPhu5FuZyDhu58gbWnhu4FuIE5hbS4gICANCg0KKiAkXGJldGE94oiSMC42NTk0NSQ6IGJp4buDdSB0aOG7iyBz4buxIHRoYXkgxJHhu5VpIHRyb25nIGdpw6EgdHLhu4sgbmfGsOG7oW5nIGtoaSBuZ8aw4budaSBsYW8gxJHhu5luZyBz4buRbmcg4bufIG1p4buBbiBOYW0gc28gduG7m2kgbmfGsOG7nWkga2jDtG5nIHPhu5FuZyDhu58gbWnhu4FuIE5hbS4gR2nDoSB0cuG7iyDDom0gY+G7p2EgaOG7hyBz4buRIG7DoHkgY2hvIHRo4bqleSBuZ8aw4budaSBz4buRbmcg4bufIG1p4buBbiBOYW0gY8OzIHh1IGjGsOG7m25nIGPDsyB4w6FjIHN14bqldCB0aGFtIGdpYSBjw7RuZyDEkW/DoG4gdGjhuqVwIGjGoW4sIHbDrCBnacOhIHRy4buLIGjDoG0gbGnDqm4ga+G6v3QgZ2nhuqNtLCBk4bqrbiDEkeG6v24geMOhYyBzdeG6pXQgdGhhbSBnaWEgZ2nhuqNtLiAgIA0KDQoqICpE4buxIGLDoW86KiAgIA0KDQpgYGB7cixlY2hvPVRSVUV9DQpuZXdfd29ya2VyMjMgPC0gZGF0YS5mcmFtZShzb3V0aCA9ICJubyIpDQpwcmVkaWN0KGNsb2dsb2dfbW9kZWwyMywgbmV3ZGF0YSA9IG5ld193b3JrZXIyMywgdHlwZSA9ICJyZXNwb25zZSIpDQpgYGANCk7hur91IG5nxrDhu51pIGxhbyDEkeG7mW5nIGtow7RuZyBjxrAgdHLDuiB04bqhaSBtaeG7gW4gTmFtIHRow6wga2jhuqMgbsSDbmcgdGhhbSBnaWEgY8O0bmcgxJFvw6BuIGzDoCA0MS40JS4gICANCg0KIyMjIyBCaeG6v24gYG1hcnJpZWRgDQrwn5OMIFRow6BuaCBwaOG6p24gbcO0IGjDrG5oOiAgIA0KDQoqIFJhbmRvbSBjb21wb25lbnQ6ICAgDQokWSBcc2ltIFx0ZXh0e0Jlcm5vdWxsaX0ocCkkICAgDQoNCiogU3lzdGVtYXRpYyBjb21wb25lbnQ6ICAgDQokXGV0YSA9IFxiZXRhXzAgKyBcYmV0YV8xIFx0aW1lcyBcdGV4dHttYXJyaWVkfSQgICANCg0KKiBMaW5rIGZ1bmN0aW9uOiAgIA0KJGcocCkgPSBcbG9nKC1cbG9nKDEtcCkpJCAgICAgICAgIA0KDQrwn5OMIFBoxrDGoW5nIHRyw6xuaCBtw7QgaMOsbmg6ICAgDQoNCiQkDQpcbG9nIFxsZWZ0KCAtXGxvZygxLXBfaSkgXHJpZ2h0KSA9IFxiZXRhXzAgKyBcYmV0YV8xIFx0aW1lcyBcdGV4dHttYXJyaWVkfV9pDQokJCAgDQoNCg0KKiAqxq/hu5tjIGzGsOG7o25nIG3DtCBow6xuaDoqICAgDQoNCmBgYHtyLGVjaG89VFJVRX0NCg0KY2xvZ2xvZ19tb2RlbDI0IDwtIGdsbSh1bmlvbl9iaW4gfiBtYXJyaWVkLCBkYXRhID0gZDEsIGZhbWlseSA9IGJpbm9taWFsKGxpbmsgPSAiY2xvZ2xvZyIpKQ0Kc3VtbWFyeShjbG9nbG9nX21vZGVsMjQpDQoNCmBgYA0KDQokJA0KXGxvZyBcbGVmdCggLVxsb2coMS1wX2kpIFxyaWdodCkgPSDiiJIxLjI1MzQxICsgMC41NDk4OSBcdGltZXMgXHRleHR7bWFycmllZH1faQ0KJCQNCioqTmjhuq1uIHjDqXQ6KiogICANCg0KKiBW4bubaSBuZ8aw4budaSBjaMawYSBr4bq/dCBow7RuLCBnacOhIHRy4buLIGvhu7MgduG7jW5nIGPhu6dhIGJp4bq/biDhuqluIHRoZW8gbcO0IGjDrG5oIGNsb2dsb2cgbMOgIOKIkjEuMjUzNDEuIERvIMSRw7MsIHjDoWMgc3XhuqV0IHRoYW0gZ2lhIGPDtG5nIMSRb8OgbiDEkcaw4bujYyB0w61uaCBi4bqxbmc6IA0KJCQgXHRleHR7UHJ9KFx0ZXh0e3VuaW9ufSA9IDEgXCB8IFwgXHRleHR7bWFycmllZGx9ID0gXHRleHR7Im5vIn0pID0gMSAtIFxleHAoLVxleHAo4oiSMS4yNTM0MSkpIFxhcHByb3ggMC4yMTMgJCQsIHThu6ljIGtob+G6o25nIDIxLjMlIGto4bqjIG7Eg25nIHRoYW0gZ2lhIGPDtG5nIMSRb8OgbiBu4bq/dSBuZ8aw4budaSBsYW8gxJHhu5luZyBjaMawYSBr4bq/dCBow7RuLiAgIA0KDQoqICRcYmV0YT0wLjU0OTg5JDogYmnhu4N1IHRo4buLIG3hu6ljIHRoYXkgxJHhu5VpIHRyb25nIGdpw6EgdHLhu4sgbmfGsOG7oW5nIHRoYW0gZ2lhIGPDtG5nIMSRb8OgbiBraGkgbmfGsOG7nWkgbGFvIMSR4buZbmcgxJHDoyBr4bq/dCBow7RuIHNvIHbhu5tpIG5nxrDhu51pIGNoxrBhIGvhur90IGjDtG4uIEjhu4cgc+G7kSBkxrDGoW5nIG7DoHkgY2hvIHRo4bqleSBuZ8aw4budaSDEkcOjIGvhur90IGjDtG4gY8OzIHh1IGjGsOG7m25nIGPDsyB4w6FjIHN14bqldCB0aGFtIGdpYSBjw7RuZyDEkW/DoG4gY2FvIGjGoW4sIG5o4budIGdpw6EgdHLhu4sgaMOgbSBsacOqbiBr4bq/dCB0xINuZyBsw6puIGzDoG0geMOhYyBzdeG6pXQgdGnhur9uIGfhuqduIMSR4bq/biAxIGjGoW4uICAgDQoNCiogKkThu7EgYsOhbzoqICAgDQoNCmBgYHtyLGVjaG89VFJVRX0NCm5ld193b3JrZXIyNCA8LSBkYXRhLmZyYW1lKG1hcnJpZWQgPSAibm8iKQ0KcHJlZGljdChjbG9nbG9nX21vZGVsMjQsIG5ld2RhdGEgPSBuZXdfd29ya2VyMjQsIHR5cGUgPSAicmVzcG9uc2UiKQ0KYGBgDQpO4bq/dSBuZ8aw4budaSBsYW8gxJHhu5luZyBjaMawYSBr4bq/dCBow7RuIHRow6wga2jhuqMgbsSDbmcgdGhhbSBnaWEgY8O0bmcgxJFvw6BuIGzDoCAyNC44JS4gICANCg0KIyMjIyBCaeG6v24gYHNleGANCvCfk4wgVGjDoG5oIHBo4bqnbiBtw7QgaMOsbmg6ICAgDQoNCiogUmFuZG9tIGNvbXBvbmVudDogICANCiRZIFxzaW0gXHRleHR7QmVybm91bGxpfShwKSQgICANCg0KKiBTeXN0ZW1hdGljIGNvbXBvbmVudDogICANCiRcZXRhID0gXGJldGFfMCArIFxiZXRhXzEgXHRpbWVzIFx0ZXh0e3NleH0kICAgDQoNCiogTGluayBmdW5jdGlvbjogICANCiRnKHApID0gXGxvZygtXGxvZygxLXApKSQgICAgICAgICANCg0K8J+TjCBQaMawxqFuZyB0csOsbmggbcO0IGjDrG5oOiAgIA0KDQokJA0KXGxvZyBcbGVmdCggLVxsb2coMS1wX2kpIFxyaWdodCkgPSBcYmV0YV8wICsgXGJldGFfMSBcdGltZXMgXHRleHR7c2V4fV9pDQokJCAgICAgDQoNCiogKsav4bubYyBsxrDhu6NuZyBtw7QgaMOsbmg6KiAgIA0KDQpgYGB7cixlY2hvPVRSVUV9DQoNCmNsb2dsb2dfbW9kZWwyNSA8LSBnbG0odW5pb25fYmluIH4gc2V4LCBkYXRhID0gZDEsIGZhbWlseSA9IGJpbm9taWFsKGxpbmsgPSAiY2xvZ2xvZyIpKQ0Kc3VtbWFyeShjbG9nbG9nX21vZGVsMjUpDQoNCmBgYA0KDQokJA0KXGxvZyBcbGVmdCggLVxsb2coMS1wX2kpIFxyaWdodCkgPSDiiJIxLjQzOTMgKyAwLjcxMjYgXHRpbWVzIFx0ZXh0e3NleH1faQ0KJCQNCioqTmjhuq1uIHjDqXQ6KiogICANCg0KKiBW4bubaSBu4buvIGdp4bubaSwgZ2nDoSB0cuG7iyBr4buzIHbhu41uZyBj4bunYSBiaeG6v24g4bqpbiB0aGVvIG3DtCBow6xuaCBjbG9nbG9nIGzDoCDiiJIxLjQzOTMuIERvIMSRw7MsIHjDoWMgc3XhuqV0IHRoYW0gZ2lhIGPDtG5nIMSRb8OgbiDEkcaw4bujYyB0w61uaCBi4bqxbmc6IA0KJCQgXHRleHR7UHJ9KFx0ZXh0e3VuaW9ufSA9IDEgXCB8IFwgXHRleHR7c2V4fSA9IFx0ZXh0eyJmZW1hbGUifSkgPSAxIC0gXGV4cCgtXGV4cCjiiJIxLjQzOTMpKSBcYXBwcm94IDAuMTggJCQsIHThu6ljIGtob+G6o25nIDE4JSBraOG6oyBuxINuZyB0aGFtIGdpYSBjw7RuZyDEkW/DoG4gbuG6v3UgbmfGsOG7nWkgbGFvIMSR4buZbmcgbMOgIG7hu68uICAgDQoNCiogJFxiZXRhPTAuNzEyNiQ6IGJp4buDdSB0aOG7iyBz4buxIHRoYXkgxJHhu5VpIGdpw6EgdHLhu4sgbmfGsOG7oW5nIGtoaSBuZ8aw4budaSBsYW8gxJHhu5luZyBsw6AgbmFtIGdp4bubaSBzbyB24bubaSBu4buvIGdp4bubaS4gSOG7hyBz4buRIGTGsMahbmcgbsOgeSBjaG8gdGjhuqV5IG5hbSBnaeG7m2kgY8OzIHh1IGjGsOG7m25nIGPDsyB4w6FjIHN14bqldCB0aGFtIGdpYSBjw7RuZyDEkW/DoG4gY2FvIGjGoW4gxJHDoW5nIGvhu4Mgc28gduG7m2kgbuG7ryBnaeG7m2ksIGRvIGdpw6EgdHLhu4sgaMOgbSBsacOqbiBr4bq/dCB0xINuZyBsw6puIGvDqW8geMOhYyBzdeG6pXQgdGnhur9uIGfhuqduIMSR4bq/biAxIGjGoW4uLiAgIA0KDQoqICpE4buxIGLDoW86KiAgIA0KDQpgYGB7cixlY2hvPVRSVUV9DQpuZXdfd29ya2VyMjUgPC0gZGF0YS5mcmFtZShzZXggPSAiZmVtYWxlIikNCnByZWRpY3QoY2xvZ2xvZ19tb2RlbDI1LCBuZXdkYXRhID0gbmV3X3dvcmtlcjI1LCB0eXBlID0gInJlc3BvbnNlIikNCmBgYA0KTuG6v3UgbmfGsOG7nWkgbGFvIMSR4buZbmcgbMOgIG7hu68gZ2nhu5tpIHRow6wga2jhuqMgbsSDbmcgdGhhbSBnaWEgY8O0bmcgxJFvw6BuIGzDoCAyMS4xJS4gICANCg0KDQojIyMjIEJp4bq/biBgYmxhY2tgDQoNCvCfk4wgVGjDoG5oIHBo4bqnbiBtw7QgaMOsbmg6ICAgDQoNCiogUmFuZG9tIGNvbXBvbmVudDogICANCiRZIFxzaW0gXHRleHR7QmVybm91bGxpfShwKSQgICANCg0KKiBTeXN0ZW1hdGljIGNvbXBvbmVudDogICANCiRcZXRhID0gXGJldGFfMCArIFxiZXRhXzEgXHRpbWVzIFx0ZXh0e2JsYWNrfSQgICANCg0KKiBMaW5rIGZ1bmN0aW9uOiAgIA0KJGcocCkgPSBcbG9nKC1cbG9nKDEtcCkpJCAgICAgICAgIA0KDQrwn5OMIFBoxrDGoW5nIHRyw6xuaCBtw7QgaMOsbmg6ICAgDQoNCiQkDQpcbG9nIFxsZWZ0KCAtXGxvZygxLXBfaSkgXHJpZ2h0KSA9IFxiZXRhXzAgKyBcYmV0YV8xIFx0aW1lcyBcdGV4dHtibGFja31faQ0KJCQgICAgIA0KDQoqICrGr+G7m2MgbMaw4bujbmcgbcO0IGjDrG5oOiogICANCg0KYGBge3IsZWNobz1UUlVFfQ0KDQpjbG9nbG9nX21vZGVsMjYgPC0gZ2xtKHVuaW9uX2JpbiB+IGJsYWNrLCBkYXRhID0gZDEsIGZhbWlseSA9IGJpbm9taWFsKGxpbmsgPSAiY2xvZ2xvZyIpKQ0Kc3VtbWFyeShjbG9nbG9nX21vZGVsMjYpDQoNCmBgYA0KDQokJA0KXGxvZyBcbGVmdCggLVxsb2coMS1wX2kpIFxyaWdodCkgPSDiiJIwLjgxNTAwICsgMC4yODU4NyBcdGltZXMgXHRleHR7YmxhY2t9X2kNCiQkDQoNCioqTmjhuq1uIHjDqXQ6KiogICANCg0KKiBW4bubaSBuZ8aw4budaSBraMO0bmcgcGjhuqNpIGzDoCBuZ8aw4budaSBkYSDEkWVuLCBnacOhIHRy4buLIGvhu7MgduG7jW5nIGPhu6dhIGJp4bq/biDhuqluIHRoZW8gbcO0IGjDrG5oIGNsb2dsb2cgbMOgIOKIkjAuODE1MDAuIERvIMSRw7MsIHjDoWMgc3XhuqV0IHRoYW0gZ2lhIGPDtG5nIMSRb8OgbiDEkcaw4bujYyB0w61uaCBi4bqxbmc6IA0KJCQgXHRleHR7UHJ9KFx0ZXh0e3VuaW9ufSA9IDEgXCB8IFwgXHRleHR7YmxhY2t9ID0gXHRleHR7Im5vIn0pID0gMSAtIFxleHAoLVxleHAo4oiSMC44MTUwMCkpIFxhcHByb3ggMC4zMDYgJCQsIHThu6ljIGtob+G6o25nIDMwLjYlIGto4bqjIG7Eg25nIHRoYW0gZ2lhIGPDtG5nIMSRb8OgbiBu4bq/dSBuZ8aw4budaSBsYW8gxJHhu5luZyBraMO0bmcgcGjhuqNpIGzDoCBuZ8aw4budaSBkYSDEkWVuLiAgIA0KDQoqICRcYmV0YT0wLjI4NTg3JDogYmnhu4N1IHRo4buLIHPhu7EgdGhheSDEkeG7lWkgZ2nDoSB0cuG7iyBuZ8aw4buhbmcga2hpIG5nxrDhu51pIGxhbyDEkeG7mW5nIGzDoCBuZ8aw4budaSBkYSDEkWVuIHNvIHbhu5tpIGtow7RuZyBwaOG6o2kuIEjhu4cgc+G7kSBkxrDGoW5nIG7DoHkgY2hvIHRo4bqleSBuZ8aw4budaSBsYW8gxJHhu5luZyBsw6AgbmfGsOG7nWkgZGEgxJFlbiBjw7MgeHUgaMaw4bubbmcgY8OzIHjDoWMgc3XhuqV0IHRoYW0gZ2lhIGPDtG5nIMSRb8OgbiBjYW8gaMahbiwgZG8gZ2nDoSB0cuG7iyBow6BtIGxpw6puIGvhur90IHTEg25nIGzDqm4ga8OpbyB4w6FjIHN14bqldCB0aeG6v24gZ+G6p24gxJHhur9uIDEgaMahbi4gICANCg0KKiAqROG7sSBiw6FvOiogICANCg0KYGBge3IsZWNobz1UUlVFfQ0KbmV3X3dvcmtlcjI2IDwtIGRhdGEuZnJhbWUoYmxhY2sgPSAibm8iKQ0KcHJlZGljdChjbG9nbG9nX21vZGVsMjYsIG5ld2RhdGEgPSBuZXdfd29ya2VyMjYsIHR5cGUgPSAicmVzcG9uc2UiKQ0KYGBgDQpO4bq/dSBuZ8aw4budaSBsYW8gxJHhu5luZyBraMO0bmcgcGjhuqNpIGzDoCBuZ8aw4budaSBkYSDEkWVuIHRow6wga2jhuqMgbsSDbmcgdGhhbSBnaWEgY8O0bmcgxJFvw6BuIGzDoCAzNS43JS4gICANCg0KIyMjIE3DtCBow6xuaCBo4buTaSBxdXkgYuG7mWkNCg0KIyMjIyBNw7QgaMOsbmggTG9naXQNCmBgYHtyLGVjaG89VFJVRX0NCmxvZ2l0X21vZGVsMzEgPC0gZ2xtKHVuaW9uX2JpbiB+IGJsdWVjb2wgKyBpbmQgKyBzb3V0aCArIG1hcnJpZWQgKyBzZXggKyBibGFjaywgZGF0YSA9IGQxLCBmYW1pbHkgPSBiaW5vbWlhbChsaW5rID0gImxvZ2l0IikpDQpzdW1tYXJ5KGxvZ2l0X21vZGVsMzEpDQpgYGANCg0KKlBoxrDGoW5nIHRyw6xuaCBo4buTaSBxdXk6KiAgIA0KJCQgXGxvZ1xsZWZ0KFxmcmFje1AoXHRleHR7dW5pb259PTEpfXsxLVAoXHRleHR7dW5pb259PTEpfVxyaWdodCkgPSAtMi4xMzYgKyAxLjczNCBcY2RvdCBcdGV4dHtibHVlY29seWVzfSArIDAuMTkxIFxjZG90IFx0ZXh0e2luZGluZHVzdHJpYWx9IC0gMS4wNDYgXGNkb3QgXHRleHR7c291dGh5ZXN9ICsgMC40NzAgXGNkb3QgXHRleHR7bWFycmllZHllc30gKyAwLjM3NiBcY2RvdCBcdGV4dHtzZXhtYWxlfSArIDAuNjY3IFxjZG90IFx0ZXh0e2JsYWNreWVzfSAkJCAgIA0KKipJbnRlcmNlcHQgKC0yLjEzNik6KiogxJDDonkgbMOgIGxvZ2l0IGPhu6dhIHjDoWMgc3XhuqV0IHRoYW0gZ2lhIGPDtG5nIMSRb8OgbiBraGkgdOG6pXQgY+G6oyBjw6FjIGJp4bq/biDEkeG7mWMgbOG6rXAgYuG6sW5nIDAgKG5nxrDhu51pIGtow7RuZyBsYW8gxJHhu5luZyBjaMOibiB0YXksIGtow7RuZyBsw6BtIG5nw6BuaCBjw7RuZyBuZ2hp4buHcCwga2jDtG5nIHPhu5FuZyDhu58gbWnhu4FuIE5hbSwgY2jGsGEga+G6v3QgaMO0biwgbMOgIG7hu68sIHbDoCBraMO0bmcgcGjhuqNpIG5nxrDhu51pIGRhIMSRZW4pLiAgIA0KDQoqKmJsdWVjb2x5ZXMgPSAxLjczNCAocCA8IDAuMDAxKToqKiBOZ8aw4budaSBsYW8gxJHhu5luZyBjaMOibiB0YXkgKGJsdWUtY29sbGFyKSBjw7MgbG9nIG9kZHMgdGhhbSBnaWEgY8O0bmcgxJFvw6BuIGNhbyBoxqFuIG5nxrDhu51pIGtow7RuZyBjaMOibiB0YXkgbMOgIDEuNzM0IMSRxqFuIHbhu4suIE9kZHMgcmF0aW8gPSAkZV57MS43MzR9IFxhcHByb3ggNS42NiQsIHThu6ljIGzDoCBjYW8gaMahbiBraG/huqNuZyA1LjY2IGzhuqduLiAgIA0KDQoqKmluZHVzdHJpYWwgPSAwLjE5MSAocCAkXGFwcHJveCQgMC4wMDk5KToqKiBOZ8aw4budaSBsw6BtIHRyb25nIG5nw6BuaCBjw7RuZyBuZ2hp4buHcCBjw7Mgb2RkcyB0aGFtIGdpYSBjw7RuZyDEkW/DoG4gY2FvIGjGoW4ga2hv4bqjbmcgJGVeezAuMTkxfSBcYXBwcm94IDEuMjEkIGzhuqduLiAgIA0KDQoqKnNvdXRoeWVzID0gLTEuMDQ2IChwIDwgMC4wMDEpOioqIE5nxrDhu51pIHPhu5FuZyDhu58gbWnhu4FuIE5hbSBjw7Mgb2RkcyB0aGFtIGdpYSBjw7RuZyDEkW/DoG4gdGjhuqVwIGjGoW4gbmfGsOG7nWkga2jDtG5nIHPhu5FuZyDhu58gbWnhu4FuIE5hbSwgduG7m2kgb2RkcyBnaeG6o20ga2hv4bqjbmcgJGVeey0xLjA0Nn0gXGFwcHJveCAwLjM1JCBs4bqnbiwgdOG7qWMgZ2nhuqNtIDY1JS4gICANCg0KKiptYXJyaWVkeWVzID0gMC40NzAgKHAgJFxhcHByb3gkIDAuMDAwNzcpOioqIE5nxrDhu51pIMSRw6Mga+G6v3QgaMO0biBjw7Mgb2RkcyB0aGFtIGdpYSBjw7RuZyDEkW/DoG4gY2FvIGjGoW4gbmfGsOG7nWkgY2jGsGEga+G6v3QgaMO0biwgduG7m2kgb2RkcyBjYW8gaMahbiBraG/huqNuZyAkZV57MC40NzB9IFxhcHByb3ggMS42MCQgbOG6p24uICAgDQoNCioqc2V4bWFsZSA9IDAuMzc2IChwICRcYXBwcm94JCAwLjA0KToqKiBOYW0gZ2nhu5tpIGPDsyBvZGRzIHRoYW0gZ2lhIGPDtG5nIMSRb8OgbiBjYW8gaMahbiBu4buvIGdp4bubaSBraG/huqNuZyAkZV57MC4zNzZ9IFxhcHByb3ggMS40NiQgbOG6p24uICAgDQoNCioqYmxhY2t5ZXMgPSAwLjY2NyAocCA8IDAuMDAxKToqKiBOZ8aw4budaSBkYSDEkWVuIGPDsyBvZGRzIHRoYW0gZ2lhIGPDtG5nIMSRb8OgbiBjYW8gaMahbiBuZ8aw4budaSBraMO0bmcgcGjhuqNpIGRhIMSRZW4ga2hv4bqjbmcgJGVeezAuNjY3fSBcYXBwcm94IDEuOTUkIGzhuqduLiAgIA0KDQojIyMjIE3DtCBow6xuaCBQcm9iaXQNCmBgYHtyLGVjaG89VFJVRX0NCnByb2JpdF9tb2RlbDMyIDwtIGdsbSh1bmlvbl9iaW4gfiBibHVlY29sICsgaW5kICsgc291dGggKyBtYXJyaWVkICsgc2V4ICsgYmxhY2ssIGRhdGEgPSBkMSwgZmFtaWx5ID0gYmlub21pYWwobGluayA9ICJwcm9iaXQiKSkNCnN1bW1hcnkocHJvYml0X21vZGVsMzIpDQoNCmBgYA0KDQokJCBcUGhpXnstMX0oUChcdGV4dHt1bmlvblxfYmlufT0xKSkgPSAtMS4yMzA0NiArIDEuMDQwMzggXGNkb3QgXHRleHR7Ymx1ZWNvbHllc30gKyAwLjEwMDU4IFxjZG90IFx0ZXh0e2luZGluZHVzdHJpYWx9IC0gMC42MzM0MCBcY2RvdCBcdGV4dHtzb3V0aHllc30gKyAwLjI3NDYxIFxjZG90IFx0ZXh0e21hcnJpZWR5ZXN9ICsgMC4xOTAwOCBcY2RvdCBcdGV4dHtzZXhtYWxlfSArIDAuNDE0MzQgXGNkb3QgXHRleHR7YmxhY2t5ZXN9ICQkICAgDQoNCioqYmx1ZWNvbHllcyA9IDEuMDQwNDoqKiBMYW8gxJHhu5luZyBjaMOibiB0YXkgY8OzIGto4bqjIG7Eg25nIHRoYW0gZ2lhIGPDtG5nIMSRb8OgbiBjYW8gaMahbiDEkcOhbmcga+G7gyBzbyB24bubaSBsYW8gxJHhu5luZyBraMO0bmcgY2jDom4gdGF5LiAgIA0KKippbmRpbmR1c3RyaWFsID0gMC4xMDA2OioqIEzDoG0gdmnhu4djIHRyb25nIG5nw6BuaCBjw7RuZyBuZ2hp4buHcCBsw6BtIHTEg25nIG5o4bq5IGto4bqjIG7Eg25nIHRoYW0gZ2lhIGPDtG5nIMSRb8OgbiBzbyB24bubaSBuZ2/DoGkgbmfDoG5oLiAgIA0KKipzb3V0aHllcyA9IC0wLjYzMzQ6KiogTmfGsOG7nWkgc+G7kW5nIOG7nyBtaeG7gW4gTmFtIGPDsyBraOG6oyBuxINuZyB0aGFtIGdpYSBjw7RuZyDEkW/DoG4gdGjhuqVwIGjGoW4gxJHDoW5nIGvhu4Mgc28gduG7m2kgbmfGsOG7nWkga2jDtG5nIHPhu5FuZyDhu58gbWnhu4FuIE5hbS4gICANCioqbWFycmllZHllcyA9IDAuMjc0NjoqKiBOZ8aw4budaSDEkcOjIGvhur90IGjDtG4gY8OzIGto4bqjIG7Eg25nIHRoYW0gZ2lhIGPDtG5nIMSRb8OgbiBjYW8gaMahbiBuZ8aw4budaSBjaMawYSBr4bq/dCBow7RuLiAgIA0KKipzZXhtYWxlID0gMC4xOTAxOioqIE5hbSBnaeG7m2kgY8OzIGto4bqjIG7Eg25nIHRoYW0gZ2lhIGPDtG5nIMSRb8OgbiBjYW8gaMahbiBu4buvLCBuaMawbmcgbeG7qWMg4bqjbmggaMaw4bufbmcga2jDtG5nIG3huqFuaC4gICANCioqYmxhY2t5ZXMgPSAwLjQxNDM6KiogTmfGsOG7nWkgZGEgxJFlbiBjw7Mga2jhuqMgbsSDbmcgdGhhbSBnaWEgY8O0bmcgxJFvw6BuIGNhbyBoxqFuIG5nxrDhu51pIGtow7RuZyBkYSDEkWVuLiAgIA0KDQojIyMjIE3DtCBow6xuaCBDbG9nbG9nDQpgYGB7cixlY2hvPVRSVUV9DQpjbG9nbG9nX21vZGVsMzMgPC0gZ2xtKHVuaW9uX2JpbiB+IGJsdWVjb2wgKyBpbmQgKyBzb3V0aCArIG1hcnJpZWQgKyBzZXggKyBibGFjaywgZGF0YSA9IGQxLCBmYW1pbHkgPSBiaW5vbWlhbChsaW5rID0gImNsb2dsb2ciKSkNCnN1bW1hcnkoY2xvZ2xvZ19tb2RlbDMzKQ0KYGBgDQoNCiQkIFxsb2coLVxsb2coMS1QKFx0ZXh0e3VuaW9uXF9iaW59PTEpKSkgPSAtMi4xODI0ICsgMS4zODA3IFxjZG90IFx0ZXh0e2JsdWVjb2x5ZXN9ICsgMC4xOTM2IFxjZG90IFx0ZXh0e2luZGluZHVzdHJpYWx9IC0gMC44MDYwIFxjZG90IFx0ZXh0e3NvdXRoeWVzfSArIDAuMzUwMCBcY2RvdCBcdGV4dHttYXJyaWVkeWVzfSArIDAuMzczMCBcY2RvdCBcdGV4dHtzZXhtYWxlfSArIDAuNTY2NiBcY2RvdCBcdGV4dHtibGFja3llc30gJCQNCg0KKipibHVlY29seWVzID0gMS4zODA3OioqIE5nxrDhu51pIGxhbyDEkeG7mW5nIGNow6JuIHRheSBjw7MgeMOhYyBzdeG6pXQgdGhhbSBnaWEgY8O0bmcgxJFvw6BuIGNhbyBoxqFuIG5oaeG7gXUgc28gduG7m2kgbGFvIMSR4buZbmcga2jDtG5nIGNow6JuIHRheSAoaGnhu4d1IOG7qW5nIG3huqFuaCB2w6AgcuG6pXQgY8OzIMO9IG5naMSpYSkuICAgDQoqKmluZGluZHVzdHJpYWwgPSAwLjE5MzY6KiogTMOgbSB2aeG7h2MgdHJvbmcgbmfDoG5oIGPDtG5nIG5naGnhu4dwIGzDoG0gdMSDbmcgeMOhYyBzdeG6pXQgdGhhbSBnaWEgY8O0bmcgxJFvw6BuLiAgIA0KKipzb3V0aHllcyA9IC0wLjgwNjA6KiogU+G7kW5nIOG7nyBtaeG7gW4gTmFtIGzDoG0gZ2nhuqNtIMSRw6FuZyBr4buDIHjDoWMgc3XhuqV0IHRoYW0gZ2lhIGPDtG5nIMSRb8Ogbi4gICANCioqbWFycmllZHllcyA9IDAuMzUwMDoqKiBOZ8aw4budaSDEkcOjIGvhur90IGjDtG4gY8OzIHjDoWMgc3XhuqV0IHRoYW0gZ2lhIGPDtG5nIMSRb8OgbiBjYW8gaMahbiBuZ8aw4budaSBjaMawYSBr4bq/dCBow7RuLiAgIA0KKipzZXhtYWxlID0gMC4zNzMwOioqIE5hbSBnaeG7m2kgY8OzIGto4bqjIG7Eg25nIHRoYW0gZ2lhIGPDtG5nIMSRb8OgbiBjYW8gaMahbiBu4buvLiAgIA0KKipibGFja3llcyA9IDAuNTY2NjoqKiBOZ8aw4budaSBkYSDEkWVuIGPDsyB4w6FjIHN14bqldCB0aGFtIGdpYSBjw7RuZyDEkW/DoG4gY2FvIGjGoW4gbmfGsOG7nWkga2jDtG5nIGRhIMSRZW4uICAgDQoNCiMjIyDEkMOhbmggZ2nDoSBtw7QgaMOsbmggaOG7k2kgcXV5IGLhu5lpDQojIyMjIENo4buJIHPhu5EgQUlDDQpgYGB7cixlY2hvPVRSVUV9DQpBSUMobG9naXRfbW9kZWwzMSkNCkFJQyhwcm9iaXRfbW9kZWwzMikNCkFJQyhjbG9nbG9nX21vZGVsMzMpDQpgYGANCg0KKipOaOG6rW4geMOpdDoqKk3DtCBow6xuaCBMb2dpdCB2w6AgUHJvYml0IMSR4buBdSBraMO0bmcgcGjDuSBo4bujcCBi4bqxbmcgbcO0IGjDrG5oIENsb2dsb2cgdHJvbmcgdmnhu4djIGdp4bqjaSB0aMOtY2ggc+G7sSB0w6FjIMSR4buZbmcgY+G7p2EgY8OhYyDEkeG6t2MgxJFp4buDbSBuaMOibiBraOG6qXUgaOG7jWMgxJHhur9uIHF1eeG6v3QgxJHhu4tuaCB0aGFtIGdpYSBjw7RuZyDEkW/DoG4gY+G7p2EgbmfGsOG7nWkgbGFvIMSR4buZbmcgdOG6oWkgSG9hIEvhu7MuIFbDrCBtw7QgaMOsbmggQ2xvZ2xvZyBjw7MgQUlDIHRo4bqlcCBuaOG6pXQsIHBow7kgaOG7o3AgbmjhuqV0IHbhu5tpIGThu68gbGnhu4d1LCB04bupYyBsw6AgY8OibiBi4bqxbmcgdOG7kXQgZ2nhu69hIMSR4buZIHBow7kgaOG7o3AgdsOgIMSR4buZIHBo4bupYyB04bqhcCBj4bunYSBtw7QgaMOsbmguICAgDQoNCiMjIyMgSOG7hyBz4buRIEJyaWVyIFNjb3JlDQoNCkJyaWVyIFNjb3JlIGzDoCBt4buZdCBjaOG7iSBz4buRIMSR4buDIMSRw6FuaCBnacOhIMSR4buZIGNow61uaCB4w6FjIGPhu6dhIG3DtCBow6xuaCBk4buxIGLDoW8geMOhYyBzdeG6pXQgbmjhu4sgcGjDom4uIE7DsyDEkW8gdHJ1bmcgYsOsbmggYsOsbmggcGjGsMahbmcgc2FpIHPhu5EgZ2nhu69hIHjDoWMgc3XhuqV0IGThu7EgYsOhbyB2w6AgZ2nDoSB0cuG7iyB0aOG7sWMgdOG6vyAoMCBob+G6t2MgMSkuICAgIA0KDQpDw7RuZyB0aOG7qWMgQnJpZXIgU2NvcmU6ICAgDQoNCiQkIFx0ZXh0e0JyaWVyIFNjb3JlfSA9IFxmcmFjezF9e059IFxzdW1fe2k9MX1eTiAoXGhhdHtwfV9pIC0geV9pKV4yICQkDQoNClRyb25nIMSRw7M6ICAgDQoNCiogJE4kOiBz4buRIGzGsOG7o25nIHF1YW4gc8OhdCAgIA0KKiAkXGhhdHtwfV9pJDogeMOhYyBzdeG6pXQgZOG7sSBiw6FvIGNobyBxdWFuIHPDoXQgdGjhu6kgJGkkICAgDQoqICR5X2kkOiBnacOhIHRy4buLIHRo4buxYyB04bq/ICgwIGhv4bq3YyAxKSAgIA0KDQrDnSBuZ2jEqWE6ICAgDQoNCiogR2nDoSB0cuG7iyBCcmllciBTY29yZSBu4bqxbSB0cm9uZyBraG/huqNuZyAkWzAsMV0kICAgDQoqIEdpw6EgdHLhu4sgY8Ogbmcgbmjhu48gY8OgbmcgdOG7kXQgICAgICANCiDihpIgQ2hvIHRo4bqleSBtw7QgaMOsbmggZOG7sSBiw6FvIHjDoWMgc3XhuqV0IGfhuqduIHbhu5tpIGdpw6EgdHLhu4sgdGjhu7FjIHThur8uICAgDQogDQpgYGB7cixlY2hvPVRSVUV9DQpCcmllclNjb3JlKGxvZ2l0X21vZGVsMzEpDQpCcmllclNjb3JlKHByb2JpdF9tb2RlbDMyKQ0KQnJpZXJTY29yZShjbG9nbG9nX21vZGVsMzMpDQpgYGANCg0KKipOaOG6rW4geMOpdDoqKk3DtCBow6xuaCBDbG9nbG9nIGPDsyBjaOG7iSBz4buRIEJyaWVyIFNjb3JlIHRo4bqlcCBuaOG6pXQsIGNobyB0aOG6pXkgbsOzIGThu7EgYsOhbyB4w6FjIHN14bqldCBn4bqnbiBuaOG6pXQgduG7m2kgZOG7ryBsaeG7h3UgdGjhu7FjIHThur8gc28gduG7m2kgaGFpIG3DtCBow6xuaCBjw7JuIGzhuqFpLiANCg0KKipL4bq/dCBsdeG6rW46KiogbcO0IGjDrG5oIENsb2dsb2cgxJHhu4F1IGPDsyBjaOG7iSBz4buRIEFJQyB2w6AgQnJpZXIgU2NvcmUgdGjhuqVwIG5o4bqldCB0cm9uZyAzIG3DtCBow6xuaC4gQ2hvIHRo4bqleSBtw7QgaMOsbmggQ2xvZ2xvZyBjw7MgaGnhu4d1IHN14bqldCBk4buxIGLDoW8gdOG7kXQgbmjhuqV0LiAgIA0KDQojIyMjIEThu7EgYsOhbyBj4bunYSBtw7QgaMOsbmggY2xvZ2xvZw0KYGBge3IsZWNobz1UUlVFfQ0KbmV3X3dvcmtlcjMzIDwtIGRhdGEuZnJhbWUoDQogIGJsdWVjb2wgPSAieWVzIiwNCiAgaW5kID0gImluZHVzdHJpYWwiLA0KICBzb3V0aCA9ICJ5ZXMiLA0KICBtYXJyaWVkID0gInllcyIsDQogIHNleCA9ICJtYWxlIiwNCiAgYmxhY2sgPSAieWVzIikNCm5ld193b3JrZXIzNCA8LSBkYXRhLmZyYW1lKA0KICBibHVlY29sID0gIm5vIiwNCiAgaW5kID0gIm5vbi1pbmR1c3RyaWFsIiwNCiAgc291dGggPSAibm8iLA0KICBtYXJyaWVkID0gIm5vIiwNCiAgc2V4ID0gImZlbWFsZSIsDQogIGJsYWNrID0gIm5vIikNCiMgROG7sSBiw6FvIHjDoWMgc3XhuqV0IHRoYW0gZ2lhIGPDtG5nIMSRb8Ogbg0KcHJlZGljdChjbG9nbG9nX21vZGVsMzMsIG5ld2RhdGEgPSBuZXdfd29ya2VyMzMsIHR5cGUgPSAicmVzcG9uc2UiKQ0KDQpwcmVkaWN0KGNsb2dsb2dfbW9kZWwzMywgbmV3ZGF0YSA9IG5ld193b3JrZXIzNCwgdHlwZSA9ICJyZXNwb25zZSIpDQpgYGANCvCfk4wgKipOaOG6rW4geMOpdDoqKiAgIA0KTcO0IGjDrG5oIGNsb2dsb2cgY2hvIHRo4bqleSB24bubaSBjw6FjIMSR4bq3YyDEkWnhu4NtIG5ow6JuIGto4bqpdSBo4buNYyBuaMawIG5nxrDhu51pIGxhbyDEkeG7mW5nIG5hbSwgxJHDoyBr4bq/dCBow7RuLCB0aHXhu5ljIGxv4bqhaSBsYW8gxJHhu5luZyBjaMOibiB0YXksIGzDoG0gdmnhu4djIHRyb25nIG5nw6BuaCBz4bqjbiB4deG6pXQgdsOgIHNpbmggc+G7kW5nIHThuqFpIG1p4buBbiBOYW0gSG9hIEvhu7MgdGjDrCB4w6FjIHN14bqldCB0aGFtIGdpYSBjw7RuZyDEkW/DoG4gbMOgICRcYXBwcm94IDU4LjZcJSQuICAgDQoNCk3DtCBow6xuaCBjbG9nbG9nIGNobyB0aOG6pXkgduG7m2kgY8OhYyDEkeG6t2MgxJFp4buDbSBuaMOibiBraOG6qXUgaOG7jWMgbmjGsCBuZ8aw4budaSBsYW8gxJHhu5luZyBu4buvLCBjaMawYSBr4bq/dCBow7RuLCBraMO0bmcgdGh14buZYyBsb+G6oWkgbGFvIMSR4buZbmcgY2jDom4gdGF5LCBraMO0bmcgbMOgbSB2aeG7h2MgdHJvbmcgbmfDoG5oIHPhuqNuIHh14bqldCB2w6Aga2jDtG5nIHPhu5FuZyB04bqhaSBtaeG7gW4gTmFtIEhvYSBL4buzIHRow6wgeMOhYyBzdeG6pXQgdGhhbSBnaWEgY8O0bmcgxJFvw6BuIGzDoCAkXGFwcHJveCAxMC42NjVcJSQuICAgDQoNCiMjIEvhur90IGx14bqtbg0KDQpUcm9uZyBuZ2hpw6puIGPhu6l1IG7DoHksIHTDoWMgZ2nhuqMgdGjhu7FjIGhp4buHbiBwaMOibiB0w61jaCB0w6FjIMSR4buZbmcgY+G7p2EgY8OhYyDEkeG6t2MgxJFp4buDbSBuaMOibiBraOG6qXUgaOG7jWMgxJHhur9uIGto4bqjIG7Eg25nIHRoYW0gZ2lhIGPDtG5nIMSRb8OgbiBj4bunYSBuZ8aw4budaSBsYW8gxJHhu5luZyB04bqhaSBIb2EgS+G7sy4gROG7sWEgdHLDqm4gYuG7mSBk4buvIGxp4buHdSBXYWdlcyB24bubaSBiaeG6v24gdW5pb24gbMOgIGJp4bq/biBwaOG7pSB0aHXhu5ljLCB0w6FjIGdp4bqjIHRo4buxYyBoaeG7h24gdGjhu5FuZyBrw6ogbcO0IHThuqMgYmnhur9uIHVuaW9uIHbhu5tpIHThu6tuZyBiaeG6v24gxJHhu5ljIGzhuq1wIG5oxrAgYmx1ZWNvbCwgaW5kLCBzb3V0aCxzbXNhLCBtYXJyaWVkLCBzZXgsIGJsYWNrIMSR4buDIGhp4buDdSByw7UgaMahbiB24buBIG3hu5FpIHF1YW4gaOG7hyBnaeG7r2EgY8OhYyBiaeG6v24uIEPhu6UgdGjhu4MsIGtoaSBraeG7g20gxJHhu4tuaCBt4buRaSBsacOqbiBo4buHIGdp4buvYSBiaeG6v24gcGjhu6UgdGh14buZYyB2w6AgY8OhYyBiaeG6v24gxJHhu5ljIGzhuq1wIHRow6wgaOG6p3UgaOG6v3QgY8OhYyBj4bq3cCBiaeG6v24gxJHhu4F1IGPDsyBt4buRaSBsacOqbiBo4buHIGPDsyDDvSBuZ2jEqWEgdGjhu5FuZyBrw6osIGNo4buJIHJpw6puZyBiaeG6v24gxJHhu4tuaCB0w61uaCBzbXNhIGzDoCBraMO0bmcgY8OzIG3hu5FpIGxpw6puIGjhu4cgY8OzIMO9IG5naMSpYSB0aOG7kW5nIGvDqiB24bubaSBiaeG6v24gdW5pb24uICAgIA0KDQpLaGkgdGjhu7FjIGhp4buHbiBwaMOibiB0w61jaCB04bu3IGzhu4cgbmd1eSBjxqEgdMawxqFuZyDEkeG7kWkgdsOgIHThu7cgbOG7hyBjaMOqbmggbMOqY2gsIGvhur90IHF14bqjIG5o4bqtbiDEkcaw4bujYyDEkeG7gXUgY2hvIHRo4bqleSBjw6FjIMSR4bq3YyDEkWnhu4NtIG5ow6JuIGto4bqpdSBo4buNYyBjw7Mg4bqjbmggaMaw4bufbmcgcsO1IHLhu4d0IMSR4bq/biBxdXnhur90IMSR4buLbmggdGhhbSBnaWEgY8O0bmcgxJFvw6BuIGPhu6dhIG5nxrDhu51pIGxhbyDEkeG7mW5nIHThuqFpIEhvYSBL4buzLiBDaGkgdGnhur90IGjGoW4sIG5nxrDhu51pIGxhbyDEkeG7mW5nIHRodeG7mWMgbmjDs20gbGFvIMSR4buZbmcgY2jDom4gdGF5IGPDsyBraOG6oyBuxINuZyB0aGFtIGdpYSBjw7RuZyDEkW/DoG4gY2FvIGjGoW4gdOG7qyAxLjggbOG6p24gxJHhur9uIDMgbOG6p24gc28gduG7m2kgbmjDs20gY8OybiBs4bqhaSwgxJHhu5NuZyB0aOG7nWkgY8OzIG9kZHMgY2FvIGfhuqVwIDUsNDcgbOG6p24uIE5nxrDhu51pIGzDoG0gdHJvbmcgbmfDoG5oIHPhuqNuIHh14bqldCwgbmfGsOG7nWkgxJHDoyBr4bq/dCBow7RuLCBuYW0gZ2nhu5tpIHbDoCBuZ8aw4budaSBkYSDEkWVuIMSR4buBdSBjw7MgeMOhYyBzdeG6pXQgdsOgIG9kZHMgdGhhbSBnaWEgY8O0bmcgxJFvw6BuIGNhbyBoxqFuIHNvIHbhu5tpIG5ow7NtIMSR4buRaSBjaGnhur91LiBOZ8aw4bujYyBs4bqhaSwgbmfGsOG7nWkgc+G7kW5nIHThuqFpIG1p4buBbiBOYW0gSG9hIEvhu7MgY8OzIGto4bqjIG7Eg25nIHRoYW0gZ2lhIGPDtG5nIMSRb8OgbiB0aOG6pXAgaMahbiwgY2jhu4kgc+G7kSByZWxhdGl2ZSByaXNrIGNo4buJIGtob+G6o25nIDAuNTguIE5oxrBuZyBr4bq/dCBxdeG6oyBuw6B5IGNobyB0aOG6pXkgxJHhurdjIMSRaeG7g20gbmjDom4ga2jhuql1IGjhu41jIGzDoCB54bq/dSB04buRIGNoaSBwaOG7kWkgaMOgbmggdmkgdGhhbSBnaWEgY8O0bmcgxJFvw6BuLiAgIA0KDQpUw6FjIGdp4bqjIHRp4bq/cCB04bulYyB0aOG7sWMgaGnhu4duIHBow6JuIHTDrWNoIGjhu5NpIHF1eSDEkcahbiBiaeG6v24gY2hvIHRo4bqleSB04burbmcgeeG6v3UgdOG7kSBuaMOibiBraOG6qXUgaOG7jWMgbmjGsCBuZ2jhu4EgbmdoaeG7h3AsIG5nw6BuaCBuZ2jhu4EsIGtodSB24buxYyBjxrAgdHLDuiwgdMOsbmggdHLhuqFuZyBow7RuIG5ow6JuLCBnaeG7m2kgdMOtbmggdsOgIGNo4bunbmcgdOG7mWMgxJHhu4F1IGPDsyDhuqNuaCBoxrDhu59uZyByacOqbmcgdsOgIGPDsyDDvSBuZ2jEqWEgdGjhu5FuZyBrw6ogxJHhur9uIHjDoWMgc3XhuqV0IHRoYW0gZ2lhIGPDtG5nIMSRb8Ogbi4gS2hpIMSRxrBhIHbDoG8gbcO0IGjDrG5oIGjhu5NpIHF1eSDEkWEgYmnhur9uIChsb2dpdCwgcHJvYml0LCBjbG9nbG9nKSwgY8OhYyBr4bq/dCBxdeG6oyB24bqrbiBnaeG7ryBuZ3V5w6puIHh1IGjGsOG7m25nIHbDoCDDvSBuZ2jEqWEgdGjhu5FuZyBrw6osIGNobyB0aOG6pXkgxJHhu5kg4buVbiDEkeG7i25oIGPhu6dhIGPDoWMgeeG6v3UgdOG7kSBuw6B5IHRyb25nIHZp4buHYyBnaeG6o2kgdGjDrWNoIGjDoG5oIHZpIHRoYW0gZ2lhIGPDtG5nIMSRb8Ogbi4gVHJvbmcgxJHDsywgbmfGsOG7nWkgbGFvIMSR4buZbmcgbMOgIGxhbyDEkeG7mW5nIGNow6JuIHRheSwgbMOgbSB2aeG7h2MgdHJvbmcgbmfDoG5oIHPhuqNuIHh14bqldCwgxJHDoyBr4bq/dCBow7RuLCBsw6AgbmFtIGdp4bubaSwgbmfGsOG7nWkgZGEgxJFlbiDEkeG7gXUgY8OzIHjDoWMgc3XhuqV0IHRoYW0gZ2lhIGPDtG5nIMSRb8OgbiBjYW8gaMahbi4gUmnDqm5nIGJp4bq/biBzb3V0aCBjw7Mg4bqjbmggaMaw4bufbmcgbmfGsOG7o2MgY2hp4buBdSwgbMOgbSBnaeG6o20geMOhYyBzdeG6pXQgdGhhbSBnaWEgY8O0bmcgxJFvw6BuLiBUcm9uZyBiYSBtw7QgaMOsbmggbG9naXQsIHByb2JpdCwgY2xvZ2xvZyB0aMOsIG3DtCBow6xuaCBjbG9nbG9nIGNobyBr4bq/dCBxdeG6oyBwaMO5IGjhu6NwIG5o4bqldCwgdGjhu4MgaGnhu4duIHF1YSBnacOhIHRy4buLIEFJQyB2w6AgQnJpZXIgU2NvcmUgdGjhuqVwIG5o4bqldCwgeMOhYyBzdeG6pXQgdGhhbSBnaWEgY8O0bmcgxJFvw6BuIMSRxrDhu6NjIGThu7EgYsOhbyBi4bqxbmcgbcO0IGjDrG5oIGjhu5NpIHF1eSDEkWEgYmnhur9uIGNsb2dsb2cg4bufIGPDoWMgYmnhur9uIMSR4bq3YyB0csawbmcgdMOtY2ggY+G7sWMgbMOgIDU4LjYlLiBOaMawIHbhuq15IGPDsyB0aOG7gyBr4bq/dCBsdeG6rW4gcuG6sW5nIGPDoWMgxJHhurdjIMSRaeG7g20gbmjDom4ga2jhuql1IGjhu41jIGPDsyB0w6FjIMSR4buZbmcgbeG6oW5oIMSR4bq/biBxdXnhur90IMSR4buLbmggdGhhbSBnaWEgY8O0bmcgxJFvw6BuIGPhu6dhIG5nxrDhu51pIGxhbyDEkeG7mW5nIHThuqFpIEhvYSBL4buzLiAgIA0KDQojIyDEkMOzbmcgZ8OzcCBj4bunYSBuZ2hpw6puIGPhu6l1IA0KTmdoacOqbiBj4bupdSDEkcOjIGN1bmcgY+G6pXAgbeG7mXQgY8OhaSBuaMOsbiB0b8OgbiBkaeG7h24gduG7gSBt4buRaSBxdWFuIGjhu4cgZ2nhu69hIGPDoWMgxJHhurdjIMSRaeG7g20gbmjDom4ga2jhuql1IGjhu41jIHbDoCBxdXnhur90IMSR4buLbmggdGhhbSBnaWEgY8O0bmcgxJFvw6BuIGPhu6dhIG5nxrDhu51pIGxhbyDEkeG7mW5nIHThuqFpIEhvYSBL4buzLCB0aMO0bmcgcXVhIHZp4buHYyBr4bq/dCBo4bujcCBwaMOibiB0w61jaCB0aOG7kW5nIGvDqiBtw7QgdOG6oywgcGjDom4gdMOtY2ggdOG7tyBs4buHIHLhu6dpIHJvIHTGsMahbmcgxJHhu5FpIChSZWxhdGl2ZSBSaXNrKSwgdOG7tyBs4buHIGNow6puaCBs4buHY2ggKE9kZHMgUmF0aW8pIHbDoCBjw6FjIG3DtCBow6xuaCBo4buTaSBxdXkgdGjhu5FuZyBrw6ogKGxvZ2l0LCBwcm9iaXQsIGNsb2dsb2cpLiBWaeG7h2Mgc+G7rSBk4bulbmcgxJHhu5NuZyB0aOG7nWkgY8OhYyBwaMawxqFuZyBwaMOhcCDEkeG7i25oIGzGsOG7o25nIG7DoHkgZ2nDunAga2nhu4NtIGNo4bupbmcgdMOtbmggbmjhuqV0IHF1w6FuIHbDoCDEkeG7mSB0aW4gY+G6rXkgY+G7p2Ega+G6v3QgcXXhuqMsIHF1YSDEkcOzIGPhu6duZyBj4buRIHRow6ptIGLhurFuZyBjaOG7qW5nIHRo4buxYyBuZ2hp4buHbSB24buBIOG6o25oIGjGsOG7n25nIGPhu6dhIHnhur91IHThu5EgY8OhIG5ow6JuIMSR4bq/biBow6BuaCB2aSB0aGFtIGdpYSB04buVIGNo4bupYyBjw7RuZyDEkW/DoG4uICAgDQoNCkPhu6UgdGjhu4MsIG5naGnDqm4gY+G7qXUgxJHDoyBjaOG7iSByYSBy4bqxbmcgY8OhYyB54bq/dSB04buRIG5oxrAgbmdo4buBIG5naGnhu4dwIChsYW8gxJHhu5luZyBjaMOibiB0YXkpLCBuZ8Ogbmggbmdo4buBIChz4bqjbiB4deG6pXQpLCBnaeG7m2kgdMOtbmggKG5hbSksIHTDrG5oIHRy4bqhbmcgaMO0biBuaMOibiAoxJHDoyBr4bq/dCBow7RuKSwgY2jhu6duZyB04buZYyAobmfGsOG7nWkgZGEgxJFlbikgdsOgIGtodSB24buxYyBjxrAgdHLDuiAobmdvw6BpIG1p4buBbiBOYW0gSG9hIEvhu7MpIMSR4buBdSBjw7MgdmFpIHRyw7IgcXVhbiB0cuG7jW5nIHRyb25nIHZp4buHYyBk4buxIGLDoW8ga2jhuqMgbsSDbmcgdGhhbSBnaWEgY8O0bmcgxJFvw6BuLiBOaOG7r25nIHBow6F0IGhp4buHbiBuw6B5IGPDsyB0aOG7gyDEkcOzbmcgdmFpIHRyw7IgdGhhbSBjaGnhur91IHF1YW4gdHLhu41uZyBjaG8gY8OhYyBuaMOgIGhv4bqhY2ggxJHhu4tuaCBjaMOtbmggc8OhY2ggbGFvIMSR4buZbmcg4oCTIGPDtG5nIMSRb8OgbiB04bqhaSBIb2EgS+G7syB0cm9uZyB2aeG7h2MgeMOhYyDEkeG7i25oIG5ow7NtIMSR4buRaSB0xrDhu6NuZyBj4bqnbiDEkcaw4bujYyBxdWFuIHTDom0sIGjhu5cgdHLhu6MgaG/hurdjIHbhuq1uIMSR4buZbmcgxJHhu4MgdMSDbmcgY8aw4budbmcgc+G7sSB0aGFtIGdpYSB2w6BvIGPDtG5nIMSRb8OgbiwgcXVhIMSRw7MgZ8OzcCBwaOG6p24gbsOibmcgY2FvIGhp4buHdSBxdeG6oyDEkeG6oWkgZGnhu4duIHbDoCBi4bqjbyB24buHIHF1eeG7gW4gbOG7o2kgY2hvIG5nxrDhu51pIGxhbyDEkeG7mW5nLiAgIA0KTmdvw6BpIHJhLCBuZ2hpw6puIGPhu6l1IGPDsm4gY8OzIGdpw6EgdHLhu4sgdGjhu7FjIHRp4buFbiB0cm9uZyB2aeG7h2MgxJHhu4EgeHXhuqV0IHBoxrDGoW5nIHBow6FwIHBow6JuIHTDrWNoIMSR4buLbmggbMaw4bujbmcg4bupbmcgZOG7pW5nIHbDoG8gbMSpbmggduG7sWMgeMOjIGjhu5lpIGjhu41jIGxhbyDEkeG7mW5nLCDEkeG6t2MgYmnhu4d0IGzDoCB0cm9uZyBi4buRaSBj4bqjbmggZOG7ryBsaeG7h3UgxJFp4buBdSB0cmEgbeG6q3UgbOG7m24uIFZp4buHYyBjaOG7qW5nIG1pbmggcuG6sW5nIG3DtCBow6xuaCBjbG9nbG9nIGNobyBr4bq/dCBxdeG6oyBwaMO5IGjhu6NwIGjGoW4gdHJvbmcgZOG7sSBiw6FvIGjDoG5oIHZpIHRoYW0gZ2lhIGPDtG5nIMSRb8OgbiBjxaluZyBsw6AgbeG7mXQgxJHDs25nIGfDs3AgcGjGsMahbmcgcGjDoXAgxJHDoW5nIGNow7ogw70gY2hvIGPDoWMgbmdoacOqbiBj4bupdSB0xrDGoW5nIHThu7Egc2F1IG7DoHkuICAg