Phân tích dữ
liệu
Gọi bộ dữ liệu ggplot2 để dùng hiệu quả hơn cho các phép
tính
options(repos = c(CRAN = "http://cran.rstudio.com/"))
install.packages("ggplot2")
## Installing package into 'C:/Users/PC_Dell/AppData/Local/R/win-library/4.3'
## (as 'lib' is unspecified)
## package 'ggplot2' successfully unpacked and MD5 sums checked
##
## The downloaded binary packages are in
## C:\Users\PC_Dell\AppData\Local\Temp\RtmpQDV5zX\downloaded_packages
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
library(scales)
library(DT)
Trước hết tôi sẽ gán bộ dữ liệu cho biến cụ thể
ck <- ChickWeight
datatable(ck)
Biểu đồ thể hiện số
lượng gà theo Diet
ck %>% group_by(Diet) %>% summarise(n = n()) %>% #Tạo một bảng dữ liệu mới bằng cột Diet và tổng các phần tử
ggplot( aes( x = as.factor(Diet), y = n)) + #Bắt đầu một biểu đồ sử dụng gói ggplot với trục x là Diet, trục y là các phần tử n
geom_col(fill = 'skyblue') + #Thêm các cột vào biểu đồ, các cột được thiết lập màu là skyblue
geom_text(aes(label = n), vjust = 1, color = 'red') + #thêm nhãn số lượng gà vào mỗi cột, căn chỉnh độ dọc của nhãn cũng như đặt màu là đỏ
xlab('Số thứ tự Chick') + #Đặt nhãn trục x
ylab('Số lượng gà') + #Đặt nhãn trục y
labs(title = 'Biểu đồ số lượng gà theo loại khẩu phần của gà con') #Đặt tên cho tiêu đề của bảng vẽ

- Nhìn vào ta thấy biểu đồ thể hiện số lượng gà con trên mỗi chế độ
dinh dưỡng
- Loại dinh dưỡng 1 nhiều nhất có 220 con, loại 2 có 120 con, loại 3
có 120 con, loại 4 có 118 con là ít nhất nhưng không đáng kể
Biểu đồ thể hiện
Trọng lượng gà trung bình theo Diet
ck %>% group_by(Diet) %>% summarise(avg = mean(weight)) %>% #Sử dụng dữ liệu từ ck nhóm cột Diet cũng nhưng tính cân nặng trung bình của cột weight
ggplot(aes(x = as.factor(Diet), y = avg)) + #Bắt đầu một biểu đồ sử dụng gói ggplot với trục x là Diet, trục y là lượng trung bình
geom_col(fill = 'yellow') + #Thêm các cột vào biểu đồ, thiết lập màu các cột là yellow
geom_text(aes(label = round(avg,2)), vjust = 1, color = 'red') + #Thêm nhãn về lượng trung bình vào mỗi cột, thiết lập sau dấu phẩy chỉ lấy 2 chữ số, căn chỉnh độ dọc của của nhãn cũng như màu sắc là đỏ
labs( x = 'loại Diet', y = 'Trọng lượng gà con trung bình (gram)', title = 'trọng lượng gà con trung bình theo Diet') + #Đặt nhãn cho trục x, y cũng như tiêu đề của vùng dữ liệu được vẽ
coord_flip() #Đảo ngược trục của biểu đồ, từ dọc thành ngang và ngược lại

- Biểu đồ thể hiện trọng lượng gà trung bình theo từng loại Diet
- Loại 1 thấp nhất với trọng lượng trung bình xấp xỉ 102.65, tiếp đó
là loại 2 là 122.52, loại 4 là 135.26 và cao nhất là loại 4 với trọng
lượng trung bình đạt 142.95
Biểu độ phân tích
trung tâm cân nặng ( theo từng Diet)
ck %>% group_by(Diet) %>% summarise(m= median(weight)) %>% #Sử dụng dữ liệu từ ck tạo một bảng dữ liệu mới, nhóm cột Diet lại và chọn dự liệu là trung vị của weight đưa vào
ggplot(aes(x = Diet,y = m)) + #Chọn chỉ định trục x sẽ lấy từ Diet, trục y là trung vị của weight
geom_col(position = 'dodge', fill = 'pink', color = 'black') + #sắp xếp cột dữ liệu, đổ màu nền, màu viền
geom_text(aes(label = round(m,2)), vjust = 2, color = 'red') + #Chỉ định ký tự cột dữ liệu có giá trị, giá trị sau dấu phẩu có 2, khoảng cách chỉ định chiều dọc là 2, màu đỏ
labs(x = 'Loại dinh dưỡng', y = 'Trung vị', title ='Trung vị theo cân nặng từng loại dinh dưỡng') #gán nhãn cho trục x, y và tiêu đề cho biểu đồ

- Biểu độ cho ta thấy được trung vị, từng có 50% phần tử bên trong nhỏ
hơn và số còn lại lớn hơn. Tức với mỗi từng loại dinh dưỡng, trung vị
theo cân nặng sẽ khác nhau.
- với loại dinh dưỡng 1, có khoảng 50% số kg được ghi nhận là nhỏ hơn
88, 50% số kg được ghi nhân là lớn hơn 88, theo đó thi loại 2 là 104.5,
loại 3 là 125.5 và loại dinh dưỡng 4 là 129.5
Biểu đồ thể hiện
tương quan giữa weight và Diet
ck %>% ggplot(aes(x = weight, y = Time, color = Diet)) + #Sử dụng dữ liệu từ ck tạo một bảng dữ liệu mới trong gói ggplot, thiết lập trục x, y, phân loại các điểm theo từng loại dinh dưỡng và phân bố màu cho chúng
geom_point() + #Thêm các điểm vào biểu đồ, mỗi điểm là một quan sát được đối chiếu theo trục x và y
labs( x = 'cân nặng gà con', y = 'Thời gian quan sát', title = 'Tương quan giữa gà con và cân nặng theo loại dinh dưỡng') #Đặt nhãn cho trục x và y, thiết lập lại tên tiêu đề mới cho vùng dữ liêụ

- Biểu độ cho ta thấy tượng quan giữa cân nặng gà con theo thời gian
quan sát chúng theo từng loại dinh dưỡng
- Ta thấy được cân nặng gà con càng lớn thì thòi gian quan sát cũng
phải lâu, tùy theo loại dinh dưỡng có ảnh hưởng tới cân nặng của gà
con
- Mật độ dinh dưỡng của loại 4, 1 phân bổ rất dày với gà con trong
khoảng 0 đến 200 gam.
Biểu đồ thể hiện số
lượng Diet theo Pie chart
ck %>% group_by(Diet) %>% summarise(n=n()) %>% #Tạo bảng dữ liệu mới các các cộng Diet và tổng n
ggplot(aes(x= '', y=n, fill = Diet))+ #Bắt đầu một biểu đồ sử dụng gói ggplot với trục x không có dữ liệu, trục y là các phần tử n, và màu sắc được thêm vào phân biệt các loại Diet
geom_col(color = 'black', width = 1) + #Thêm các cột vào biểu đồ, mỗi cột là một loại dinh dưỡng cũng như độ rộng là 1
coord_polar('y') + #Chuyển đổi biểu đồ thành hệ tọa độ cực, biểu thị các phần tương đối trong một vòng tròn
geom_text(aes(x = 1.4, label = n), position = position_stack(vjust = .5)) + #Các nhãn sẽ đật ở vị trí 1.3 trên trục x, trục y hiển thị số lượng và các nhãn được chồng với nhau lên căn chỉnh ở vị trí .5
labs( title = 'Số lượng Diet') + #Thêm phần tiêu đề vào vùng vẽ biểu đồ
theme_void() #Loại bỏ các phần mặc định của giao diện của biểu đồ, chỉ hiển thị dữ liệu và các yếu tố trực tiếp liên quan đến nó.

- Biểu đồ cho ta thấy số lượng gà con của từng loại dinh dưỡng nhưng ở
dạng Pie chart
- với loại 1 là 220 con là lớn nhất và loại 4 là ít nhất với 118
con
Biểu đồ density thể
hiện weight và Diet theo số lượng
ck %>% ggplot( aes(x = weight, fill = as.factor(Diet))) +
geom_density(alpha = 0.5) + # Thiết lập độ mờ của các đường density
labs(title = "Density plot của trọng lượng gà con theo loại khẩu phần", x = "Trọng lượng (grams)", y = "Mật độ") +
scale_fill_discrete(name = "Loại khẩu phần") + # Thêm chú thích cho fill
theme_minimal()# Chọn theme cho biểu đồ

- Biểu đồ cho ta thấy sự phân bố trọng lượng trong mỗi nhóm với từng
loại khẩu phần dinh dưỡng cho gà con riêng biệt
- Mật độ loại một chiếm rất cao và dày trong khoảng từ 100 đến nửa
200g rồi làm giảm một cách rõ rệt, tiếp đó là loại 2 và xuống lần tới
loại 3,4
- Khoang có sự chênh lệnh quá lớn từ khoảng nửa 100 đến 200g trở đi
của khẩu phần 1, 2, 3, Loại dinh dưỡng 4 ảnh hưởng lớn đến cân nặng từ
100 đến 200g của gà con
Biểu đồ thể hiện mật
độ trọng trọng lượng gà con (Density plot)
ck %>% ggplot( aes(x = weight, fill = as.factor(Diet))) +
geom_density(alpha = 0.5) + # Thiết lập độ mờ của các đường density
facet_wrap(~Diet) + #Phân tổ các biểu đồ nhỏ hơn theo Diet
labs(title = "Density plot của trọng lượng gà con theo loại khẩu phần", x = "Trọng lượng (grams)", y = "Mật độ") +
scale_fill_discrete(name = "Loại khẩu phần") # Thêm chú thích cho fill

- Tương tự như biểu đồ trên, mỗi phần nhỏ chỉ ra mật độ trọng lượng
khi cho các loại khẩu phần riêng biệt đối với gà con
- Loại khẩu phần 1 với trọng lượng gà con 100g đổ lại rất nhiều
Biểu đồ thể hiện số
lượng gà theo Diet
ck %>% group_by(Diet) %>% summarise(n = n()) %>% #Nhóm các dòng dữ liệu của ck theo cột Diet, sau đó tính tổng số lượng cho mỗi nhóm
ggplot(aes(x = '', y = n,fill = Diet)) + #Sử dụng dữ liệu từ bước trước thiết lập biểu đồ với trục x là không có dữ liệu, y là n, màu sắc đc ánh xạ vào Diet
geom_col( color = 'black' ) + #Thêm các cột vào biểu đồ, với màu được thiết lập là màu đen
geom_text(aes(label = n),position = position_stack(vjust = 1)) + #Thêm nhãn vào biểu đồ, hiển thị số lượng gà con trên mỗi cột, căn chỉnh vị trí dọc các nhãn, đặt trên cùng mỗi cột
labs( y = 'số lượng', title = 'số lượng gà con cho mỗi chế độ dinh dưỡng') #Thiết lập nhãn cho trụ y, tiêu đề của vùng dữ liệu được vẽ

- Biểu đồ thể hiện cho ta thấy số lượng gà con theo từng loại dinh
dưỡng, các số liệu được chồng theo một cột và tùy theo số lượng mà độ
dày khác nhau
- Loại dinh dưỡng 1 có độ dày chiếm ưu thế, số lượng nhiều nhất, 3
loại kia không chênh lệch đáng kể
Biểu đồ thể hiện
tương quan giữa cân nặng gà con và loại dinh dưỡng theo Diet
ck %>% ggplot(aes(x = weight, y = Time, color = Diet)) + #Sử dụng dữ liệu từ ck tạo một bảng dữ liệu mới trong gói ggplot, thiết lập trục x, y, phân loại các điểm theo từng loại dinh dưỡng và phân bố màu cho chúng
geom_point() + #Thêm các điểm vào biểu đồ, mỗi điểm là một quan sát được đối chiếu theo trục x và y
labs( x = 'cân nặng gà con', y = 'Thời gian quan sát', title = 'Tương quan giữa gà con và cân nặng theo loại dinh dưỡng') + #Đặt nhãn cho trục x và y, thiết lập lại tên tiêu đề mới cho vùng dữ liêụ
geom_smooth(method = 'lm', color = 'black')
## `geom_smooth()` using formula = 'y ~ x'

