Tiến hành nghiên cứu:
Trước hết, ta cần phải gọi dữ liệu diamonds lên
h <- diamonds
- Đổi tên biến cut trong dữ liệu diamonds, thay bằng
tên loại để tránh bị nhầm lẫn khi đánh giá giữa loại
của kim cương và vết cắt của kim cương
h <- rename(h, loai = cut)
datatable(h)
COLOR - Cấp độ màu của kim cương:
- Cấp độ màu của kim cương nói một cách cụ thể là ta phân loại độ
trong là của màu sắc:
- Màu loại D, E và F có độ trong suốt gần như là
tuyệt đối (Nên thường được được gọi là kim cương không màu)
- Màu loại G,H,I,J có độ trong suốt cũng tương đối
cao, rất khó để phân biệt được với các loại kim cương màu
D,E,F vì chúng cũng gần như là kim cương không màu
h %>% group_by(color) %>% summarise(n = n()) %>%
ggplot(aes(color,n)) +
geom_col(fill='red') +
geom_text(aes(label = n),vjust = 2, color = 'black') +
xlab('Color') +
ylab('Số lượng') +
labs(title = 'Hình 1: Cấp độ màu của kim cương')

- Qua hình trên ta thấy được:
- Tỉ trọng giữa các màu của kim cương không đồng đều
- Cấp độ màu G có số lượng lớn nhất là 11292 viên gấp
4 lần so với cấp độ màu J bé nhất là 2808 viên
- Cấp độ màu E có 9797 viên
- Cấp độ màu F, H, D có lần lượt là 9542, 8304, 6775
viên
- Cấp độ màu I có 5422 viên
Biểu đồ phân loại màu của kim cương
h %>% group_by(color) %>% summarise(n = n()) %>%
ggplot(aes(color,n)) +
geom_col(fill='blue') +
geom_text(aes(label = n),vjust = 2, color = 'yellow') +
labs(x = 'Màu', y = 'Số lượng')

labs(title =' Hình 1: Biểu đồ phân loại màu của kim cương') +
coord_flip()
## NULL
- Quan sát biểu đồ ta thấy:
- Màu sắc của các kim cương phân bố không đồng đều
- Số kim cương không màu chiếm phần lớn số lượng gồm: D, E,
F có lần lượt là 6775, 9797, 9542 viên
- Số kim cương màu G chiếm số lượng lớn nhất với
11292 viên
- Số kim cương có màu nhưng rất ít( gần như không màu) chiếm phần nhỏ
số lượng gồm: H, I, J có lần lượt là 8304, 5422, 2808
viên.
Biểu đồ thể hiện số lượng kim cương theo màu
h %>% group_by(color) %>% summarise(n=n()) %>%
ggplot(aes(x = color,y = n)) +
geom_col(position = 'dodge') +
facet_wrap(~color) +
geom_text(aes(label = n),vjust = 2, color = 'blue') +
labs(x = 'Màu sắc', y = 'Số lượng') +
labs(title = 'Hình 1: Tập hợp các biểu đồ thể hiện số lượng kim cương theo màu')

- Quan sát biểu đồ ta thấy:
- Tỉ trọng giữa các màu của kim cương không đồng đều
- Cấp độ màu G có số lượng lớn nhất là 11292 viên gấp
4 lần so với cấp độ màu J bé nhất là 2808 viên
- Cấp độ màu E có 9797 viên
- Cấp độ màu F, H, D có lần lượt là 9542, 8304, 6775
viên
- Cấp độ màu I có 5422 viên
Biểu đồ phân bổ số lượng màu của các kim cương(Biểu đồ ngang)
h %>% ggplot(aes(x = color)) +
geom_bar() +
labs(x = 'Màu sắc', y = 'Số lượng') +
coord_flip() +
labs(title = 'Hình 1: Biểu đồ phân bổ số lượng màu của các kim cương(biểu đồ ngang)')

- Quan sát biểu đồ ta thấy:
- Màu sắc của các kim cương phân bố không đồng đều. Cho thấy mức độ
khan hiếm của từng loại màu của kim cương
- Số kim cương màu G chiếm số lượng lớn nhất với hơn
11000 viên
- Số kim cương có màu nhưng rất ít( gần như không màu) chiếm phần nhỏ
số lượng gồm: H, I, J có lần lượt là hơn 8000viên, gần
5500 viên, gần 3000 viên.
- Số kim cương không màu chiếm phần lớn số lượng gồm: D, E,
F có lần lượt là hơn 6500 viên, gần 10000 viên, xấp xỉ 9500
viên
Biểu đồ thể hiện giá trị trung bình của số kim cương phân theo
màu
h %>% group_by(loai) %>% summarise(m= mean(carat)) %>%
ggplot(aes(x = loai,y = m)) +
geom_col(position = 'dodge') +
geom_text(aes(label = round(m,2)), vjust = 2, color = 'red') +
labs(x = 'Màu', y = 'Mean') +
labs(title = 'Hình 1: Biểu đồ thể hiện trung bình số kim cương theo màu')

- Quan sát biểu đồ ta thấy
- Mức độ phân bố trung bình các màu của kim cương tương đối đồng
đều
- Màu Fair có mức độ phân bố trung bình cao nhất
1,05
- Màu Good, Very Good,
Premiumcó mức độ phân bố trung bình gần 0,8 cụ thể lần
lượt là: 0,85; 0,81; 0,89
- Màu Ideal có mức độ phân bố trung bình thấp nhất
chỉ nằm ở 0,7
Biểu đồ thể hiện tỉ lệ kim cương theo loại và màu
k <- h %>% group_by(loai, color) %>% summarise(n = n())
## `summarise()` has grouped output by 'loai'. You can override using the
## `.groups` argument.
k %>% ggplot(aes(x = loai, y = n)) +
geom_col(data = k %>% filter(color == 'G'), fill = 'red') +
geom_col(data = k %>% filter(color == 'H'), fill = 'blue')

- Quan sát biểu đồ ta thấy:
- k là một tập hợp mới thống kê số lượng kim cương theo loại và
màu
- Ta thấy số lượng kim cương màu H chiếm phần lớn trong tổng, số lượng
kim cương màu G chỉ chiếm số ít
- Cụ thể:
- SỐ lượng kim cương màu G loại Ideal nhiều nhất với
hơn 3000 viên trong khi đó cùng loại màu H chỉ gần 2000 viên
- Số lượng kim cương màu G loại Fair chiếm phần lớn
với hơn 300 viên trong khi đó cùng loại màu H gần như không có
- SỐ lượng kim cương màu G loại VeryGoodchiếm trung
bình với gần 2000 viên trong khi đó cùng loại màu H chỉ gần 500
viên
CUT - Vết cắt của kim cương (bao gồm: depth và table):
h %>% group_by(table) %>% filter(table >= 53 & table <= 65) %>% summarise(n = n()) %>%
ggplot(aes(table,n)) +
geom_col(fill='green') +
xlab('Table') +
ylab('Số lượng') +
labs(title = 'Hình 1: Vết cắt table của kim cương')

- Quan sát biểu đồ trên ta thấy được:
- Mức độ phân bổ của các vết cắt kim cương ko đồng đều
- Các viên kim cương có vết cắt nằm trong khoảng từ 55 đến 60 chiếm số
lượng lớn nhất với hơn 30000 viên. Cụ thể là: Vết cắt ở 55,75 và 56,6
chiếm số lượng lớn nhất với hơn 19000 viên
- Các viên kim cương có vết cắt nằm trong khoảng từ 52,5 đến dưới 55
chiếm số lượng tương đối nhỏ với hơn 3000 viên.
- Các viên kim cương có vết cắt nằm trong khoảng từ 60 đến dưới 65
chiếm số lượng nhỏ nhất với hơn 4000 viên. Cụ thể là: Vết cắt ở 65 chiếm
số lượng nhỏ nhất với chỉ khoảng 200 viên
##Cut: Vết cắt của kim cương
h %>% ggplot(aes(x = loai)) +
geom_bar() +
labs(x = 'Loại', y = 'Số lượng') +
coord_flip() +
labs(title = 'Hình 1: Vết cắt của kim cương(biểu đồ ngang)')

- Quan sát biểu đồ trên ta thấy được:
- Mức độ phân bổ của các loại kim cương ko đồng đều
- Các viên kim cương loại Ideal có số lượng lớn nhất
với hơn 20000 viên.
- Các viên kim cương loại Fair có số lượng ít nhất
với hơn 2500 viên.
- Các viên kim cương loại Good,
Verygood, Premium có số lượng trung
bình với lần lượt là 5000, 12500, 13000 viên
Biểu đồ phân loại kim cương
h %>% group_by(loai) %>% summarise(n = n()) %>%
ggplot(aes(loai,n)) +
geom_col(fill='grey') +
geom_text(aes(label = n),vjust = 2, color = 'red') +
labs(x = 'Loại', y = 'Số lượng') +
labs(title =' Hình 1: Biểu đồ phân loại kim cương')

- Quan sát biểu đồ ta thấy:
- Mức độ phân bố kim cương theo các loại không đồng đều
- Số lượng kim cương loại Ideal nhiều nhất với 21551
viên
- Số lượng kim cương loại Fair ít nhất với 1610 viên
ít hơn 13 lần so với loại Ideal
- Số lượng kim cương loại Good,
Verygood, Premium có số lượng tăng dần
lần lượt là: 4906 viên, 12082 viên, 13791 viên
Biểu đồ thể hiện tỉ lệ kim cương theo loại và màu
k <- h %>% group_by(loai, color) %>% summarise(n = n())
## `summarise()` has grouped output by 'loai'. You can override using the
## `.groups` argument.
k %>% ggplot(aes(x = loai, y = n)) +
geom_col(data = k %>% filter(color == 'G'), fill = 'green') +
geom_col(data = k %>% filter(color == 'H'), fill = 'grey')

Biểu đồ tỉ số loại kim cương
h %>% group_by(loai) %>% summarise(n = n()) %>%
ggplot(aes(loai,n)) +
geom_col(fill='beige') +
geom_text(aes(label = percent(n/length(h$carat))),vjust = 2, color = 'red') +
labs(x = 'Loại', y = 'Số lượng') +
labs(title =' Hình1: Biểu đồ tỉ số các loại kim cương')

- Quan sát biểu đồ ta thấy:
- Các loại kim cương phân bố không đồng đều
- Số lượng kim cương loại Ideal nhiều nhất chiếm hơn
40%
- Số lượng kim cương loại Fair ít nhất chiếm chỉ hơn
3% ít hơn 13 lần so với loại Ideal
- Số lượng kim cương loại Good,
Verygood, Premium có số lượng tăng dần
lần lượt là: 9,1%, 22,4%; 25,6%
Biểu đồ thể hiện trung bình giá kim cương theo loại
h %>% group_by(loai,color) %>% summarise(m = mean(price)) %>%
ggplot(aes(x = loai,y = m)) +
geom_col(position = 'dodge') +
facet_wrap(~color) +
geom_text(aes(label = round(m))) +
labs(x = 'Loại', y = 'Số lượng') +
labs(title = 'Hình 1: Biểu đồ thể hiện trung bình giá kim cương theo loại')
## `summarise()` has grouped output by 'loai'. You can override using the
## `.groups` argument.

