1 Tổng quan về bộ dữ liệu:insurance

  • Bộ dữ liệu bảo hiểm được lấy từ cuốn sách “Hands-On Machine Learning with Scikit-Learn, Keras & TensorFlow” của Aurélien Géron. Dữ liệu bao gồm thông tin về các cá nhân được bảo hiểm và chi phí y tế của họ.
library(csv)
a <- read.csv('C:/Users/ASUS/Downloads/insurance.csv', header= T)
  • Ý nghĩa của các cột tên biến trong bộ dữ liệu:
names(a)
## [1] "age"      "sex"      "bmi"      "children" "smoker"   "region"   "charges"
- age: Tuổi của người thụ hưởng chính
- sex: Giới tính của người được bảo hiểm (nữ, nam)
- bmi: Chỉ số khối cơ thể (BMI)
- children: Số con được bảo hiểm / Số người phụ thuộc
- smoker: Người hút thuốc (Có, Không)
- region: Vùng nơi người được bảo hiểm sinh sống ( Đông Bắc, Tây Bắc, Trung Tây, Nam)
- charges: Chi phí y tế

2 Tiến hành phân tích bộ dữ liệu:insurance

2.1 Biểu đồ phân bố tuổi tác:

library(ggplot2)
library(dplyr)
## 
## 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
ggplot(a) +
  geom_bar(aes(x = age, fill = sex)) +
  labs(title = "Phân bố tuổi tác", x = "Tuổi", y = "Số lượng", fill = "Giới tính") +
  scale_fill_brewer(palette = "Set1") +
  theme(legend.position = "bottom")

  • Giải thích ý nghĩa câu lệnh:
    • ggplot(a): Khởi tạo một ggplot object từ dữ liệu được lưu trữ trong biến a.

    • geom_bar(aes(x = age, fill = sex)): Thêm layer biểu đồ dạng thanh vào ggplot object.

      • aes(x = age, fill = sex): Xác định các biến được sử dụng để tạo biểu đồ:
      • x = age: Trục hoành biểu thị “Tuổi”.
      • fill = sex: Màu sắc thanh biểu đồ thể hiện “Giới tính”.
    • labs(title = “Phân bố tuổi tác”, x = “Tuổi”, y = “Số lượng”, fill = “Giới tính”): Thêm tiêu đề và chú thích cho các trục và phần tô màu.

      • title = “Phân bố tuổi tác”: Tiêu đề cho biểu đồ.
      • x = “Tuổi”: Chú thích cho trục hoành.
      • y = “Số lượng”: Chú thích cho trục tung.
      • fill = “Giới tính”: Chú thích cho phần tô màu.
    • scale_fill_brewer(palette = “Set1”): Chọn bảng màu “Set1” từ bộ màu Brewer để tô màu cho các thanh biểu đồ.

    • theme(legend.position = “bottom”): Di chuyển vị trí legenda xuống dưới cùng của biểu đồ.

2.2 Biểu đồ phân bố giới tính:

a %>% group_by(sex) %>% summarise(k = n()) %>%
  ggplot(aes(sex,k)) +
    geom_col(fill='brown') +
    geom_text(aes(label = k),vjust = 2, color = 'white') +
    labs(title = "Phân bố giới tính", x = "Giới tính", y = "Số lượng")

  • Giải thích ý nghĩa câu lệnh:
    • a %>% group_by(sex): Nhóm dữ liệu trong biến a theo biến sex.

    • %>% summarise(k = n()): Tính tổng số lượng bản ghi trong mỗi nhóm giới tính và lưu trữ kết quả trong biến k.

    • ggplot(aes(sex,k)): Khởi tạo một ggplot object từ dữ liệu được lưu trữ trong biến k với các biến sex và k được sử dụng để tạo biểu đồ.

    • geom_col(fill=‘brown’): Thêm layer biểu đồ dạng cột vào ggplot object với màu nâu.

    • geom_text(aes(label = k),vjust = 2, color = ‘white’): Thêm layer văn bản hiển thị giá trị k bên trên mỗi cột với màu trắng và vị trí được điều chỉnh lên cao một chút.

    • labs(title = “Phân bố giới tính”, x = “Giới tính”, y = “Số lượng”): Thêm tiêu đề và chú thích cho các trục.

2.3 Biểu đồ mật độ phân bố BMI:

ggplot(a) +
  geom_density(aes(x = bmi), fill= 'navy') +
  
  labs(title = "Phân bố BMI", x = "BMI", y = "Mật độ")

  • Giải thích ý nghĩa câu lệnh:
    • ggplot(a): Khởi tạo một ggplot object từ dữ liệu được lưu trữ trong biến a.

    • geom_density(aes(x = bmi), fill= ‘navy’): Thêm layer biểu đồ mật độ vào ggplot object.

      • aes(x = bmi): Xác định biến bmi được sử dụng để tạo biểu đồ mật độ.
      • fill= ‘navy’:: Tô màu cho biểu đồ mật độ bằng màu xanh navy.
    • labs(title = “Phân bố BMI”, x = “BMI”, y = “Mật độ”): Thêm tiêu đề và chú thích cho các trục.

      • title = “Phân bố BMI”: Tiêu đề cho biểu đồ.
      • x = “BMI”: Chú thích cho trục hoành.
      • y = “Mật độ”: Chú thích cho trục tung.

2.4 Biểu đồ boxplot cho chi phí y tế theo giới tính:

ggplot(a) +
  geom_boxplot(aes(x = sex, y = charges)) +
  labs(title = "Chi phí y tế theo giới tính", x = "Giới tính", y = "Chi phí y tế (USD)")

  • Giải thích ý nghĩa câu lệnh:

    • ggplot(a): Khởi tạo một ggplot object từ dữ liệu được lưu trữ trong biến a.

    • geom_boxplot(aes(x = sex, y = charges)): Thêm layer biểu đồ hộp vào ggplot object.

      • aes(x = sex, y = charges): Xác định biến sex và charges được sử dụng để tạo biểu đồ hộp.
      • x = sex: Trục hoành thể hiện “Giới tính”.
      • y = charges: Trục tung thể hiện “Chi phí y tế (USD)”.
    • labs(title = “Chi phí y tế theo giới tính”, x = “Giới tính”, y = “Chi phí y tế (USD)”): Thêm tiêu đề và chú thích cho các trục.

      • title = “Chi phí y tế theo giới tính”: Tiêu đề cho biểu đồ.
      • x = “Giới tính”: Chú thích cho trục hoành.
      • y = “Chi phí y tế (USD)”: Chú thích cho trục tung.

##Biểu đồ phân bố khu vực:

a %>% group_by(region) %>% summarise(k = n()) %>%
  ggplot(aes(region,k)) +
    geom_col(fill='skyblue') +
    geom_text(aes(label = k),vjust = 2, color = 'white') +
    labs(title = "Phân bố khu vực", x = 'Khu vực', y = 'Số lượng')

  • Giải thích ý nghĩa câu lệnh:

    • a %>% group_by(region): Nhóm dữ liệu trong biến a theo biến region.

    • %>% summarise(k = n()): Tính tổng số lượng bản ghi trong mỗi nhóm khu vực và lưu trữ kết quả trong biến k.

    • ggplot(aes(region,k)): Khởi tạo một ggplot object từ dữ liệu được lưu trữ trong biến k với các biến region và k được sử dụng để tạo biểu đồ.

    • geom_col(fill=‘skyblue’): Thêm layer biểu đồ dạng cột vào ggplot object với màu xanh da trời.

    • geom_text(aes(label = k),vjust = 2, color = ‘white’): Thêm layer văn bản hiển thị giá trị k bên trên mỗi cột với màu trắng và vị trí được điều chỉnh lên cao một chút.

    • labs(title = “Phân bố khu vực”, x = ‘Khu vực’, y = ‘Số lượng’): Thêm tiêu đề và chú thích cho các trục.

2.5 Biểu đồ mật độ tuổi tác:

ggplot(a) +
  geom_density(aes(x = age), fill= 'pink') +
  labs(title = "Phân bố mật độ tuổi tác", x = "Tuổi", y = "Mật độ")

  • Giải thích ý nghĩa câu lệnh:

    • ggplot(a): Khởi tạo một ggplot object từ dữ liệu được lưu trữ trong biến a.

    • geom_density(aes(x = age), fill= ‘pink’): Thêm layer biểu đồ mật độ vào ggplot object.

      • aes(x = age): Xác định biến age được sử dụng để tạo biểu đồ mật độ.
      • fill= ‘pink’:: Tô màu cho biểu đồ mật độ bằng màu hồng.
    • labs(title = “Phân bố mật độ tuổi tác”, x = “Tuổi”, y = “Mật độ”): Thêm tiêu đề và chú thích cho các trục.

      • title = “Phân bố mật độ tuổi tác”: Tiêu đề cho biểu đồ.
      • x = “Tuổi”: Chú thích cho trục hoành.
      • y = “Mật độ”: Chú thích cho trục tung.

2.6 Biểu đồ mật độ chi phí y tế theo giới tính:

ggplot(a) +
  geom_density(aes(x = charges, fill = sex)) +
  labs(title = "Phân bố chi phí y tế theo giới tính", x = "Chi phí y tế (USD)", y = "Mật độ", fill = "Giới tính") +
  scale_fill_brewer(palette = "Set3") +
  theme(legend.position = "bottom")

  • Giải thích ý nghĩa câu lệnh:
    • ggplot(a): Khởi tạo một ggplot object từ dữ liệu được lưu trữ trong biến a.

    • geom_density(aes(x = charges, fill = sex)): Thêm layer biểu đồ mật độ vào ggplot object.

      • aes(x = charges, fill = sex): Xác định biến charges và sex được sử dụng để tạo biểu đồ mật độ.
      • x = charges: Trục hoành thể hiện “Chi phí y tế (USD)”.
      • fill = sex: Màu sắc biểu đồ mật độ thể hiện “Giới tính”.
    • labs(title = “Phân bố chi phí y tế theo giới tính”, x = “Chi phí y tế (USD)”, y = “Mật độ”, fill = “Giới tính”): Thêm tiêu đề, chú thích cho các trục và phần tô màu.

      • title = “Phân bố chi phí y tế theo giới tính”: Tiêu đề cho biểu đồ.
      • x = “Chi phí y tế (USD)”: Chú thích cho trục hoành.
      • y = “Mật độ”: Chú thích cho trục tung.
      • fill = “Giới tính”: Chú thích cho phần tô màu.
    • scale_fill_brewer(palette = “Set3”): Chọn bảng màu “Set3” từ bộ màu Brewer để tô màu cho các khu vực mật độ theo giới tính.

    • theme(legend.position = “bottom”): Di chuyển vị trí legenda xuống dưới cùng của biểu đồ.

2.7 Biểu đồ mật độ chi phí y tế theo khu vực:

ggplot(a) +
  geom_density(aes(x = charges, fill = region)) +
  labs(title = "Phân bố chi phí y tế theo khu vực", x = "Chi phí y tế (USD)", y = "Mật độ", fill = "Khu vực") +
  scale_fill_brewer(palette = "Set3") +
  theme(legend.position = "bottom")

  • Giải thích ý nghĩa câu lệnh:
    • ggplot(a): Khởi tạo một ggplot object từ dữ liệu được lưu trữ trong biến a.

    • geom_density(aes(x = charges, fill = region)): Thêm layer biểu đồ mật độ vào ggplot object.

aes(x = charges, fill = region): Xác định biến charges và region được sử dụng để tạo biểu đồ mật độ. x = charges: Trục hoành thể hiện “Chi phí y tế (USD)”. fill = region: Màu sắc biểu đồ mật độ thể hiện “Khu vực”. - labs(title = “Phân bố chi phí y tế theo khu vực”, x = “Chi phí y tế (USD)”, y = “Mật độ”, fill = “Khu vực”): Thêm tiêu đề, chú thích cho các trục và phần tô màu.

title = “Phân bố chi phí y tế theo khu vực”: Tiêu đề cho biểu đồ. x = “Chi phí y tế (USD)”: Chú thích cho trục hoành. y = “Mật độ”: Chú thích cho trục tung. fill = “Khu vực”: Chú thích cho phần tô màu. - scale_fill_brewer(palette = “Set3”): Chọn bảng màu “Set3” từ bộ màu Brewer để tô màu cho các khu vực mật độ theo khu vực.

  • theme(legend.position = “bottom”): Di chuyển vị trí legenda xuống dưới cùng của biểu đồ.

2.8 Biểu đồ histogram BMI theo giới tính:

ggplot(a) +
  geom_histogram(aes(x = bmi, fill = sex)) +
  labs(title = "Phân bố BMI theo giới tính", x = "BMI", y = "Số lượng", fill = "Giới tính") +
  scale_fill_brewer(palette = "Set2") +
  theme(legend.position = "bottom")
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

  • Giải thích ý nghĩa câu lệnh:

    • ggplot(a): Khởi tạo một ggplot object từ dữ liệu được lưu trữ trong biến a.

    • geom_histogram(aes(x = bmi, fill = sex)): Thêm layer biểu đồ histogram vào ggplot object.

      • aes(x = bmi, fill = sex): Xác định biến bmi và sex được sử dụng để tạo biểu đồ histogram.
      • x = bmi: Trục hoành thể hiện “Chỉ số BMI”.
      • fill = sex: Màu sắc của các cột histogram thể hiện “Giới tính”.
    • labs(title = “Phân bố BMI theo giới tính”, x = “BMI”, y = “Số lượng”, - fill = “Giới tính”): Thêm tiêu đề, chú thích cho các trục và phần tô màu.

      • title = “Phân bố BMI theo giới tính”: Tiêu đề cho biểu đồ.
      • x = “BMI”: Chú thích cho trục hoành.
      • y = “Số lượng”: Chú thích cho trục tung.
      • fill = “Giới tính”: Chú thích cho phần tô màu.
    • scale_fill_brewer(palette = “Set2”): Chọn bảng màu “Set2” từ bộ màu Brewer để tô màu cho các cột histogram theo giới tính.

    • theme(legend.position = “bottom”): Di chuyển vị trí legenda xuống dưới cùng của biểu đồ.

2.9 Biểu đồ histogram chi phí y tế theo tình trạng hút thuốc:

ggplot(a) +
  geom_histogram(aes(x = charges, fill = smoker)) +
  labs(title = "Phân bố chi phí y tế theo tình trạng hút thuốc", x = "Chi phí y tế (USD)", y = "Số lượng", fill = "Hút thuốc") +
  scale_fill_brewer(palette = "Set2") +
  theme(legend.position = "bottom")
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

  • Giải thích ý nghĩa câu lệnh:

    • ggplot(a): Khởi tạo một ggplot object từ dữ liệu được lưu trữ trong biến a.

    • geom_histogram(aes(x = charges, fill = smoker)): Thêm layer biểu đồ histogram vào ggplot object.

      • aes(x = charges, fill = smoker): Xác định biến charges và smoker được sử dụng để tạo biểu đồ histogram.
      • x = charges: Trục hoành thể hiện “Chi phí y tế (USD)”.
      • fill = smoker: Màu sắc của các cột histogram thể hiện “Tình trạng hút thuốc” (Hút thuốc, Không hút thuốc).
    • labs(title = “Phân bố chi phí y tế theo tình trạng hút thuốc”, x = “Chi phí y tế (USD)”, y = “Số lượng”, fill = “Hút thuốc”): Thêm tiêu đề, chú thích cho các trục và phần tô màu.

      • title = “Phân bố chi phí y tế theo tình trạng hút thuốc”: Tiêu đề cho biểu đồ.
      • x = “Chi phí y tế (USD)”: Chú thích cho trục hoành.
      • y = “Số lượng”: Chú thích cho trục tung.
      • fill = “Hút thuốc”: Chú thích cho phần tô màu.
    • scale_fill_brewer(palette = “Set2”): Chọn bảng màu “Set2” từ bộ màu Brewer để tô màu cho các cột histogram theo tình trạng hút thuốc.

    • theme(legend.position = “bottom”): Di chuyển vị trí legenda xuống dưới cùng của biểu đồ.

2.10 Biểu đồ histogram chi phí y tế theo trẻ em:

ggplot(a) +
  geom_histogram(aes(x = charges, fill = factor(children))) +
  labs(title = "Phân bố chi phí y tế theo trẻ em", x = "Chi phí y tế (USD)", y = "Số lượng", fill = "Trẻ em") +
  scale_fill_brewer(palette = "Set2") +
  theme(legend.position = "bottom")
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

  • Giải thích ý nghĩa câu lệnh:
    • ggplot(a): Khởi tạo một ggplot object từ dữ liệu được lưu trữ trong biến a.

    • geom_histogram(aes(x = charges, fill = factor(children))): Thêm layer biểu đồ histogram vào ggplot object.

      • aes(x = charges, fill = factor(children)): Xác định biến charges và children được sử dụng để tạo biểu đồ histogram.
      • x = charges: Trục hoành thể hiện “Chi phí y tế (USD)”.
      • fill = factor(children): Màu sắc của các cột histogram thể hiện “Số con” (Có con, Không con).
      • factor(children): Chuyển đổi biến children thành dạng factor để sử dụng trong biểu đồ. Biến factor giúp phân biệt các nhóm riêng biệt (Có con/Không con) thay vì chỉ là giá trị số.
    • labs(title = “Phân bố chi phí y tế theo trẻ em”, x = “Chi phí y tế (USD)”, y = “Số lượng”, fill = “Trẻ em”): Thêm tiêu đề, chú thích cho các trục và phần tô màu.

      • title = “Phân bố chi phí y tế theo trẻ em”: Tiêu đề cho biểu đồ.
      • x = “Chi phí y tế (USD)”: Chú thích cho trục hoành.
      • y = “Số lượng”: Chú thích cho trục tung.
      • fill = “Trẻ em”: Chú thích cho phần tô màu (thực tế là thể hiện “Số con”).
    • scale_fill_brewer(palette = “Set2”): Chọn bảng màu “Set2” từ bộ màu Brewer để tô màu cho các cột histogram theo nhóm có con/không con.

    • theme(legend.position = “bottom”): Di chuyển vị trí legenda xuống dưới cùng của biểu đồ.