- Đường trend line có xu hướng lên trên, mối tương quan dương giữa các
dữ liệu
- Với cân nặng gà con lớn, phải bổ sung dinh dưỡng theo đó mà thời
gian quan sát cũng sẽ phải tăng lên
Biểu đồ thể hiện tỷ
lệ dinh dưỡng theo Diet
ck %>% group_by(Diet) %>% summarise(n = n()) %>% #Nhóm các cột dữ liệu theo giá trị trong cột Diet
ggplot(aes(Diet,n)) + #Sử dụng dữ liệu trước đó, ánh xạ trụng x là cột Diet, trục y là cột n
geom_col(fill='green') + #Thêm các cột vào biểu đồ, màu của các cột xanh lá cây
geom_text(aes(label = percent(n/length(ck$Diet))),vjust = 2, color = 'red') + #thêm nhãn cho các cột của biểu đồ, ở đây là phần trăm số lượng mỗi loại Diet trên tổng, căn chỉnh chiều dọc và màu đỏ cho nhãn
labs(x = 'Loại dinh dưỡng', y = 'Số lượng', title = 'Tỷ lệ loại dinh dưỡng') #Thêm nhãn cho trục x, trục y và tiêu đề

- Biểu đồ cho ta thấy phần trăm số lượng gà con trong mỗi loại dinh
dưỡng được nuôi
- Loại dinh dưỡng số 1 có số lượng gà con chiếm 38.6%, loại dinh dưỡng
số 2,3 có 20.76% tổng số lượng gà con, còn lại là loại dinh dưỡng số 4
số lượng gà con chiếm 20.42%.
Biểu đồ thể hiện
Tương quan giữa cân nặng gà con và thời gian quan sát theo loại
Diet
ck %>% ggplot(aes(x = weight, y = Time, color = Diet)) + #Sử dụng dữ liệu từ ck tạo một bảng dữ liệu mới trong gói ggplot, thiết lập trục x, y, phân loại các điểm theo từng loại dinh dưỡng và phân bố màu cho chúng
geom_point() + #Thêm các điểm vào biểu đồ, mỗi điểm là một quan sát được đối chiếu theo trục x và y
labs( x = 'cân nặng gà con', y = 'Thời gian quan sát', title = 'Tương quan giữa gà con và cân nặng theo loại dinh dưỡng') + #Đặt nhãn cho trục x và y, thiết lập lại tên tiêu đề mới cho vùng dữ liêụ
geom_smooth(method = 'lm', color = 'green') + #Thêm đường phù hợp tuyến tính, bằng phương pháp hồi quy tuyến tính
facet_wrap(~Diet) #Phân loại các bảng nhỏ hơn theo loại Diet
## `geom_smooth()` using formula = 'y ~ x'

- Cân nặng gà con tùy theo từng loại dinh dưỡng có xu hướng tăng theo
thời gian quan sát
Biểu đồ thể hiện
lượng cân nặng trung bình theo Diet ( Dạng Pie )
ck %>% group_by(Diet) %>% summarise(n=mean(weight)) %>% #Tạo bảng dữ liệu mới các các cộng Diet và tính lượng trung bình
ggplot(aes(x= '', y=n, fill = Diet))+ #Bắt đầu một biểu đồ sử dụng gói ggplot với trục x không có dữ liệu, trục y là các phần tử n, và màu sắc được thêm vào phân biệt các loại Diet
geom_col(color = 'black', width = 1) + #Thêm các cột vào biểu đồ, mỗi cột là một loại dinh dưỡng cũng như độ rộng là 1
coord_polar('y') + #Chuyển đổi biểu đồ thành hệ tọa độ cực, biểu thị các phần tương đối trong một vòng tròn
geom_text(aes(x = 1.3, label = round(n,2)), position = position_stack(vjust = .5)) + #Các nhãn sẽ đật ở vị trí 1.3 trên trục x, trục y, tính giá trị trung bình và lấy hai giá trị sau đó, hiển thị số lượng và các nhãn được chồng với nhau lên căn chỉnh ở vị trí .5
labs( title = 'Trọng lượng trung bình') + #Thêm phần tiêu đề vào vùng vẽ biểu đồ
theme_void() #Loại bỏ các phần mặc định của giao diện của biểu đồ, chỉ hiển thị dữ liệu và các yếu tố trực tiếp liên quan đến nó.

- Biểu đồ thể hiện trọng lượng gà con trung bình theo từng loại dinh
dưỡng
- Loại 1 có trọng lượng trung bình là 102.65, loại 2 là 122.62, loại 3
là 142.95, loại 4 là 135.26
Biểu đồ thể hiện
thời gian trung bình theo Diet ( dạng Pie )
ck %>% group_by(Diet) %>% summarise(n=mean(Time)) %>% #Tạo bảng dữ liệu mới các các cộng Diet và tính thời gian trung bình
ggplot(aes(x= '', y=n, fill = Diet))+ #Bắt đầu một biểu đồ sử dụng gói ggplot với trục x không có dữ liệu, trục y là các phần tử n, và màu sắc được thêm vào phân biệt các loại Diet
geom_col(color = 'black', width = 1) + #Thêm các cột vào biểu đồ, mỗi cột là một loại dinh dưỡng cũng như độ rộng là 1
coord_polar('y') + #Chuyển đổi biểu đồ thành hệ tọa độ cực, biểu thị các phần tương đối trong một vòng tròn
geom_text(aes(x = 1.3, label = round(n,2)), position = position_stack(vjust = .5)) + #Các nhãn sẽ đật ở vị trí 1.3 trên trục x, trục y, tính giá trị trung bình và lấy hai giá trị sau đó, hiển thị số lượng và các nhãn được chồng với nhau lên căn chỉnh ở vị trí .5
labs( title = 'Thời gian trung bình') + #Thêm phần tiêu đề vào vùng vẽ biểu đồ
theme_void() #Loại bỏ các phần mặc định của giao diện của biểu đồ, chỉ hiển thị dữ liệu và các yếu tố trực tiếp liên quan đến nó.

- Thời gian quan sát trung bình của gà con theo từng loại dinh
dưỡng
- Loại dinh dưỡng 1 có thời gian quan sát trung bình là 10.48, loại 2
là 10.92, loại 3 là 10.92 còn loại 4 là 10.75
Biểu đồ thể hiện tần
suất xuất hiện trọng lượng gà con
ck %>% ggplot(aes(x = weight)) + #Bắt đầu một biểu đồ ggplot với trục x được thiết lập là cột "weight"
geom_histogram(binwidth = 50, fill = "skyblue", color = "black", aes(y=..count..)) + #Thiết lập dữ liệu hiển thị dưới dạng histogram, đặt chiều rộng bin, màu nền và viền, sử dụng tần suất tuyệt đối
labs(x = "Trọng lượng (g)", y = "Tần suất") + #Thiết lập nhãn cho trục x và trục y
ggtitle("Phân phối của trọng lượng gà con") + #Thiết lập tiêu đề cho biểu đồ
theme_minimal() #Chọn giao diện đơn giản, đường lưới cho biểu đồ

- Biểu đồ cho thấy tần suất suất hiện các chỉ số trọng lượng gà
con
- tần suất xuất hiện của trọng lượng dưới 100g xuất hiện nhiều nhất
hơn 200 lần và giảm dần
Biểu đồ phân phối
trong lượng gà con với tần suất (theo Diet)
ck %>% ggplot(aes(x = weight)) + #Bắt đầu một biểu đồ ggplot với trục x được thiết lập là cột "weight"
geom_histogram(binwidth = 50, fill = "skyblue", color = "black", aes(y=..count..)) + #Thiết lập dữ liệu hiển thị dưới dạng histogram, đặt chiều rộng bin, màu nền và viền, sử dụng tần suất tuyệt đối
labs(x = "Trọng lượng (g)", y = "Tần suất") + #Thiết lập nhãn cho trục x và trục y
facet_wrap(~Diet) + #Phân loại các bảng nhỏ theo loại Diet
ggtitle("Phân phối của trọng lượng gà con") #Thiết lập tiêu đề cho biểu đồ

- Biểu đồ cho ra thấy chỉ số xuất hiện của các chỉ số trọng lượng gà
con được phân ra theo loại dinh dưỡng
Biểu đồ thể hiện tần
suất xuất hiện các mốc thời gian quan sát
ck %>% ggplot(aes(x = Time)) + #Bắt đầu một biểu đồ ggplot với trục x được thiết lập là cột "Time"
geom_histogram(binwidth = 3, fill = "red", color = "black", aes(y=..count..)) + #Thiết lập dữ liệu hiển thị dưới dạng histogram, đặt chiều rộng bin là 5, màu nền và màu viền
labs(x = "Thời gian (h)", y = "Tần suất") + #Thiết lập nhãn cho trục x và y
ggtitle("Phân phối của thời gian theo dõi gà con") + #Thiết lập tiêu đề cho biểu đồ
theme_minimal() #Giao diện dạng lưới

- Biểu đố cho ta thấy các tần suất các khoảng thời gian xuất hiện
- Khoảng thời gian xuất hiện nhiều nhất từ 0 đến 5 và giảm dần về
20
Biểu đồ thể hiện
trọng lượng gà con theo thời gian (line)
ggplot(ChickWeight, aes(x = Time, y = weight, color = Chick)) +
geom_line() +
labs(x = "Thời gian (ngày)", y = "Trọng lượng (g)", color = "Gà") +
ggtitle("Biểu đồ đường của trọng lượng gà theo thời gian") +
theme_minimal()

Biểu đồ thể hiện mật
độ của trọng lượng gà ( violin plot)
ck %>% ggplot(aes(x = as.factor(Diet), y = weight, fill = as.factor(Diet))) + #Lấy dữ liệu từ ck, thiết lập trục x, y, màu fill được dựa trên chế độ dinh dưỡng
geom_violin() + #Thiết lập biểu đồ violin plot vào biểu đồ
labs(x = "chế độ dinh dưỡng", y = "Trọng lượng (g)") +
ggtitle("Biểu đồ violin plot của trọng lượng gà") + #Thiết lập tiêu đề cho biểu đồ
theme_minimal() #lấy giao diện dạng lưới

- Biểu đồ cho ta thấy mật độ phân phối của trọng lượng các gà con theo
từng chế độ dinh dưỡng
- ở chế độ dinh dưỡng 1 thì có mật độ phân phối trọng lượng dưới 100g
nhiều nhất, cả 4 loại đều có xu hướng giảm dần, trọng lượng các lớn thì
càng ít, lớn nhất có thể đạt được ở khẩu phần dinh dưỡng số 3
Biểu đồ thể hiện mật
độ trọng lượng qua các mốc
ck %>%
ggplot(aes(x = Time, y = weight)) + #Bắt đầu một chuỗi dữ liệu mới với việc thiết lập trục x, y
geom_violin(fill = "skyblue", color = "black") + #Thiết lập dạng violin cho biểu độ, màu và màu viền
labs(x = "Thời gian", y = "Trọng lượng (g)",
title = "Sự phát triển của trọng lượng gà con theo thời gian") + #gán nhãn cho từng trục x, y và tiêu đề
theme_minimal() #giao diện dạng lưới

- Biểu đồ cho ta thấy mật độ phân phối của trọng lượng, trọng lượng
càng lớn và ít
Biểu đồ phân phối
trọng lượng dạng Boxplot
ck %>% ggplot(aes(x = factor(Diet), y = weight, fill = factor(Diet))) + #Bắt đầu tạo một đối tượng ggplot, thiết lập trục x, y và màu sắc được xác định bằng diet
geom_boxplot() + #Thêm lớp bloxpot và biến động của trọng lượng gà con theo từng loại khẩu phần
labs(x = "Loại khẩu phần", y = "Trọng lượng gà con", fill = "Loại khẩu phần") + #Đặt nhãn cho trục x, y và màu sắc
ggtitle("Biểu đồ Boxplot của trọng lượng gà con theo loại khẩu phần") #Thêm tiêu đề cho biểu đồ