Tập hợp các biểu đồ thể hiện tỉ lệ kim cương theo loại
h %>% group_by(loai,color) %>% summarise(n=n()) %>%
ggplot(aes(x = loai,y = n)) +
geom_col(position = 'dodge') +
facet_wrap(~color) +
geom_text(aes(label = n),vjust = 2, color = 'blue') +
labs(x = 'Loại', y = 'Số lượng') +
labs(title = 'Hình 1: Tập hợp các biểu đồ thể hiện tỉ lệ kim cương theo loại')
## `summarise()` has grouped output by 'loai'. You can override using the
## `.groups` argument.

CLARITY - Đánh giá cấp độ tinh khiết của kim cương:
Trong tiêu chuẩn 4C, độ tinh khiết của kim cương là số lượng và
khả năng hiển thị của các đặc điểm bên trong và bên ngoài của một viên
kim cương.
Cấp độ trong cao nhất là Hoàn mỹ, được ký hiệu là
IF (Internal Flawless): Những viên kim cương này không
có tạp chất tỳ vết nào được nhìn thấy dưới độ phóng đại 10 lần.
Hai lớp tiếp theo được nhóm lại với nhau là VVS1
và VVS2: Những viên kim cương này được định nghĩa là
rất rất ít tỳ vết bên trong, gồm cấp độ thứ nhất (VVS1) hoặc thứ hai
(VVS2).
Tiếp theo là các cấp độ tinh khiết VS1 và
VS2: Các đầu kim (needle) và vết lông vũ nhỏ (small
feather) có thể được tìm thấy trong các lớp VS1 và VS2 này nhưng chúng
vẫn rất nhỏ so với kích thước của viên kim cương.
Cấp độ mà tỳ vết hoặc tạp chất có thể nhìn thấy rõ ràng là
SI1 và SI2: Tạp chất dễ nhìn thấy dưới
độ phóng đại ký loupe cầm tay nhưng thường không thể nhìn thấy bằng mắt
thường.
Phạm vi cấp độ rõ ràng cuối cùng là I1: Các tạp
chất có thể lớn hơn trong tự nhiên, có thể sẫm màu và có thể nhìn thấy
bằng mắt trong số các thuộc tính có thể có khác.
h %>% group_by(clarity) %>% summarise(n = n()) %>%
ggplot(aes(clarity,n)) +
geom_col(fill='grey') +
geom_text(aes(label = n),vjust = 2, color = 'white') +
xlab('Độ tinh khiết') +
ylab('Số lượng') +
labs(title = 'Hình 1: Cấp độ tinh khiết của kim cương')

-Qua hình trên ta thấy được: - Cấp độ tinh khiết của kim cương có sự
phân hoá không đồng đều (Cấp SI1=13065 lớn hơn nhiều so với cấp I1= 741)
- Cấp độ tinh khiết của kim cương cao thứ 2 là VS2= 12258 - Cấp độ tinh
khiết của kim cương cao thứ 3 là SI2= 9194 - Cấp độ tinh khiết của kim
cương cao thứ 4,5,6,7 lần lượt là VS1= 8171, VVS2= 5066, VVS1= 3655, IF=
1790
Cấp độ tinh khiết của kim cương (biểu đồ ngang)
h %>% ggplot(aes(x = clarity)) +
geom_bar() +
labs(x = 'Cấp độ tinh khiết', y = 'Số lượng') +
coord_flip() +
labs(title = 'Hình 1: Cấp độ tinh khiết của kim cương (biểu đồ ngang)')
- Quan sát biểu đồ ta thấy: - Cấp độ tinh khiết của kim cương có sự phân
hoá không đồng đều (Cấp SI1 lớn hơn nhiều so với cấp
I1) - Cấp độ tinh khiết của kim cương cao thứ 2 là
VS2 hơn 12000 viên - Cấp độ tinh khiết của kim cương
cao thứ 3 là SI2 hơn 9000 viên - Cấp độ tinh khiết của
kim cương cao thứ 4,5,6,7 lần lượt là VS1 hơn 8000
viên, VVS2 hơn 5000 viên, VVS1 hơn
3500 viên, IF hơn 1700 viên
Biểu đồ cấp độ tinh khiết của kim cương
h %>% group_by(clarity) %>% summarise(n = n()) %>%
ggplot(aes(clarity,n)) +
geom_col(fill='white') +
geom_text(aes(label = n),vjust = 2, color = 'black') +
labs(x = 'Cấp độ tinh khiết', y = 'Số lượng')

labs(title =' Hình 1: Biểu đồ phân loại cấp độ tinh khiết của kim cương') +
coord_flip()
## NULL
-Quan sát biểu đồ ta thấy được: - Cấp độ tinh khiết của kim cương có
sự phân hoá không đồng đều (Cấp SI1=13065 lớn hơn nhiều so với cấp I1=
741) - Cấp độ tinh khiết của kim cương cao thứ 2 là VS2= 12258 - Cấp độ
tinh khiết của kim cương cao thứ 3 là SI2= 9194 - Cấp độ tinh khiết của
kim cương cao thứ 4,5,6,7 lần lượt là VS1= 8171, VVS2= 5066, VVS1= 3655,
IF= 1790
Tập hợp các biểu đồ thể hiện số lượng kim cương theo cấp độ tinh
khiết
h %>% group_by(clarity,color) %>% summarise(n=n()) %>%
ggplot(aes(x = clarity,y = n)) +
geom_col(position = 'dodge') +
facet_wrap(~color) +
labs(x = 'Độ tinh khiết', y = 'Số lượng') +
labs(title = 'Hình 1: Tập hợp các biểu đồ thể hiện số lượng kim cương theo cấp độ tinh khiết')
## `summarise()` has grouped output by 'clarity'. You can override using the
## `.groups` argument.

Tập hợp các biểu đồ thể hiện tỉ lệ kim cương theo độ tinh khiết
h %>% group_by(clarity,color) %>% summarise(n=n()) %>%
ggplot(aes(x = clarity,y = n)) +
geom_col(position = 'dodge') +
facet_wrap(~color) +
geom_text(aes(label = n),vjust = 2, color = 'blue') +
labs(x = 'Độ tinh khiết', y = 'Số lượng') +
labs(title = 'Hình 1: Tập hợp các biểu đồ thể hiện số lượng kim cương theo độ tinh khiết')
## `summarise()` has grouped output by 'clarity'. You can override using the
## `.groups` argument.

Biểu đồ thể hiện trung bình giá kim cương theo độ tinh khiết
h %>% group_by(clarity,color) %>% summarise(m = mean(price)) %>%
ggplot(aes(x = clarity,y = m)) +
geom_col(position = 'dodge') +
facet_wrap(~color) +
geom_text(aes(label = round(m))) +
labs(x = 'Loại', y = 'Số lượng') +
labs(title = 'Hình 1: Biểu đồ thể hiện trung bình giá kim cương theo độ tinh khiết')
## `summarise()` has grouped output by 'clarity'. You can override using the
## `.groups` argument.

CARAT - Trọng lượng của kim cương:
Trọng lượng carat của viên kim cương được xác định bằng cách cân
viên kim cương trên một chiếc cân điện tử chính xác. Một carat bằng 1/5
gam, vì vậy một gam sẽ bằng năm carat.
Số carat thường được giữ hai số thập phân cuối cùng, ví dụ như
1.53 , 1.00 , 2.93 carat. Vì vậy, một viên kim cương một nửa carat sẽ
được biểu thị bằng 0,50 carat, một viên kim cương một carat sẽ được biểu
thị bằng 1,00.
Trọng lượng chính xác là rất quan trọng vì việc định giá dựa trên
trọng lượng này và có sự khác biệt đáng kể về giá cả đôi khi chỉ hơn một
phần trăm carat. Một viên kim cương nặng 0,99 carat có giá thấp hơn một
viên kim cương nặng 1,00 carat. Tuy nhiên nếu nhìn bằng mắt thường bạn
sẽ không phân biệt được sự khác biệt này.
h %>% group_by(carat) %>% filter(carat >= 0.23 & carat <= 2.05) %>% summarise(n = n()) %>%
ggplot(aes(carat,n)) +
geom_col(fill='blue') +
xlab('Carat') +
ylab('Số lượng') +
labs(title = 'Hình 1: Trọng lượng của kim cương')

