講義 1月11日(木)南部アフリカ諸国の状況

演習 1月16日(火)

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ドル未満で生活している人口の割合です。

復習

貧困は、どのような尺度で測るのだろうか。

  1. 一人当たりの購買力平価(Purchasing Power Parities)による国内総生産(Gross Domestic Product)

    • GDP per capita, PPP (constant 2017 international $): NY.GDP.PCAP.PP.KD [Link]

    • 12/13 極度に貧しい!? [R Notebook], [Rmd]

    • 国ごとの所得の平均のようなものはわかるが、極度の貧困の人がどの程度いるのかはわからない。

  2. 人口動態(demography)

    • 人口のデータ(総人口、出生率、死亡率、若年者扶養率、高齢者扶養率)

    • 12/20 人口動態(demography)[R Notebook], [Rmd]

    • 人口データは基本的で、国の値から個人の値を求めたり、他の国と比較しやすい割合から実際の数を求めるなどに必須

  3. ジニ指数および所得分布

    • ジニ指数(Gini), 所得の下位10%, 20%, 20%-40%, 40%-60%, 60%-80%, 80%以上, 90%以上

    • 1/9 ジニって何!? [R Notebook], [Rmd]

    • 1/9 ジニ指数と所得分布 [R Notebook], [Rmd] (参考1/参考2付 [R Notebook])

    • 国の中での所得分布を見、かつ所得分配の公平さを一つの指標(ジニ指数)で表すことにより、比較も可能になったが、極度に貧困なひとがどのぐらいいるのかはわからない。

貧困者率

準備

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" "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

変形(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.

アフリカ南部5カ国の分析

国のリストの設定

SOUTH_AFRICA_FIVE に、South Africa, Namibia, Eswatini, Botswana, Lesotho を設定

SOUTH_AFRICA_FIVE <- c("South Africa", "Namibia", "Eswatini", "Botswana", "Lesotho")

5カ国のデータを確認

df_poverty_rate_selected と、df_poverty_rate_long について、アフリカ南部5カ国のデータを確認

df_poverty_rate_selected |> filter(country %in% SOUTH_AFRICA_FIVE)
df_poverty_rate_long |> filter(country %in% SOUTH_AFRICA_FIVE)

各貧困率を折れ線グラフで描いてみる

南アフリカについて

df_poverty_rate_long |> 
  filter(country == "South Africa") |> drop_na(value) |>
  ggplot(aes(year, value, col = level)) + geom_line()

考察:2000年から2008年ごろまで減少しているが、その後、上昇傾向が見られる。

5カ国同時に

df_poverty_rate_long |> 
  filter(country %in% SOUTH_AFRICA_FIVE) |> drop_na(value) |>
  ggplot(aes(year, value, col = country, linetype = level)) + geom_line()

考察:複雑でわかりやすいとはいえない

df_poverty_rate_long |> 
  filter(country %in% SOUTH_AFRICA_FIVE) |> drop_na(value) |> filter(level != "ratio") |>
  ggplot(aes(year, value, col = country, linetype = level)) + geom_line()

考察:国ごとに決めた貧困率をのぞいてみた。多少改善した。しかし、あとは好み。

5カ国の最新のデータ

df_poverty_rate_selected |> 
  filter(country %in% SOUTH_AFRICA_FIVE) |>
  drop_na(under_2.15) |> group_by(country) |> filter(year == max(year)) |> 
  select(country, year, ratio:under_6.85)

考察:毎年データがあるわけではないので、それぞの国ごとに最新のものを見ることとする

南アフリカ5カ国の貧困度ごとの人口比

df_poverty_rate_long |> 
  filter(country %in% SOUTH_AFRICA_FIVE) |>
  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) + 
  labs(title = "Povert Level Ratio of Five Countries", subtitle = "Botswana in 2015, Eswatini in 2016 ,Lesoto in 2017, Namibia in 2015 \nand South Africa in 2014")

作業手順とまとめ