2.11 Biểu đồ histogram chi phí y tế theo tuổi tác:

ggplot(a) +
  geom_histogram(aes(x = charges, fill = factor(age))) +
  labs(title = "Phân bố chi phí y tế theo tuổi tác", x = "Chi phí y tế (USD)", y = "Số lượng", fill = "Tuổi") +
  scale_fill_brewer(palette = "Set1") +
  theme(legend.position = "bottom")
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## Warning in RColorBrewer::brewer.pal(n, pal): n too large, allowed maximum for palette Set1 is 9
## Returning the palette you asked for with that many colors

  • Giải thích ý nghĩa câu lệnh:
    • ggplot(a): Khởi tạo một ggplot object từ dữ liệu được lưu trữ trong biến a.

    • geom_histogram(aes(x = charges, fill = factor(age))): Thêm layer biểu đồ histogram vào ggplot object.

      • aes(x = charges, fill = factor(age)): Xác định biến charges và age được sử dụng để tạo biểu đồ histogram.
      • x = charges: Trục hoành thể hiện “Chi phí y tế (USD)”.
      • fill = factor(age): Màu sắc của các cột histogram thể hiện “Tuổi”.
      • factor(age): Chuyển đổi biến age thành dạng factor để sử dụng trong biểu đồ. Biến factor giúp phân biệt các nhóm tuổi riêng biệt thay vì chỉ là giá trị số.
    • labs(title = “Phân bố chi phí y tế theo tuổi tác”, x = “Chi phí y tế (USD)”, y = “Số lượng”, fill = “Tuổi”): Thêm tiêu đề, chú thích cho các trục và phần tô màu.

      • title = “Phân bố chi phí y tế theo tuổi tác”: Tiêu đề cho biểu đồ.
      • x = “Chi phí y tế (USD)”: Chú thích cho trục hoành.
      • y = “Số lượng”: Chú thích cho trục tung.
      • fill = “Tuổi”: Chú thích cho phần tô màu.
    • scale_fill_brewer(palette = “Set1”): Chọn bảng màu “Set1” từ bộ màu Brewer để tô màu cho các cột histogram theo nhóm tuổi.

    • theme(legend.position = “bottom”): Di chuyển vị trí legenda xuống dưới cùng của biểu đồ.

2.12 Biểu đồ xu hướng chi phí y tế theo tuổi tác:

a %>%
  ggplot(aes(x = age, y = charges)) +
  geom_line() +
  labs(title = "Xu hướng chi phí y tế theo tuổi tác", x = "Tuổi", y = "Chi phí y tế (USD)")

  • Giải thích ý nghĩa câu lệnh:
    • a %>%: Chọn dữ liệu từ biến a để sử dụng trong ggplot.

    • ggplot(aes(x = age, y = charges)): Khởi tạo một ggplot object với dữ liệu được chọn từ a.

      • aes(x = age, y = charges): Xác định biến age và charges được sử dụng để tạo biểu đồ.
      • x = age: Trục hoành thể hiện “Tuổi”.
      • y = charges: Trục tung thể hiện “Chi phí y tế (USD)”.
    • geom_line(): Thêm layer biểu đồ đường vào ggplot object.

    • labs(title = “Xu hướng chi phí y tế theo tuổi tác”, x = “Tuổi”, y = “Chi phí y tế (USD)”): Thêm tiêu đề và chú thích cho các trục.

      • title = “Xu hướng chi phí y tế theo tuổi tác”: Tiêu đề cho biểu đồ.
      • x = “Tuổi”: Chú thích cho trục hoành.
      • y = “Chi phí y tế (USD)”: Chú thích cho trục tung.

2.13 Biểu đồ so sánh chi phí y tế theo giới tính:

a %>%
  ggplot(aes(x = age, y = charges, color = sex)) +
  geom_line() +
  labs(title = "So sánh chi phí y tế theo giới tính", x = "Tuổi", y = "Chi phí y tế (USD)", color = "Giới tính")

  • Giải thích ý nghĩa câu lệnh:
    • a %>%: Chọn dữ liệu từ biến a để sử dụng trong ggplot.

    • ggplot(aes(x = age, y = charges, color = sex)): Khởi tạo một ggplot object với dữ liệu được chọn từ a.

      • aes(x = age, y = charges, color = sex): Xác định biến age, charges và sex được sử dụng để tạo biểu đồ.
      • x = age: Trục hoành thể hiện “Tuổi”.
      • y = charges: Trục tung thể hiện “Chi phí y tế (USD)”.
      • color = sex: Màu sắc của các đường biểu thị “Giới tính”.
    • geom_line(): Thêm layer biểu đồ đường vào ggplot object.

    • labs(title = “So sánh chi phí y tế theo giới tính”, x = “Tuổi”, y = “Chi phí y tế (USD)”, color = “Giới tính”): Thêm tiêu đề và chú thích cho các trục và phần tô màu.

      • title = “So sánh chi phí y tế theo giới tính”: Tiêu đề cho biểu đồ.
      • x = “Tuổi”: Chú thích cho trục hoành.
      • y = “Chi phí y tế (USD)”: Chú thích cho trục tung.
      • color = “Giới tính”: Chú thích cho phần tô màu (thực tế là thể hiện “Giới tính”).

2.14 Biểu đồ so sánh chi phí y tế theo khu vực:

a %>%
  ggplot(aes(x = age, y = charges, color = region)) +
  geom_line() +
  labs(title = "So sánh chi phí y tế theo khu vực", x = "Tuổi", y = "Chi phí y tế (USD)", color = "Khu vực")

  • Giải thích ý nghĩa câu lệnh:
    • a %>%: Chọn dữ liệu từ biến a để sử dụng trong ggplot.

    • ggplot(aes(x = age, y = charges, color = region)): Khởi tạo một ggplot object với dữ liệu được chọn từ a.

      • aes(x = age, y = charges, color = region): Xác định biến age, charges và region được sử dụng để tạo biểu đồ.
      • x = age: Trục hoành thể hiện “Tuổi”.
      • y = charges: Trục tung thể hiện “Chi phí y tế (USD)”.
      • color = region: Màu sắc của các đường biểu thị “Khu vực”.
    • geom_line(): Thêm layer biểu đồ đường vào ggplot object.

    • labs(title = “So sánh chi phí y tế theo khu vực”, x = “Tuổi”, y = “Chi phí y tế (USD)”, color = “Khu vực”): Thêm tiêu đề và chú thích cho các trục và phần tô màu.

      • title = “So sánh chi phí y tế theo khu vực”: Tiêu đề cho biểu đồ.
      • x = “Tuổi”: Chú thích cho trục hoành.
      • y = “Chi phí y tế (USD)”: Chú thích cho trục tung. color = “Khu vực”: Chú thích cho phần tô màu (thực tế là thể hiện “Khu vực”).

2.15 Biểu đồ ảnh hưởng của BMI đến chi phí y tế:

a %>%
  ggplot(aes(x = bmi, y = charges)) +
  geom_point() +
  geom_smooth(method = "lm") +
  labs(title = "Ảnh hưởng của BMI đến chi phí y tế", x = "BMI", y = "Chi phí y tế (USD)")
## `geom_smooth()` using formula = 'y ~ x'

  • Giải thích ý nghĩa câu lệnh:
    • a %>%: Chọn dữ liệu từ biến a để sử dụng trong ggplot.

    • ggplot(aes(x = bmi, y = charges)): Khởi tạo một ggplot object với dữ liệu được chọn từ a.

      • aes(x = bmi, y = charges): Xác định biến bmi và charges được sử dụng để tạo biểu đồ.
      • x = bmi: Trục hoành thể hiện “Chỉ số khối cơ thể (BMI)”.
      • y = charges: Trục tung thể hiện “Chi phí y tế (USD)”.
    • geom_point(): Thêm layer biểu đồ điểm vào ggplot object. Biểu đồ điểm hiển thị mối liên hệ giữa từng điểm dữ liệu (BMI, chi phí y tế)

    • geom_smooth(method = “lm”): Thêm layer đường hồi quy tuyến tính vào ggplot object. Đường hồi quy giúp mô tả mối liên hệ tổng thể giữa BMI và chi phí y tế.

      • method = “lm”: Sử dụng phương pháp hồi quy tuyến tính.
    • labs(title = “Ảnh hưởng của BMI đến chi phí y tế”, x = “BMI”, y = “Chi phí y tế (USD)”): Thêm tiêu đề và chú thích cho các trục.

      • title = “Ảnh hưởng của BMI đến chi phí y tế”: Tiêu đề cho biểu đồ.
      • x = “BMI”: Chú thích cho trục hoành.
      • y = “Chi phí y tế (USD)”: Chú thích cho trục tung.

2.16 Biểu đồ Density Plot giữa Age và Charges (phân loại theo Smoker):

ggplot(a, aes(x = age, fill = smoker)) +
  geom_density(alpha = 0.7) +
  labs(title = "Density Plot of Age (colored by Smoker)", x = "Age", y = "Density") +
  scale_fill_manual(values = c("yes" = "brown", "no" = "lightyellow"))

  • Giải thích ý nghĩa câu lệnh:
    • ggplot(a, aes(x = age, fill = smoker)): Khởi tạo một ggplot object từ dữ liệu được lưu trữ trong biến a.

      • aes(x = age, fill = smoker): Xác định biến age và smoker được sử dụng để tạo biểu đồ mật độ.
      • x = age: Trục hoành thể hiện “Age” (giữ nguyên tên tiếng Anh).
      • fill = smoker: Màu sắc của biểu đồ mật độ thể hiện “Smoker” (giữ nguyên tên tiếng Anh).
    • geom_density(alpha = 0.7): Thêm layer biểu đồ mật độ vào ggplot object.

      • alpha = 0.7: Thiết lập độ mờ của biểu đồ mật độ thành 0.7 (70% opacity).
    • labs(title = “Density Plot of Age (colored by Smoker)”, x = “Age”, y = “Density”): Thêm tiêu đề, chú thích cho các trục và phần tô màu (giữ nguyên tên tiếng Anh).

      • title = “Density Plot of Age (colored by Smoker)”: Tiêu đề cho biểu đồ (diễn đạt bằng tiếng Anh).
      • x = “Age”: Chú thích cho trục hoành (giữ nguyên tên tiếng Anh).
      • y = “Density”: Chú thích cho trục tung (giữ nguyên tên tiếng Anh).
    • scale_fill_manual(values = c(“yes” = “brown”, “no” = “lightyellow”)): Chọn cách tô màu thủ công cho biểu đồ mật độ.

      • values = c(“yes” = “brown”, “no” = “lightyellow”): Xác định giá trị của biến smoker và màu sắc tương ứng.
      • “yes” được tô màu nâu (“brown”).
      • “no” được tô màu vàng nhạt (“lightyellow”).

2.17 Biểu Đồ Scatter Plot cho tương quan giữa BMI và Region:

ggplot(a, aes(x = bmi, y = as.factor(region), color = bmi)) +
  geom_point() +
  labs(title = "Scatter Plot of BMI by Region", x = "BMI", y = "Region") +
  scale_color_viridis_c() +
  theme(axis.text.y = element_text(angle = 0, hjust = 1))

  • Giải thích ý nghĩa câu lệnh:
    • ggplot(a, aes(x = bmi, y = as.factor(region), color = bmi)): Khởi tạo một ggplot object từ dữ liệu được lưu trữ trong biến a.

      • aes(x = bmi, y = as.factor(region), color = bmi): Xác định các biến được sử dụng để tạo biểu đồ.
      • x = bmi: Trục hoành thể hiện “BMI”.
      • y = as.factor(region): Trục tung thể hiện “Region” được chuyển đổi thành dạng factor. Chuyển đổi này giúp phân biệt các vùng miền riêng biệt thay vì chỉ là giá trị văn bản.
      • color = bmi: Màu sắc của các điểm dữ liệu được xác định bởi giá trị của biến “bmi”.
    • geom_point(): Thêm layer biểu đồ điểm vào ggplot object. Biểu đồ điểm hiển thị mối liên hệ giữa từng điểm dữ liệu (BMI, vùng miền).

    • labs(title = “Scatter Plot of BMI by Region”, x = “BMI”, y = “Region”): Thêm tiêu đề và chú thích cho các trục.

      • title = “Scatter Plot of BMI by Region”: Tiêu đề cho biểu đồ (diễn đạt bằng tiếng Anh).
      • x = “BMI”: Chú thích cho trục hoành.
      • y = “Region”: Chú thích cho trục tung.
    • scale_color_viridis_c(): Chọn bảng màu “viridis” để tô màu cho các điểm dữ liệu. Bảng màu viridis chuyển màu từ xanh lá cây sang vàng rồi đến đỏ theo giá trị của biến bmi.

    • theme(axis.text.y = element_text(angle = 0, hjust = 1)): Tùy chỉnh hiển thị nhãn cho trục tung.

      • axis.text.y = element_text(angle = 0, hjust = 1): Xoay nhãn của trục tung 0 độ (giữ thẳng đứng) và canh chỉnh sang phải.

2.18 Biểu đồ Bar Plot giữa Sex và Number of Children:

ggplot(a, aes(x = sex, fill = as.factor(children))) +
  geom_bar() +
  labs(title = "Bar Plot of Number of Children by Sex", x = "Sex", y = "Count") +
  scale_fill_brewer(palette = "Set3")

  • Giải thích ý nghĩa câu lệnh:
    • ggplot(a, aes(x = sex, fill = as.factor(children))): Khởi tạo một ggplot object từ dữ liệu được lưu trữ trong biến a.

      • aes(x = sex, fill = as.factor(children)): Xác định các biến được sử dụng để tạo biểu đồ thanh.
      • x = sex: Trục hoành thể hiện “Sex” (giữ nguyên tên tiếng Anh).
      • fill = as.factor(children): Màu sắc của các cột bar thể hiện “Số con” (Children) được chuyển đổi thành dạng factor. Chuyển đổi này giúp phân biệt nhóm có con/không con riêng biệt thay vì chỉ là giá trị số.
    • geom_bar(): Thêm layer biểu đồ thanh vào ggplot object. Biểu đồ thanh giúp hiển thị số lượng theo từng nhóm (nam/nữ) trên trục hoành.

    • labs(title = “Bar Plot of Number of Children by Sex”, x = “Sex”, y = “Count”): Thêm tiêu đề và chú thích cho các trục.

      • title = “Bar Plot of Number of Children by Sex”: Tiêu đề cho biểu đồ (diễn đạt bằng tiếng Anh).
      • x = “Sex”: Chú thích cho trục hoành (giữ nguyên tên tiếng Anh).
      • y = “Count”: Chú thích cho trục tung, mặc dù tên chính xác hơn có thể là “Number of Children” (Số con).
    • scale_fill_brewer(palette = “Set3”): Chọn bảng màu “Set3” từ bộ màu Brewer để tô màu cho các cột bar theo nhóm có con/không con.

2.19 Biểu đồ bar plot giữa giới tính và khu vực

ggplot(a, aes(x = sex, fill = region)) +
  geom_bar(position = "dodge", stat = "count") +
  geom_text(aes(label = stat(count)), stat = "count", position = position_dodge(width = 0.9))
## Warning: `stat(count)` was deprecated in ggplot2 3.4.0.
## ℹ Please use `after_stat(count)` instead.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.

  labs(title = "Bar Plot of Sex vs region",
       x = "Sex",
       y = "Count") 
## $x
## [1] "Sex"
## 
## $y
## [1] "Count"
## 
## $title
## [1] "Bar Plot of Sex vs region"
## 
## attr(,"class")
## [1] "labels"
  • Giải thích ý nghĩa câu lệnh:
    • ggplot(a, aes(x = sex, fill = region)): Khởi tạo một ggplot object từ dữ liệu được lưu trữ trong biến a.

      • aes(x = sex, fill = region): Xác định các biến được sử dụng để tạo biểu đồ thanh.
      • x = sex: Trục hoành thể hiện “Sex” (giữ nguyên tên tiếng Anh). fill = region: Màu sắc của các cột bar thể hiện “Vùng miền” (region).
    • geom_bar(position = “dodge”, stat = “count”): Thêm layer biểu đồ thanh xếp chồng (dodge) vào ggplot object.

      • position = “dodge”: Xếp chồng các cột bar theo nhóm giới tính (nam/nữ) trên trục hoành để tránh chồng chéo lên nhau.
      • stat = “count”: Sử dụng thống kê “count” để tính tổng số người cho mỗi nhóm (giới tính + vùng miền).
    • geom_text(aes(label = stat(count)), stat = “count”, position = position_dodge(width = 0.9)): Thêm layer text để hiển thị giá trị (số lượng) trên mỗi cột bar.

      • aes(label = stat(count)): Lấy giá trị trả về của thống kê “count” (số lượng) để hiển thị trên mỗi cột bar.
      • stat = “count”: Sử dụng thống kê “count” để tính toán giá trị hiển thị (giống với geom_bar).
      • position = position_dodge(width = 0.9): Vị trí đặt text cũng xếp chồng theo nhóm giống với geom_bar, độ rộng text bằng 90% chiều rộng của cột bar (để tránh text bị che khuất).
    • labs(title = “Bar Plot of Sex vs region”, x = “Sex”, y = “Count”): Thêm tiêu đề và chú thích cho các trục.

      • title = “Bar Plot of Sex vs region”: Tiêu đề cho biểu đồ (diễn đạt bằng tiếng Anh).
      • x = “Sex”: Chú thích cho trục hoành (giữ nguyên tên tiếng Anh).
      • y = “Count”: Chú thích cho trục tung.

2.20 Biểu đồ cột hiển thị số lượng người hút thuốc và không hút thuốc theo giới tính