Qua hình trên ta thấy được: - Ta thấy trọng lượng của kim cương phân
bố không đồng đều. Đa số tập trung ở mức từ 0,3-1,6 carat - Các mức
trọng lượng chiếm phần lớn là 0,3 ; 0,65 và 1 carat - Các mức trọng
lượng chiếm số lượng ít nhất là từ 1,6- 1,9
LS0tCnRpdGxlOiAiTmhp4buHbSB24bulIDQiCmF1dGhvcjogIlBo4bqhbSBYdcOibiBIb2FuIgpkYXRlOiAiYHIgZm9ybWF0KFN5cy50aW1lKCksICclSDolTTolUywgJWQgLSAlbSAtICVZJylgIgpvdXRwdXQ6CiAgaHRtbF9kb2N1bWVudDoKICAgIGNvZGVfZG93bmxvYWQ6IHRydWUKICAgIGNvZGVfZm9sZGluZzogc2hvdwogICAgdGhlbWU6ICJkZWZhdWx0IgogICAgdG9jX2RlcHRoOiAzCiAgICB0b2NfZmxvYXQ6IHRydWUKICAgIHRvYzogdHJ1ZQotLS0KCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobyA9IFRSVUUpCmxpYnJhcnkoZHBseXIpCmxpYnJhcnkodGlkeXZlcnNlKQpsaWJyYXJ5KHNjYWxlcykKbGlicmFyeShEVCkKYGBgCgogCiMgTeG7pWMgdGnDqnUgYsOgaSBuZ2hpw6puIGPhu6l1OgotIMSQw6FuaCBnacOhIDUzOTQwIHZpw6puIGtpbSBjxrDGoW5nIHRyw6puIGThu68gbGnhu4d1IERpYW1vbmRzOgogIAogIC0gKipDTEFSSVRZKiogKMSQ4buZIHRpbmgga2hp4bq/dCBj4bunYSBraW0gY8awxqFuZykKICAtICoqQ09MT1IqKiAoTcOgdSBj4bunYSBraW0gY8awxqFuZykgIAogIC0gKipDQVJBVCoqIChUcuG7jW5nIGzGsOG7o25nIGPhu6dhIGtpbSBjxrDGoW5nKQogIC0gKipDVVQqKiAoVuG6v3QgY+G6r3QgY+G7p2Ega2ltIGPGsMahbmcgKQogIAotIEfhu5NtIGPDsyAxMCBiaeG6v24sIMSRw7MgbMOgOgogIC0gKipQcmljZSoqOiBHacOhIGPhu6dhIHZpw6puIGtpbSBjxrDGoW5nIChVU0QpCiAgLSAqKkNhcmF0Kio6IFRy4buNbmcgbMaw4bujbmcgY+G7p2EgdmnDqm4ga2ltIGPGsMahbmcgKGNhcmF0KQogIC0gKipDdXQqKjogQ2jhuqV0IGzGsOG7o25nIGPhu6dhIHbhur90IGPhuq90IChGYWlyLCBHb29kLCBWZXJ5IEdvb2QsIEV4Y2VsbGVudCwgSWRlYWwpCiAgLSAqKkNvbG9yKio6IE3DoHUgc+G6r2MgY+G7p2EgdmnDqm4ga2ltIGPGsMahbmcoRCxFLEksRixHLEgpCiAgLSAqKkNsYXJpdHkqKjogxJDhu5kgdHJvbmcgY+G7p2EgdmnDqm4ga2ltIGPGsMahbmcoVlMyLFZWUzIsU0kxLFNJMixWUzEsVlZTMSkKICAtICoqWCoqOiDEkOG7mSBkw6BpIGPhu6dhIHZpw6puIGtpbSBjxrDGoW5nIChtbSkKICAtICoqWSoqOiDEkOG7mSBy4buZbmcgY+G7p2EgdmnDqm4ga2ltIGPGsMahbmcgKG1tKQogIC0gKipaKio6IMSQ4buZIHPDonUgY+G7p2EgdmnDqm4ga2ltIGPGsMahbmcgKG1tKQogIC0gKipUYWJsZSoqOiBDaGnhu4F1IHLhu5luZyBj4bunYSDEkeG7iW5oIGtpbSBjxrDGoW5nIHNvIHbhu5tpIMSRaeG7g20gcuG7mW5nIG5o4bqldAogIC0gKipEZXB0aCoqOiBU4bu3IGzhu4cgcGjhuqduIHRyxINtIMSR4buZIHPDonUKCiMgVGnhur9uIGjDoG5oIG5naGnDqm4gY+G7qXU6ClRyxrDhu5tjIGjhur90LCB0YSBj4bqnbiBwaOG6o2kgZ+G7jWkgZOG7ryBsaeG7h3UgZGlhbW9uZHMgbMOqbiAKYGBge3IgZWNobz1UUlVFLCB3YXJuaW5nPUZBTFNFfQpoIDwtIGRpYW1vbmRzCmBgYAoKLSDEkOG7lWkgdMOqbiBiaeG6v24gKipjdXQqKiB0cm9uZyBk4buvIGxp4buHdSBkaWFtb25kcywgdGhheSBi4bqxbmcgdMOqbiAqKmxv4bqhaSoqIMSR4buDIHRyw6FuaCBi4buLIG5o4bqnbSBs4bqrbiBraGkgxJHDoW5oIGdpw6EgZ2nhu69hIGxv4bqhaSBj4bunYSBraW0gY8awxqFuZyB2w6AgduG6v3QgY+G6r3QgY+G7p2Ega2ltIGPGsMahbmcgCmBgYHtyIGVjaG89VFJVRSwgd2FybmluZz1GQUxTRX0KaCA8LSByZW5hbWUoaCwgbG9haSA9IGN1dCkKZGF0YXRhYmxlKGgpCmBgYAoKIyBDT0xPUiAtIEPhuqVwIMSR4buZIG3DoHUgY+G7p2Ega2ltIGPGsMahbmc6IAotIEPhuqVwIMSR4buZIG3DoHUgY+G7p2Ega2ltIGPGsMahbmcgbsOzaSBt4buZdCBjw6FjaCBj4bulIHRo4buDIGzDoCB0YSBwaMOibiBsb+G6oWkgxJHhu5kgdHJvbmcgbMOgIGPhu6dhIG3DoHUgc+G6r2M6CiAgLSBNw6B1IGxv4bqhaSAqKkQsIEUgdsOgIEYqKiBjw7MgxJHhu5kgdHJvbmcgc3Xhu5F0IGfhuqduIG5oxrAgbMOgIHR1eeG7h3QgxJHhu5FpIChOw6puIHRoxrDhu51uZyDEkcaw4bujYyDEkcaw4bujYyBn4buNaSBsw6Aga2ltIGPGsMahbmcga2jDtG5nIG3DoHUpCiAgLSBNw6B1IGxv4bqhaSAqKkcsSCxJLEoqKiBjw7MgxJHhu5kgdHJvbmcgc3Xhu5F0IGPFqW5nIHTGsMahbmcgxJHhu5FpIGNhbywgcuG6pXQga2jDsyDEkeG7gyBwaMOibiBiaeG7h3QgxJHGsOG7o2MgduG7m2kgY8OhYyBsb+G6oWkga2ltIGPGsMahbmcgbcOgdSAqKkQsRSxGKiogdsOsIGNow7puZyBjxaluZyBn4bqnbiBuaMawIGzDoCBraW0gY8awxqFuZyBraMO0bmcgbcOgdSAKICAKYGBge3IgZWNobz1UUlVFLCB3YXJuaW5nPUZBTFNFfQpoICU+JSBncm91cF9ieShjb2xvcikgJT4lIHN1bW1hcmlzZShuID0gbigpKSAlPiUKICBnZ3Bsb3QoYWVzKGNvbG9yLG4pKSArCiAgICBnZW9tX2NvbChmaWxsPSdyZWQnKSArCiAgICBnZW9tX3RleHQoYWVzKGxhYmVsID0gbiksdmp1c3QgPSAyLCBjb2xvciA9ICdibGFjaycpICsKICAgIHhsYWIoJ0NvbG9yJykgKwogICAgeWxhYignU+G7kSBsxrDhu6NuZycpICsKICAgIGxhYnModGl0bGUgPSAnSMOsbmggMTogQ+G6pXAgxJHhu5kgbcOgdSBj4bunYSBraW0gY8awxqFuZycpCmBgYAoKLSBRdWEgaMOsbmggdHLDqm4gdGEgdGjhuqV5IMSRxrDhu6NjOgogIC0gVOG7iSB0cuG7jW5nIGdp4buvYSBjw6FjIG3DoHUgY+G7p2Ega2ltIGPGsMahbmcga2jDtG5nIMSR4buTbmcgxJHhu4F1CiAgLSBD4bqlcCDEkeG7mSBtw6B1ICoqRyoqIGPDsyBz4buRIGzGsOG7o25nIGzhu5tuIG5o4bqldCBsw6AgMTEyOTIgdmnDqm4gZ+G6pXAgNCBs4bqnbiBzbyB24bubaSBj4bqlcCDEkeG7mSBtw6B1IEogYsOpIG5o4bqldCBsw6AgMjgwOCB2acOqbgogIC0gQ+G6pXAgxJHhu5kgbcOgdSAqKkUqKiBjw7MgOTc5NyB2acOqbiAKICAtIEPhuqVwIMSR4buZIG3DoHUgKipGKiosIEgsIEQgY8OzIGzhuqduIGzGsOG7o3QgbMOgIDk1NDIsIDgzMDQsIDY3NzUgdmnDqm4KICAtIEPhuqVwIMSR4buZIG3DoHUgKipJKiogY8OzIDU0MjIgdmnDqm4gCgojIyBCaeG7g3UgxJHhu5MgcGjDom4gbG/huqFpIG3DoHUgY+G7p2Ega2ltIGPGsMahbmcKYGBge3IgZWNobz1UUlVFLCB3YXJuaW5nPUZBTFNFfQpoICU+JSBncm91cF9ieShjb2xvcikgJT4lIHN1bW1hcmlzZShuID0gbigpKSAlPiUKICBnZ3Bsb3QoYWVzKGNvbG9yLG4pKSArCiAgICBnZW9tX2NvbChmaWxsPSdibHVlJykgKwogICAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IG4pLHZqdXN0ID0gMiwgY29sb3IgPSAneWVsbG93JykgKwogICAgbGFicyh4ID0gJ03DoHUnLCB5ID0gJ1Phu5EgbMaw4bujbmcnKQogICAgbGFicyh0aXRsZSA9JyBIw6xuaCAxOiBCaeG7g3UgxJHhu5MgcGjDom4gbG/huqFpIG3DoHUgY+G7p2Ega2ltIGPGsMahbmcnKSArCiAgICBjb29yZF9mbGlwKCkKYGBgCgotIFF1YW4gc8OhdCBiaeG7g3UgxJHhu5MgdGEgdGjhuqV5OgogIC0gTcOgdSBz4bqvYyBj4bunYSBjw6FjIGtpbSBjxrDGoW5nIHBow6JuIGLhu5Ega2jDtG5nIMSR4buTbmcgxJHhu4F1IAogIC0gU+G7kSBraW0gY8awxqFuZyBraMO0bmcgbcOgdSBjaGnhur9tIHBo4bqnbiBs4bubbiBz4buRIGzGsOG7o25nIGfhu5NtOiAqKkQsIEUsIEYqKiBjw7MgbOG6p24gbMaw4bujdCBsw6AgNjc3NSwgOTc5NywgOTU0MiB2acOqbiAKICAtIFPhu5Ega2ltIGPGsMahbmcgbcOgdSAqKkcqKiBjaGnhur9tIHPhu5EgbMaw4bujbmcgbOG7m24gbmjhuqV0IHbhu5tpIDExMjkyIHZpw6puIAogIC0gU+G7kSBraW0gY8awxqFuZyBjw7MgbcOgdSBuaMawbmcgcuG6pXQgw610KCBn4bqnbiBuaMawIGtow7RuZyBtw6B1KSBjaGnhur9tIHBo4bqnbiBuaOG7jyBz4buRIGzGsOG7o25nIGfhu5NtOiAqKkgsIEksIEoqKiBjw7MgbOG6p24gbMaw4bujdCBsw6AgODMwNCwgNTQyMiwgMjgwOCB2acOqbi4KCiMjIEJp4buDdSDEkeG7kyB0aOG7gyBoaeG7h24gc+G7kSBsxrDhu6NuZyBraW0gY8awxqFuZyB0aGVvIG3DoHUgCmBgYHtyIGVjaG89VFJVRSwgd2FybmluZz1GQUxTRX0KaCAlPiUgZ3JvdXBfYnkoY29sb3IpICU+JSBzdW1tYXJpc2Uobj1uKCkpICU+JQogIGdncGxvdChhZXMoeCA9IGNvbG9yLHkgPSBuKSkgKwogICAgZ2VvbV9jb2wocG9zaXRpb24gPSAnZG9kZ2UnKSArCiAgICBmYWNldF93cmFwKH5jb2xvcikgKwogICAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IG4pLHZqdXN0ID0gMiwgY29sb3IgPSAnYmx1ZScpICsKICAgIGxhYnMoeCA9ICdNw6B1IHPhuq9jJywgeSA9ICdT4buRIGzGsOG7o25nJykgKwogICAgbGFicyh0aXRsZSA9ICdIw6xuaCAxOiBU4bqtcCBo4bujcCBjw6FjIGJp4buDdSDEkeG7kyB0aOG7gyBoaeG7h24gc+G7kSBsxrDhu6NuZyBraW0gY8awxqFuZyB0aGVvIG3DoHUnKQpgYGAKCi0gUXVhbiBzw6F0IGJp4buDdSDEkeG7kyB0YSB0aOG6pXk6CiAgLSBU4buJIHRy4buNbmcgZ2nhu69hIGPDoWMgbcOgdSBj4bunYSBraW0gY8awxqFuZyBraMO0bmcgxJHhu5NuZyDEkeG7gXUKICAtIEPhuqVwIMSR4buZIG3DoHUgKipHKiogY8OzIHPhu5EgbMaw4bujbmcgbOG7m24gbmjhuqV0IGzDoCAxMTI5MiB2acOqbiBn4bqlcCA0IGzhuqduIHNvIHbhu5tpIGPhuqVwIMSR4buZIG3DoHUgSiBiw6kgbmjhuqV0IGzDoCAyODA4IHZpw6puCiAgLSBD4bqlcCDEkeG7mSBtw6B1ICoqRSoqIGPDsyA5Nzk3IHZpw6puIAogIC0gQ+G6pXAgxJHhu5kgbcOgdSAqKkYqKiwgSCwgRCBjw7MgbOG6p24gbMaw4bujdCBsw6AgOTU0MiwgODMwNCwgNjc3NSB2acOqbgogIC0gQ+G6pXAgxJHhu5kgbcOgdSAqKkkqKiBjw7MgNTQyMiB2acOqbiAKCiMjIEJp4buDdSDEkeG7kyBwaMOibiBi4buVIHPhu5EgbMaw4bujbmcgbcOgdSBj4bunYSBjw6FjIGtpbSBjxrDGoW5nKEJp4buDdSDEkeG7kyBuZ2FuZykKYGBge3IgZWNobz1UUlVFLCB3YXJuaW5nPUZBTFNFfQpoICU+JSBnZ3Bsb3QoYWVzKHggPSBjb2xvcikpICsKICAgIGdlb21fYmFyKCkgKwogICAgbGFicyh4ID0gJ03DoHUgc+G6r2MnLCB5ID0gJ1Phu5EgbMaw4bujbmcnKSArCiAgICBjb29yZF9mbGlwKCkgKwogICAgbGFicyh0aXRsZSA9ICdIw6xuaCAxOiBCaeG7g3UgxJHhu5MgcGjDom4gYuG7lSBz4buRIGzGsOG7o25nIG3DoHUgY+G7p2EgY8OhYyBraW0gY8awxqFuZyhiaeG7g3UgxJHhu5MgbmdhbmcpJykKYGBgCgotIFF1YW4gc8OhdCBiaeG7g3UgxJHhu5MgdGEgdGjhuqV5OgogIC0gTcOgdSBz4bqvYyBj4bunYSBjw6FjIGtpbSBjxrDGoW5nIHBow6JuIGLhu5Ega2jDtG5nIMSR4buTbmcgxJHhu4F1LiBDaG8gdGjhuqV5IG3hu6ljIMSR4buZIGtoYW4gaGnhur9tIGPhu6dhIHThu6tuZyBsb+G6oWkgbcOgdSBj4bunYSBraW0gY8awxqFuZyAKICAtIFPhu5Ega2ltIGPGsMahbmcgbcOgdSAqKkcqKiBjaGnhur9tIHPhu5EgbMaw4bujbmcgbOG7m24gbmjhuqV0IHbhu5tpIGjGoW4gMTEwMDAgdmnDqm4gCiAgLSBT4buRIGtpbSBjxrDGoW5nIGPDsyBtw6B1IG5oxrBuZyBy4bqldCDDrXQoIGfhuqduIG5oxrAga2jDtG5nIG3DoHUpIGNoaeG6v20gcGjhuqduIG5o4buPIHPhu5EgbMaw4bujbmcgZ+G7k206ICoqSCwgSSwgSioqIGPDsyBs4bqnbiBsxrDhu6N0IGzDoCBoxqFuIDgwMDB2acOqbiwgZ+G6p24gNTUwMCB2acOqbiwgZ+G6p24gMzAwMCB2acOqbi4KICAtIFPhu5Ega2ltIGPGsMahbmcga2jDtG5nIG3DoHUgY2hp4bq/bSBwaOG6p24gbOG7m24gc+G7kSBsxrDhu6NuZyBn4buTbTogKipELCBFLCBGKiogY8OzIGzhuqduIGzGsOG7o3QgbMOgIGjGoW4gNjUwMCB2acOqbiwgZ+G6p24gMTAwMDAgdmnDqm4sIHjhuqVwIHjhu4kgOTUwMCB2acOqbgoKIyMgQmnhu4N1IMSR4buTIHRo4buDIGhp4buHbiBnacOhIHRy4buLIHRydW5nIGLDrG5oIGPhu6dhIHPhu5Ega2ltIGPGsMahbmcgcGjDom4gdGhlbyBtw6B1CmBgYHtyIGVjaG89VFJVRSwgd2FybmluZz1GQUxTRX0KaCAlPiUgZ3JvdXBfYnkobG9haSkgJT4lIHN1bW1hcmlzZShtPSBtZWFuKGNhcmF0KSkgJT4lCiAgZ2dwbG90KGFlcyh4ID0gbG9haSx5ID0gbSkpICsKICAgIGdlb21fY29sKHBvc2l0aW9uID0gJ2RvZGdlJykgKwogICAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IHJvdW5kKG0sMikpLCB2anVzdCA9IDIsIGNvbG9yID0gJ3JlZCcpICsKICAgIGxhYnMoeCA9ICdNw6B1JywgeSA9ICdNZWFuJykgKwogICAgbGFicyh0aXRsZSA9ICdIw6xuaCAxOiBCaeG7g3UgxJHhu5MgdGjhu4MgaGnhu4duIHRydW5nIGLDrG5oIHPhu5Ega2ltIGPGsMahbmcgdGhlbyBtw6B1JykKYGBgCgotIFF1YW4gc8OhdCBiaeG7g3UgxJHhu5MgdGEgdGjhuqV5IAogIC0gTeG7qWMgxJHhu5kgcGjDom4gYuG7kSB0cnVuZyBiw6xuaCBjw6FjIG3DoHUgY+G7p2Ega2ltIGPGsMahbmcgdMawxqFuZyDEkeG7kWkgxJHhu5NuZyDEkeG7gXUgCiAgLSBNw6B1ICoqRmFpcioqIGPDsyBt4bupYyDEkeG7mSBwaMOibiBi4buRIHRydW5nIGLDrG5oIGNhbyBuaOG6pXQgMSwwNQogIC0gTcOgdSAqKkdvb2QqKiwgKipWZXJ5IEdvb2QqKiwgKipQcmVtaXVtKipjw7MgbeG7qWMgxJHhu5kgcGjDom4gYuG7kSB0cnVuZyBiw6xuaCBn4bqnbiAwLDggY+G7pSB0aOG7gyBs4bqnbiBsxrDhu6N0IGzDoDogMCw4NTsgMCw4MTsgMCw4OQogIC0gTcOgdSAqKklkZWFsKiogY8OzIG3hu6ljIMSR4buZIHBow6JuIGLhu5EgdHJ1bmcgYsOsbmggdGjhuqVwIG5o4bqldCBjaOG7iSBu4bqxbSDhu58gMCw3CiAgCiMjIEJp4buDdSDEkeG7kyB0aOG7gyBoaeG7h24gdOG7iSBs4buHIGtpbSBjxrDGoW5nIHRoZW8gbG/huqFpIHbDoCBtw6B1CmBgYHtyIGVjaG89VFJVRSwgd2FybmluZz1GQUxTRX0KayA8LSBoICU+JSBncm91cF9ieShsb2FpLCBjb2xvcikgJT4lIHN1bW1hcmlzZShuID0gbigpKQprICU+JSBnZ3Bsb3QoYWVzKHggPSBsb2FpLCB5ID0gbikpICsKICBnZW9tX2NvbChkYXRhID0gayAlPiUgZmlsdGVyKGNvbG9yID09ICdHJyksIGZpbGwgPSAncmVkJykgKwogIGdlb21fY29sKGRhdGEgPSBrICU+JSBmaWx0ZXIoY29sb3IgPT0gJ0gnKSwgZmlsbCA9ICdibHVlJykKYGBgCgotIFF1YW4gc8OhdCBiaeG7g3UgxJHhu5MgdGEgdGjhuqV5OgogIC0gayBsw6AgbeG7mXQgdOG6rXAgaOG7o3AgbeG7m2kgdGjhu5FuZyBrw6ogc+G7kSBsxrDhu6NuZyBraW0gY8awxqFuZyB0aGVvIGxv4bqhaSB2w6AgbcOgdSAKICAtIFRhIHRo4bqleSBz4buRIGzGsOG7o25nIGtpbSBjxrDGoW5nIG3DoHUgSCBjaGnhur9tIHBo4bqnbiBs4bubbiB0cm9uZyB04buVbmcsIHPhu5EgbMaw4bujbmcga2ltIGPGsMahbmcgbcOgdSBHIGNo4buJIGNoaeG6v20gc+G7kSDDrXQgCi0gQ+G7pSB0aOG7gzogCiAgLSBT4buQIGzGsOG7o25nIGtpbSBjxrDGoW5nIG3DoHUgRyBsb+G6oWkgKipJZGVhbCoqIG5oaeG7gXUgbmjhuqV0IHbhu5tpIGjGoW4gMzAwMCB2acOqbiB0cm9uZyBraGkgxJHDsyBjw7luZyBsb+G6oWkgbcOgdSBIIGNo4buJIGfhuqduIDIwMDAgdmnDqm4KICAtIFPhu5EgbMaw4bujbmcga2ltIGPGsMahbmcgbcOgdSBHIGxv4bqhaSAqKkZhaXIqKiBjaGnhur9tIHBo4bqnbiBs4bubbiB24bubaSBoxqFuIDMwMCB2acOqbiB0cm9uZyBraGkgxJHDsyBjw7luZyBsb+G6oWkgbcOgdSBIIGfhuqduIG5oxrAga2jDtG5nIGPDswogIC0gU+G7kCBsxrDhu6NuZyBraW0gY8awxqFuZyBtw6B1IEcgbG/huqFpICoqVmVyeUdvb2QqKmNoaeG6v20gdHJ1bmcgYsOsbmggduG7m2kgZ+G6p24gMjAwMCB2acOqbiB0cm9uZyBraGkgxJHDsyBjw7luZyBsb+G6oWkgbcOgdSBIIGNo4buJIGfhuqduIDUwMCB2acOqbgogIAojIENVVCAtIFbhur90IGPhuq90IGPhu6dhIGtpbSBjxrDGoW5nIChiYW8gZ+G7k206IGRlcHRoIHbDoCB0YWJsZSk6Ci0gVuG6v3QgY+G6r3QgY+G7p2EgdmnDqm4ga2ltIGPGsMahbmcgdHJvbmcgdGnDqnUgY2h14bqpbiA0QyB0aMaw4budbmcgYuG7iyBuaOG6p20gbOG6q24gduG7m2kgaMOsbmggZOG6oW5nIHRo4buxYyBz4buxIGPhu6dhIHZpw6puIGtpbSBjxrDGoW5nOiBW4bq/dCBj4bqvdCAoQ1VUKSDEkcaw4bujYyDEkcOhbmggZ2nDoSBi4bqxbmcgY8OhYyB04bu3IGzhu4cgY2jhu6kga2jDtG5nIHBo4bqjaSB24buBIGjDrG5oIGThuqFuZywgYmFvIGfhu5NtIAoKICAtIE3hurd0IELDoG4gKHRhYmxlKTogTeG6t3QgYsOgbiBjw7MgaMOsbmggbOG7pWMgZ2nDoWMsIGzDoCBi4buBIG3hurd0IGzhu5tuIG5o4bqldCB0csOqbiDEkeG7iW5oIGPhu6dhIHZpw6puIGtpbSBjxrDGoW5nLiDEkG8gYuG6sW5nIG1pbGltw6l0IHbDoCBzYXUgxJHDsyBjaGlhIGNobyDEkcaw4budbmcga8OtbmggdHJ1bmcgYsOsbmggY+G7p2EgdmnDqm4ga2ltIGPGsMahbmcgxJHhu4MgbOG6pXkgcGjhuqduIHRyxINtICglIHRhYmxlKS4gCiAgCiAgICAtIMSQ4buRaSB24bubaSBt4buZdCB2acOqbiBraW0gY8awxqFuZyB0csOybiwgNjAlIGzDoCB0acOqdSBjaHXhuqluIMSR4buDIGdpw7pwIGLhuqFuIHNvIHPDoW5oIHbDrCDEkcOieSBsw6AgbeG7mXQga8OtY2ggdGjGsOG7m2MgbeG6t3QgYsOgbiBraW0gY8awxqFuZyDEkeG6uXAuCiAgCiAgICAtIEtoaSBt4bq3dCBiw6BuIGtpbSBjxrDGoW5nIGzhu5tuIGjGoW4gNjUlIMSRxrDhu6NjIGNvaSBsw6AgbOG7m24sIGzDoCBraMO0bmcgY8OybiBsw6AgY2jhu4kgc+G7kSB04buRaSDGsHUuIEvDrWNoIHRoxrDhu5tjIGLhuqNuZyBkxrDhu5tpIDYwJSDEkcaw4bujYyBjb2kgbMOgIG5oaeG7gXUgaMahbiB0cm9uZyBwaOG6oW0gdmkg4oCcbMO9IHTGsOG7n25n4oCdLCBnaeG6o20geHXhu5FuZyBraG/huqNuZyA1MyUuIETGsOG7m2kgxJHDsywgYuG6o25nIGPDsyB0aOG7gyDEkcaw4bujYyBjb2kgbMOgIHF1w6Egbmjhu48uIAoKICAtIENoaeG7gXUgc8OidSAoZGVwdGgpOiBDaGnhu4F1IHPDonUgY+G7p2EgdmnDqm4ga2ltIGPGsMahbmcgY8OzIHRo4buDIMSRxrDhu6NjIHTDrW5oIGLhurFuZyBjw6FjaCBjaGlhIHThu5VuZyBjaGnhu4F1IHPDonUgdOG7qyDEkeG7iW5oIMSR4bq/biDEkcOheSBj4bunYSB2acOqbiBraW0gY8awxqFuZyBjaG8gxJHGsOG7nW5nIGvDrW5oIHRydW5nIGLDrG5oLiBN4buZdCBs4bqnbiBu4buvYSwgNjAlIGzDoCB0acOqdSBjaHXhuqluIMSR4buDIMSRw6FuaCBnacOhLiBO4bq/dSB2acOqbiBraW0gY8awxqFuZyBxdcOhIHPDonUsIG7DsyBjw7MgdGjhu4MgeHXhuqV0IGhp4buHbiBtw6B1IHThu5FpLiBO4bq/dSB2acOqbiBraW0gY8awxqFuZyBxdcOhIG7DtG5nLCBuw7MgY8OzIHRo4buDIG3huqV0IMSR4buZIHPDoW5nIGtoaSDDoW5oIHPDoW5nIGzhu410IHJhIG5nb8OgaS4gVGjDtG5nIHRoxrDhu51uZywgxJHhu5FpIHbhu5tpIG3hu5l0IHZpw6puIGtpbSBjxrDGoW5nIHRyw7JuLCA1Nyw1JSDEkeG6v24gNjMlIGzDoCBwaOG6oW0gdmkgxrBhIHRow61jaC4KICAKYGBge3IgZWNobz1UUlVFLCB3YXJuaW5nPUZBTFNFfQpoICU+JSBncm91cF9ieSh0YWJsZSkgJT4lIGZpbHRlcih0YWJsZSA+PSA1MyAmIHRhYmxlIDw9IDY1KSAlPiUgc3VtbWFyaXNlKG4gPSBuKCkpICU+JSAKICBnZ3Bsb3QoYWVzKHRhYmxlLG4pKSArCiAgICBnZW9tX2NvbChmaWxsPSdncmVlbicpICsKICAgIHhsYWIoJ1RhYmxlJykgKwogICAgeWxhYignU+G7kSBsxrDhu6NuZycpICsKICAgIGxhYnModGl0bGUgPSAnSMOsbmggMTogVuG6v3QgY+G6r3QgdGFibGUgY+G7p2Ega2ltIGPGsMahbmcnKQpgYGAKCi0gUXVhbiBzw6F0IGJp4buDdSDEkeG7kyB0csOqbiB0YSB0aOG6pXkgxJHGsOG7o2M6CiAgLSBN4bupYyDEkeG7mSBwaMOibiBi4buVIGPhu6dhIGPDoWMgduG6v3QgY+G6r3Qga2ltIGPGsMahbmcga28gxJHhu5NuZyDEkeG7gXUgCiAgLSBDw6FjIHZpw6puIGtpbSBjxrDGoW5nIGPDsyB24bq/dCBj4bqvdCBu4bqxbSB0cm9uZyBraG/huqNuZyB04burIDU1IMSR4bq/biA2MCBjaGnhur9tIHPhu5EgbMaw4bujbmcgbOG7m24gbmjhuqV0IHbhu5tpIGjGoW4gMzAwMDAgdmnDqm4uIEPhu6UgdGjhu4MgbMOgOiBW4bq/dCBj4bqvdCDhu58gNTUsNzUgdsOgIDU2LDYgY2hp4bq/bSBz4buRIGzGsOG7o25nIGzhu5tuIG5o4bqldCB24bubaSBoxqFuIDE5MDAwIHZpw6puIAogIC0gQ8OhYyB2acOqbiBraW0gY8awxqFuZyBjw7MgduG6v3QgY+G6r3QgbuG6sW0gdHJvbmcga2hv4bqjbmcgdOG7qyA1Miw1IMSR4bq/biBkxrDhu5tpIDU1IGNoaeG6v20gc+G7kSBsxrDhu6NuZyB0xrDGoW5nIMSR4buRaSBuaOG7jyB24bubaSBoxqFuIDMwMDAgdmnDqm4uIAogIC0gQ8OhYyB2acOqbiBraW0gY8awxqFuZyBjw7MgduG6v3QgY+G6r3QgbuG6sW0gdHJvbmcga2hv4bqjbmcgdOG7qyA2MCDEkeG6v24gZMaw4bubaSA2NSBjaGnhur9tIHPhu5EgbMaw4bujbmcgbmjhu48gbmjhuqV0IHbhu5tpIGjGoW4gNDAwMCB2acOqbi4gQ+G7pSB0aOG7gyBsw6A6IFbhur90IGPhuq90IOG7nyA2NSBjaGnhur9tIHPhu5EgbMaw4bujbmcgbmjhu48gbmjhuqV0IHbhu5tpIGNo4buJIGtob+G6o25nIDIwMCB2acOqbiAKCiMjQ3V0OiBW4bq/dCBj4bqvdCBj4bunYSBraW0gY8awxqFuZwpgYGB7ciBlY2hvPVRSVUUsIHdhcm5pbmc9RkFMU0V9CmggJT4lIGdncGxvdChhZXMoeCA9IGxvYWkpKSArCiAgICBnZW9tX2JhcigpICsKICAgIGxhYnMoeCA9ICdMb+G6oWknLCB5ID0gJ1Phu5EgbMaw4bujbmcnKSArCiAgICBjb29yZF9mbGlwKCkgKwogICAgbGFicyh0aXRsZSA9ICdIw6xuaCAxOiBW4bq/dCBj4bqvdCBj4bunYSBraW0gY8awxqFuZyhiaeG7g3UgxJHhu5MgbmdhbmcpJykKYGBgCgotIFF1YW4gc8OhdCBiaeG7g3UgxJHhu5MgdHLDqm4gdGEgdGjhuqV5IMSRxrDhu6NjOgogIC0gTeG7qWMgxJHhu5kgcGjDom4gYuG7lSBj4bunYSBjw6FjIGxv4bqhaSBraW0gY8awxqFuZyBrbyDEkeG7k25nIMSR4buBdSAKICAtIEPDoWMgdmnDqm4ga2ltIGPGsMahbmcgbG/huqFpICoqSWRlYWwqKiBjw7Mgc+G7kSBsxrDhu6NuZyBs4bubbiBuaOG6pXQgduG7m2kgaMahbiAyMDAwMCB2acOqbi4KICAtIEPDoWMgdmnDqm4ga2ltIGPGsMahbmcgbG/huqFpICoqRmFpcioqIGPDsyBz4buRIGzGsOG7o25nIMOtdCBuaOG6pXQgduG7m2kgaMahbiAyNTAwIHZpw6puLgogIC0gQ8OhYyB2acOqbiBraW0gY8awxqFuZyBsb+G6oWkgKipHb29kKiosICoqVmVyeWdvb2QqKiwgKipQcmVtaXVtKiogY8OzIHPhu5EgbMaw4bujbmcgdHJ1bmcgYsOsbmggduG7m2kgbOG6p24gbMaw4bujdCBsw6AgNTAwMCwgMTI1MDAsIDEzMDAwIHZpw6puCgojIyBCaeG7g3UgxJHhu5MgcGjDom4gbG/huqFpIGtpbSBjxrDGoW5nCgpgYGB7ciBlY2hvPVRSVUUsIHdhcm5pbmc9RkFMU0V9CmggJT4lIGdyb3VwX2J5KGxvYWkpICU+JSBzdW1tYXJpc2UobiA9IG4oKSkgJT4lCiAgZ2dwbG90KGFlcyhsb2FpLG4pKSArCiAgICBnZW9tX2NvbChmaWxsPSdncmV5JykgKwogICAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IG4pLHZqdXN0ID0gMiwgY29sb3IgPSAncmVkJykgKwogICAgbGFicyh4ID0gJ0xv4bqhaScsIHkgPSAnU+G7kSBsxrDhu6NuZycpICsKICAgIGxhYnModGl0bGUgPScgSMOsbmggMTogQmnhu4N1IMSR4buTIHBow6JuIGxv4bqhaSBraW0gY8awxqFuZycpCmBgYAoKLSBRdWFuIHPDoXQgYmnhu4N1IMSR4buTIHRhIHRo4bqleToKICAtIE3hu6ljIMSR4buZIHBow6JuIGLhu5Ega2ltIGPGsMahbmcgdGhlbyBjw6FjIGxv4bqhaSBraMO0bmcgxJHhu5NuZyDEkeG7gXUgCiAgLSBT4buRIGzGsOG7o25nIGtpbSBjxrDGoW5nIGxv4bqhaSAqKklkZWFsKiogbmhp4buBdSBuaOG6pXQgduG7m2kgMjE1NTEgdmnDqm4gCiAgLSBT4buRIGzGsOG7o25nIGtpbSBjxrDGoW5nIGxv4bqhaSAqKkZhaXIqKiDDrXQgbmjhuqV0IHbhu5tpIDE2MTAgdmnDqm4gw610IGjGoW4gMTMgbOG6p24gc28gduG7m2kgbG/huqFpICoqSWRlYWwqKgogIC0gU+G7kSBsxrDhu6NuZyBraW0gY8awxqFuZyBsb+G6oWkgKipHb29kKiosICoqVmVyeWdvb2QqKiwgKipQcmVtaXVtKiogY8OzIHPhu5EgbMaw4bujbmcgdMSDbmcgZOG6p24gbOG6p24gbMaw4bujdCBsw6A6IDQ5MDYgdmnDqm4sIDEyMDgyIHZpw6puLCAxMzc5MSB2acOqbgoKIyMgQmnhu4N1IMSR4buTIHRo4buDIGhp4buHbiB04buJIGzhu4cga2ltIGPGsMahbmcgdGhlbyBsb+G6oWkgdsOgIG3DoHUgCmBgYHtyIGVjaG89VFJVRSwgd2FybmluZz1GQUxTRX0KayA8LSBoICU+JSBncm91cF9ieShsb2FpLCBjb2xvcikgJT4lIHN1bW1hcmlzZShuID0gbigpKQprICU+JSBnZ3Bsb3QoYWVzKHggPSBsb2FpLCB5ID0gbikpICsKICBnZW9tX2NvbChkYXRhID0gayAlPiUgZmlsdGVyKGNvbG9yID09ICdHJyksIGZpbGwgPSAnZ3JlZW4nKSArCiAgZ2VvbV9jb2woZGF0YSA9IGsgJT4lIGZpbHRlcihjb2xvciA9PSAnSCcpLCBmaWxsID0gJ2dyZXknKQpgYGAKICAKIyMgQmnhu4N1IMSR4buTIHThu4kgc+G7kSBsb+G6oWkga2ltIGPGsMahbmcKCmBgYHtyIGVjaG89VFJVRSwgd2FybmluZz1GQUxTRX0KaCAlPiUgZ3JvdXBfYnkobG9haSkgJT4lIHN1bW1hcmlzZShuID0gbigpKSAlPiUKICBnZ3Bsb3QoYWVzKGxvYWksbikpICsKICAgIGdlb21fY29sKGZpbGw9J2JlaWdlJykgKwogICAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IHBlcmNlbnQobi9sZW5ndGgoaCRjYXJhdCkpKSx2anVzdCA9IDIsIGNvbG9yID0gJ3JlZCcpICsKICAgIGxhYnMoeCA9ICdMb+G6oWknLCB5ID0gJ1Phu5EgbMaw4bujbmcnKSArCiAgICBsYWJzKHRpdGxlID0nIEjDrG5oMTogQmnhu4N1IMSR4buTIHThu4kgc+G7kSBjw6FjIGxv4bqhaSBraW0gY8awxqFuZycpCiAgICAKYGBgCgotIFF1YW4gc8OhdCBiaeG7g3UgxJHhu5MgdGEgdGjhuqV5OgogIC0gQ8OhYyBsb+G6oWkga2ltIGPGsMahbmcgcGjDom4gYuG7kSBraMO0bmcgxJHhu5NuZyDEkeG7gXUKICAtIFPhu5EgbMaw4bujbmcga2ltIGPGsMahbmcgbG/huqFpICoqSWRlYWwqKiBuaGnhu4F1IG5o4bqldCBjaGnhur9tIGjGoW4gNDAlIAogIC0gU+G7kSBsxrDhu6NuZyBraW0gY8awxqFuZyBsb+G6oWkgKipGYWlyKiogw610IG5o4bqldCBjaGnhur9tIGNo4buJIGjGoW4gMyUgw610IGjGoW4gMTMgbOG6p24gc28gduG7m2kgbG/huqFpICoqSWRlYWwqKgogIC0gU+G7kSBsxrDhu6NuZyBraW0gY8awxqFuZyBsb+G6oWkgKipHb29kKiosICoqVmVyeWdvb2QqKiwgKipQcmVtaXVtKiogY8OzIHPhu5EgbMaw4bujbmcgdMSDbmcgZOG6p24gbOG6p24gbMaw4bujdCBsw6A6IDksMSUsIDIyLDQlOyAyNSw2JQoKIyMgQmnhu4N1IMSR4buTIHRo4buDIGhp4buHbiB0cnVuZyBiw6xuaCBnacOhIGtpbSBjxrDGoW5nIHRoZW8gbG/huqFpCmBgYHtyIGVjaG89VFJVRSwgd2FybmluZz1GQUxTRX0KaCAlPiUgZ3JvdXBfYnkobG9haSxjb2xvcikgJT4lIHN1bW1hcmlzZShtID0gbWVhbihwcmljZSkpICU+JQogIGdncGxvdChhZXMoeCA9IGxvYWkseSA9IG0pKSArCiAgICBnZW9tX2NvbChwb3NpdGlvbiA9ICdkb2RnZScpICsKICAgIGZhY2V0X3dyYXAofmNvbG9yKSArCiAgICBnZW9tX3RleHQoYWVzKGxhYmVsID0gcm91bmQobSkpKSArCiAgICBsYWJzKHggPSAnTG/huqFpJywgeSA9ICdT4buRIGzGsOG7o25nJykgKwogICAgbGFicyh0aXRsZSA9ICdIw6xuaCAxOiBCaeG7g3UgxJHhu5MgdGjhu4MgaGnhu4duIHRydW5nIGLDrG5oIGdpw6Ega2ltIGPGsMahbmcgdGhlbyBsb+G6oWknKQpgYGAKCiMjIFThuq1wIGjhu6NwIGPDoWMgYmnhu4N1IMSR4buTIHRo4buDIGhp4buHbiB04buJIGzhu4cga2ltIGPGsMahbmcgdGhlbyBsb+G6oWkKYGBge3IgZWNobz1UUlVFLCB3YXJuaW5nPUZBTFNFfQpoICU+JSBncm91cF9ieShsb2FpLGNvbG9yKSAlPiUgc3VtbWFyaXNlKG49bigpKSAlPiUKICBnZ3Bsb3QoYWVzKHggPSBsb2FpLHkgPSBuKSkgKwogICAgZ2VvbV9jb2wocG9zaXRpb24gPSAnZG9kZ2UnKSArCiAgICBmYWNldF93cmFwKH5jb2xvcikgKwogICAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IG4pLHZqdXN0ID0gMiwgY29sb3IgPSAnYmx1ZScpICsKICAgIGxhYnMoeCA9ICdMb+G6oWknLCB5ID0gJ1Phu5EgbMaw4bujbmcnKSArCiAgICBsYWJzKHRpdGxlID0gJ0jDrG5oIDE6IFThuq1wIGjhu6NwIGPDoWMgYmnhu4N1IMSR4buTIHRo4buDIGhp4buHbiB04buJIGzhu4cga2ltIGPGsMahbmcgdGhlbyBsb+G6oWknKQpgYGAKCiMgQ0xBUklUWSAtIMSQw6FuaCBnacOhIGPhuqVwIMSR4buZIHRpbmgga2hp4bq/dCBj4bunYSBraW0gY8awxqFuZzogCi0gVHJvbmcgdGnDqnUgY2h14bqpbiA0QywgxJHhu5kgdGluaCBraGnhur90IGPhu6dhIGtpbSBjxrDGoW5nIGzDoCBz4buRIGzGsOG7o25nIHbDoCBraOG6oyBuxINuZyBoaeG7g24gdGjhu4sgY+G7p2EgY8OhYyDEkeG6t2MgxJFp4buDbSBiw6puIHRyb25nIHbDoCBiw6puIG5nb8OgaSBj4bunYSBt4buZdCB2acOqbiBraW0gY8awxqFuZy4KCiAgLSBDw6FjIMSR4bq3YyDEkWnhu4NtIGLDqm4gdHJvbmcgxJHGsOG7o2MgZ+G7jWkgbMOgIOKAnEluY2x1c2lvbnPigJ0gaGF5IGThu4tjaCBt4buZdCBjw6FjaCB04buVbmcgcXXDoXQgbMOgIGPDoWMgdOG7syB24bq/dCBiYW8gYsOqbiB0cm9uZy4gCiAgCiAgLSBDw6FjIMSR4bq3YyDEkWnhu4NtIGLDqm4gbmdvw6BpIMSRxrDhu6NjIGdp4bubaSBo4bqhbiB0csOqbiBi4buBIG3hurd0IGPhu6dhIHbhur90IGPhuq90IGPhu6dhIHZpw6puIGtpbSBjxrDGoW5nLgoKLSBD4bqlcCDEkeG7mSB0cm9uZyBjYW8gbmjhuqV0IGzDoCBIb8OgbiBt4bu5LCDEkcaw4bujYyBrw70gaGnhu4d1IGzDoCAqKklGKiogKEludGVybmFsIEZsYXdsZXNzKTogTmjhu69uZyB2acOqbiBraW0gY8awxqFuZyBuw6B5IGtow7RuZyBjw7MgdOG6oXAgY2jhuqV0IHThu7MgduG6v3QgbsOgbyDEkcaw4bujYyBuaMOsbiB0aOG6pXkgZMaw4bubaSDEkeG7mSBwaMOzbmcgxJHhuqFpIDEwIGzhuqduLgoKLSBIYWkgbOG7m3AgdGnhur9wIHRoZW8gxJHGsOG7o2MgbmjDs20gbOG6oWkgduG7m2kgbmhhdSBsw6AgKipWVlMxKiogdsOgICoqVlZTMioqOiBOaOG7r25nIHZpw6puIGtpbSBjxrDGoW5nIG7DoHkgxJHGsOG7o2MgxJHhu4tuaCBuZ2jEqWEgbMOgIHLhuqV0IHLhuqV0IMOtdCB04buzIHbhur90IGLDqm4gdHJvbmcsIGfhu5NtIGPhuqVwIMSR4buZIHRo4bupIG5o4bqldCAoVlZTMSkgaG/hurdjIHRo4bupIGhhaSAoVlZTMikuCgotIFRp4bq/cCB0aGVvIGzDoCBjw6FjIGPhuqVwIMSR4buZIHRpbmgga2hp4bq/dCAqKlZTMSoqIHbDoCAqKlZTMioqOiBDw6FjIMSR4bqndSBraW0gKG5lZWRsZSkgdsOgIHbhur90IGzDtG5nIHbFqSBuaOG7jyAoc21hbGwgZmVhdGhlcikgY8OzIHRo4buDIMSRxrDhu6NjIHTDrG0gdGjhuqV5IHRyb25nIGPDoWMgbOG7m3AgVlMxIHbDoCBWUzIgbsOgeSBuaMawbmcgY2jDum5nIHbhuqtuIHLhuqV0IG5o4buPIHNvIHbhu5tpIGvDrWNoIHRoxrDhu5tjIGPhu6dhIHZpw6puIGtpbSBjxrDGoW5nLgoKLSBD4bqlcCDEkeG7mSBtw6AgdOG7syB24bq/dCBob+G6t2MgdOG6oXAgY2jhuqV0IGPDsyB0aOG7gyBuaMOsbiB0aOG6pXkgcsO1IHLDoG5nIGzDoCAqKlNJMSoqIHbDoCAqKlNJMioqOiBU4bqhcCBjaOG6pXQgZOG7hSBuaMOsbiB0aOG6pXkgZMaw4bubaSDEkeG7mSBwaMOzbmcgxJHhuqFpIGvDvSBsb3VwZSBj4bqnbSB0YXkgbmjGsG5nIHRoxrDhu51uZyBraMO0bmcgdGjhu4MgbmjDrG4gdGjhuqV5IGLhurFuZyBt4bqvdCB0aMaw4budbmcuCgotIFBo4bqhbSB2aSBj4bqlcCDEkeG7mSByw7UgcsOgbmcgY3Xhu5FpIGPDuW5nIGzDoCAqKkkxKio6IEPDoWMgdOG6oXAgY2jhuqV0IGPDsyB0aOG7gyBs4bubbiBoxqFuIHRyb25nIHThu7Egbmhpw6puLCBjw7MgdGjhu4Mgc+G6q20gbcOgdSB2w6AgY8OzIHRo4buDIG5ow6xuIHRo4bqleSBi4bqxbmcgbeG6r3QgdHJvbmcgc+G7kSBjw6FjIHRodeG7mWMgdMOtbmggY8OzIHRo4buDIGPDsyBraMOhYy4KYGBge3IgZWNobz1UUlVFLCB3YXJuaW5nPUZBTFNFfQpoICU+JSBncm91cF9ieShjbGFyaXR5KSAlPiUgc3VtbWFyaXNlKG4gPSBuKCkpICU+JQogIGdncGxvdChhZXMoY2xhcml0eSxuKSkgKwogICAgZ2VvbV9jb2woZmlsbD0nZ3JleScpICsKICAgIGdlb21fdGV4dChhZXMobGFiZWwgPSBuKSx2anVzdCA9IDIsIGNvbG9yID0gJ3doaXRlJykgKwogICAgeGxhYignxJDhu5kgdGluaCBraGnhur90JykgKwogICAgeWxhYignU+G7kSBsxrDhu6NuZycpICsKICAgIGxhYnModGl0bGUgPSAnSMOsbmggMTogQ+G6pXAgxJHhu5kgdGluaCBraGnhur90IGPhu6dhIGtpbSBjxrDGoW5nJykKYGBgCgotUXVhIGjDrG5oIHRyw6puIHRhIHRo4bqleSDEkcaw4bujYzoKICAtIEPhuqVwIMSR4buZIHRpbmgga2hp4bq/dCBj4bunYSBraW0gY8awxqFuZyBjw7Mgc+G7sSBwaMOibiBob8OhIGtow7RuZyDEkeG7k25nIMSR4buBdSAoQ+G6pXAgU0kxPTEzMDY1IGzhu5tuIGjGoW4gbmhp4buBdSBzbyB24bubaSBj4bqlcCBJMT0gNzQxKQogIC0gQ+G6pXAgxJHhu5kgdGluaCBraGnhur90IGPhu6dhIGtpbSBjxrDGoW5nIGNhbyB0aOG7qSAyIGzDoCBWUzI9IDEyMjU4CiAgLSBD4bqlcCDEkeG7mSB0aW5oIGtoaeG6v3QgY+G7p2Ega2ltIGPGsMahbmcgY2FvIHRo4bupIDMgbMOgIFNJMj0gOTE5NAogIC0gQ+G6pXAgxJHhu5kgdGluaCBraGnhur90IGPhu6dhIGtpbSBjxrDGoW5nIGNhbyB0aOG7qSA0LDUsNiw3IGzhuqduIGzGsOG7o3QgbMOgIFZTMT0gODE3MSwgVlZTMj0gNTA2NiwgVlZTMT0gMzY1NSwgSUY9IDE3OTAKICAKIyMgQ+G6pXAgxJHhu5kgdGluaCBraGnhur90IGPhu6dhIGtpbSBjxrDGoW5nIChiaeG7g3UgxJHhu5MgbmdhbmcpCmBgYHtyIGVjaG89VFJVRSwgd2FybmluZz1GQUxTRX0KaCAlPiUgZ2dwbG90KGFlcyh4ID0gY2xhcml0eSkpICsKICAgIGdlb21fYmFyKCkgKwogICAgbGFicyh4ID0gJ0PhuqVwIMSR4buZIHRpbmgga2hp4bq/dCcsIHkgPSAnU+G7kSBsxrDhu6NuZycpICsKICAgIGNvb3JkX2ZsaXAoKSArCiAgICBsYWJzKHRpdGxlID0gJ0jDrG5oIDE6IEPhuqVwIMSR4buZIHRpbmgga2hp4bq/dCBj4bunYSBraW0gY8awxqFuZyAoYmnhu4N1IMSR4buTIG5nYW5nKScpCmBgYAotIFF1YW4gc8OhdCBiaeG7g3UgxJHhu5MgdGEgdGjhuqV5OgogIC0gQ+G6pXAgxJHhu5kgdGluaCBraGnhur90IGPhu6dhIGtpbSBjxrDGoW5nIGPDsyBz4buxIHBow6JuIGhvw6Ega2jDtG5nIMSR4buTbmcgxJHhu4F1IChD4bqlcCAqKlNJMSoqIGzhu5tuIGjGoW4gbmhp4buBdSBzbyB24bubaSBj4bqlcCAqKkkxKiopCiAgLSBD4bqlcCDEkeG7mSB0aW5oIGtoaeG6v3QgY+G7p2Ega2ltIGPGsMahbmcgY2FvIHRo4bupIDIgbMOgICoqVlMyKiogaMahbiAxMjAwMCB2acOqbiAKICAtIEPhuqVwIMSR4buZIHRpbmgga2hp4bq/dCBj4bunYSBraW0gY8awxqFuZyBjYW8gdGjhu6kgMyBsw6AgKipTSTIqKiBoxqFuIDkwMDAgdmnDqm4gCiAgLSBD4bqlcCDEkeG7mSB0aW5oIGtoaeG6v3QgY+G7p2Ega2ltIGPGsMahbmcgY2FvIHRo4bupIDQsNSw2LDcgbOG6p24gbMaw4bujdCBsw6AgKipWUzEqKiBoxqFuIDgwMDAgdmnDqm4sICoqVlZTMioqIGjGoW4gNTAwMCB2acOqbiwgKipWVlMxKiogaMahbiAzNTAwIHZpw6puLCAqKklGKiogaMahbiAxNzAwIHZpw6puIAoKIyMgQmnhu4N1IMSR4buTIGPhuqVwIMSR4buZIHRpbmgga2hp4bq/dCBj4bunYSBraW0gY8awxqFuZyAKYGBge3IgZWNobz1UUlVFLCB3YXJuaW5nPUZBTFNFfQpoICU+JSBncm91cF9ieShjbGFyaXR5KSAlPiUgc3VtbWFyaXNlKG4gPSBuKCkpICU+JQogIGdncGxvdChhZXMoY2xhcml0eSxuKSkgKwogICAgZ2VvbV9jb2woZmlsbD0nd2hpdGUnKSArCiAgICBnZW9tX3RleHQoYWVzKGxhYmVsID0gbiksdmp1c3QgPSAyLCBjb2xvciA9ICdibGFjaycpICsKICAgIGxhYnMoeCA9ICdD4bqlcCDEkeG7mSB0aW5oIGtoaeG6v3QnLCB5ID0gJ1Phu5EgbMaw4bujbmcnKQogICAgbGFicyh0aXRsZSA9JyBIw6xuaCAxOiBCaeG7g3UgxJHhu5MgcGjDom4gbG/huqFpIGPhuqVwIMSR4buZIHRpbmgga2hp4bq/dCBj4bunYSBraW0gY8awxqFuZycpICsKICAgIGNvb3JkX2ZsaXAoKQpgYGAKLVF1YW4gc8OhdCBiaeG7g3UgxJHhu5MgdGEgdGjhuqV5IMSRxrDhu6NjOgogIC0gQ+G6pXAgxJHhu5kgdGluaCBraGnhur90IGPhu6dhIGtpbSBjxrDGoW5nIGPDsyBz4buxIHBow6JuIGhvw6Ega2jDtG5nIMSR4buTbmcgxJHhu4F1IChD4bqlcCBTSTE9MTMwNjUgbOG7m24gaMahbiBuaGnhu4F1IHNvIHbhu5tpIGPhuqVwIEkxPSA3NDEpCiAgLSBD4bqlcCDEkeG7mSB0aW5oIGtoaeG6v3QgY+G7p2Ega2ltIGPGsMahbmcgY2FvIHRo4bupIDIgbMOgIFZTMj0gMTIyNTgKICAtIEPhuqVwIMSR4buZIHRpbmgga2hp4bq/dCBj4bunYSBraW0gY8awxqFuZyBjYW8gdGjhu6kgMyBsw6AgU0kyPSA5MTk0CiAgLSBD4bqlcCDEkeG7mSB0aW5oIGtoaeG6v3QgY+G7p2Ega2ltIGPGsMahbmcgY2FvIHRo4bupIDQsNSw2LDcgbOG6p24gbMaw4bujdCBsw6AgVlMxPSA4MTcxLCBWVlMyPSA1MDY2LCBWVlMxPSAzNjU1LCBJRj0gMTc5MAoKIyMgVOG6rXAgaOG7o3AgY8OhYyBiaeG7g3UgxJHhu5MgdGjhu4MgaGnhu4duIHPhu5EgbMaw4bujbmcga2ltIGPGsMahbmcgdGhlbyBj4bqlcCDEkeG7mSB0aW5oIGtoaeG6v3QKYGBge3IgZWNobz1UUlVFLCB3YXJuaW5nPUZBTFNFfQpoICU+JSBncm91cF9ieShjbGFyaXR5LGNvbG9yKSAlPiUgc3VtbWFyaXNlKG49bigpKSAlPiUKICBnZ3Bsb3QoYWVzKHggPSBjbGFyaXR5LHkgPSBuKSkgKwogICAgZ2VvbV9jb2wocG9zaXRpb24gPSAnZG9kZ2UnKSArCiAgICBmYWNldF93cmFwKH5jb2xvcikgKwogICAgbGFicyh4ID0gJ8SQ4buZIHRpbmgga2hp4bq/dCcsIHkgPSAnU+G7kSBsxrDhu6NuZycpICsKICAgIGxhYnModGl0bGUgPSAnSMOsbmggMTogVOG6rXAgaOG7o3AgY8OhYyBiaeG7g3UgxJHhu5MgdGjhu4MgaGnhu4duIHPhu5EgbMaw4bujbmcga2ltIGPGsMahbmcgdGhlbyBj4bqlcCDEkeG7mSB0aW5oIGtoaeG6v3QnKQpgYGAKICAKIyMgVOG6rXAgaOG7o3AgY8OhYyBiaeG7g3UgxJHhu5MgdGjhu4MgaGnhu4duIHThu4kgbOG7hyBraW0gY8awxqFuZyB0aGVvIMSR4buZIHRpbmgga2hp4bq/dApgYGB7ciBlY2hvPVRSVUUsIHdhcm5pbmc9RkFMU0V9CmggJT4lIGdyb3VwX2J5KGNsYXJpdHksY29sb3IpICU+JSBzdW1tYXJpc2Uobj1uKCkpICU+JQogIGdncGxvdChhZXMoeCA9IGNsYXJpdHkseSA9IG4pKSArCiAgICBnZW9tX2NvbChwb3NpdGlvbiA9ICdkb2RnZScpICsKICAgIGZhY2V0X3dyYXAofmNvbG9yKSArCiAgICBnZW9tX3RleHQoYWVzKGxhYmVsID0gbiksdmp1c3QgPSAyLCBjb2xvciA9ICdibHVlJykgKwogICAgbGFicyh4ID0gJ8SQ4buZIHRpbmgga2hp4bq/dCcsIHkgPSAnU+G7kSBsxrDhu6NuZycpICsKICAgIGxhYnModGl0bGUgPSAnSMOsbmggMTogVOG6rXAgaOG7o3AgY8OhYyBiaeG7g3UgxJHhu5MgdGjhu4MgaGnhu4duIHPhu5EgbMaw4bujbmcga2ltIGPGsMahbmcgdGhlbyDEkeG7mSB0aW5oIGtoaeG6v3QnKQpgYGAKCiMjIEJp4buDdSDEkeG7kyB0aOG7gyBoaeG7h24gdHJ1bmcgYsOsbmggZ2nDoSBraW0gY8awxqFuZyB0aGVvIMSR4buZIHRpbmgga2hp4bq/dCAKYGBge3IgZWNobz1UUlVFLCB3YXJuaW5nPUZBTFNFfQpoICU+JSBncm91cF9ieShjbGFyaXR5LGNvbG9yKSAlPiUgc3VtbWFyaXNlKG0gPSBtZWFuKHByaWNlKSkgJT4lCiAgZ2dwbG90KGFlcyh4ID0gY2xhcml0eSx5ID0gbSkpICsKICAgIGdlb21fY29sKHBvc2l0aW9uID0gJ2RvZGdlJykgKwogICAgZmFjZXRfd3JhcCh+Y29sb3IpICsKICAgIGdlb21fdGV4dChhZXMobGFiZWwgPSByb3VuZChtKSkpICsKICAgIGxhYnMoeCA9ICdMb+G6oWknLCB5ID0gJ1Phu5EgbMaw4bujbmcnKSArCiAgICBsYWJzKHRpdGxlID0gJ0jDrG5oIDE6IEJp4buDdSDEkeG7kyB0aOG7gyBoaeG7h24gdHJ1bmcgYsOsbmggZ2nDoSBraW0gY8awxqFuZyB0aGVvIMSR4buZIHRpbmgga2hp4bq/dCcpCmBgYAoKIyBDQVJBVCAtIFRy4buNbmcgbMaw4bujbmcgY+G7p2Ega2ltIGPGsMahbmc6Ci0gVHLhu41uZyBsxrDhu6NuZyBjYXJhdCBj4bunYSB2acOqbiBraW0gY8awxqFuZyDEkcaw4bujYyB4w6FjIMSR4buLbmggYuG6sW5nIGPDoWNoIGPDom4gdmnDqm4ga2ltIGPGsMahbmcgdHLDqm4gbeG7mXQgY2hp4bq/YyBjw6JuIMSRaeG7h24gdOG7rSBjaMOtbmggeMOhYy4gTeG7mXQgY2FyYXQgYuG6sW5nIDEvNSBnYW0sIHbDrCB24bqteSBt4buZdCBnYW0gc+G6vSBi4bqxbmcgbsSDbSBjYXJhdC4gCgotIFPhu5EgY2FyYXQgdGjGsOG7nW5nIMSRxrDhu6NjIGdp4buvIGhhaSBz4buRIHRo4bqtcCBwaMOibiBjdeG7kWkgY8O5bmcsIHbDrSBk4bulIG5oxrAgMS41MyAsIDEuMDAgLCAyLjkzIGNhcmF0LiBWw6wgduG6rXksIG3hu5l0IHZpw6puIGtpbSBjxrDGoW5nIG3hu5l0IG7hu61hIGNhcmF0IHPhur0gxJHGsOG7o2MgYmnhu4N1IHRo4buLIGLhurFuZyAwLDUwIGNhcmF0LCBt4buZdCB2acOqbiBraW0gY8awxqFuZyBt4buZdCBjYXJhdCBz4bq9IMSRxrDhu6NjIGJp4buDdSB0aOG7iyBi4bqxbmcgMSwwMC4KCi0gVHLhu41uZyBsxrDhu6NuZyBjaMOtbmggeMOhYyBsw6AgcuG6pXQgcXVhbiB0cuG7jW5nIHbDrCB2aeG7h2MgxJHhu4tuaCBnacOhIGThu7FhIHRyw6puIHRy4buNbmcgbMaw4bujbmcgbsOgeSB2w6AgY8OzIHPhu7Ega2jDoWMgYmnhu4d0IMSRw6FuZyBr4buDIHbhu4EgZ2nDoSBj4bqjIMSRw7RpIGtoaSBjaOG7iSBoxqFuIG3hu5l0IHBo4bqnbiB0csSDbSBjYXJhdC4gTeG7mXQgdmnDqm4ga2ltIGPGsMahbmcgbuG6t25nIDAsOTkgY2FyYXQgY8OzIGdpw6EgdGjhuqVwIGjGoW4gbeG7mXQgdmnDqm4ga2ltIGPGsMahbmcgbuG6t25nIDEsMDAgY2FyYXQuIFR1eSBuaGnDqm4gbuG6v3UgbmjDrG4gYuG6sW5nIG3huq90IHRoxrDhu51uZyBi4bqhbiBz4bq9IGtow7RuZyBwaMOibiBiaeG7h3QgxJHGsOG7o2Mgc+G7sSBraMOhYyBiaeG7h3QgbsOgeS4KCmBgYHtyIGVjaG89VFJVRSwgd2FybmluZz1GQUxTRX0KaCAlPiUgZ3JvdXBfYnkoY2FyYXQpICU+JSBmaWx0ZXIoY2FyYXQgPj0gMC4yMyAmIGNhcmF0IDw9IDIuMDUpICU+JSBzdW1tYXJpc2UobiA9IG4oKSkgJT4lCiAgZ2dwbG90KGFlcyhjYXJhdCxuKSkgKwogICAgZ2VvbV9jb2woZmlsbD0nYmx1ZScpICsKICAgIHhsYWIoJ0NhcmF0JykgKwogICAgeWxhYignU+G7kSBsxrDhu6NuZycpICsKICAgIGxhYnModGl0bGUgPSAnSMOsbmggMTogVHLhu41uZyBsxrDhu6NuZyBj4bunYSBraW0gY8awxqFuZycpCmBgYAoKUXVhIGjDrG5oIHRyw6puIHRhIHRo4bqleSDEkcaw4bujYzoKLSBUYSB0aOG6pXkgdHLhu41uZyBsxrDhu6NuZyBj4bunYSBraW0gY8awxqFuZyBwaMOibiBi4buRIGtow7RuZyDEkeG7k25nIMSR4buBdS4gxJBhIHPhu5EgdOG6rXAgdHJ1bmcg4bufIG3hu6ljIHThu6sgMCwzLTEsNiBjYXJhdAotIEPDoWMgbeG7qWMgdHLhu41uZyBsxrDhu6NuZyBjaGnhur9tIHBo4bqnbiBs4bubbiBsw6AgMCwzIDsgMCw2NSB2w6AgMSBjYXJhdAotIEPDoWMgbeG7qWMgdHLhu41uZyBsxrDhu6NuZyBjaGnhur9tIHPhu5EgbMaw4bujbmcgw610IG5o4bqldCBsw6AgdOG7qyAxLDYtIDEsOSAKCgoK