1 Giới thiệu về bộ dữ liệu diamonds:

1.1 Mô tả:

Bộ dữ liệu “diamonds” là một tập dữ liệu được tích hợp sẵn trong RStudio, chứa thông tin về 53.940 viên kim cương cắt tròn. Dữ liệu bao gồm các thuộc tính quan trọng như giá, trọng lượng, chất lượng cắt, màu sắc, độ trong, kích thước và tỷ lệ.

1.2 Thông tin cơ bản:

  • Số lượng: 53.940 viên kim cương
  • Biến: 10
    • price: Giá (USD)
    • carat: Trọng lượng (carat)
    • cut: Chất lượng cắt (Khá, Tốt, Rất tốt, Đặc biệt, Lý tưởng)
    • color: Màu (J - kém nhất, D - tốt nhất)
    • clarity: Độ trong (I1 - kém nhất, IF - tốt nhất)
    • x: Chiều dài (mm)
    • y: Chiều rộng (mm)
    • z: Độ sâu (mm)
    • depth: Tỷ lệ phần trăm độ sâu
    • table: Chiều rộng đỉnh kim cương so với điểm rộng nhất

1.2.1 1.Đồ thị thể hiện số lượng kim cương theo biến cut

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
library(ggplot2)
q <- diamonds
q %>% ggplot(aes(x = cut)) +geom_bar()

- Biểu đồ thể hiện số lượng kim cương thuộc từng cấp độ chất lượng khác nhau trong bộ dữ liệu diamonds - Trục x thể hiện các cấp độ chất lượng kim cương, từ thấp đến cao (từ “Fair” đến “Ideal”) - Trục y thể hiện số lượng kim cương tương ứng với mỗi cấp độ chất lượng. - Chiều cao của mỗi cột thể hiện số lượng kim cương thuộc cấp độ chất lượng đó

1.2.2 2.Đồ thị thể hiện số lượng kim cương theo biến carat

q %>% ggplot(aes(x = carat)) +geom_bar()

câu lệnh này tạo ra một biểu đồ cột thể hiện phân phối của các giá trị trong cột carat của dữ liệu q. Mỗi cột trên biểu đồ đại diện cho một giá trị duy nhất của carat, và chiều cao của cột thể hiện số lần xuất hiện của giá trị đó trong dữ liệu. - Trục x thể hiện kích thước của kim cương - Trục y thể hiện số lượng kim cương tương ứng với mỗi kích thước

1.2.3 3.Đồ thị thể hiện số lượng kim cương theo biến color

q %>% ggplot(aes(x = color)) +geom_bar()

- Đồ thị thể hiện số lượng kim cương thuộc từng nhóm màu khác nhau trong bộ dữ liệu diamonds - Trục x thể hiện các màu sắc của kim cương - Trục y thể hiện số lượng kim cương tương ứng với mỗi màu - Chiều cao của mỗi cột thể hiện số lượng kim cương thuộc màu đó

1.2.4 4.Đồ thị thể hiện số lượng kim cương theo biến clarity

q %>% ggplot(aes(x = clarity)) +geom_bar()

- Biểu đồ thể hiện số lượng kim cương thuộc từng cấp độ độ trong suốt khác nhau trong bộ dữ liệu diamonds - Trục x thể hiện các cấp độ độ trong suốt kim cương, từ thấp đến cao - Trục y thể hiện số lượng kim cương tương ứng với mỗi cấp độ độ trong suố - Chiều cao của mỗi cột thể hiện số lượng kim cương thuộc cấp độ độ trong suốt đó

1.2.5 5.Đồ thị thể hiện số lượng kim cương theo biến depth

q %>% ggplot(aes(x = depth)) +geom_bar()

- Biểu đồ thể hiện số lượng kim cương thuộc từng độ sây khác nhau trong bộ dữ liệu diamonds - Trục x thể hiện độ sâu của kim cương - Trục y thể hiện số lượng kim cương tương ứng với mỗi độ sâu - Chiều cao của mỗi cột thể hiện số lượng kim cương thuộc độ sâu đó

1.2.6 6.Đồ thị thể hiện số lượng kim cương theo biến table

q %>% ggplot(aes(x = table)) +geom_bar()

câu lệnh này tạo ra một biểu đồ cột (bar chart) thể hiện phân phối của các giá trị trong cột table của dữ liệu q. Mỗi cột trên biểu đồ biểu diễn một giá trị duy nhất của table, và chiều cao của cột thể hiện tần suất (số lần xuất hiện) của giá trị đó trong dữ liệu. câu lệnh này tạo ra một biểu đồ cột thể hiện phân phối của các giá trị trong cột table của dữ liệu q. Mỗi cột trên biểu đồ đại diện cho một giá trị duy nhất của table, và chiều cao của cột thể hiện số lần xuất hiện của giá trị đó trong dữ liệu.

1.2.7 7.Đồ thị thể hiện số lượng kim cương theo biến price

q %>% ggplot(aes(x = price)) +geom_bar()

câu lệnh này tạo ra một biểu đồ cột (bar chart) thể hiện phân phối của các giá trị trong cột price của dữ liệu q. Mỗi cột trên biểu đồ biểu diễn một giá trị duy nhất của price, và chiều cao của cột thể hiện tần suất (số lần xuất hiện) của giá trị đó trong dữ liệu.

1.2.8 8.Đồ thị thể hiện số lượng kim cương theo biến x

q %>% ggplot(aes(x = x)) +geom_bar()

### 9.Đồ thị thể hiện số lượng kim cương theo biến y

q %>% ggplot(aes(x = y)) +geom_bar()

### 10.Đồ thị thể hiện số lượng kim cương theo biến z

q %>% ggplot(aes(x = z)) +geom_bar()

1.2.9 11.tạo các biểu đồ con dựa trên giá trị của biến color

q %>% group_by(cut,color) %>% summarise(n=n())%>%ggplot(aes(x = cut,y = n)) +geom_col(position = 'dodge') +facet_wrap(~color) 
## `summarise()` has grouped output by 'cut'. You can override using the `.groups`
## argument.

Biểu đồ giúp hiểu được phân phối của các loại kim cương (cut) trong từng mức độ màu sắc khác nhau. Mỗi cột trong biểu đồ thể hiện số lượng các loại kim cương (cut) cho mỗi mức độ màu sắc. Đối với mỗi mức độ màu sắc, chúng ta có thể quan sát được sự phân bố của các loại kim cương (cut) là như thế nào. Sự sắp xếp theo màu sắc giúp ta so sánh phân phối của các loại kim cương trong từng mức độ màu sắc, từ đó đánh giá được mức độ ảnh hưởng của màu sắc đối với chất lượng cắt của viên kim cương

q %>% group_by(carat,color) %>% summarise(n=n())%>%ggplot(aes(x = carat,y = n)) +geom_col(position = 'dodge') +facet_wrap(~color)
## `summarise()` has grouped output by 'carat'. You can override using the
## `.groups` argument.

### 12.tạo các biểu đồ con dựa trên giá trị của biến carat

q %>% group_by(carat,color) %>% summarise(n=n())%>%ggplot(aes(x = carat,y = n)) +geom_col(position = 'dodge') +facet_wrap(~color)
## `summarise()` has grouped output by 'carat'. You can override using the
## `.groups` argument.

câu lệnh này tạo ra một biểu đồ dạng cột thể hiện mối quan hệ giữa khối lượng (carat) và số lượng (n) của các kim cương, được phân loại theo màu sắc (color). Các cột được xếp chồng lên nhau (position = ‘dodge’) và biểu đồ được phân chia thành các nhóm nhỏ dựa trên màu sắc.

1.2.10 13.tạo các biểu đồ con dựa trên giá trị của biến clarity

q %>% group_by(clarity,color) %>% summarise(n=n())%>%ggplot(aes(x = clarity,y = n)) +geom_col(position = 'dodge') +facet_wrap(~color)
## `summarise()` has grouped output by 'clarity'. You can override using the
## `.groups` argument.

câu lệnh này tạo ra một biểu đồ dạng cột thể hiện mối quan hệ giữa độ trong suốt (clarity) và số lượng (n) của các kim cương, được phân loại theo màu sắc (color). Các cột được xếp chồng lên nhau (position = ‘dodge’) và biểu đồ được phân chia thành các nhóm nhỏ dựa trên màu sắc.

1.2.11 14.tạo các biểu đồ con dựa trên giá trị của biến depth

q %>% group_by(depth,color) %>% summarise(n=n())%>%ggplot(aes(x = depth,y = n)) +geom_col(position = 'dodge') +facet_wrap(~color)
## `summarise()` has grouped output by 'depth'. You can override using the
## `.groups` argument.

câu lệnh này tạo ra một biểu đồ dạng cột thể hiện mối quan hệ giữa độ sâu (depth) và số lượng (n) của các kim cương, được phân loại theo màu sắc (color). Các cột được xếp chồng lên nhau (position = ‘dodge’) và biểu đồ được phân chia thành các nhóm nhỏ dựa trên màu sắc.

1.2.12 15.tạo các biểu đồ con dựa trên giá trị của biến table

q %>% group_by(table,color) %>% summarise(n=n())%>%ggplot(aes(x = table,y = n)) +geom_col(position = 'dodge') +facet_wrap(~color)
## `summarise()` has grouped output by 'table'. You can override using the
## `.groups` argument.

câu lệnh này tạo ra một biểu đồ dạng cột thể hiện mối quan hệ giữa độ rộng mặt bàn (table) và số lượng (n) của các kim cương, được phân loại theo màu sắc (color). Các cột được xếp chồng lên nhau (position = ‘dodge’) và biểu đồ được phân chia thành các nhóm nhỏ dựa trên màu sắc.

1.2.13 16.tạo các biểu đồ con dựa trên giá trị của biến price

q %>% group_by(price,color) %>% summarise(n=n())%>%ggplot(aes(x = price,y = n)) +geom_col(position = 'dodge') +facet_wrap(~color)
## `summarise()` has grouped output by 'price'. You can override using the
## `.groups` argument.

câu lệnh này tạo ra một biểu đồ dạng cột thể hiện mối quan hệ giữa giá (price) và số lượng (n) của các kim cương, được phân loại theo màu sắc (color). Các cột được xếp chồng lên nhau (position = ‘dodge’) và biểu đồ được phân chia thành các nhóm nhỏ dựa trên màu sắc.