可視化

  • 折れ線グラフ

    • ggplot(aes(x = year, y = under_2.15) + geom_line()

    • ggplot(aes(x = year, y = under_2.15, col = country) + geom_line()

  • ヒストグラム(度数分布)

    • ggplot(aes(under_2.15, fill = region)) + geom_histogram(bins = 15)
  • 棒グラフ

    • ggplot(aes(year)) + geom_bar()

    • ggplot(aes(levels, value)) + geom_col()

    • ggplot(aes(x = levels, y = value, fill = country)) + geom_col(position = "dodge")

    • ggplot(aes(x = gini, fill = region)) + geom_histogram()

  • 散布図(+回帰直線)

    • ggplot(aes(gini, 90-100)) + geom_point()

    • ggplot(aes(gini, 80-100)) + geom_point() + geom_smooth(formula = 'y ~ x', method = "lm")

常に、考察、気づいたことを、記録してください。

課題

データは、上で使った二つのデータを使います。

練習:データの確認

  1. df_poverty_rate_selected と、df_poverty_rate_long を見てみましょう。どうしますか。

Hint:そのままデータ、head(データ)、Environment から、データを選択

  1. 南アメリカで、ジニ指数が大きいのは、以下の4つの国です。Suriname, Belize, Brazil, Colombia。それを、CHOSEN_GINI_COUNTRIES に代入してください。

Hint:「SOUTH_AFRICA_FIVE に、South Africa, Namibia, Eswatini, Botswana, Lesotho を設定」を参照

  1. df_poverty_rate_selectedの南アメリカ4カ国の最新のデータだけを表示してみましょう。

Hint:SOUTH_AFRICA_FIVE の場合どのようにしたか考えてみましょう。

気づいたこと

南アメリカ4カ国についての分析

  1. 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")

気づいたこと

南アメリカ4カ国の貧困度ごとの人口比の棒グラフ

  1. 貧困度ごとの人口比の棒グラフを描いてみましょう。

Hint: 南アフリカ5カ国の貧困度ごとの人口比の棒グラフ

気づいたこと

練習:貧困度ごとの人口比

課題にある 1 から 5.

提出はしなくて良いですが、ぜひ実際に手を動かして実行してください。

参考文献

  1. 「みんなのデータサイエンス - Data Science for All」[はじめてのデータサイエンス]

    • 導入として、GDP(国内総生産)のデータを使って説明しています。
  2. Posit Recipes(旧 Posit Primers): The Basics 対話型の演習サイトの最初 [Link]

  3. Posit Cheat Sheet. 早見表です。印刷して使うために、PDF も提供しています。[Site Link]

  4. DataCamp Cheat Sheet: Tidyverse for Biginners. データサイエンスの教育をしている会社の早見表の一つです。基本が簡単にまとまっています。[Link]

LS0tCnRpdGxlOiAi6LKn5Zuw546HIC0gUG92ZXJ0eSBSYXRlIgphdXRob3I6ICJILiBTdXp1a2kiCmRhdGU6ICIyMDI05bm0MeaciDE25pelIgpvdXRwdXQ6CiAgaHRtbF9ub3RlYm9vazogZGVmYXVsdAotLS0KCi0gICDvvIjliKXjga7jgr/jg5bjgb7jgZ/jga8g44Km44Kj44Oz44OJ44Km44Gn77yJUG9zaXRDbG91ZCDjgavjg63jgrDjgqTjg7PvvIjjgqLjgqvjgqbjg7Pjg4jjga7jgarjgYTkurrjga/jgrXjgqTjg7Pjg7vjgqLjg4Pjg5fvvIlbW1Bvc2l0LmNsb3VkXShodHRwczovL3Bvc2l0LmNsb3VkLyld44O7W1vlhbHmnInjg5fjg63jgrjjgqfjgq/jg4hdKGh0dHBzOi8vcG9zaXQuY2xvdWQvY29udGVudC81NTM5NzYzKV0KCiMjIOism+e+qSAx5pyIMTHml6XvvIjmnKjvvInljZfpg6jjgqLjg5Xjg6rjgqvoq7jlm73jga7nirbms4EKCi0gICBJTkVRVUFMSVRZIElOIFNPVVRIRVJOIEFGUklDQToLQU4gQVNTRVNTTUVOVCBPRiBUSEUgU09VVEhFUk4gQUZSSUNBTgtDVVNUT01TIFVOSU9OIFtbUmVwb3J0XShodHRwczovL2RvY3VtZW50czEud29ybGRiYW5rLm9yZy9jdXJhdGVkL2VuLzA5OTEyNTMwMzA3MjIzNjkwMy9wZGYvUDE2NDkyNzBjMDJhMWYwNmIwYTNhZTAyZTU3ZWFkZDdhODIucGRmKV0gW1tMaW5rXShodHRwczovL29wZW5rbm93bGVkZ2Uud29ybGRiYW5rLm9yZy9lbnRpdGllcy9wdWJsaWNhdGlvbi85ZjhlNDA3My0yNWY5LTU2MmMtOGUzYi01NDFjOTlkZDQyY2IpXQoKLSAgIOWNl+OCouODleODquOCq++8iFNvdXRoIEFmcmljYe+8ieOAgeODrOOCveODiO+8iExldGhvdG/vvInjgIHjgqjjgrnjg6/jg4bjgqPjg4vvvIhFc3dhdGluae+8ieOAgeODiuODn+ODk+OCou+8iE5hbWl2aWHvvInjgIHjg5zjg4Tjg6/jg4rvvIhCb3Rzd2FuYe+8iQoKICAgIC0gICDlj5forJvmhJ/mg7PjgavjgYvjgYjjgabvvJrjgrjjg4vmjIfmlbDjgajmiYDlvpfliIbluIMgLSDntprnt6ggW1tSIE5vdGVib29rXShodHRwczovL2RzLXNsLmdpdGh1Yi5pby9pbnRybzJyL2dlczAwMS9naW5pX3VwZGF0ZWQubmIuaHRtbCldLCBbW1JtZF0oaHR0cHM6Ly9naXRodWIuY29tL2RzLXNsL2ludHJvMnIvYmxvYi9tYWluL2RvY3MvZ2VzMDAxL2dpbmlfdXBkYXRlZC5SbWQpXQoKIyMg5ryU57+SIDHmnIgxNuaXpe+8iOeBq++8iQoKIyMgMDEvMTYoVFUp44CAUuOBp+ODh+ODvOOCv+OCteOCpOOCqOODs+OCuTQ66LKn5ZuwIFtbTWFpbl0oaHR0cHM6Ly9kcy1zbC5naXRodWIuaW8vaW50cm8yci9nZXMwMDEvZ2VzMDAxLW1haW4ubmIuaHRtbCldCgojIyMg44OH44O844K/44Gr44Gk44GE44GmCgoqKlBvdmVydHkgcmF0ZXMgYXQgbmF0aW9uYWwgcG92ZXJ0eSBsaW5lcyoqCgpQb3ZlcnR5IGhlYWRjb3VudCByYXRpbyBhdCBuYXRpb25hbCBwb3ZlcnR5IGxpbmVzICglIG9mIHBvcHVsYXRpb24p77yaU0kuUE9WLk5BSEMgW1tMaW5rXShodHRwczovL2RhdGEud29ybGRiYW5rLm9yZy9pbmRpY2F0b3IvU0kuUE9WLk5BSEMpXQoKTmF0aW9uYWwgcG92ZXJ0eSBoZWFkY291bnQgcmF0aW8gaXMgdGhlIHBlcmNlbnRhZ2Ugb2YgdGhlIHBvcHVsYXRpb24gbGl2aW5nIGJlbG93IHRoZSBuYXRpb25hbCBwb3ZlcnR5IGxpbmUocykuIE5hdGlvbmFsIGVzdGltYXRlcyBhcmUgYmFzZWQgb24gcG9wdWxhdGlvbi13ZWlnaHRlZCBzdWJncm91cCBlc3RpbWF0ZXMgZnJvbSBob3VzZWhvbGQgc3VydmV5cy4gRm9yIGVjb25vbWllcyBmb3Igd2hpY2ggdGhlIGRhdGEgYXJlIGZyb20gRVUtU0lMQywgdGhlIHJlcG9ydGVkIHllYXIgaXMgdGhlIGluY29tZSByZWZlcmVuY2UgeWVhciwgd2hpY2ggaXMgdGhlIHllYXIgYmVmb3JlIHRoZSBzdXJ2ZXkgeWVhci4KCuWFqOWbveiyp+WbsOS6uuWPo+avlOeOh+OBr+OAgeWFqOWbveiyp+WbsOe3muS7peS4i+OBp+eUn+a0u+OBl+OBpuOBhOOCi+S6uuWPo+OBruWJsuWQiOOBp+OBmeOAguWbveOBruaOqOWumuWApOOBr+OAgeS4luW4r+iqv+afu+OBi+OCieOBruS6uuWPo+WKoOmHjeOCteODluOCsOODq+ODvOODl+aOqOWumuWApOOBq+WfuuOBpeOBhOOBpuOBhOOBvuOBmeOAguODh+ODvOOCv+OBjCBFVS1TSUxDIOOBi+OCieOBruOCguOBruOBp+OBguOCi+e1jOa4iOOBruWgtOWQiOOAgeWgseWRiuOBleOCjOOCi+W5tOOBr+aJgOW+l+Wfuua6luW5tOOAgeOBpOOBvuOCiuiqv+afu+W5tOOBruWJjeW5tOOBp+OBmeOAggoKKipQb3ZlcnR5IGFuZCBJbmVxdWFsaXR54oCVUG92ZXJ0eSByYXRlcyBhdCBpbnRlcm5hdGlvbmFsIHBvdmVydHkgbGluZXMqKgoKUG92ZXJ0eSBoZWFkY291bnQgcmF0aW8gYXQgXCQyLjE1IGEgZGF5ICgyMDE3IFBQUCkgKCUgb2YgcG9wdWxhdGlvbinvvJpTSS5QT1YuRERBWSBbW0xpbmtdKGh0dHBzOi8vZGF0YS53b3JsZGJhbmsub3JnL2luZGljYXRvci9TSS5QT1YuRERBWSldCgpQb3ZlcnR5IGhlYWRjb3VudCByYXRpbyBhdCBcJDIuMTUgYSBkYXkgaXMgdGhlIHBlcmNlbnRhZ2Ugb2YgdGhlIHBvcHVsYXRpb24gbGl2aW5nIG9uIGxlc3MgdGhhbiBcJDIuMTUgYSBkYXkgYXQgMjAxNyBwdXJjaGFzaW5nIHBvd2VyIGFkanVzdGVkIHByaWNlcy4gQXMgYSByZXN1bHQgb2YgcmV2aXNpb25zIGluIFBQUCBleGNoYW5nZSByYXRlcywgcG92ZXJ0eSByYXRlcyBmb3IgaW5kaXZpZHVhbCBjb3VudHJpZXMgY2Fubm90IGJlIGNvbXBhcmVkIHdpdGggcG92ZXJ0eSByYXRlcyByZXBvcnRlZCBpbiBlYXJsaWVyIGVkaXRpb25zLgoKMeaXpTIuMTXjg4njg6vjga7osqflm7Dkurrlj6Pmr5Tnjofjga/jgIEyMDE35bm044Gu6LO86LK35Yqb6Kq/5pW05b6M5L6h5qC844GnMeaXpTIuMTXjg4njg6vmnKrmuoDjgafnlJ/mtLvjgZfjgabjgYTjgovkurrlj6Pjga7libLlkIjjgafjgZnjgIJQUFAg54K65pu/44Os44O844OI44Gu5pS55a6a44Gr44KI44KK44CB5ZCE5Zu944Gu6LKn5Zuw546H44KS5Lul5YmN44Gu54mI44Gn5aCx5ZGK44GV44KM44Gf6LKn5Zuw546H44Go5q+U6LyD44GZ44KL44GT44Go44GM44Gn44GN44Gq44GP44Gq44KK44G+44GX44Gf44CCCgpQb3ZlcnR5IGhlYWRjb3VudCByYXRpbyBhdCBcJDMuNjUgYSBkYXkgKDIwMTcgUFBQKSAoJSBvZiBwb3B1bGF0aW9uKe+8mlNJLlBPVi5MTUlDIFtbTGlua10oaHR0cHM6Ly9kYXRhLndvcmxkYmFuay5vcmcvaW5kaWNhdG9yL1NJLlBPVi5MTUlDKV0KClBvdmVydHkgaGVhZGNvdW50IHJhdGlvIGF0IFwkMy42NSBhIGRheSBpcyB0aGUgcGVyY2VudGFnZSBvZiB0aGUgcG9wdWxhdGlvbiBsaXZpbmcgb24gbGVzcyB0aGFuIFwkMy42NSBhIGRheSBhdCAyMDE3IGludGVybmF0aW9uYWwgcHJpY2VzLgoKMSDml6UgMy42NSDjg4njg6vjga7osqflm7Dkurrlj6Pmr5Tnjofjga/jgIEyMDE3IOW5tOOBruWbvemam+S+oeagvOOBpyAxIOaXpSAzLjY1IOODieODq+acqua6gOOBp+eUn+a0u+OBl+OBpuOBhOOCi+S6uuWPo+OBruWJsuWQiOOBp+OBmeOAggoKUG92ZXJ0eSBoZWFkY291bnQgcmF0aW8gYXQgXCQ2Ljg1IGEgZGF5ICgyMDE3IFBQUCkgKCUgb2YgcG9wdWxhdGlvbinvvJpTSS5QT1YuVU1JQyBbW0xpbmtdKGh0dHBzOi8vZGF0YS53b3JsZGJhbmsub3JnL2luZGljYXRvci9TSS5QT1YuVU1JQyldCgpQb3ZlcnR5IGhlYWRjb3VudCByYXRpbyBhdCBcJDYuODUgYSBkYXkgaXMgdGhlIHBlcmNlbnRhZ2Ugb2YgdGhlIHBvcHVsYXRpb24gbGl2aW5nIG9uIGxlc3MgdGhhbiBcJDYuODUgYSBkYXkgYXQgMjAxNyBpbnRlcm5hdGlvbmFsIHByaWNlcy4KCjHml6U2Ljg144OJ44Or44Gu6LKn5Zuw5Lq65Y+j5q+U546H44Gv44CBMjAxN+W5tOOBruWbvemam+S+oeagvOOBpzHml6U2Ljg144OJ44Or5pyq5rqA44Gn55Sf5rS744GX44Gm44GE44KL5Lq65Y+j44Gu5Ymy5ZCI44Gn44GZ44CCCgojIyDlvqnnv5IKCuiyp+WbsOOBr+OAgeOBqeOBruOCiOOBhuOBquWwuuW6puOBp+a4rOOCi+OBruOBoOOCjeOBhuOBi+OAggoKMS4gIOS4gOS6uuW9k+OBn+OCiuOBruizvOiyt+WKm+W5s+S+oe+8iFB1cmNoYXNpbmcgUG93ZXIgUGFyaXRpZXPvvInjgavjgojjgovlm73lhoXnt4/nlJ/nlKPvvIhHcm9zcyBEb21lc3RpYyBQcm9kdWN077yJCgogICAgLSAgIEdEUCBwZXIgY2FwaXRhLCBQUFAgKGNvbnN0YW50IDIwMTcgaW50ZXJuYXRpb25hbCBcJCk6IE5ZLkdEUC5QQ0FQLlBQLktEIFtbTGlua10oaHR0cHM6Ly9kYXRhLndvcmxkYmFuay5vcmcvaW5kaWNhdG9yL05ZLkdEUC5QQ0FQLlBQLktEKV0KCiAgICAtICAgMTIvMTMg5qW15bqm44Gr6LKn44GX44GE77yB77yfIFtbUiBOb3RlYm9va10oaHR0cHM6Ly9kcy1zbC5naXRodWIuaW8vaW50cm8yci9nZXMwMDEvcG92ZXJ0eS5uYi5odG1sKV0sIFtbUm1kXShodHRwczovL2dpdGh1Yi5jb20vZHMtc2wvaW50cm8yci9ibG9iL21haW4vZG9jcy9nZXMwMDEvcG92ZXJ0eS5SbWQpXQoKICAgIC0gICDlm73jgZTjgajjga7miYDlvpfjga7lubPlnYfjga7jgojjgYbjgarjgoLjga7jga/jgo/jgYvjgovjgYzjgIHmpbXluqbjga7osqflm7Djga7kurrjgYzjganjga7nqIvluqbjgYTjgovjga7jgYvjga/jgo/jgYvjgonjgarjgYTjgIIKCjIuICDkurrlj6Pli5XmhYvvvIhkZW1vZ3JhcGh577yJCgogICAgLSAgIOS6uuWPo+OBruODh+ODvOOCv++8iOe3j+S6uuWPo+OAgeWHuueUn+eOh+OAgeatu+S6oeeOh+OAgeiLpeW5tOiAheaJtumkiueOh+OAgemrmOm9ouiAheaJtumkiueOh++8iQoKICAgIC0gICAxMi8yMCDkurrlj6Pli5XmhYvvvIhkZW1vZ3JhcGh577yJW1tSIE5vdGVib29rXShodHRwczovL2RzLXNsLmdpdGh1Yi5pby9pbnRybzJyL2dlczAwMS9kZW1vZ3JhcGh5Lm5iLmh0bWwpXSwgW1tSbWRdKGh0dHBzOi8vZ2l0aHViLmNvbS9kcy1zbC9pbnRybzJyL2Jsb2IvbWFpbi9kb2NzL2dlczAwMS9kZW1vZ3JhcGh5LlJtZCldCgogICAgLSAgIOS6uuWPo+ODh+ODvOOCv+OBr+WfuuacrOeahOOBp+OAgeWbveOBruWApOOBi+OCieWAi+S6uuOBruWApOOCkuaxguOCgeOBn+OCiuOAgeS7luOBruWbveOBqOavlOi8g+OBl+OChOOBmeOBhOWJsuWQiOOBi+OCieWun+mam+OBruaVsOOCkuaxguOCgeOCi+OBquOBqeOBq+W/hemgiAoKMy4gIOOCuOODi+aMh+aVsOOBiuOCiOOBs+aJgOW+l+WIhuW4gwoKICAgIC0gICDjgrjjg4vmjIfmlbDvvIhHaW5p77yJLCDmiYDlvpfjga7kuIvkvY0xMCUsIDIwJSwgMjAlLTQwJSwgNDAlLTYwJSwgNjAlLTgwJSwgODAl5Lul5LiKLCA5MCXku6XkuIoKCiAgICAtICAgMS85IOOCuOODi+OBo+OBpuS9le+8ge+8nyBbW1IgTm90ZWJvb2tdKGh0dHBzOi8vZHMtc2wuZ2l0aHViLmlvL2ludHJvMnIvZ2VzMDAxL3doYXRfaXNfZ2luaS5uYi5odG1sKV0sIFtbUm1kXShodHRwczovL2dpdGh1Yi5jb20vZHMtc2wvaW50cm8yci9ibG9iL21haW4vZG9jcy9nZXMwMDEvd2hhdF9pc19naW5pLlJtZCldCgogICAgLSAgIDEvOSDjgrjjg4vmjIfmlbDjgajmiYDlvpfliIbluIMgW1tSIE5vdGVib29rXShodHRwczovL2RzLXNsLmdpdGh1Yi5pby9pbnRybzJyL2dlczAwMS9naW5pLm5iLmh0bWwpXSwgW1tSbWRdKGh0dHBzOi8vZ2l0aHViLmNvbS9kcy1zbC9pbnRybzJyL2Jsb2IvbWFpbi9kb2NzL2dlczAwMS9naW5pLlJtZCld44CA77yI5Y+C6ICDMS/lj4LogIMy5LuYIFtbUiBOb3RlYm9va10oaHR0cHM6Ly9kcy1zbC5naXRodWIuaW8vaW50cm8yci9nZXMwMDEvZ2luaV9sb25nLm5iLmh0bWwpXe+8iQoKICAgIC0gICDlm73jga7kuK3jgafjga7miYDlvpfliIbluIPjgpLopovjgIHjgYvjgaTmiYDlvpfliIbphY3jga7lhazlubPjgZXjgpLkuIDjgaTjga7mjIfmqJnvvIjjgrjjg4vmjIfmlbDvvInjgafooajjgZnjgZPjgajjgavjgojjgorjgIHmr5TovIPjgoLlj6/og73jgavjgarjgaPjgZ/jgYzjgIHmpbXluqbjgavosqflm7DjgarjgbLjgajjgYzjganjga7jgZDjgonjgYTjgYTjgovjga7jgYvjga/jgo/jgYvjgonjgarjgYTjgIIKCiMjIOiyp+WbsOiAheeOhwoKLSAgIOeUn+a0u+OBmeOCi+OBn+OCgeOBruWfuuacrOeahOODi+ODvOOCuuOCkuizhOOBhuOBn+OCgeOBq+W/heimgeOBqOOBneOCjOOBnuOCjOOBruWbveOBjOiAg+OBiOOCi+Wfuua6luOCkua6gOOBn+OBl+OBpuOBhOOBquOBhOS6uuWPo+OBruWJsuWQiAoKICAgIC0gICBQb3ZlcnR5IGhlYWRjb3VudCByYXRpbyBhdCBuYXRpb25hbCBwb3ZlcnR5IGxpbmVzICglIG9mIHBvcHVsYXRpb24p77yaU0kuUE9WLk5BSEMgW1tMaW5rXShodHRwczovL2RhdGEud29ybGRiYW5rLm9yZy9pbmRpY2F0b3IvU0kuUE9WLk5BSEMpXQoKICAgIC0gICDml6XmnKzjga/vvJ8gW1tXaWtpcGVkaWFdKGh0dHBzOi8vamEud2lraXBlZGlhLm9yZy93aWtpLyVFNiU5NyVBNSVFNiU5QyVBQyVFMyU4MSVBRSVFOCVCMiVBNyVFNSU5QiVCMCldCgotICAgXCQyLjE1L+aXpSAoXCQ2NS40L+aciCwgNzg1L+W5tCksIFwkMy42Ne+8iFwkMTExLjAv5pyILCBcJDEsMzMyL+W5tO+8iSwgXCQ2Ljg177yIXCQyMDguNC/mnIgsIFwkMiw1MDAv5bm077yJCgogICAgLSAgIFBvdmVydHkgaGVhZGNvdW50IHJhdGlvIGF0IFwkMi4xNSBhIGRheSAoMjAxNyBQUFApICglIG9mIHBvcHVsYXRpb24p77yaU0kuUE9WLkREQVkgW1tMaW5rXShodHRwczovL2RhdGEud29ybGRiYW5rLm9yZy9pbmRpY2F0b3IvU0kuUE9WLkREQVkpXQoKICAgIC0gICBQb3ZlcnR5IGhlYWRjb3VudCByYXRpbyBhdCBcJDMuNjUgYSBkYXkgKDIwMTcgUFBQKSAoJSBvZiBwb3B1bGF0aW9uKe+8mlNJLlBPVi5MTUlDIFtbTGlua10oaHR0cHM6Ly9kYXRhLndvcmxkYmFuay5vcmcvaW5kaWNhdG9yL1NJLlBPVi5MTUlDKV0KCiAgICAtICAgUG92ZXJ0eSBoZWFkY291bnQgcmF0aW8gYXQgXCQ2Ljg1IGEgZGF5ICgyMDE3IFBQUCkgKCUgb2YgcG9wdWxhdGlvbinvvJpTSS5QT1YuVU1JQyBbW0xpbmtdKGh0dHBzOi8vZGF0YS53b3JsZGJhbmsub3JnL2luZGljYXRvci9TSS5QT1YuVU1JQyldCgojIyMg5rqW5YKZCgpgYGB7cn0KbGlicmFyeSh0aWR5dmVyc2UpCmxpYnJhcnkoV0RJKQpgYGAKCiMjIyDjg4fjg7zjgr/jga7oqq3jgb/ovrzjgb/vvIhpbXBvcnRpbmfvvIkKCui/veWKoOaDheWgse+8iOWcsOWfn+ODu+aJgOW+l+ODrOODmeODq++8ieOCkuiqreOBv+i+vOOBv+OBn+OBhOOBruOBp+OAgWV4dHJhPVRSVUUg44Go44GX44Gm44GC44KK44G+44GZ44CCCgoqKirmnIDliJ3jga7vvJHlm57nm67jga/jgIHjgYvjgarjgonjgZrlrp/ooYzjgZfjgabjgY/jgaDjgZXjgYTjgIIqKioKCmBgYHtyIGV2YWw9RkFMU0V9CmRmX3BvdmVydHlfcmF0ZSA8LSBXREkoCiAgaW5kaWNhdG9yID0gYyhyYXRpbyA9ICJTSS5QT1YuTkFIQyIsCiAgICAgICAgICAgICAgICB1bmRlcl8yLjE1ID0gIlNJLlBPVi5EREFZIiwKICAgICAgICAgICAgICAgIHVuZGVyXzMuNjUgPSAiU0kuUE9WLkxNSUMiLAogICAgICAgICAgICAgICAgdW5kZXJfNi44NSA9ICJTSS5QT1YuVU1JQyIpLAogIGV4dHJhID0gVFJVRSkKYGBgCgojIyMjIOS/neWtmOOBqOiqreOBv+i+vOOBvwoK77yS5Zue55uu44GL44KJ44Gv44CBYGRhdGFgIOOBi+OCieiqreOBv+i+vOOCgeOCi+OCiOOBhuOBq+OBl+OBpuOBiuOBjeOBvuOBmeOAggoKKioq5pyA5Yid44Gu77yR5Zue55uu44Gv44CB44GL44Gq44KJ44Ga5a6f6KGM44GX44Gm44GP44Gg44GV44GE44CCKioqCgpgYGB7ciBldmFsPUZBTFNFfQp3cml0ZV9jc3YoZGZfcG92ZXJ0eV9yYXRlLCAiZGF0YS9wb3ZlcnR5X3JhdGUuY3N2IikKYGBgCgpgYGB7cn0KZGZfcG92ZXJ0eV9yYXRlIDwtIHJlYWRfY3N2KCJkYXRhL3BvdmVydHlfcmF0ZS5jc3YiKQpgYGAKCiMjIyDjg4fjg7zjgr/jgpLopovjgabjgb/jgojjgYYgKHZpZXdpbmcpCgpgZGZfcG92ZXJ0eV9yYXRlYCDjgb7jgZ/jga/jgIFgaGVhZChkZl9wb3ZlcnR5X3JhdGUpYCDjgajjgIFgc3RyKGRmX3BvdmVydHlfcmF0ZSlgCgpgYGB7cn0KZGZfcG92ZXJ0eV9yYXRlCmBgYAoKYGBge3J9CnN0cihkZl9wb3ZlcnR5X3JhdGUpCmBgYAoKIyMjIOWkieaVsOOBrumBuOaKnu+8iHNlbGVjdGluZ++8iQoK5Yip55So44GX44Gq44GE5aSJ5pWw44KC44GC44KL44Gu44GnIHNlbGVjdCDjgpLkvb/jgaPjgablpInmlbDjgpLmuJvjgonjgZfjgb7jgZnjgILopovjgoTjgZnjgYTjgojjgYbjgavjgIFgdW5kZXJfMi4xNWAg44GMIE5BIOOBruOCguOBruOBr+OAgeWJiumZpOOBl+OBpuOBguOCiuOBvuOBmeOAggoKYGBge3J9CmRmX3BvdmVydHlfcmF0ZV9zZWxlY3RlZCA8LSBkZl9wb3ZlcnR5X3JhdGUgfD4gZHJvcF9uYSh1bmRlcl8yLjE1KSB8PgogIHNlbGVjdChjb3VudHJ5LCB5ZWFyLCByYXRpbywgdW5kZXJfMi4xNSwgdW5kZXJfMy42NSwgdW5kZXJfNi44NSwgcmVnaW9uKQpkZl9wb3ZlcnR5X3JhdGVfc2VsZWN0ZWQgCmBgYAoKKirnt7Tnv5LjgIDmnIDlvozjgavlsJHjgZfliqDjgYjjgovjgajml6XmnKzjgavjgaTjgYTjgabopovjgovjgZPjgajjgYzjgafjgY3jgb7jgZnjgILjganjgYbjgZfjgb7jgZnjgYvjgIIqKgoKYGBge3J9CmRmX3BvdmVydHlfcmF0ZV9zZWxlY3RlZApgYGAKCiMjIyDlpInlvaLvvIhXaWRlIHRvIExvbmcgRGF0Ye+8iQoK5Zub44Gk44Gu5oyH5qiZ44KS5ZCM5pmC44Gr44GE44GP44Gk44GL6YG45oqe44GX5q+U6LyD44GX44Gf44GE44Gu44Gn44CB5LiA44Gk44Gu5YiX77yI5aSJ5pWw77yJ44Gr44Gq44KJ44G544Gf44CB57im6ZW344OH44O844K/77yIbG9uZyBkYXRh77yJ44KC5L2c5oiQ44GX44Gm44GK44GN44G+44GZ44CCCgpgcGl2b3RfbG9uZ2VyKHJhdGlvOnVuZGVyXzYuODUsIG5hbWVzX3RvID0gImxldmVsIiwgdmFsdWVzX3RvID0gInZhbHVlIilgCgrjgZPjgZPjgafjga/jgIFgcmF0aW9gIOOBi+OCiSBgdW5kZXJfNi44NWAg44KS44CBYGxldmVsYCDjgajjgYTjgYblkI3liY3jga7liJfjgavjgarjgonjgbnjgIHlgKTjgpIgYHZhbHVlYCDjgajjgYTjgYbliJfjgavkuKbjgbnjgovjgojjgYbjgavjgZfjgabjgYLjgorjgb7jgZnjgIIKCueiuuiqjeOBmeOCi+OBqOOBjeOBr+OAgXZhbHVlIOOBjCBOQSDjga7jgoLjga7jga/pmaTjgY3jgIFjb3VudHJ5IOOBqOOAgWlzbzJjIOOBqOOAgWxldmVsIOOBqCB2YWx1ZSDjga7pg6jliIbjgaDjgZHlj5bjgorlh7rjgZfjgabnorroqo3jgZfjgabjgYTjgb7jgZnjgIIKCmBgYHtyfQpkZl9wb3ZlcnR5X3JhdGVfbG9uZyA8LSBkZl9wb3ZlcnR5X3JhdGVfc2VsZWN0ZWQgfD4gCiAgcGl2b3RfbG9uZ2VyKHJhdGlvOnVuZGVyXzYuODUsIG5hbWVzX3RvID0gImxldmVsIiwgdmFsdWVzX3RvID0gInZhbHVlIikKZGZfcG92ZXJ0eV9yYXRlX2xvbmcgfD4gZHJvcF9uYSh2YWx1ZSkgfD4gc2VsZWN0KGNvdW50cnksIGxldmVsLCB2YWx1ZSwgcmVnaW9uKQpgYGAKCiMjIyDlubTmr47jga7jg4fjg7zjgr/jga7mlbDjga7norroqo3vvIhudW1iZXIgb2YgZGF0YSBpbiBlYWNoIHllYXLvvIkKCmBgYHtyfQpkZl9wb3ZlcnR5X3JhdGVfbG9uZyB8PiBkcm9wX25hKHZhbHVlKSB8PiAKICBncm91cF9ieSh5ZWFyLCBsZXZlbCkgfD4gc3VtbWFyaXplKG4gPSBuKCkpIHw+IGFycmFuZ2UoZGVzYyh5ZWFyKSkKYGBgCgoqKuiAg+Wvn++8mioq44Gd44KM44Ge44KM44Gu5Zu944Gn44Gu6LKn5Zuw546H44Gu44OH44O844K/77yIcmF0aW/vvInjgYwg5aSa44GE5aC05ZCI44KC44CB57W25a++55qE44Gq6LKn5Zuw546H44GM5aSa44GE5aC05ZCI44KC44GC44KL44KI44GG44Gg44GM44CB5oyH5qiZ44GU44Go44Gr6ZuG6KiI44GX44Gm44G/44KL44CCCgpgYGB7cn0KZGZfcG92ZXJ0eV9yYXRlX2xvbmcgfD4gZmlsdGVyKHllYXIgJWluJSBjKDE5NjAsIDE5NzAsIDE5ODAsIDE5OTAsIDIwMDAsIDIwMTAsIDIwMjApKSB8PiBkcm9wX25hKHZhbHVlKSB8PiBncm91cF9ieSh5ZWFyLCBsZXZlbCkgfD4gc3VtbWFyaXplKG4gPSBuKCkpIHw+CiAgZ2dwbG90KGFlcyhhcy5jaGFyYWN0ZXIoeWVhciksIG4sIGZpbGwgPSBsZXZlbCkpICsgZ2VvbV9jb2wocG9zaXRpb24gPSAiZG9kZ2UiLCBjb2wgPSAiYmxhY2siLCBsaW5ld2lkaHQgPSAwLjEpICsgbGFicyh4ID0gInllYXIiLCB5ID0gIm51bWJlciBvZiBkYXRhIikKYGBgCgoqKuiAg+Wvn++8mioq44Gd44KM44Ge44KM44Gu5Zu944Gn44Gu6LKn5Zuw546H44Gu44OH44O844K/77yIcmF0aW/vvInjga/jgIEyMDAw5bm05Lul6ZmN44CBdW5kZXJfMi4xNSwgdW5kZXJfMy42NSwgdW5kZXJfNi44NSDjga/jgIHlkIzjgZjmlbDjgZrjgaTjgYLjgovjga7jgafjgIHlkIzmmYLjgavjg4fjg7zjgr/jgpLpm4bjgoHjgabjgYTjgovjgajmgJ3jgo/jgozjgovjgIIKCiMjIyDkuJbnlYzjgajjgrXjg4/jg6nnoILmvKDku6XljZfjga7jgqLjg5Xjg6rjgqvjga7jg4fjg7zjgr/jga7ntYzlubTlpInljJYKCmBgYHtyfQpkZl9wb3ZlcnR5X3JhdGVfbG9uZyB8PiAKICBmaWx0ZXIoY291bnRyeSAlaW4lIGMoIldvcmxkIiwgIlN1Yi1TYWhhcmFuIEFmcmljYSIpKSB8PiBkcm9wX25hKCkgfD4KICBnZ3Bsb3QoYWVzKHllYXIsIHZhbHVlLCBjb2wgPSBsZXZlbCwgbGluZXR5cGUgPSBjb3VudHJ5KSkgKyBnZW9tX2xpbmUoKQpgYGAKCioq6ICD5a+f77yaKipTdWItU2FoYXJhbiBBZnJpY2Eg44Gu44OH44O844K/44Gv44Gq44GE44KI44GG44Gn44GZ44CC44Gf44GX44GL44Gr44CBcmF0aW8g44Gv44CB5Zu944GU44Go44Gr5rG644KB44KL44KC44Gu44Gn44GZ44GL44KJ44CB5Zyw5Z+f44Gu5aC05ZCI44Gr44Gv44CBcmF0aW8g44Gu5YCk44Gv44Gq44GE44Gu44Gn44GX44KH44GG44CCCgpgYGB7cn0KZGZfcG92ZXJ0eV9yYXRlX2xvbmcgfD4gZmlsdGVyKHllYXIgJWluJSBjKDIwMDAsIDIwMTAsIDIwMjApKSB8PiBkcm9wX25hKHZhbHVlKSB8PiAKICBmaWx0ZXIocmVnaW9uID09ICJBZ2dyZWdhdGVzIikgfD4gZmlsdGVyKGxldmVsICVpbiUgYygicmF0aW8iLCAidW5kZXJfMi4xNSIpKSB8PiBncm91cF9ieShjb3VudHJ5LCB5ZWFyLCBsZXZlbCkgfD4gc3VtbWFyaXplKG4gPSBuKCkpCmBgYAoKU3ViIFNhaGFyYW4gQWZyaWNhIOOBr+ODh+ODvOOCv+OBr+OBguOCiuOBvuOBm+OCk+OBjOOAgee1seioiOeahOOBq+WHpueQhuOBl+OBpu+8iOW5s+Wdh+OBruOCiOOBhuOBquOCguOBruOCkuWPluOBo+OBpu+8ieihqOekuuOBmeOCi+OBk+OBqOOBr+WPr+iDveOBp+OBmeOAggoKbG9lc3MgKExvY2FsIFBvbHlub21pYWwgUmVncmVzc2lvbikg44Gv44CB5bCR44GX44Ga44Gk5Yy65YiH44Gj44Gm44CB5aSa6aCF5byP6L+R5Ly844KS5L2/44Gj44Gm44GE44KL44GE44G+44GZ44CC44Gd44GT44Gn44CB44Oe44Kk44OK44K544Gu5YCk44KC5Ye644Gm44GN44Gm44GX44G+44Gj44Gm44GE44G+44GZ44CC44GX44GL44GX44CB5aSn5L2T44Gu5YK+5ZCR44KS44G/44KL44GT44Go44Gv44Gn44GN44G+44GZ44CC5LiK44Gn6KaL44Gf44OH44O844K/44Gu5pWw44GL44KJ44CBMTk5MuW5tOS7pemZjeOBq+OBl+OBpuOBiuOBj+OBruOBjOiJr+OBhOOBp+OBl+OCh+OBhuOAggoKYGBge3J9CmRmX3BvdmVydHlfcmF0ZV9sb25nIHw+IGRyb3BfbmEodmFsdWUpIHw+IGZpbHRlcighaXMubmEocmVnaW9uKSwgcmVnaW9uICE9ICJBZ2dyZWdhdGVzIikgfD4KICBmaWx0ZXIobGV2ZWwgPT0gInVuZGVyXzIuMTUiKSB8PgogIGdncGxvdChhZXMoeWVhciwgdmFsdWUsIGNvbCA9IHJlZ2lvbikpICsgZ2VvbV9zbW9vdGgoZm9ybXVsYSA9ICd5IH4geCcsIHNlID0gRkFMU0UpCmBgYAoKYGBge3J9CmRmX3BvdmVydHlfcmF0ZV9sb25nIHw+IGRyb3BfbmEodmFsdWUpIHw+IAogIGZpbHRlcighaXMubmEocmVnaW9uKSwgcmVnaW9uICE9ICJBZ2dyZWdhdGVzIiwgeWVhciA+IDE5OTEpIHw+CiAgZmlsdGVyKGxldmVsID09ICJ1bmRlcl8yLjE1IikgfD4KICBnZ3Bsb3QoYWVzKHllYXIsIHZhbHVlLCBjb2wgPSByZWdpb24pKSArIGdlb21fc21vb3RoKGZvcm11bGEgPSAneSB+IHgnLCBtZXRob2QgPSAnbG9lc3MnLCBzZSA9IEZBTFNFKSArIGxhYnModGl0bGUgPSAiUmVnaW9uYWxseSBhZ2dyZWdhdGVkIHJhdGlvIHVuZGVyIDIuMTUgVVNEIikKYGBgCgpgYGB7cn0KZGZfcG92ZXJ0eV9yYXRlX2xvbmcgfD4gZHJvcF9uYSh2YWx1ZSkgfD4gCiAgZmlsdGVyKCFpcy5uYShyZWdpb24pLCByZWdpb24gIT0gIkFnZ3JlZ2F0ZXMiLCB5ZWFyID4gMTk5MSkgfD4KICBmaWx0ZXIobGV2ZWwgIT0gInJhdGlvIikgfD4KICBnZ3Bsb3QoYWVzKHllYXIsIHZhbHVlLCBjb2wgPSByZWdpb24sIGxpbmV0eXBlID0gbGV2ZWwpKSArIGdlb21fc21vb3RoKGZvcm11bGEgPSAneSB+IHgnLCBtZXRob2QgPSAnbG9lc3MnLCBzZSA9IEZBTFNFKSArIGxhYnModGl0bGUgPSAiUmVnaW9uYWxseSBhZ2dyZWdhdGVkIHJhdGlvIikKYGBgCgpgYGB7cn0KZGZfcG92ZXJ0eV9yYXRlX2xvbmcgfD4gZHJvcF9uYSh2YWx1ZSkgfD4gCiAgZmlsdGVyKCFpcy5uYShyZWdpb24pLCByZWdpb24gPT0gIlN1Yi1TYWhhcmFuIEFmcmljYSIsIHllYXIgPiAxOTkxKSB8PgogIGdncGxvdChhZXMoeWVhciwgdmFsdWUsIGNvbCA9IGxldmVsKSkgKyBnZW9tX3Ntb290aChmb3JtdWxhID0gJ3kgfiB4JywgbWV0aG9kID0gJ2xvZXNzJywgc2UgPSBUUlVFKSArIGxhYnModGl0bGUgPSAiU3ViLVNhaGFyYW4gcmVnaW9uIGFnZ3JlZ2F0ZWQgcmF0aW8iKQpgYGAKCiMjIyDjgrXjg4/jg6nnoILmvKDku6XljZfvvIhTdWItU2FoYXJhbiBBZnJpY2HvvIkg44Gu5Zu944Gu44OH44O844K/CgpgYGB7cn0KZGZfcG92ZXJ0eV9yYXRlX2xvbmcgfD4gIGRyb3BfbmEodmFsdWUpIHw+IAogIGZpbHRlcihyZWdpb24gPT0gIlN1Yi1TYWhhcmFuIEFmcmljYSIpIHw+IGdyb3VwX2J5KGNvdW50cnksIGxldmVsKSB8PiAKICBzdW1tYXJpemUobiA9IG4oKSkKYGBgCgojIyDjgqLjg5Xjg6rjgqvljZfpg6jvvJXjgqvlm73jga7liIbmnpAKCiMjIyDlm73jga7jg6rjgrnjg4jjga7oqK3lrpoKClNPVVRIX0FGUklDQV9GSVZFIOOBq+OAgVNvdXRoIEFmcmljYSwgTmFtaWJpYSwgRXN3YXRpbmksIEJvdHN3YW5hLCBMZXNvdGhvIOOCkuioreWumgoKYGBge3J9ClNPVVRIX0FGUklDQV9GSVZFIDwtIGMoIlNvdXRoIEFmcmljYSIsICJOYW1pYmlhIiwgIkVzd2F0aW5pIiwgIkJvdHN3YW5hIiwgIkxlc290aG8iKQpgYGAKCiMjIyDvvJXjgqvlm73jga7jg4fjg7zjgr/jgpLnorroqo0KCmBkZl9wb3ZlcnR5X3JhdGVfc2VsZWN0ZWRgIOOBqOOAgWBkZl9wb3ZlcnR5X3JhdGVfbG9uZ2Ag44Gr44Gk44GE44Gm44CB44Ki44OV44Oq44Kr5Y2X6YOo77yV44Kr5Zu944Gu44OH44O844K/44KS56K66KqNCgpgYGB7cn0KZGZfcG92ZXJ0eV9yYXRlX3NlbGVjdGVkIHw+IGZpbHRlcihjb3VudHJ5ICVpbiUgU09VVEhfQUZSSUNBX0ZJVkUpCmBgYAoKYGBge3J9CmRmX3BvdmVydHlfcmF0ZV9sb25nIHw+IGZpbHRlcihjb3VudHJ5ICVpbiUgU09VVEhfQUZSSUNBX0ZJVkUpCmBgYAoKIyMjIOWQhOiyp+WbsOeOh+OCkuaKmOOCjOe3muOCsOODqeODleOBp+aPj+OBhOOBpuOBv+OCiwoKIyMjIyDljZfjgqLjg5Xjg6rjgqvjgavjgaTjgYTjgaYKCmBgYHtyfQpkZl9wb3ZlcnR5X3JhdGVfbG9uZyB8PiAKICBmaWx0ZXIoY291bnRyeSA9PSAiU291dGggQWZyaWNhIikgfD4gZHJvcF9uYSh2YWx1ZSkgfD4KICBnZ3Bsb3QoYWVzKHllYXIsIHZhbHVlLCBjb2wgPSBsZXZlbCkpICsgZ2VvbV9saW5lKCkKYGBgCgoqKuiAg+Wvn++8mioqMjAwMOW5tOOBi+OCiTIwMDjlubTjgZTjgo3jgb7jgafmuJvlsJHjgZfjgabjgYTjgovjgYzjgIHjgZ3jga7lvozjgIHkuIrmmIflgr7lkJHjgYzopovjgonjgozjgovjgIIKCiMjIyMg77yV44Kr5Zu95ZCM5pmC44GrCgpgYGB7cn0KZGZfcG92ZXJ0eV9yYXRlX2xvbmcgfD4gCiAgZmlsdGVyKGNvdW50cnkgJWluJSBTT1VUSF9BRlJJQ0FfRklWRSkgfD4gZHJvcF9uYSh2YWx1ZSkgfD4KICBnZ3Bsb3QoYWVzKHllYXIsIHZhbHVlLCBjb2wgPSBjb3VudHJ5LCBsaW5ldHlwZSA9IGxldmVsKSkgKyBnZW9tX2xpbmUoKQpgYGAKCioq6ICD5a+f77yaKiropIfpm5Hjgafjgo/jgYvjgorjgoTjgZnjgYTjgajjga/jgYTjgYjjgarjgYQKCmBgYHtyfQpkZl9wb3ZlcnR5X3JhdGVfbG9uZyB8PiAKICBmaWx0ZXIoY291bnRyeSAlaW4lIFNPVVRIX0FGUklDQV9GSVZFKSB8PiBkcm9wX25hKHZhbHVlKSB8PiBmaWx0ZXIobGV2ZWwgIT0gInJhdGlvIikgfD4KICBnZ3Bsb3QoYWVzKHllYXIsIHZhbHVlLCBjb2wgPSBjb3VudHJ5LCBsaW5ldHlwZSA9IGxldmVsKSkgKyBnZW9tX2xpbmUoKQpgYGAKCioq6ICD5a+f77yaKirlm73jgZTjgajjgavmsbrjgoHjgZ/osqflm7DnjofjgpLjga7jgZ7jgYTjgabjgb/jgZ/jgILlpJrlsJHmlLnlloTjgZfjgZ/jgILjgZfjgYvjgZfjgIHjgYLjgajjga/lpb3jgb/jgIIKCiMjIyDvvJXjgqvlm73jga7mnIDmlrDjga7jg4fjg7zjgr8KCmBgYHtyfQpkZl9wb3ZlcnR5X3JhdGVfc2VsZWN0ZWQgfD4gCiAgZmlsdGVyKGNvdW50cnkgJWluJSBTT1VUSF9BRlJJQ0FfRklWRSkgfD4KICBkcm9wX25hKHVuZGVyXzIuMTUpIHw+IGdyb3VwX2J5KGNvdW50cnkpIHw+IGZpbHRlcih5ZWFyID09IG1heCh5ZWFyKSkgfD4gCiAgc2VsZWN0KGNvdW50cnksIHllYXIsIHJhdGlvOnVuZGVyXzYuODUpCmBgYAoKKirogIPlr5/vvJoqKuavjuW5tOODh+ODvOOCv+OBjOOBguOCi+OCj+OBkeOBp+OBr+OBquOBhOOBruOBp+OAgeOBneOCjOOBnuOBruWbveOBlOOBqOOBq+acgOaWsOOBruOCguOBruOCkuimi+OCi+OBk+OBqOOBqOOBmeOCiwoKIyMjIyDljZfjgqLjg5Xjg6rjgqvvvJXjgqvlm73jga7osqflm7DluqbjgZTjgajjga7kurrlj6Pmr5QKCmBgYHtyfQpkZl9wb3ZlcnR5X3JhdGVfbG9uZyB8PiAKICBmaWx0ZXIoY291bnRyeSAlaW4lIFNPVVRIX0FGUklDQV9GSVZFKSB8PgogIGRyb3BfbmEodmFsdWUpIHw+IGdyb3VwX2J5KGNvdW50cnkpIHw+IGZpbHRlcih5ZWFyID09IG1heCh5ZWFyKSkgfD4KICBnZ3Bsb3QoYWVzKGNvdW50cnksIHZhbHVlLCBmaWxsID0gbGV2ZWwpKSArIGdlb21fY29sKHBvc2l0aW9uID0gImRvZGdlIiwgY29sID0gImJsYWNrIiwgbGluZXdpZHRoID0gMC4xKSArIAogIGxhYnModGl0bGUgPSAiUG92ZXJ0IExldmVsIFJhdGlvIG9mIEZpdmUgQ291bnRyaWVzIiwgc3VidGl0bGUgPSAiQm90c3dhbmEgaW4gMjAxNSwgRXN3YXRpbmkgaW4gMjAxNiAsTGVzb3RvIGluIDIwMTcsIE5hbWliaWEgaW4gMjAxNSBcbmFuZCBTb3V0aCBBZnJpY2EgaW4gMjAxNCIpCmBgYAoKIyMg5L2c5qWt5omL6aCG44Go44G+44Go44KBCgotICAg44OR44OD44Kx44O844K477yIUGFja2FnZe+8ieOBruWIqeeUqO+8mgoKICAgIC0gICDjgqTjg7Pjgrnjg4jjg7zjg6vvvIhpbnN0YWxsYXRpb27vvInvvJpUb29scyBcPiBJbnN0YWxsIFBhY2thZ2VzCgogICAgLSAgIOODreODvOODie+8iGxvYWTvvIlgbGlicmFyeSh0aWR5dmVyc2UpOyBsaWJyYXJ5KFdESSk7IGxpYnJhcnkoc2hvd3RleHQpOyBsaWJyYXJ5KERlc2NUb29scylgCgotICAg44OH44O844K/44Gu5Y+W5b6X77yaYFdESShpbmRpY2F0b3IgPSBjKHBvcCA9ICJTUC5QT1AuVE9UTCIpKWAKCiAgICAtICAgYGBgIFdESShpbmRpY2F0b3IgPWBgYyhyYXRpbyA9ICJTSS5QT1YuTkFIQyIsIHVuZGVyXzIuMTUgPSAiU0kuUE9WLkREQVkiLCB1bmRlcl8zLjY1ID0gIlNJLlBPVi5MTUlDIiwgdW5kZXJfNi44NSA9ICJTSS5QT1YuVU1JQyIpLCBleHRyYSA9IFRSVUUpIGBgYAoKICAgIC0gICBkYXRhIOOBq+abuOOBjeWHuuOBl+OAgeOBneOBk+OBi+OCieiqreOBv+i+vOOCgOOBqOiJr+OBhOOAggoKICAgICAgICAtICAgYHdyaXRlX2NzdihkZl9wb3ZlcnR5X3JhdGUsICJkYXRhL3BvdmVydHlfcmF0ZS5jc3YiKWAKCiAgICAgICAgLSAgIGByZWFkX2NzdigiZGF0YS9wb3ZlcnR5X3JhdGUuY3N2IilgCgotICAg44OH44O844K/44KS6KaL44KL77yaYGRmX3BvdmVydHlfcmF0ZWAgLCBgaGVhZChkZl9wb3ZlcnR5X3JhdGUpYCwgYHN0cihkZl9wb3ZlcnR5X3JhdGUpYAoKLSAgIOWkieaVsOOBrumBuOaKnu+8mmBzZWxlY3QoY291bnRyeSwgeWVhciwgcmF0aW8sIHVuZGVyXzIuMTUsIHVuZGVyXzMuNjUsIHVuZGVyXzYuODUsIHJlZ2lvbilgCgotICAg44OH44O844K/44Gu5aSJ5b2i77yITG9uZyBkYXRh77yJ77yaYHBpdm90X2xvbmdlcihyYXRpbzp1bmRlcl82Ljg1LCBuYW1lc190byA9ICJsZXZlbCIsIHZhbHVlc190byA9ICJ2YWx1ZSIpYAoKLSAgIOeJueWumuOBruihjOOBruWPluW+l++8mmBmaWx0ZXIoKSwgZHJvcF9uYSgpLCBkaXN0aW5jdCgpYAoKLSAgIOihjOOBrumghueVquOBruS4puOBs+abv+OBiO+8mmBhcnJhbmdlKGRlc2MoeWVhcikpYAoKLSAgIOOCsOODq+ODvOODl+WIhuOBke+8mmBncm91cF9ieSgpYCAsIGBncm91cF9ieSh5ZWFyLCBsZXZlbCkgfD4gc3VtbWFyaXplKG4gPSBuKCkpYAoKIyMjIOWPr+imluWMlgoKLSAgIOaKmOOCjOe3muOCsOODqeODlQoKICAgIC0gICBgZ2dwbG90KGFlcyh4ID0geWVhciwgeSA9IHVuZGVyXzIuMTUpICsgZ2VvbV9saW5lKClgCgogICAgLSAgIGBnZ3Bsb3QoYWVzKHggPSB5ZWFyLCB5ID0gdW5kZXJfMi4xNSwgY29sID0gY291bnRyeSkgKyBnZW9tX2xpbmUoKWAKCi0gICDjg5Ljgrnjg4jjgrDjg6njg6DvvIjluqbmlbDliIbluIPvvIkKCiAgICAtICAgYGdncGxvdChhZXModW5kZXJfMi4xNSwgZmlsbCA9IHJlZ2lvbikpICsgZ2VvbV9oaXN0b2dyYW0oYmlucyA9IDE1KWAKCi0gICDmo5LjgrDjg6njg5UKCiAgICAtICAgYGdncGxvdChhZXMoeWVhcikpICsgZ2VvbV9iYXIoKWAKCiAgICAtICAgYGdncGxvdChhZXMobGV2ZWxzLCB2YWx1ZSkpICsgZ2VvbV9jb2woKWAKCiAgICAtICAgYGdncGxvdChhZXMoeCA9IGxldmVscywgeSA9IHZhbHVlLCBmaWxsID0gY291bnRyeSkpICsgZ2VvbV9jb2wocG9zaXRpb24gPSAiZG9kZ2UiKWAKCiAgICAtICAgYGdncGxvdChhZXMoeCA9IGdpbmksIGZpbGwgPSByZWdpb24pKSArIGdlb21faGlzdG9ncmFtKClgCgotICAg5pWj5biD5Zuz77yIK+WbnuW4sOebtOe3mu+8iQoKICAgIC0gICBgZ2dwbG90KGFlcyhnaW5pLCA5MC0xMDApKSArIGdlb21fcG9pbnQoKWAKCiAgICAtICAgYGdncGxvdChhZXMoZ2luaSwgODAtMTAwKSkgKyBnZW9tX3BvaW50KCkgKyBnZW9tX3Ntb290aChmb3JtdWxhID0gJ3kgfiB4JywgbWV0aG9kID0gImxtIilgCgoqKirluLjjgavjgIHogIPlr5/jgIHmsJfjgaXjgYTjgZ/jgZPjgajjgpLjgIHoqJjpjLLjgZfjgabjgY/jgaDjgZXjgYTjgIIqKioKCiMjIOiqsumhjAoK44OH44O844K/44Gv44CB5LiK44Gn5L2/44Gj44Gf5LqM44Gk44Gu44OH44O844K/44KS5L2/44GE44G+44GZ44CCCgotICAgYGRmX3BvdmVydHlfcmF0ZV9zZWxlY3RlZGAgOiB3aWRlIOODh+ODvOOCv+OBqOiogOOCj+OCjOOCi+OCguOBruOBp+OBmeOAguiyp+WbsOeOh++8iGB1bmRlcl8yLjE1YO+8ieOBruODh+ODvOOCv+OCkuWQq+OBvuOBquOBhOOCguOBruOBr+WJiumZpOOBl+OBpuOBguOCiuOBvuOBmeOAggoKLSAgIGBkZl9wb3ZlcnR5X3JhdGVfbG9uZ2Ag77yabG9uZyDjg4fjg7zjgr/jgajoqIDjgo/jgozjgovjgoLjga7jgafjgZnjgIIKCiMjIyDnt7Tnv5LvvJrjg4fjg7zjgr/jga7norroqo0KCjEuICBgZGZfcG92ZXJ0eV9yYXRlX3NlbGVjdGVkYCDjgajjgIFgZGZfcG92ZXJ0eV9yYXRlX2xvbmdgIOOCkuimi+OBpuOBv+OBvuOBl+OCh+OBhuOAguOBqeOBhuOBl+OBvuOBmeOBi+OAggoKKipIaW5077yaKirjgZ3jga7jgb7jgb7jg4fjg7zjgr/jgIFoZWFkKOODh+ODvOOCvynjgIFFbnZpcm9ubWVudCDjgYvjgonjgIHjg4fjg7zjgr/jgpLpgbjmip4KCmBgYHtyfQoKYGBgCgpgYGB7cn0KCmBgYAoKMi4gIOWNl+OCouODoeODquOCq+OBp+OAgeOCuOODi+aMh+aVsOOBjOWkp+OBjeOBhOOBruOBr+OAgeS7peS4i+OBru+8lOOBpOOBruWbveOBp+OBmeOAglN1cmluYW1lLCBCZWxpemUsIEJyYXppbCwgQ29sb21iaWHjgILjgZ3jgozjgpLjgIFDSE9TRU5fR0lOSV9DT1VOVFJJRVMg44Gr5Luj5YWl44GX44Gm44GP44Gg44GV44GE44CCCgoqKkhpbnTvvJrjgIwqKlNPVVRIX0FGUklDQV9GSVZFIOOBq+OAgVNvdXRoIEFmcmljYSwgTmFtaWJpYSwgRXN3YXRpbmksIEJvdHN3YW5hLCBMZXNvdGhvIOOCkuioreWumuOAjeOCkuWPgueFpwoKYGBge3J9CgpgYGAKCjMuICBgZGZfcG92ZXJ0eV9yYXRlX3NlbGVjdGVkYOOBruWNl+OCouODoeODquOCq++8lOOCq+WbveOBruacgOaWsOOBruODh+ODvOOCv+OBoOOBkeOCkuihqOekuuOBl+OBpuOBv+OBvuOBl+OCh+OBhuOAggoKKipIaW5077yaKipTT1VUSF9BRlJJQ0FfRklWRSDjga7loLTlkIjjganjga7jgojjgYbjgavjgZfjgZ/jgYvogIPjgYjjgabjgb/jgb7jgZfjgofjgYbjgIIKCmBgYHtyfQoKYGBgCgoqKuawl+OBpeOBhOOBn+OBk+OBqCoqCgotICAgCgojIyMg5Y2X44Ki44Oh44Oq44Kr77yU44Kr5Zu944Gr44Gk44GE44Gm44Gu5YiG5p6QCgo0LiAg77yU44Kr5Zu944CB44Gd44KM44Ge44KM44Gu44CB6LKn5Zuw546H44Gu5bm05qyh5aSJ5YyW44KS5oqY44KM57ea44Kw44Op44OV44Gr44KI44KK6KGo56S6CgrkuIvjga/jgIHjg5bjg6njgrjjg6vjgavjgaTjgYTjgabjga7jgoLjga7jgafjgZnjgYzjgIHku5bjga7vvJPjgqvlm73jgafjgIHjg4fjg7zjgr/jgYzjgYLjgovjgoLjga7jgavjgaTjgYTjgabjga/jgIHlkIzmp5jjga7jgrDjg6njg5XjgpLmj4/jgYTjgabjgY/jgaDjgZXjgYTjgIIKCmBgYHtyfQpkZl9wb3ZlcnR5X3JhdGVfbG9uZyB8PiBmaWx0ZXIoY291bnRyeSA9PSAiQnJhemlsIikgfD4gZHJvcF9uYSh2YWx1ZSkgfD4KICBnZ3Bsb3QoYWVzKHllYXIsIHZhbHVlLCBjb2wgPSBsZXZlbCkpICsgZ2VvbV9saW5lKCkgKwogIGxhYnModGl0bGUgPSAiUG92ZXJ0eSBSYXRpbyBvZiBCcmFzaWwiKQpgYGAKCmBgYHtyfQoKYGBgCgoqKuawl+OBpeOBhOOBn+OBk+OBqCoqCgotICAgCgojIyMjIOWNl+OCouODoeODquOCq++8lOOCq+WbveOBruiyp+WbsOW6puOBlOOBqOOBruS6uuWPo+avlOOBruajkuOCsOODqeODlQoKNS4gIOiyp+WbsOW6puOBlOOBqOOBruS6uuWPo+avlOOBruajkuOCsOODqeODleOCkuaPj+OBhOOBpuOBv+OBvuOBl+OCh+OBhuOAggoKSGludDog5Y2X44Ki44OV44Oq44Kr77yV44Kr5Zu944Gu6LKn5Zuw5bqm44GU44Go44Gu5Lq65Y+j5q+U44Gu5qOS44Kw44Op44OVCgpgYGB7cn0KCmBgYAoKKirmsJfjgaXjgYTjgZ/jgZPjgagqKgoKLSAgIAoKIyMjIOe3tOe/ku+8muiyp+WbsOW6puOBlOOBqOOBruS6uuWPo+avlAoK6Kqy6aGM44Gr44GC44KLIDEg44GL44KJIDUuCgrmj5Dlh7rjga/jgZfjgarjgY/jgaboia/jgYTjgafjgZnjgYzjgIHjgZzjgbLlrp/pmpvjgavmiYvjgpLli5XjgYvjgZfjgablrp/ooYzjgZfjgabjgY/jgaDjgZXjgYTjgIIKCiMjIOWPguiAg+aWh+eMrgoKMS4gIOOAjOOBv+OCk+OBquOBruODh+ODvOOCv+OCteOCpOOCqOODs+OCuSAtIERhdGEgU2NpZW5jZSBmb3IgQWxs44CNW1vjga/jgZjjgoHjgabjga7jg4fjg7zjgr/jgrXjgqTjgqjjg7PjgrldKGh0dHBzOi8vaWN1LWhzdXp1a2kuZ2l0aHViLmlvL2RzNGFqL2ZpcnN0LWV4YW1wbGUuaHRtbCNmaXJzdC1leGFtcGxlKV0KCiAgICAtICAg5bCO5YWl44Go44GX44Gm44CBR0RQ77yI5Zu95YaF57eP55Sf55Sj77yJ44Gu44OH44O844K/44KS5L2/44Gj44Gm6Kqs5piO44GX44Gm44GE44G+44GZ44CCCgoyLiAgUG9zaXQgUmVjaXBlc++8iOaXpyBQb3NpdCBQcmltZXJz77yJOiBUaGUgQmFzaWNzIOWvvuipseWei+OBrua8lOe/kuOCteOCpOODiOOBruacgOWInSBbW0xpbmtdKGh0dHBzOi8vcG9zaXQuY2xvdWQvbGVhcm4vcmVjaXBlcyldCgozLiAgUG9zaXQgQ2hlYXQgU2hlZXQuIOaXqeimi+ihqOOBp+OBmeOAguWNsOWIt+OBl+OBpuS9v+OBhuOBn+OCgeOBq+OAgVBERiDjgoLmj5DkvpvjgZfjgabjgYTjgb7jgZnjgIJbW1NpdGUgTGlua10oaHR0cHM6Ly9yc3R1ZGlvLmdpdGh1Yi5pby9jaGVhdHNoZWV0cy8pXQoKNC4gIERhdGFDYW1wIENoZWF0IFNoZWV0OiBUaWR5dmVyc2UgZm9yIEJpZ2lubmVycy4g44OH44O844K/44K144Kk44Ko44Oz44K544Gu5pWZ6IKy44KS44GX44Gm44GE44KL5Lya56S+44Gu5pep6KaL6KGo44Gu5LiA44Gk44Gn44GZ44CC5Z+65pys44GM57Ch5Y2Y44Gr44G+44Go44G+44Gj44Gm44GE44G+44GZ44CCW1tMaW5rXShodHRwczovL2ltYWdlcy5kYXRhY2FtcC5jb20vaW1hZ2UvdXBsb2FkL3YxNjc2MzAyNjk3L01hcmtldGluZy9CbG9nL1RpZHl2ZXJzZV9DaGVhdF9TaGVldC5wZGYpXQo=