- Biểu đồ cho thấy các giá trị như trung vị, tứ phân vị và các giá trị
ngoại vi có thể xuất hiện
LS0tDQp0aXRsZTogIk5oaWVtdnU1Ig0KYXV0aG9yOiAiTmd1eeG7hW4gUGjDumMgVGjhu4tuaCINCm91dHB1dDoNCiAgaHRtbF9kb2N1bWVudDogDQogICAgY29kZV9kb3dubG9hZDogdHJ1ZQ0KICAgIGNvZGVfZm9sZGluZzogaGlkZQ0KICAgIG51bWJlcl9zZWN0aW9uczogdHJ1ZQ0KICAgIHRvY19kZXB0aDogNA0KICAgIHRvY19mbG9hdDogdHJ1ZQ0KICAgIHRvYzogdHJ1ZQ0KICB3b3JkX2RvY3VtZW50Og0KICAgICB0b2M6IHRydWUNCiAgICAgdG9jX2RlcHRoOiAnMicNCiAgcGRmX2RvY3VtZW50Og0KICAgIGxhdGV4X2VuZ2luZTogeGVsYXRleA0KLS0tDQoNCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQ0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBUUlVFKQ0KYGBgDQoNCiMgKlThu5VuZyBxdWFuIHbhu4EgYuG7mSBk4buvIGxp4buHdSoNCg0KLSBC4buZIGThu68gbGnhu4d1ICpDaGlja1dlaWdodCogbMOgIG3hu5l0IGLhu5kgZOG7ryBsaeG7h3UgcGjhu5UgYmnhur9uIHRyb25nIHRo4buRbmcga8OqIHbDoCBuZ2hpw6puIGPhu6l1IHNpbmggaOG7jWMuIELhu5kgZOG7ryBsaeG7h3UgbsOgeSBjdW5nIGPhuqVwIHRow7RuZyB0aW4gduG7gSBz4buxIHBow6F0IHRyaeG7g24gY+G7p2EgZ8OgIGNvbiBkxrDhu5tpIMSRaeG7gXUga2nhu4duIGRpbmggZMaw4buhbmcga2jDoWMgbmhhdS4gQuG6sW5nIGPDoWNoIHRoZW8gZMO1aSB0cuG7jW5nIGzGsOG7o25nIGPhu6dhIGfDoCBjb24gdGhlbyB0aOG7nWkgZ2lhbiB2w6AgZMaw4bubaSBz4buxIOG6o25oIGjGsOG7n25nIGPhu6dhIGPDoWMgbG/huqFpIGto4bqpdSBwaOG6p24ga2jDoWMgbmhhdSwgYuG7mSBk4buvIGxp4buHdSBuw6B5IGPDsyB0aOG7gyBjdW5nIGPhuqVwIHRow7RuZyB0aW4gZ2nDoSB0cuG7iyB24buBIHNpbmggbMO9IHbDoCBwaMOhdCB0cmnhu4NuIGPhu6dhIMSR4buZbmcgduG6rXQuDQotIELhu5kgZOG7sSBsaeG7h3UgKkNoaWNrZW5XZWlnaHQqIGJhbyBn4buTbSBjw6FjIGPhu5l0IHNhdToNCiAgIA0KICAgLSAgV2VpZ2h0IChUcuG7jW5nIGzGsOG7o25nKTogQmnhur9uIG7DoHkgxJFvIGzGsOG7nW5nIHRy4buNbmcgbMaw4bujbmcgY+G7p2EgZ8OgIGNvbiB2w6AgxJHGsOG7o2MgZ2hpIGzhuqFpIGLhurFuZyDEkcahbiB24buLIGdyYW1zLiBUcuG7jW5nIGzGsOG7o25nIGPhu6dhIGfDoCBjb24gxJHGsOG7o2MgdGhlbyBkw7VpIHF1YSB0aOG7nWkgZ2lhbiDEkeG7gyDEkW8gbMaw4budbmcgc+G7sSBwaMOhdCB0cmnhu4NuIHbDoCB0xINuZyB0csaw4bufbmcgY+G7p2EgY2jDum5nLg0KDQogICAtICBUaW1lIChUaOG7nWkgZ2lhbik6IEJp4bq/biBuw6B5IHRo4buDIGhp4buHbiB0aOG7nWkgZ2lhbiBxdWFuIHPDoXQsIHRoxrDhu51uZyDEkcaw4bujYyDEkW8gYuG6sW5nIMSRxqFuIHbhu4sgbmfDoHkuIE7DsyBjaG8gYmnhur90IGtob+G6o25nIHRo4budaSBnaWFuIG3DoCBt4buXaSBxdWFuIHPDoXQgdHLhu41uZyBsxrDhu6NuZyDEkcaw4bujYyB0aOG7sWMgaGnhu4duLg0KDQogICAtICBDaGljayAoQ29uIGfDoCk6IMSQw6J5IGzDoCBz4buRIHRo4bupIHThu7EgY+G7p2EgdOG7q25nIGNvbiBnw6AgdHJvbmcgYuG7mSBk4buvIGxp4buHdS4gTeG7l2kgY29uIGfDoCBjw7MgbeG7mXQgc+G7kSB0aOG7qSB04buxIGR1eSBuaOG6pXQgxJHhu4MgcGjDom4gYmnhu4d0IGNow7puZy4NCg0KICAgLSAgRGlldCAoQ2jhur8gxJHhu5kgZGluaCBkxrDhu6FuZyk6IEJp4bq/biBuw6B5IGNo4buJIHJhIGxv4bqhaSBjaOG6vyDEkeG7mSBkaW5oIGTGsOG7oW5nIG3DoCBt4buXaSBjb24gZ8OgIMSRxrDhu6NjIGN1bmcgY+G6pXAuIEPDsyBi4buRbiBsb+G6oWkgY2jhur8gxJHhu5kgZGluaCBkxrDhu6FuZyDEkcaw4bujYyBz4butIGThu6VuZyB0cm9uZyBi4buZIGThu68gbGnhu4d1LCB0aMaw4budbmcgxJHGsOG7o2MgxJHDoW5oIHPhu5EgdOG7qyAxIMSR4bq/biA0Lg0KICAgDQojICpQaMOibiB0w61jaCBk4buvIGxp4buHdSoNCg0KR+G7jWkgYuG7mSBk4buvIGxp4buHdSAqZ2dwbG90MiogxJHhu4MgZMO5bmcgaGnhu4d1IHF14bqjIGjGoW4gY2hvIGPDoWMgcGjDqXAgdMOtbmgNCg0KYGBge3IgZWNobz1UUlVFLCB3YXJuaW5nPUZBTFNFfQ0Kb3B0aW9ucyhyZXBvcyA9IGMoQ1JBTiA9ICJodHRwOi8vY3Jhbi5yc3R1ZGlvLmNvbS8iKSkNCmluc3RhbGwucGFja2FnZXMoImdncGxvdDIiKQ0KbGlicmFyeShnZ3Bsb3QyKQ0KbGlicmFyeShkcGx5cikNCmxpYnJhcnkoc2NhbGVzKQ0KbGlicmFyeShEVCkNCmBgYA0KDQpUcsaw4bubYyBo4bq/dCB0w7RpIHPhur0gZ8OhbiBi4buZIGThu68gbGnhu4d1IGNobyBiaeG6v24gY+G7pSB0aOG7gw0KDQpgYGB7ciBlY2hvPVRSVUUsIHdhcm5pbmc9RkFMU0V9DQpjayA8LSBDaGlja1dlaWdodA0KZGF0YXRhYmxlKGNrKQ0KYGBgDQoNCiMjIEJp4buDdSDEkeG7kyB0aOG7gyBoaeG7h24gc+G7kSBsxrDhu6NuZyBnw6AgdGhlbyBEaWV0DQoNCmBgYHtyIG1lc3NhZ2U9VFJVRSwgd2FybmluZz1GQUxTRX0NCg0KY2sgICU+JSBncm91cF9ieShEaWV0KSAlPiUgc3VtbWFyaXNlKG4gPSBuKCkpICU+JSAjVOG6oW8gbeG7mXQgYuG6o25nIGThu68gbGnhu4d1IG3hu5tpIGLhurFuZyBj4buZdCBEaWV0IHbDoCB04buVbmcgY8OhYyBwaOG6p24gdOG7rQ0KIGdncGxvdCggYWVzKCB4ID0gYXMuZmFjdG9yKERpZXQpLCB5ID0gbikpICsgI0Lhuq90IMSR4bqndSBt4buZdCBiaeG7g3UgxJHhu5Mgc+G7rSBk4bulbmcgZ8OzaSBnZ3Bsb3QgduG7m2kgdHLhu6VjIHggbMOgIERpZXQsIHRy4bulYyB5IGzDoCBjw6FjIHBo4bqnbiB04butIG4NCiAgZ2VvbV9jb2woZmlsbCA9ICdza3libHVlJykgKyAjVGjDqm0gY8OhYyBj4buZdCB2w6BvIGJp4buDdSDEkeG7kywgY8OhYyBj4buZdCDEkcaw4bujYyB0aGnhur90IGzhuq1wIG3DoHUgbMOgIHNreWJsdWUNCiAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IG4pLCB2anVzdCA9IDEsIGNvbG9yID0gJ3JlZCcpICsgI3Row6ptIG5ow6NuIHPhu5EgbMaw4bujbmcgZ8OgIHbDoG8gbeG7l2kgY+G7mXQsIGPEg24gY2jhu4luaCDEkeG7mSBk4buNYyBj4bunYSBuaMOjbiBjxaluZyBuaMawIMSR4bq3dCBtw6B1IGzDoCDEkeG7jw0KICB4bGFiKCdT4buRIHRo4bupIHThu7EgQ2hpY2snKSArICPEkOG6t3QgbmjDo24gdHLhu6VjIHggDQogIHlsYWIoJ1Phu5EgbMaw4bujbmcgZ8OgJykgKyAjxJDhurd0IG5ow6NuIHRy4bulYyB5DQogIGxhYnModGl0bGUgPSAnQmnhu4N1IMSR4buTIHPhu5EgbMaw4bujbmcgZ8OgIHRoZW8gbG/huqFpIGto4bqpdSBwaOG6p24gY+G7p2EgZ8OgIGNvbicpICPEkOG6t3QgdMOqbiBjaG8gdGnDqnUgxJHhu4EgY+G7p2EgYuG6o25nIHbhur0NCmBgYA0KIA0KLSBOaMOsbiB2w6BvIHRhIHRo4bqleSBiaeG7g3UgxJHhu5MgdGjhu4MgaGnhu4duIHPhu5EgbMaw4bujbmcgZ8OgIGNvbiB0csOqbiBt4buXaSBjaOG6vyDEkeG7mSBkaW5oIGTGsOG7oW5nDQotIExv4bqhaSBkaW5oIGTGsOG7oW5nIDEgbmhp4buBdSBuaOG6pXQgY8OzIDIyMCBjb24sIGxv4bqhaSAyIGPDsyAxMjAgY29uLCBsb+G6oWkgMyBjw7MgMTIwIGNvbiwgbG/huqFpIDQgY8OzIDExOCBjb24gbMOgIMOtdCBuaOG6pXQgbmjGsG5nIGtow7RuZyDEkcOhbmcga+G7gw0KDQojIyBCaeG7g3UgxJHhu5MgdGjhu4MgaGnhu4duIFRy4buNbmcgbMaw4bujbmcgZ8OgIHRydW5nIGLDrG5oIHRoZW8gRGlldA0KDQpgYGB7ciBtZXNzYWdlPVRSVUUsIHdhcm5pbmc9RkFMU0V9DQpjayAlPiUgZ3JvdXBfYnkoRGlldCkgJT4lIHN1bW1hcmlzZShhdmcgPSBtZWFuKHdlaWdodCkpICU+JSAjU+G7rSBk4bulbmcgZOG7ryBsaeG7h3UgdOG7qyBjayBuaMOzbSBj4buZdCBEaWV0IGPFqW5nIG5oxrBuZyB0w61uaCBjw6JuIG7hurduZyB0cnVuZyBiw6xuaCBj4bunYSBj4buZdCB3ZWlnaHQNCiAgIGdncGxvdChhZXMoeCA9IGFzLmZhY3RvcihEaWV0KSwgeSA9IGF2ZykpICsgI0Lhuq90IMSR4bqndSBt4buZdCBiaeG7g3UgxJHhu5Mgc+G7rSBk4bulbmcgZ8OzaSBnZ3Bsb3QgduG7m2kgdHLhu6VjIHggbMOgIERpZXQsIHRy4bulYyB5IGzDoCBsxrDhu6NuZyB0cnVuZyBiw6xuaCANCiAgZ2VvbV9jb2woZmlsbCA9ICd5ZWxsb3cnKSArICNUaMOqbSBjw6FjIGPhu5l0IHbDoG8gYmnhu4N1IMSR4buTLCB0aGnhur90IGzhuq1wIG3DoHUgY8OhYyBj4buZdCBsw6AgeWVsbG93DQogIGdlb21fdGV4dChhZXMobGFiZWwgPSByb3VuZChhdmcsMikpLCB2anVzdCA9IDEsIGNvbG9yID0gJ3JlZCcpICsgI1Row6ptIG5ow6NuIHbhu4EgbMaw4bujbmcgdHJ1bmcgYsOsbmggdsOgbyBt4buXaSBj4buZdCwgdGhp4bq/dCBs4bqtcCBzYXUgZOG6pXUgcGjhuql5IGNo4buJIGzhuqV5IDIgY2jhu68gc+G7kSwgY8SDbiBjaOG7iW5oIMSR4buZIGThu41jIGPhu6dhIGPhu6dhIG5ow6NuIGPFqW5nIG5oxrAgbcOgdSBz4bqvYyBsw6AgxJHhu48NCiAgbGFicyggeCA9ICdsb+G6oWkgRGlldCcsIHkgPSAnVHLhu41uZyBsxrDhu6NuZyBnw6AgY29uIHRydW5nIGLDrG5oICAoZ3JhbSknLCB0aXRsZSA9ICd0cuG7jW5nIGzGsOG7o25nIGfDoCBjb24gdHJ1bmcgYsOsbmggdGhlbyBEaWV0JykgKyAjxJDhurd0IG5ow6NuIGNobyB0cuG7pWMgeCwgeSBjxaluZyBuaMawIHRpw6p1IMSR4buBIGPhu6dhIHbDuW5nIGThu68gbGnhu4d1IMSRxrDhu6NjIHbhur0NCiAgY29vcmRfZmxpcCgpICPEkOG6o28gbmfGsOG7o2MgdHLhu6VjIGPhu6dhIGJp4buDdSDEkeG7kywgdOG7qyBk4buNYyB0aMOgbmggbmdhbmcgdsOgIG5nxrDhu6NjIGzhuqFpDQpgYGANCg0KLSBCaeG7g3UgxJHhu5MgdGjhu4MgaGnhu4duIHRy4buNbmcgbMaw4bujbmcgZ8OgIHRydW5nIGLDrG5oIHRoZW8gdOG7q25nIGxv4bqhaSBEaWV0DQotIExv4bqhaSAxIHRo4bqlcCBuaOG6pXQgduG7m2kgdHLhu41uZyBsxrDhu6NuZyB0cnVuZyBiw6xuaCB44bqlcCB44buJIDEwMi42NSwgdGnhur9wIMSRw7MgbMOgIGxv4bqhaSAyIGzDoCAxMjIuNTIsIGxv4bqhaSA0IGzDoCAxMzUuMjYgdsOgIGNhbyBuaOG6pXQgbMOgIGxv4bqhaSA0IHbhu5tpIHRy4buNbmcgbMaw4bujbmcgdHJ1bmcgYsOsbmggxJHhuqF0IDE0Mi45NQ0KDQojIyBCaeG7g3UgxJHhu5kgcGjDom4gdMOtY2ggdHJ1bmcgdMOibSBjw6JuIG7hurduZyAoIHRoZW8gdOG7q25nIERpZXQpDQoNCmBgYHtyIG1lc3NhZ2U9VFJVRSwgd2FybmluZz1GQUxTRX0NCmNrICU+JSBncm91cF9ieShEaWV0KSAlPiUgc3VtbWFyaXNlKG09IG1lZGlhbih3ZWlnaHQpKSAlPiUgI1Phu60gZOG7pW5nIGThu68gbGnhu4d1IHThu6sgY2sgdOG6oW8gbeG7mXQgYuG6o25nIGThu68gbGnhu4d1IG3hu5tpLCBuaMOzbSBj4buZdCBEaWV0IGzhuqFpIHbDoCBjaOG7jW4gZOG7sSBsaeG7h3UgbMOgIHRydW5nIHbhu4sgY+G7p2Egd2VpZ2h0IMSRxrBhIHbDoG8NCiAgZ2dwbG90KGFlcyh4ID0gRGlldCx5ID0gbSkpICsgI0No4buNbiBjaOG7iSDEkeG7i25oIHRy4bulYyB4IHPhur0gbOG6pXkgdOG7qyBEaWV0LCB0cuG7pWMgeSBsw6AgdHJ1bmcgduG7iyBj4bunYSB3ZWlnaHQNCiAgZ2VvbV9jb2wocG9zaXRpb24gPSAnZG9kZ2UnLCBmaWxsID0gJ3BpbmsnLCBjb2xvciA9ICdibGFjaycpICsgI3Phuq9wIHjhur9wIGPhu5l0IGThu68gbGnhu4d1LCDEkeG7lSBtw6B1IG7hu4FuLCBtw6B1IHZp4buBbg0KICBnZW9tX3RleHQoYWVzKGxhYmVsID0gcm91bmQobSwyKSksIHZqdXN0ID0gMiwgY29sb3IgPSAncmVkJykgKyAjQ2jhu4kgxJHhu4tuaCBrw70gdOG7sSBj4buZdCBk4buvIGxp4buHdSBjw7MgZ2nDoSB0cuG7iywgZ2nDoSB0cuG7iyBzYXUgZOG6pXUgcGjhuql1IGPDsyAyLCBraG/huqNuZyBjw6FjaCBjaOG7iSDEkeG7i25oIGNoaeG7gXUgZOG7jWMgbMOgIDIsIG3DoHUgxJHhu48NCiAgbGFicyh4ID0gJ0xv4bqhaSBkaW5oIGTGsOG7oW5nJywgeSA9ICdUcnVuZyB24buLJywgdGl0bGUgPSdUcnVuZyB24buLIHRoZW8gY8OibiBu4bq3bmcgdOG7q25nIGxv4bqhaSBkaW5oIGTGsOG7oW5nJykgI2fDoW4gbmjDo24gY2hvIHRy4bulYyB4LCB5IHbDoCB0acOqdSDEkeG7gSBjaG8gYmnhu4N1IMSR4buTDQpgYGANCg0KLSBCaeG7g3UgxJHhu5kgY2hvIHRhIHRo4bqleSDEkcaw4bujYyB0cnVuZyB24buLLCB04burbmcgY8OzIDUwJSBwaOG6p24gdOG7rSBiw6puIHRyb25nIG5o4buPIGjGoW4gdsOgIHPhu5EgY8OybiBs4bqhaSBs4bubbiBoxqFuLiBU4bupYyB24bubaSBt4buXaSB04burbmcgbG/huqFpIGRpbmggZMaw4buhbmcsIHRydW5nIHbhu4sgdGhlbyBjw6JuIG7hurduZyBz4bq9IGtow6FjIG5oYXUuDQotIHbhu5tpIGxv4bqhaSBkaW5oIGTGsOG7oW5nIDEsIGPDsyBraG/huqNuZyA1MCUgc+G7kSBrZyDEkcaw4bujYyBnaGkgbmjhuq1uIGzDoCBuaOG7jyBoxqFuIDg4LCA1MCUgc+G7kSBrZyDEkcaw4bujYyBnaGkgbmjDom4gbMOgIGzhu5tuIGjGoW4gODgsIHRoZW8gxJHDsyB0aGkgbG/huqFpIDIgbMOgIDEwNC41LCBsb+G6oWkgMyBsw6AgMTI1LjUgdsOgIGxv4bqhaSBkaW5oIGTGsOG7oW5nIDQgbMOgIDEyOS41DQoNCiMjIEJp4buDdSDEkeG7kyB0aOG7gyBoaeG7h24gdMawxqFuZyBxdWFuIGdp4buvYSB3ZWlnaHQgdsOgIERpZXQNCg0KYGBge3IgbWVzc2FnZT1UUlVFLCB3YXJuaW5nPUZBTFNFfQ0KY2sgJT4lIGdncGxvdChhZXMoeCA9IHdlaWdodCwgeSA9IFRpbWUsIGNvbG9yID0gRGlldCkpICsgI1Phu60gZOG7pW5nIGThu68gbGnhu4d1IHThu6sgY2sgdOG6oW8gbeG7mXQgYuG6o25nIGThu68gbGnhu4d1IG3hu5tpIHRyb25nIGfDs2kgZ2dwbG90LCB0aGnhur90IGzhuq1wIHRy4bulYyB4LCB5LCBwaMOibiBsb+G6oWkgY8OhYyDEkWnhu4NtIHRoZW8gdOG7q25nIGxv4bqhaSBkaW5oIGTGsOG7oW5nIHbDoCBwaMOibiBi4buRIG3DoHUgY2hvIGNow7puZw0KICBnZW9tX3BvaW50KCkgKyAjVGjDqm0gY8OhYyDEkWnhu4NtIHbDoG8gYmnhu4N1IMSR4buTLCBt4buXaSDEkWnhu4NtIGzDoCBt4buZdCBxdWFuIHPDoXQgxJHGsOG7o2MgxJHhu5FpIGNoaeG6v3UgdGhlbyB0cuG7pWMgeCB2w6AgeQ0KICBsYWJzKCB4ID0gJ2PDom4gbuG6t25nIGfDoCBjb24nLCB5ID0gJ1Ro4budaSBnaWFuIHF1YW4gc8OhdCcsIHRpdGxlID0gJ1TGsMahbmcgcXVhbiBnaeG7r2EgZ8OgIGNvbiB2w6AgY8OibiBu4bq3bmcgdGhlbyBsb+G6oWkgZGluaCBkxrDhu6FuZycpICPEkOG6t3QgbmjDo24gY2hvIHRy4bulYyB4IHbDoCB5LCB0aGnhur90IGzhuq1wIGzhuqFpIHTDqm4gdGnDqnUgxJHhu4EgbeG7m2kgY2hvIHbDuW5nIGThu68gbGnDquG7pQ0KYGBgDQoNCi0gIEJp4buDdSDEkeG7mSBjaG8gdGEgdGjhuqV5IHTGsOG7o25nIHF1YW4gZ2nhu69hIGPDom4gbuG6t25nIGfDoCBjb24gdGhlbyB0aOG7nWkgZ2lhbiBxdWFuIHPDoXQgY2jDum5nIHRoZW8gdOG7q25nIGxv4bqhaSBkaW5oIGTGsOG7oW5nDQotICBUYSB0aOG6pXkgxJHGsOG7o2MgY8OibiBu4bq3bmcgZ8OgIGNvbiBjw6BuZyBs4bubbiB0aMOsIHRow7JpIGdpYW4gcXVhbiBzw6F0IGPFqW5nIHBo4bqjaSBsw6J1LCB0w7l5IHRoZW8gbG/huqFpIGRpbmggZMaw4buhbmcgY8OzIOG6o25oIGjGsOG7n25nIHThu5tpIGPDom4gbuG6t25nIGPhu6dhIGfDoCBjb24NCi0gIE3huq10IMSR4buZIGRpbmggZMaw4buhbmcgY+G7p2EgbG/huqFpIDQsIDEgcGjDom4gYuG7lSBy4bqldCBkw6B5IHbhu5tpIGfDoCBjb24gdHJvbmcga2hv4bqjbmcgMCDEkeG6v24gMjAwIGdhbS4NCg0KIyMgQmnhu4N1IMSR4buTIHRo4buDIGhp4buHbiBz4buRIGzGsOG7o25nIERpZXQgdGhlbyBQaWUgY2hhcnQNCg0KYGBge3IgbWVzc2FnZT1UUlVFLCB3YXJuaW5nPUZBTFNFfQ0KY2sgJT4lIGdyb3VwX2J5KERpZXQpICU+JSBzdW1tYXJpc2Uobj1uKCkpICU+JSAjVOG6oW8gYuG6o25nIGThu68gbGnhu4d1IG3hu5tpIGPDoWMgY8OhYyBj4buZbmcgRGlldCB2w6AgdOG7lW5nIG4NCiAgZ2dwbG90KGFlcyh4PSAnJywgeT1uLCBmaWxsID0gRGlldCkpKyAjQuG6r3QgxJHhuqd1IG3hu5l0IGJp4buDdSDEkeG7kyBz4butIGThu6VuZyBnw7NpIGdncGxvdCB24bubaSB0cuG7pWMgeCBraMO0bmcgY8OzIGThu68gbGnhu4d1LCB0cuG7pWMgeSBsw6AgY8OhYyBwaOG6p24gdOG7rSBuLCB2w6AgbcOgdSBz4bqvYyDEkcaw4bujYyB0aMOqbSB2w6BvIHBow6JuIGJp4buHdCBjw6FjIGxv4bqhaSBEaWV0DQogIGdlb21fY29sKGNvbG9yID0gJ2JsYWNrJywgd2lkdGggPSAxKSArICNUaMOqbSBjw6FjIGPhu5l0IHbDoG8gYmnhu4N1IMSR4buTLCBt4buXaSBj4buZdCBsw6AgbeG7mXQgbG/huqFpIGRpbmggZMaw4buhbmcgY8WpbmcgbmjGsCDEkeG7mSBy4buZbmcgbMOgIDENCiAgY29vcmRfcG9sYXIoJ3knKSArICNDaHV54buDbiDEkeG7lWkgYmnhu4N1IMSR4buTIHRow6BuaCBo4buHIHThu41hIMSR4buZIGPhu7FjLCBiaeG7g3UgdGjhu4sgY8OhYyBwaOG6p24gdMawxqFuZyDEkeG7kWkgdHJvbmcgbeG7mXQgdsOybmcgdHLDsm4NCiAgZ2VvbV90ZXh0KGFlcyh4ID0gMS40LCBsYWJlbCA9IG4pLCBwb3NpdGlvbiA9IHBvc2l0aW9uX3N0YWNrKHZqdXN0ID0gLjUpKSArICNDw6FjIG5ow6NuIHPhur0gxJHhuq10IOG7nyB24buLIHRyw60gMS4zIHRyw6puIHRy4bulYyB4LCB0cuG7pWMgeSBoaeG7g24gdGjhu4sgc+G7kSBsxrDhu6NuZyB2w6AgIGPDoWMgbmjDo24gxJHGsOG7o2MgY2jhu5NuZyB24bubaSBuaGF1IGzDqm4gY8SDbiBjaOG7iW5oIOG7nyB24buLIHRyw60gLjUNCiAgbGFicyggdGl0bGUgPSAnU+G7kSBsxrDhu6NuZyBEaWV0JykgKyAjVGjDqm0gcGjhuqduIHRpw6p1IMSR4buBIHbDoG8gdsO5bmcgduG6vSBiaeG7g3UgxJHhu5MNCiAgdGhlbWVfdm9pZCgpICNMb+G6oWkgYuG7jyBjw6FjIHBo4bqnbiBt4bq3YyDEkeG7i25oIGPhu6dhIGdpYW8gZGnhu4duIGPhu6dhIGJp4buDdSDEkeG7kywgY2jhu4kgaGnhu4NuIHRo4buLIGThu68gbGnhu4d1IHbDoCBjw6FjIHnhur91IHThu5EgdHLhu7FjIHRp4bq/cCBsacOqbiBxdWFuIMSR4bq/biBuw7MuIA0KYGBgDQoNCi0gQmnhu4N1IMSR4buTIGNobyB0YSB0aOG6pXkgc+G7kSBsxrDhu6NuZyBnw6AgY29uIGPhu6dhIHThu6tuZyBsb+G6oWkgZGluaCBkxrDhu6FuZyBuaMawbmcg4bufIGThuqFuZyBQaWUgY2hhcnQNCi0gduG7m2kgbG/huqFpIDEgbMOgIDIyMCBjb24gbMOgIGzhu5tuIG5o4bqldCB2w6AgbG/huqFpIDQgbMOgIMOtdCBuaOG6pXQgduG7m2kgMTE4IGNvbg0KDQojIyBCaeG7g3UgxJHhu5MgZGVuc2l0eSB0aOG7gyBoaeG7h24gd2VpZ2h0IHbDoCBEaWV0IHRoZW8gc+G7kSBsxrDhu6NuZw0KDQpgYGB7ciBtZXNzYWdlPVRSVUUsIHdhcm5pbmc9RkFMU0V9DQpjayAlPiUgZ2dwbG90KCBhZXMoeCA9IHdlaWdodCwgZmlsbCA9IGFzLmZhY3RvcihEaWV0KSkpICsNCiAgZ2VvbV9kZW5zaXR5KGFscGhhID0gMC41KSArICAjIFRoaeG6v3QgbOG6rXAgxJHhu5kgbeG7nSBj4bunYSBjw6FjIMSRxrDhu51uZyBkZW5zaXR5DQogIGxhYnModGl0bGUgPSAiRGVuc2l0eSBwbG90IGPhu6dhIHRy4buNbmcgbMaw4bujbmcgZ8OgIGNvbiB0aGVvIGxv4bqhaSBraOG6qXUgcGjhuqduIiwgeCA9ICJUcuG7jW5nIGzGsOG7o25nIChncmFtcykiLCB5ID0gIk3huq10IMSR4buZIikgKw0KICBzY2FsZV9maWxsX2Rpc2NyZXRlKG5hbWUgPSAiTG/huqFpIGto4bqpdSBwaOG6p24iKSArICAjIFRow6ptIGNow7ogdGjDrWNoIGNobyBmaWxsDQogIHRoZW1lX21pbmltYWwoKSMgQ2jhu41uIHRoZW1lIGNobyBiaeG7g3UgxJHhu5MNCmBgYA0KDQotIEJp4buDdSDEkeG7kyBjaG8gdGEgdGjhuqV5IHPhu7EgcGjDom4gYuG7kSB0cuG7jW5nIGzGsOG7o25nIHRyb25nIG3hu5dpIG5ow7NtIHbhu5tpIHThu6tuZyBsb+G6oWkga2jhuql1IHBo4bqnbiBkaW5oIGTGsOG7oW5nIGNobyBnw6AgY29uIHJpw6puZyBiaeG7h3QNCi0gTeG6rXQgxJHhu5kgbG/huqFpIG3hu5l0IGNoaeG6v20gcuG6pXQgY2FvIHbDoCBkw6B5IHRyb25nIGtob+G6o25nIHThu6sgMTAwIMSR4bq/biBu4butYSAyMDBnIHLhu5NpIGzDoG0gZ2nhuqNtIG3hu5l0IGPDoWNoIHLDtSBy4buHdCwgdGnhur9wIMSRw7MgbMOgIGxv4bqhaSAyIHbDoCB4deG7kW5nIGzhuqduIHThu5tpIGxv4bqhaSAzLDQNCi0gS2hvYW5nIGPDsyBz4buxIGNow6puaCBs4buHbmggcXXDoSBs4bubbiB04burIGtob+G6o25nIG7hu61hIDEwMCDEkeG6v24gMjAwZyB0cuG7nyDEkWkgY+G7p2Ega2jhuql1IHBo4bqnbiAxLCAyLCAzLCBMb+G6oWkgZGluaCBkxrDhu6FuZyA0IOG6o25oIGjGsOG7n25nIGzhu5tuIMSR4bq/biBjw6JuIG7hurduZyB04burIDEwMCDEkeG6v24gMjAwZyBj4bunYSBnw6AgY29uDQoNCiMjIEJp4buDdSDEkeG7kyB0aOG7gyBoaeG7h24gbeG6rXQgxJHhu5kgdHLhu41uZyB0cuG7jW5nIGzGsOG7o25nIGfDoCBjb24gKERlbnNpdHkgcGxvdCkNCmBgYHtyIG1lc3NhZ2U9VFJVRSwgd2FybmluZz1GQUxTRX0NCmNrICU+JSBnZ3Bsb3QoIGFlcyh4ID0gd2VpZ2h0LCBmaWxsID0gYXMuZmFjdG9yKERpZXQpKSkgKw0KICBnZW9tX2RlbnNpdHkoYWxwaGEgPSAwLjUpICsgICMgVGhp4bq/dCBs4bqtcCDEkeG7mSBt4budIGPhu6dhIGPDoWMgxJHGsOG7nW5nIGRlbnNpdHkNCiAgZmFjZXRfd3JhcCh+RGlldCkgKyAjUGjDom4gdOG7lSBjw6FjIGJp4buDdSDEkeG7kyBuaOG7jyBoxqFuIHRoZW8gRGlldA0KICBsYWJzKHRpdGxlID0gIkRlbnNpdHkgcGxvdCBj4bunYSB0cuG7jW5nIGzGsOG7o25nIGfDoCBjb24gdGhlbyBsb+G6oWkga2jhuql1IHBo4bqnbiIsIHggPSAiVHLhu41uZyBsxrDhu6NuZyAoZ3JhbXMpIiwgeSA9ICJN4bqtdCDEkeG7mSIpICsNCiAgc2NhbGVfZmlsbF9kaXNjcmV0ZShuYW1lID0gIkxv4bqhaSBraOG6qXUgcGjhuqduIikgICMgVGjDqm0gY2jDuiB0aMOtY2ggY2hvIGZpbGwNCmBgYA0KDQotIFTGsMahbmcgdOG7sSBuaMawIGJp4buDdSDEkeG7kyB0csOqbiwgbeG7l2kgcGjhuqduIG5o4buPIGNo4buJIHJhIG3huq10IMSR4buZIHRy4buNbmcgbMaw4bujbmcga2hpIGNobyBjw6FjIGxv4bqhaSBraOG6qXUgcGjhuqduIHJpw6puZyBiaeG7h3QgxJHhu5FpIHbhu5tpIGfDoCBjb24NCi0gTG/huqFpIGto4bqpdSBwaOG6p24gMSB24bubaSB0cuG7jW5nIGzGsOG7o25nIGfDoCBjb24gMTAwZyDEkeG7lSBs4bqhaSBy4bqldCBuaGnhu4F1DQoNCiMjIEJp4buDdSDEkeG7kyB0aOG7gyBoaeG7h24gc+G7kSBsxrDhu6NuZyBnw6AgdGhlbyBEaWV0DQoNCmBgYHtyIG1lc3NhZ2U9VFJVRSwgd2FybmluZz1GQUxTRX0NCmNrICU+JSBncm91cF9ieShEaWV0KSAlPiUgc3VtbWFyaXNlKG4gPSBuKCkpICU+JSAjTmjDs20gY8OhYyBkw7JuZyBk4buvIGxp4buHdSBj4bunYSBjayB0aGVvIGPhu5l0IERpZXQsIHNhdSDEkcOzIHTDrW5oIHThu5VuZyBz4buRIGzGsOG7o25nIGNobyBt4buXaSBuaMOzbQ0KICBnZ3Bsb3QoYWVzKHggPSAnJywgeSA9IG4sZmlsbCA9IERpZXQpKSArICNT4butIGThu6VuZyBk4buvIGxp4buHdSB04burIGLGsOG7m2MgdHLGsOG7m2MgdGhp4bq/dCBs4bqtcCBiaeG7g3UgxJHhu5MgduG7m2kgdHLhu6VjIHggbMOgIGtow7RuZyBjw7MgZOG7ryBsaeG7h3UsIHkgbMOgIG4sIG3DoHUgc+G6r2MgxJFjIMOhbmggeOG6oSB2w6BvIERpZXQNCiAgZ2VvbV9jb2woIGNvbG9yID0gJ2JsYWNrJyApICsgI1Row6ptIGPDoWMgY+G7mXQgdsOgbyBiaeG7g3UgxJHhu5MsIHbhu5tpIG3DoHUgxJHGsOG7o2MgdGhp4bq/dCBs4bqtcCBsw6AgbcOgdSDEkWVuDQogIGdlb21fdGV4dChhZXMobGFiZWwgPSBuKSxwb3NpdGlvbiA9IHBvc2l0aW9uX3N0YWNrKHZqdXN0ID0gMSkpICsgI1Row6ptIG5ow6NuIHbDoG8gYmnhu4N1IMSR4buTLCBoaeG7g24gdGjhu4sgc+G7kSBsxrDhu6NuZyBnw6AgY29uIHRyw6puIG3hu5dpIGPhu5l0LCBjxINuIGNo4buJbmggduG7iyB0csOtIGThu41jIGPDoWMgbmjDo24sIMSR4bq3dCB0csOqbiBjw7luZyBt4buXaSBj4buZdA0KICBsYWJzKCB5ID0gJ3Phu5EgbMaw4bujbmcnLCB0aXRsZSA9ICdz4buRIGzGsOG7o25nIGfDoCBjb24gY2hvIG3hu5dpIGNo4bq/IMSR4buZIGRpbmggZMaw4buhbmcnKSAjVGhp4bq/dCBs4bqtcCBuaMOjbiBjaG8gdHLhu6UgeSwgdGnDqnUgxJHhu4EgY+G7p2EgdsO5bmcgZOG7ryBsaeG7h3UgxJHGsOG7o2MgduG6vQ0KYGBgDQoNCi0gQmnhu4N1IMSR4buTIHRo4buDIGhp4buHbiBjaG8gdGEgdGjhuqV5IHPhu5EgbMaw4bujbmcgZ8OgIGNvbiB0aGVvIHThu6tuZyBsb+G6oWkgZGluaCBkxrDhu6FuZywgY8OhYyBz4buRIGxp4buHdSDEkcaw4bujYyBjaOG7k25nIHRoZW8gbeG7mXQgY+G7mXQgdsOgIHTDuXkgdGhlbyBz4buRIGzGsOG7o25nIG3DoCDEkeG7mSBkw6B5IGtow6FjIG5oYXUNCi0gTG/huqFpIGRpbmggZMaw4buhbmcgMSBjw7MgxJHhu5kgZMOgeSBjaGnhur9tIMawdSB0aOG6vywgc+G7kSBsxrDhu6NuZyBuaGnhu4F1IG5o4bqldCwgMyBsb+G6oWkga2lhIGtow7RuZyBjaMOqbmggbOG7h2NoIMSRw6FuZyBr4buDDQoNCiMjIEJp4buDdSDEkeG7kyB0aOG7gyBoaeG7h24gdMawxqFuZyBxdWFuIGdp4buvYSBjw6JuIG7hurduZyBnw6AgY29uIHbDoCBsb+G6oWkgZGluaCBkxrDhu6FuZyB0aGVvIERpZXQNCg0KYGBge3IgbWVzc2FnZT1UUlVFLCB3YXJuaW5nPUZBTFNFfQ0KY2sgJT4lIGdncGxvdChhZXMoeCA9IHdlaWdodCwgeSA9IFRpbWUsIGNvbG9yID0gRGlldCkpICsgI1Phu60gZOG7pW5nIGThu68gbGnhu4d1IHThu6sgY2sgdOG6oW8gbeG7mXQgYuG6o25nIGThu68gbGnhu4d1IG3hu5tpIHRyb25nIGfDs2kgZ2dwbG90LCB0aGnhur90IGzhuq1wIHRy4bulYyB4LCB5LCBwaMOibiBsb+G6oWkgY8OhYyDEkWnhu4NtIHRoZW8gdOG7q25nIGxv4bqhaSBkaW5oIGTGsOG7oW5nIHbDoCBwaMOibiBi4buRIG3DoHUgY2hvIGNow7puZw0KICBnZW9tX3BvaW50KCkgKyAjVGjDqm0gY8OhYyDEkWnhu4NtIHbDoG8gYmnhu4N1IMSR4buTLCBt4buXaSDEkWnhu4NtIGzDoCBt4buZdCBxdWFuIHPDoXQgxJHGsOG7o2MgxJHhu5FpIGNoaeG6v3UgdGhlbyB0cuG7pWMgeCB2w6AgeQ0KICBsYWJzKCB4ID0gJ2PDom4gbuG6t25nIGfDoCBjb24nLCB5ID0gJ1Ro4budaSBnaWFuIHF1YW4gc8OhdCcsIHRpdGxlID0gJ1TGsMahbmcgcXVhbiBnaeG7r2EgZ8OgIGNvbiB2w6AgY8OibiBu4bq3bmcgdGhlbyBsb+G6oWkgZGluaCBkxrDhu6FuZycpICsgICPEkOG6t3QgbmjDo24gY2hvIHRy4bulYyB4IHbDoCB5LCB0aGnhur90IGzhuq1wIGzhuqFpIHTDqm4gdGnDqnUgxJHhu4EgbeG7m2kgY2hvIHbDuW5nIGThu68gbGnDquG7pQ0KZ2VvbV9zbW9vdGgobWV0aG9kID0gJ2xtJywgY29sb3IgPSAnYmxhY2snKQ0KYGBgDQoNCi0gxJDGsOG7nW5nIHRyZW5kIGxpbmUgY8OzIHh1IGjGsOG7m25nIGzDqm4gdHLDqm4sIG3hu5FpIHTGsMahbmcgcXVhbiBkxrDGoW5nIGdp4buvYSBjw6FjIGThu68gbGnhu4d1DQotIFbhu5tpIGPDom4gbuG6t25nIGfDoCBjb24gbOG7m24sIHBo4bqjaSBi4buVIHN1bmcgZGluaCBkxrDhu6FuZyB0aGVvIMSRw7MgbcOgIHRo4budaSBnaWFuIHF1YW4gc8OhdCBjxaluZyBz4bq9IHBo4bqjaSB0xINuZyBsw6puDQoNCiMjIEJp4buDdSDEkeG7kyB0aOG7gyBoaeG7h24gdOG7tyBs4buHIGRpbmggZMaw4buhbmcgdGhlbyBEaWV0IA0KICANCmBgYHtyIG1lc3NhZ2U9VFJVRSwgd2FybmluZz1GQUxTRX0NCmNrICU+JSBncm91cF9ieShEaWV0KSAlPiUgc3VtbWFyaXNlKG4gPSBuKCkpICU+JSAgI05ow7NtIGPDoWMgY+G7mXQgZOG7ryBsaeG7h3UgdGhlbyBnacOhIHRy4buLIHRyb25nIGPhu5l0IERpZXQNCiAgZ2dwbG90KGFlcyhEaWV0LG4pKSArICNT4butIGThu6VuZyBk4buvIGxp4buHdSB0csaw4bubYyDEkcOzLCDDoW5oIHjhuqEgdHLhu6VuZyB4IGzDoCBj4buZdCBEaWV0LCB0cuG7pWMgeSBsw6AgY+G7mXQgbg0KICBnZW9tX2NvbChmaWxsPSdncmVlbicpICsgI1Row6ptIGPDoWMgY+G7mXQgdsOgbyBiaeG7g3UgxJHhu5MsIG3DoHUgY+G7p2EgY8OhYyBj4buZdCB4YW5oIGzDoSBjw6J5DQogIGdlb21fdGV4dChhZXMobGFiZWwgPSBwZXJjZW50KG4vbGVuZ3RoKGNrJERpZXQpKSksdmp1c3QgPSAyLCBjb2xvciA9ICdyZWQnKSArICN0aMOqbSBuaMOjbiBjaG8gY8OhYyBj4buZdCBj4bunYSBiaeG7g3UgxJHhu5MsIOG7nyDEkcOieSBsw6AgcGjhuqduIHRyxINtIHPhu5EgbMaw4bujbmcgbeG7l2kgbG/huqFpIERpZXQgdHLDqm4gdOG7lW5nLCBjxINuIGNo4buJbmggY2hp4buBdSBk4buNYyB2w6AgbcOgdSDEkeG7jyBjaG8gbmjDo24NCiAgbGFicyh4ID0gJ0xv4bqhaSBkaW5oIGTGsOG7oW5nJywgeSA9ICdT4buRIGzGsOG7o25nJywgdGl0bGUgPSAnVOG7tyBs4buHIGxv4bqhaSBkaW5oIGTGsOG7oW5nJykgI1Row6ptIG5ow6NuIGNobyB0cuG7pWMgeCwgdHLhu6VjIHkgdsOgIHRpw6p1IMSR4buBDQpgYGANCg0KLSBCaeG7g3UgxJHhu5MgY2hvIHRhIHRo4bqleSBwaOG6p24gdHLEg20gc+G7kSBsxrDhu6NuZyBnw6AgY29uIHRyb25nIG3hu5dpIGxv4bqhaSBkaW5oIGTGsOG7oW5nIMSRxrDhu6NjIG51w7RpDQotIExv4bqhaSBkaW5oIGTGsOG7oW5nIHPhu5EgMSBjw7Mgc+G7kSBsxrDhu6NuZyBnw6AgY29uIGNoaeG6v20gMzguNiUsIGxv4bqhaSBkaW5oIGTGsOG7oW5nIHPhu5EgMiwzIGPDsyAyMC43NiUgdOG7lW5nIHPhu5EgbMaw4bujbmcgZ8OgIGNvbiwgY8OybiBs4bqhaSBsw6AgbG/huqFpIGRpbmggZMaw4buhbmcgc+G7kSA0IHPhu5EgbMaw4bujbmcgZ8OgIGNvbiBjaGnhur9tIDIwLjQyJS4NCg0KIyMgQmnhu4N1IMSR4buTIHRo4buDIGhp4buHbiBUxrDGoW5nIHF1YW4gZ2nhu69hIGPDom4gbuG6t25nIGfDoCBjb24gdsOgIHRo4budaSBnaWFuIHF1YW4gc8OhdCB0aGVvIGxv4bqhaSBEaWV0DQoNCmBgYHtyIG1lc3NhZ2U9VFJVRSwgd2FybmluZz1GQUxTRX0NCmNrICU+JSBnZ3Bsb3QoYWVzKHggPSB3ZWlnaHQsIHkgPSBUaW1lLCBjb2xvciA9IERpZXQpKSArICNT4butIGThu6VuZyBk4buvIGxp4buHdSB04burIGNrIHThuqFvIG3hu5l0IGLhuqNuZyBk4buvIGxp4buHdSBt4bubaSB0cm9uZyBnw7NpIGdncGxvdCwgdGhp4bq/dCBs4bqtcCB0cuG7pWMgeCwgeSwgcGjDom4gbG/huqFpIGPDoWMgxJFp4buDbSB0aGVvIHThu6tuZyBsb+G6oWkgZGluaCBkxrDhu6FuZyB2w6AgcGjDom4gYuG7kSBtw6B1IGNobyBjaMO6bmcNCiAgZ2VvbV9wb2ludCgpICsgI1Row6ptIGPDoWMgxJFp4buDbSB2w6BvIGJp4buDdSDEkeG7kywgbeG7l2kgxJFp4buDbSBsw6AgbeG7mXQgcXVhbiBzw6F0IMSRxrDhu6NjIMSR4buRaSBjaGnhur91IHRoZW8gdHLhu6VjIHggdsOgIHkNCiAgbGFicyggeCA9ICdjw6JuIG7hurduZyBnw6AgY29uJywgeSA9ICdUaOG7nWkgZ2lhbiBxdWFuIHPDoXQnLCB0aXRsZSA9ICdUxrDGoW5nIHF1YW4gZ2nhu69hIGfDoCBjb24gdsOgIGPDom4gbuG6t25nIHRoZW8gbG/huqFpIGRpbmggZMaw4buhbmcnKSArICAjxJDhurd0IG5ow6NuIGNobyB0cuG7pWMgeCB2w6AgeSwgdGhp4bq/dCBs4bqtcCBs4bqhaSB0w6puIHRpw6p1IMSR4buBIG3hu5tpIGNobyB2w7luZyBk4buvIGxpw6rhu6UNCmdlb21fc21vb3RoKG1ldGhvZCA9ICdsbScsIGNvbG9yID0gJ2dyZWVuJykgKyAjVGjDqm0gxJHGsOG7nW5nIHBow7kgaOG7o3AgdHV54bq/biB0w61uaCwgYuG6sW5nIHBoxrDGoW5nIHBow6FwIGjhu5NpIHF1eSB0dXnhur9uIHTDrW5oDQogIGZhY2V0X3dyYXAofkRpZXQpICNQaMOibiBsb+G6oWkgY8OhYyBi4bqjbmcgbmjhu48gaMahbiB0aGVvIGxv4bqhaSBEaWV0DQpgYGANCg0KLSBDw6JuIG7hurduZyBnw6AgY29uIHTDuXkgdGhlbyB04burbmcgbG/huqFpIGRpbmggZMaw4buhbmcgY8OzIHh1IGjGsOG7m25nIHTEg25nIHRoZW8gdGjhu51pIGdpYW4gcXVhbiBzw6F0DQoNCiMjIEJp4buDdSDEkeG7kyB0aOG7gyBoaeG7h24gbMaw4bujbmcgY8OibiBu4bq3bmcgdHJ1bmcgYsOsbmggdGhlbyBEaWV0ICggROG6oW5nIFBpZSApDQoNCmBgYHtyIG1lc3NhZ2U9VFJVRSwgd2FybmluZz1GQUxTRX0NCmNrICU+JSBncm91cF9ieShEaWV0KSAlPiUgc3VtbWFyaXNlKG49bWVhbih3ZWlnaHQpKSAlPiUgI1ThuqFvIGLhuqNuZyBk4buvIGxp4buHdSBt4bubaSBjw6FjIGPDoWMgY+G7mW5nIERpZXQgdsOgIHTDrW5oIGzGsOG7o25nIHRydW5nIGLDrG5oIA0KICBnZ3Bsb3QoYWVzKHg9ICcnLCB5PW4sIGZpbGwgPSBEaWV0KSkrICNC4bqvdCDEkeG6p3UgbeG7mXQgYmnhu4N1IMSR4buTIHPhu60gZOG7pW5nIGfDs2kgZ2dwbG90IHbhu5tpIHRy4bulYyB4IGtow7RuZyBjw7MgZOG7ryBsaeG7h3UsIHRy4bulYyB5IGzDoCBjw6FjIHBo4bqnbiB04butIG4sIHbDoCBtw6B1IHPhuq9jIMSRxrDhu6NjIHRow6ptIHbDoG8gcGjDom4gYmnhu4d0IGPDoWMgbG/huqFpIERpZXQNCiAgZ2VvbV9jb2woY29sb3IgPSAnYmxhY2snLCB3aWR0aCA9IDEpICsgI1Row6ptIGPDoWMgY+G7mXQgdsOgbyBiaeG7g3UgxJHhu5MsIG3hu5dpIGPhu5l0IGzDoCBt4buZdCBsb+G6oWkgZGluaCBkxrDhu6FuZyBjxaluZyBuaMawIMSR4buZIHLhu5luZyBsw6AgMQ0KICBjb29yZF9wb2xhcigneScpICsgI0NodXnhu4NuIMSR4buVaSBiaeG7g3UgxJHhu5MgdGjDoG5oIGjhu4cgdOG7jWEgxJHhu5kgY+G7sWMsIGJp4buDdSB0aOG7iyBjw6FjIHBo4bqnbiB0xrDGoW5nIMSR4buRaSB0cm9uZyBt4buZdCB2w7JuZyB0csOybg0KICBnZW9tX3RleHQoYWVzKHggPSAxLjMsIGxhYmVsID0gcm91bmQobiwyKSksIHBvc2l0aW9uID0gcG9zaXRpb25fc3RhY2sodmp1c3QgPSAuNSkpICsgI0PDoWMgbmjDo24gc+G6vSDEkeG6rXQg4bufIHbhu4sgdHLDrSAxLjMgdHLDqm4gdHLhu6VjIHgsIHRy4bulYyB5LCB0w61uaCBnacOhIHRy4buLIHRydW5nIGLDrG5oIHbDoCBs4bqleSBoYWkgZ2nDoSB0cuG7iyBzYXUgxJHDsywgaGnhu4NuIHRo4buLIHPhu5EgbMaw4bujbmcgdsOgICBjw6FjIG5ow6NuIMSRxrDhu6NjIGNo4buTbmcgduG7m2kgbmhhdSBsw6puIGPEg24gY2jhu4luaCDhu58gduG7iyB0csOtIC41DQogIGxhYnMoIHRpdGxlID0gJ1Ry4buNbmcgbMaw4bujbmcgdHJ1bmcgYsOsbmgnKSArICNUaMOqbSBwaOG6p24gdGnDqnUgxJHhu4EgdsOgbyB2w7luZyB24bq9IGJp4buDdSDEkeG7kw0KICB0aGVtZV92b2lkKCkgI0xv4bqhaSBi4buPIGPDoWMgcGjhuqduIG3hurdjIMSR4buLbmggY+G7p2EgZ2lhbyBkaeG7h24gY+G7p2EgYmnhu4N1IMSR4buTLCBjaOG7iSBoaeG7g24gdGjhu4sgZOG7ryBsaeG7h3UgdsOgIGPDoWMgeeG6v3UgdOG7kSB0cuG7sWMgdGnhur9wIGxpw6puIHF1YW4gxJHhur9uIG7Dsy4gDQpgYGANCg0KLSBCaeG7g3UgxJHhu5MgdGjhu4MgaGnhu4duIHRy4buNbmcgbMaw4bujbmcgZ8OgIGNvbiB0cnVuZyBiw6xuaCB0aGVvIHThu6tuZyBsb+G6oWkgZGluaCBkxrDhu6FuZw0KLSBMb+G6oWkgMSBjw7MgdHLhu41uZyBsxrDhu6NuZyB0cnVuZyBiw6xuaCBsw6AgMTAyLjY1LCBsb+G6oWkgMiBsw6AgMTIyLjYyLCBsb+G6oWkgMyBsw6AgMTQyLjk1LCBsb+G6oWkgNCBsw6AgMTM1LjI2DQoNCiMjIEJp4buDdSDEkeG7kyB0aOG7gyBoaeG7h24gdGjhu51pIGdpYW4gdHJ1bmcgYsOsbmggdGhlbyBEaWV0ICggZOG6oW5nIFBpZSApDQoNCmBgYHtyIG1lc3NhZ2U9VFJVRSwgd2FybmluZz1GQUxTRX0NCmNrICU+JSBncm91cF9ieShEaWV0KSAlPiUgc3VtbWFyaXNlKG49bWVhbihUaW1lKSkgJT4lICNU4bqhbyBi4bqjbmcgZOG7ryBsaeG7h3UgbeG7m2kgY8OhYyBjw6FjIGPhu5luZyBEaWV0IHbDoCB0w61uaCB0aOG7nWkgZ2lhbiB0cnVuZyBiw6xuaCANCiAgZ2dwbG90KGFlcyh4PSAnJywgeT1uLCBmaWxsID0gRGlldCkpKyAjQuG6r3QgxJHhuqd1IG3hu5l0IGJp4buDdSDEkeG7kyBz4butIGThu6VuZyBnw7NpIGdncGxvdCB24bubaSB0cuG7pWMgeCBraMO0bmcgY8OzIGThu68gbGnhu4d1LCB0cuG7pWMgeSBsw6AgY8OhYyBwaOG6p24gdOG7rSBuLCB2w6AgbcOgdSBz4bqvYyDEkcaw4bujYyB0aMOqbSB2w6BvIHBow6JuIGJp4buHdCBjw6FjIGxv4bqhaSBEaWV0DQogIGdlb21fY29sKGNvbG9yID0gJ2JsYWNrJywgd2lkdGggPSAxKSArICNUaMOqbSBjw6FjIGPhu5l0IHbDoG8gYmnhu4N1IMSR4buTLCBt4buXaSBj4buZdCBsw6AgbeG7mXQgbG/huqFpIGRpbmggZMaw4buhbmcgY8WpbmcgbmjGsCDEkeG7mSBy4buZbmcgbMOgIDENCiAgY29vcmRfcG9sYXIoJ3knKSArICNDaHV54buDbiDEkeG7lWkgYmnhu4N1IMSR4buTIHRow6BuaCBo4buHIHThu41hIMSR4buZIGPhu7FjLCBiaeG7g3UgdGjhu4sgY8OhYyBwaOG6p24gdMawxqFuZyDEkeG7kWkgdHJvbmcgbeG7mXQgdsOybmcgdHLDsm4NCiAgZ2VvbV90ZXh0KGFlcyh4ID0gMS4zLCBsYWJlbCA9IHJvdW5kKG4sMikpLCBwb3NpdGlvbiA9IHBvc2l0aW9uX3N0YWNrKHZqdXN0ID0gLjUpKSArICNDw6FjIG5ow6NuIHPhur0gxJHhuq10IOG7nyB24buLIHRyw60gMS4zIHRyw6puIHRy4bulYyB4LCB0cuG7pWMgeSwgdMOtbmggZ2nDoSB0cuG7iyB0cnVuZyBiw6xuaCB2w6AgbOG6pXkgaGFpIGdpw6EgdHLhu4sgc2F1IMSRw7MsIGhp4buDbiB0aOG7iyBz4buRIGzGsOG7o25nIHbDoCAgY8OhYyBuaMOjbiDEkcaw4bujYyBjaOG7k25nIHbhu5tpIG5oYXUgbMOqbiBjxINuIGNo4buJbmgg4bufIHbhu4sgdHLDrSAuNQ0KICBsYWJzKCB0aXRsZSA9ICdUaOG7nWkgZ2lhbiB0cnVuZyBiw6xuaCcpICsgI1Row6ptIHBo4bqnbiB0acOqdSDEkeG7gSB2w6BvIHbDuW5nIHbhur0gYmnhu4N1IMSR4buTDQogIHRoZW1lX3ZvaWQoKSAjTG/huqFpIGLhu48gY8OhYyBwaOG6p24gbeG6t2MgxJHhu4tuaCBj4bunYSBnaWFvIGRp4buHbiBj4bunYSBiaeG7g3UgxJHhu5MsIGNo4buJIGhp4buDbiB0aOG7iyBk4buvIGxp4buHdSB2w6AgY8OhYyB54bq/dSB04buRIHRy4buxYyB0aeG6v3AgbGnDqm4gcXVhbiDEkeG6v24gbsOzLiANCmBgYA0KDQotIFRo4budaSBnaWFuIHF1YW4gc8OhdCB0cnVuZyBiw6xuaCBj4bunYSBnw6AgY29uIHRoZW8gdOG7q25nIGxv4bqhaSBkaW5oIGTGsOG7oW5nDQotIExv4bqhaSBkaW5oIGTGsOG7oW5nIDEgY8OzIHRo4budaSBnaWFuIHF1YW4gc8OhdCB0cnVuZyBiw6xuaCBsw6AgMTAuNDgsIGxv4bqhaSAyIGzDoCAxMC45MiwgbG/huqFpIDMgbMOgIDEwLjkyIGPDsm4gbG/huqFpIDQgbMOgIDEwLjc1DQoNCiMjIEJp4buDdSDEkeG7kyB0aOG7gyBoaeG7h24gdOG6p24gc3XhuqV0IHh14bqldCBoaeG7h24gdHLhu41uZyBsxrDhu6NuZyBnw6AgY29uDQoNCmBgYHtyIG1lc3NhZ2U9VFJVRSwgd2FybmluZz1GQUxTRX0NCmNrICU+JSBnZ3Bsb3QoYWVzKHggPSB3ZWlnaHQpKSArICNC4bqvdCDEkeG6p3UgbeG7mXQgYmnhu4N1IMSR4buTIGdncGxvdCB24bubaSB0cuG7pWMgeCDEkcaw4bujYyB0aGnhur90IGzhuq1wIGzDoCBj4buZdCAid2VpZ2h0Ig0KICBnZW9tX2hpc3RvZ3JhbShiaW53aWR0aCA9IDUwLCBmaWxsID0gInNreWJsdWUiLCBjb2xvciA9ICJibGFjayIsIGFlcyh5PS4uY291bnQuLikpICsgI1RoaeG6v3QgbOG6rXAgZOG7ryBsaeG7h3UgaGnhu4NuIHRo4buLIGTGsOG7m2kgZOG6oW5nIGhpc3RvZ3JhbSwgxJHhurd0IGNoaeG7gXUgcuG7mW5nIGJpbiwgbcOgdSBu4buBbiB2w6Agdmnhu4FuLCBz4butIGThu6VuZyB04bqnbiBzdeG6pXQgdHV54buHdCDEkeG7kWkNCiAgbGFicyh4ID0gIlRy4buNbmcgbMaw4bujbmcgKGcpIiwgeSA9ICJU4bqnbiBzdeG6pXQiKSArICNUaGnhur90IGzhuq1wIG5ow6NuIGNobyB0cuG7pWMgeCB2w6AgdHLhu6VjIHkNCiAgZ2d0aXRsZSgiUGjDom4gcGjhu5FpIGPhu6dhIHRy4buNbmcgbMaw4bujbmcgZ8OgIGNvbiIpICsgI1RoaeG6v3QgbOG6rXAgdGnDqnUgxJHhu4EgY2hvIGJp4buDdSDEkeG7kw0KICB0aGVtZV9taW5pbWFsKCkgI0No4buNbiBnaWFvIGRp4buHbiDEkcahbiBnaeG6o24sIMSRxrDhu51uZyBsxrDhu5tpIGNobyBiaeG7g3UgxJHhu5MNCmBgYA0KDQotIEJp4buDdSDEkeG7kyBjaG8gdGjhuqV5IHThuqduIHN14bqldCBzdeG6pXQgaGnhu4duIGPDoWMgY2jhu4kgc+G7kSB0cuG7jW5nIGzGsOG7o25nIGfDoCBjb24NCi0gdOG6p24gc3XhuqV0IHh14bqldCBoaeG7h24gY+G7p2EgdHLhu41uZyBsxrDhu6NuZyBkxrDhu5tpIDEwMGcgeHXhuqV0IGhp4buHbiBuaGnhu4F1IG5o4bqldCBoxqFuIDIwMCBs4bqnbiB2w6AgZ2nhuqNtIGThuqduDQoNCiMjIEJp4buDdSDEkeG7kyBwaMOibiBwaOG7kWkgdHJvbmcgbMaw4bujbmcgZ8OgIGNvbiB24bubaSB04bqnbiBzdeG6pXQgICh0aGVvIERpZXQpDQoNCmBgYHtyIG1lc3NhZ2U9VFJVRSwgd2FybmluZz1GQUxTRX0NCmNrICU+JSBnZ3Bsb3QoYWVzKHggPSB3ZWlnaHQpKSArICNC4bqvdCDEkeG6p3UgbeG7mXQgYmnhu4N1IMSR4buTIGdncGxvdCB24bubaSB0cuG7pWMgeCDEkcaw4bujYyB0aGnhur90IGzhuq1wIGzDoCBj4buZdCAid2VpZ2h0Ig0KICBnZW9tX2hpc3RvZ3JhbShiaW53aWR0aCA9IDUwLCBmaWxsID0gInNreWJsdWUiLCBjb2xvciA9ICJibGFjayIsIGFlcyh5PS4uY291bnQuLikpICsgI1RoaeG6v3QgbOG6rXAgZOG7ryBsaeG7h3UgaGnhu4NuIHRo4buLIGTGsOG7m2kgZOG6oW5nIGhpc3RvZ3JhbSwgxJHhurd0IGNoaeG7gXUgcuG7mW5nIGJpbiwgbcOgdSBu4buBbiB2w6Agdmnhu4FuLCBz4butIGThu6VuZyB04bqnbiBzdeG6pXQgdHV54buHdCDEkeG7kWkNCiAgbGFicyh4ID0gIlRy4buNbmcgbMaw4bujbmcgKGcpIiwgeSA9ICJU4bqnbiBzdeG6pXQiKSArICNUaGnhur90IGzhuq1wIG5ow6NuIGNobyB0cuG7pWMgeCB2w6AgdHLhu6VjIHkNCiAgZmFjZXRfd3JhcCh+RGlldCkgKyAjUGjDom4gbG/huqFpIGPDoWMgYuG6o25nIG5o4buPIHRoZW8gbG/huqFpIERpZXQNCiAgZ2d0aXRsZSgiUGjDom4gcGjhu5FpIGPhu6dhIHRy4buNbmcgbMaw4bujbmcgZ8OgIGNvbiIpICAjVGhp4bq/dCBs4bqtcCB0acOqdSDEkeG7gSBjaG8gYmnhu4N1IMSR4buTDQpgYGANCg0KLSAgQmnhu4N1IMSR4buTIGNobyByYSB0aOG6pXkgY2jhu4kgc+G7kSB4deG6pXQgaGnhu4duIGPhu6dhIGPDoWMgY2jhu4kgc+G7kSB0cuG7jW5nIGzGsOG7o25nIGfDoCBjb24gxJHGsOG7o2MgcGjDom4gcmEgdGhlbyBsb+G6oWkgZGluaCBkxrDhu6FuZw0KDQojIyBCaeG7g3UgxJHhu5MgdGjhu4MgaGnhu4duIHThuqduIHN14bqldCB4deG6pXQgaGnhu4duIGPDoWMgbeG7kWMgdGjhu51pIGdpYW4gcXVhbiBzw6F0DQoNCmBgYHtyIG1lc3NhZ2U9VFJVRSwgd2FybmluZz1GQUxTRX0NCmNrICU+JSBnZ3Bsb3QoYWVzKHggPSBUaW1lKSkgKyAjQuG6r3QgxJHhuqd1IG3hu5l0IGJp4buDdSDEkeG7kyBnZ3Bsb3QgduG7m2kgdHLhu6VjIHggxJHGsOG7o2MgdGhp4bq/dCBs4bqtcCBsw6AgY+G7mXQgIlRpbWUiDQogIGdlb21faGlzdG9ncmFtKGJpbndpZHRoID0gMywgZmlsbCA9ICJyZWQiLCBjb2xvciA9ICJibGFjayIsIGFlcyh5PS4uY291bnQuLikpICsgI1RoaeG6v3QgbOG6rXAgZOG7ryBsaeG7h3UgaGnhu4NuIHRo4buLIGTGsOG7m2kgZOG6oW5nIGhpc3RvZ3JhbSwgxJHhurd0IGNoaeG7gXUgcuG7mW5nIGJpbiBsw6AgNSwgbcOgdSBu4buBbiB2w6AgbcOgdSB2aeG7gW4NCiAgbGFicyh4ID0gIlRo4budaSBnaWFuIChoKSIsIHkgPSAiVOG6p24gc3XhuqV0IikgKyAjVGhp4bq/dCBs4bqtcCBuaMOjbiBjaG8gdHLhu6VjIHggdsOgIHkNCiAgZ2d0aXRsZSgiUGjDom4gcGjhu5FpIGPhu6dhIHRo4budaSBnaWFuIHRoZW8gZMO1aSBnw6AgY29uIikgKyAjVGhp4bq/dCBs4bqtcCB0acOqdSDEkeG7gSBjaG8gYmnhu4N1IMSR4buTDQogIHRoZW1lX21pbmltYWwoKSAjR2lhbyBkaeG7h24gZOG6oW5nIGzGsOG7m2kNCmBgYA0KDQotIEJp4buDdSDEkeG7kSBjaG8gdGEgdGjhuqV5IGPDoWMgdOG6p24gc3XhuqV0IGPDoWMgIGtob+G6o25nIHRo4budaSBnaWFuIHh14bqldCBoaeG7h24NCi0gS2hv4bqjbmcgdGjhu51pIGdpYW4geHXhuqV0IGhp4buHbiBuaGnhu4F1IG5o4bqldCB04burIDAgxJHhur9uIDUgdsOgIGdp4bqjbSBk4bqnbiB24buBIDIwDQoNCiMjIEJp4buDdSDEkeG7kyB0aOG7gyBoaeG7h24gdHLhu41uZyBsxrDhu6NuZyBnw6AgY29uIHRoZW8gdGjhu51pIGdpYW4gKGxpbmUpDQpgYGB7ciBtZXNzYWdlPVRSVUUsIHdhcm5pbmc9RkFMU0V9DQpnZ3Bsb3QoQ2hpY2tXZWlnaHQsIGFlcyh4ID0gVGltZSwgeSA9IHdlaWdodCwgY29sb3IgPSBDaGljaykpICsNCiAgZ2VvbV9saW5lKCkgKw0KICBsYWJzKHggPSAiVGjhu51pIGdpYW4gKG5nw6B5KSIsIHkgPSAiVHLhu41uZyBsxrDhu6NuZyAoZykiLCBjb2xvciA9ICJHw6AiKSArDQogIGdndGl0bGUoIkJp4buDdSDEkeG7kyDEkcaw4budbmcgY+G7p2EgdHLhu41uZyBsxrDhu6NuZyBnw6AgdGhlbyB0aOG7nWkgZ2lhbiIpICsNCiAgdGhlbWVfbWluaW1hbCgpDQpgYGANCg0KIyMgQmnhu4N1IMSR4buTIHRo4buDIGhp4buHbiBt4bqtdCDEkeG7mSBj4bunYSB0cuG7jW5nIGzGsOG7o25nIGfDoCAoIHZpb2xpbiBwbG90KQ0KDQpgYGB7ciBtZXNzYWdlPVRSVUUsIHdhcm5pbmc9RkFMU0V9DQpjayAlPiUgZ2dwbG90KGFlcyh4ID0gYXMuZmFjdG9yKERpZXQpLCB5ID0gd2VpZ2h0LCBmaWxsID0gYXMuZmFjdG9yKERpZXQpKSkgKyAjTOG6pXkgZOG7ryBsaeG7h3UgdOG7qyBjaywgdGhp4bq/dCBs4bqtcCB0cuG7pWMgeCwgeSwgbcOgdSBmaWxsIMSRxrDhu6NjIGThu7FhIHRyw6puIGNo4bq/IMSR4buZIGRpbmggZMaw4buhbmcNCiAgZ2VvbV92aW9saW4oKSArICNUaGnhur90IGzhuq1wIGJp4buDdSDEkeG7kyB2aW9saW4gcGxvdCB2w6BvIGJp4buDdSDEkeG7kw0KICBsYWJzKHggPSAiY2jhur8gxJHhu5kgZGluaCBkxrDhu6FuZyIsIHkgPSAiVHLhu41uZyBsxrDhu6NuZyAoZykiKSArDQogIGdndGl0bGUoIkJp4buDdSDEkeG7kyB2aW9saW4gcGxvdCBj4bunYSB0cuG7jW5nIGzGsOG7o25nIGfDoCIpICsgI1RoaeG6v3QgbOG6rXAgdGnDqnUgxJHhu4EgY2hvIGJp4buDdSDEkeG7kw0KICB0aGVtZV9taW5pbWFsKCkgI2zhuqV5IGdpYW8gZGnhu4duIGThuqFuZyBsxrDhu5tpIA0KYGBgDQoNCi0gQmnhu4N1IMSR4buTIGNobyB0YSB0aOG6pXkgbeG6rXQgxJHhu5kgcGjDom4gcGjhu5FpIGPhu6dhIHRy4buNbmcgbMaw4bujbmcgY8OhYyBnw6AgY29uIHRoZW8gdOG7q25nIGNo4bq/IMSR4buZIGRpbmggZMaw4buhbmcNCi0g4bufIGNo4bq/IMSR4buZIGRpbmggZMaw4buhbmcgMSB0aMOsIGPDsyBt4bqtdCDEkeG7mSBwaMOibiBwaOG7kWkgdHLhu41uZyBsxrDhu6NuZyBkxrDhu5tpIDEwMGcgbmhp4buBdSBuaOG6pXQsIGPhuqMgNCBsb+G6oWkgxJHhu4F1IGPDsyB4dSBoxrDhu5tuZyBnaeG6o20gZOG6p24sIHRy4buNbmcgbMaw4bujbmcgY8OhYyBs4bubbiB0aMOsIGPDoG5nIMOtdCwgbOG7m24gbmjhuqV0IGPDsyB0aOG7gyDEkeG6oXQgxJHGsOG7o2Mg4bufIGto4bqpdSBwaOG6p24gZGluaCBkxrDhu6FuZyBz4buRIDMNCg0KIyMgQmnhu4N1IMSR4buTIHRo4buDIGhp4buHbiBt4bqtdCDEkeG7mSB0cuG7jW5nIGzGsOG7o25nIHF1YSBjw6FjIG3hu5FjIA0KDQpgYGB7ciBtZXNzYWdlPVRSVUUsIHdhcm5pbmc9RkFMU0V9DQpjayAlPiUgDQogIGdncGxvdChhZXMoeCA9IFRpbWUsIHkgPSB3ZWlnaHQpKSArICNC4bqvdCDEkeG6p3UgbeG7mXQgY2h14buXaSBk4buvIGxp4buHdSBt4bubaSB24bubaSB2aeG7h2MgdGhp4bq/dCBs4bqtcCB0cuG7pWMgeCwgeQ0KICBnZW9tX3Zpb2xpbihmaWxsID0gInNreWJsdWUiLCBjb2xvciA9ICJibGFjayIpICsgI1RoaeG6v3QgbOG6rXAgZOG6oW5nIHZpb2xpbiBjaG8gYmnhu4N1IMSR4buZLCBtw6B1IHbDoCBtw6B1IHZp4buBbg0KICBsYWJzKHggPSAiVGjhu51pIGdpYW4iLCB5ID0gIlRy4buNbmcgbMaw4bujbmcgKGcpIiwNCiAgICAgICB0aXRsZSA9ICJT4buxIHBow6F0IHRyaeG7g24gY+G7p2EgdHLhu41uZyBsxrDhu6NuZyBnw6AgY29uICB0aGVvIHRo4budaSBnaWFuIikgKyAjZ8OhbiBuaMOjbiBjaG8gdOG7q25nIHRy4bulYyB4LCB5IHbDoCB0acOqdSDEkeG7gQ0KICB0aGVtZV9taW5pbWFsKCkgI2dpYW8gZGnhu4duIGThuqFuZyBsxrDhu5tpDQpgYGANCg0KLSBCaeG7g3UgxJHhu5MgY2hvIHRhIHRo4bqleSBt4bqtdCDEkeG7mSBwaMOibiBwaOG7kWkgY+G7p2EgdHLhu41uZyBsxrDhu6NuZywgdHLhu41uZyBsxrDhu6NuZyBjw6BuZyBs4bubbiB2w6Agw610IA0KDQojIyBCaeG7g3UgxJHhu5MgcGjDom4gcGjhu5FpIHRy4buNbmcgbMaw4bujbmcgZOG6oW5nIEJveHBsb3QNCg0KYGBge3IgbWVzc2FnZT1UUlVFLCB3YXJuaW5nPUZBTFNFfQ0KY2sgJT4lIGdncGxvdChhZXMoeCA9IGZhY3RvcihEaWV0KSwgeSA9IHdlaWdodCwgZmlsbCA9IGZhY3RvcihEaWV0KSkpICsgI0Lhuq90IMSR4bqndSB04bqhbyBt4buZdCDEkeG7kWkgdMaw4bujbmcgZ2dwbG90LCB0aGnhur90IGzhuq1wIHRy4bulYyB4LCB5IHbDoCBtw6B1IHPhuq9jIMSRxrDhu6NjIHjDoWMgxJHhu4tuaCBi4bqxbmcgZGlldA0KICBnZW9tX2JveHBsb3QoKSArICNUaMOqbSBs4bubcCBibG94cG90IHbDoCBiaeG6v24gxJHhu5luZyBj4bunYSB0cuG7jW5nIGzGsOG7o25nIGfDoCBjb24gdGhlbyB04burbmcgbG/huqFpIGto4bqpdSBwaOG6p24NCiAgbGFicyh4ID0gIkxv4bqhaSBraOG6qXUgcGjhuqduIiwgeSA9ICJUcuG7jW5nIGzGsOG7o25nIGfDoCBjb24iLCBmaWxsID0gIkxv4bqhaSBraOG6qXUgcGjhuqduIikgKyAjxJDhurd0IG5ow6NuIGNobyB0cuG7pWMgeCwgeSB2w6AgbcOgdSBz4bqvYw0KICBnZ3RpdGxlKCJCaeG7g3UgxJHhu5MgQm94cGxvdCBj4bunYSB0cuG7jW5nIGzGsOG7o25nIGfDoCBjb24gdGhlbyBsb+G6oWkga2jhuql1IHBo4bqnbiIpICNUaMOqbSB0acOqdSDEkeG7gSBjaG8gYmnhu4N1IMSR4buTDQpgYGANCg0KLSBCaeG7g3UgxJHhu5MgY2hvIHRo4bqleSBjw6FjIGdpw6EgdHLhu4sgbmjGsCB0cnVuZyB24buLLCB04bupIHBow6JuIHbhu4sgdsOgIGPDoWMgZ2nDoSB0cuG7iyBuZ2/huqFpIHZpIGPDsyB0aOG7gyB4deG6pXQgaGnhu4du