1.2.14 17.Biểu đồ thể hiện phân phối của các giá trị

q <- q %>% mutate(caratC = cut(carat,5, label = c('rất nhỏ', 'nhỏ','vừa','lớn','rất lớn')))
q %>% ggplot(aes(x = caratC)) +geom_bar(fill = 'red')

câu lệnh này tạo ra một biểu đồ cột thể hiện phân phối của các giá trị trong cột mới caratC, được tạo ra bằng cách chia giá trị của cột carat thành 5 nhóm khác nhau. Cột caratC được sử dụng trên trục x của biểu đồ, và màu fill của các cột được thiết lập là màu đỏ.

1.2.15 18.Biểu đồ thể hiện số lượng mỗi loại cắt

q <- q %>% group_by(cut, color) %>% summarise(n = n())
## `summarise()` has grouped output by 'cut'. You can override using the `.groups`
## argument.
q %>% ggplot(aes(x = cut, y = n)) +
  geom_col(data = q %>% filter(color == 'D'), fill = 'red') +
  geom_col(data = q %>% filter(color == 'J'), fill = 'blue')

câu lệnh này tạo ra một biểu đồ dạng cột thể hiện số lượng của mỗi loại cắt (cut), được phân loại theo màu sắc (color). Các cột có màu đỏ hoặc xanh tương ứng với các giá trị cụ thể của color.

1.2.16 19.Biểu đồ thể hiện giá trị trung bình trọng lượng carat theo màu sắc kim cương

q <-diamonds
q %>% group_by(color) %>% summarise(k= mean(carat)) %>% ggplot(aes(color,k)) +
    geom_col(fill='red') + 
    geom_text(aes(label = round(k,2)),vjust = 1, color = 'black') 

câu lệnh này tạo ra một biểu đồ cột thể hiện giá trị trung bình của khối lượng kim cương (carat) cho mỗi màu sắc. Các cột được tô màu đỏ và có nhãn số liệu đính kèm. - Trục x: Thể hiện các màu sắc của kim cương. - Trục y: Thể hiện giá trị trung bình trọng lượng carat

1.2.17 20.Biểu đồ cột thể hiện giá trị trung bình trọng lượng carat theo chất lượng cắt kim cương

q %>% group_by(cut) %>% summarise(k= mean(carat)) %>%
  ggplot(aes(cut,k)) +
    geom_col(fill='red') + 
    geom_text(aes(label = round(k,2)),vjust = 1, color = 'black') +
    labs(x = 'cut', y = 'mean')

câu lệnh này tạo ra một biểu đồ cột thể hiện giá trị trung bình của khối lượng (carat) cho mỗi loại cắt (cut). Các cột được tô màu đỏ và có nhãn số liệu đính kèm. - Trục x: Thể hiện các chất lượng cắt khác nhau của kim cương - Trục y: Thể hiện giá trị trung bình trọng lượng carat

1.2.18 21.Biểu đồ cột thể hiện giá trị trung bình trọng lượng carat theo độ trong suốt của kim cương

q %>% group_by(clarity) %>% summarise(k= mean(carat)) %>%
  ggplot(aes(clarity,k)) +
    geom_col(fill='red') + 
    geom_text(aes(label = round(k,2)),vjust = 1, color = 'black') +
    labs(x = 'clarity', y = 'mean')

câu lệnh này tạo ra một biểu đồ cột thể hiện giá trị trung bình của khối lượng (carat) cho mỗi loại clarity (độ trong suốt). Các cột được tô màu đỏ và có nhãn số liệu đính kèm. - Trục x: Thể hiện các độ trong suốt khác nhau của kim cương - Trục y: Thể hiện giá trị trung bình trọng lượng carat

1.2.19 22.Biểu đồ thể hiện giá trị trung bình giá bán theo màu sắc kim cương

q %>% group_by(color) %>% summarise(k= mean(price)) %>%
  ggplot(aes(color,k)) +
    geom_col(fill='red') + 
    geom_text(aes(label = round(k,2)),vjust = 1, color = 'black') +
    labs(x = 'Màu', y = 'mean')

câu lệnh này tạo ra một biểu đồ cột thể hiện giá trị trung bình của giá cho mỗi loại màu. Các cột được tô màu đỏ và có nhãn số liệu đính kèm. - Trục x: Thể hiện các màu sắc khác nhau của kim cương - Trục y: Thể hiện giá trị trung bình giá bán

1.2.20 23.Biểu đồ thể hiện giá trị trung bình giá bán theo chất lượng cắt

q %>% group_by(cut) %>% summarise(k= mean(price)) %>%
  ggplot(aes(cut,k)) +
    geom_col(fill='red') + 
    geom_text(aes(label = round(k,2)),vjust = 1, color = 'black') +
    labs(x = 'Chất lượng cắt', y = 'mean')

câu lệnh này tạo ra một biểu đồ cột thể hiện giá trị trung bình của giá cho mỗi loại cắt. Các cột được tô màu đỏ và có nhãn số liệu đính kèm. - Trục x: Thể hiện các chất lượng cắt khác nhau của kim cương - Trục y: Thể hiện giá trị trung bình giá bán

1.2.21 24.Biểu đồ thể hiện giá trị trung bình giá bán theo độ trong suốt

q %>% group_by(clarity) %>% summarise(k= mean(price)) %>%
  ggplot(aes(clarity,k)) +
    geom_col(fill='red') + 
    geom_text(aes(label = round(k,2)),vjust = 1, color = 'black') +
    labs(x = 'Độ trong suốt', y = 'mean')

câu lệnh này tạo ra một biểu đồ cột thể hiện giá trị trung bình của giá cho mỗi mức độ trong suốt của kim cương. Các cột được tô màu đỏ và có nhãn số liệu đính kèm. - Trục x: Thể hiện các độ trong suốt khác nhau của kim cương - Trục y: Thể hiện giá trị trung bình giá bán

1.2.22 25.Biểu đồ cột thể hiện phương sai giá bán theo màu sắc kim cương

q %>% group_by(color) %>% summarise(k= var(price)) %>%
  ggplot(aes(color,k)) +
    geom_col(fill='red') + 
    geom_text(aes(label = round(k,2)),vjust = 1, color = 'black') +
    labs(x = 'Màu', y = 'var')

câu lệnh này tạo ra một biểu đồ cột thể hiện giá trị phương sai của giá cho mỗi loại màu của kim cương. Các cột được tô màu đỏ và có nhãn số liệu đính kèm. - Trục x: Thể hiện các màu sắc khác nhau của kim cương - Trục y: Thể hiện phương sai của giá bán

1.2.23 26.Biểu đồ cột thể hiện phương sai giá bán theo chất lượng cắt

q %>% group_by(cut) %>% summarise(k= var(price)) %>%
  ggplot(aes(cut,k)) +
    geom_col(fill='red') + 
    geom_text(aes(label = round(k,2)),vjust = 1, color = 'black') +
    labs(x = 'Chất lượng cắt', y = 'var')

câu lệnh này tạo ra một biểu đồ cột thể hiện giá trị phương sai của giá cho mỗi loại chất lượng cắt của kim cương. Các cột được tô màu đỏ và có nhãn số liệu đính kèm. - Trục x: Thể hiện các chất lượng cắt khác nhau của kim cương - Trục y: Thể hiện phương sai của giá bán

1.2.24 27.Biểu đồ cột thể hiện phương sai giá bán theo độ trong suốt

q %>% group_by(clarity) %>% summarise(k= var(price)) %>%
  ggplot(aes(clarity,k)) +
    geom_col(fill='red') + 
    geom_text(aes(label = round(k,2)),vjust = 0.85, color = 'black') +
    labs(x = 'Độ trong suốt', y = 'var')

câu lệnh này tạo ra một biểu đồ cột thể hiện phương sai của giá cho mỗi mức độ trong suốt của kim cương. Các cột được tô màu đỏ và có nhãn số liệu đính kèm. - Trục x: Thể hiện các độ trong suốt khác nhau của kim cương - Trục y: Thể hiện phương sai của giá bán

1.2.25 28.Biểu đồ cột thể hiện phương sai trọng lượng carat theo chất lượng cắt

q %>% group_by(cut) %>% summarise(k= var(carat)) %>%
  ggplot(aes(cut,k)) +
    geom_col(fill='red') + 
    geom_text(aes(label = round(k,3)),vjust = 1, color = 'black') +
    labs(x = 'Chất lượng cắt', y = 'var')

câu lệnh này tạo ra một biểu đồ cột thể hiện phương sai của trọng lượng carat cho mỗi loại chất lượng cắt của kim cương. Các cột được tô màu đỏ và có nhãn số liệu đính kèm. - Trục x: Thể hiện các chất lượng cắt khác nhau của kim cương - Trục y: Thể hiện phương sai của trọng lượng carat

1.2.26 29.Biểu đồ cột thể hiện phương sai trọng lượng carat theo độ trong suốt

q %>% group_by(clarity) %>% summarise(k= var(carat)) %>%
  ggplot(aes(clarity,k)) +
    geom_col(fill='red') + 
    geom_text(aes(label = round(k,2)),vjust = 1, color = 'black') +
    labs(x = 'Độ trong suốt', y = 'var')

câu lệnh này tạo ra một biểu đồ cột thể hiện phương sai của trọng lượng carat cho mỗi mức độ trong suốt của kim cương. Các cột được tô màu đỏ và có nhãn số liệu đính kèm. - Trục x: Thể hiện các độ trong suốt khác nhau của kim cương - Trục y: Thể hiện phương sai của trọng lượng carat

1.3 330.Biểu đồ cột kép theo cut phân tách theo color, thể hiện giá trung bình

q %>% group_by(cut,color) %>% summarise(k =mean(price)) %>%
  ggplot(aes(x = cut,y = k)) +
    geom_col(position = 'dodge', fill= 'blue') +
    facet_wrap(~color) +
    geom_text(aes(label = round(k,1)),vjust = 0.25, color = 'black') +
    labs(x = 'Loại', y = 'mean')
## `summarise()` has grouped output by 'cut'. You can override using the `.groups`
## argument.

