01/16(TU) Rでデータサイエンス4:貧困 [Main]
データについて
Poverty rates at national poverty lines
Poverty headcount ratio at national poverty lines (% of
population):SI.POV.NAHC [Link]
National poverty headcount ratio is the percentage of the population
living below the national poverty line(s). National estimates are based
on population-weighted subgroup estimates from household surveys. For
economies for which the data are from EU-SILC, the reported year is the
income reference year, which is the year before the survey year.
全国貧困人口比率は、全国貧困線以下で生活している人口の割合です。国の推定値は、世帯調査からの人口加重サブグループ推定値に基づいています。データが
EU-SILC
からのものである経済の場合、報告される年は所得基準年、つまり調査年の前年です。
Poverty and Inequality―Poverty rates at international poverty
lines
Poverty headcount ratio at $2.15 a day (2017 PPP) (% of
population):SI.POV.DDAY [Link]
Poverty headcount ratio at $2.15 a day is the percentage of the
population living on less than $2.15 a day at 2017 purchasing power
adjusted prices. As a result of revisions in PPP exchange rates, poverty
rates for individual countries cannot be compared with poverty rates
reported in earlier editions.
1日2.15ドルの貧困人口比率は、2017年の購買力調整後価格で1日2.15ドル未満で生活している人口の割合です。PPP
為替レートの改定により、各国の貧困率を以前の版で報告された貧困率と比較することができなくなりました。
Poverty headcount ratio at $3.65 a day (2017 PPP) (% of
population):SI.POV.LMIC [Link]
Poverty headcount ratio at $3.65 a day is the percentage of the
population living on less than $3.65 a day at 2017 international
prices.
1 日 3.65 ドルの貧困人口比率は、2017 年の国際価格で 1 日 3.65
ドル未満で生活している人口の割合です。
Poverty headcount ratio at $6.85 a day (2017 PPP) (% of
population):SI.POV.UMIC [Link]
Poverty headcount ratio at $6.85 a day is the percentage of the
population living on less than $6.85 a day at 2017 international
prices.
1日6.85ドルの貧困人口比率は、2017年の国際価格で1日6.85ドル未満で生活している人口の割合です。
貧困者率
生活するための基本的ニーズを賄うために必要とそれぞれの国が考える基準を満たしていない人口の割合
$2.15/日 ($65.4/月, 785/年), $3.65($111.0/月, $1,332/年),
$6.85($208.4/月, $2,500/年)
Poverty headcount ratio at $2.15 a day (2017 PPP) (% of
population):SI.POV.DDAY [Link]
Poverty headcount ratio at $3.65 a day (2017 PPP) (% of
population):SI.POV.LMIC [Link]
Poverty headcount ratio at $6.85 a day (2017 PPP) (% of
population):SI.POV.UMIC [Link]
準備
library(tidyverse)
library(WDI)
データの読み込み(importing)
追加情報(地域・所得レベル)を読み込みたいので、extra=TRUE
としてあります。
最初の1回目は、かならず実行してください。
df_poverty_rate <- WDI(
indicator = c(ratio = "SI.POV.NAHC",
under_2.15 = "SI.POV.DDAY",
under_3.65 = "SI.POV.LMIC",
under_6.85 = "SI.POV.UMIC"),
extra = TRUE)
保存と読み込み
2回目からは、data
から読み込めるようにしておきます。
最初の1回目は、かならず実行してください。
write_csv(df_poverty_rate, "data/poverty_rate.csv")
df_poverty_rate <- read_csv("data/poverty_rate.csv")
Rows: 16758 Columns: 16── Column specification ──────────────────────────────────────────────────────────────────
Delimiter: ","
chr (7): country, iso2c, iso3c, region, capital, income, lending
dbl (7): year, ratio, under_2.15, under_3.65, under_6.85, longitude, latitude
lgl (1): status
date (1): lastupdated
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
データを見てみよう (viewing)
df_poverty_rate
または、head(df_poverty_rate)
と、str(df_poverty_rate)
df_poverty_rate
str(df_poverty_rate)
spc_tbl_ [16,758 × 16] (S3: spec_tbl_df/tbl_df/tbl/data.frame)
$ country : chr [1:16758] "Afghanistan" "Afghanistan" "Afghanistan" "Afghanistan" ...
$ iso2c : chr [1:16758] "AF" "AF" "AF" "AF" ...
$ iso3c : chr [1:16758] "AFG" "AFG" "AFG" "AFG" ...
$ year : num [1:16758] 2014 1971 2006 2013 1995 ...
$ status : logi [1:16758] NA NA NA NA NA NA ...
$ lastupdated: Date[1:16758], format: "2023-12-18" "2023-12-18" ...
$ ratio : num [1:16758] NA NA NA NA NA NA NA NA NA NA ...
$ under_2.15 : num [1:16758] NA NA NA NA NA NA NA NA NA NA ...
$ under_3.65 : num [1:16758] NA NA NA NA NA NA NA NA NA NA ...
$ under_6.85 : num [1:16758] NA NA NA NA NA NA NA NA NA NA ...
$ region : chr [1:16758] "South Asia" "South Asia" "South Asia" "South Asia" ...
$ capital : chr [1:16758] "Kabul" "Kabul" "Kabul" "Kabul" ...
$ longitude : num [1:16758] 69.2 69.2 69.2 69.2 69.2 ...
$ latitude : num [1:16758] 34.5 34.5 34.5 34.5 34.5 ...
$ income : chr [1:16758] "Low income" "Low income" "Low income" "Low income" ...
$ lending : chr [1:16758] "IDA" "IDA" "IDA" "IDA" ...
- attr(*, "spec")=
.. cols(
.. country = col_character(),
.. iso2c = col_character(),
.. iso3c = col_character(),
.. year = col_double(),
.. status = col_logical(),
.. lastupdated = col_date(format = ""),
.. ratio = col_double(),
.. under_2.15 = col_double(),
.. under_3.65 = col_double(),
.. under_6.85 = col_double(),
.. region = col_character(),
.. capital = col_character(),
.. longitude = col_double(),
.. latitude = col_double(),
.. income = col_character(),
.. lending = col_character()
.. )
- attr(*, "problems")=<externalptr>
変数の選択(selecting)
利用しない変数もあるので select
を使って変数を減らします。見やすいように、under_2.15
が NA
のものは、削除してあります。
df_poverty_rate_selected <- df_poverty_rate |> drop_na(under_2.15) |>
select(country, year, ratio, under_2.15, under_3.65, under_6.85, region)
df_poverty_rate_selected
練習 最後に少し加えると日本について見ることができます。どうしますか。
df_poverty_rate_selected |> filter(country == "Japan")
変形(Wide to Long Data)
四つの指標を同時にいくつか選択し比較したいので、一つの列(変数)にならべた、縦長データ(long
data)も作成しておきます。
pivot_longer(ratio:under_6.85, names_to = "level", values_to = "value")
ここでは、ratio
から under_6.85
を、level
という名前の列にならべ、値を value
という列に並べるようにしてあります。
確認するときは、value が NA のものは除き、country と、iso2c と、level
と value の部分だけ取り出して確認しています。
df_poverty_rate_long <- df_poverty_rate_selected |>
pivot_longer(ratio:under_6.85, names_to = "level", values_to = "value")
df_poverty_rate_long |> drop_na(value) |> select(country, level, value, region)
年毎のデータの数の確認(number of data in each year)
df_poverty_rate_long |> drop_na(value) |>
group_by(year, level) |> summarize(n = n()) |> arrange(desc(year))
`summarise()` has grouped output by 'year'. You can override using the `.groups` argument.
考察:それぞれの国での貧困率のデータ(ratio)が
多い場合も、絶対的な貧困率が多い場合もあるようだが、指標ごとに集計してみる。
df_poverty_rate_long |> filter(year %in% c(1960, 1970, 1980, 1990, 2000, 2010, 2020)) |> drop_na(value) |> group_by(year, level) |> summarize(n = n()) |>
ggplot(aes(as.character(year), n, fill = level)) + geom_col(position = "dodge", col = "black", linewidht = 0.1) + labs(x = "year", y = "number of data")
`summarise()` has grouped output by 'year'. You can override using the `.groups` argument.Warning: Ignoring unknown parameters: `linewidht`
考察:それぞれの国での貧困率のデータ(ratio)は、2000年以降、under_2.15,
under_3.65, under_6.85
は、同じ数ずつあるので、同時にデータを集めていると思われる。
世界とサハラ砂漠以南のアフリカのデータの経年変化
df_poverty_rate_long |>
filter(country %in% c("World", "Sub-Saharan Africa")) |> drop_na() |>
ggplot(aes(year, value, col = level, linetype = country)) + geom_line()
考察:Sub-Saharan Africa
のデータはないようです。たしかに、ratio
は、国ごとに決めるものですから、地域の場合には、ratio
の値はないのでしょう。
df_poverty_rate_long |> filter(year %in% c(2000, 2010, 2020)) |> drop_na(value) |>
filter(region == "Aggregates") |> filter(level %in% c("ratio", "under_2.15")) |> group_by(country, year, level) |> summarize(n = n())
`summarise()` has grouped output by 'country', 'year'. You can override using the `.groups` argument.
Sub Saharan Africa
はデータはありませんが、統計的に処理して(平均のようなものを取って)表示することは可能です。
loess (Local Polynomial Regression)
は、少しずつ区切って、多項式近似を使っているいます。そこで、マイナスの値も出てきてしまっています。しかし、大体の傾向をみることはできます。上で見たデータの数から、1992年以降にしておくのが良いでしょう。
df_poverty_rate_long |> drop_na(value) |> filter(!is.na(region), region != "Aggregates") |>
filter(level == "under_2.15") |>
ggplot(aes(year, value, col = region)) + geom_smooth(formula = 'y ~ x', se = FALSE)
df_poverty_rate_long |> drop_na(value) |>
filter(!is.na(region), region != "Aggregates", year > 1991) |>
filter(level == "under_2.15") |>
ggplot(aes(year, value, col = region)) + geom_smooth(formula = 'y ~ x', method = 'loess', se = FALSE) + labs(title = "Regionally aggregated ratio under 2.15 USD")
df_poverty_rate_long |> drop_na(value) |>
filter(!is.na(region), region != "Aggregates", year > 1991) |>
filter(level != "ratio") |>
ggplot(aes(year, value, col = region, linetype = level)) + geom_smooth(formula = 'y ~ x', method = 'loess', se = FALSE) + labs(title = "Regionally aggregated ratio")
df_poverty_rate_long |> drop_na(value) |>
filter(!is.na(region), region == "Sub-Saharan Africa", year > 1991) |>
ggplot(aes(year, value, col = level)) + geom_smooth(formula = 'y ~ x', method = 'loess', se = TRUE) + labs(title = "Sub-Saharan region aggregated ratio")
サハラ砂漠以南(Sub-Saharan Africa) の国のデータ
df_poverty_rate_long |> drop_na(value) |>
filter(region == "Sub-Saharan Africa") |> group_by(country, level) |>
summarize(n = n())
`summarise()` has grouped output by 'country'. You can override using the `.groups` argument.
課題
データは、上で使った二つのデータを使います。
練習:データの確認
df_poverty_rate_selected
と、df_poverty_rate_long
を見てみましょう。どうしますか。
Hint:そのままデータ、head(データ)、Environment
から、データを選択
df_poverty_rate_selected
df_poverty_rate_long
- 南アメリカで、ジニ指数が大きいのは、以下の4つの国です。Suriname,
Belize, Brazil, Colombia。それを、CHOSEN_GINI_COUNTRIES
に代入してください。
Hint:「SOUTH_AFRICA_FIVE に、South Africa, Namibia,
Eswatini, Botswana, Lesotho を設定」を参照
CHOSEN_GINI_COUNTRIES <- c("Suriname", "Belize", "Brazil", "Colombia")
df_poverty_rate_selected
の南アメリカ4カ国の最新のデータだけを表示してみましょう。
Hint:SOUTH_AFRICA_FIVE
の場合どのようにしたか考えてみましょう。
df_poverty_rate_selected |>
filter(country %in% CHOSEN_GINI_COUNTRIES) |>
drop_na(under_2.15) |> group_by(country) |> filter(year == max(year)) |>
select(country, year, ratio:under_6.85)
気づいたこと
- 一番新しいものをとっているはずなのに、特に、Suriname と、Belize
はとても古い。ということは、あまりデータがない。しかし、貧困度は高い。
南アメリカ4カ国についての分析
- 4カ国、それぞれの、貧困率の年次変化を折れ線グラフにより表示
下は、ブラジルについてのものですが、他の3カ国で、データがあるものについては、同様のグラフを描いてください。
df_poverty_rate_long |> filter(country == "Brazil") |> drop_na(value) |>
ggplot(aes(year, value, col = level)) + geom_line() +
labs(title = "Poverty Ratio of Brasil")
df_poverty_rate_long |> filter(country == "Colombia") |> drop_na(value) |>
ggplot(aes(year, value, col = level)) + geom_line() +
labs(title = "Poverty Ratio of Colombia")
気づいたこと
df_poverty_rate_long |> filter(country == "Belize") |> drop_na(value) |>
ggplot(aes(year, value, col = level)) + geom_line() +
labs(title = "Poverty Ratio of Belize")
df_poverty_rate_long |> filter(country == "Suriname") |> drop_na(value) |>
ggplot(aes(year, value, col = level)) + geom_line() +
labs(title = "Poverty Ratio of Suriname")
南アメリカ4カ国の貧困度ごとの人口比の棒グラフ
- 貧困度ごとの人口比の棒グラフを描いてみましょう。
Hint: 南アフリカ5カ国の貧困度ごとの人口比の棒グラフ
df_poverty_rate_long |>
filter(country %in% CHOSEN_GINI_COUNTRIES) |>
drop_na(value) |> group_by(country) |> filter(year == max(year)) |>
ggplot(aes(country, value, fill = level)) + geom_col(position = "dodge", col = "black", linewidth = 0.1)
気づいたこと
練習:貧困度ごとの人口比
課題にある 1 から 5.
提出はしなくて良いですが、ぜひ実際に手を動かして実行してください。
LS0tCnRpdGxlOiAi6LKn5Zuw546HIC0gUG92ZXJ0eSBSYXRlOiBQb3NpdENsb3VkIOOBp+abuOOBjei+vOOCk+OBoOOCguOBriIKYXV0aG9yOiAiSC4gU3V6dWtpIgpkYXRlOiAiMjAyNOW5tDHmnIgxNuaXpSIKb3V0cHV0OgogIGh0bWxfbm90ZWJvb2s6IGRlZmF1bHQKLS0tCgotICAg77yI5Yil44Gu44K/44OW44G+44Gf44GvIOOCpuOCo+ODs+ODieOCpuOBp++8iVBvc2l0Q2xvdWQg44Gr44Ot44Kw44Kk44Oz77yI44Ki44Kr44Km44Oz44OI44Gu44Gq44GE5Lq644Gv44K144Kk44Oz44O744Ki44OD44OX77yJW1tQb3NpdC5jbG91ZF0oaHR0cHM6Ly9wb3NpdC5jbG91ZC8pXeODu1tb5YWx5pyJ44OX44Ot44K444Kn44Kv44OIXShodHRwczovL3Bvc2l0LmNsb3VkL2NvbnRlbnQvNTUzOTc2MyldCgojIyDorJvnvqkgMeaciDEx5pel77yI5pyo77yJ5Y2X6YOo44Ki44OV44Oq44Kr6Ku45Zu944Gu54q25rOBCgotICAgSU5FUVVBTElUWSBJTiBTT1VUSEVSTiBBRlJJQ0E6C0FOIEFTU0VTU01FTlQgT0YgVEhFIFNPVVRIRVJOIEFGUklDQU4LQ1VTVE9NUyBVTklPTiBbW1JlcG9ydF0oaHR0cHM6Ly9kb2N1bWVudHMxLndvcmxkYmFuay5vcmcvY3VyYXRlZC9lbi8wOTkxMjUzMDMwNzIyMzY5MDMvcGRmL1AxNjQ5MjcwYzAyYTFmMDZiMGEzYWUwMmU1N2VhZGQ3YTgyLnBkZildIFtbTGlua10oaHR0cHM6Ly9vcGVua25vd2xlZGdlLndvcmxkYmFuay5vcmcvZW50aXRpZXMvcHVibGljYXRpb24vOWY4ZTQwNzMtMjVmOS01NjJjLThlM2ItNTQxYzk5ZGQ0MmNiKV0KCi0gICDljZfjgqLjg5Xjg6rjgqvvvIhTb3V0aCBBZnJpY2HvvInjgIHjg6zjgr3jg4jvvIhMZXRob3Rv77yJ44CB44Ko44K544Ov44OG44Kj44OL77yIRXN3YXRpbmnvvInjgIHjg4rjg5/jg5PjgqLvvIhOYW1pdmlh77yJ44CB44Oc44OE44Ov44OK77yIQm90c3dhbmHvvIkKCiAgICAtICAg5Y+X6Kyb5oSf5oOz44Gr44GL44GI44Gm77ya44K444OL5oyH5pWw44Go5omA5b6X5YiG5biDIC0g57aa57eoIFtbUiBOb3RlYm9va10oaHR0cHM6Ly9kcy1zbC5naXRodWIuaW8vaW50cm8yci9nZXMwMDEvZ2luaV91cGRhdGVkLm5iLmh0bWwpXSwgW1tSbWRdKGh0dHBzOi8vZ2l0aHViLmNvbS9kcy1zbC9pbnRybzJyL2Jsb2IvbWFpbi9kb2NzL2dlczAwMS9naW5pX3VwZGF0ZWQuUm1kKV0KCiMjIOa8lOe/kiAx5pyIMTbml6XvvIjngavvvIkKCiMjIDAxLzE2KFRVKeOAgFLjgafjg4fjg7zjgr/jgrXjgqTjgqjjg7Pjgrk0Ouiyp+WbsCBbW01haW5dKGh0dHBzOi8vZHMtc2wuZ2l0aHViLmlvL2ludHJvMnIvZ2VzMDAxL2dlczAwMS1tYWluLm5iLmh0bWwpXQoKIyMjIOODh+ODvOOCv+OBq+OBpOOBhOOBpgoKKipQb3ZlcnR5IHJhdGVzIGF0IG5hdGlvbmFsIHBvdmVydHkgbGluZXMqKgoKUG92ZXJ0eSBoZWFkY291bnQgcmF0aW8gYXQgbmF0aW9uYWwgcG92ZXJ0eSBsaW5lcyAoJSBvZiBwb3B1bGF0aW9uKe+8mlNJLlBPVi5OQUhDIFtbTGlua10oaHR0cHM6Ly9kYXRhLndvcmxkYmFuay5vcmcvaW5kaWNhdG9yL1NJLlBPVi5OQUhDKV0KCk5hdGlvbmFsIHBvdmVydHkgaGVhZGNvdW50IHJhdGlvIGlzIHRoZSBwZXJjZW50YWdlIG9mIHRoZSBwb3B1bGF0aW9uIGxpdmluZyBiZWxvdyB0aGUgbmF0aW9uYWwgcG92ZXJ0eSBsaW5lKHMpLiBOYXRpb25hbCBlc3RpbWF0ZXMgYXJlIGJhc2VkIG9uIHBvcHVsYXRpb24td2VpZ2h0ZWQgc3ViZ3JvdXAgZXN0aW1hdGVzIGZyb20gaG91c2Vob2xkIHN1cnZleXMuIEZvciBlY29ub21pZXMgZm9yIHdoaWNoIHRoZSBkYXRhIGFyZSBmcm9tIEVVLVNJTEMsIHRoZSByZXBvcnRlZCB5ZWFyIGlzIHRoZSBpbmNvbWUgcmVmZXJlbmNlIHllYXIsIHdoaWNoIGlzIHRoZSB5ZWFyIGJlZm9yZSB0aGUgc3VydmV5IHllYXIuCgrlhajlm73osqflm7Dkurrlj6Pmr5Tnjofjga/jgIHlhajlm73osqflm7Dnt5rku6XkuIvjgafnlJ/mtLvjgZfjgabjgYTjgovkurrlj6Pjga7libLlkIjjgafjgZnjgILlm73jga7mjqjlrprlgKTjga/jgIHkuJbluK/oqr/mn7vjgYvjgonjga7kurrlj6PliqDph43jgrXjg5bjgrDjg6vjg7zjg5fmjqjlrprlgKTjgavln7rjgaXjgYTjgabjgYTjgb7jgZnjgILjg4fjg7zjgr/jgYwgRVUtU0lMQyDjgYvjgonjga7jgoLjga7jgafjgYLjgovntYzmuIjjga7loLTlkIjjgIHloLHlkYrjgZXjgozjgovlubTjga/miYDlvpfln7rmupblubTjgIHjgaTjgb7jgoroqr/mn7vlubTjga7liY3lubTjgafjgZnjgIIKCioqUG92ZXJ0eSBhbmQgSW5lcXVhbGl0eeKAlVBvdmVydHkgcmF0ZXMgYXQgaW50ZXJuYXRpb25hbCBwb3ZlcnR5IGxpbmVzKioKClBvdmVydHkgaGVhZGNvdW50IHJhdGlvIGF0IFwkMi4xNSBhIGRheSAoMjAxNyBQUFApICglIG9mIHBvcHVsYXRpb24p77yaU0kuUE9WLkREQVkgW1tMaW5rXShodHRwczovL2RhdGEud29ybGRiYW5rLm9yZy9pbmRpY2F0b3IvU0kuUE9WLkREQVkpXQoKUG92ZXJ0eSBoZWFkY291bnQgcmF0aW8gYXQgXCQyLjE1IGEgZGF5IGlzIHRoZSBwZXJjZW50YWdlIG9mIHRoZSBwb3B1bGF0aW9uIGxpdmluZyBvbiBsZXNzIHRoYW4gXCQyLjE1IGEgZGF5IGF0IDIwMTcgcHVyY2hhc2luZyBwb3dlciBhZGp1c3RlZCBwcmljZXMuIEFzIGEgcmVzdWx0IG9mIHJldmlzaW9ucyBpbiBQUFAgZXhjaGFuZ2UgcmF0ZXMsIHBvdmVydHkgcmF0ZXMgZm9yIGluZGl2aWR1YWwgY291bnRyaWVzIGNhbm5vdCBiZSBjb21wYXJlZCB3aXRoIHBvdmVydHkgcmF0ZXMgcmVwb3J0ZWQgaW4gZWFybGllciBlZGl0aW9ucy4KCjHml6UyLjE144OJ44Or44Gu6LKn5Zuw5Lq65Y+j5q+U546H44Gv44CBMjAxN+W5tOOBruizvOiyt+WKm+iqv+aVtOW+jOS+oeagvOOBpzHml6UyLjE144OJ44Or5pyq5rqA44Gn55Sf5rS744GX44Gm44GE44KL5Lq65Y+j44Gu5Ymy5ZCI44Gn44GZ44CCUFBQIOeCuuabv+ODrOODvOODiOOBruaUueWumuOBq+OCiOOCiuOAgeWQhOWbveOBruiyp+WbsOeOh+OCkuS7peWJjeOBrueJiOOBp+WgseWRiuOBleOCjOOBn+iyp+WbsOeOh+OBqOavlOi8g+OBmeOCi+OBk+OBqOOBjOOBp+OBjeOBquOBj+OBquOCiuOBvuOBl+OBn+OAggoKUG92ZXJ0eSBoZWFkY291bnQgcmF0aW8gYXQgXCQzLjY1IGEgZGF5ICgyMDE3IFBQUCkgKCUgb2YgcG9wdWxhdGlvbinvvJpTSS5QT1YuTE1JQyBbW0xpbmtdKGh0dHBzOi8vZGF0YS53b3JsZGJhbmsub3JnL2luZGljYXRvci9TSS5QT1YuTE1JQyldCgpQb3ZlcnR5IGhlYWRjb3VudCByYXRpbyBhdCBcJDMuNjUgYSBkYXkgaXMgdGhlIHBlcmNlbnRhZ2Ugb2YgdGhlIHBvcHVsYXRpb24gbGl2aW5nIG9uIGxlc3MgdGhhbiBcJDMuNjUgYSBkYXkgYXQgMjAxNyBpbnRlcm5hdGlvbmFsIHByaWNlcy4KCjEg5pelIDMuNjUg44OJ44Or44Gu6LKn5Zuw5Lq65Y+j5q+U546H44Gv44CBMjAxNyDlubTjga7lm73pmpvkvqHmoLzjgacgMSDml6UgMy42NSDjg4njg6vmnKrmuoDjgafnlJ/mtLvjgZfjgabjgYTjgovkurrlj6Pjga7libLlkIjjgafjgZnjgIIKClBvdmVydHkgaGVhZGNvdW50IHJhdGlvIGF0IFwkNi44NSBhIGRheSAoMjAxNyBQUFApICglIG9mIHBvcHVsYXRpb24p77yaU0kuUE9WLlVNSUMgW1tMaW5rXShodHRwczovL2RhdGEud29ybGRiYW5rLm9yZy9pbmRpY2F0b3IvU0kuUE9WLlVNSUMpXQoKUG92ZXJ0eSBoZWFkY291bnQgcmF0aW8gYXQgXCQ2Ljg1IGEgZGF5IGlzIHRoZSBwZXJjZW50YWdlIG9mIHRoZSBwb3B1bGF0aW9uIGxpdmluZyBvbiBsZXNzIHRoYW4gXCQ2Ljg1IGEgZGF5IGF0IDIwMTcgaW50ZXJuYXRpb25hbCBwcmljZXMuCgox5pelNi44NeODieODq+OBruiyp+WbsOS6uuWPo+avlOeOh+OBr+OAgTIwMTflubTjga7lm73pmpvkvqHmoLzjgacx5pelNi44NeODieODq+acqua6gOOBp+eUn+a0u+OBl+OBpuOBhOOCi+S6uuWPo+OBruWJsuWQiOOBp+OBmeOAggoKIyMg5b6p57+SCgrosqflm7Djga/jgIHjganjga7jgojjgYbjgarlsLrluqbjgafmuKzjgovjga7jgaDjgo3jgYbjgYvjgIIKCjEuICDkuIDkurrlvZPjgZ/jgorjga7os7zosrflipvlubPkvqHvvIhQdXJjaGFzaW5nIFBvd2VyIFBhcml0aWVz77yJ44Gr44KI44KL5Zu95YaF57eP55Sf55Sj77yIR3Jvc3MgRG9tZXN0aWMgUHJvZHVjdO+8iQoKICAgIC0gICBHRFAgcGVyIGNhcGl0YSwgUFBQIChjb25zdGFudCAyMDE3IGludGVybmF0aW9uYWwgXCQpOiBOWS5HRFAuUENBUC5QUC5LRCBbW0xpbmtdKGh0dHBzOi8vZGF0YS53b3JsZGJhbmsub3JnL2luZGljYXRvci9OWS5HRFAuUENBUC5QUC5LRCldCgogICAgLSAgIDEyLzEzIOalteW6puOBq+iyp+OBl+OBhO+8ge+8nyBbW1IgTm90ZWJvb2tdKGh0dHBzOi8vZHMtc2wuZ2l0aHViLmlvL2ludHJvMnIvZ2VzMDAxL3BvdmVydHkubmIuaHRtbCldLCBbW1JtZF0oaHR0cHM6Ly9naXRodWIuY29tL2RzLXNsL2ludHJvMnIvYmxvYi9tYWluL2RvY3MvZ2VzMDAxL3BvdmVydHkuUm1kKV0KCiAgICAtICAg5Zu944GU44Go44Gu5omA5b6X44Gu5bmz5Z2H44Gu44KI44GG44Gq44KC44Gu44Gv44KP44GL44KL44GM44CB5qW15bqm44Gu6LKn5Zuw44Gu5Lq644GM44Gp44Gu56iL5bqm44GE44KL44Gu44GL44Gv44KP44GL44KJ44Gq44GE44CCCgoyLiAg5Lq65Y+j5YuV5oWL77yIZGVtb2dyYXBoee+8iQoKICAgIC0gICDkurrlj6Pjga7jg4fjg7zjgr/vvIjnt4/kurrlj6PjgIHlh7rnlJ/njofjgIHmrbvkuqHnjofjgIHoi6XlubTogIXmibbppIrnjofjgIHpq5jpvaLogIXmibbppIrnjofvvIkKCiAgICAtICAgMTIvMjAg5Lq65Y+j5YuV5oWL77yIZGVtb2dyYXBoee+8iVtbUiBOb3RlYm9va10oaHR0cHM6Ly9kcy1zbC5naXRodWIuaW8vaW50cm8yci9nZXMwMDEvZGVtb2dyYXBoeS5uYi5odG1sKV0sIFtbUm1kXShodHRwczovL2dpdGh1Yi5jb20vZHMtc2wvaW50cm8yci9ibG9iL21haW4vZG9jcy9nZXMwMDEvZGVtb2dyYXBoeS5SbWQpXQoKICAgIC0gICDkurrlj6Pjg4fjg7zjgr/jga/ln7rmnKznmoTjgafjgIHlm73jga7lgKTjgYvjgonlgIvkurrjga7lgKTjgpLmsYLjgoHjgZ/jgorjgIHku5bjga7lm73jgajmr5TovIPjgZfjgoTjgZnjgYTlibLlkIjjgYvjgonlrp/pmpvjga7mlbDjgpLmsYLjgoHjgovjgarjganjgavlv4XpoIgKCjMuICDjgrjjg4vmjIfmlbDjgYrjgojjgbPmiYDlvpfliIbluIMKCiAgICAtICAg44K444OL5oyH5pWw77yIR2luae+8iSwg5omA5b6X44Gu5LiL5L2NMTAlLCAyMCUsIDIwJS00MCUsIDQwJS02MCUsIDYwJS04MCUsIDgwJeS7peS4iiwgOTAl5Lul5LiKCgogICAgLSAgIDEvOSDjgrjjg4vjgaPjgabkvZXvvIHvvJ8gW1tSIE5vdGVib29rXShodHRwczovL2RzLXNsLmdpdGh1Yi5pby9pbnRybzJyL2dlczAwMS93aGF0X2lzX2dpbmkubmIuaHRtbCldLCBbW1JtZF0oaHR0cHM6Ly9naXRodWIuY29tL2RzLXNsL2ludHJvMnIvYmxvYi9tYWluL2RvY3MvZ2VzMDAxL3doYXRfaXNfZ2luaS5SbWQpXQoKICAgIC0gICAxLzkg44K444OL5oyH5pWw44Go5omA5b6X5YiG5biDIFtbUiBOb3RlYm9va10oaHR0cHM6Ly9kcy1zbC5naXRodWIuaW8vaW50cm8yci9nZXMwMDEvZ2luaS5uYi5odG1sKV0sIFtbUm1kXShodHRwczovL2dpdGh1Yi5jb20vZHMtc2wvaW50cm8yci9ibG9iL21haW4vZG9jcy9nZXMwMDEvZ2luaS5SbWQpXeOAgO+8iOWPguiAgzEv5Y+C6ICDMuS7mCBbW1IgTm90ZWJvb2tdKGh0dHBzOi8vZHMtc2wuZ2l0aHViLmlvL2ludHJvMnIvZ2VzMDAxL2dpbmlfbG9uZy5uYi5odG1sKV3vvIkKCiAgICAtICAg5Zu944Gu5Lit44Gn44Gu5omA5b6X5YiG5biD44KS6KaL44CB44GL44Gk5omA5b6X5YiG6YWN44Gu5YWs5bmz44GV44KS5LiA44Gk44Gu5oyH5qiZ77yI44K444OL5oyH5pWw77yJ44Gn6KGo44GZ44GT44Go44Gr44KI44KK44CB5q+U6LyD44KC5Y+v6IO944Gr44Gq44Gj44Gf44GM44CB5qW15bqm44Gr6LKn5Zuw44Gq44Gy44Go44GM44Gp44Gu44GQ44KJ44GE44GE44KL44Gu44GL44Gv44KP44GL44KJ44Gq44GE44CCCgojIyDosqflm7DogIXnjocKCi0gICDnlJ/mtLvjgZnjgovjgZ/jgoHjga7ln7rmnKznmoTjg4vjg7zjgrrjgpLos4TjgYbjgZ/jgoHjgavlv4XopoHjgajjgZ3jgozjgZ7jgozjga7lm73jgYzogIPjgYjjgovln7rmupbjgpLmuoDjgZ/jgZfjgabjgYTjgarjgYTkurrlj6Pjga7libLlkIgKCiAgICAtICAgUG92ZXJ0eSBoZWFkY291bnQgcmF0aW8gYXQgbmF0aW9uYWwgcG92ZXJ0eSBsaW5lcyAoJSBvZiBwb3B1bGF0aW9uKe+8mlNJLlBPVi5OQUhDIFtbTGlua10oaHR0cHM6Ly9kYXRhLndvcmxkYmFuay5vcmcvaW5kaWNhdG9yL1NJLlBPVi5OQUhDKV0KCiAgICAtICAg5pel5pys44Gv77yfIFtbV2lraXBlZGlhXShodHRwczovL2phLndpa2lwZWRpYS5vcmcvd2lraS8lRTYlOTclQTUlRTYlOUMlQUMlRTMlODElQUUlRTglQjIlQTclRTUlOUIlQjApXQoKLSAgIFwkMi4xNS/ml6UgKFwkNjUuNC/mnIgsIDc4NS/lubQpLCBcJDMuNjXvvIhcJDExMS4wL+aciCwgXCQxLDMzMi/lubTvvIksIFwkNi44Ne+8iFwkMjA4LjQv5pyILCBcJDIsNTAwL+W5tO+8iQoKICAgIC0gICBQb3ZlcnR5IGhlYWRjb3VudCByYXRpbyBhdCBcJDIuMTUgYSBkYXkgKDIwMTcgUFBQKSAoJSBvZiBwb3B1bGF0aW9uKe+8mlNJLlBPVi5EREFZIFtbTGlua10oaHR0cHM6Ly9kYXRhLndvcmxkYmFuay5vcmcvaW5kaWNhdG9yL1NJLlBPVi5EREFZKV0KCiAgICAtICAgUG92ZXJ0eSBoZWFkY291bnQgcmF0aW8gYXQgXCQzLjY1IGEgZGF5ICgyMDE3IFBQUCkgKCUgb2YgcG9wdWxhdGlvbinvvJpTSS5QT1YuTE1JQyBbW0xpbmtdKGh0dHBzOi8vZGF0YS53b3JsZGJhbmsub3JnL2luZGljYXRvci9TSS5QT1YuTE1JQyldCgogICAgLSAgIFBvdmVydHkgaGVhZGNvdW50IHJhdGlvIGF0IFwkNi44NSBhIGRheSAoMjAxNyBQUFApICglIG9mIHBvcHVsYXRpb24p77yaU0kuUE9WLlVNSUMgW1tMaW5rXShodHRwczovL2RhdGEud29ybGRiYW5rLm9yZy9pbmRpY2F0b3IvU0kuUE9WLlVNSUMpXQoKIyMjIOa6luWCmQoKYGBge3J9CmxpYnJhcnkodGlkeXZlcnNlKQpsaWJyYXJ5KFdESSkKYGBgCgojIyMg44OH44O844K/44Gu6Kqt44G/6L6844G/77yIaW1wb3J0aW5n77yJCgrov73liqDmg4XloLHvvIjlnLDln5/jg7vmiYDlvpfjg6zjg5njg6vvvInjgpLoqq3jgb/ovrzjgb/jgZ/jgYTjga7jgafjgIFleHRyYT1UUlVFIOOBqOOBl+OBpuOBguOCiuOBvuOBmeOAggoKKioq5pyA5Yid44Gu77yR5Zue55uu44Gv44CB44GL44Gq44KJ44Ga5a6f6KGM44GX44Gm44GP44Gg44GV44GE44CCKioqCgpgYGB7ciBldmFsPUZBTFNFfQpkZl9wb3ZlcnR5X3JhdGUgPC0gV0RJKAogIGluZGljYXRvciA9IGMocmF0aW8gPSAiU0kuUE9WLk5BSEMiLAogICAgICAgICAgICAgICAgdW5kZXJfMi4xNSA9ICJTSS5QT1YuRERBWSIsCiAgICAgICAgICAgICAgICB1bmRlcl8zLjY1ID0gIlNJLlBPVi5MTUlDIiwKICAgICAgICAgICAgICAgIHVuZGVyXzYuODUgPSAiU0kuUE9WLlVNSUMiKSwKICBleHRyYSA9IFRSVUUpCmBgYAoKIyMjIyDkv53lrZjjgajoqq3jgb/ovrzjgb8KCu+8kuWbnuebruOBi+OCieOBr+OAgWBkYXRhYCDjgYvjgonoqq3jgb/ovrzjgoHjgovjgojjgYbjgavjgZfjgabjgYrjgY3jgb7jgZnjgIIKCioqKuacgOWIneOBru+8keWbnuebruOBr+OAgeOBi+OBquOCieOBmuWun+ihjOOBl+OBpuOBj+OBoOOBleOBhOOAgioqKgoKYGBge3IgZXZhbD1GQUxTRX0Kd3JpdGVfY3N2KGRmX3BvdmVydHlfcmF0ZSwgImRhdGEvcG92ZXJ0eV9yYXRlLmNzdiIpCmBgYAoKYGBge3J9CmRmX3BvdmVydHlfcmF0ZSA8LSByZWFkX2NzdigiZGF0YS9wb3ZlcnR5X3JhdGUuY3N2IikKYGBgCgojIyMg44OH44O844K/44KS6KaL44Gm44G/44KI44GGICh2aWV3aW5nKQoKYGRmX3BvdmVydHlfcmF0ZWAg44G+44Gf44Gv44CBYGhlYWQoZGZfcG92ZXJ0eV9yYXRlKWAg44Go44CBYHN0cihkZl9wb3ZlcnR5X3JhdGUpYAoKYGBge3J9CmRmX3BvdmVydHlfcmF0ZQpgYGAKCmBgYHtyfQpzdHIoZGZfcG92ZXJ0eV9yYXRlKQpgYGAKCiMjIyDlpInmlbDjga7pgbjmip7vvIhzZWxlY3RpbmfvvIkKCuWIqeeUqOOBl+OBquOBhOWkieaVsOOCguOBguOCi+OBruOBpyBzZWxlY3Qg44KS5L2/44Gj44Gm5aSJ5pWw44KS5rib44KJ44GX44G+44GZ44CC6KaL44KE44GZ44GE44KI44GG44Gr44CBYHVuZGVyXzIuMTVgIOOBjCBOQSDjga7jgoLjga7jga/jgIHliYrpmaTjgZfjgabjgYLjgorjgb7jgZnjgIIKCmBgYHtyfQpkZl9wb3ZlcnR5X3JhdGVfc2VsZWN0ZWQgPC0gZGZfcG92ZXJ0eV9yYXRlIHw+IGRyb3BfbmEodW5kZXJfMi4xNSkgfD4KICBzZWxlY3QoY291bnRyeSwgeWVhciwgcmF0aW8sIHVuZGVyXzIuMTUsIHVuZGVyXzMuNjUsIHVuZGVyXzYuODUsIHJlZ2lvbikKZGZfcG92ZXJ0eV9yYXRlX3NlbGVjdGVkIApgYGAKCioq57e057+S44CA5pyA5b6M44Gr5bCR44GX5Yqg44GI44KL44Go5pel5pys44Gr44Gk44GE44Gm6KaL44KL44GT44Go44GM44Gn44GN44G+44GZ44CC44Gp44GG44GX44G+44GZ44GL44CCKioKCmBgYHtyfQpkZl9wb3ZlcnR5X3JhdGVfc2VsZWN0ZWQgfD4gZmlsdGVyKGNvdW50cnkgPT0gIkphcGFuIikKYGBgCgojIyMg5aSJ5b2i77yIV2lkZSB0byBMb25nIERhdGHvvIkKCuWbm+OBpOOBruaMh+aomeOCkuWQjOaZguOBq+OBhOOBj+OBpOOBi+mBuOaKnuOBl+avlOi8g+OBl+OBn+OBhOOBruOBp+OAgeS4gOOBpOOBruWIl++8iOWkieaVsO+8ieOBq+OBquOCieOBueOBn+OAgee4pumVt+ODh+ODvOOCv++8iGxvbmcgZGF0Ye+8ieOCguS9nOaIkOOBl+OBpuOBiuOBjeOBvuOBmeOAggoKYHBpdm90X2xvbmdlcihyYXRpbzp1bmRlcl82Ljg1LCBuYW1lc190byA9ICJsZXZlbCIsIHZhbHVlc190byA9ICJ2YWx1ZSIpYAoK44GT44GT44Gn44Gv44CBYHJhdGlvYCDjgYvjgokgYHVuZGVyXzYuODVgIOOCkuOAgWBsZXZlbGAg44Go44GE44GG5ZCN5YmN44Gu5YiX44Gr44Gq44KJ44G544CB5YCk44KSIGB2YWx1ZWAg44Go44GE44GG5YiX44Gr5Lim44G544KL44KI44GG44Gr44GX44Gm44GC44KK44G+44GZ44CCCgrnorroqo3jgZnjgovjgajjgY3jga/jgIF2YWx1ZSDjgYwgTkEg44Gu44KC44Gu44Gv6Zmk44GN44CBY291bnRyeSDjgajjgIFpc28yYyDjgajjgIFsZXZlbCDjgaggdmFsdWUg44Gu6YOo5YiG44Gg44GR5Y+W44KK5Ye644GX44Gm56K66KqN44GX44Gm44GE44G+44GZ44CCCgpgYGB7cn0KZGZfcG92ZXJ0eV9yYXRlX2xvbmcgPC0gZGZfcG92ZXJ0eV9yYXRlX3NlbGVjdGVkIHw+IAogIHBpdm90X2xvbmdlcihyYXRpbzp1bmRlcl82Ljg1LCBuYW1lc190byA9ICJsZXZlbCIsIHZhbHVlc190byA9ICJ2YWx1ZSIpCmRmX3BvdmVydHlfcmF0ZV9sb25nIHw+IGRyb3BfbmEodmFsdWUpIHw+IHNlbGVjdChjb3VudHJ5LCBsZXZlbCwgdmFsdWUsIHJlZ2lvbikKYGBgCgojIyMg5bm05q+O44Gu44OH44O844K/44Gu5pWw44Gu56K66KqN77yIbnVtYmVyIG9mIGRhdGEgaW4gZWFjaCB5ZWFy77yJCgpgYGB7cn0KZGZfcG92ZXJ0eV9yYXRlX2xvbmcgfD4gZHJvcF9uYSh2YWx1ZSkgfD4gCiAgZ3JvdXBfYnkoeWVhciwgbGV2ZWwpIHw+IHN1bW1hcml6ZShuID0gbigpKSB8PiBhcnJhbmdlKGRlc2MoeWVhcikpCmBgYAoKKirogIPlr5/vvJoqKuOBneOCjOOBnuOCjOOBruWbveOBp+OBruiyp+WbsOeOh+OBruODh+ODvOOCv++8iHJhdGlv77yJ44GMIOWkmuOBhOWgtOWQiOOCguOAgee1tuWvvueahOOBquiyp+WbsOeOh+OBjOWkmuOBhOWgtOWQiOOCguOBguOCi+OCiOOBhuOBoOOBjOOAgeaMh+aomeOBlOOBqOOBq+mbhuioiOOBl+OBpuOBv+OCi+OAggoKYGBge3J9CmRmX3BvdmVydHlfcmF0ZV9sb25nIHw+IGZpbHRlcih5ZWFyICVpbiUgYygxOTYwLCAxOTcwLCAxOTgwLCAxOTkwLCAyMDAwLCAyMDEwLCAyMDIwKSkgfD4gZHJvcF9uYSh2YWx1ZSkgfD4gZ3JvdXBfYnkoeWVhciwgbGV2ZWwpIHw+IHN1bW1hcml6ZShuID0gbigpKSB8PgogIGdncGxvdChhZXMoYXMuY2hhcmFjdGVyKHllYXIpLCBuLCBmaWxsID0gbGV2ZWwpKSArIGdlb21fY29sKHBvc2l0aW9uID0gImRvZGdlIiwgY29sID0gImJsYWNrIiwgbGluZXdpZGh0ID0gMC4xKSArIGxhYnMoeCA9ICJ5ZWFyIiwgeSA9ICJudW1iZXIgb2YgZGF0YSIpCmBgYAoKKirogIPlr5/vvJoqKuOBneOCjOOBnuOCjOOBruWbveOBp+OBruiyp+WbsOeOh+OBruODh+ODvOOCv++8iHJhdGlv77yJ44Gv44CBMjAwMOW5tOS7pemZjeOAgXVuZGVyXzIuMTUsIHVuZGVyXzMuNjUsIHVuZGVyXzYuODUg44Gv44CB5ZCM44GY5pWw44Ga44Gk44GC44KL44Gu44Gn44CB5ZCM5pmC44Gr44OH44O844K/44KS6ZuG44KB44Gm44GE44KL44Go5oCd44KP44KM44KL44CCCgojIyMg5LiW55WM44Go44K144OP44Op56CC5ryg5Lul5Y2X44Gu44Ki44OV44Oq44Kr44Gu44OH44O844K/44Gu57WM5bm05aSJ5YyWCgpgYGB7cn0KZGZfcG92ZXJ0eV9yYXRlX2xvbmcgfD4gCiAgZmlsdGVyKGNvdW50cnkgJWluJSBjKCJXb3JsZCIsICJTdWItU2FoYXJhbiBBZnJpY2EiKSkgfD4gZHJvcF9uYSgpIHw+CiAgZ2dwbG90KGFlcyh5ZWFyLCB2YWx1ZSwgY29sID0gbGV2ZWwsIGxpbmV0eXBlID0gY291bnRyeSkpICsgZ2VvbV9saW5lKCkKYGBgCgoqKuiAg+Wvn++8mioqU3ViLVNhaGFyYW4gQWZyaWNhIOOBruODh+ODvOOCv+OBr+OBquOBhOOCiOOBhuOBp+OBmeOAguOBn+OBl+OBi+OBq+OAgXJhdGlvIOOBr+OAgeWbveOBlOOBqOOBq+axuuOCgeOCi+OCguOBruOBp+OBmeOBi+OCieOAgeWcsOWfn+OBruWgtOWQiOOBq+OBr+OAgXJhdGlvIOOBruWApOOBr+OBquOBhOOBruOBp+OBl+OCh+OBhuOAggoKYGBge3J9CmRmX3BvdmVydHlfcmF0ZV9sb25nIHw+IGZpbHRlcih5ZWFyICVpbiUgYygyMDAwLCAyMDEwLCAyMDIwKSkgfD4gZHJvcF9uYSh2YWx1ZSkgfD4gCiAgZmlsdGVyKHJlZ2lvbiA9PSAiQWdncmVnYXRlcyIpIHw+IGZpbHRlcihsZXZlbCAlaW4lIGMoInJhdGlvIiwgInVuZGVyXzIuMTUiKSkgfD4gZ3JvdXBfYnkoY291bnRyeSwgeWVhciwgbGV2ZWwpIHw+IHN1bW1hcml6ZShuID0gbigpKQpgYGAKClN1YiBTYWhhcmFuIEFmcmljYSDjga/jg4fjg7zjgr/jga/jgYLjgorjgb7jgZvjgpPjgYzjgIHntbHoqIjnmoTjgavlh6bnkIbjgZfjgabvvIjlubPlnYfjga7jgojjgYbjgarjgoLjga7jgpLlj5bjgaPjgabvvInooajnpLrjgZnjgovjgZPjgajjga/lj6/og73jgafjgZnjgIIKCmxvZXNzIChMb2NhbCBQb2x5bm9taWFsIFJlZ3Jlc3Npb24pIOOBr+OAgeWwkeOBl+OBmuOBpOWMuuWIh+OBo+OBpuOAgeWkmumgheW8j+i/keS8vOOCkuS9v+OBo+OBpuOBhOOCi+OBhOOBvuOBmeOAguOBneOBk+OBp+OAgeODnuOCpOODiuOCueOBruWApOOCguWHuuOBpuOBjeOBpuOBl+OBvuOBo+OBpuOBhOOBvuOBmeOAguOBl+OBi+OBl+OAgeWkp+S9k+OBruWCvuWQkeOCkuOBv+OCi+OBk+OBqOOBr+OBp+OBjeOBvuOBmeOAguS4iuOBp+imi+OBn+ODh+ODvOOCv+OBruaVsOOBi+OCieOAgTE5OTLlubTku6XpmY3jgavjgZfjgabjgYrjgY/jga7jgYzoia/jgYTjgafjgZfjgofjgYbjgIIKCmBgYHtyfQpkZl9wb3ZlcnR5X3JhdGVfbG9uZyB8PiBkcm9wX25hKHZhbHVlKSB8PiBmaWx0ZXIoIWlzLm5hKHJlZ2lvbiksIHJlZ2lvbiAhPSAiQWdncmVnYXRlcyIpIHw+CiAgZmlsdGVyKGxldmVsID09ICJ1bmRlcl8yLjE1IikgfD4KICBnZ3Bsb3QoYWVzKHllYXIsIHZhbHVlLCBjb2wgPSByZWdpb24pKSArIGdlb21fc21vb3RoKGZvcm11bGEgPSAneSB+IHgnLCBzZSA9IEZBTFNFKQpgYGAKCmBgYHtyfQpkZl9wb3ZlcnR5X3JhdGVfbG9uZyB8PiBkcm9wX25hKHZhbHVlKSB8PiAKICBmaWx0ZXIoIWlzLm5hKHJlZ2lvbiksIHJlZ2lvbiAhPSAiQWdncmVnYXRlcyIsIHllYXIgPiAxOTkxKSB8PgogIGZpbHRlcihsZXZlbCA9PSAidW5kZXJfMi4xNSIpIHw+CiAgZ2dwbG90KGFlcyh5ZWFyLCB2YWx1ZSwgY29sID0gcmVnaW9uKSkgKyBnZW9tX3Ntb290aChmb3JtdWxhID0gJ3kgfiB4JywgbWV0aG9kID0gJ2xvZXNzJywgc2UgPSBGQUxTRSkgKyBsYWJzKHRpdGxlID0gIlJlZ2lvbmFsbHkgYWdncmVnYXRlZCByYXRpbyB1bmRlciAyLjE1IFVTRCIpCmBgYAoKYGBge3J9CmRmX3BvdmVydHlfcmF0ZV9sb25nIHw+IGRyb3BfbmEodmFsdWUpIHw+IAogIGZpbHRlcighaXMubmEocmVnaW9uKSwgcmVnaW9uICE9ICJBZ2dyZWdhdGVzIiwgeWVhciA+IDE5OTEpIHw+CiAgZmlsdGVyKGxldmVsICE9ICJyYXRpbyIpIHw+CiAgZ2dwbG90KGFlcyh5ZWFyLCB2YWx1ZSwgY29sID0gcmVnaW9uLCBsaW5ldHlwZSA9IGxldmVsKSkgKyBnZW9tX3Ntb290aChmb3JtdWxhID0gJ3kgfiB4JywgbWV0aG9kID0gJ2xvZXNzJywgc2UgPSBGQUxTRSkgKyBsYWJzKHRpdGxlID0gIlJlZ2lvbmFsbHkgYWdncmVnYXRlZCByYXRpbyIpCmBgYAoKYGBge3J9CmRmX3BvdmVydHlfcmF0ZV9sb25nIHw+IGRyb3BfbmEodmFsdWUpIHw+IAogIGZpbHRlcighaXMubmEocmVnaW9uKSwgcmVnaW9uID09ICJTdWItU2FoYXJhbiBBZnJpY2EiLCB5ZWFyID4gMTk5MSkgfD4KICBnZ3Bsb3QoYWVzKHllYXIsIHZhbHVlLCBjb2wgPSBsZXZlbCkpICsgZ2VvbV9zbW9vdGgoZm9ybXVsYSA9ICd5IH4geCcsIG1ldGhvZCA9ICdsb2VzcycsIHNlID0gVFJVRSkgKyBsYWJzKHRpdGxlID0gIlN1Yi1TYWhhcmFuIHJlZ2lvbiBhZ2dyZWdhdGVkIHJhdGlvIikKYGBgCgojIyMg44K144OP44Op56CC5ryg5Lul5Y2X77yIU3ViLVNhaGFyYW4gQWZyaWNh77yJIOOBruWbveOBruODh+ODvOOCvwoKYGBge3J9CmRmX3BvdmVydHlfcmF0ZV9sb25nIHw+ICBkcm9wX25hKHZhbHVlKSB8PiAKICBmaWx0ZXIocmVnaW9uID09ICJTdWItU2FoYXJhbiBBZnJpY2EiKSB8PiBncm91cF9ieShjb3VudHJ5LCBsZXZlbCkgfD4gCiAgc3VtbWFyaXplKG4gPSBuKCkpCmBgYAoKIyMg44Ki44OV44Oq44Kr5Y2X6YOo77yV44Kr5Zu944Gu5YiG5p6QCgojIyMg5Zu944Gu44Oq44K544OI44Gu6Kit5a6aCgpTT1VUSF9BRlJJQ0FfRklWRSDjgavjgIFTb3V0aCBBZnJpY2EsIE5hbWliaWEsIEVzd2F0aW5pLCBCb3Rzd2FuYSwgTGVzb3RobyDjgpLoqK3lrpoKCmBgYHtyfQpTT1VUSF9BRlJJQ0FfRklWRSA8LSBjKCJTb3V0aCBBZnJpY2EiLCAiTmFtaWJpYSIsICJFc3dhdGluaSIsICJCb3Rzd2FuYSIsICJMZXNvdGhvIikKYGBgCgojIyMg77yV44Kr5Zu944Gu44OH44O844K/44KS56K66KqNCgpgZGZfcG92ZXJ0eV9yYXRlX3NlbGVjdGVkYCDjgajjgIFgZGZfcG92ZXJ0eV9yYXRlX2xvbmdgIOOBq+OBpOOBhOOBpuOAgeOCouODleODquOCq+WNl+mDqO+8leOCq+WbveOBruODh+ODvOOCv+OCkueiuuiqjQoKYGBge3J9CmRmX3BvdmVydHlfcmF0ZV9zZWxlY3RlZCB8PiBmaWx0ZXIoY291bnRyeSAlaW4lIFNPVVRIX0FGUklDQV9GSVZFKQpgYGAKCmBgYHtyfQpkZl9wb3ZlcnR5X3JhdGVfbG9uZyB8PiBmaWx0ZXIoY291bnRyeSAlaW4lIFNPVVRIX0FGUklDQV9GSVZFKQpgYGAKCiMjIyDlkITosqflm7DnjofjgpLmipjjgoznt5rjgrDjg6njg5Xjgafmj4/jgYTjgabjgb/jgosKCiMjIyMg5Y2X44Ki44OV44Oq44Kr44Gr44Gk44GE44GmCgpgYGB7cn0KZGZfcG92ZXJ0eV9yYXRlX2xvbmcgfD4gCiAgZmlsdGVyKGNvdW50cnkgPT0gIlNvdXRoIEFmcmljYSIpIHw+IGRyb3BfbmEodmFsdWUpIHw+CiAgZ2dwbG90KGFlcyh5ZWFyLCB2YWx1ZSwgY29sID0gbGV2ZWwpKSArIGdlb21fbGluZSgpCmBgYAoKKirogIPlr5/vvJoqKjIwMDDlubTjgYvjgokyMDA45bm044GU44KN44G+44Gn5rib5bCR44GX44Gm44GE44KL44GM44CB44Gd44Gu5b6M44CB5LiK5piH5YK+5ZCR44GM6KaL44KJ44KM44KL44CCCgojIyMjIO+8leOCq+WbveWQjOaZguOBqwoKYGBge3J9CmRmX3BvdmVydHlfcmF0ZV9sb25nIHw+IAogIGZpbHRlcihjb3VudHJ5ICVpbiUgU09VVEhfQUZSSUNBX0ZJVkUpIHw+IGRyb3BfbmEodmFsdWUpIHw+CiAgZ2dwbG90KGFlcyh5ZWFyLCB2YWx1ZSwgY29sID0gY291bnRyeSwgbGluZXR5cGUgPSBsZXZlbCkpICsgZ2VvbV9saW5lKCkKYGBgCgoqKuiAg+Wvn++8mioq6KSH6ZuR44Gn44KP44GL44KK44KE44GZ44GE44Go44Gv44GE44GI44Gq44GECgpgYGB7cn0KZGZfcG92ZXJ0eV9yYXRlX2xvbmcgfD4gCiAgZmlsdGVyKGNvdW50cnkgJWluJSBTT1VUSF9BRlJJQ0FfRklWRSkgfD4gZHJvcF9uYSh2YWx1ZSkgfD4gZmlsdGVyKGxldmVsICE9ICJyYXRpbyIpIHw+CiAgZ2dwbG90KGFlcyh5ZWFyLCB2YWx1ZSwgY29sID0gY291bnRyeSwgbGluZXR5cGUgPSBsZXZlbCkpICsgZ2VvbV9saW5lKCkKYGBgCgoqKuiAg+Wvn++8mioq5Zu944GU44Go44Gr5rG644KB44Gf6LKn5Zuw546H44KS44Gu44Ge44GE44Gm44G/44Gf44CC5aSa5bCR5pS55ZaE44GX44Gf44CC44GX44GL44GX44CB44GC44Go44Gv5aW944G/44CCCgojIyMg77yV44Kr5Zu944Gu5pyA5paw44Gu44OH44O844K/CgpgYGB7cn0KZGZfcG92ZXJ0eV9yYXRlX3NlbGVjdGVkIHw+IAogIGZpbHRlcihjb3VudHJ5ICVpbiUgU09VVEhfQUZSSUNBX0ZJVkUpIHw+CiAgZHJvcF9uYSh1bmRlcl8yLjE1KSB8PiBncm91cF9ieShjb3VudHJ5KSB8PiBmaWx0ZXIoeWVhciA9PSBtYXgoeWVhcikpIHw+IAogIHNlbGVjdChjb3VudHJ5LCB5ZWFyLCByYXRpbzp1bmRlcl82Ljg1KQpgYGAKCioq6ICD5a+f77yaKirmr47lubTjg4fjg7zjgr/jgYzjgYLjgovjgo/jgZHjgafjga/jgarjgYTjga7jgafjgIHjgZ3jgozjgZ7jga7lm73jgZTjgajjgavmnIDmlrDjga7jgoLjga7jgpLopovjgovjgZPjgajjgajjgZnjgosKCiMjIyMg5Y2X44Ki44OV44Oq44Kr77yV44Kr5Zu944Gu6LKn5Zuw5bqm44GU44Go44Gu5Lq65Y+j5q+UCgpgYGB7cn0KZGZfcG92ZXJ0eV9yYXRlX2xvbmcgfD4gCiAgZmlsdGVyKGNvdW50cnkgJWluJSBTT1VUSF9BRlJJQ0FfRklWRSkgfD4KICBkcm9wX25hKHZhbHVlKSB8PiBncm91cF9ieShjb3VudHJ5KSB8PiBmaWx0ZXIoeWVhciA9PSBtYXgoeWVhcikpIHw+CiAgZ2dwbG90KGFlcyhjb3VudHJ5LCB2YWx1ZSwgZmlsbCA9IGxldmVsKSkgKyBnZW9tX2NvbChwb3NpdGlvbiA9ICJkb2RnZSIsIGNvbCA9ICJibGFjayIsIGxpbmV3aWR0aCA9IDAuMSkgKyAKICBsYWJzKHRpdGxlID0gIlBvdmVydCBMZXZlbCBSYXRpbyBvZiBGaXZlIENvdW50cmllcyIsIHN1YnRpdGxlID0gIkJvdHN3YW5hIGluIDIwMTUsIEVzd2F0aW5pIGluIDIwMTYgLExlc290byBpbiAyMDE3LCBOYW1pYmlhIGluIDIwMTUgXG5hbmQgU291dGggQWZyaWNhIGluIDIwMTQiKQpgYGAKCiMjIOS9nOalreaJi+mghuOBqOOBvuOBqOOCgQoKLSAgIOODkeODg+OCseODvOOCuO+8iFBhY2thZ2XvvInjga7liKnnlKjvvJoKCiAgICAtICAg44Kk44Oz44K544OI44O844Or77yIaW5zdGFsbGF0aW9u77yJ77yaVG9vbHMgXD4gSW5zdGFsbCBQYWNrYWdlcwoKICAgIC0gICDjg63jg7zjg4nvvIhsb2Fk77yJYGxpYnJhcnkodGlkeXZlcnNlKTsgbGlicmFyeShXREkpOyBsaWJyYXJ5KHNob3d0ZXh0KTsgbGlicmFyeShEZXNjVG9vbHMpYAoKLSAgIOODh+ODvOOCv+OBruWPluW+l++8mmBXREkoaW5kaWNhdG9yID0gYyhwb3AgPSAiU1AuUE9QLlRPVEwiKSlgCgogICAgLSAgIGBgYCBXREkoaW5kaWNhdG9yID1gYGMocmF0aW8gPSAiU0kuUE9WLk5BSEMiLCB1bmRlcl8yLjE1ID0gIlNJLlBPVi5EREFZIiwgdW5kZXJfMy42NSA9ICJTSS5QT1YuTE1JQyIsIHVuZGVyXzYuODUgPSAiU0kuUE9WLlVNSUMiKSwgZXh0cmEgPSBUUlVFKSBgYGAKCiAgICAtICAgZGF0YSDjgavmm7jjgY3lh7rjgZfjgIHjgZ3jgZPjgYvjgonoqq3jgb/ovrzjgoDjgajoia/jgYTjgIIKCiAgICAgICAgLSAgIGB3cml0ZV9jc3YoZGZfcG92ZXJ0eV9yYXRlLCAiZGF0YS9wb3ZlcnR5X3JhdGUuY3N2IilgCgogICAgICAgIC0gICBgcmVhZF9jc3YoImRhdGEvcG92ZXJ0eV9yYXRlLmNzdiIpYAoKLSAgIOODh+ODvOOCv+OCkuimi+OCi++8mmBkZl9wb3ZlcnR5X3JhdGVgICwgYGhlYWQoZGZfcG92ZXJ0eV9yYXRlKWAsIGBzdHIoZGZfcG92ZXJ0eV9yYXRlKWAKCi0gICDlpInmlbDjga7pgbjmip7vvJpgc2VsZWN0KGNvdW50cnksIHllYXIsIHJhdGlvLCB1bmRlcl8yLjE1LCB1bmRlcl8zLjY1LCB1bmRlcl82Ljg1LCByZWdpb24pYAoKLSAgIOODh+ODvOOCv+OBruWkieW9ou+8iExvbmcgZGF0Ye+8ie+8mmBwaXZvdF9sb25nZXIocmF0aW86dW5kZXJfNi44NSwgbmFtZXNfdG8gPSAibGV2ZWwiLCB2YWx1ZXNfdG8gPSAidmFsdWUiKWAKCi0gICDnibnlrprjga7ooYzjga7lj5blvpfvvJpgZmlsdGVyKCksIGRyb3BfbmEoKSwgZGlzdGluY3QoKWAKCi0gICDooYzjga7poIbnlarjga7kuKbjgbPmm7/jgYjvvJpgYXJyYW5nZShkZXNjKHllYXIpKWAKCi0gICDjgrDjg6vjg7zjg5fliIbjgZHvvJpgZ3JvdXBfYnkoKWAgLCBgZ3JvdXBfYnkoeWVhciwgbGV2ZWwpIHw+IHN1bW1hcml6ZShuID0gbigpKWAKCiMjIyDlj6/oppbljJYKCi0gICDmipjjgoznt5rjgrDjg6njg5UKCiAgICAtICAgYGdncGxvdChhZXMoeCA9IHllYXIsIHkgPSB1bmRlcl8yLjE1KSArIGdlb21fbGluZSgpYAoKICAgIC0gICBgZ2dwbG90KGFlcyh4ID0geWVhciwgeSA9IHVuZGVyXzIuMTUsIGNvbCA9IGNvdW50cnkpICsgZ2VvbV9saW5lKClgCgotICAg44OS44K544OI44Kw44Op44Og77yI5bqm5pWw5YiG5biD77yJCgogICAgLSAgIGBnZ3Bsb3QoYWVzKHVuZGVyXzIuMTUsIGZpbGwgPSByZWdpb24pKSArIGdlb21faGlzdG9ncmFtKGJpbnMgPSAxNSlgCgotICAg5qOS44Kw44Op44OVCgogICAgLSAgIGBnZ3Bsb3QoYWVzKHllYXIpKSArIGdlb21fYmFyKClgCgogICAgLSAgIGBnZ3Bsb3QoYWVzKGxldmVscywgdmFsdWUpKSArIGdlb21fY29sKClgCgogICAgLSAgIGBnZ3Bsb3QoYWVzKHggPSBsZXZlbHMsIHkgPSB2YWx1ZSwgZmlsbCA9IGNvdW50cnkpKSArIGdlb21fY29sKHBvc2l0aW9uID0gImRvZGdlIilgCgogICAgLSAgIGBnZ3Bsb3QoYWVzKHggPSBnaW5pLCBmaWxsID0gcmVnaW9uKSkgKyBnZW9tX2hpc3RvZ3JhbSgpYAoKLSAgIOaVo+W4g+Wbs++8iCvlm57luLDnm7Tnt5rvvIkKCiAgICAtICAgYGdncGxvdChhZXMoZ2luaSwgOTAtMTAwKSkgKyBnZW9tX3BvaW50KClgCgogICAgLSAgIGBnZ3Bsb3QoYWVzKGdpbmksIDgwLTEwMCkpICsgZ2VvbV9wb2ludCgpICsgZ2VvbV9zbW9vdGgoZm9ybXVsYSA9ICd5IH4geCcsIG1ldGhvZCA9ICJsbSIpYAoKKioq5bi444Gr44CB6ICD5a+f44CB5rCX44Gl44GE44Gf44GT44Go44KS44CB6KiY6Yyy44GX44Gm44GP44Gg44GV44GE44CCKioqCgojIyDoqrLpoYwKCuODh+ODvOOCv+OBr+OAgeS4iuOBp+S9v+OBo+OBn+S6jOOBpOOBruODh+ODvOOCv+OCkuS9v+OBhOOBvuOBmeOAggoKLSAgIGBkZl9wb3ZlcnR5X3JhdGVfc2VsZWN0ZWRgIDogd2lkZSDjg4fjg7zjgr/jgajoqIDjgo/jgozjgovjgoLjga7jgafjgZnjgILosqflm7DnjofvvIhgdW5kZXJfMi4xNWDvvInjga7jg4fjg7zjgr/jgpLlkKvjgb7jgarjgYTjgoLjga7jga/liYrpmaTjgZfjgabjgYLjgorjgb7jgZnjgIIKCi0gICBgZGZfcG92ZXJ0eV9yYXRlX2xvbmdgIO+8mmxvbmcg44OH44O844K/44Go6KiA44KP44KM44KL44KC44Gu44Gn44GZ44CCCgojIyMg57e057+S77ya44OH44O844K/44Gu56K66KqNCgoxLiAgYGRmX3BvdmVydHlfcmF0ZV9zZWxlY3RlZGAg44Go44CBYGRmX3BvdmVydHlfcmF0ZV9sb25nYCDjgpLopovjgabjgb/jgb7jgZfjgofjgYbjgILjganjgYbjgZfjgb7jgZnjgYvjgIIKCioqSGludO+8mioq44Gd44Gu44G+44G+44OH44O844K/44CBaGVhZCjjg4fjg7zjgr8p44CBRW52aXJvbm1lbnQg44GL44KJ44CB44OH44O844K/44KS6YG45oqeCgpgYGB7cn0KZGZfcG92ZXJ0eV9yYXRlX3NlbGVjdGVkCmBgYAoKYGBge3J9CmRmX3BvdmVydHlfcmF0ZV9sb25nCmBgYAoKMi4gIOWNl+OCouODoeODquOCq+OBp+OAgeOCuOODi+aMh+aVsOOBjOWkp+OBjeOBhOOBruOBr+OAgeS7peS4i+OBru+8lOOBpOOBruWbveOBp+OBmeOAglN1cmluYW1lLCBCZWxpemUsIEJyYXppbCwgQ29sb21iaWHjgILjgZ3jgozjgpLjgIFDSE9TRU5fR0lOSV9DT1VOVFJJRVMg44Gr5Luj5YWl44GX44Gm44GP44Gg44GV44GE44CCCgoqKkhpbnTvvJrjgIwqKlNPVVRIX0FGUklDQV9GSVZFIOOBq+OAgVNvdXRoIEFmcmljYSwgTmFtaWJpYSwgRXN3YXRpbmksIEJvdHN3YW5hLCBMZXNvdGhvIOOCkuioreWumuOAjeOCkuWPgueFpwoKYGBge3J9CkNIT1NFTl9HSU5JX0NPVU5UUklFUyA8LSBjKCJTdXJpbmFtZSIsICJCZWxpemUiLCAiQnJhemlsIiwgIkNvbG9tYmlhIikKYGBgCgozLiAgYGRmX3BvdmVydHlfcmF0ZV9zZWxlY3RlZGDjga7ljZfjgqLjg6Hjg6rjgqvvvJTjgqvlm73jga7mnIDmlrDjga7jg4fjg7zjgr/jgaDjgZHjgpLooajnpLrjgZfjgabjgb/jgb7jgZfjgofjgYbjgIIKCioqSGludO+8mioqU09VVEhfQUZSSUNBX0ZJVkUg44Gu5aC05ZCI44Gp44Gu44KI44GG44Gr44GX44Gf44GL6ICD44GI44Gm44G/44G+44GX44KH44GG44CCCgpgYGB7cn0KZGZfcG92ZXJ0eV9yYXRlX3NlbGVjdGVkIHw+IAogIGZpbHRlcihjb3VudHJ5ICVpbiUgQ0hPU0VOX0dJTklfQ09VTlRSSUVTKSB8PgogIGRyb3BfbmEodW5kZXJfMi4xNSkgfD4gZ3JvdXBfYnkoY291bnRyeSkgfD4gZmlsdGVyKHllYXIgPT0gbWF4KHllYXIpKSB8PiAKICBzZWxlY3QoY291bnRyeSwgeWVhciwgcmF0aW86dW5kZXJfNi44NSkKYGBgCgoqKuawl+OBpeOBhOOBn+OBk+OBqCoqCgotICAg5LiA55Wq5paw44GX44GE44KC44Gu44KS44Go44Gj44Gm44GE44KL44Gv44Ga44Gq44Gu44Gr44CB54m544Gr44CBU3VyaW5hbWUg44Go44CBQmVsaXplIOOBr+OBqOOBpuOCguWPpOOBhOOAguOBqOOBhOOBhuOBk+OBqOOBr+OAgeOBguOBvuOCiuODh+ODvOOCv+OBjOOBquOBhOOAguOBl+OBi+OBl+OAgeiyp+WbsOW6puOBr+mrmOOBhOOAggoKIyMjIOWNl+OCouODoeODquOCq++8lOOCq+WbveOBq+OBpOOBhOOBpuOBruWIhuaekAoKNC4gIO+8lOOCq+WbveOAgeOBneOCjOOBnuOCjOOBruOAgeiyp+WbsOeOh+OBruW5tOasoeWkieWMluOCkuaKmOOCjOe3muOCsOODqeODleOBq+OCiOOCiuihqOekugoK5LiL44Gv44CB44OW44Op44K444Or44Gr44Gk44GE44Gm44Gu44KC44Gu44Gn44GZ44GM44CB5LuW44Gu77yT44Kr5Zu944Gn44CB44OH44O844K/44GM44GC44KL44KC44Gu44Gr44Gk44GE44Gm44Gv44CB5ZCM5qeY44Gu44Kw44Op44OV44KS5o+P44GE44Gm44GP44Gg44GV44GE44CCCgpgYGB7cn0KZGZfcG92ZXJ0eV9yYXRlX2xvbmcgfD4gZmlsdGVyKGNvdW50cnkgPT0gIkJyYXppbCIpIHw+IGRyb3BfbmEodmFsdWUpIHw+CiAgZ2dwbG90KGFlcyh5ZWFyLCB2YWx1ZSwgY29sID0gbGV2ZWwpKSArIGdlb21fbGluZSgpICsKICBsYWJzKHRpdGxlID0gIlBvdmVydHkgUmF0aW8gb2YgQnJhc2lsIikKYGBgCgpgYGB7cn0KZGZfcG92ZXJ0eV9yYXRlX2xvbmcgfD4gZmlsdGVyKGNvdW50cnkgPT0gIkNvbG9tYmlhIikgfD4gZHJvcF9uYSh2YWx1ZSkgfD4KICBnZ3Bsb3QoYWVzKHllYXIsIHZhbHVlLCBjb2wgPSBsZXZlbCkpICsgZ2VvbV9saW5lKCkgKwogIGxhYnModGl0bGUgPSAiUG92ZXJ0eSBSYXRpbyBvZiBDb2xvbWJpYSIpCmBgYAoKKirmsJfjgaXjgYTjgZ/jgZPjgagqKgoKLSAgIOOBqOOBk+OCjeOBqeOBk+OCjeOBq+OAgeWHuOWHueOBjOOBguOCi+OAguOBneOCjOOBquOCiuOBrueQhueUseOBjOOBguOCi+OBruOBoOOCjeOBhuOAguS7luOBruS6jOOBpOOBruWbveOBr+OBqeOBhuOBoOOCjeOBhuOBi+OAggoKLSAgIEJlbGl6ZSDjga/jgIHlsJHjgZfjg4fjg7zjgr/jgYzjgYLjgovjgYzjgIFTdXJpbmFtZSDjga/jgIHlh7rjgabjgZPjgarjgYTjgIIKCmBgYHtyfQpkZl9wb3ZlcnR5X3JhdGVfbG9uZyB8PiBmaWx0ZXIoY291bnRyeSA9PSAiQmVsaXplIikgfD4gZHJvcF9uYSh2YWx1ZSkgfD4KICBnZ3Bsb3QoYWVzKHllYXIsIHZhbHVlLCBjb2wgPSBsZXZlbCkpICsgZ2VvbV9saW5lKCkgKwogIGxhYnModGl0bGUgPSAiUG92ZXJ0eSBSYXRpbyBvZiBCZWxpemUiKQpgYGAKCmBgYHtyfQpkZl9wb3ZlcnR5X3JhdGVfbG9uZyB8PiBmaWx0ZXIoY291bnRyeSA9PSAiU3VyaW5hbWUiKSB8PiBkcm9wX25hKHZhbHVlKSB8PgogIGdncGxvdChhZXMoeWVhciwgdmFsdWUsIGNvbCA9IGxldmVsKSkgKyBnZW9tX2xpbmUoKSArCiAgbGFicyh0aXRsZSA9ICJQb3ZlcnR5IFJhdGlvIG9mIFN1cmluYW1lIikKYGBgCgojIyMjIOWNl+OCouODoeODquOCq++8lOOCq+WbveOBruiyp+WbsOW6puOBlOOBqOOBruS6uuWPo+avlOOBruajkuOCsOODqeODlQoKNS4gIOiyp+WbsOW6puOBlOOBqOOBruS6uuWPo+avlOOBruajkuOCsOODqeODleOCkuaPj+OBhOOBpuOBv+OBvuOBl+OCh+OBhuOAggoKSGludDog5Y2X44Ki44OV44Oq44Kr77yV44Kr5Zu944Gu6LKn5Zuw5bqm44GU44Go44Gu5Lq65Y+j5q+U44Gu5qOS44Kw44Op44OVCgpgYGB7cn0KZGZfcG92ZXJ0eV9yYXRlX2xvbmcgfD4gCiAgZmlsdGVyKGNvdW50cnkgJWluJSBDSE9TRU5fR0lOSV9DT1VOVFJJRVMpIHw+CiAgZHJvcF9uYSh2YWx1ZSkgfD4gZ3JvdXBfYnkoY291bnRyeSkgfD4gZmlsdGVyKHllYXIgPT0gbWF4KHllYXIpKSB8PgogIGdncGxvdChhZXMoY291bnRyeSwgdmFsdWUsIGZpbGwgPSBsZXZlbCkpICsgZ2VvbV9jb2wocG9zaXRpb24gPSAiZG9kZ2UiLCBjb2wgPSAiYmxhY2siLCBsaW5ld2lkdGggPSAwLjEpIApgYGAKCioq5rCX44Gl44GE44Gf44GT44GoKioKCi0gICDjgZPjgozjgaDjgZHjgafjga/jgIHjgo/jgYvjgonjgarjgYTjgYzjgIFDb2x1bWJpYSDjga/jgIHlm73jga7osqflm7DluqbjgpLjgIFcJDYuODUg44Go44GX44Gm44GE44KL44KI44GG44Gg44CCCgotICAgQmVsaXplIOOBp+OBr+OAgTcwJSDov5HjgYTkurrjgYzjgIF1bmRlciBcJDYuODUg44Gn55Sf5rS744GX44Gm44GE44KL44GT44Go44Gr44Gq44KL44CCCgojIyMg57e057+S77ya6LKn5Zuw5bqm44GU44Go44Gu5Lq65Y+j5q+UCgroqrLpoYzjgavjgYLjgosgMSDjgYvjgokgNS4KCuaPkOWHuuOBr+OBl+OBquOBj+OBpuiJr+OBhOOBp+OBmeOBjOOAgeOBnOOBsuWun+mam+OBq+aJi+OCkuWLleOBi+OBl+OBpuWun+ihjOOBl+OBpuOBj+OBoOOBleOBhOOAggoKIyMg5Y+C6ICD5paH54yuCgoxLiAg44CM44G/44KT44Gq44Gu44OH44O844K/44K144Kk44Ko44Oz44K5IC0gRGF0YSBTY2llbmNlIGZvciBBbGzjgI1bW+OBr+OBmOOCgeOBpuOBruODh+ODvOOCv+OCteOCpOOCqOODs+OCuV0oaHR0cHM6Ly9pY3UtaHN1enVraS5naXRodWIuaW8vZHM0YWovZmlyc3QtZXhhbXBsZS5odG1sI2ZpcnN0LWV4YW1wbGUpXQoKICAgIC0gICDlsI7lhaXjgajjgZfjgabjgIFHRFDvvIjlm73lhoXnt4/nlJ/nlKPvvInjga7jg4fjg7zjgr/jgpLkvb/jgaPjgaboqqzmmI7jgZfjgabjgYTjgb7jgZnjgIIKCjIuICBQb3NpdCBSZWNpcGVz77yI5penIFBvc2l0IFByaW1lcnPvvIk6IFRoZSBCYXNpY3Mg5a++6Kmx5Z6L44Gu5ryU57+S44K144Kk44OI44Gu5pyA5YidIFtbTGlua10oaHR0cHM6Ly9wb3NpdC5jbG91ZC9sZWFybi9yZWNpcGVzKV0KCjMuICBQb3NpdCBDaGVhdCBTaGVldC4g5pep6KaL6KGo44Gn44GZ44CC5Y2w5Yi344GX44Gm5L2/44GG44Gf44KB44Gr44CBUERGIOOCguaPkOS+m+OBl+OBpuOBhOOBvuOBmeOAgltbU2l0ZSBMaW5rXShodHRwczovL3JzdHVkaW8uZ2l0aHViLmlvL2NoZWF0c2hlZXRzLyldCgo0LiAgRGF0YUNhbXAgQ2hlYXQgU2hlZXQ6IFRpZHl2ZXJzZSBmb3IgQmlnaW5uZXJzLiDjg4fjg7zjgr/jgrXjgqTjgqjjg7Pjgrnjga7mlZnogrLjgpLjgZfjgabjgYTjgovkvJrnpL7jga7ml6nopovooajjga7kuIDjgaTjgafjgZnjgILln7rmnKzjgYznsKHljZjjgavjgb7jgajjgb7jgaPjgabjgYTjgb7jgZnjgIJbW0xpbmtdKGh0dHBzOi8vaW1hZ2VzLmRhdGFjYW1wLmNvbS9pbWFnZS91cGxvYWQvdjE2NzYzMDI2OTcvTWFya2V0aW5nL0Jsb2cvVGlkeXZlcnNlX0NoZWF0X1NoZWV0LnBkZildCg==