ggplot(a, aes(x = sex, fill = smoker)) +
  geom_bar(position = "dodge", stat = "count") +
  geom_text(aes(label = stat(count)), stat = "count", position = position_dodge(width = 0.9))

  labs(title = " Biểu đồ cột hiển thị số lượng người hút thuốc và không hút thuốc theo giới tính", y = "Count") +
  scale_fill_manual(values = c("yes" = "skyblue", "no" = "pink"))
## NULL
  • Giải thích ý nghĩa câu lệnh:
    • ggplot(a, aes(x = sex, fill = smoker))

      • ggplot(a): Khởi tạo một biểu đồ ggplot dựa trên dữ liệu trong dataframe a.
      • aes(x = sex, fill = smoker):
      • aes: Ánh xạ các biến trong dataframe vào các thuộc tính của biểu đồ.
      • x = sex: Gán biến sex (giới tính) cho trục x của biểu đồ.
      • fill = smoker: Gán biến smoker (hút thuốc) cho màu sắc của các thanh trong biểu đồ.
    • geom_bar(position = “dodge”, stat = “count”)

      • geom_bar: Thêm hình dạng thanh vào biểu đồ.
      • position = “dodge”: Xếp các thanh cạnh nhau theo nhóm (giới tính) với khoảng cách nhất định.
      • stat = “count”: Tính toán số lượng người cho mỗi nhóm (giới tính) và hiển thị trên thanh.
    • geom_text(aes(label = stat(count)), stat = “count”, position = position_dodge(width = 0.9))

      • geom_text: Thêm chú thích số lượng vào mỗi thanh.
      • aes(label = stat(count)): Gán giá trị số lượng (tính toán bởi - stat(count)) cho nội dung chú thích. position = position_dodge(width = 0.9): Vị trí chú thích được căn chỉnh với vị trí của thanh và có độ rộng 0.9.
    • labs(title = “Biểu đồ cột hiển thị số lượng người hút thuốc và không hút thuốc theo giới tính”, y = “Count”)

      • labs: Thêm tiêu đề và chú thích cho các trục.
      • title = “Biểu đồ cột hiển thị số lượng người hút thuốc và không hút thuốc theo giới tính”: Tiêu đề cho biểu đồ.
      • y = “Count”: Chú thích cho trục y.
    • scale_fill_manual(values = c(“yes” = “skyblue”, “no” = “pink”))

      • scale_fill_manual: Chọn màu sắc cho các nhóm (giới tính).
      • values = c(“yes” = “skyblue”, “no” = “pink”): Gán màu xanh da trời cho nhóm “yes” (hút thuốc) và màu hồng cho nhóm “no” (không hút thuốc).