câu lệnh này tạo ra một biểu đồ cột thể hiện giá trị trung bình của giá cho mỗi loại cắt của kim cương, được phân loại theo màu. Các cột được tô màu xanh và có nhãn số liệu đính kèm.

LS0tDQp0aXRsZTogIm52NCINCmF1dGhvcjogIkNoYXUgUXV5Ig0KZGF0ZTogImByIGZvcm1hdChTeXMudGltZSgpLCAnJUg6JU06JVMsICVkIC0gJW0gLSAlWScpYCINCm91dHB1dDoNCiAgaHRtbF9kb2N1bWVudDogDQogICAgdG9jOiB0cnVlDQogICAgbnVtYmVyIHNlY3Rpb246IHRydWUNCiAgICB0b2NfZmxvYXQ6IHRydWUNCiAgICBjb2RlX2ZvbGRpbmc6IHNob3cNCiAgICBjb2RlX2Rvd25sb2FkOiB0cnVlDQogICAgbnVtYmVyX3NlY3Rpb25zOiB0cnVlDQogIHdvcmRfZG9jdW1lbnQ6DQogICAgdG9jOiB0cnVlDQogIHBkZl9kb2N1bWVudDoNCiAgICB0b2M6IHRydWUNCi0tLQ0KYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0V9DQprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobyA9IFRSVUUpDQpgYGANCiMgKipHaeG7m2kgdGhp4buHdSB24buBIGLhu5kgZOG7ryBsaeG7h3UgZGlhbW9uZHM6KiogDQoNCiMjIE3DtCB04bqjOiANCg0KQuG7mSBk4buvIGxp4buHdSAiZGlhbW9uZHMiIGzDoCBt4buZdCB04bqtcCBk4buvIGxp4buHdSDEkcaw4bujYyB0w61jaCBo4bujcCBz4bq1biB0cm9uZyBSU3R1ZGlvLCBjaOG7qWEgdGjDtG5nIHRpbiB24buBIDUzLjk0MCB2acOqbiBraW0gY8awxqFuZyBj4bqvdCB0csOybi4gROG7ryBsaeG7h3UgYmFvIGfhu5NtIGPDoWMgdGh14buZYyB0w61uaCBxdWFuIHRy4buNbmcgbmjGsCBnacOhLCB0cuG7jW5nIGzGsOG7o25nLCBjaOG6pXQgbMaw4bujbmcgY+G6r3QsIG3DoHUgc+G6r2MsIMSR4buZIHRyb25nLCBrw61jaCB0aMaw4bubYyB2w6AgdOG7tyBs4buHLiANCg0KIyMgVGjDtG5nIHRpbiBjxqEgYuG6o246IA0KDQotIFPhu5EgbMaw4bujbmc6IDUzLjk0MCB2acOqbiBraW0gY8awxqFuZw0KLSBCaeG6v246IDEwDQogIC0gcHJpY2U6IEdpw6EgKFVTRCkNCiAgLSBjYXJhdDogVHLhu41uZyBsxrDhu6NuZyAoY2FyYXQpDQogIC0gY3V0OiBDaOG6pXQgbMaw4bujbmcgY+G6r3QgKEtow6EsIFThu5F0LCBS4bqldCB04buRdCwgxJDhurdjIGJp4buHdCwgTMO9IHTGsOG7n25nKQ0KICAtIGNvbG9yOiBNw6B1IChKIC0ga8OpbSBuaOG6pXQsIEQgLSB04buRdCBuaOG6pXQpDQogIC0gY2xhcml0eTogxJDhu5kgdHJvbmcgKEkxIC0ga8OpbSBuaOG6pXQsIElGIC0gdOG7kXQgbmjhuqV0KQ0KICAtIHg6IENoaeG7gXUgZMOgaSAobW0pDQogIC0geTogQ2hp4buBdSBy4buZbmcgKG1tKQ0KICAtIHo6IMSQ4buZIHPDonUgKG1tKQ0KICAtIGRlcHRoOiBU4bu3IGzhu4cgcGjhuqduIHRyxINtIMSR4buZIHPDonUNCiAgLSB0YWJsZTogQ2hp4buBdSBy4buZbmcgxJHhu4luaCBraW0gY8awxqFuZyBzbyB24bubaSDEkWnhu4NtIHLhu5luZyBuaOG6pXQNCiAgDQojIyMgKioxLsSQ4buTIHRo4buLIHRo4buDIGhp4buHbiBz4buRIGzGsOG7o25nIGtpbSBjxrDGoW5nIHRoZW8gYmnhur9uIGN1dCoqDQoNCmBgYHtyfQ0KbGlicmFyeShkcGx5cikNCmxpYnJhcnkoZ2dwbG90MikNCnEgPC0gZGlhbW9uZHMNCnEgJT4lIGdncGxvdChhZXMoeCA9IGN1dCkpICtnZW9tX2JhcigpDQpgYGANCi0gQmnhu4N1IMSR4buTIHRo4buDIGhp4buHbiBz4buRIGzGsOG7o25nIGtpbSBjxrDGoW5nIHRodeG7mWMgdOG7q25nIGPhuqVwIMSR4buZIGNo4bqldCBsxrDhu6NuZyBraMOhYyBuaGF1IHRyb25nIGLhu5kgZOG7ryBsaeG7h3UgZGlhbW9uZHMNCiAgLSBUcuG7pWMgeCB0aOG7gyBoaeG7h24gY8OhYyBj4bqlcCDEkeG7mSBjaOG6pXQgbMaw4bujbmcga2ltIGPGsMahbmcsIHThu6sgdGjhuqVwIMSR4bq/biBjYW8gKHThu6sgIkZhaXIiIMSR4bq/biAiSWRlYWwiKQ0KICAtIFRy4bulYyB5IHRo4buDIGhp4buHbiBz4buRIGzGsOG7o25nIGtpbSBjxrDGoW5nIHTGsMahbmcg4bupbmcgduG7m2kgbeG7l2kgY+G6pXAgxJHhu5kgY2jhuqV0IGzGsOG7o25nLg0KICAtIENoaeG7gXUgY2FvIGPhu6dhIG3hu5dpIGPhu5l0IHRo4buDIGhp4buHbiBz4buRIGzGsOG7o25nIGtpbSBjxrDGoW5nIHRodeG7mWMgY+G6pXAgxJHhu5kgY2jhuqV0IGzGsOG7o25nIMSRw7MNCiAgDQojIyMgKioyLsSQ4buTIHRo4buLIHRo4buDIGhp4buHbiBz4buRIGzGsOG7o25nIGtpbSBjxrDGoW5nIHRoZW8gYmnhur9uIGNhcmF0KioNCg0KYGBge3J9DQpxICU+JSBnZ3Bsb3QoYWVzKHggPSBjYXJhdCkpICtnZW9tX2JhcigpDQpgYGANCiBjw6J1IGzhu4duaCBuw6B5IHThuqFvIHJhIG3hu5l0IGJp4buDdSDEkeG7kyBj4buZdCB0aOG7gyBoaeG7h24gcGjDom4gcGjhu5FpIGPhu6dhIGPDoWMgZ2nDoSB0cuG7iyB0cm9uZyBj4buZdCBjYXJhdCBj4bunYSBk4buvIGxp4buHdSBxLiBN4buXaSBj4buZdCB0csOqbiBiaeG7g3UgxJHhu5MgxJHhuqFpIGRp4buHbiBjaG8gbeG7mXQgZ2nDoSB0cuG7iyBkdXkgbmjhuqV0IGPhu6dhIGNhcmF0LCB2w6AgY2hp4buBdSBjYW8gY+G7p2EgY+G7mXQgdGjhu4MgaGnhu4duIHPhu5EgbOG6p24geHXhuqV0IGhp4buHbiBj4bunYSBnacOhIHRy4buLIMSRw7MgdHJvbmcgZOG7ryBsaeG7h3UuDQogIC0gVHLhu6VjIHggdGjhu4MgaGnhu4duIGvDrWNoIHRoxrDhu5tjIGPhu6dhIGtpbSBjxrDGoW5nDQogIC0gVHLhu6VjIHkgdGjhu4MgaGnhu4duIHPhu5EgbMaw4bujbmcga2ltIGPGsMahbmcgdMawxqFuZyDhu6luZyB24bubaSBt4buXaSBrw61jaCB0aMaw4bubYw0KDQoNCiMjIyAqKjMuxJDhu5MgdGjhu4sgdGjhu4MgaGnhu4duIHPhu5EgbMaw4bujbmcga2ltIGPGsMahbmcgdGhlbyBiaeG6v24gY29sb3IqKg0KDQpgYGB7cn0NCnEgJT4lIGdncGxvdChhZXMoeCA9IGNvbG9yKSkgK2dlb21fYmFyKCkNCmBgYA0KLSDEkOG7kyB0aOG7iyB0aOG7gyBoaeG7h24gc+G7kSBsxrDhu6NuZyBraW0gY8awxqFuZyB0aHXhu5ljIHThu6tuZyBuaMOzbSBtw6B1IGtow6FjIG5oYXUgdHJvbmcgYuG7mSBk4buvIGxp4buHdSBkaWFtb25kcw0KICAtIFRy4bulYyB4IHRo4buDIGhp4buHbiBjw6FjIG3DoHUgc+G6r2MgY+G7p2Ega2ltIGPGsMahbmcNCiAgLSBUcuG7pWMgeSB0aOG7gyBoaeG7h24gc+G7kSBsxrDhu6NuZyBraW0gY8awxqFuZyB0xrDGoW5nIOG7qW5nIHbhu5tpIG3hu5dpIG3DoHUNCiAgLSBDaGnhu4F1IGNhbyBj4bunYSBt4buXaSBj4buZdCB0aOG7gyBoaeG7h24gc+G7kSBsxrDhu6NuZyBraW0gY8awxqFuZyB0aHXhu5ljIG3DoHUgxJHDsw0KICANCiMjIyAqKjQuxJDhu5MgdGjhu4sgdGjhu4MgaGnhu4duIHPhu5EgbMaw4bujbmcga2ltIGPGsMahbmcgdGhlbyBiaeG6v24gY2xhcml0eSoqDQoNCmBgYHtyfQ0KcSAlPiUgZ2dwbG90KGFlcyh4ID0gY2xhcml0eSkpICtnZW9tX2JhcigpDQpgYGANCi0gQmnhu4N1IMSR4buTIHRo4buDIGhp4buHbiBz4buRIGzGsOG7o25nIGtpbSBjxrDGoW5nIHRodeG7mWMgdOG7q25nIGPhuqVwIMSR4buZIMSR4buZIHRyb25nIHN14buRdCBraMOhYyBuaGF1IHRyb25nIGLhu5kgZOG7ryBsaeG7h3UgZGlhbW9uZHMNCiAgLSBUcuG7pWMgeCB0aOG7gyBoaeG7h24gY8OhYyBj4bqlcCDEkeG7mSDEkeG7mSB0cm9uZyBzdeG7kXQga2ltIGPGsMahbmcsIHThu6sgdGjhuqVwIMSR4bq/biBjYW8NCiAgLSBUcuG7pWMgeSB0aOG7gyBoaeG7h24gc+G7kSBsxrDhu6NuZyBraW0gY8awxqFuZyB0xrDGoW5nIOG7qW5nIHbhu5tpIG3hu5dpIGPhuqVwIMSR4buZIMSR4buZIHRyb25nIHN14buRDQogIC0gQ2hp4buBdSBjYW8gY+G7p2EgbeG7l2kgY+G7mXQgdGjhu4MgaGnhu4duIHPhu5EgbMaw4bujbmcga2ltIGPGsMahbmcgdGh14buZYyBj4bqlcCDEkeG7mSDEkeG7mSB0cm9uZyBzdeG7kXQgxJHDsw0KICANCiMjIyAqKjUuxJDhu5MgdGjhu4sgdGjhu4MgaGnhu4duIHPhu5EgbMaw4bujbmcga2ltIGPGsMahbmcgdGhlbyBiaeG6v24gZGVwdGgqKg0KYGBge3J9DQpxICU+JSBnZ3Bsb3QoYWVzKHggPSBkZXB0aCkpICtnZW9tX2JhcigpDQpgYGANCi0gQmnhu4N1IMSR4buTIHRo4buDIGhp4buHbiBz4buRIGzGsOG7o25nIGtpbSBjxrDGoW5nIHRodeG7mWMgdOG7q25nIMSR4buZIHPDonkga2jDoWMgbmhhdSB0cm9uZyBi4buZIGThu68gbGnhu4d1IGRpYW1vbmRzDQogIC0gVHLhu6VjIHggdGjhu4MgaGnhu4duIMSR4buZIHPDonUgY+G7p2Ega2ltIGPGsMahbmcNCiAgLSBUcuG7pWMgeSB0aOG7gyBoaeG7h24gc+G7kSBsxrDhu6NuZyBraW0gY8awxqFuZyB0xrDGoW5nIOG7qW5nIHbhu5tpIG3hu5dpIMSR4buZIHPDonUNCiAgLSBDaGnhu4F1IGNhbyBj4bunYSBt4buXaSBj4buZdCB0aOG7gyBoaeG7h24gc+G7kSBsxrDhu6NuZyBraW0gY8awxqFuZyB0aHXhu5ljIMSR4buZIHPDonUgxJHDsw0KICANCiMjIyAqKjYuxJDhu5MgdGjhu4sgdGjhu4MgaGnhu4duIHPhu5EgbMaw4bujbmcga2ltIGPGsMahbmcgdGhlbyBiaeG6v24gdGFibGUqKg0KYGBge3J9DQpxICU+JSBnZ3Bsb3QoYWVzKHggPSB0YWJsZSkpICtnZW9tX2JhcigpDQpgYGANCmPDonUgbOG7h25oIG7DoHkgdOG6oW8gcmEgbeG7mXQgYmnhu4N1IMSR4buTIGPhu5l0IChiYXIgY2hhcnQpIHRo4buDIGhp4buHbiBwaMOibiBwaOG7kWkgY+G7p2EgY8OhYyBnacOhIHRy4buLIHRyb25nIGPhu5l0IHRhYmxlIGPhu6dhIGThu68gbGnhu4d1IHEuIE3hu5dpIGPhu5l0IHRyw6puIGJp4buDdSDEkeG7kyBiaeG7g3UgZGnhu4VuIG3hu5l0IGdpw6EgdHLhu4sgZHV5IG5o4bqldCBj4bunYSB0YWJsZSwgdsOgIGNoaeG7gXUgY2FvIGPhu6dhIGPhu5l0IHRo4buDIGhp4buHbiB04bqnbiBzdeG6pXQgKHPhu5EgbOG6p24geHXhuqV0IGhp4buHbikgY+G7p2EgZ2nDoSB0cuG7iyDEkcOzIHRyb25nIGThu68gbGnhu4d1Lg0KY8OidSBs4buHbmggbsOgeSB04bqhbyByYSBt4buZdCBiaeG7g3UgxJHhu5MgY+G7mXQgdGjhu4MgaGnhu4duIHBow6JuIHBo4buRaSBj4bunYSBjw6FjIGdpw6EgdHLhu4sgdHJvbmcgY+G7mXQgdGFibGUgY+G7p2EgZOG7ryBsaeG7h3UgcS4gTeG7l2kgY+G7mXQgdHLDqm4gYmnhu4N1IMSR4buTIMSR4bqhaSBkaeG7h24gY2hvIG3hu5l0IGdpw6EgdHLhu4sgZHV5IG5o4bqldCBj4bunYSB0YWJsZSwgdsOgIGNoaeG7gXUgY2FvIGPhu6dhIGPhu5l0IHRo4buDIGhp4buHbiBz4buRIGzhuqduIHh14bqldCBoaeG7h24gY+G7p2EgZ2nDoSB0cuG7iyDEkcOzIHRyb25nIGThu68gbGnhu4d1Lg0KDQojIyMgKio3LsSQ4buTIHRo4buLIHRo4buDIGhp4buHbiBz4buRIGzGsOG7o25nIGtpbSBjxrDGoW5nIHRoZW8gYmnhur9uIHByaWNlKioNCg0KYGBge3J9DQpxICU+JSBnZ3Bsb3QoYWVzKHggPSBwcmljZSkpICtnZW9tX2JhcigpDQpgYGANCmPDonUgbOG7h25oIG7DoHkgdOG6oW8gcmEgbeG7mXQgYmnhu4N1IMSR4buTIGPhu5l0IChiYXIgY2hhcnQpIHRo4buDIGhp4buHbiBwaMOibiBwaOG7kWkgY+G7p2EgY8OhYyBnacOhIHRy4buLIHRyb25nIGPhu5l0IHByaWNlIGPhu6dhIGThu68gbGnhu4d1IHEuIE3hu5dpIGPhu5l0IHRyw6puIGJp4buDdSDEkeG7kyBiaeG7g3UgZGnhu4VuIG3hu5l0IGdpw6EgdHLhu4sgZHV5IG5o4bqldCBj4bunYSBwcmljZSwgdsOgIGNoaeG7gXUgY2FvIGPhu6dhIGPhu5l0IHRo4buDIGhp4buHbiB04bqnbiBzdeG6pXQgKHPhu5EgbOG6p24geHXhuqV0IGhp4buHbikgY+G7p2EgZ2nDoSB0cuG7iyDEkcOzIHRyb25nIGThu68gbGnhu4d1Lg0KDQojIyMgKio4LsSQ4buTIHRo4buLIHRo4buDIGhp4buHbiBz4buRIGzGsOG7o25nIGtpbSBjxrDGoW5nIHRoZW8gYmnhur9uIHgqKg0KDQoNCmBgYHtyfQ0KcSAlPiUgZ2dwbG90KGFlcyh4ID0geCkpICtnZW9tX2JhcigpDQpgYGANCiMjIyAqKjkuxJDhu5MgdGjhu4sgdGjhu4MgaGnhu4duIHPhu5EgbMaw4bujbmcga2ltIGPGsMahbmcgdGhlbyBiaeG6v24geSoqDQoNCmBgYHtyfQ0KcSAlPiUgZ2dwbG90KGFlcyh4ID0geSkpICtnZW9tX2JhcigpDQpgYGANCiMjIyAqKjEwLsSQ4buTIHRo4buLIHRo4buDIGhp4buHbiBz4buRIGzGsOG7o25nIGtpbSBjxrDGoW5nIHRoZW8gYmnhur9uIHoqKg0KDQpgYGB7cn0NCnEgJT4lIGdncGxvdChhZXMoeCA9IHopKSArZ2VvbV9iYXIoKQ0KYGBgDQoNCg0KIyMjICoqMTEudOG6oW8gY8OhYyBiaeG7g3UgxJHhu5MgY29uIGThu7FhIHRyw6puIGdpw6EgdHLhu4sgY+G7p2EgYmnhur9uIGNvbG9yKioNCmBgYHtyfQ0KcSAlPiUgZ3JvdXBfYnkoY3V0LGNvbG9yKSAlPiUgc3VtbWFyaXNlKG49bigpKSU+JWdncGxvdChhZXMoeCA9IGN1dCx5ID0gbikpICtnZW9tX2NvbChwb3NpdGlvbiA9ICdkb2RnZScpICtmYWNldF93cmFwKH5jb2xvcikgDQoNCmBgYA0KQmnhu4N1IMSR4buTIGdpw7pwIGhp4buDdSDEkcaw4bujYyBwaMOibiBwaOG7kWkgY+G7p2EgY8OhYyBsb+G6oWkga2ltIGPGsMahbmcgKGN1dCkgdHJvbmcgdOG7q25nIG3hu6ljIMSR4buZIG3DoHUgc+G6r2Mga2jDoWMgbmhhdS4gTeG7l2kgY+G7mXQgdHJvbmcgYmnhu4N1IMSR4buTIHRo4buDIGhp4buHbiBz4buRIGzGsOG7o25nIGPDoWMgbG/huqFpIGtpbSBjxrDGoW5nIChjdXQpIGNobyBt4buXaSBt4bupYyDEkeG7mSBtw6B1IHPhuq9jLiDEkOG7kWkgduG7m2kgbeG7l2kgbeG7qWMgxJHhu5kgbcOgdSBz4bqvYywgY2jDum5nIHRhIGPDsyB0aOG7gyBxdWFuIHPDoXQgxJHGsOG7o2Mgc+G7sSBwaMOibiBi4buRIGPhu6dhIGPDoWMgbG/huqFpIGtpbSBjxrDGoW5nIChjdXQpIGzDoCBuaMawIHRo4bq/IG7DoG8uIFPhu7Egc+G6r3AgeOG6v3AgdGhlbyBtw6B1IHPhuq9jIGdpw7pwIHRhIHNvIHPDoW5oIHBow6JuIHBo4buRaSBj4bunYSBjw6FjIGxv4bqhaSBraW0gY8awxqFuZyB0cm9uZyB04burbmcgbeG7qWMgxJHhu5kgbcOgdSBz4bqvYywgdOG7qyDEkcOzIMSRw6FuaCBnacOhIMSRxrDhu6NjIG3hu6ljIMSR4buZIOG6o25oIGjGsOG7n25nIGPhu6dhIG3DoHUgc+G6r2MgxJHhu5FpIHbhu5tpIGNo4bqldCBsxrDhu6NuZyBj4bqvdCBj4bunYSB2acOqbiBraW0gY8awxqFuZw0KDQpgYGB7cn0NCnEgJT4lIGdyb3VwX2J5KGNhcmF0LGNvbG9yKSAlPiUgc3VtbWFyaXNlKG49bigpKSU+JWdncGxvdChhZXMoeCA9IGNhcmF0LHkgPSBuKSkgK2dlb21fY29sKHBvc2l0aW9uID0gJ2RvZGdlJykgK2ZhY2V0X3dyYXAofmNvbG9yKQ0KYGBgDQojIyMgKioxMi504bqhbyBjw6FjIGJp4buDdSDEkeG7kyBjb24gZOG7sWEgdHLDqm4gZ2nDoSB0cuG7iyBj4bunYSBiaeG6v24gY2FyYXQqKg0KYGBge3J9DQpxICU+JSBncm91cF9ieShjYXJhdCxjb2xvcikgJT4lIHN1bW1hcmlzZShuPW4oKSklPiVnZ3Bsb3QoYWVzKHggPSBjYXJhdCx5ID0gbikpICtnZW9tX2NvbChwb3NpdGlvbiA9ICdkb2RnZScpICtmYWNldF93cmFwKH5jb2xvcikNCmBgYA0KY8OidSBs4buHbmggbsOgeSB04bqhbyByYSBt4buZdCBiaeG7g3UgxJHhu5MgZOG6oW5nIGPhu5l0IHRo4buDIGhp4buHbiBt4buRaSBxdWFuIGjhu4cgZ2nhu69hIGto4buRaSBsxrDhu6NuZyAoY2FyYXQpIHbDoCBz4buRIGzGsOG7o25nIChuKSBj4bunYSBjw6FjIGtpbSBjxrDGoW5nLCDEkcaw4bujYyBwaMOibiBsb+G6oWkgdGhlbyBtw6B1IHPhuq9jIChjb2xvcikuIEPDoWMgY+G7mXQgxJHGsOG7o2MgeOG6v3AgY2jhu5NuZyBsw6puIG5oYXUgKHBvc2l0aW9uID0gJ2RvZGdlJykgdsOgIGJp4buDdSDEkeG7kyDEkcaw4bujYyBwaMOibiBjaGlhIHRow6BuaCBjw6FjIG5ow7NtIG5o4buPIGThu7FhIHRyw6puIG3DoHUgc+G6r2MuDQoNCg0KIyMjICoqMTMudOG6oW8gY8OhYyBiaeG7g3UgxJHhu5MgY29uIGThu7FhIHRyw6puIGdpw6EgdHLhu4sgY+G7p2EgYmnhur9uIGNsYXJpdHkqKg0KYGBge3J9DQpxICU+JSBncm91cF9ieShjbGFyaXR5LGNvbG9yKSAlPiUgc3VtbWFyaXNlKG49bigpKSU+JWdncGxvdChhZXMoeCA9IGNsYXJpdHkseSA9IG4pKSArZ2VvbV9jb2wocG9zaXRpb24gPSAnZG9kZ2UnKSArZmFjZXRfd3JhcCh+Y29sb3IpDQpgYGANCmPDonUgbOG7h25oIG7DoHkgdOG6oW8gcmEgbeG7mXQgYmnhu4N1IMSR4buTIGThuqFuZyBj4buZdCB0aOG7gyBoaeG7h24gbeG7kWkgcXVhbiBo4buHIGdp4buvYSDEkeG7mSB0cm9uZyBzdeG7kXQgKGNsYXJpdHkpIHbDoCBz4buRIGzGsOG7o25nIChuKSBj4bunYSBjw6FjIGtpbSBjxrDGoW5nLCDEkcaw4bujYyBwaMOibiBsb+G6oWkgdGhlbyBtw6B1IHPhuq9jIChjb2xvcikuIEPDoWMgY+G7mXQgxJHGsOG7o2MgeOG6v3AgY2jhu5NuZyBsw6puIG5oYXUgKHBvc2l0aW9uID0gJ2RvZGdlJykgdsOgIGJp4buDdSDEkeG7kyDEkcaw4bujYyBwaMOibiBjaGlhIHRow6BuaCBjw6FjIG5ow7NtIG5o4buPIGThu7FhIHRyw6puIG3DoHUgc+G6r2MuDQoNCiMjIyAqKjE0LnThuqFvIGPDoWMgYmnhu4N1IMSR4buTIGNvbiBk4buxYSB0csOqbiBnacOhIHRy4buLIGPhu6dhIGJp4bq/biBkZXB0aCoqDQpgYGB7cn0NCnEgJT4lIGdyb3VwX2J5KGRlcHRoLGNvbG9yKSAlPiUgc3VtbWFyaXNlKG49bigpKSU+JWdncGxvdChhZXMoeCA9IGRlcHRoLHkgPSBuKSkgK2dlb21fY29sKHBvc2l0aW9uID0gJ2RvZGdlJykgK2ZhY2V0X3dyYXAofmNvbG9yKQ0KYGBgDQpjw6J1IGzhu4duaCBuw6B5IHThuqFvIHJhIG3hu5l0IGJp4buDdSDEkeG7kyBk4bqhbmcgY+G7mXQgdGjhu4MgaGnhu4duIG3hu5FpIHF1YW4gaOG7hyBnaeG7r2EgxJHhu5kgc8OidSAoZGVwdGgpIHbDoCBz4buRIGzGsOG7o25nIChuKSBj4bunYSBjw6FjIGtpbSBjxrDGoW5nLCDEkcaw4bujYyBwaMOibiBsb+G6oWkgdGhlbyBtw6B1IHPhuq9jIChjb2xvcikuIEPDoWMgY+G7mXQgxJHGsOG7o2MgeOG6v3AgY2jhu5NuZyBsw6puIG5oYXUgKHBvc2l0aW9uID0gJ2RvZGdlJykgdsOgIGJp4buDdSDEkeG7kyDEkcaw4bujYyBwaMOibiBjaGlhIHRow6BuaCBjw6FjIG5ow7NtIG5o4buPIGThu7FhIHRyw6puIG3DoHUgc+G6r2MuDQoNCiMjIyAqKjE1LnThuqFvIGPDoWMgYmnhu4N1IMSR4buTIGNvbiBk4buxYSB0csOqbiBnacOhIHRy4buLIGPhu6dhIGJp4bq/biB0YWJsZSoqDQpgYGB7cn0NCnEgJT4lIGdyb3VwX2J5KHRhYmxlLGNvbG9yKSAlPiUgc3VtbWFyaXNlKG49bigpKSU+JWdncGxvdChhZXMoeCA9IHRhYmxlLHkgPSBuKSkgK2dlb21fY29sKHBvc2l0aW9uID0gJ2RvZGdlJykgK2ZhY2V0X3dyYXAofmNvbG9yKQ0KYGBgDQpjw6J1IGzhu4duaCBuw6B5IHThuqFvIHJhIG3hu5l0IGJp4buDdSDEkeG7kyBk4bqhbmcgY+G7mXQgdGjhu4MgaGnhu4duIG3hu5FpIHF1YW4gaOG7hyBnaeG7r2EgxJHhu5kgcuG7mW5nIG3hurd0IGLDoG4gKHRhYmxlKSB2w6Agc+G7kSBsxrDhu6NuZyAobikgY+G7p2EgY8OhYyBraW0gY8awxqFuZywgxJHGsOG7o2MgcGjDom4gbG/huqFpIHRoZW8gbcOgdSBz4bqvYyAoY29sb3IpLiBDw6FjIGPhu5l0IMSRxrDhu6NjIHjhur9wIGNo4buTbmcgbMOqbiBuaGF1IChwb3NpdGlvbiA9ICdkb2RnZScpIHbDoCBiaeG7g3UgxJHhu5MgxJHGsOG7o2MgcGjDom4gY2hpYSB0aMOgbmggY8OhYyBuaMOzbSBuaOG7jyBk4buxYSB0csOqbiBtw6B1IHPhuq9jLg0KDQojIyMgKioxNi504bqhbyBjw6FjIGJp4buDdSDEkeG7kyBjb24gZOG7sWEgdHLDqm4gZ2nDoSB0cuG7iyBj4bunYSBiaeG6v24gcHJpY2UqKg0KYGBge3J9DQpxICU+JSBncm91cF9ieShwcmljZSxjb2xvcikgJT4lIHN1bW1hcmlzZShuPW4oKSklPiVnZ3Bsb3QoYWVzKHggPSBwcmljZSx5ID0gbikpICtnZW9tX2NvbChwb3NpdGlvbiA9ICdkb2RnZScpICtmYWNldF93cmFwKH5jb2xvcikNCmBgYA0KY8OidSBs4buHbmggbsOgeSB04bqhbyByYSBt4buZdCBiaeG7g3UgxJHhu5MgZOG6oW5nIGPhu5l0IHRo4buDIGhp4buHbiBt4buRaSBxdWFuIGjhu4cgZ2nhu69hIGdpw6EgKHByaWNlKSB2w6Agc+G7kSBsxrDhu6NuZyAobikgY+G7p2EgY8OhYyBraW0gY8awxqFuZywgxJHGsOG7o2MgcGjDom4gbG/huqFpIHRoZW8gbcOgdSBz4bqvYyAoY29sb3IpLiBDw6FjIGPhu5l0IMSRxrDhu6NjIHjhur9wIGNo4buTbmcgbMOqbiBuaGF1IChwb3NpdGlvbiA9ICdkb2RnZScpIHbDoCBiaeG7g3UgxJHhu5MgxJHGsOG7o2MgcGjDom4gY2hpYSB0aMOgbmggY8OhYyBuaMOzbSBuaOG7jyBk4buxYSB0csOqbiBtw6B1IHPhuq9jLg0KDQojIyMgKioxNy5CaeG7g3UgxJHhu5MgdGjhu4MgaGnhu4duIHBow6JuIHBo4buRaSBj4bunYSBjw6FjIGdpw6EgdHLhu4sgKioNCmBgYHtyfQ0KcSA8LSBxICU+JSBtdXRhdGUoY2FyYXRDID0gY3V0KGNhcmF0LDUsIGxhYmVsID0gYygncuG6pXQgbmjhu48nLCAnbmjhu48nLCd24burYScsJ2zhu5tuJywncuG6pXQgbOG7m24nKSkpDQpxICU+JSBnZ3Bsb3QoYWVzKHggPSBjYXJhdEMpKSArZ2VvbV9iYXIoZmlsbCA9ICdyZWQnKQ0KYGBgDQpjw6J1IGzhu4duaCBuw6B5IHThuqFvIHJhIG3hu5l0IGJp4buDdSDEkeG7kyBj4buZdCB0aOG7gyBoaeG7h24gcGjDom4gcGjhu5FpIGPhu6dhIGPDoWMgZ2nDoSB0cuG7iyB0cm9uZyBj4buZdCBt4bubaSBjYXJhdEMsIMSRxrDhu6NjIHThuqFvIHJhIGLhurFuZyBjw6FjaCBjaGlhIGdpw6EgdHLhu4sgY+G7p2EgY+G7mXQgY2FyYXQgdGjDoG5oIDUgbmjDs20ga2jDoWMgbmhhdS4gQ+G7mXQgY2FyYXRDIMSRxrDhu6NjIHPhu60gZOG7pW5nIHRyw6puIHRy4bulYyB4IGPhu6dhIGJp4buDdSDEkeG7kywgdsOgIG3DoHUgZmlsbCBj4bunYSBjw6FjIGPhu5l0IMSRxrDhu6NjIHRoaeG6v3QgbOG6rXAgbMOgIG3DoHUgxJHhu48uDQoNCiMjIyAqKjE4LkJp4buDdSDEkeG7kyB0aOG7gyBoaeG7h24gc+G7kSBsxrDhu6NuZyBt4buXaSBsb+G6oWkgY+G6r3QgKioNCmBgYHtyfQ0KcSA8LSBxICU+JSBncm91cF9ieShjdXQsIGNvbG9yKSAlPiUgc3VtbWFyaXNlKG4gPSBuKCkpDQpxICU+JSBnZ3Bsb3QoYWVzKHggPSBjdXQsIHkgPSBuKSkgKw0KICBnZW9tX2NvbChkYXRhID0gcSAlPiUgZmlsdGVyKGNvbG9yID09ICdEJyksIGZpbGwgPSAncmVkJykgKw0KICBnZW9tX2NvbChkYXRhID0gcSAlPiUgZmlsdGVyKGNvbG9yID09ICdKJyksIGZpbGwgPSAnYmx1ZScpDQpgYGANCmPDonUgbOG7h25oIG7DoHkgdOG6oW8gcmEgbeG7mXQgYmnhu4N1IMSR4buTIGThuqFuZyBj4buZdCB0aOG7gyBoaeG7h24gc+G7kSBsxrDhu6NuZyBj4bunYSBt4buXaSBsb+G6oWkgY+G6r3QgKGN1dCksIMSRxrDhu6NjIHBow6JuIGxv4bqhaSB0aGVvIG3DoHUgc+G6r2MgKGNvbG9yKS4gQ8OhYyBj4buZdCBjw7MgbcOgdSDEkeG7jyBob+G6t2MgeGFuaCB0xrDGoW5nIOG7qW5nIHbhu5tpIGPDoWMgZ2nDoSB0cuG7iyBj4bulIHRo4buDIGPhu6dhIGNvbG9yLg0KDQojIyMgKioxOS5CaeG7g3UgxJHhu5MgdGjhu4MgaGnhu4duIGdpw6EgdHLhu4sgdHJ1bmcgYsOsbmggdHLhu41uZyBsxrDhu6NuZyBjYXJhdCB0aGVvIG3DoHUgc+G6r2Mga2ltIGPGsMahbmcqKiANCg0KYGBge3J9DQpxIDwtZGlhbW9uZHMNCnEgJT4lIGdyb3VwX2J5KGNvbG9yKSAlPiUgc3VtbWFyaXNlKGs9IG1lYW4oY2FyYXQpKSAlPiUgZ2dwbG90KGFlcyhjb2xvcixrKSkgKw0KICAgIGdlb21fY29sKGZpbGw9J3JlZCcpICsgDQogICAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IHJvdW5kKGssMikpLHZqdXN0ID0gMSwgY29sb3IgPSAnYmxhY2snKSANCmBgYA0KDQogY8OidSBs4buHbmggbsOgeSB04bqhbyByYSBt4buZdCBiaeG7g3UgxJHhu5MgY+G7mXQgdGjhu4MgaGnhu4duIGdpw6EgdHLhu4sgdHJ1bmcgYsOsbmggY+G7p2Ega2jhu5FpIGzGsOG7o25nIGtpbSBjxrDGoW5nIChjYXJhdCkgY2hvIG3hu5dpIG3DoHUgc+G6r2MuIEPDoWMgY+G7mXQgxJHGsOG7o2MgdMO0IG3DoHUgxJHhu48gdsOgIGPDsyBuaMOjbiBz4buRIGxp4buHdSDEkcOtbmgga8OobS4NCiAgLSBUcuG7pWMgeDogVGjhu4MgaGnhu4duIGPDoWMgbcOgdSBz4bqvYyBj4bunYSBraW0gY8awxqFuZy4NCiAgLSBUcuG7pWMgeTogVGjhu4MgaGnhu4duIGdpw6EgdHLhu4sgdHJ1bmcgYsOsbmggdHLhu41uZyBsxrDhu6NuZyBjYXJhdA0KICANCiMjIyAqKjIwLkJp4buDdSDEkeG7kyBj4buZdCB0aOG7gyBoaeG7h24gZ2nDoSB0cuG7iyB0cnVuZyBiw6xuaCB0cuG7jW5nIGzGsOG7o25nIGNhcmF0IHRoZW8gY2jhuqV0IGzGsOG7o25nIGPhuq90IGtpbSBjxrDGoW5nKiogDQpgYGB7cn0NCnEgJT4lIGdyb3VwX2J5KGN1dCkgJT4lIHN1bW1hcmlzZShrPSBtZWFuKGNhcmF0KSkgJT4lDQogIGdncGxvdChhZXMoY3V0LGspKSArDQogICAgZ2VvbV9jb2woZmlsbD0ncmVkJykgKyANCiAgICBnZW9tX3RleHQoYWVzKGxhYmVsID0gcm91bmQoaywyKSksdmp1c3QgPSAxLCBjb2xvciA9ICdibGFjaycpICsNCiAgICBsYWJzKHggPSAnY3V0JywgeSA9ICdtZWFuJykNCmBgYA0KY8OidSBs4buHbmggbsOgeSB04bqhbyByYSBt4buZdCBiaeG7g3UgxJHhu5MgY+G7mXQgdGjhu4MgaGnhu4duIGdpw6EgdHLhu4sgdHJ1bmcgYsOsbmggY+G7p2Ega2jhu5FpIGzGsOG7o25nIChjYXJhdCkgY2hvIG3hu5dpIGxv4bqhaSBj4bqvdCAoY3V0KS4gQ8OhYyBj4buZdCDEkcaw4bujYyB0w7QgbcOgdSDEkeG7jyB2w6AgY8OzIG5ow6NuIHPhu5EgbGnhu4d1IMSRw61uaCBrw6htLg0KICAtIFRy4bulYyB4OiBUaOG7gyBoaeG7h24gY8OhYyBjaOG6pXQgbMaw4bujbmcgY+G6r3Qga2jDoWMgbmhhdSBj4bunYSBraW0gY8awxqFuZw0KICAtIFRy4bulYyB5OiBUaOG7gyBoaeG7h24gZ2nDoSB0cuG7iyB0cnVuZyBiw6xuaCB0cuG7jW5nIGzGsOG7o25nIGNhcmF0DQogIA0KIyMjICoqMjEuQmnhu4N1IMSR4buTIGPhu5l0IHRo4buDIGhp4buHbiBnacOhIHRy4buLIHRydW5nIGLDrG5oIHRy4buNbmcgbMaw4bujbmcgY2FyYXQgdGhlbyDEkeG7mSB0cm9uZyBzdeG7kXQgY+G7p2Ega2ltIGPGsMahbmcqKiANCmBgYHtyfQ0KcSAlPiUgZ3JvdXBfYnkoY2xhcml0eSkgJT4lIHN1bW1hcmlzZShrPSBtZWFuKGNhcmF0KSkgJT4lDQogIGdncGxvdChhZXMoY2xhcml0eSxrKSkgKw0KICAgIGdlb21fY29sKGZpbGw9J3JlZCcpICsgDQogICAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IHJvdW5kKGssMikpLHZqdXN0ID0gMSwgY29sb3IgPSAnYmxhY2snKSArDQogICAgbGFicyh4ID0gJ2NsYXJpdHknLCB5ID0gJ21lYW4nKQ0KYGBgDQpjw6J1IGzhu4duaCBuw6B5IHThuqFvIHJhIG3hu5l0IGJp4buDdSDEkeG7kyBj4buZdCB0aOG7gyBoaeG7h24gZ2nDoSB0cuG7iyB0cnVuZyBiw6xuaCBj4bunYSBraOG7kWkgbMaw4bujbmcgKGNhcmF0KSBjaG8gbeG7l2kgbG/huqFpIGNsYXJpdHkgKMSR4buZIHRyb25nIHN14buRdCkuIEPDoWMgY+G7mXQgxJHGsOG7o2MgdMO0IG3DoHUgxJHhu48gdsOgIGPDsyBuaMOjbiBz4buRIGxp4buHdSDEkcOtbmgga8OobS4NCiAgLSBUcuG7pWMgeDogVGjhu4MgaGnhu4duIGPDoWMgxJHhu5kgdHJvbmcgc3Xhu5F0IGtow6FjIG5oYXUgY+G7p2Ega2ltIGPGsMahbmcNCiAgLSBUcuG7pWMgeTogVGjhu4MgaGnhu4duIGdpw6EgdHLhu4sgdHJ1bmcgYsOsbmggdHLhu41uZyBsxrDhu6NuZyBjYXJhdA0KICANCiMjIyAqKjIyLkJp4buDdSDEkeG7kyB0aOG7gyBoaeG7h24gZ2nDoSB0cuG7iyB0cnVuZyBiw6xuaCBnacOhIGLDoW4gdGhlbyBtw6B1IHPhuq9jIGtpbSBjxrDGoW5nKioNCmBgYHtyfQ0KcSAlPiUgZ3JvdXBfYnkoY29sb3IpICU+JSBzdW1tYXJpc2Uoaz0gbWVhbihwcmljZSkpICU+JQ0KICBnZ3Bsb3QoYWVzKGNvbG9yLGspKSArDQogICAgZ2VvbV9jb2woZmlsbD0ncmVkJykgKyANCiAgICBnZW9tX3RleHQoYWVzKGxhYmVsID0gcm91bmQoaywyKSksdmp1c3QgPSAxLCBjb2xvciA9ICdibGFjaycpICsNCiAgICBsYWJzKHggPSAnTcOgdScsIHkgPSAnbWVhbicpDQpgYGANCiBjw6J1IGzhu4duaCBuw6B5IHThuqFvIHJhIG3hu5l0IGJp4buDdSDEkeG7kyBj4buZdCB0aOG7gyBoaeG7h24gZ2nDoSB0cuG7iyB0cnVuZyBiw6xuaCBj4bunYSBnacOhIGNobyBt4buXaSBsb+G6oWkgbcOgdS4gQ8OhYyBj4buZdCDEkcaw4bujYyB0w7QgbcOgdSDEkeG7jyB2w6AgY8OzIG5ow6NuIHPhu5EgbGnhu4d1IMSRw61uaCBrw6htLiANCiAgLSBUcuG7pWMgeDogVGjhu4MgaGnhu4duIGPDoWMgbcOgdSBz4bqvYyBraMOhYyBuaGF1IGPhu6dhIGtpbSBjxrDGoW5nDQogIC0gVHLhu6VjIHk6IFRo4buDIGhp4buHbiBnacOhIHRy4buLIHRydW5nIGLDrG5oIGdpw6EgYsOhbg0KICANCiMjIyAqKjIzLkJp4buDdSDEkeG7kyB0aOG7gyBoaeG7h24gZ2nDoSB0cuG7iyB0cnVuZyBiw6xuaCBnacOhIGLDoW4gdGhlbyBjaOG6pXQgbMaw4bujbmcgY+G6r3QqKg0KDQoNCmBgYHtyfQ0KcSAlPiUgZ3JvdXBfYnkoY3V0KSAlPiUgc3VtbWFyaXNlKGs9IG1lYW4ocHJpY2UpKSAlPiUNCiAgZ2dwbG90KGFlcyhjdXQsaykpICsNCiAgICBnZW9tX2NvbChmaWxsPSdyZWQnKSArIA0KICAgIGdlb21fdGV4dChhZXMobGFiZWwgPSByb3VuZChrLDIpKSx2anVzdCA9IDEsIGNvbG9yID0gJ2JsYWNrJykgKw0KICAgIGxhYnMoeCA9ICdDaOG6pXQgbMaw4bujbmcgY+G6r3QnLCB5ID0gJ21lYW4nKQ0KYGBgDQpjw6J1IGzhu4duaCBuw6B5IHThuqFvIHJhIG3hu5l0IGJp4buDdSDEkeG7kyBj4buZdCB0aOG7gyBoaeG7h24gZ2nDoSB0cuG7iyB0cnVuZyBiw6xuaCBj4bunYSBnacOhIGNobyBt4buXaSBsb+G6oWkgY+G6r3QuIEPDoWMgY+G7mXQgxJHGsOG7o2MgdMO0IG3DoHUgxJHhu48gdsOgIGPDsyBuaMOjbiBz4buRIGxp4buHdSDEkcOtbmgga8OobS4NCiAgLSBUcuG7pWMgeDogVGjhu4MgaGnhu4duIGPDoWMgY2jhuqV0IGzGsOG7o25nIGPhuq90IGtow6FjIG5oYXUgY+G7p2Ega2ltIGPGsMahbmcNCiAgLSBUcuG7pWMgeTogVGjhu4MgaGnhu4duIGdpw6EgdHLhu4sgdHJ1bmcgYsOsbmggZ2nDoSBiw6FuDQogIA0KIyMjICoqMjQuQmnhu4N1IMSR4buTIHRo4buDIGhp4buHbiBnacOhIHRy4buLIHRydW5nIGLDrG5oIGdpw6EgYsOhbiB0aGVvIMSR4buZIHRyb25nIHN14buRdCoqDQoNCmBgYHtyfQ0KcSAlPiUgZ3JvdXBfYnkoY2xhcml0eSkgJT4lIHN1bW1hcmlzZShrPSBtZWFuKHByaWNlKSkgJT4lDQogIGdncGxvdChhZXMoY2xhcml0eSxrKSkgKw0KICAgIGdlb21fY29sKGZpbGw9J3JlZCcpICsgDQogICAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IHJvdW5kKGssMikpLHZqdXN0ID0gMSwgY29sb3IgPSAnYmxhY2snKSArDQogICAgbGFicyh4ID0gJ8SQ4buZIHRyb25nIHN14buRdCcsIHkgPSAnbWVhbicpDQpgYGAgIA0KICBjw6J1IGzhu4duaCBuw6B5IHThuqFvIHJhIG3hu5l0IGJp4buDdSDEkeG7kyBj4buZdCB0aOG7gyBoaeG7h24gZ2nDoSB0cuG7iyB0cnVuZyBiw6xuaCBj4bunYSBnacOhIGNobyBt4buXaSBt4bupYyDEkeG7mSB0cm9uZyBzdeG7kXQgY+G7p2Ega2ltIGPGsMahbmcuIEPDoWMgY+G7mXQgxJHGsOG7o2MgdMO0IG3DoHUgxJHhu48gdsOgIGPDsyBuaMOjbiBz4buRIGxp4buHdSDEkcOtbmgga8OobS4NCiAgLSBUcuG7pWMgeDogVGjhu4MgaGnhu4duIGPDoWMgxJHhu5kgdHJvbmcgc3Xhu5F0IGtow6FjIG5oYXUgY+G7p2Ega2ltIGPGsMahbmcNCiAgLSBUcuG7pWMgeTogVGjhu4MgaGnhu4duIGdpw6EgdHLhu4sgdHJ1bmcgYsOsbmggZ2nDoSBiw6FuDQogIA0KIyMjICoqMjUuQmnhu4N1IMSR4buTIGPhu5l0IHRo4buDIGhp4buHbiBwaMawxqFuZyBzYWkgZ2nDoSBiw6FuIHRoZW8gbcOgdSBz4bqvYyBraW0gY8awxqFuZyoqDQoNCg0KYGBge3J9DQpxICU+JSBncm91cF9ieShjb2xvcikgJT4lIHN1bW1hcmlzZShrPSB2YXIocHJpY2UpKSAlPiUNCiAgZ2dwbG90KGFlcyhjb2xvcixrKSkgKw0KICAgIGdlb21fY29sKGZpbGw9J3JlZCcpICsgDQogICAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IHJvdW5kKGssMikpLHZqdXN0ID0gMSwgY29sb3IgPSAnYmxhY2snKSArDQogICAgbGFicyh4ID0gJ03DoHUnLCB5ID0gJ3ZhcicpDQpgYGAgIA0KY8OidSBs4buHbmggbsOgeSB04bqhbyByYSBt4buZdCBiaeG7g3UgxJHhu5MgY+G7mXQgdGjhu4MgaGnhu4duIGdpw6EgdHLhu4sgcGjGsMahbmcgc2FpIGPhu6dhIGdpw6EgY2hvIG3hu5dpIGxv4bqhaSBtw6B1IGPhu6dhIGtpbSBjxrDGoW5nLiBDw6FjIGPhu5l0IMSRxrDhu6NjIHTDtCBtw6B1IMSR4buPIHbDoCBjw7MgbmjDo24gc+G7kSBsaeG7h3UgxJHDrW5oIGvDqG0uDQogLSBUcuG7pWMgeDogVGjhu4MgaGnhu4duIGPDoWMgbcOgdSBz4bqvYyBraMOhYyBuaGF1IGPhu6dhIGtpbSBjxrDGoW5nDQogIC0gVHLhu6VjIHk6IFRo4buDIGhp4buHbiBwaMawxqFuZyBzYWkgY+G7p2EgZ2nDoSBiw6FuDQogIA0KIyMjICoqMjYuQmnhu4N1IMSR4buTIGPhu5l0IHRo4buDIGhp4buHbiBwaMawxqFuZyBzYWkgZ2nDoSBiw6FuIHRoZW8gY2jhuqV0IGzGsOG7o25nIGPhuq90KioNCg0KDQpgYGB7cn0NCnEgJT4lIGdyb3VwX2J5KGN1dCkgJT4lIHN1bW1hcmlzZShrPSB2YXIocHJpY2UpKSAlPiUNCiAgZ2dwbG90KGFlcyhjdXQsaykpICsNCiAgICBnZW9tX2NvbChmaWxsPSdyZWQnKSArIA0KICAgIGdlb21fdGV4dChhZXMobGFiZWwgPSByb3VuZChrLDIpKSx2anVzdCA9IDEsIGNvbG9yID0gJ2JsYWNrJykgKw0KICAgIGxhYnMoeCA9ICdDaOG6pXQgbMaw4bujbmcgY+G6r3QnLCB5ID0gJ3ZhcicpDQpgYGANCmPDonUgbOG7h25oIG7DoHkgdOG6oW8gcmEgbeG7mXQgYmnhu4N1IMSR4buTIGPhu5l0IHRo4buDIGhp4buHbiBnacOhIHRy4buLIHBoxrDGoW5nIHNhaSBj4bunYSBnacOhIGNobyBt4buXaSBsb+G6oWkgY2jhuqV0IGzGsOG7o25nIGPhuq90IGPhu6dhIGtpbSBjxrDGoW5nLiBDw6FjIGPhu5l0IMSRxrDhu6NjIHTDtCBtw6B1IMSR4buPIHbDoCBjw7MgbmjDo24gc+G7kSBsaeG7h3UgxJHDrW5oIGvDqG0uDQogIC0gVHLhu6VjIHg6IFRo4buDIGhp4buHbiBjw6FjIGNo4bqldCBsxrDhu6NuZyBj4bqvdCBraMOhYyBuaGF1IGPhu6dhIGtpbSBjxrDGoW5nDQogIC0gVHLhu6VjIHk6IFRo4buDIGhp4buHbiBwaMawxqFuZyBzYWkgY+G7p2EgZ2nDoSBiw6FuIA0KDQojIyMgKioyNy5CaeG7g3UgxJHhu5MgY+G7mXQgdGjhu4MgaGnhu4duIHBoxrDGoW5nIHNhaSBnacOhIGLDoW4gdGhlbyDEkeG7mSB0cm9uZyBzdeG7kXQqKg0KDQoNCmBgYHtyfQ0KcSAlPiUgZ3JvdXBfYnkoY2xhcml0eSkgJT4lIHN1bW1hcmlzZShrPSB2YXIocHJpY2UpKSAlPiUNCiAgZ2dwbG90KGFlcyhjbGFyaXR5LGspKSArDQogICAgZ2VvbV9jb2woZmlsbD0ncmVkJykgKyANCiAgICBnZW9tX3RleHQoYWVzKGxhYmVsID0gcm91bmQoaywyKSksdmp1c3QgPSAwLjg1LCBjb2xvciA9ICdibGFjaycpICsNCiAgICBsYWJzKHggPSAnxJDhu5kgdHJvbmcgc3Xhu5F0JywgeSA9ICd2YXInKQ0KYGBgDQpjw6J1IGzhu4duaCBuw6B5IHThuqFvIHJhIG3hu5l0IGJp4buDdSDEkeG7kyBj4buZdCB0aOG7gyBoaeG7h24gcGjGsMahbmcgc2FpIGPhu6dhIGdpw6EgY2hvIG3hu5dpIG3hu6ljIMSR4buZIHRyb25nIHN14buRdCBj4bunYSBraW0gY8awxqFuZy4gQ8OhYyBj4buZdCDEkcaw4bujYyB0w7QgbcOgdSDEkeG7jyB2w6AgY8OzIG5ow6NuIHPhu5EgbGnhu4d1IMSRw61uaCBrw6htLg0KICAtIFRy4bulYyB4OiBUaOG7gyBoaeG7h24gY8OhYyDEkeG7mSB0cm9uZyBzdeG7kXQga2jDoWMgbmhhdSBj4bunYSBraW0gY8awxqFuZw0KICAtIFRy4bulYyB5OiBUaOG7gyBoaeG7h24gcGjGsMahbmcgc2FpIGPhu6dhIGdpw6EgYsOhbg0KICANCiMjIyAqKjI4LkJp4buDdSDEkeG7kyBj4buZdCB0aOG7gyBoaeG7h24gcGjGsMahbmcgc2FpIHRy4buNbmcgbMaw4bujbmcgY2FyYXQgdGhlbyBjaOG6pXQgbMaw4bujbmcgY+G6r3QqKiANCg0KYGBge3J9DQoNCnEgJT4lIGdyb3VwX2J5KGN1dCkgJT4lIHN1bW1hcmlzZShrPSB2YXIoY2FyYXQpKSAlPiUNCiAgZ2dwbG90KGFlcyhjdXQsaykpICsNCiAgICBnZW9tX2NvbChmaWxsPSdyZWQnKSArIA0KICAgIGdlb21fdGV4dChhZXMobGFiZWwgPSByb3VuZChrLDMpKSx2anVzdCA9IDEsIGNvbG9yID0gJ2JsYWNrJykgKw0KICAgIGxhYnMoeCA9ICdDaOG6pXQgbMaw4bujbmcgY+G6r3QnLCB5ID0gJ3ZhcicpDQpgYGANCiAgY8OidSBs4buHbmggbsOgeSB04bqhbyByYSBt4buZdCBiaeG7g3UgxJHhu5MgY+G7mXQgdGjhu4MgaGnhu4duIHBoxrDGoW5nIHNhaSBj4bunYSB0cuG7jW5nIGzGsOG7o25nIGNhcmF0IGNobyBt4buXaSBsb+G6oWkgY2jhuqV0IGzGsOG7o25nIGPhuq90IGPhu6dhIGtpbSBjxrDGoW5nLiBDw6FjIGPhu5l0IMSRxrDhu6NjIHTDtCBtw6B1IMSR4buPIHbDoCBjw7MgbmjDo24gc+G7kSBsaeG7h3UgxJHDrW5oIGvDqG0uDQogIC0gVHLhu6VjIHg6IFRo4buDIGhp4buHbiBjw6FjIGNo4bqldCBsxrDhu6NuZyBj4bqvdCBraMOhYyBuaGF1IGPhu6dhIGtpbSBjxrDGoW5nDQogIC0gVHLhu6VjIHk6IFRo4buDIGhp4buHbiBwaMawxqFuZyBzYWkgY+G7p2EgdHLhu41uZyBsxrDhu6NuZyBjYXJhdA0KICANCiMjIyAqKjI5LkJp4buDdSDEkeG7kyBj4buZdCB0aOG7gyBoaeG7h24gcGjGsMahbmcgc2FpIHRy4buNbmcgbMaw4bujbmcgY2FyYXQgdGhlbyDEkeG7mSB0cm9uZyBzdeG7kXQqKiANCg0KDQpgYGB7cn0NCg0KcSAlPiUgZ3JvdXBfYnkoY2xhcml0eSkgJT4lIHN1bW1hcmlzZShrPSB2YXIoY2FyYXQpKSAlPiUNCiAgZ2dwbG90KGFlcyhjbGFyaXR5LGspKSArDQogICAgZ2VvbV9jb2woZmlsbD0ncmVkJykgKyANCiAgICBnZW9tX3RleHQoYWVzKGxhYmVsID0gcm91bmQoaywyKSksdmp1c3QgPSAxLCBjb2xvciA9ICdibGFjaycpICsNCiAgICBsYWJzKHggPSAnxJDhu5kgdHJvbmcgc3Xhu5F0JywgeSA9ICd2YXInKQ0KYGBgDQogIGPDonUgbOG7h25oIG7DoHkgdOG6oW8gcmEgbeG7mXQgYmnhu4N1IMSR4buTIGPhu5l0IHRo4buDIGhp4buHbiBwaMawxqFuZyBzYWkgY+G7p2EgdHLhu41uZyBsxrDhu6NuZyBjYXJhdCBjaG8gbeG7l2kgbeG7qWMgxJHhu5kgdHJvbmcgc3Xhu5F0IGPhu6dhIGtpbSBjxrDGoW5nLiBDw6FjIGPhu5l0IMSRxrDhu6NjIHTDtCBtw6B1IMSR4buPIHbDoCBjw7MgbmjDo24gc+G7kSBsaeG7h3UgxJHDrW5oIGvDqG0uDQogIC0gVHLhu6VjIHg6IFRo4buDIGhp4buHbiBjw6FjIMSR4buZIHRyb25nIHN14buRdCBraMOhYyBuaGF1IGPhu6dhIGtpbSBjxrDGoW5nDQogIC0gVHLhu6VjIHk6IFRo4buDIGhp4buHbiBwaMawxqFuZyBzYWkgY+G7p2EgdHLhu41uZyBsxrDhu6NuZyBjYXJhdA0KICANCiMjICozMzAuQmnhu4N1IMSR4buTIGPhu5l0IGvDqXAgdGhlbyBjdXQgcGjDom4gdMOhY2ggdGhlbyBjb2xvciwgdGjhu4MgaGnhu4duIGdpw6EgdHJ1bmcgYsOsbmgqICAgDQoNCmBgYHtyfQ0KcSAlPiUgZ3JvdXBfYnkoY3V0LGNvbG9yKSAlPiUgc3VtbWFyaXNlKGsgPW1lYW4ocHJpY2UpKSAlPiUNCiAgZ2dwbG90KGFlcyh4ID0gY3V0LHkgPSBrKSkgKw0KICAgIGdlb21fY29sKHBvc2l0aW9uID0gJ2RvZGdlJywgZmlsbD0gJ2JsdWUnKSArDQogICAgZmFjZXRfd3JhcCh+Y29sb3IpICsNCiAgICBnZW9tX3RleHQoYWVzKGxhYmVsID0gcm91bmQoaywxKSksdmp1c3QgPSAwLjI1LCBjb2xvciA9ICdibGFjaycpICsNCiAgICBsYWJzKHggPSAnTG/huqFpJywgeSA9ICdtZWFuJykNCmBgYA0KY8OidSBs4buHbmggbsOgeSB04bqhbyByYSBt4buZdCBiaeG7g3UgxJHhu5MgY+G7mXQgdGjhu4MgaGnhu4duIGdpw6EgdHLhu4sgdHJ1bmcgYsOsbmggY+G7p2EgZ2nDoSBjaG8gbeG7l2kgbG/huqFpIGPhuq90IGPhu6dhIGtpbSBjxrDGoW5nLCDEkcaw4bujYyBwaMOibiBsb+G6oWkgdGhlbyBtw6B1LiBDw6FjIGPhu5l0IMSRxrDhu6NjIHTDtCBtw6B1IHhhbmggdsOgIGPDsyBuaMOjbiBz4buRIGxp4buHdSDEkcOtbmgga8OobS4NCg0KDQoNCg0KDQoNCg0KICANCiAgDQogIA==