LS0tDQp0aXRsZTogIk5oaeG7h20gduG7pSA1Ig0KYXV0aG9yOiAiSG9hbmcgUXV5ZW4iDQpkYXRlOiAiYHIgZm9ybWF0KFN5cy50aW1lKCksICclSDolTTolUywgJWQgLSAlbSAtICVZJylgIg0Kb3V0cHV0OiANCiAgaHRtbF9kb2N1bWVudDogDQogICAgZGZfcHJpbnQ6IGthYmxlDQogICAgdG9jOiB0cnVlDQogICAgdG9jX2Zsb2F0OiB0cnVlDQogICAgdG9jX2RlcHRoOiAyDQogICAgbnVtYmVyX3NlY3Rpb25zOiB0cnVlDQogICAgY29kZV9kb3dubG9hZDogdHJ1ZQ0KICAgIGNvZGVfZm9sZGluZzogaGlkZQ0KICB3b3JkX2RvY3VtZW50Og0KICAgIHRvYzogdHJ1ZQ0KICAgIHRvY19kZXB0aDogJzInDQogIHBkZl9kb2N1bWVudDoNCiAgICBsYXRleF9lbmdpbmU6IHhlbGF0ZXgNCi0tLQ0KDQpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRX0NCmtuaXRyOjpvcHRzX2NodW5rJHNldChjbGFzcy5zb3VyY2U9Im51bWJlckxpbmVzIGxpbmVBbmNob3JzIikNCmBgYA0KIyAqKlThu5VuZyBxdWFuIHbhu4EgYuG7mSBk4buvIGxp4buHdTppbnN1cmFuY2UqKg0KICAtIELhu5kgZOG7ryBsaeG7h3UgYuG6o28gaGnhu4NtIMSRxrDhu6NjIGzhuqV5IHThu6sgY3Xhu5FuIHPDoWNoICJIYW5kcy1PbiBNYWNoaW5lIExlYXJuaW5nIHdpdGggU2Npa2l0LUxlYXJuLCBLZXJhcyAmIFRlbnNvckZsb3ciIGPhu6dhIEF1csOpbGllbiBHw6lyb24uIEThu68gbGnhu4d1IGJhbyBn4buTbSB0aMO0bmcgdGluIHbhu4EgY8OhYyBjw6EgbmjDom4gxJHGsOG7o2MgYuG6o28gaGnhu4NtIHbDoCBjaGkgcGjDrSB5IHThur8gY+G7p2EgaOG7jS4gDQogIA0KYGBge3J9DQpsaWJyYXJ5KGNzdikNCmEgPC0gcmVhZC5jc3YoJ0M6L1VzZXJzL0FTVVMvRG93bmxvYWRzL2luc3VyYW5jZS5jc3YnLCBoZWFkZXI9IFQpDQoNCmBgYA0KDQogIC0gw50gbmdoxKlhIGPhu6dhIGPDoWMgY+G7mXQgdMOqbiBiaeG6v24gdHJvbmcgYuG7mSBk4buvIGxp4buHdToNCmBgYHtyfQ0KbmFtZXMoYSkNCmBgYA0KICAgIC0gYWdlOiBUdeG7lWkgY+G7p2EgbmfGsOG7nWkgdGjhu6UgaMaw4bufbmcgY2jDrW5oDQogICAgLSBzZXg6IEdp4bubaSB0w61uaCBj4bunYSBuZ8aw4budaSDEkcaw4bujYyBi4bqjbyBoaeG7g20gKG7hu68sIG5hbSkNCiAgICAtIGJtaTogQ2jhu4kgc+G7kSBraOG7kWkgY8ahIHRo4buDIChCTUkpDQogICAgLSBjaGlsZHJlbjogU+G7kSBjb24gxJHGsOG7o2MgYuG6o28gaGnhu4NtIC8gU+G7kSBuZ8aw4budaSBwaOG7pSB0aHXhu5ljDQogICAgLSBzbW9rZXI6IE5nxrDhu51pIGjDunQgdGh14buRYyAoQ8OzLCBLaMO0bmcpDQogICAgLSByZWdpb246IFbDuW5nIG7GoWkgbmfGsOG7nWkgxJHGsOG7o2MgYuG6o28gaGnhu4NtIHNpbmggc+G7kW5nICggxJDDtG5nIELhuq9jLCBUw6J5IELhuq9jLCBUcnVuZyBUw6J5LCBOYW0pDQogICAgLSBjaGFyZ2VzOiBDaGkgcGjDrSB5IHThur8NCg0KIyAqKlRp4bq/biBow6BuaCBwaMOibiB0w61jaCBi4buZIGThu68gbGnhu4d1Omluc3VyYW5jZSoqDQoNCiMjIEJp4buDdSDEkeG7kyBwaMOibiBi4buRIHR14buVaSB0w6FjOg0KYGBge3J9DQpsaWJyYXJ5KGdncGxvdDIpDQpsaWJyYXJ5KGRwbHlyKQ0KZ2dwbG90KGEpICsNCiAgZ2VvbV9iYXIoYWVzKHggPSBhZ2UsIGZpbGwgPSBzZXgpKSArDQogIGxhYnModGl0bGUgPSAiUGjDom4gYuG7kSB0deG7lWkgdMOhYyIsIHggPSAiVHXhu5VpIiwgeSA9ICJT4buRIGzGsOG7o25nIiwgZmlsbCA9ICJHaeG7m2kgdMOtbmgiKSArDQogIHNjYWxlX2ZpbGxfYnJld2VyKHBhbGV0dGUgPSAiU2V0MSIpICsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIpDQpgYGANCg0KLSAqR2nhuqNpIHRow61jaCDDvSBuZ2jEqWEgY8OidSBs4buHbmg6Kg0KICAtIGdncGxvdChhKTogS2jhu59pIHThuqFvIG3hu5l0IGdncGxvdCBvYmplY3QgdOG7qyBk4buvIGxp4buHdSDEkcaw4bujYyBsxrB1IHRy4buvIHRyb25nIGJp4bq/biBhLg0KDQogIC0gZ2VvbV9iYXIoYWVzKHggPSBhZ2UsIGZpbGwgPSBzZXgpKTogVGjDqm0gbGF5ZXIgYmnhu4N1IMSR4buTIGThuqFuZyB0aGFuaCB2w6BvIGdncGxvdCBvYmplY3QuDQoNCiAgICAtIGFlcyh4ID0gYWdlLCBmaWxsID0gc2V4KTogWMOhYyDEkeG7i25oIGPDoWMgYmnhur9uIMSRxrDhu6NjIHPhu60gZOG7pW5nIMSR4buDIHThuqFvIGJp4buDdSDEkeG7kzoNCiAgICAtIHggPSBhZ2U6IFRy4bulYyBob8OgbmggYmnhu4N1IHRo4buLICJUdeG7lWkiLg0KICAgIC0gZmlsbCA9IHNleDogTcOgdSBz4bqvYyB0aGFuaCBiaeG7g3UgxJHhu5MgdGjhu4MgaGnhu4duICJHaeG7m2kgdMOtbmgiLg0KICAtIGxhYnModGl0bGUgPSAiUGjDom4gYuG7kSB0deG7lWkgdMOhYyIsIHggPSAiVHXhu5VpIiwgeSA9ICJT4buRIGzGsOG7o25nIiwgZmlsbCA9ICJHaeG7m2kgdMOtbmgiKTogVGjDqm0gdGnDqnUgxJHhu4EgdsOgIGNow7ogdGjDrWNoIGNobyBjw6FjIHRy4bulYyB2w6AgcGjhuqduIHTDtCBtw6B1Lg0KDQogICAgLSB0aXRsZSA9ICJQaMOibiBi4buRIHR14buVaSB0w6FjIjogVGnDqnUgxJHhu4EgY2hvIGJp4buDdSDEkeG7ky4NCiAgICAtIHggPSAiVHXhu5VpIjogQ2jDuiB0aMOtY2ggY2hvIHRy4bulYyBob8OgbmguDQogICAgLSB5ID0gIlPhu5EgbMaw4bujbmciOiBDaMO6IHRow61jaCBjaG8gdHLhu6VjIHR1bmcuDQogICAgLSBmaWxsID0gIkdp4bubaSB0w61uaCI6IENow7ogdGjDrWNoIGNobyBwaOG6p24gdMO0IG3DoHUuDQogIC0gc2NhbGVfZmlsbF9icmV3ZXIocGFsZXR0ZSA9ICJTZXQxIik6IENo4buNbiBi4bqjbmcgbcOgdSAiU2V0MSIgdOG7qyBi4buZIG3DoHUgQnJld2VyIMSR4buDIHTDtCBtw6B1IGNobyBjw6FjIHRoYW5oIGJp4buDdSDEkeG7ky4NCg0KICAtIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iKTogRGkgY2h1eeG7g24gduG7iyB0csOtIGxlZ2VuZGEgeHXhu5FuZyBkxrDhu5tpIGPDuW5nIGPhu6dhIGJp4buDdSDEkeG7ky4NCg0KIyMgQmnhu4N1IMSR4buTIHBow6JuIGLhu5EgZ2nhu5tpIHTDrW5oOg0KYGBge3J9DQphICU+JSBncm91cF9ieShzZXgpICU+JSBzdW1tYXJpc2UoayA9IG4oKSkgJT4lDQogIGdncGxvdChhZXMoc2V4LGspKSArDQogICAgZ2VvbV9jb2woZmlsbD0nYnJvd24nKSArDQogICAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IGspLHZqdXN0ID0gMiwgY29sb3IgPSAnd2hpdGUnKSArDQogICAgbGFicyh0aXRsZSA9ICJQaMOibiBi4buRIGdp4bubaSB0w61uaCIsIHggPSAiR2nhu5tpIHTDrW5oIiwgeSA9ICJT4buRIGzGsOG7o25nIikNCmBgYA0KDQotICpHaeG6o2kgdGjDrWNoIMO9IG5naMSpYSBjw6J1IGzhu4duaDoqDQogICAgLSBhICU+JSBncm91cF9ieShzZXgpOiBOaMOzbSBk4buvIGxp4buHdSB0cm9uZyBiaeG6v24gYSB0aGVvIGJp4bq/biBzZXguDQoNCiAgICAtICU+JSBzdW1tYXJpc2UoayA9IG4oKSk6IFTDrW5oIHThu5VuZyBz4buRIGzGsOG7o25nIGLhuqNuIGdoaSB0cm9uZyBt4buXaSBuaMOzbSBnaeG7m2kgdMOtbmggdsOgIGzGsHUgdHLhu68ga+G6v3QgcXXhuqMgdHJvbmcgYmnhur9uIGsuDQoNCiAgICAtIGdncGxvdChhZXMoc2V4LGspKTogS2jhu59pIHThuqFvIG3hu5l0IGdncGxvdCBvYmplY3QgdOG7qyBk4buvIGxp4buHdSDEkcaw4bujYyBsxrB1IHRy4buvIHRyb25nIGJp4bq/biBrIHbhu5tpIGPDoWMgYmnhur9uIHNleCB2w6AgayDEkcaw4bujYyBz4butIGThu6VuZyDEkeG7gyB04bqhbyBiaeG7g3UgxJHhu5MuDQoNCiAgICAtIGdlb21fY29sKGZpbGw9J2Jyb3duJyk6IFRow6ptIGxheWVyIGJp4buDdSDEkeG7kyBk4bqhbmcgY+G7mXQgdsOgbyBnZ3Bsb3Qgb2JqZWN0IHbhu5tpIG3DoHUgbsOidS4NCg0KICAgIC0gZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IGspLHZqdXN0ID0gMiwgY29sb3IgPSAnd2hpdGUnKTogVGjDqm0gbGF5ZXIgdsSDbiBi4bqjbiBoaeG7g24gdGjhu4sgZ2nDoSB0cuG7iyBrIGLDqm4gdHLDqm4gbeG7l2kgY+G7mXQgduG7m2kgbcOgdSB0cuG6r25nIHbDoCB24buLIHRyw60gxJHGsOG7o2MgxJFp4buBdSBjaOG7iW5oIGzDqm4gY2FvIG3hu5l0IGNow7p0Lg0KDQogICAgLSBsYWJzKHRpdGxlID0gIlBow6JuIGLhu5EgZ2nhu5tpIHTDrW5oIiwgeCA9ICJHaeG7m2kgdMOtbmgiLCB5ID0gIlPhu5EgbMaw4bujbmciKTogVGjDqm0gdGnDqnUgxJHhu4EgdsOgIGNow7ogdGjDrWNoIGNobyBjw6FjIHRy4bulYy4NCg0KIyMgQmnhu4N1IMSR4buTIG3huq10IMSR4buZIHBow6JuIGLhu5EgQk1JOg0KYGBge3J9DQpnZ3Bsb3QoYSkgKw0KICBnZW9tX2RlbnNpdHkoYWVzKHggPSBibWkpLCBmaWxsPSAnbmF2eScpICsNCiAgDQogIGxhYnModGl0bGUgPSAiUGjDom4gYuG7kSBCTUkiLCB4ID0gIkJNSSIsIHkgPSAiTeG6rXQgxJHhu5kiKQ0KYGBgDQoNCi0gKkdp4bqjaSB0aMOtY2ggw70gbmdoxKlhIGPDonUgbOG7h25oOiogDQogIC0gZ2dwbG90KGEpOiBLaOG7n2kgdOG6oW8gbeG7mXQgZ2dwbG90IG9iamVjdCB04burIGThu68gbGnhu4d1IMSRxrDhu6NjIGzGsHUgdHLhu68gdHJvbmcgYmnhur9uIGEuDQoNCiAgLSBnZW9tX2RlbnNpdHkoYWVzKHggPSBibWkpLCBmaWxsPSAnbmF2eScpOiBUaMOqbSBsYXllciBiaeG7g3UgxJHhu5MgbeG6rXQgxJHhu5kgdsOgbyBnZ3Bsb3Qgb2JqZWN0Lg0KDQogICAgLSBhZXMoeCA9IGJtaSk6IFjDoWMgxJHhu4tuaCBiaeG6v24gYm1pIMSRxrDhu6NjIHPhu60gZOG7pW5nIMSR4buDIHThuqFvIGJp4buDdSDEkeG7kyBt4bqtdCDEkeG7mS4NCiAgICAtIGZpbGw9ICduYXZ5Jzo6IFTDtCBtw6B1IGNobyBiaeG7g3UgxJHhu5MgbeG6rXQgxJHhu5kgYuG6sW5nIG3DoHUgeGFuaCBuYXZ5Lg0KICAtIGxhYnModGl0bGUgPSAiUGjDom4gYuG7kSBCTUkiLCB4ID0gIkJNSSIsIHkgPSAiTeG6rXQgxJHhu5kiKTogVGjDqm0gdGnDqnUgxJHhu4EgdsOgIGNow7ogdGjDrWNoIGNobyBjw6FjIHRy4bulYy4NCg0KICAgIC0gdGl0bGUgPSAiUGjDom4gYuG7kSBCTUkiOiBUacOqdSDEkeG7gSBjaG8gYmnhu4N1IMSR4buTLg0KICAgIC0geCA9ICJCTUkiOiBDaMO6IHRow61jaCBjaG8gdHLhu6VjIGhvw6BuaC4NCiAgICAtIHkgPSAiTeG6rXQgxJHhu5kiOiBDaMO6IHRow61jaCBjaG8gdHLhu6VjIHR1bmcuDQoNCg0KIyMgQmnhu4N1IMSR4buTIGJveHBsb3QgIGNobyBjaGkgcGjDrSB5IHThur8gdGhlbyBnaeG7m2kgdMOtbmg6DQpgYGB7cn0NCmdncGxvdChhKSArDQogIGdlb21fYm94cGxvdChhZXMoeCA9IHNleCwgeSA9IGNoYXJnZXMpKSArDQogIGxhYnModGl0bGUgPSAiQ2hpIHBow60geSB04bq/IHRoZW8gZ2nhu5tpIHTDrW5oIiwgeCA9ICJHaeG7m2kgdMOtbmgiLCB5ID0gIkNoaSBwaMOtIHkgdOG6vyAoVVNEKSIpDQoNCmBgYA0KDQotICpHaeG6o2kgdGjDrWNoIMO9IG5naMSpYSBjw6J1IGzhu4duaDoqDQoNCiAgLSBnZ3Bsb3QoYSk6IEto4bufaSB04bqhbyBt4buZdCBnZ3Bsb3Qgb2JqZWN0IHThu6sgZOG7ryBsaeG7h3UgxJHGsOG7o2MgbMawdSB0cuG7ryB0cm9uZyBiaeG6v24gYS4NCg0KICAtIGdlb21fYm94cGxvdChhZXMoeCA9IHNleCwgeSA9IGNoYXJnZXMpKTogVGjDqm0gbGF5ZXIgYmnhu4N1IMSR4buTIGjhu5lwIHbDoG8gZ2dwbG90IG9iamVjdC4NCg0KICAgIC0gYWVzKHggPSBzZXgsIHkgPSBjaGFyZ2VzKTogWMOhYyDEkeG7i25oIGJp4bq/biBzZXggdsOgIGNoYXJnZXMgxJHGsOG7o2Mgc+G7rSBk4bulbmcgxJHhu4MgdOG6oW8gYmnhu4N1IMSR4buTIGjhu5lwLg0KICAgIC0geCA9IHNleDogVHLhu6VjIGhvw6BuaCB0aOG7gyBoaeG7h24gIkdp4bubaSB0w61uaCIuDQogICAgLSB5ID0gY2hhcmdlczogVHLhu6VjIHR1bmcgdGjhu4MgaGnhu4duICJDaGkgcGjDrSB5IHThur8gKFVTRCkiLg0KICAtIGxhYnModGl0bGUgPSAiQ2hpIHBow60geSB04bq/IHRoZW8gZ2nhu5tpIHTDrW5oIiwgeCA9ICJHaeG7m2kgdMOtbmgiLCB5ID0gIkNoaSBwaMOtIHkgdOG6vyAoVVNEKSIpOiBUaMOqbSB0acOqdSDEkeG7gSB2w6AgY2jDuiB0aMOtY2ggY2hvIGPDoWMgdHLhu6VjLg0KDQogICAgLSB0aXRsZSA9ICJDaGkgcGjDrSB5IHThur8gdGhlbyBnaeG7m2kgdMOtbmgiOiBUacOqdSDEkeG7gSBjaG8gYmnhu4N1IMSR4buTLg0KICAgIC0geCA9ICJHaeG7m2kgdMOtbmgiOiBDaMO6IHRow61jaCBjaG8gdHLhu6VjIGhvw6BuaC4NCiAgICAtIHkgPSAiQ2hpIHBow60geSB04bq/IChVU0QpIjogQ2jDuiB0aMOtY2ggY2hvIHRy4bulYyB0dW5nLg0KDQojI0Jp4buDdSDEkeG7kyBwaMOibiBi4buRIGtodSB24buxYzoNCg0KYGBge3J9DQphICU+JSBncm91cF9ieShyZWdpb24pICU+JSBzdW1tYXJpc2UoayA9IG4oKSkgJT4lDQogIGdncGxvdChhZXMocmVnaW9uLGspKSArDQogICAgZ2VvbV9jb2woZmlsbD0nc2t5Ymx1ZScpICsNCiAgICBnZW9tX3RleHQoYWVzKGxhYmVsID0gayksdmp1c3QgPSAyLCBjb2xvciA9ICd3aGl0ZScpICsNCiAgICBsYWJzKHRpdGxlID0gIlBow6JuIGLhu5Ega2h1IHbhu7FjIiwgeCA9ICdLaHUgduG7sWMnLCB5ID0gJ1Phu5EgbMaw4bujbmcnKQ0KYGBgDQoNCi0gKkdp4bqjaSB0aMOtY2ggw70gbmdoxKlhIGPDonUgbOG7h25oOioNCg0KICAtIGEgJT4lIGdyb3VwX2J5KHJlZ2lvbik6IE5ow7NtIGThu68gbGnhu4d1IHRyb25nIGJp4bq/biBhIHRoZW8gYmnhur9uIHJlZ2lvbi4NCg0KICAtICU+JSBzdW1tYXJpc2UoayA9IG4oKSk6IFTDrW5oIHThu5VuZyBz4buRIGzGsOG7o25nIGLhuqNuIGdoaSB0cm9uZyBt4buXaSBuaMOzbSBraHUgduG7sWMgdsOgIGzGsHUgdHLhu68ga+G6v3QgcXXhuqMgdHJvbmcgYmnhur9uIGsuDQoNCiAgLSBnZ3Bsb3QoYWVzKHJlZ2lvbixrKSk6IEto4bufaSB04bqhbyBt4buZdCBnZ3Bsb3Qgb2JqZWN0IHThu6sgZOG7ryBsaeG7h3UgxJHGsOG7o2MgbMawdSB0cuG7ryB0cm9uZyBiaeG6v24gayB24bubaSBjw6FjIGJp4bq/biByZWdpb24gdsOgIGsgxJHGsOG7o2Mgc+G7rSBk4bulbmcgxJHhu4MgdOG6oW8gYmnhu4N1IMSR4buTLg0KDQogIC0gZ2VvbV9jb2woZmlsbD0nc2t5Ymx1ZScpOiBUaMOqbSBsYXllciBiaeG7g3UgxJHhu5MgZOG6oW5nIGPhu5l0IHbDoG8gZ2dwbG90IG9iamVjdCB24bubaSBtw6B1IHhhbmggZGEgdHLhu51pLg0KDQogIC0gZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IGspLHZqdXN0ID0gMiwgY29sb3IgPSAnd2hpdGUnKTogVGjDqm0gbGF5ZXIgdsSDbiBi4bqjbiBoaeG7g24gdGjhu4sgZ2nDoSB0cuG7iyBrIGLDqm4gdHLDqm4gbeG7l2kgY+G7mXQgduG7m2kgbcOgdSB0cuG6r25nIHbDoCB24buLIHRyw60gxJHGsOG7o2MgxJFp4buBdSBjaOG7iW5oIGzDqm4gY2FvIG3hu5l0IGNow7p0Lg0KDQogIC0gbGFicyh0aXRsZSA9ICJQaMOibiBi4buRIGtodSB24buxYyIsIHggPSAnS2h1IHbhu7FjJywgeSA9ICdT4buRIGzGsOG7o25nJyk6IFRow6ptIHRpw6p1IMSR4buBIHbDoCBjaMO6IHRow61jaCBjaG8gY8OhYyB0cuG7pWMuDQoNCiMjIEJp4buDdSDEkeG7kyBt4bqtdCDEkeG7mSB0deG7lWkgdMOhYzoNCg0KYGBge3J9DQpnZ3Bsb3QoYSkgKw0KICBnZW9tX2RlbnNpdHkoYWVzKHggPSBhZ2UpLCBmaWxsPSAncGluaycpICsNCiAgbGFicyh0aXRsZSA9ICJQaMOibiBi4buRIG3huq10IMSR4buZIHR14buVaSB0w6FjIiwgeCA9ICJUdeG7lWkiLCB5ID0gIk3huq10IMSR4buZIikNCmBgYA0KDQotICpHaeG6o2kgdGjDrWNoIMO9IG5naMSpYSBjw6J1IGzhu4duaDoqDQoNCiAgLSBnZ3Bsb3QoYSk6IEto4bufaSB04bqhbyBt4buZdCBnZ3Bsb3Qgb2JqZWN0IHThu6sgZOG7ryBsaeG7h3UgxJHGsOG7o2MgbMawdSB0cuG7ryB0cm9uZyBiaeG6v24gYS4NCg0KICAtIGdlb21fZGVuc2l0eShhZXMoeCA9IGFnZSksIGZpbGw9ICdwaW5rJyk6IFRow6ptIGxheWVyIGJp4buDdSDEkeG7kyBt4bqtdCDEkeG7mSB2w6BvIGdncGxvdCBvYmplY3QuDQoNCiAgICAtIGFlcyh4ID0gYWdlKTogWMOhYyDEkeG7i25oIGJp4bq/biBhZ2UgxJHGsOG7o2Mgc+G7rSBk4bulbmcgxJHhu4MgdOG6oW8gYmnhu4N1IMSR4buTIG3huq10IMSR4buZLg0KICAgIC0gZmlsbD0gJ3BpbmsnOjogVMO0IG3DoHUgY2hvIGJp4buDdSDEkeG7kyBt4bqtdCDEkeG7mSBi4bqxbmcgbcOgdSBo4buTbmcuDQogIC0gbGFicyh0aXRsZSA9ICJQaMOibiBi4buRIG3huq10IMSR4buZIHR14buVaSB0w6FjIiwgeCA9ICJUdeG7lWkiLCB5ID0gIk3huq10IMSR4buZIik6IFRow6ptIHRpw6p1IMSR4buBIHbDoCBjaMO6IHRow61jaCBjaG8gY8OhYyB0cuG7pWMuDQoNCiAgICAtIHRpdGxlID0gIlBow6JuIGLhu5EgbeG6rXQgxJHhu5kgdHXhu5VpIHTDoWMiOiBUacOqdSDEkeG7gSBjaG8gYmnhu4N1IMSR4buTLg0KICAgIC0geCA9ICJUdeG7lWkiOiBDaMO6IHRow61jaCBjaG8gdHLhu6VjIGhvw6BuaC4NCiAgICAtIHkgPSAiTeG6rXQgxJHhu5kiOiBDaMO6IHRow61jaCBjaG8gdHLhu6VjIHR1bmcuDQoNCiMjIEJp4buDdSDEkeG7kyBt4bqtdCDEkeG7mSBjaGkgcGjDrSB5IHThur8gdGhlbyBnaeG7m2kgdMOtbmg6DQpgYGB7cn0NCmdncGxvdChhKSArDQogIGdlb21fZGVuc2l0eShhZXMoeCA9IGNoYXJnZXMsIGZpbGwgPSBzZXgpKSArDQogIGxhYnModGl0bGUgPSAiUGjDom4gYuG7kSBjaGkgcGjDrSB5IHThur8gdGhlbyBnaeG7m2kgdMOtbmgiLCB4ID0gIkNoaSBwaMOtIHkgdOG6vyAoVVNEKSIsIHkgPSAiTeG6rXQgxJHhu5kiLCBmaWxsID0gIkdp4bubaSB0w61uaCIpICsNCiAgc2NhbGVfZmlsbF9icmV3ZXIocGFsZXR0ZSA9ICJTZXQzIikgKw0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIikNCmBgYA0KDQotICpHaeG6o2kgdGjDrWNoIMO9IG5naMSpYSBjw6J1IGzhu4duaDoqDQogIC0gZ2dwbG90KGEpOiBLaOG7n2kgdOG6oW8gbeG7mXQgZ2dwbG90IG9iamVjdCB04burIGThu68gbGnhu4d1IMSRxrDhu6NjIGzGsHUgdHLhu68gdHJvbmcgYmnhur9uIGEuDQoNCiAgLSBnZW9tX2RlbnNpdHkoYWVzKHggPSBjaGFyZ2VzLCBmaWxsID0gc2V4KSk6IFRow6ptIGxheWVyIGJp4buDdSDEkeG7kyBt4bqtdCDEkeG7mSB2w6BvIGdncGxvdCBvYmplY3QuDQoNCiAgICAtIGFlcyh4ID0gY2hhcmdlcywgZmlsbCA9IHNleCk6IFjDoWMgxJHhu4tuaCBiaeG6v24gY2hhcmdlcyB2w6Agc2V4IMSRxrDhu6NjIHPhu60gZOG7pW5nIMSR4buDIHThuqFvIGJp4buDdSDEkeG7kyBt4bqtdCDEkeG7mS4NCiAgICAtIHggPSBjaGFyZ2VzOiBUcuG7pWMgaG/DoG5oIHRo4buDIGhp4buHbiAiQ2hpIHBow60geSB04bq/IChVU0QpIi4NCiAgICAtIGZpbGwgPSBzZXg6IE3DoHUgc+G6r2MgYmnhu4N1IMSR4buTIG3huq10IMSR4buZIHRo4buDIGhp4buHbiAiR2nhu5tpIHTDrW5oIi4NCiAgLSBsYWJzKHRpdGxlID0gIlBow6JuIGLhu5EgY2hpIHBow60geSB04bq/IHRoZW8gZ2nhu5tpIHTDrW5oIiwgeCA9ICJDaGkgcGjDrSB5IHThur8gKFVTRCkiLCB5ID0gIk3huq10IMSR4buZIiwgZmlsbCA9ICJHaeG7m2kgdMOtbmgiKTogVGjDqm0gdGnDqnUgxJHhu4EsIGNow7ogdGjDrWNoIGNobyBjw6FjIHRy4bulYyB2w6AgcGjhuqduIHTDtCBtw6B1Lg0KDQogICAgLSB0aXRsZSA9ICJQaMOibiBi4buRIGNoaSBwaMOtIHkgdOG6vyB0aGVvIGdp4bubaSB0w61uaCI6IFRpw6p1IMSR4buBIGNobyBiaeG7g3UgxJHhu5MuDQogICAgLSB4ID0gIkNoaSBwaMOtIHkgdOG6vyAoVVNEKSI6IENow7ogdGjDrWNoIGNobyB0cuG7pWMgaG/DoG5oLg0KICAgIC0geSA9ICJN4bqtdCDEkeG7mSI6IENow7ogdGjDrWNoIGNobyB0cuG7pWMgdHVuZy4NCiAgICAtIGZpbGwgPSAiR2nhu5tpIHTDrW5oIjogQ2jDuiB0aMOtY2ggY2hvIHBo4bqnbiB0w7QgbcOgdS4NCiAgLSBzY2FsZV9maWxsX2JyZXdlcihwYWxldHRlID0gIlNldDMiKTogQ2jhu41uIGLhuqNuZyBtw6B1ICJTZXQzIiB04burIGLhu5kgbcOgdSBCcmV3ZXIgxJHhu4MgdMO0IG3DoHUgY2hvIGPDoWMga2h1IHbhu7FjIG3huq10IMSR4buZIHRoZW8gZ2nhu5tpIHTDrW5oLg0KDQogIC0gdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIpOiBEaSBjaHV54buDbiB24buLIHRyw60gbGVnZW5kYSB4deG7kW5nIGTGsOG7m2kgY8O5bmcgY+G7p2EgYmnhu4N1IMSR4buTLg0KDQojIyBCaeG7g3UgxJHhu5MgbeG6rXQgxJHhu5kgY2hpIHBow60geSB04bq/IHRoZW8ga2h1IHbhu7FjOg0KYGBge3J9DQpnZ3Bsb3QoYSkgKw0KICBnZW9tX2RlbnNpdHkoYWVzKHggPSBjaGFyZ2VzLCBmaWxsID0gcmVnaW9uKSkgKw0KICBsYWJzKHRpdGxlID0gIlBow6JuIGLhu5EgY2hpIHBow60geSB04bq/IHRoZW8ga2h1IHbhu7FjIiwgeCA9ICJDaGkgcGjDrSB5IHThur8gKFVTRCkiLCB5ID0gIk3huq10IMSR4buZIiwgZmlsbCA9ICJLaHUgduG7sWMiKSArDQogIHNjYWxlX2ZpbGxfYnJld2VyKHBhbGV0dGUgPSAiU2V0MyIpICsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIpDQpgYGANCg0KLSAqR2nhuqNpIHRow61jaCDDvSBuZ2jEqWEgY8OidSBs4buHbmg6Kg0KICAtIGdncGxvdChhKTogS2jhu59pIHThuqFvIG3hu5l0IGdncGxvdCBvYmplY3QgdOG7qyBk4buvIGxp4buHdSDEkcaw4bujYyBsxrB1IHRy4buvIHRyb25nIGJp4bq/biBhLg0KDQogIC0gZ2VvbV9kZW5zaXR5KGFlcyh4ID0gY2hhcmdlcywgZmlsbCA9IHJlZ2lvbikpOiBUaMOqbSBsYXllciBiaeG7g3UgxJHhu5MgbeG6rXQgxJHhu5kgdsOgbyBnZ3Bsb3Qgb2JqZWN0Lg0KDQphZXMoeCA9IGNoYXJnZXMsIGZpbGwgPSByZWdpb24pOiBYw6FjIMSR4buLbmggYmnhur9uIGNoYXJnZXMgdsOgIHJlZ2lvbiDEkcaw4bujYyBz4butIGThu6VuZyDEkeG7gyB04bqhbyBiaeG7g3UgxJHhu5MgbeG6rXQgxJHhu5kuDQp4ID0gY2hhcmdlczogVHLhu6VjIGhvw6BuaCB0aOG7gyBoaeG7h24gIkNoaSBwaMOtIHkgdOG6vyAoVVNEKSIuDQpmaWxsID0gcmVnaW9uOiBNw6B1IHPhuq9jIGJp4buDdSDEkeG7kyBt4bqtdCDEkeG7mSB0aOG7gyBoaeG7h24gIktodSB24buxYyIuDQogIC0gbGFicyh0aXRsZSA9ICJQaMOibiBi4buRIGNoaSBwaMOtIHkgdOG6vyB0aGVvIGtodSB24buxYyIsIHggPSAiQ2hpIHBow60geSB04bq/IChVU0QpIiwgeSA9ICJN4bqtdCDEkeG7mSIsIGZpbGwgPSAiS2h1IHbhu7FjIik6IFRow6ptIHRpw6p1IMSR4buBLCBjaMO6IHRow61jaCBjaG8gY8OhYyB0cuG7pWMgdsOgIHBo4bqnbiB0w7QgbcOgdS4NCg0KdGl0bGUgPSAiUGjDom4gYuG7kSBjaGkgcGjDrSB5IHThur8gdGhlbyBraHUgduG7sWMiOiBUacOqdSDEkeG7gSBjaG8gYmnhu4N1IMSR4buTLg0KeCA9ICJDaGkgcGjDrSB5IHThur8gKFVTRCkiOiBDaMO6IHRow61jaCBjaG8gdHLhu6VjIGhvw6BuaC4NCnkgPSAiTeG6rXQgxJHhu5kiOiBDaMO6IHRow61jaCBjaG8gdHLhu6VjIHR1bmcuDQpmaWxsID0gIktodSB24buxYyI6IENow7ogdGjDrWNoIGNobyBwaOG6p24gdMO0IG3DoHUuDQogIC0gc2NhbGVfZmlsbF9icmV3ZXIocGFsZXR0ZSA9ICJTZXQzIik6IENo4buNbiBi4bqjbmcgbcOgdSAiU2V0MyIgdOG7qyBi4buZIG3DoHUgQnJld2VyIMSR4buDIHTDtCBtw6B1IGNobyBjw6FjIGtodSB24buxYyBt4bqtdCDEkeG7mSB0aGVvIGtodSB24buxYy4NCg0KICAtIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iKTogRGkgY2h1eeG7g24gduG7iyB0csOtIGxlZ2VuZGEgeHXhu5FuZyBkxrDhu5tpIGPDuW5nIGPhu6dhIGJp4buDdSDEkeG7ky4NCg0KIyMgQmnhu4N1IMSR4buTIGhpc3RvZ3JhbSBCTUkgdGhlbyBnaeG7m2kgdMOtbmg6DQpgYGB7cn0NCmdncGxvdChhKSArDQogIGdlb21faGlzdG9ncmFtKGFlcyh4ID0gYm1pLCBmaWxsID0gc2V4KSkgKw0KICBsYWJzKHRpdGxlID0gIlBow6JuIGLhu5EgQk1JIHRoZW8gZ2nhu5tpIHTDrW5oIiwgeCA9ICJCTUkiLCB5ID0gIlPhu5EgbMaw4bujbmciLCBmaWxsID0gIkdp4bubaSB0w61uaCIpICsNCiAgc2NhbGVfZmlsbF9icmV3ZXIocGFsZXR0ZSA9ICJTZXQyIikgKw0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIikNCmBgYA0KDQotICpHaeG6o2kgdGjDrWNoIMO9IG5naMSpYSBjw6J1IGzhu4duaDoqDQoNCiAgLSBnZ3Bsb3QoYSk6IEto4bufaSB04bqhbyBt4buZdCBnZ3Bsb3Qgb2JqZWN0IHThu6sgZOG7ryBsaeG7h3UgxJHGsOG7o2MgbMawdSB0cuG7ryB0cm9uZyBiaeG6v24gYS4NCg0KICAtIGdlb21faGlzdG9ncmFtKGFlcyh4ID0gYm1pLCBmaWxsID0gc2V4KSk6IFRow6ptIGxheWVyIGJp4buDdSDEkeG7kyBoaXN0b2dyYW0gdsOgbyBnZ3Bsb3Qgb2JqZWN0Lg0KDQogICAgLSBhZXMoeCA9IGJtaSwgZmlsbCA9IHNleCk6IFjDoWMgxJHhu4tuaCBiaeG6v24gYm1pIHbDoCBzZXggxJHGsOG7o2Mgc+G7rSBk4bulbmcgxJHhu4MgdOG6oW8gYmnhu4N1IMSR4buTIGhpc3RvZ3JhbS4NCiAgICAtIHggPSBibWk6IFRy4bulYyBob8OgbmggdGjhu4MgaGnhu4duICJDaOG7iSBz4buRIEJNSSIuDQogICAgLSBmaWxsID0gc2V4OiBNw6B1IHPhuq9jIGPhu6dhIGPDoWMgY+G7mXQgaGlzdG9ncmFtIHRo4buDIGhp4buHbiAiR2nhu5tpIHTDrW5oIi4NCiAgLSBsYWJzKHRpdGxlID0gIlBow6JuIGLhu5EgQk1JIHRoZW8gZ2nhu5tpIHTDrW5oIiwgeCA9ICJCTUkiLCB5ID0gIlPhu5EgbMaw4bujbmciLCAgICAgLSBmaWxsID0gIkdp4bubaSB0w61uaCIpOiBUaMOqbSB0acOqdSDEkeG7gSwgY2jDuiB0aMOtY2ggY2hvIGPDoWMgdHLhu6VjIHbDoCBwaOG6p24gdMO0IG3DoHUuDQoNCiAgICAtIHRpdGxlID0gIlBow6JuIGLhu5EgQk1JIHRoZW8gZ2nhu5tpIHTDrW5oIjogVGnDqnUgxJHhu4EgY2hvIGJp4buDdSDEkeG7ky4NCiAgICAtIHggPSAiQk1JIjogQ2jDuiB0aMOtY2ggY2hvIHRy4bulYyBob8OgbmguDQogICAgLSB5ID0gIlPhu5EgbMaw4bujbmciOiBDaMO6IHRow61jaCBjaG8gdHLhu6VjIHR1bmcuDQogICAgLSBmaWxsID0gIkdp4bubaSB0w61uaCI6IENow7ogdGjDrWNoIGNobyBwaOG6p24gdMO0IG3DoHUuDQogIC0gc2NhbGVfZmlsbF9icmV3ZXIocGFsZXR0ZSA9ICJTZXQyIik6IENo4buNbiBi4bqjbmcgbcOgdSAiU2V0MiIgdOG7qyBi4buZIG3DoHUgQnJld2VyIMSR4buDIHTDtCBtw6B1IGNobyBjw6FjIGPhu5l0IGhpc3RvZ3JhbSB0aGVvIGdp4bubaSB0w61uaC4NCg0KICAtIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iKTogRGkgY2h1eeG7g24gduG7iyB0csOtIGxlZ2VuZGEgeHXhu5FuZyBkxrDhu5tpIGPDuW5nIGPhu6dhIGJp4buDdSDEkeG7ky4gDQogIA0KIyMgQmnhu4N1IMSR4buTIGhpc3RvZ3JhbSBjaGkgcGjDrSB5IHThur8gdGhlbyB0w6xuaCB0cuG6oW5nIGjDunQgdGh14buRYzoNCmBgYHtyfQ0KZ2dwbG90KGEpICsNCiAgZ2VvbV9oaXN0b2dyYW0oYWVzKHggPSBjaGFyZ2VzLCBmaWxsID0gc21va2VyKSkgKw0KICBsYWJzKHRpdGxlID0gIlBow6JuIGLhu5EgY2hpIHBow60geSB04bq/IHRoZW8gdMOsbmggdHLhuqFuZyBow7p0IHRodeG7kWMiLCB4ID0gIkNoaSBwaMOtIHkgdOG6vyAoVVNEKSIsIHkgPSAiU+G7kSBsxrDhu6NuZyIsIGZpbGwgPSAiSMO6dCB0aHXhu5FjIikgKw0KICBzY2FsZV9maWxsX2JyZXdlcihwYWxldHRlID0gIlNldDIiKSArDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iKQ0KYGBgDQoNCi0gKkdp4bqjaSB0aMOtY2ggw70gbmdoxKlhIGPDonUgbOG7h25oOioNCg0KICAtIGdncGxvdChhKTogS2jhu59pIHThuqFvIG3hu5l0IGdncGxvdCBvYmplY3QgdOG7qyBk4buvIGxp4buHdSDEkcaw4bujYyBsxrB1IHRy4buvIHRyb25nIGJp4bq/biBhLg0KDQogIC0gZ2VvbV9oaXN0b2dyYW0oYWVzKHggPSBjaGFyZ2VzLCBmaWxsID0gc21va2VyKSk6IFRow6ptIGxheWVyIGJp4buDdSDEkeG7kyBoaXN0b2dyYW0gdsOgbyBnZ3Bsb3Qgb2JqZWN0Lg0KDQogICAgLSBhZXMoeCA9IGNoYXJnZXMsIGZpbGwgPSBzbW9rZXIpOiBYw6FjIMSR4buLbmggYmnhur9uIGNoYXJnZXMgdsOgIHNtb2tlciDEkcaw4bujYyBz4butIGThu6VuZyDEkeG7gyB04bqhbyBiaeG7g3UgxJHhu5MgaGlzdG9ncmFtLg0KICAgIC0geCA9IGNoYXJnZXM6IFRy4bulYyBob8OgbmggdGjhu4MgaGnhu4duICJDaGkgcGjDrSB5IHThur8gKFVTRCkiLg0KICAgIC0gZmlsbCA9IHNtb2tlcjogTcOgdSBz4bqvYyBj4bunYSBjw6FjIGPhu5l0IGhpc3RvZ3JhbSB0aOG7gyBoaeG7h24gIlTDrG5oIHRy4bqhbmcgaMO6dCB0aHXhu5FjIiAoSMO6dCB0aHXhu5FjLCBLaMO0bmcgaMO6dCB0aHXhu5FjKS4NCiAgLSBsYWJzKHRpdGxlID0gIlBow6JuIGLhu5EgY2hpIHBow60geSB04bq/IHRoZW8gdMOsbmggdHLhuqFuZyBow7p0IHRodeG7kWMiLCB4ID0gIkNoaSBwaMOtIHkgdOG6vyAoVVNEKSIsIHkgPSAiU+G7kSBsxrDhu6NuZyIsIGZpbGwgPSAiSMO6dCB0aHXhu5FjIik6IFRow6ptIHRpw6p1IMSR4buBLCBjaMO6IHRow61jaCBjaG8gY8OhYyB0cuG7pWMgdsOgIHBo4bqnbiB0w7QgbcOgdS4NCg0KICAgIC0gdGl0bGUgPSAiUGjDom4gYuG7kSBjaGkgcGjDrSB5IHThur8gdGhlbyB0w6xuaCB0cuG6oW5nIGjDunQgdGh14buRYyI6IFRpw6p1IMSR4buBIGNobyBiaeG7g3UgxJHhu5MuDQogICAgLSB4ID0gIkNoaSBwaMOtIHkgdOG6vyAoVVNEKSI6IENow7ogdGjDrWNoIGNobyB0cuG7pWMgaG/DoG5oLg0KICAgIC0geSA9ICJT4buRIGzGsOG7o25nIjogQ2jDuiB0aMOtY2ggY2hvIHRy4bulYyB0dW5nLg0KICAgIC0gZmlsbCA9ICJIw7p0IHRodeG7kWMiOiBDaMO6IHRow61jaCBjaG8gcGjhuqduIHTDtCBtw6B1Lg0KICAtIHNjYWxlX2ZpbGxfYnJld2VyKHBhbGV0dGUgPSAiU2V0MiIpOiBDaOG7jW4gYuG6o25nIG3DoHUgIlNldDIiIHThu6sgYuG7mSBtw6B1IEJyZXdlciDEkeG7gyB0w7QgbcOgdSBjaG8gY8OhYyBj4buZdCBoaXN0b2dyYW0gdGhlbyB0w6xuaCB0cuG6oW5nIGjDunQgdGh14buRYy4NCg0KICAtIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iKTogRGkgY2h1eeG7g24gduG7iyB0csOtIGxlZ2VuZGEgeHXhu5FuZyBkxrDhu5tpIGPDuW5nIGPhu6dhIGJp4buDdSDEkeG7ky4gDQogIA0KIyMgQmnhu4N1IMSR4buTIGhpc3RvZ3JhbSBjaGkgcGjDrSB5IHThur8gdGhlbyB0cuG6uyBlbToNCmBgYHtyfQ0KZ2dwbG90KGEpICsNCiAgZ2VvbV9oaXN0b2dyYW0oYWVzKHggPSBjaGFyZ2VzLCBmaWxsID0gZmFjdG9yKGNoaWxkcmVuKSkpICsNCiAgbGFicyh0aXRsZSA9ICJQaMOibiBi4buRIGNoaSBwaMOtIHkgdOG6vyB0aGVvIHRy4bq7IGVtIiwgeCA9ICJDaGkgcGjDrSB5IHThur8gKFVTRCkiLCB5ID0gIlPhu5EgbMaw4bujbmciLCBmaWxsID0gIlRy4bq7IGVtIikgKw0KICBzY2FsZV9maWxsX2JyZXdlcihwYWxldHRlID0gIlNldDIiKSArDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iKQ0KYGBgDQoNCi0gKkdp4bqjaSB0aMOtY2ggw70gbmdoxKlhIGPDonUgbOG7h25oOioNCiAgLSBnZ3Bsb3QoYSk6IEto4bufaSB04bqhbyBt4buZdCBnZ3Bsb3Qgb2JqZWN0IHThu6sgZOG7ryBsaeG7h3UgxJHGsOG7o2MgbMawdSB0cuG7ryB0cm9uZyBiaeG6v24gYS4NCg0KICAtIGdlb21faGlzdG9ncmFtKGFlcyh4ID0gY2hhcmdlcywgZmlsbCA9IGZhY3RvcihjaGlsZHJlbikpKTogVGjDqm0gbGF5ZXIgYmnhu4N1IMSR4buTIGhpc3RvZ3JhbSB2w6BvIGdncGxvdCBvYmplY3QuDQoNCiAgICAtIGFlcyh4ID0gY2hhcmdlcywgZmlsbCA9IGZhY3RvcihjaGlsZHJlbikpOiBYw6FjIMSR4buLbmggYmnhur9uIGNoYXJnZXMgdsOgIGNoaWxkcmVuIMSRxrDhu6NjIHPhu60gZOG7pW5nIMSR4buDIHThuqFvIGJp4buDdSDEkeG7kyBoaXN0b2dyYW0uDQogICAgLSB4ID0gY2hhcmdlczogVHLhu6VjIGhvw6BuaCB0aOG7gyBoaeG7h24gIkNoaSBwaMOtIHkgdOG6vyAoVVNEKSIuDQogICAgLSBmaWxsID0gZmFjdG9yKGNoaWxkcmVuKTogTcOgdSBz4bqvYyBj4bunYSBjw6FjIGPhu5l0IGhpc3RvZ3JhbSB0aOG7gyBoaeG7h24gIlPhu5EgY29uIiAoQ8OzIGNvbiwgS2jDtG5nIGNvbikuDQogICAgLSBmYWN0b3IoY2hpbGRyZW4pOiBDaHV54buDbiDEkeG7lWkgYmnhur9uIGNoaWxkcmVuIHRow6BuaCBk4bqhbmcgZmFjdG9yIMSR4buDIHPhu60gZOG7pW5nIHRyb25nIGJp4buDdSDEkeG7ky4gQmnhur9uIGZhY3RvciBnacO6cCBwaMOibiBiaeG7h3QgY8OhYyBuaMOzbSByacOqbmcgYmnhu4d0IChDw7MgY29uL0tow7RuZyBjb24pIHRoYXkgdsOsIGNo4buJIGzDoCBnacOhIHRy4buLIHPhu5EuDQogIC0gbGFicyh0aXRsZSA9ICJQaMOibiBi4buRIGNoaSBwaMOtIHkgdOG6vyB0aGVvIHRy4bq7IGVtIiwgeCA9ICJDaGkgcGjDrSB5IHThur8gKFVTRCkiLCB5ID0gIlPhu5EgbMaw4bujbmciLCBmaWxsID0gIlRy4bq7IGVtIik6IFRow6ptIHRpw6p1IMSR4buBLCBjaMO6IHRow61jaCBjaG8gY8OhYyB0cuG7pWMgdsOgIHBo4bqnbiB0w7QgbcOgdS4NCg0KICAgIC0gdGl0bGUgPSAiUGjDom4gYuG7kSBjaGkgcGjDrSB5IHThur8gdGhlbyB0cuG6uyBlbSI6IFRpw6p1IMSR4buBIGNobyBiaeG7g3UgxJHhu5MuDQogICAgLSB4ID0gIkNoaSBwaMOtIHkgdOG6vyAoVVNEKSI6IENow7ogdGjDrWNoIGNobyB0cuG7pWMgaG/DoG5oLg0KICAgIC0geSA9ICJT4buRIGzGsOG7o25nIjogQ2jDuiB0aMOtY2ggY2hvIHRy4bulYyB0dW5nLg0KICAgIC0gZmlsbCA9ICJUcuG6uyBlbSI6IENow7ogdGjDrWNoIGNobyBwaOG6p24gdMO0IG3DoHUgKHRo4buxYyB04bq/IGzDoCB0aOG7gyBoaeG7h24gIlPhu5EgY29uIikuDQogIC0gc2NhbGVfZmlsbF9icmV3ZXIocGFsZXR0ZSA9ICJTZXQyIik6IENo4buNbiBi4bqjbmcgbcOgdSAiU2V0MiIgdOG7qyBi4buZIG3DoHUgQnJld2VyIMSR4buDIHTDtCBtw6B1IGNobyBjw6FjIGPhu5l0IGhpc3RvZ3JhbSB0aGVvIG5ow7NtIGPDsyBjb24va2jDtG5nIGNvbi4NCg0KICAtIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iKTogRGkgY2h1eeG7g24gduG7iyB0csOtIGxlZ2VuZGEgeHXhu5FuZyBkxrDhu5tpIGPDuW5nIGPhu6dhIGJp4buDdSDEkeG7ky4NCg0KIyMgQmnhu4N1IMSR4buTIGhpc3RvZ3JhbSBjaGkgcGjDrSB5IHThur8gdGhlbyB0deG7lWkgdMOhYzoNCmBgYHtyfQ0KZ2dwbG90KGEpICsNCiAgZ2VvbV9oaXN0b2dyYW0oYWVzKHggPSBjaGFyZ2VzLCBmaWxsID0gZmFjdG9yKGFnZSkpKSArDQogIGxhYnModGl0bGUgPSAiUGjDom4gYuG7kSBjaGkgcGjDrSB5IHThur8gdGhlbyB0deG7lWkgdMOhYyIsIHggPSAiQ2hpIHBow60geSB04bq/IChVU0QpIiwgeSA9ICJT4buRIGzGsOG7o25nIiwgZmlsbCA9ICJUdeG7lWkiKSArDQogIHNjYWxlX2ZpbGxfYnJld2VyKHBhbGV0dGUgPSAiU2V0MSIpICsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIpDQpgYGANCg0KLSAqR2nhuqNpIHRow61jaCDDvSBuZ2jEqWEgY8OidSBs4buHbmg6Kg0KICAtIGdncGxvdChhKTogS2jhu59pIHThuqFvIG3hu5l0IGdncGxvdCBvYmplY3QgdOG7qyBk4buvIGxp4buHdSDEkcaw4bujYyBsxrB1IHRy4buvIHRyb25nIGJp4bq/biBhLg0KDQogIC0gZ2VvbV9oaXN0b2dyYW0oYWVzKHggPSBjaGFyZ2VzLCBmaWxsID0gZmFjdG9yKGFnZSkpKTogVGjDqm0gbGF5ZXIgYmnhu4N1IMSR4buTIGhpc3RvZ3JhbSB2w6BvIGdncGxvdCBvYmplY3QuDQoNCiAgICAtIGFlcyh4ID0gY2hhcmdlcywgZmlsbCA9IGZhY3RvcihhZ2UpKTogWMOhYyDEkeG7i25oIGJp4bq/biBjaGFyZ2VzIHbDoCBhZ2UgxJHGsOG7o2Mgc+G7rSBk4bulbmcgxJHhu4MgdOG6oW8gYmnhu4N1IMSR4buTIGhpc3RvZ3JhbS4NCiAgICAtIHggPSBjaGFyZ2VzOiBUcuG7pWMgaG/DoG5oIHRo4buDIGhp4buHbiAiQ2hpIHBow60geSB04bq/IChVU0QpIi4NCiAgICAtIGZpbGwgPSBmYWN0b3IoYWdlKTogTcOgdSBz4bqvYyBj4bunYSBjw6FjIGPhu5l0IGhpc3RvZ3JhbSB0aOG7gyBoaeG7h24gIlR14buVaSIuDQogICAgLSBmYWN0b3IoYWdlKTogQ2h1eeG7g24gxJHhu5VpIGJp4bq/biBhZ2UgdGjDoG5oIGThuqFuZyBmYWN0b3IgxJHhu4Mgc+G7rSBk4bulbmcgdHJvbmcgYmnhu4N1IMSR4buTLiBCaeG6v24gZmFjdG9yIGdpw7pwIHBow6JuIGJp4buHdCBjw6FjIG5ow7NtIHR14buVaSByacOqbmcgYmnhu4d0IHRoYXkgdsOsIGNo4buJIGzDoCBnacOhIHRy4buLIHPhu5EuDQogIC0gbGFicyh0aXRsZSA9ICJQaMOibiBi4buRIGNoaSBwaMOtIHkgdOG6vyB0aGVvIHR14buVaSB0w6FjIiwgeCA9ICJDaGkgcGjDrSB5IHThur8gKFVTRCkiLCB5ID0gIlPhu5EgbMaw4bujbmciLCBmaWxsID0gIlR14buVaSIpOiBUaMOqbSB0acOqdSDEkeG7gSwgY2jDuiB0aMOtY2ggY2hvIGPDoWMgdHLhu6VjIHbDoCBwaOG6p24gdMO0IG3DoHUuDQoNCiAgICAtIHRpdGxlID0gIlBow6JuIGLhu5EgY2hpIHBow60geSB04bq/IHRoZW8gdHXhu5VpIHTDoWMiOiBUacOqdSDEkeG7gSBjaG8gYmnhu4N1IMSR4buTLg0KICAgIC0geCA9ICJDaGkgcGjDrSB5IHThur8gKFVTRCkiOiBDaMO6IHRow61jaCBjaG8gdHLhu6VjIGhvw6BuaC4NCiAgICAtIHkgPSAiU+G7kSBsxrDhu6NuZyI6IENow7ogdGjDrWNoIGNobyB0cuG7pWMgdHVuZy4NCiAgICAtIGZpbGwgPSAiVHXhu5VpIjogQ2jDuiB0aMOtY2ggY2hvIHBo4bqnbiB0w7QgbcOgdS4NCiAgLSBzY2FsZV9maWxsX2JyZXdlcihwYWxldHRlID0gIlNldDEiKTogQ2jhu41uIGLhuqNuZyBtw6B1ICJTZXQxIiB04burIGLhu5kgbcOgdSBCcmV3ZXIgxJHhu4MgdMO0IG3DoHUgY2hvIGPDoWMgY+G7mXQgaGlzdG9ncmFtIHRoZW8gbmjDs20gdHXhu5VpLg0KDQogIC0gdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIpOiBEaSBjaHV54buDbiB24buLIHRyw60gbGVnZW5kYSB4deG7kW5nIGTGsOG7m2kgY8O5bmcgY+G7p2EgYmnhu4N1IMSR4buTLg0KDQoNCg0KIyMgQmnhu4N1IMSR4buTIHh1IGjGsOG7m25nIGNoaSBwaMOtIHkgdOG6vyB0aGVvIHR14buVaSB0w6FjOg0KYGBge3J9DQphICU+JQ0KICBnZ3Bsb3QoYWVzKHggPSBhZ2UsIHkgPSBjaGFyZ2VzKSkgKw0KICBnZW9tX2xpbmUoKSArDQogIGxhYnModGl0bGUgPSAiWHUgaMaw4bubbmcgY2hpIHBow60geSB04bq/IHRoZW8gdHXhu5VpIHTDoWMiLCB4ID0gIlR14buVaSIsIHkgPSAiQ2hpIHBow60geSB04bq/IChVU0QpIikNCmBgYA0KDQotICpHaeG6o2kgdGjDrWNoIMO9IG5naMSpYSBjw6J1IGzhu4duaDoqDQogIC0gYSAlPiU6IENo4buNbiBk4buvIGxp4buHdSB04burIGJp4bq/biBhIMSR4buDIHPhu60gZOG7pW5nIHRyb25nIGdncGxvdC4NCg0KICAtIGdncGxvdChhZXMoeCA9IGFnZSwgeSA9IGNoYXJnZXMpKTogS2jhu59pIHThuqFvIG3hu5l0IGdncGxvdCBvYmplY3QgduG7m2kgZOG7ryBsaeG7h3UgxJHGsOG7o2MgY2jhu41uIHThu6sgYS4NCg0KICAgIC0gYWVzKHggPSBhZ2UsIHkgPSBjaGFyZ2VzKTogWMOhYyDEkeG7i25oIGJp4bq/biBhZ2UgdsOgIGNoYXJnZXMgxJHGsOG7o2Mgc+G7rSBk4bulbmcgxJHhu4MgdOG6oW8gYmnhu4N1IMSR4buTLg0KICAgIC0geCA9IGFnZTogVHLhu6VjIGhvw6BuaCB0aOG7gyBoaeG7h24gIlR14buVaSIuDQogICAgLSB5ID0gY2hhcmdlczogVHLhu6VjIHR1bmcgdGjhu4MgaGnhu4duICJDaGkgcGjDrSB5IHThur8gKFVTRCkiLg0KICAtIGdlb21fbGluZSgpOiBUaMOqbSBsYXllciBiaeG7g3UgxJHhu5MgxJHGsOG7nW5nIHbDoG8gZ2dwbG90IG9iamVjdC4NCg0KICAtIGxhYnModGl0bGUgPSAiWHUgaMaw4bubbmcgY2hpIHBow60geSB04bq/IHRoZW8gdHXhu5VpIHTDoWMiLCB4ID0gIlR14buVaSIsIHkgPSAiQ2hpIHBow60geSB04bq/IChVU0QpIik6IFRow6ptIHRpw6p1IMSR4buBIHbDoCBjaMO6IHRow61jaCBjaG8gY8OhYyB0cuG7pWMuDQoNCiAgICAtIHRpdGxlID0gIlh1IGjGsOG7m25nIGNoaSBwaMOtIHkgdOG6vyB0aGVvIHR14buVaSB0w6FjIjogVGnDqnUgxJHhu4EgY2hvIGJp4buDdSDEkeG7ky4NCiAgICAtIHggPSAiVHXhu5VpIjogQ2jDuiB0aMOtY2ggY2hvIHRy4bulYyBob8OgbmguDQogICAgLSB5ID0gIkNoaSBwaMOtIHkgdOG6vyAoVVNEKSI6IENow7ogdGjDrWNoIGNobyB0cuG7pWMgdHVuZy4NCg0KIyMgQmnhu4N1IMSR4buTIHNvIHPDoW5oIGNoaSBwaMOtIHkgdOG6vyB0aGVvIGdp4bubaSB0w61uaDoNCmBgYHtyfQ0KYSAlPiUNCiAgZ2dwbG90KGFlcyh4ID0gYWdlLCB5ID0gY2hhcmdlcywgY29sb3IgPSBzZXgpKSArDQogIGdlb21fbGluZSgpICsNCiAgbGFicyh0aXRsZSA9ICJTbyBzw6FuaCBjaGkgcGjDrSB5IHThur8gdGhlbyBnaeG7m2kgdMOtbmgiLCB4ID0gIlR14buVaSIsIHkgPSAiQ2hpIHBow60geSB04bq/IChVU0QpIiwgY29sb3IgPSAiR2nhu5tpIHTDrW5oIikNCmBgYA0KDQotICpHaeG6o2kgdGjDrWNoIMO9IG5naMSpYSBjw6J1IGzhu4duaDoqDQogIC0gYSAlPiU6IENo4buNbiBk4buvIGxp4buHdSB04burIGJp4bq/biBhIMSR4buDIHPhu60gZOG7pW5nIHRyb25nIGdncGxvdC4NCg0KICAtIGdncGxvdChhZXMoeCA9IGFnZSwgeSA9IGNoYXJnZXMsIGNvbG9yID0gc2V4KSk6IEto4bufaSB04bqhbyBt4buZdCBnZ3Bsb3Qgb2JqZWN0IHbhu5tpIGThu68gbGnhu4d1IMSRxrDhu6NjIGNo4buNbiB04burIGEuDQoNCiAgICAtIGFlcyh4ID0gYWdlLCB5ID0gY2hhcmdlcywgY29sb3IgPSBzZXgpOiBYw6FjIMSR4buLbmggYmnhur9uIGFnZSwgY2hhcmdlcyB2w6Agc2V4IMSRxrDhu6NjIHPhu60gZOG7pW5nIMSR4buDIHThuqFvIGJp4buDdSDEkeG7ky4NCiAgICAtIHggPSBhZ2U6IFRy4bulYyBob8OgbmggdGjhu4MgaGnhu4duICJUdeG7lWkiLg0KICAgIC0geSA9IGNoYXJnZXM6IFRy4bulYyB0dW5nIHRo4buDIGhp4buHbiAiQ2hpIHBow60geSB04bq/IChVU0QpIi4NCiAgICAtIGNvbG9yID0gc2V4OiBNw6B1IHPhuq9jIGPhu6dhIGPDoWMgxJHGsOG7nW5nIGJp4buDdSB0aOG7iyAiR2nhu5tpIHTDrW5oIi4NCiAgLSBnZW9tX2xpbmUoKTogVGjDqm0gbGF5ZXIgYmnhu4N1IMSR4buTIMSRxrDhu51uZyB2w6BvIGdncGxvdCBvYmplY3QuDQoNCiAgLSBsYWJzKHRpdGxlID0gIlNvIHPDoW5oIGNoaSBwaMOtIHkgdOG6vyB0aGVvIGdp4bubaSB0w61uaCIsIHggPSAiVHXhu5VpIiwgeSA9ICJDaGkgcGjDrSB5IHThur8gKFVTRCkiLCBjb2xvciA9ICJHaeG7m2kgdMOtbmgiKTogVGjDqm0gdGnDqnUgxJHhu4EgdsOgIGNow7ogdGjDrWNoIGNobyBjw6FjIHRy4bulYyB2w6AgcGjhuqduIHTDtCBtw6B1Lg0KDQogICAgLSB0aXRsZSA9ICJTbyBzw6FuaCBjaGkgcGjDrSB5IHThur8gdGhlbyBnaeG7m2kgdMOtbmgiOiBUacOqdSDEkeG7gSBjaG8gYmnhu4N1IMSR4buTLg0KICAgIC0geCA9ICJUdeG7lWkiOiBDaMO6IHRow61jaCBjaG8gdHLhu6VjIGhvw6BuaC4NCiAgICAtIHkgPSAiQ2hpIHBow60geSB04bq/IChVU0QpIjogQ2jDuiB0aMOtY2ggY2hvIHRy4bulYyB0dW5nLg0KICAgIC0gY29sb3IgPSAiR2nhu5tpIHTDrW5oIjogQ2jDuiB0aMOtY2ggY2hvIHBo4bqnbiB0w7QgbcOgdSAodGjhu7FjIHThur8gbMOgIHRo4buDIGhp4buHbiAiR2nhu5tpIHTDrW5oIikuDQoNCiMjIEJp4buDdSDEkeG7kyBzbyBzw6FuaCBjaGkgcGjDrSB5IHThur8gdGhlbyBraHUgduG7sWM6DQpgYGB7cn0NCmEgJT4lDQogIGdncGxvdChhZXMoeCA9IGFnZSwgeSA9IGNoYXJnZXMsIGNvbG9yID0gcmVnaW9uKSkgKw0KICBnZW9tX2xpbmUoKSArDQogIGxhYnModGl0bGUgPSAiU28gc8OhbmggY2hpIHBow60geSB04bq/IHRoZW8ga2h1IHbhu7FjIiwgeCA9ICJUdeG7lWkiLCB5ID0gIkNoaSBwaMOtIHkgdOG6vyAoVVNEKSIsIGNvbG9yID0gIktodSB24buxYyIpDQpgYGANCg0KLSAqR2nhuqNpIHRow61jaCDDvSBuZ2jEqWEgY8OidSBs4buHbmg6Kg0KICAtIGEgJT4lOiBDaOG7jW4gZOG7ryBsaeG7h3UgdOG7qyBiaeG6v24gYSDEkeG7gyBz4butIGThu6VuZyB0cm9uZyBnZ3Bsb3QuDQoNCiAgLSBnZ3Bsb3QoYWVzKHggPSBhZ2UsIHkgPSBjaGFyZ2VzLCBjb2xvciA9IHJlZ2lvbikpOiBLaOG7n2kgdOG6oW8gbeG7mXQgZ2dwbG90IG9iamVjdCB24bubaSBk4buvIGxp4buHdSDEkcaw4bujYyBjaOG7jW4gdOG7qyBhLg0KDQogICAgLSBhZXMoeCA9IGFnZSwgeSA9IGNoYXJnZXMsIGNvbG9yID0gcmVnaW9uKTogWMOhYyDEkeG7i25oIGJp4bq/biBhZ2UsIGNoYXJnZXMgdsOgIHJlZ2lvbiDEkcaw4bujYyBz4butIGThu6VuZyDEkeG7gyB04bqhbyBiaeG7g3UgxJHhu5MuDQogICAgLSB4ID0gYWdlOiBUcuG7pWMgaG/DoG5oIHRo4buDIGhp4buHbiAiVHXhu5VpIi4NCiAgICAtIHkgPSBjaGFyZ2VzOiBUcuG7pWMgdHVuZyB0aOG7gyBoaeG7h24gIkNoaSBwaMOtIHkgdOG6vyAoVVNEKSIuDQogICAgLSBjb2xvciA9IHJlZ2lvbjogTcOgdSBz4bqvYyBj4bunYSBjw6FjIMSRxrDhu51uZyBiaeG7g3UgdGjhu4sgIktodSB24buxYyIuDQogIC0gZ2VvbV9saW5lKCk6IFRow6ptIGxheWVyIGJp4buDdSDEkeG7kyDEkcaw4budbmcgdsOgbyBnZ3Bsb3Qgb2JqZWN0Lg0KDQogIC0gbGFicyh0aXRsZSA9ICJTbyBzw6FuaCBjaGkgcGjDrSB5IHThur8gdGhlbyBraHUgduG7sWMiLCB4ID0gIlR14buVaSIsIHkgPSAiQ2hpIHBow60geSB04bq/IChVU0QpIiwgY29sb3IgPSAiS2h1IHbhu7FjIik6IFRow6ptIHRpw6p1IMSR4buBIHbDoCBjaMO6IHRow61jaCBjaG8gY8OhYyB0cuG7pWMgdsOgIHBo4bqnbiB0w7QgbcOgdS4NCg0KICAgIC0gdGl0bGUgPSAiU28gc8OhbmggY2hpIHBow60geSB04bq/IHRoZW8ga2h1IHbhu7FjIjogVGnDqnUgxJHhu4EgY2hvIGJp4buDdSDEkeG7ky4NCiAgICAtIHggPSAiVHXhu5VpIjogQ2jDuiB0aMOtY2ggY2hvIHRy4bulYyBob8OgbmguDQogICAgLSB5ID0gIkNoaSBwaMOtIHkgdOG6vyAoVVNEKSI6IENow7ogdGjDrWNoIGNobyB0cuG7pWMgdHVuZy4NCmNvbG9yID0gIktodSB24buxYyI6IENow7ogdGjDrWNoIGNobyBwaOG6p24gdMO0IG3DoHUgKHRo4buxYyB04bq/IGzDoCB0aOG7gyBoaeG7h24gIktodSB24buxYyIpLg0KDQojIyBCaeG7g3UgxJHhu5Mg4bqjbmggaMaw4bufbmcgY+G7p2EgQk1JIMSR4bq/biBjaGkgcGjDrSB5IHThur86DQpgYGB7cn0NCmEgJT4lDQogIGdncGxvdChhZXMoeCA9IGJtaSwgeSA9IGNoYXJnZXMpKSArDQogIGdlb21fcG9pbnQoKSArDQogIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIpICsNCiAgbGFicyh0aXRsZSA9ICLhuqJuaCBoxrDhu59uZyBj4bunYSBCTUkgxJHhur9uIGNoaSBwaMOtIHkgdOG6vyIsIHggPSAiQk1JIiwgeSA9ICJDaGkgcGjDrSB5IHThur8gKFVTRCkiKQ0KYGBgDQoNCi0gKkdp4bqjaSB0aMOtY2ggw70gbmdoxKlhIGPDonUgbOG7h25oOioNCiAgLSBhICU+JTogQ2jhu41uIGThu68gbGnhu4d1IHThu6sgYmnhur9uIGEgxJHhu4Mgc+G7rSBk4bulbmcgdHJvbmcgZ2dwbG90Lg0KDQogIC0gZ2dwbG90KGFlcyh4ID0gYm1pLCB5ID0gY2hhcmdlcykpOiBLaOG7n2kgdOG6oW8gbeG7mXQgZ2dwbG90IG9iamVjdCB24bubaSBk4buvIGxp4buHdSDEkcaw4bujYyBjaOG7jW4gdOG7qyBhLg0KDQogICAgLSBhZXMoeCA9IGJtaSwgeSA9IGNoYXJnZXMpOiBYw6FjIMSR4buLbmggYmnhur9uIGJtaSB2w6AgY2hhcmdlcyDEkcaw4bujYyBz4butIGThu6VuZyDEkeG7gyB04bqhbyBiaeG7g3UgxJHhu5MuDQogICAgLSB4ID0gYm1pOiBUcuG7pWMgaG/DoG5oIHRo4buDIGhp4buHbiAiQ2jhu4kgc+G7kSBraOG7kWkgY8ahIHRo4buDIChCTUkpIi4NCiAgICAtIHkgPSBjaGFyZ2VzOiBUcuG7pWMgdHVuZyB0aOG7gyBoaeG7h24gIkNoaSBwaMOtIHkgdOG6vyAoVVNEKSIuDQogIC0gZ2VvbV9wb2ludCgpOiBUaMOqbSBsYXllciBiaeG7g3UgxJHhu5MgxJFp4buDbSB2w6BvIGdncGxvdCBvYmplY3QuIEJp4buDdSDEkeG7kyDEkWnhu4NtIGhp4buDbiB0aOG7iyBt4buRaSBsacOqbiBo4buHIGdp4buvYSB04burbmcgxJFp4buDbSBk4buvIGxp4buHdSAoQk1JLCBjaGkgcGjDrSB5IHThur8pDQoNCiAgLSBnZW9tX3Ntb290aChtZXRob2QgPSAibG0iKTogVGjDqm0gbGF5ZXIgxJHGsOG7nW5nIGjhu5NpIHF1eSB0dXnhur9uIHTDrW5oIHbDoG8gZ2dwbG90IG9iamVjdC4gxJDGsOG7nW5nIGjhu5NpIHF1eSBnacO6cCBtw7QgdOG6oyBt4buRaSBsacOqbiBo4buHIHThu5VuZyB0aOG7gyBnaeG7r2EgQk1JIHbDoCBjaGkgcGjDrSB5IHThur8uDQoNCiAgICAtIG1ldGhvZCA9ICJsbSI6IFPhu60gZOG7pW5nIHBoxrDGoW5nIHBow6FwIGjhu5NpIHF1eSB0dXnhur9uIHTDrW5oLg0KICAtIGxhYnModGl0bGUgPSAi4bqibmggaMaw4bufbmcgY+G7p2EgQk1JIMSR4bq/biBjaGkgcGjDrSB5IHThur8iLCB4ID0gIkJNSSIsIHkgPSAiQ2hpIHBow60geSB04bq/IChVU0QpIik6IFRow6ptIHRpw6p1IMSR4buBIHbDoCBjaMO6IHRow61jaCBjaG8gY8OhYyB0cuG7pWMuDQoNCiAgICAtIHRpdGxlID0gIuG6om5oIGjGsOG7n25nIGPhu6dhIEJNSSDEkeG6v24gY2hpIHBow60geSB04bq/IjogVGnDqnUgxJHhu4EgY2hvIGJp4buDdSDEkeG7ky4NCiAgICAtIHggPSAiQk1JIjogQ2jDuiB0aMOtY2ggY2hvIHRy4bulYyBob8OgbmguDQogICAgLSB5ID0gIkNoaSBwaMOtIHkgdOG6vyAoVVNEKSI6IENow7ogdGjDrWNoIGNobyB0cuG7pWMgdHVuZy4NCiAgICANCiMjIEJp4buDdSDEkeG7kyBEZW5zaXR5IFBsb3QgZ2nhu69hIEFnZSB2w6AgQ2hhcmdlcyAocGjDom4gbG/huqFpIHRoZW8gU21va2VyKToNCmBgYHtyfQ0KZ2dwbG90KGEsIGFlcyh4ID0gYWdlLCBmaWxsID0gc21va2VyKSkgKw0KICBnZW9tX2RlbnNpdHkoYWxwaGEgPSAwLjcpICsNCiAgbGFicyh0aXRsZSA9ICJEZW5zaXR5IFBsb3Qgb2YgQWdlIChjb2xvcmVkIGJ5IFNtb2tlcikiLCB4ID0gIkFnZSIsIHkgPSAiRGVuc2l0eSIpICsNCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gYygieWVzIiA9ICJicm93biIsICJubyIgPSAibGlnaHR5ZWxsb3ciKSkNCmBgYA0KDQotICpHaeG6o2kgdGjDrWNoIMO9IG5naMSpYSBjw6J1IGzhu4duaDoqDQogIC0gZ2dwbG90KGEsIGFlcyh4ID0gYWdlLCBmaWxsID0gc21va2VyKSk6IEto4bufaSB04bqhbyBt4buZdCBnZ3Bsb3Qgb2JqZWN0IHThu6sgZOG7ryBsaeG7h3UgxJHGsOG7o2MgbMawdSB0cuG7ryB0cm9uZyBiaeG6v24gYS4NCg0KICAgIC0gYWVzKHggPSBhZ2UsIGZpbGwgPSBzbW9rZXIpOiBYw6FjIMSR4buLbmggYmnhur9uIGFnZSB2w6Agc21va2VyIMSRxrDhu6NjIHPhu60gZOG7pW5nIMSR4buDIHThuqFvIGJp4buDdSDEkeG7kyBt4bqtdCDEkeG7mS4NCiAgICAtIHggPSBhZ2U6IFRy4bulYyBob8OgbmggdGjhu4MgaGnhu4duICJBZ2UiIChnaeG7ryBuZ3V5w6puIHTDqm4gdGnhur9uZyBBbmgpLg0KICAgIC0gZmlsbCA9IHNtb2tlcjogTcOgdSBz4bqvYyBj4bunYSBiaeG7g3UgxJHhu5MgbeG6rXQgxJHhu5kgdGjhu4MgaGnhu4duICJTbW9rZXIiIChnaeG7ryBuZ3V5w6puIHTDqm4gdGnhur9uZyBBbmgpLg0KICAtIGdlb21fZGVuc2l0eShhbHBoYSA9IDAuNyk6IFRow6ptIGxheWVyIGJp4buDdSDEkeG7kyBt4bqtdCDEkeG7mSB2w6BvIGdncGxvdCBvYmplY3QuDQoNCiAgICAtIGFscGhhID0gMC43OiBUaGnhur90IGzhuq1wIMSR4buZIG3hu50gY+G7p2EgYmnhu4N1IMSR4buTIG3huq10IMSR4buZIHRow6BuaCAwLjcgKDcwJSBvcGFjaXR5KS4NCiAgLSBsYWJzKHRpdGxlID0gIkRlbnNpdHkgUGxvdCBvZiBBZ2UgKGNvbG9yZWQgYnkgU21va2VyKSIsIHggPSAiQWdlIiwgeSA9ICJEZW5zaXR5Iik6IFRow6ptIHRpw6p1IMSR4buBLCBjaMO6IHRow61jaCBjaG8gY8OhYyB0cuG7pWMgdsOgIHBo4bqnbiB0w7QgbcOgdSAoZ2nhu68gbmd1ecOqbiB0w6puIHRp4bq/bmcgQW5oKS4NCg0KICAgIC0gdGl0bGUgPSAiRGVuc2l0eSBQbG90IG9mIEFnZSAoY29sb3JlZCBieSBTbW9rZXIpIjogVGnDqnUgxJHhu4EgY2hvIGJp4buDdSDEkeG7kyAoZGnhu4VuIMSR4bqhdCBi4bqxbmcgdGnhur9uZyBBbmgpLg0KICAgIC0geCA9ICJBZ2UiOiBDaMO6IHRow61jaCBjaG8gdHLhu6VjIGhvw6BuaCAoZ2nhu68gbmd1ecOqbiB0w6puIHRp4bq/bmcgQW5oKS4NCiAgICAtIHkgPSAiRGVuc2l0eSI6IENow7ogdGjDrWNoIGNobyB0cuG7pWMgdHVuZyAoZ2nhu68gbmd1ecOqbiB0w6puIHRp4bq/bmcgQW5oKS4NCiAgLSBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjKCJ5ZXMiID0gImJyb3duIiwgIm5vIiA9ICJsaWdodHllbGxvdyIpKTogQ2jhu41uIGPDoWNoIHTDtCBtw6B1IHRo4bunIGPDtG5nIGNobyBiaeG7g3UgxJHhu5MgbeG6rXQgxJHhu5kuDQoNCiAgICAtIHZhbHVlcyA9IGMoInllcyIgPSAiYnJvd24iLCAibm8iID0gImxpZ2h0eWVsbG93Iik6IFjDoWMgxJHhu4tuaCBnacOhIHRy4buLIGPhu6dhIGJp4bq/biBzbW9rZXIgdsOgIG3DoHUgc+G6r2MgdMawxqFuZyDhu6luZy4NCiAgICAtICJ5ZXMiIMSRxrDhu6NjIHTDtCBtw6B1IG7DonUgKCJicm93biIpLg0KICAgIC0gIm5vIiDEkcaw4bujYyB0w7QgbcOgdSB2w6BuZyBuaOG6oXQgKCJsaWdodHllbGxvdyIpLg0KDQojIyBCaeG7g3UgxJDhu5MgU2NhdHRlciBQbG90IGNobyB0xrDGoW5nIHF1YW4gZ2nhu69hIEJNSSB2w6AgUmVnaW9uOg0KYGBge3J9DQpnZ3Bsb3QoYSwgYWVzKHggPSBibWksIHkgPSBhcy5mYWN0b3IocmVnaW9uKSwgY29sb3IgPSBibWkpKSArDQogIGdlb21fcG9pbnQoKSArDQogIGxhYnModGl0bGUgPSAiU2NhdHRlciBQbG90IG9mIEJNSSBieSBSZWdpb24iLCB4ID0gIkJNSSIsIHkgPSAiUmVnaW9uIikgKw0KICBzY2FsZV9jb2xvcl92aXJpZGlzX2MoKSArDQogIHRoZW1lKGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gMCwgaGp1c3QgPSAxKSkNCmBgYA0KDQotICpHaeG6o2kgdGjDrWNoIMO9IG5naMSpYSBjw6J1IGzhu4duaDoqDQogIC0gZ2dwbG90KGEsIGFlcyh4ID0gYm1pLCB5ID0gYXMuZmFjdG9yKHJlZ2lvbiksIGNvbG9yID0gYm1pKSk6IEto4bufaSB04bqhbyBt4buZdCBnZ3Bsb3Qgb2JqZWN0IHThu6sgZOG7ryBsaeG7h3UgxJHGsOG7o2MgbMawdSB0cuG7ryB0cm9uZyBiaeG6v24gYS4NCg0KICAgIC0gYWVzKHggPSBibWksIHkgPSBhcy5mYWN0b3IocmVnaW9uKSwgY29sb3IgPSBibWkpOiBYw6FjIMSR4buLbmggY8OhYyBiaeG6v24gxJHGsOG7o2Mgc+G7rSBk4bulbmcgxJHhu4MgdOG6oW8gYmnhu4N1IMSR4buTLg0KICAgIC0geCA9IGJtaTogVHLhu6VjIGhvw6BuaCB0aOG7gyBoaeG7h24gIkJNSSIuDQogICAgLSB5ID0gYXMuZmFjdG9yKHJlZ2lvbik6IFRy4bulYyB0dW5nIHRo4buDIGhp4buHbiAiUmVnaW9uIiDEkcaw4bujYyBjaHV54buDbiDEkeG7lWkgdGjDoG5oIGThuqFuZyBmYWN0b3IuIENodXnhu4NuIMSR4buVaSBuw6B5IGdpw7pwIHBow6JuIGJp4buHdCBjw6FjIHbDuW5nIG1p4buBbiByacOqbmcgYmnhu4d0IHRoYXkgdsOsIGNo4buJIGzDoCBnacOhIHRy4buLIHbEg24gYuG6o24uDQogICAgLSBjb2xvciA9IGJtaTogTcOgdSBz4bqvYyBj4bunYSBjw6FjIMSRaeG7g20gZOG7ryBsaeG7h3UgxJHGsOG7o2MgeMOhYyDEkeG7i25oIGLhu59pIGdpw6EgdHLhu4sgY+G7p2EgYmnhur9uICJibWkiLg0KICAtIGdlb21fcG9pbnQoKTogVGjDqm0gbGF5ZXIgYmnhu4N1IMSR4buTIMSRaeG7g20gdsOgbyBnZ3Bsb3Qgb2JqZWN0LiBCaeG7g3UgxJHhu5MgxJFp4buDbSBoaeG7g24gdGjhu4sgbeG7kWkgbGnDqm4gaOG7hyBnaeG7r2EgdOG7q25nIMSRaeG7g20gZOG7ryBsaeG7h3UgKEJNSSwgdsO5bmcgbWnhu4FuKS4NCg0KICAtIGxhYnModGl0bGUgPSAiU2NhdHRlciBQbG90IG9mIEJNSSBieSBSZWdpb24iLCB4ID0gIkJNSSIsIHkgPSAiUmVnaW9uIik6IFRow6ptIHRpw6p1IMSR4buBIHbDoCBjaMO6IHRow61jaCBjaG8gY8OhYyB0cuG7pWMuDQoNCiAgICAtIHRpdGxlID0gIlNjYXR0ZXIgUGxvdCBvZiBCTUkgYnkgUmVnaW9uIjogVGnDqnUgxJHhu4EgY2hvIGJp4buDdSDEkeG7kyAoZGnhu4VuIMSR4bqhdCBi4bqxbmcgdGnhur9uZyBBbmgpLg0KICAgIC0geCA9ICJCTUkiOiBDaMO6IHRow61jaCBjaG8gdHLhu6VjIGhvw6BuaC4NCiAgICAtIHkgPSAiUmVnaW9uIjogQ2jDuiB0aMOtY2ggY2hvIHRy4bulYyB0dW5nLg0KICAtIHNjYWxlX2NvbG9yX3ZpcmlkaXNfYygpOiBDaOG7jW4gYuG6o25nIG3DoHUgInZpcmlkaXMiIMSR4buDIHTDtCBtw6B1IGNobyBjw6FjIMSRaeG7g20gZOG7ryBsaeG7h3UuIELhuqNuZyBtw6B1IHZpcmlkaXMgY2h1eeG7g24gbcOgdSB04burIHhhbmggbMOhIGPDonkgc2FuZyB2w6BuZyBy4buTaSDEkeG6v24gxJHhu48gdGhlbyBnacOhIHRy4buLIGPhu6dhIGJp4bq/biBibWkuDQoNCiAgLSB0aGVtZShheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDAsIGhqdXN0ID0gMSkpOiBUw7l5IGNo4buJbmggaGnhu4NuIHRo4buLIG5ow6NuIGNobyB0cuG7pWMgdHVuZy4NCg0KICAgIC0gYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoYW5nbGUgPSAwLCBoanVzdCA9IDEpOiBYb2F5IG5ow6NuIGPhu6dhIHRy4bulYyB0dW5nIDAgxJHhu5kgKGdp4buvIHRo4bqzbmcgxJHhu6luZykgdsOgIGNhbmggY2jhu4luaCBzYW5nIHBo4bqjaS4NCg0KIyMgQmnhu4N1IMSR4buTIEJhciBQbG90IGdp4buvYSBTZXggdsOgIE51bWJlciBvZiBDaGlsZHJlbjoNCmBgYHtyfQ0KZ2dwbG90KGEsIGFlcyh4ID0gc2V4LCBmaWxsID0gYXMuZmFjdG9yKGNoaWxkcmVuKSkpICsNCiAgZ2VvbV9iYXIoKSArDQogIGxhYnModGl0bGUgPSAiQmFyIFBsb3Qgb2YgTnVtYmVyIG9mIENoaWxkcmVuIGJ5IFNleCIsIHggPSAiU2V4IiwgeSA9ICJDb3VudCIpICsNCiAgc2NhbGVfZmlsbF9icmV3ZXIocGFsZXR0ZSA9ICJTZXQzIikNCmBgYA0KDQotICpHaeG6o2kgdGjDrWNoIMO9IG5naMSpYSBjw6J1IGzhu4duaDoqDQogIC0gZ2dwbG90KGEsIGFlcyh4ID0gc2V4LCBmaWxsID0gYXMuZmFjdG9yKGNoaWxkcmVuKSkpOiBLaOG7n2kgdOG6oW8gbeG7mXQgZ2dwbG90IG9iamVjdCB04burIGThu68gbGnhu4d1IMSRxrDhu6NjIGzGsHUgdHLhu68gdHJvbmcgYmnhur9uIGEuDQoNCiAgICAtIGFlcyh4ID0gc2V4LCBmaWxsID0gYXMuZmFjdG9yKGNoaWxkcmVuKSk6IFjDoWMgxJHhu4tuaCBjw6FjIGJp4bq/biDEkcaw4bujYyBz4butIGThu6VuZyDEkeG7gyB04bqhbyBiaeG7g3UgxJHhu5MgdGhhbmguDQogICAgLSB4ID0gc2V4OiBUcuG7pWMgaG/DoG5oIHRo4buDIGhp4buHbiAiU2V4IiAoZ2nhu68gbmd1ecOqbiB0w6puIHRp4bq/bmcgQW5oKS4NCiAgICAtIGZpbGwgPSBhcy5mYWN0b3IoY2hpbGRyZW4pOiBNw6B1IHPhuq9jIGPhu6dhIGPDoWMgY+G7mXQgYmFyIHRo4buDIGhp4buHbiAiU+G7kSBjb24iIChDaGlsZHJlbikgxJHGsOG7o2MgY2h1eeG7g24gxJHhu5VpIHRow6BuaCBk4bqhbmcgZmFjdG9yLiBDaHV54buDbiDEkeG7lWkgbsOgeSBnacO6cCBwaMOibiBiaeG7h3QgbmjDs20gY8OzIGNvbi9raMO0bmcgY29uIHJpw6puZyBiaeG7h3QgdGhheSB2w6wgY2jhu4kgbMOgIGdpw6EgdHLhu4sgc+G7kS4NCiAgLSBnZW9tX2JhcigpOiBUaMOqbSBsYXllciBiaeG7g3UgxJHhu5MgdGhhbmggdsOgbyBnZ3Bsb3Qgb2JqZWN0LiBCaeG7g3UgxJHhu5MgdGhhbmggZ2nDunAgaGnhu4NuIHRo4buLIHPhu5EgbMaw4bujbmcgdGhlbyB04burbmcgbmjDs20gKG5hbS9u4buvKSB0csOqbiB0cuG7pWMgaG/DoG5oLg0KDQogIC0gbGFicyh0aXRsZSA9ICJCYXIgUGxvdCBvZiBOdW1iZXIgb2YgQ2hpbGRyZW4gYnkgU2V4IiwgeCA9ICJTZXgiLCB5ID0gIkNvdW50Iik6IFRow6ptIHRpw6p1IMSR4buBIHbDoCBjaMO6IHRow61jaCBjaG8gY8OhYyB0cuG7pWMuDQoNCiAgICAtIHRpdGxlID0gIkJhciBQbG90IG9mIE51bWJlciBvZiBDaGlsZHJlbiBieSBTZXgiOiBUacOqdSDEkeG7gSBjaG8gYmnhu4N1IMSR4buTIChkaeG7hW4gxJHhuqF0IGLhurFuZyB0aeG6v25nIEFuaCkuDQogICAgLSB4ID0gIlNleCI6IENow7ogdGjDrWNoIGNobyB0cuG7pWMgaG/DoG5oIChnaeG7ryBuZ3V5w6puIHTDqm4gdGnhur9uZyBBbmgpLg0KICAgIC0geSA9ICJDb3VudCI6IENow7ogdGjDrWNoIGNobyB0cuG7pWMgdHVuZywgbeG6t2MgZMO5IHTDqm4gY2jDrW5oIHjDoWMgaMahbiBjw7MgdGjhu4MgbMOgICJOdW1iZXIgb2YgQ2hpbGRyZW4iIChT4buRIGNvbikuDQogIC0gc2NhbGVfZmlsbF9icmV3ZXIocGFsZXR0ZSA9ICJTZXQzIik6IENo4buNbiBi4bqjbmcgbcOgdSAiU2V0MyIgdOG7qyBi4buZIG3DoHUgQnJld2VyIMSR4buDIHTDtCBtw6B1IGNobyBjw6FjIGPhu5l0IGJhciB0aGVvIG5ow7NtIGPDsyBjb24va2jDtG5nIGNvbi4NCiAgDQojIyBCaeG7g3UgxJHhu5MgYmFyIHBsb3QgZ2nhu69hIGdp4bubaSB0w61uaCB2w6Aga2h1IHbhu7FjIA0KDQpgYGB7cn0NCmdncGxvdChhLCBhZXMoeCA9IHNleCwgZmlsbCA9IHJlZ2lvbikpICsNCiAgZ2VvbV9iYXIocG9zaXRpb24gPSAiZG9kZ2UiLCBzdGF0ID0gImNvdW50IikgKw0KICBnZW9tX3RleHQoYWVzKGxhYmVsID0gc3RhdChjb3VudCkpLCBzdGF0ID0gImNvdW50IiwgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IDAuOSkpDQogIGxhYnModGl0bGUgPSAiQmFyIFBsb3Qgb2YgU2V4IHZzIHJlZ2lvbiIsDQogICAgICAgeCA9ICJTZXgiLA0KICAgICAgIHkgPSAiQ291bnQiKSANCiAgDQpgYGANCi0gKkdp4bqjaSB0aMOtY2ggw70gbmdoxKlhIGPDonUgbOG7h25oOioNCiAgLSBnZ3Bsb3QoYSwgYWVzKHggPSBzZXgsIGZpbGwgPSByZWdpb24pKTogS2jhu59pIHThuqFvIG3hu5l0IGdncGxvdCBvYmplY3QgdOG7qyBk4buvIGxp4buHdSDEkcaw4bujYyBsxrB1IHRy4buvIHRyb25nIGJp4bq/biBhLg0KDQogICAgLSBhZXMoeCA9IHNleCwgZmlsbCA9IHJlZ2lvbik6IFjDoWMgxJHhu4tuaCBjw6FjIGJp4bq/biDEkcaw4bujYyBz4butIGThu6VuZyDEkeG7gyB04bqhbyBiaeG7g3UgxJHhu5MgdGhhbmguDQogICAgLSB4ID0gc2V4OiBUcuG7pWMgaG/DoG5oIHRo4buDIGhp4buHbiAiU2V4IiAoZ2nhu68gbmd1ecOqbiB0w6puIHRp4bq/bmcgQW5oKS4NCmZpbGwgPSByZWdpb246IE3DoHUgc+G6r2MgY+G7p2EgY8OhYyBj4buZdCBiYXIgdGjhu4MgaGnhu4duICJWw7luZyBtaeG7gW4iIChyZWdpb24pLg0KICAtIGdlb21fYmFyKHBvc2l0aW9uID0gImRvZGdlIiwgc3RhdCA9ICJjb3VudCIpOiBUaMOqbSBsYXllciBiaeG7g3UgxJHhu5MgdGhhbmggeOG6v3AgY2jhu5NuZyAoZG9kZ2UpIHbDoG8gZ2dwbG90IG9iamVjdC4NCg0KICAgIC0gcG9zaXRpb24gPSAiZG9kZ2UiOiBY4bq/cCBjaOG7k25nIGPDoWMgY+G7mXQgYmFyIHRoZW8gbmjDs20gZ2nhu5tpIHTDrW5oIChuYW0vbuG7rykgdHLDqm4gdHLhu6VjIGhvw6BuaCDEkeG7gyB0csOhbmggY2jhu5NuZyBjaMOpbyBsw6puIG5oYXUuDQogICAgLSBzdGF0ID0gImNvdW50IjogU+G7rSBk4bulbmcgdGjhu5FuZyBrw6ogImNvdW50IiDEkeG7gyB0w61uaCB04buVbmcgc+G7kSBuZ8aw4budaSBjaG8gbeG7l2kgbmjDs20gKGdp4bubaSB0w61uaCArIHbDuW5nIG1p4buBbikuDQogIC0gZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IHN0YXQoY291bnQpKSwgc3RhdCA9ICJjb3VudCIsIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2Uod2lkdGggPSAwLjkpKTogVGjDqm0gbGF5ZXIgdGV4dCDEkeG7gyBoaeG7g24gdGjhu4sgZ2nDoSB0cuG7iyAoc+G7kSBsxrDhu6NuZykgdHLDqm4gbeG7l2kgY+G7mXQgYmFyLg0KDQogICAgLSBhZXMobGFiZWwgPSBzdGF0KGNvdW50KSk6IEzhuqV5IGdpw6EgdHLhu4sgdHLhuqMgduG7gSBj4bunYSB0aOG7kW5nIGvDqiAiY291bnQiIChz4buRIGzGsOG7o25nKSDEkeG7gyBoaeG7g24gdGjhu4sgdHLDqm4gbeG7l2kgY+G7mXQgYmFyLg0KICAgIC0gc3RhdCA9ICJjb3VudCI6IFPhu60gZOG7pW5nIHRo4buRbmcga8OqICJjb3VudCIgxJHhu4MgdMOtbmggdG/DoW4gZ2nDoSB0cuG7iyBoaeG7g24gdGjhu4sgKGdp4buRbmcgduG7m2kgZ2VvbV9iYXIpLg0KICAgIC0gcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IDAuOSk6IFbhu4sgdHLDrSDEkeG6t3QgdGV4dCBjxaluZyB44bq/cCBjaOG7k25nIHRoZW8gbmjDs20gZ2nhu5FuZyB24bubaSBnZW9tX2JhciwgxJHhu5kgcuG7mW5nIHRleHQgYuG6sW5nIDkwJSBjaGnhu4F1IHLhu5luZyBj4bunYSBj4buZdCBiYXIgKMSR4buDIHRyw6FuaCB0ZXh0IGLhu4sgY2hlIGtodeG6pXQpLg0KICAtIGxhYnModGl0bGUgPSAiQmFyIFBsb3Qgb2YgU2V4IHZzIHJlZ2lvbiIsIHggPSAiU2V4IiwgeSA9ICJDb3VudCIpOiBUaMOqbSB0acOqdSDEkeG7gSB2w6AgY2jDuiB0aMOtY2ggY2hvIGPDoWMgdHLhu6VjLg0KDQogICAgLSB0aXRsZSA9ICJCYXIgUGxvdCBvZiBTZXggdnMgcmVnaW9uIjogVGnDqnUgxJHhu4EgY2hvIGJp4buDdSDEkeG7kyAoZGnhu4VuIMSR4bqhdCBi4bqxbmcgdGnhur9uZyBBbmgpLg0KICAgIC0geCA9ICJTZXgiOiBDaMO6IHRow61jaCBjaG8gdHLhu6VjIGhvw6BuaCAoZ2nhu68gbmd1ecOqbiB0w6puIHRp4bq/bmcgQW5oKS4NCiAgICAtIHkgPSAiQ291bnQiOiBDaMO6IHRow61jaCBjaG8gdHLhu6VjIHR1bmcuDQoNCiMjIEJp4buDdSDEkeG7kyBj4buZdCBoaeG7g24gdGjhu4sgc+G7kSBsxrDhu6NuZyBuZ8aw4budaSBow7p0IHRodeG7kWMgdsOgIGtow7RuZyBow7p0IHRodeG7kWMgdGhlbyBnaeG7m2kgdMOtbmgNCmBgYHtyfQ0KZ2dwbG90KGEsIGFlcyh4ID0gc2V4LCBmaWxsID0gc21va2VyKSkgKw0KICBnZW9tX2Jhcihwb3NpdGlvbiA9ICJkb2RnZSIsIHN0YXQgPSAiY291bnQiKSArDQogIGdlb21fdGV4dChhZXMobGFiZWwgPSBzdGF0KGNvdW50KSksIHN0YXQgPSAiY291bnQiLCBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKHdpZHRoID0gMC45KSkNCiAgbGFicyh0aXRsZSA9ICIgQmnhu4N1IMSR4buTIGPhu5l0IGhp4buDbiB0aOG7iyBz4buRIGzGsOG7o25nIG5nxrDhu51pIGjDunQgdGh14buRYyB2w6Aga2jDtG5nIGjDunQgdGh14buRYyB0aGVvIGdp4bubaSB0w61uaCIsIHkgPSAiQ291bnQiKSArDQogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGMoInllcyIgPSAic2t5Ymx1ZSIsICJubyIgPSAicGluayIpKQ0KYGBgDQoNCi0gKkdp4bqjaSB0aMOtY2ggw70gbmdoxKlhIGPDonUgbOG7h25oOioNCiAgLSBnZ3Bsb3QoYSwgYWVzKHggPSBzZXgsIGZpbGwgPSBzbW9rZXIpKQ0KDQogICAgLSBnZ3Bsb3QoYSk6IEto4bufaSB04bqhbyBt4buZdCBiaeG7g3UgxJHhu5MgZ2dwbG90IGThu7FhIHRyw6puIGThu68gbGnhu4d1IHRyb25nIGRhdGFmcmFtZSBhLg0KICAgIC0gYWVzKHggPSBzZXgsIGZpbGwgPSBzbW9rZXIpOg0KICAgIC0gYWVzOiDDgW5oIHjhuqEgY8OhYyBiaeG6v24gdHJvbmcgZGF0YWZyYW1lIHbDoG8gY8OhYyB0aHXhu5ljIHTDrW5oIGPhu6dhIGJp4buDdSDEkeG7ky4NCiAgICAtIHggPSBzZXg6IEfDoW4gYmnhur9uIHNleCAoZ2nhu5tpIHTDrW5oKSBjaG8gdHLhu6VjIHggY+G7p2EgYmnhu4N1IMSR4buTLg0KICAgIC0gZmlsbCA9IHNtb2tlcjogR8OhbiBiaeG6v24gc21va2VyIChow7p0IHRodeG7kWMpIGNobyBtw6B1IHPhuq9jIGPhu6dhIGPDoWMgdGhhbmggdHJvbmcgYmnhu4N1IMSR4buTLg0KICAtIGdlb21fYmFyKHBvc2l0aW9uID0gImRvZGdlIiwgc3RhdCA9ICJjb3VudCIpDQoNCiAgICAtIGdlb21fYmFyOiBUaMOqbSBow6xuaCBk4bqhbmcgdGhhbmggdsOgbyBiaeG7g3UgxJHhu5MuDQogICAgLSBwb3NpdGlvbiA9ICJkb2RnZSI6IFjhur9wIGPDoWMgdGhhbmggY+G6oW5oIG5oYXUgdGhlbyBuaMOzbSAoZ2nhu5tpIHTDrW5oKSB24bubaSBraG/huqNuZyBjw6FjaCBuaOG6pXQgxJHhu4tuaC4NCiAgICAtIHN0YXQgPSAiY291bnQiOiBUw61uaCB0b8OhbiBz4buRIGzGsOG7o25nIG5nxrDhu51pIGNobyBt4buXaSBuaMOzbSAoZ2nhu5tpIHTDrW5oKSB2w6AgaGnhu4NuIHRo4buLIHRyw6puIHRoYW5oLg0KICAtIGdlb21fdGV4dChhZXMobGFiZWwgPSBzdGF0KGNvdW50KSksIHN0YXQgPSAiY291bnQiLCBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKHdpZHRoID0gMC45KSkNCg0KICAgIC0gZ2VvbV90ZXh0OiBUaMOqbSBjaMO6IHRow61jaCBz4buRIGzGsOG7o25nIHbDoG8gbeG7l2kgdGhhbmguDQogICAgLSBhZXMobGFiZWwgPSBzdGF0KGNvdW50KSk6IEfDoW4gZ2nDoSB0cuG7iyBz4buRIGzGsOG7o25nICh0w61uaCB0b8OhbiBi4bufaSAgICAgICAgICAgLSBzdGF0KGNvdW50KSkgY2hvIG7hu5lpIGR1bmcgY2jDuiB0aMOtY2guDQpwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKHdpZHRoID0gMC45KTogVuG7iyB0csOtIGNow7ogdGjDrWNoIMSRxrDhu6NjIGPEg24gY2jhu4luaCB24bubaSB24buLIHRyw60gY+G7p2EgdGhhbmggdsOgIGPDsyDEkeG7mSBy4buZbmcgMC45Lg0KICAtIGxhYnModGl0bGUgPSAiQmnhu4N1IMSR4buTIGPhu5l0IGhp4buDbiB0aOG7iyBz4buRIGzGsOG7o25nIG5nxrDhu51pIGjDunQgdGh14buRYyB2w6Aga2jDtG5nIGjDunQgdGh14buRYyB0aGVvIGdp4bubaSB0w61uaCIsIHkgPSAiQ291bnQiKQ0KDQogICAgLSBsYWJzOiBUaMOqbSB0acOqdSDEkeG7gSB2w6AgY2jDuiB0aMOtY2ggY2hvIGPDoWMgdHLhu6VjLg0KICAgIC0gdGl0bGUgPSAiQmnhu4N1IMSR4buTIGPhu5l0IGhp4buDbiB0aOG7iyBz4buRIGzGsOG7o25nIG5nxrDhu51pIGjDunQgdGh14buRYyB2w6Aga2jDtG5nIGjDunQgdGh14buRYyB0aGVvIGdp4bubaSB0w61uaCI6IFRpw6p1IMSR4buBIGNobyBiaeG7g3UgxJHhu5MuDQogICAgLSB5ID0gIkNvdW50IjogQ2jDuiB0aMOtY2ggY2hvIHRy4bulYyB5Lg0KICAtIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGMoInllcyIgPSAic2t5Ymx1ZSIsICJubyIgPSAicGluayIpKQ0KDQogICAgLSBzY2FsZV9maWxsX21hbnVhbDogQ2jhu41uIG3DoHUgc+G6r2MgY2hvIGPDoWMgbmjDs20gKGdp4bubaSB0w61uaCkuDQogICAgLSB2YWx1ZXMgPSBjKCJ5ZXMiID0gInNreWJsdWUiLCAibm8iID0gInBpbmsiKTogR8OhbiBtw6B1IHhhbmggZGEgdHLhu51pIGNobyBuaMOzbSAieWVzIiAoaMO6dCB0aHXhu5FjKSB2w6AgbcOgdSBo4buTbmcgY2hvIG5ow7NtICJubyIgKGtow7RuZyBow7p0IHRodeG7kWMpLg==