課題

以下の指標の中から、一つを選択して、データの概要(description)を記録し、データを WDI で取得し、以下の分析をする。

  1. 各年毎のデータの数の棒グラフ
  2. 日本のデータの年の降順での表示
  3. 経年変化を表す折れ線グラフ
    1. 日本
    2. 南部アフリカ関税同盟の5カ国
    3. 選択したいくつかの国
  4. データが十分ある最近の年の値のヒストグラム
  5. データが十分ある最近の年の値の10カ国の値の棒グラフ
    1. 値が大きい方から
    2. 値が小さい方から

それぞれについて考察(気づいたこと、疑問など)を記す

2023.1.27. 23:59 までに Moodle の演習の課題ボックスに提出したものについては、なるべく、早く見て、フィードバックを書きます。それ以降に提出されたものも見ますが、フィードバックは遅くなると思ってください。

データ

  1. Government expenditure on education, total (% of GDP):SE.XPD.TOTL.GD.ZS [Link]

  2. School enrollment, primary (% gross):SE.PRM.ENRR [Link]

  3. School enrollment, secondary (% gross):SE.SEC.ENRR [Link]

  4. School enrollment, tertiary (% gross):SE.TER.ENRR [Link]

  5. Mortality rate, under-5 (per 1,000 live births):SH.DYN.MORT [Link]

  6. Incidence of HIV (% of uninfected population ages 15-49):SH.HIV.INCD.ZS [Link]

  7. School enrollment, primary and secondary (gross), gender parity index (GPI):SE.ENR.PRSC.FM.ZS [Link]

  8. Ratio of female to male labor force participation rate (%) (modeled ILO estimate):SL.TLF.CACT.FM.ZS [Link]

  9. Unemployment, female (% of female labor force) (modeled ILO estimate):SL.UEM.TOTL.FE.ZS [Link]

  10. Unemployment, male (% of male labor force) (modeled ILO estimate):SL.UEM.TOTL.MA.ZS [Link]

  11. Net official development assistance and official aid received (current US$) DT.ODA.ALLD.CD [Link]

1. 国の教育に関する支出

概要:国内総生産(GDP)に対する、国の教育に関する支出(Government expenditure on education, total (% of GDP))のデータの分析を行う

データ

  • Government expenditure on education, total (% of GDP):SE.XPD.TOTL.GD.ZS [Link]

  • General government expenditure on education (current, capital, and transfers) is expressed as a percentage of GDP. It includes expenditure funded by transfers from international sources to government. General government usually refers to local, regional and central governments.

データ情報

  • データ名:国の教育関連支出(GDP比 %)

  • データコード:SE.XPD.TOTL.GD.ZS

  • 変数名:ed_exp

  • 概要:教育に対する政府の一般支出(経常、資本、移転)は GDP の割合で表されます。これには、国際資金源から政府への送金によって資金提供された支出が含まれます。一般政府とは通常、地方自治体、地域政府、中央政府を指します。

データの取得

準備

library(tidyverse)
library(WDI)

WDI パッケージを使って、直接データをダウンロードし、変数名を、ed_exp に指定。

df_ed_exp <- WDI(indicator = c(ed_exp = "SE.XPD.TOTL.GD.ZS"))
write_csv(df_ed_exp, "data/ed_exp.csv")
df_ed_exp <- read_csv("data/ed_exp.csv")
Rows: 16758 Columns: 5── Column specification ────────────────────────────────────────────────────────────────
Delimiter: ","
chr (3): country, iso2c, iso3c
dbl (2): year, ed_exp
ℹ 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.

データの確認

df_ed_exp
str(df_ed_exp)
spc_tbl_ [16,758 × 5] (S3: spec_tbl_df/tbl_df/tbl/data.frame)
 $ country: chr [1:16758] "Africa Eastern and Southern" "Africa Eastern and Southern" "Africa Eastern and Southern" "Africa Eastern and Southern" ...
 $ iso2c  : chr [1:16758] "ZH" "ZH" "ZH" "ZH" ...
 $ iso3c  : chr [1:16758] "AFE" "AFE" "AFE" "AFE" ...
 $ year   : num [1:16758] 2022 2021 2020 2019 2018 ...
 $ ed_exp : num [1:16758] 3.91 4.63 4.35 4.54 4.74 ...
 - attr(*, "spec")=
  .. cols(
  ..   country = col_character(),
  ..   iso2c = col_character(),
  ..   iso3c = col_character(),
  ..   year = col_double(),
  ..   ed_exp = col_double()
  .. )
 - attr(*, "problems")=<externalptr> 
REGION <- c("1A", "1W", "4E", "7E", "8S", "B8", "EU", "F1", "OE", "S1", 
"S2", "S3", "S4", "T2", "T3", "T4", "T5", "T6", "T7", "V1", "V2", 
"V3", "V4", "XC", "XD", "XE", "XF", "XG", "XH", "XI", "XJ", "XL", 
"XM", "XN", "XO", "XP", "XQ", "XT", "XU", "XY", "Z4", "Z7", "ZF", 
"ZG", "ZH", "ZI", "ZJ", "ZQ", "ZT")
df_ed_exp |> filter(iso2c %in% REGION) |> distinct(country, iso2c)
df_ed_exp |> filter(!(iso2c %in% REGION)) |> distinct(country, iso2c)

分析する国のリスト

南部アフリカ関税同盟 The Southern African Customs Union (SACU)

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

ラテンアメリカでジニ指数が大きい4カ国

CHOSEN_COUNTRIES <- c("Suriname", "Belize", "Brazil", "Colombia")

分析

1. 各年毎のデータの数の棒グラフ

df_ed_exp |> drop_na(ed_exp) |> filter(!(iso2c %in% REGION)) |>
  ggplot(aes(year)) + geom_bar()

視覚化

2. 日本の教育費(% of GDP)

df_ed_exp |> filter(country == "Japan") |> 
  drop_na(ed_exp) |> arrange(desc(year))

3. 経年変化

a. 日本

df_ed_exp |> filter(country == "Japan") |> drop_na(ed_exp) |>
  ggplot(aes(year, ed_exp)) + geom_line()

気づいたこと・疑問

  • 1970年代の急激な上昇、1990年ごろの急激な現象は、何が原因なのだろう。

  • 2014年ごろから減少、2018年ごろから増加、2020年から2021年は減少。

b. 南部アフリカ関税同盟

df_ed_exp |> filter(country %in% SOUTH_AFRICA_FIVE) |> drop_na(ed_exp) |>
  ggplot(aes(year, ed_exp)) + geom_line(aes(col = country))

参考:平均的な値を曲線で表すことも可能です。loess を使うと滑らかな曲線で近似してくれます。

df_ed_exp |> filter(country %in% SOUTH_AFRICA_FIVE) |> drop_na(ed_exp) |>
  ggplot(aes(year, ed_exp)) + geom_line(aes(col = country)) +
  geom_smooth(formula = 'y~x', method = "loess", se = FALSE)

気づいたこと・疑問

  • 平均で見ると、上昇してきており、7% 程度という大きな割合になっている。

c. ラテンアメリカ4カ国

df_ed_exp |> filter(country %in% CHOSEN_COUNTRIES) |> drop_na(ed_exp) |>
  ggplot(aes(year, ed_exp)) + geom_line(aes(col = country))

参考:平均的な値を曲線で表すことも可能です。loess を使うと滑らかな曲線で近似してくれます。

df_ed_exp |> filter(country %in% CHOSEN_COUNTRIES) |> drop_na(ed_exp) |>
  ggplot(aes(year, ed_exp)) + geom_line(aes(col = country)) +
  geom_smooth(formula = 'y~x', method = "loess", se = FALSE)

分布

データの数から、まずは、2020年について見てみる。

df_ed_exp |> filter(year == 2020) |> filter(!(country %in% REGION))|>
  drop_na(ed_exp) |>
  ggplot(aes(ed_exp)) + geom_histogram(binwidth = 1)

参考:SACU の5カ国の値を縦線で書き込むには下のようにします。

df_ed_exp |> filter(year == 2020) |> filter(country %in% SOUTH_AFRICA_FIVE) 

参考:日本とSACU の5カ国の値を縦線で書き込むには下のようにします。

JP <- 3.416981
SAF <- df_ed_exp |> filter(year == 2020) |> filter(country %in% SOUTH_AFRICA_FIVE) |> pull(ed_exp)
df_ed_exp |> filter(year == 2020) |> filter(!(country %in% REGION))|>
  drop_na(ed_exp) |>
  ggplot() + geom_histogram(aes(ed_exp), binwidth = 1) +
  geom_vline(xintercept = SAF, col = "red") + geom_vline(xintercept = JP, col = "blue") +labs(title = "2020年の教育費の対GDP百分率", subtitle = "日本:青、SACU:赤")

データが十分ある最近の年の値の10カ国の値の棒グラフ

a. 値が大きい方から

df_ed_exp |> filter(year == 2020) |> drop_na(ed_exp) |> 
  filter(!(iso2c %in% REGION))|>
  arrange(desc(ed_exp)) |> head(10) |> 
  ggplot(aes(fct_reorder(country, ed_exp), ed_exp)) + geom_col() + 
  coord_flip() + labs(title = "Top 10 Countries", x = "country", y = "Government expenditure on education, total (% of GDP)")

b. 値が小さい方から

df_ed_exp |> filter(year == 2020) |> drop_na(ed_exp) |> 
  filter(!(iso2c %in% REGION))|>
  arrange(ed_exp) |> head(10) |> 
  ggplot(aes(fct_rev(fct_reorder(country, ed_exp)), ed_exp)) + geom_col() + 
  coord_flip() + labs(title = "Lowest 10 Countries", x = "country", y = "Government expenditure on education, total (% of GDP)")

2. 初等学校就学率

データ

  • School enrollment, primary (% gross):SE.PRM.ENRR [Link]
  • Gross enrollment ratio is the ratio of total enrollment, regardless of age, to the population of the age group that officially corresponds to the level of education shown. Primary education provides children with basic reading, writing, and mathematics skills along with an elementary understanding of such subjects as history, geography, natural science, social science, art, and music.

データ情報

  • データ名:初等学校就学率

  • データコード:SE.PRM.ENRR

  • 変数名:primary

  • 概要:総就学率は、年齢に関係なく、表示されている教育レベルに正式に対応する年齢層の人口に対する総就学者数の比率です。初等教育では、子供たちに基本的な読み書き、数学のスキルと、歴史、地理、自然科学、社会科学、芸術、音楽などの科目の初歩的な理解を提供します。

データの取得

準備

library(tidyverse)
library(WDI)

WDI パッケージを使って、直接データをダウンロードし、変数名を、ed_exp に指定。

df_primary <- WDI(indicator = c(primary = "SE.PRM.ENRR"))
write_csv(df_primary, "data/primary.csv")
df_primary <- read_csv("data/primary.csv")
Rows: 16758 Columns: 5── Column specification ────────────────────────────────────────────────────────────────
Delimiter: ","
chr (3): country, iso2c, iso3c
dbl (2): year, primary
ℹ 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.

データの確認

df_primary
str(df_primary)
spc_tbl_ [16,758 × 5] (S3: spec_tbl_df/tbl_df/tbl/data.frame)
 $ country: chr [1:16758] "Africa Eastern and Southern" "Africa Eastern and Southern" "Africa Eastern and Southern" "Africa Eastern and Southern" ...
 $ iso2c  : chr [1:16758] "ZH" "ZH" "ZH" "ZH" ...
 $ iso3c  : chr [1:16758] "AFE" "AFE" "AFE" "AFE" ...
 $ year   : num [1:16758] 2022 2021 2020 2019 2018 ...
 $ primary: num [1:16758] 105 105 106 105 104 ...
 - attr(*, "spec")=
  .. cols(
  ..   country = col_character(),
  ..   iso2c = col_character(),
  ..   iso3c = col_character(),
  ..   year = col_double(),
  ..   primary = col_double()
  .. )
 - attr(*, "problems")=<externalptr> 
REGION <- c("1A", "1W", "4E", "7E", "8S", "B8", "EU", "F1", "OE", "S1", 
"S2", "S3", "S4", "T2", "T3", "T4", "T5", "T6", "T7", "V1", "V2", 
"V3", "V4", "XC", "XD", "XE", "XF", "XG", "XH", "XI", "XJ", "XL", 
"XM", "XN", "XO", "XP", "XQ", "XT", "XU", "XY", "Z4", "Z7", "ZF", 
"ZG", "ZH", "ZI", "ZJ", "ZQ", "ZT")
df_primary |> filter(iso2c %in% REGION) |> distinct(country, iso2c)

分析する国のリスト

南部アフリカ関税同盟 The Southern African Customs Union (SACU)

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

ラテンアメリカでジニ指数が大きい4カ国

CHOSEN_COUNTRIES <- c("Suriname", "Belize", "Brazil", "Colombia")

分析

1. 各年毎のデータの数の棒グラフ

df_primary |> drop_na(primary) |> filter(!(iso2c %in% REGION)) |>
  ggplot(aes(year)) + geom_bar()

視覚化

2. 日本の初等学校就学率

df_primary |> filter(country == "Japan") |> 
  drop_na(primary) |> arrange(desc(year))

3. 経年変化

a. 日本

df_primary |> filter(country == "Japan") |> drop_na(primary) |>
  ggplot(aes(year, primary)) + geom_line()

気づいたこと・疑問

  • 1970年代の急激な上昇・下降、1980年ごろから上昇、そこで、100 を超えている。1995年ごろからは、減少しているが、まだ、100以上である。何が原因なのだろう。

b. 南部アフリカ関税同盟

df_primary |> filter(country %in% SOUTH_AFRICA_FIVE) |> drop_na(primary) |>
  ggplot(aes(year, primary)) + geom_line(aes(col = country))

参考:平均的な値を曲線で表すことも可能です。loess を使うと滑らかな曲線で近似してくれます。

df_primary |> filter(country %in% SOUTH_AFRICA_FIVE) |> drop_na(primary) |>
  ggplot(aes(year, primary)) + geom_line(aes(col = country)) +
  geom_smooth(formula = 'y~x', method = "loess", se = FALSE)

気づいたこと・疑問

  • 100を超えている。

c. ラテンアメリカ4カ国

df_primary |> filter(country %in% CHOSEN_COUNTRIES) |> drop_na(primary) |>
  ggplot(aes(year, primary)) + geom_line(aes(col = country))

参考:平均的な値を曲線で表すことも可能です。loess を使うと滑らかな曲線で近似してくれます。

df_primary |> filter(country %in% CHOSEN_COUNTRIES) |> drop_na(primary) |>
  ggplot(aes(year, primary)) + geom_line(aes(col = country)) +
  geom_smooth(formula = 'y~x', method = "loess", se = FALSE)

分布

データの数から、まずは、2020年について見てみる。

df_primary |> filter(year == 2020) |> filter(!(country %in% REGION))|>
  drop_na(primary) |>
  ggplot(aes(primary)) + geom_histogram(binwidth = 5)

参考:SACU の5カ国の値を縦線で書き込むには下のようにします。

df_primary |> filter(year == 2020) |> filter(country %in% SOUTH_AFRICA_FIVE) 

参考:日本とSACU の5カ国の値を縦線で書き込むには下のようにします。

JP <- 102.73683
SAF <- df_primary |> filter(year == 2020) |> filter(country %in% SOUTH_AFRICA_FIVE) |> pull(primary)
df_primary |> filter(year == 2020) |> filter(!(country %in% REGION))|>
  drop_na(primary) |>
  ggplot() + geom_histogram(aes(primary), binwidth = 5) +
  geom_vline(xintercept = SAF, col = "red") + geom_vline(xintercept = JP, col = "blue") +labs(title = "2020年の初等学校就学率", subtitle = "日本:青、SACU:赤")

データが十分ある最近の年の値の10カ国の値の棒グラフ

a. 値が大きい方から

df_primary |> filter(year == 2020) |> drop_na(primary) |> 
  filter(!(iso2c %in% REGION))|>
  arrange(desc(primary)) |> head(10) |> 
  ggplot(aes(fct_reorder(country, primary), primary)) + geom_col() + 
  coord_flip() + labs(title = "Top 10 Countries", x = "country", y = "初等学校就学率")

b. 値が小さい方から

df_primary |> filter(year == 2020) |> drop_na(primary) |> 
  filter(!(iso2c %in% REGION))|>
  arrange(primary) |> head(10) |> 
  ggplot(aes(fct_rev(fct_reorder(country, primary)), primary)) + geom_col() + 
  coord_flip() + labs(title = "Lowest 10 Countries", x = "country", y = "初等学校就学率")

3. 中等学校就学率

データ

  • School enrollment, secondary (% gross):SE.SEC.ENRR [Link]
  • Gross enrollment ratio is the ratio of total enrollment, regardless of age, to the population of the age group that officially corresponds to the level of education shown. Secondary education completes the provision of basic education that began at the primary level, and aims at laying the foundations for lifelong learning and human development, by offering more subject- or skill-oriented instruction using more specialized teachers.

データ情報

  • データ名:中等学校就学率

  • データコード:SE.SEC.ENRR

  • 変数名:secondary

  • 概要:総就学率は、年齢に関係なく、表示されている教育レベルに正式に対応する年齢層の人口に対する総就学者数の比率です。中等教育は、初等段階から始まった基礎教育の提供を完了し、より専門性の高い教師によるより教科や技能に特化した指導を行うことにより、生涯学習と人間形成の基礎を築くことを目的としています。

データの取得

準備

library(tidyverse)
library(WDI)

WDI パッケージを使って、直接データをダウンロードし、変数名を、ed_exp に指定。

df_secondary <- WDI(indicator = c(secondary = "SE.SEC.ENRR"))
write_csv(df_secondary, "data/secondary.csv")
df_secondary <- read_csv("data/secondary.csv")
Rows: 16758 Columns: 5── Column specification ────────────────────────────────────────────────────────────────
Delimiter: ","
chr (3): country, iso2c, iso3c
dbl (2): year, secondary
ℹ 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.

データの確認

df_secondary
str(df_secondary)
spc_tbl_ [16,758 × 5] (S3: spec_tbl_df/tbl_df/tbl/data.frame)
 $ country  : chr [1:16758] "Africa Eastern and Southern" "Africa Eastern and Southern" "Africa Eastern and Southern" "Africa Eastern and Southern" ...
 $ iso2c    : chr [1:16758] "ZH" "ZH" "ZH" "ZH" ...
 $ iso3c    : chr [1:16758] "AFE" "AFE" "AFE" "AFE" ...
 $ year     : num [1:16758] 2022 2021 2020 2019 2018 ...
 $ secondary: num [1:16758] NA NA 43.8 43.4 43.2 ...
 - attr(*, "spec")=
  .. cols(
  ..   country = col_character(),
  ..   iso2c = col_character(),
  ..   iso3c = col_character(),
  ..   year = col_double(),
  ..   secondary = col_double()
  .. )
 - attr(*, "problems")=<externalptr> 
REGION <- c("1A", "1W", "4E", "7E", "8S", "B8", "EU", "F1", "OE", "S1", 
"S2", "S3", "S4", "T2", "T3", "T4", "T5", "T6", "T7", "V1", "V2", 
"V3", "V4", "XC", "XD", "XE", "XF", "XG", "XH", "XI", "XJ", "XL", 
"XM", "XN", "XO", "XP", "XQ", "XT", "XU", "XY", "Z4", "Z7", "ZF", 
"ZG", "ZH", "ZI", "ZJ", "ZQ", "ZT")
df_secondary |> filter(iso2c %in% REGION) |> distinct(country, iso2c)
df_secondary |> filter(!(iso2c %in% REGION)) |> distinct(country, iso2c)

分析する国のリスト

南部アフリカ関税同盟 The Southern African Customs Union (SACU)

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

ラテンアメリカでジニ指数が大きい4カ国

CHOSEN_COUNTRIES <- c("Suriname", "Belize", "Brazil", "Colombia")

分析

1. 各年毎のデータの数の棒グラフ

df_secondary |> drop_na(secondary) |> filter(!(iso2c %in% REGION)) |>
  ggplot(aes(year)) + geom_bar()

視覚化

2. 日本の中等学校就学率

df_secondary |> filter(country == "Japan") |> 
  drop_na(secondary) |> arrange(desc(year))

3. 経年変化

a. 日本

df_secondary |> filter(country == "Japan") |> drop_na(secondary) |>
  ggplot(aes(year, secondary)) + geom_line()

気づいたこと・疑問

  • 2000年ごろから減少、その後も変化がある。何が原因なのだろう。

b. 南部アフリカ関税同盟

df_secondary |> filter(country %in% SOUTH_AFRICA_FIVE) |> drop_na(secondary) |>
  ggplot(aes(year, secondary)) + geom_line(aes(col = country))

参考:平均的な値を曲線で表すことも可能です。loess を使うと滑らかな曲線で近似してくれます。

df_secondary |> filter(country %in% SOUTH_AFRICA_FIVE) |> drop_na(secondary) |>
  ggplot(aes(year, secondary)) + geom_line(aes(col = country)) +
  geom_smooth(formula = 'y~x', method = "loess", se = FALSE)

気づいたこと・疑問

  • 平均で見ると、一定して上昇している。

c. ラテンアメリカ4カ国

df_secondary |> filter(country %in% CHOSEN_COUNTRIES) |> drop_na(secondary) |>
  ggplot(aes(year, secondary)) + geom_line(aes(col = country))

参考:平均的な値を曲線で表すことも可能です。loess を使うと滑らかな曲線で近似してくれます。

df_secondary |> filter(country %in% CHOSEN_COUNTRIES) |> drop_na(secondary) |>
  ggplot(aes(year, secondary)) + geom_line(aes(col = country)) +
  geom_smooth(formula = 'y~x', method = "loess", se = FALSE)

分布

データの数から、まずは、2020年について見てみる。

df_secondary |> filter(year == 2020) |> filter(!(country %in% REGION))|>
  drop_na(secondary) |>
  ggplot(aes(secondary)) + geom_histogram(binwidth = 10)

参考:SACU の5カ国の値を縦線で書き込むには下のようにします。

df_secondary |> filter(year == 2020) |> filter(country %in% SOUTH_AFRICA_FIVE) 

参考:日本とSACU の5カ国の値を縦線で書き込むには下のようにします。

JP <- 102.84480
SAF <- df_secondary |> filter(year == 2020) |> filter(country %in% SOUTH_AFRICA_FIVE) |> pull(secondary)
df_secondary |> filter(year == 2020) |> filter(!(country %in% REGION))|>
  drop_na(secondary) |>
  ggplot() + geom_histogram(aes(secondary), binwidth = 10) +
  geom_vline(xintercept = SAF, col = "red") + geom_vline(xintercept = JP, col = "blue") +labs(title = "2020年の中等学校就学率", subtitle = "日本:青、SACU:赤")

データが十分ある最近の年の値の10カ国の値の棒グラフ

a. 値が大きい方から

df_secondary |> filter(year == 2020) |> drop_na(secondary) |> 
  filter(!(iso2c %in% REGION))|>
  arrange(desc(secondary)) |> head(10) |> 
  ggplot(aes(fct_reorder(country, secondary), secondary)) + geom_col() + 
  coord_flip() + labs(title = "Top 10 Countries", x = "country", y = "secondary school enrollment")

b. 値が小さい方から

df_secondary |> filter(year == 2020) |> drop_na(secondary) |> 
  filter(!(iso2c %in% REGION))|>
  arrange(secondary) |> head(10) |> 
  ggplot(aes(fct_rev(fct_reorder(country, secondary)), secondary)) + geom_col() + 
  coord_flip() + labs(title = "Lowest 10 Countries", x = "country", y = "secondary schooll enrollment")

4. 中等学校後の就学率

データ

  • School enrollment, tertiary (% gross):SE.TER.ENRR [Link]
  • Gross enrollment ratio is the ratio of total enrollment, regardless of age, to the population of the age group that officially corresponds to the level of education shown. Tertiary education, whether or not to an advanced research qualification, normally requires, as a minimum condition of admission, the successful completion of education at the secondary level.

データ情報

  • データ名:中等学校後の就学率

  • データコード:SE.TER.ENRR

  • 変数名:tertiary

  • 概要:総就学率は、年齢に関係なく、表示されている教育レベルに正式に対応する年齢層の人口に対する総就学者数の比率です。高等教育では、高度な研究資格の有無にかかわらず、通常、入学の最低条件として中等教育レベルの教育を無事に修了することが求められます。

データの取得

準備

library(tidyverse)
library(WDI)

WDI パッケージを使って、直接データをダウンロードし、変数名を、ed_exp に指定。

df_tertiary <- WDI(indicator = c(tertiary = "SE.TER.ENRR"))
write_csv(df_tertiary, "data/tertiary.csv")
df_tertiary <- read_csv("data/tertiary.csv")
Rows: 16758 Columns: 5── Column specification ────────────────────────────────────────────────────────────────
Delimiter: ","
chr (3): country, iso2c, iso3c
dbl (2): year, tertiary
ℹ 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.

データの確認

df_tertiary
str(df_tertiary)
spc_tbl_ [16,758 × 5] (S3: spec_tbl_df/tbl_df/tbl/data.frame)
 $ country : chr [1:16758] "Africa Eastern and Southern" "Africa Eastern and Southern" "Africa Eastern and Southern" "Africa Eastern and Southern" ...
 $ iso2c   : chr [1:16758] "ZH" "ZH" "ZH" "ZH" ...
 $ iso3c   : chr [1:16758] "AFE" "AFE" "AFE" "AFE" ...
 $ year    : num [1:16758] 2022 2021 2020 2019 2018 ...
 $ tertiary: num [1:16758] NA 8.85 9.23 8.81 8.9 ...
 - attr(*, "spec")=
  .. cols(
  ..   country = col_character(),
  ..   iso2c = col_character(),
  ..   iso3c = col_character(),
  ..   year = col_double(),
  ..   tertiary = col_double()
  .. )
 - attr(*, "problems")=<externalptr> 
REGION <- c("1A", "1W", "4E", "7E", "8S", "B8", "EU", "F1", "OE", "S1", 
"S2", "S3", "S4", "T2", "T3", "T4", "T5", "T6", "T7", "V1", "V2", 
"V3", "V4", "XC", "XD", "XE", "XF", "XG", "XH", "XI", "XJ", "XL", 
"XM", "XN", "XO", "XP", "XQ", "XT", "XU", "XY", "Z4", "Z7", "ZF", 
"ZG", "ZH", "ZI", "ZJ", "ZQ", "ZT")
df_tertiary |> filter(iso2c %in% REGION) |> distinct(country, iso2c)
df_tertiary |> filter(!(iso2c %in% REGION)) |> distinct(country, iso2c)

分析する国のリスト

南部アフリカ関税同盟 The Southern African Customs Union (SACU)

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

ラテンアメリカでジニ指数が大きい4カ国

CHOSEN_COUNTRIES <- c("Suriname", "Belize", "Brazil", "Colombia")

分析

1. 各年毎のデータの数の棒グラフ

df_tertiary |> drop_na(tertiary) |> filter(!(iso2c %in% REGION)) |>
  ggplot(aes(year)) + geom_bar()

視覚化

2. 日本の教育費(% of GDP)

df_tertiary |> filter(country == "Japan") |> 
  drop_na(tertiary) |> arrange(desc(year))

3. 経年変化

a. 日本

df_tertiary |> filter(country == "Japan") |> drop_na(tertiary) |>
  ggplot(aes(year, tertiary)) + geom_line()

気づいたこと・疑問

  • 1970年代の急激な上昇、1990年ごろからまた増加は、何が原因なのだろう。

  • どのように、中等学校後について定めているのだろう。

b. 南部アフリカ関税同盟

df_tertiary |> filter(country %in% SOUTH_AFRICA_FIVE) |> drop_na(tertiary) |>
  ggplot(aes(year, tertiary)) + geom_line(aes(col = country))

参考:平均的な値を曲線で表すことも可能です。loess を使うと滑らかな曲線で近似してくれます。

df_tertiary |> filter(country %in% SOUTH_AFRICA_FIVE) |> drop_na(tertiary) |>
  ggplot(aes(year, tertiary)) + geom_line(aes(col = country)) +
  geom_smooth(formula = 'y~x', method = "loess", se = FALSE)

気づいたこと・疑問

  • 平均で見ると、上昇してきており、7% 程度という大きな割合になっている。

c. ラテンアメリカ4カ国

df_tertiary |> filter(country %in% CHOSEN_COUNTRIES) |> drop_na(tertiary) |>
  ggplot(aes(year, tertiary)) + geom_line(aes(col = country))

参考:平均的な値を曲線で表すことも可能です。loess を使うと滑らかな曲線で近似してくれます。

df_tertiary |> filter(country %in% CHOSEN_COUNTRIES) |> drop_na(tertiary) |>
  ggplot(aes(year, tertiary)) + geom_line(aes(col = country)) +
  geom_smooth(formula = 'y~x', method = "loess", se = FALSE)

分布

データの数から、まずは、2020年について見てみる。

df_tertiary |> filter(year == 2020) |> filter(!(country %in% REGION))|>
  drop_na(tertiary) |>
  ggplot(aes(tertiary)) + geom_histogram(binwidth = 10)

参考:SACU の5カ国の値を縦線で書き込むには下のようにします。

df_tertiary |> filter(year == 2020) |> filter(country %in% SOUTH_AFRICA_FIVE) 

参考:日本とSACU の5カ国の値を縦線で書き込むには下のようにします。

JP <- 62.13584
SAF <- df_tertiary |> filter(year == 2020) |> filter(country %in% SOUTH_AFRICA_FIVE) |> pull(tertiary)
df_tertiary |> filter(year == 2020) |> filter(!(country %in% REGION))|>
  drop_na(tertiary) |>
  ggplot() + geom_histogram(aes(tertiary), binwidth = 10) +
  geom_vline(xintercept = SAF, col = "red") + geom_vline(xintercept = JP, col = "blue") +labs(title = "2020年の中等学校後の就学率", subtitle = "日本:青、SACU:赤")

データが十分ある最近の年の値の10カ国の値の棒グラフ

a. 値が大きい方から

df_tertiary |> filter(year == 2020) |> drop_na(tertiary) |> 
  filter(!(iso2c %in% REGION))|>
  arrange(desc(tertiary)) |> head(10) |> 
  ggplot(aes(fct_reorder(country, tertiary), tertiary)) + geom_col() + 
  coord_flip() + labs(title = "Top 10 Countries", x = "country", y = "tertiary school enrollment")

b. 値が小さい方から

df_tertiary |> filter(year == 2020) |> drop_na(tertiary) |> 
  filter(!(iso2c %in% REGION))|>
  arrange(tertiary) |> head(10) |> 
  ggplot(aes(fct_rev(fct_reorder(country, tertiary)), tertiary)) + geom_col() + 
  coord_flip() + labs(title = "Lowest 10 Countries", x = "country", y = "tertiary school enrollment")

5. 五歳未満の死亡率

データ

  • Mortality rate, under-5 (per 1,000 live births):SH.DYN.MORT [Link]

データ情報

  • データ名:五歳未満の死亡率

  • データコード:SH.DYN.MORT

  • 変数名:under5

  • 概要:5 歳未満死亡率は、指定された年の年齢別死亡率が適用される場合に、新生児が 5 歳に達する前に死亡する 1,000 人あたりの確率です。

データの取得

準備

library(tidyverse)
library(WDI)

WDI パッケージを使って、直接データをダウンロードし、変数名を、ed_exp に指定。

df_under5 <- WDI(indicator = c(under5 = "SH.DYN.MORT"))
write_csv(df_under5, "data/under5.csv")
df_under5 <- read_csv("data/under5.csv")
Rows: 16758 Columns: 5── Column specification ────────────────────────────────────────────────────────────────
Delimiter: ","
chr (3): country, iso2c, iso3c
dbl (2): year, under5
ℹ 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.

データの確認

df_under5
str(df_under5)
spc_tbl_ [16,758 × 5] (S3: spec_tbl_df/tbl_df/tbl/data.frame)
 $ country: chr [1:16758] "Africa Eastern and Southern" "Africa Eastern and Southern" "Africa Eastern and Southern" "Africa Eastern and Southern" ...
 $ iso2c  : chr [1:16758] "ZH" "ZH" "ZH" "ZH" ...
 $ iso3c  : chr [1:16758] "AFE" "AFE" "AFE" "AFE" ...
 $ year   : num [1:16758] 2022 2021 2020 2019 2018 ...
 $ under5 : num [1:16758] NA 57.3 59.1 60.9 62.9 ...
 - attr(*, "spec")=
  .. cols(
  ..   country = col_character(),
  ..   iso2c = col_character(),
  ..   iso3c = col_character(),
  ..   year = col_double(),
  ..   under5 = col_double()
  .. )
 - attr(*, "problems")=<externalptr> 
REGION <- c("1A", "1W", "4E", "7E", "8S", "B8", "EU", "F1", "OE", "S1", 
"S2", "S3", "S4", "T2", "T3", "T4", "T5", "T6", "T7", "V1", "V2", 
"V3", "V4", "XC", "XD", "XE", "XF", "XG", "XH", "XI", "XJ", "XL", 
"XM", "XN", "XO", "XP", "XQ", "XT", "XU", "XY", "Z4", "Z7", "ZF", 
"ZG", "ZH", "ZI", "ZJ", "ZQ", "ZT")
df_under5 |> filter(iso2c %in% REGION) |> distinct(country, iso2c)
df_under5 |> filter(!(iso2c %in% REGION)) |> distinct(country, iso2c)

分析する国のリスト

南部アフリカ関税同盟 The Southern African Customs Union (SACU)

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

ラテンアメリカでジニ指数が大きい4カ国

CHOSEN_COUNTRIES <- c("Suriname", "Belize", "Brazil", "Colombia")

分析

1. 各年毎のデータの数の棒グラフ

df_under5 |> drop_na(under5) |> filter(!(iso2c %in% REGION)) |>
  ggplot(aes(year)) + geom_bar()

視覚化

2. 五歳未満死亡率(1000人あたり)

df_under5 |> filter(country == "Japan") |> 
  drop_na(under5) |> arrange(desc(year))

3. 経年変化

a. 日本

df_under5 |> filter(country == "Japan") |> drop_na(under5) |>
  ggplot(aes(year, under5)) + geom_line()

気づいたこと・疑問

  • 継続的に減少している。

  • 1960年ごろは40% ということは、1950年ごろは、50% ぐらいだったのだろうか。

b. 南部アフリカ関税同盟

df_under5 |> filter(country %in% SOUTH_AFRICA_FIVE) |> drop_na(under5) |>
  ggplot(aes(year, under5)) + geom_line(aes(col = country))

参考:平均的な値を曲線で表すことも可能です。loess を使うと滑らかな曲線で近似してくれます。

df_under5 |> filter(country %in% SOUTH_AFRICA_FIVE) |> drop_na(under5) |>
  ggplot(aes(year, under5)) + geom_line(aes(col = country)) +
  geom_smooth(formula = 'y~x', method = "loess", se = FALSE)

気づいたこと・疑問

  • 2000年すぎに上昇しているが、それ以外は、減少している。
  • 紛争だろうか。

c. ラテンアメリカ4カ国

df_under5 |> filter(country %in% CHOSEN_COUNTRIES) |> drop_na(under5) |>
  ggplot(aes(year, under5)) + geom_line(aes(col = country))

参考:平均的な値を曲線で表すことも可能です。loess を使うと滑らかな曲線で近似してくれます。

df_under5 |> filter(country %in% CHOSEN_COUNTRIES) |> drop_na(under5) |>
  ggplot(aes(year, under5)) + geom_line(aes(col = country)) +
  geom_smooth(formula = 'y~x', method = "loess", se = FALSE)

分布

データの数から、まずは、2020年について見てみる。

df_under5 |> filter(year == 2020) |> filter(!(country %in% REGION))|>
  drop_na(under5) |>
  ggplot(aes(under5)) + geom_histogram(binwidth = 10)

参考:SACU の5カ国の値を縦線で書き込むには下のようにします。

df_under5 |> filter(year == 2020) |> filter(country %in% SOUTH_AFRICA_FIVE) 

参考:日本とSACU の5カ国の値を縦線で書き込むには下のようにします。

JP <- 2.4
SAF <- df_under5 |> filter(year == 2020) |> filter(country %in% SOUTH_AFRICA_FIVE) |> pull(under5)
df_under5 |> filter(year == 2020) |> filter(!(country %in% REGION))|>
  drop_na(under5) |>
  ggplot() + geom_histogram(aes(under5), binwidth = 10) +
  geom_vline(xintercept = SAF, col = "red") + geom_vline(xintercept = JP, col = "blue") +labs(title = "五歳未満の死亡率(1000人あたり)", subtitle = "日本:青、SACU:赤")

データが十分ある最近の年の値の10カ国の値の棒グラフ

a. 値が大きい方から

df_under5 |> filter(year == 2020) |> drop_na(under5) |> 
  filter(!(iso2c %in% REGION))|>
  arrange(desc(under5)) |> head(10) |> 
  ggplot(aes(fct_reorder(country, under5), under5)) + geom_col() + 
  coord_flip() + labs(title = "五歳未満の死亡率(1000人あたり)", x = "country")

b. 値が小さい方から

df_under5 |> filter(year == 2020) |> drop_na(under5) |> 
  filter(!(iso2c %in% REGION))|>
  arrange(under5) |> head(10) |> 
  ggplot(aes(fct_rev(fct_reorder(country, under5)), under5)) + geom_col() + 
  coord_flip() + labs(title = "Lowest 10 Countries", y = "under 5 mortality", x = "country")

6. 新規 HIV 感染者数

データ

  • Incidence of HIV (% of uninfected population ages 15-49):SH.HIV.INCD.ZS [Link]

データ情報

  • データ名:新規 HIV 感染者数

  • データコード:SH.HIV.INCD.ZS

  • 変数名:new_hiv

  • 概要:期間の前の年間の非感染人口 1,000 人当たりの 15 ~ 49 歳の非感染集団における新規 HIV 感染者数。

データの取得

準備

library(tidyverse)
library(WDI)

WDI パッケージを使って、直接データをダウンロードし、変数名を、ed_exp に指定。

df_new_hiv <- WDI(indicator = c(new_hiv = "SH.HIV.INCD.ZS"))
write_csv(df_new_hiv, "data/new_hiv.csv")
df_new_hiv <- read_csv("data/new_hiv.csv")
Rows: 16758 Columns: 5── Column specification ────────────────────────────────────────────────────────────────
Delimiter: ","
chr (3): country, iso2c, iso3c
dbl (2): year, new_hiv
ℹ 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.

データの確認

df_new_hiv
str(df_new_hiv)
spc_tbl_ [16,758 × 5] (S3: spec_tbl_df/tbl_df/tbl/data.frame)
 $ country: chr [1:16758] "Africa Eastern and Southern" "Africa Eastern and Southern" "Africa Eastern and Southern" "Africa Eastern and Southern" ...
 $ iso2c  : chr [1:16758] "ZH" "ZH" "ZH" "ZH" ...
 $ iso3c  : chr [1:16758] "AFE" "AFE" "AFE" "AFE" ...
 $ year   : num [1:16758] 2022 2021 2020 2019 2018 ...
 $ new_hiv: num [1:16758] NA 1.52 1.65 1.86 2.1 ...
 - attr(*, "spec")=
  .. cols(
  ..   country = col_character(),
  ..   iso2c = col_character(),
  ..   iso3c = col_character(),
  ..   year = col_double(),
  ..   new_hiv = col_double()
  .. )
 - attr(*, "problems")=<externalptr> 
REGION <- c("1A", "1W", "4E", "7E", "8S", "B8", "EU", "F1", "OE", "S1", 
"S2", "S3", "S4", "T2", "T3", "T4", "T5", "T6", "T7", "V1", "V2", 
"V3", "V4", "XC", "XD", "XE", "XF", "XG", "XH", "XI", "XJ", "XL", 
"XM", "XN", "XO", "XP", "XQ", "XT", "XU", "XY", "Z4", "Z7", "ZF", 
"ZG", "ZH", "ZI", "ZJ", "ZQ", "ZT")
df_new_hiv |> filter(iso2c %in% REGION) |> distinct(country, iso2c)
df_new_hiv |> filter(!(iso2c %in% REGION)) |> distinct(country, iso2c)

分析する国のリスト

南部アフリカ関税同盟 The Southern African Customs Union (SACU)

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

ラテンアメリカでジニ指数が大きい4カ国

CHOSEN_COUNTRIES <- c("Suriname", "Belize", "Brazil", "Colombia")

分析

1. 各年毎のデータの数の棒グラフ

df_new_hiv |> drop_na(new_hiv) |> filter(!(iso2c %in% REGION)) |>
  ggplot(aes(year)) + geom_bar()

視覚化

2. 新規 HIV 感染者数(1000人あたり)

df_new_hiv |> filter(country == "Japan") |> 
  drop_na(new_hiv) |> arrange(desc(year))

3. 経年変化

a. 日本

df_new_hiv |> filter(country == "Japan") |> drop_na(new_hiv) |>
  ggplot(aes(year, new_hiv)) + geom_line()

気づいたこと・疑問

b. 南部アフリカ関税同盟

df_new_hiv |> filter(country %in% SOUTH_AFRICA_FIVE) |> drop_na(new_hiv) |>
  ggplot(aes(year, new_hiv)) + geom_line(aes(col = country))

参考:平均的な値を曲線で表すことも可能です。loess を使うと滑らかな曲線で近似してくれます。

df_new_hiv |> filter(country %in% SOUTH_AFRICA_FIVE) |> drop_na(new_hiv) |>
  ggplot(aes(year, new_hiv)) + geom_line(aes(col = country)) +
  geom_smooth(formula = 'y~x', method = "loess", se = FALSE)

気づいたこと・疑問

c. ラテンアメリカ4カ国

df_new_hiv |> filter(country %in% CHOSEN_COUNTRIES) |> drop_na(new_hiv) |>
  ggplot(aes(year, new_hiv)) + geom_line(aes(col = country))

参考:平均的な値を曲線で表すことも可能です。loess を使うと滑らかな曲線で近似してくれます。

df_new_hiv |> filter(country %in% CHOSEN_COUNTRIES) |> drop_na(new_hiv) |>
  ggplot(aes(year, new_hiv)) + geom_line(aes(col = country)) +
  geom_smooth(formula = 'y~x', method = "loess", se = FALSE)

分布

データの数から、まずは、2020年について見てみる。

df_new_hiv |> filter(year == 2020) |> filter(!(country %in% REGION))|>
  drop_na(new_hiv) |>
  ggplot(aes(new_hiv)) + geom_histogram(binwidth = 10)

参考:SACU の5カ国の値を縦線で書き込むには下のようにします。

df_new_hiv |> filter(year == 2020) |> filter(country %in% SOUTH_AFRICA_FIVE) 

参考:日本とSACU の5カ国の値を縦線で書き込むには下のようにします。

JP <- 2.4
SAF <- df_new_hiv |> filter(year == 2020) |> filter(country %in% SOUTH_AFRICA_FIVE) |> pull(new_hiv)
df_new_hiv |> filter(year == 2020) |> filter(!(country %in% REGION))|>
  drop_na(new_hiv) |>
  ggplot() + geom_histogram(aes(new_hiv), binwidth = 10) +
  geom_vline(xintercept = SAF, col = "red") + geom_vline(xintercept = JP, col = "blue") +labs(title = "新規HIV感染者数", subtitle = "日本:青、SACU:赤")

データが十分ある最近の年の値の10カ国の値の棒グラフ

a. 値が大きい方から

df_new_hiv |> filter(year == 2020) |> drop_na(new_hiv) |> 
  filter(!(iso2c %in% REGION))|>
  arrange(desc(new_hiv)) |> head(10) |> 
  ggplot(aes(fct_reorder(country, new_hiv), new_hiv)) + geom_col() + 
  coord_flip() + labs(title = "新規HIV感染者数", x = "country")

b. 値が小さい方から

df_new_hiv |> filter(year == 2020) |> drop_na(new_hiv) |> 
  filter(!(iso2c %in% REGION))|>
  arrange(new_hiv) |> head(10) |> 
  ggplot(aes(fct_rev(fct_reorder(country, new_hiv)), new_hiv)) + geom_col() + 
  coord_flip() + labs(title = "Lowest 10 Countries", y = "new hiv infected", x = "country")

7. 初等中等学校就学率(性差)

データ

  • School enrollment, primary and secondary (gross), gender parity index (GPI):SE.ENR.PRSC.FM.ZS [Link]
  • Gender parity index for gross enrollment ratio in primary and secondary education is the ratio of girls to boys enrolled at primary and secondary levels in public and private schools.

データ情報

  • データ名:初等中等学校就学率男女比(GPI)

  • データコード:SE.ENR.PRSC.FM.ZS

  • 変数名:school_gpi

  • 概要:初等中等教育における総就学率の男女平等指数は、公立および私立学校の初等および中等教育レベルに在籍する女子と男子の比率です。

データの取得

準備

library(tidyverse)
library(WDI)

WDI パッケージを使って、直接データをダウンロードし、変数名を、ed_exp に指定。

df_school_gpi <- WDI(indicator = c(school_gpi = "SE.ENR.PRSC.FM.ZS"))
write_csv(df_school_gpi, "data/school_gpi.csv")
df_school_gpi <- read_csv("data/school_gpi.csv")
Rows: 16758 Columns: 5── Column specification ────────────────────────────────────────────────────────────────
Delimiter: ","
chr (3): country, iso2c, iso3c
dbl (2): year, school_gpi
ℹ 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.

データの確認

df_school_gpi
str(df_school_gpi)
spc_tbl_ [16,758 × 5] (S3: spec_tbl_df/tbl_df/tbl/data.frame)
 $ country   : chr [1:16758] "Africa Eastern and Southern" "Africa Eastern and Southern" "Africa Eastern and Southern" "Africa Eastern and Southern" ...
 $ iso2c     : chr [1:16758] "ZH" "ZH" "ZH" "ZH" ...
 $ iso3c     : chr [1:16758] "AFE" "AFE" "AFE" "AFE" ...
 $ year      : num [1:16758] 2022 2021 2020 2019 2018 ...
 $ school_gpi: num [1:16758] NA NA 0.944 0.941 0.94 ...
 - attr(*, "spec")=
  .. cols(
  ..   country = col_character(),
  ..   iso2c = col_character(),
  ..   iso3c = col_character(),
  ..   year = col_double(),
  ..   school_gpi = col_double()
  .. )
 - attr(*, "problems")=<externalptr> 
REGION <- c("1A", "1W", "4E", "7E", "8S", "B8", "EU", "F1", "OE", "S1", 
"S2", "S3", "S4", "T2", "T3", "T4", "T5", "T6", "T7", "V1", "V2", 
"V3", "V4", "XC", "XD", "XE", "XF", "XG", "XH", "XI", "XJ", "XL", 
"XM", "XN", "XO", "XP", "XQ", "XT", "XU", "XY", "Z4", "Z7", "ZF", 
"ZG", "ZH", "ZI", "ZJ", "ZQ", "ZT")
df_school_gpi |> filter(iso2c %in% REGION) |> distinct(country, iso2c)
df_school_gpi |> filter(!(iso2c %in% REGION)) |> distinct(country, iso2c)

分析する国のリスト

南部アフリカ関税同盟 The Southern African Customs Union (SACU)

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

ラテンアメリカでジニ指数が大きい4カ国

CHOSEN_COUNTRIES <- c("Suriname", "Belize", "Brazil", "Colombia")

分析

1. 各年毎のデータの数の棒グラフ

df_school_gpi |> drop_na(school_gpi) |> filter(!(iso2c %in% REGION)) |>
  ggplot(aes(year)) + geom_bar()

視覚化

2. 日本の初等中等学校就学率における GPI

df_school_gpi |> filter(country == "Japan") |> 
  drop_na(school_gpi) |> arrange(desc(year))

3. 経年変化

a. 日本

df_school_gpi |> filter(country == "Japan") |> drop_na(school_gpi) |>
  ggplot(aes(year, school_gpi)) + geom_line()

気づいたこと・疑問

b. 南部アフリカ関税同盟

df_school_gpi |> filter(country %in% SOUTH_AFRICA_FIVE) |> 
  drop_na(school_gpi) |>
  ggplot(aes(year, school_gpi)) + geom_line(aes(col = country))

参考:平均的な値を曲線で表すことも可能です。loess を使うと滑らかな曲線で近似してくれます。

df_school_gpi |> filter(country %in% SOUTH_AFRICA_FIVE) |> 
  drop_na(school_gpi) |>
  ggplot(aes(year, school_gpi)) + geom_line(aes(col = country)) +
  geom_smooth(formula = 'y~x', method = "loess", se = FALSE)

気づいたこと・疑問

  • ゆるやかに減少。1.0 に近づいている。

c. ラテンアメリカ4カ国

df_school_gpi |> filter(country %in% CHOSEN_COUNTRIES) |> drop_na(school_gpi) |>
  ggplot(aes(year, school_gpi)) + geom_line(aes(col = country))

参考:平均的な値を曲線で表すことも可能です。loess を使うと滑らかな曲線で近似してくれます。

df_school_gpi |> filter(country %in% CHOSEN_COUNTRIES) |> drop_na(school_gpi) |>
  ggplot(aes(year, school_gpi)) + geom_line(aes(col = country)) +
  geom_smooth(formula = 'y~x', method = "loess", se = FALSE)

分布

データの数から、2020年のデータは少ないので、2019年について見てみる。

df_school_gpi |> filter(year == 2019) |> filter(!(country %in% REGION))|>
  drop_na(school_gpi) |>
  ggplot(aes(school_gpi)) + geom_histogram(binwidth = 0.02)

参考:SACU の5カ国の値を縦線で書き込むには下のようにします。

df_school_gpi |> filter(year == 2019) |> filter(country %in% SOUTH_AFRICA_FIVE) 

参考:日本とSACU の5カ国の値を縦線で書き込むには下のようにします。

JP <- 1.00341 # no recent data after 2019
SAF <- df_school_gpi |> filter(year == 2019) |> filter(country %in% SOUTH_AFRICA_FIVE) |> pull(school_gpi)
df_school_gpi |> filter(year == 2019) |> filter(!(country %in% REGION))|>
  drop_na(school_gpi) |>
  ggplot() + geom_histogram(aes(school_gpi), binwidth = 0.02) +
  geom_vline(xintercept = SAF, col = "red") + #geom_vline(xintercept = JP, col = "blue")
  labs(title = "2019年の初等中等学校就学率 GPI", subtitle = "日本:青、SACU:赤")

データが十分ある最近の年の値の10カ国の値の棒グラフ

a. 値が大きい方から

df_school_gpi |> filter(year == 2019) |> drop_na(school_gpi) |> 
  filter(!(iso2c %in% REGION))|>
  arrange(desc(school_gpi)) |> head(10) |> 
  ggplot(aes(fct_reorder(country, school_gpi), school_gpi)) + geom_col() + 
  coord_flip() + labs(title = "Top 10 Countries", x = "country", y = "primary and secondary enrollment, GPI")

b. 値が小さい方から

df_school_gpi |> filter(year == 2019) |> drop_na(school_gpi) |> 
  filter(!(iso2c %in% REGION))|>
  arrange(school_gpi) |> head(10) |> 
  ggplot(aes(fct_rev(fct_reorder(country, school_gpi)), school_gpi)) + geom_col() + 
  coord_flip() + labs(title = "Lowest 10 Countries", x = "country", y = "primary and secondary enrollment, GPI")

8. 女性就労率

データ

  • Ratio of female to male labor force participation rate (%) (modeled ILO estimate):SL.TLF.CACT.FM.ZS [Link]
  • Labor force participation rate is the proportion of the population ages 15 and older that is economically active: all people who supply labor for the production of goods and services during a specified period. Ratio of female to male labor force participation rate is calculated by dividing female labor force participation rate by male labor force participation rate and multiplying by 100.

データ情報

  • データ名:女性就労率

  • データコード:SL.TLF.CACT.FM.ZS

  • 変数名:job_gpi

  • 概要:労働参加率とは、経済的に活動している 15 歳以上の人口の割合であり、指定された期間に商品やサービスの生産に労働力を供給するすべての人々を指します。女性労働力率と男性労働力率の比率は、女性労働力率を男性労働力率で割って100を乗じて算出します。

データの取得

準備

library(tidyverse)
library(WDI)

WDI パッケージを使って、直接データをダウンロードし、変数名を、ed_exp に指定。

df_job_gpi <- WDI(indicator = c(job_gpi = "SL.TLF.CACT.FM.ZS"))
write_csv(df_job_gpi, "data/job_gpi.csv")
df_job_gpi <- read_csv("data/job_gpi.csv")
Rows: 16758 Columns: 5── Column specification ────────────────────────────────────────────────────────────────
Delimiter: ","
chr (3): country, iso2c, iso3c
dbl (2): year, job_gpi
ℹ 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.

データの確認

df_job_gpi
str(df_job_gpi)
spc_tbl_ [16,758 × 5] (S3: spec_tbl_df/tbl_df/tbl/data.frame)
 $ country: chr [1:16758] "Africa Eastern and Southern" "Africa Eastern and Southern" "Africa Eastern and Southern" "Africa Eastern and Southern" ...
 $ iso2c  : chr [1:16758] "ZH" "ZH" "ZH" "ZH" ...
 $ iso3c  : chr [1:16758] "AFE" "AFE" "AFE" "AFE" ...
 $ year   : num [1:16758] 2022 2021 2020 2019 2018 ...
 $ job_gpi: num [1:16758] 87.5 87.2 86.7 86.9 86.6 ...
 - attr(*, "spec")=
  .. cols(
  ..   country = col_character(),
  ..   iso2c = col_character(),
  ..   iso3c = col_character(),
  ..   year = col_double(),
  ..   job_gpi = col_double()
  .. )
 - attr(*, "problems")=<externalptr> 
REGION <- c("1A", "1W", "4E", "7E", "8S", "B8", "EU", "F1", "OE", "S1", 
"S2", "S3", "S4", "T2", "T3", "T4", "T5", "T6", "T7", "V1", "V2", 
"V3", "V4", "XC", "XD", "XE", "XF", "XG", "XH", "XI", "XJ", "XL", 
"XM", "XN", "XO", "XP", "XQ", "XT", "XU", "XY", "Z4", "Z7", "ZF", 
"ZG", "ZH", "ZI", "ZJ", "ZQ", "ZT")
df_job_gpi |> filter(iso2c %in% REGION) |> distinct(country, iso2c)
df_job_gpi |> filter(!(iso2c %in% REGION)) |> distinct(country, iso2c)

分析する国のリスト

南部アフリカ関税同盟 The Southern African Customs Union (SACU)

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

ラテンアメリカでジニ指数が大きい4カ国

CHOSEN_COUNTRIES <- c("Suriname", "Belize", "Brazil", "Colombia")

分析

1. 各年毎のデータの数の棒グラフ

df_job_gpi |> drop_na(job_gpi) |> filter(!(iso2c %in% REGION)) |>
  ggplot(aes(year)) + geom_bar()

視覚化

2. 日本の女性就労率

df_job_gpi |> filter(country == "Japan") |> 
  drop_na(job_gpi) |> arrange(desc(year))

3. 経年変化

a. 日本

df_job_gpi |> filter(country == "Japan") |> drop_na(job_gpi) |>
  ggplot(aes(year, job_gpi)) + geom_line()

気づいたこと・疑問

  • 2000年ごろからは上昇している。どんな政策変更があったのだろうか。

  • このまま、上昇すると、2040年ごろには、90を超え、100に近づく。それで、問題は解決したと言えるのだろうか。

b. 南部アフリカ関税同盟

df_job_gpi |> filter(country %in% SOUTH_AFRICA_FIVE) |> drop_na(job_gpi) |>
  ggplot(aes(year, job_gpi)) + geom_line(aes(col = country))

参考:平均的な値を曲線で表すことも可能です。loess を使うと滑らかな曲線で近似してくれます。

df_job_gpi |> filter(country %in% SOUTH_AFRICA_FIVE) |> drop_na(job_gpi) |>
  ggplot(aes(year, job_gpi)) + geom_line(aes(col = country)) +
  geom_smooth(formula = 'y~x', method = "loess", se = FALSE)

気づいたこと・疑問

  • 全体的には上昇している。

c. ラテンアメリカ4カ国

df_job_gpi |> filter(country %in% CHOSEN_COUNTRIES) |> drop_na(job_gpi) |>
  ggplot(aes(year, job_gpi)) + geom_line(aes(col = country))

参考:平均的な値を曲線で表すことも可能です。loess を使うと滑らかな曲線で近似してくれます。

df_job_gpi |> filter(country %in% CHOSEN_COUNTRIES) |> drop_na(job_gpi) |>
  ggplot(aes(year, job_gpi)) + geom_line(aes(col = country)) +
  geom_smooth(formula = 'y~x', method = "loess", se = FALSE)

分布

データの数から、まずは、2020年について見てみる。

df_job_gpi |> filter(year == 2020) |> filter(!(country %in% REGION))|>
  drop_na(job_gpi) |>
  ggplot(aes(job_gpi)) + geom_histogram(binwidth = 10)

参考:SACU の5カ国の値を縦線で書き込むには下のようにします。

df_job_gpi |> filter(year == 2020) |> filter(country %in% SOUTH_AFRICA_FIVE) 

参考:日本とSACU の5カ国の値を縦線で書き込むには下のようにします。

JP <- 74.51027
SAF <- df_job_gpi |> filter(year == 2020) |> filter(country %in% SOUTH_AFRICA_FIVE) |> pull(job_gpi)
df_job_gpi |> filter(year == 2020) |> filter(!(country %in% REGION))|>
  drop_na(job_gpi) |>
  ggplot() + geom_histogram(aes(job_gpi), binwidth = 10) +
  geom_vline(xintercept = SAF, col = "red") + geom_vline(xintercept = JP, col = "blue") +labs(title = "女性の就労率", subtitle = "日本:青、SACU:赤")

データが十分ある最近の年の値の10カ国の値の棒グラフ

a. 値が大きい方から

df_job_gpi |> filter(year == 2020) |> drop_na(job_gpi) |> 
  filter(!(iso2c %in% REGION))|>
  arrange(desc(job_gpi)) |> head(10) |> 
  ggplot(aes(fct_reorder(country, job_gpi), job_gpi)) + geom_col() + 
  coord_flip() + labs(title = "Top 10 Countries", x = "country", y = "labor force participation rate of ")

b. 値が小さい方から

df_job_gpi |> filter(year == 2020) |> drop_na(job_gpi) |> 
  filter(!(iso2c %in% REGION))|>
  arrange(job_gpi) |> head(10) |> 
  ggplot(aes(fct_rev(fct_reorder(country, job_gpi)), job_gpi)) + geom_col() + 
  coord_flip() + labs(title = "Lowest 10 Countries", x = "country", y = "labor force participation rate")

9. 女性失業率

データ

  • Unemployment, female (% of female labor force) (modeled ILO estimate):SL.UEM.TOTL.FE.ZS [Link]
  • Unemployment refers to the share of the labor force that is without work but available for and seeking employment.

データ情報

  • データ名:女性失業率

  • データコード:SL.UEM.TOTL.FE.ZS

  • 変数名:female_unemploy

  • 概要:失業率とは、仕事はなくても職に就くことができ、求職している労働力の割合を指します。

データの取得

準備

library(tidyverse)
library(WDI)

WDI パッケージを使って、直接データをダウンロードし、変数名を、ed_exp に指定。

df_female_unemploy <- WDI(indicator = c(female_unemploy = "SL.UEM.TOTL.FE.ZS"))
write_csv(df_female_unemploy, "data/female_unemploy.csv")
df_female_unemploy <- read_csv("data/female_unemploy.csv")
Rows: 16758 Columns: 5── Column specification ────────────────────────────────────────────────────────────────
Delimiter: ","
chr (3): country, iso2c, iso3c
dbl (2): year, female_unemploy
ℹ 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.

データの確認

df_female_unemploy
str(df_female_unemploy)
spc_tbl_ [16,758 × 5] (S3: spec_tbl_df/tbl_df/tbl/data.frame)
 $ country        : chr [1:16758] "Africa Eastern and Southern" "Africa Eastern and Southern" "Africa Eastern and Southern" "Africa Eastern and Southern" ...
 $ iso2c          : chr [1:16758] "ZH" "ZH" "ZH" "ZH" ...
 $ iso3c          : chr [1:16758] "AFE" "AFE" "AFE" "AFE" ...
 $ year           : num [1:16758] 2022 2021 2020 2019 2018 ...
 $ female_unemploy: num [1:16758] 8.51 8.5 8.12 7.62 7.42 ...
 - attr(*, "spec")=
  .. cols(
  ..   country = col_character(),
  ..   iso2c = col_character(),
  ..   iso3c = col_character(),
  ..   year = col_double(),
  ..   female_unemploy = col_double()
  .. )
 - attr(*, "problems")=<externalptr> 
REGION <- c("1A", "1W", "4E", "7E", "8S", "B8", "EU", "F1", "OE", "S1", 
"S2", "S3", "S4", "T2", "T3", "T4", "T5", "T6", "T7", "V1", "V2", 
"V3", "V4", "XC", "XD", "XE", "XF", "XG", "XH", "XI", "XJ", "XL", 
"XM", "XN", "XO", "XP", "XQ", "XT", "XU", "XY", "Z4", "Z7", "ZF", 
"ZG", "ZH", "ZI", "ZJ", "ZQ", "ZT")
df_female_unemploy |> filter(iso2c %in% REGION) |> distinct(country, iso2c)
df_female_unemploy |> filter(!(iso2c %in% REGION)) |> distinct(country, iso2c)

分析する国のリスト

南部アフリカ関税同盟 The Southern African Customs Union (SACU)

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

ラテンアメリカでジニ指数が大きい4カ国

CHOSEN_COUNTRIES <- c("Suriname", "Belize", "Brazil", "Colombia")

分析

1. 各年毎のデータの数の棒グラフ

df_female_unemploy |> drop_na(female_unemploy) |> filter(!(iso2c %in% REGION)) |>
  ggplot(aes(year)) + geom_bar()

視覚化

2. 日本の女性失業率

df_female_unemploy |> filter(country == "Japan") |> 
  drop_na(female_unemploy) |> arrange(desc(year))

3. 経年変化

a. 日本

df_female_unemploy |> filter(country == "Japan") |> drop_na(female_unemploy) |>
  ggplot(aes(year, female_unemploy)) + geom_line()

気づいたこと・疑問

  • 2000年ごろから、2010年ごろまで非常に高い水準になっている。何が原因なのだろう。

b. 南部アフリカ関税同盟

df_female_unemploy |> filter(country %in% SOUTH_AFRICA_FIVE) |> drop_na(female_unemploy) |>
  ggplot(aes(year, female_unemploy)) + geom_line(aes(col = country))

参考:平均的な値を曲線で表すことも可能です。loess を使うと滑らかな曲線で近似してくれます。

df_female_unemploy |> filter(country %in% SOUTH_AFRICA_FIVE) |> drop_na(female_unemploy) |>
  ggplot(aes(year, female_unemploy)) + geom_line(aes(col = country)) +
  geom_smooth(formula = 'y~x', method = "loess", se = FALSE)

気づいたこと・疑問

  • 平均で見ると、23%程度。

c. ラテンアメリカ4カ国

df_female_unemploy |> filter(country %in% CHOSEN_COUNTRIES) |> drop_na(female_unemploy) |>
  ggplot(aes(year, female_unemploy)) + geom_line(aes(col = country))

参考:平均的な値を曲線で表すことも可能です。loess を使うと滑らかな曲線で近似してくれます。

df_female_unemploy |> filter(country %in% CHOSEN_COUNTRIES) |> drop_na(female_unemploy) |>
  ggplot(aes(year, female_unemploy)) + geom_line(aes(col = country)) +
  geom_smooth(formula = 'y~x', method = "loess", se = FALSE)

分布

データの数から、まずは、2020年について見てみる。

df_female_unemploy |> filter(year == 2020) |> filter(!(country %in% REGION))|>
  drop_na(female_unemploy) |>
  ggplot(aes(female_unemploy)) + geom_histogram(binwidth = 2)

参考:SACU の5カ国の値を縦線で書き込むには下のようにします。

df_female_unemploy |> filter(year == 2020) |> filter(country %in% SOUTH_AFRICA_FIVE) 

参考:日本とSACU の5カ国の値を縦線で書き込むには下のようにします。

JP <- 2.520
SAF <- df_female_unemploy |> filter(year == 2020) |> filter(country %in% SOUTH_AFRICA_FIVE) |> pull(female_unemploy)
df_female_unemploy |> filter(year == 2020) |> filter(!(country %in% REGION))|>
  drop_na(female_unemploy) |>
  ggplot() + geom_histogram(aes(female_unemploy), binwidth = 2) +
  geom_vline(xintercept = SAF, col = "red") + geom_vline(xintercept = JP, col = "blue") +labs(title = "2020年の女性の求職率", subtitle = "日本:青、SACU:赤")

データが十分ある最近の年の値の10カ国の値の棒グラフ

a. 値が大きい方から

df_female_unemploy |> filter(year == 2020) |> drop_na(female_unemploy) |> 
  filter(!(iso2c %in% REGION))|>
  arrange(desc(female_unemploy)) |> head(10) |> 
  ggplot(aes(fct_reorder(country, female_unemploy), female_unemploy)) + geom_col() + 
  coord_flip() + labs(title = "Top 10 Countries", x = "country", y = "unemployment rate, female, 2020")

b. 値が小さい方から

df_female_unemploy |> filter(year == 2020) |> drop_na(female_unemploy) |> 
  filter(!(iso2c %in% REGION))|>
  arrange(female_unemploy) |> head(10) |> 
  ggplot(aes(fct_rev(fct_reorder(country, female_unemploy)), female_unemploy)) + geom_col() + 
  coord_flip() + labs(title = "Lowest 10 Countries", x = "country", y = "unemployment rate, female, 2020")

10. 男性失業率

データ

  • Unemployment, male (% of male labor force) (modeled ILO estimate):SL.UEM.TOTL.MA.ZS [Link]
  • Unemployment refers to the share of the labor force that is without work but available for and seeking employment.

データ情報

  • データ名:男性失業率

  • データコード:SL.UEM.TOTL.MA.ZS

  • 変数名:male_unemploy

  • 概要:失業率とは、仕事はなくても職に就くことができ、求職している労働力の割合を指します。

データの取得

準備

library(tidyverse)
library(WDI)

WDI パッケージを使って、直接データをダウンロードし、変数名を、ed_exp に指定。

df_male_unemploy <- WDI(indicator = c(male_unemploy = "SL.UEM.TOTL.MA.ZS"))
write_csv(df_male_unemploy, "data/male_unemploy.csv")
df_male_unemploy <- read_csv("data/male_unemploy.csv")
Rows: 16758 Columns: 5── Column specification ────────────────────────────────────────────────────────────────
Delimiter: ","
chr (3): country, iso2c, iso3c
dbl (2): year, male_unemploy
ℹ 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.

データの確認

df_male_unemploy
str(df_male_unemploy)
spc_tbl_ [16,758 × 5] (S3: spec_tbl_df/tbl_df/tbl/data.frame)
 $ country      : chr [1:16758] "Africa Eastern and Southern" "Africa Eastern and Southern" "Africa Eastern and Southern" "Africa Eastern and Southern" ...
 $ iso2c        : chr [1:16758] "ZH" "ZH" "ZH" "ZH" ...
 $ iso3c        : chr [1:16758] "AFE" "AFE" "AFE" "AFE" ...
 $ year         : num [1:16758] 2022 2021 2020 2019 2018 ...
 $ male_unemploy: num [1:16758] 7.38 7.4 7.19 6.67 6.46 ...
 - attr(*, "spec")=
  .. cols(
  ..   country = col_character(),
  ..   iso2c = col_character(),
  ..   iso3c = col_character(),
  ..   year = col_double(),
  ..   male_unemploy = col_double()
  .. )
 - attr(*, "problems")=<externalptr> 
REGION <- c("1A", "1W", "4E", "7E", "8S", "B8", "EU", "F1", "OE", "S1", 
"S2", "S3", "S4", "T2", "T3", "T4", "T5", "T6", "T7", "V1", "V2", 
"V3", "V4", "XC", "XD", "XE", "XF", "XG", "XH", "XI", "XJ", "XL", 
"XM", "XN", "XO", "XP", "XQ", "XT", "XU", "XY", "Z4", "Z7", "ZF", 
"ZG", "ZH", "ZI", "ZJ", "ZQ", "ZT")
df_male_unemploy |> filter(iso2c %in% REGION) |> distinct(country, iso2c)
df_male_unemploy |> filter(!(iso2c %in% REGION)) |> distinct(country, iso2c)

分析する国のリスト

南部アフリカ関税同盟 The Southern African Customs Union (SACU)

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

ラテンアメリカでジニ指数が大きい4カ国

CHOSEN_COUNTRIES <- c("Suriname", "Belize", "Brazil", "Colombia")

分析

1. 各年毎のデータの数の棒グラフ

df_male_unemploy |> drop_na(male_unemploy) |> filter(!(iso2c %in% REGION)) |>
  ggplot(aes(year)) + geom_bar()

視覚化

2. 日本の男性失業率

df_male_unemploy |> filter(country == "Japan") |> 
  drop_na(male_unemploy) |> arrange(desc(year))

3. 経年変化

a. 日本

df_male_unemploy |> filter(country == "Japan") |> drop_na(male_unemploy) |>
  ggplot(aes(year, male_unemploy)) + geom_line()

気づいたこと・疑問

  • 2002年ごろと、2010年ごろにピーク。

  • 全体として、2%から5.5%

b. 南部アフリカ関税同盟

df_male_unemploy |> filter(country %in% SOUTH_AFRICA_FIVE) |> drop_na(male_unemploy) |>
  ggplot(aes(year, male_unemploy)) + geom_line(aes(col = country))

参考:平均的な値を曲線で表すことも可能です。loess を使うと滑らかな曲線で近似してくれます。

df_male_unemploy |> filter(country %in% SOUTH_AFRICA_FIVE) |> drop_na(male_unemploy) |>
  ggplot(aes(year, male_unemploy)) + geom_line(aes(col = country)) +
  geom_smooth(formula = 'y~x', method = "loess", se = FALSE)

気づいたこと・疑問

  • 平均で見ると、20% 弱。日本とは、かなり異なる。世界的には、どうなのだろうか。

c. ラテンアメリカ4カ国

df_male_unemploy |> filter(country %in% CHOSEN_COUNTRIES) |> drop_na(male_unemploy) |>
  ggplot(aes(year, male_unemploy)) + geom_line(aes(col = country))

参考:平均的な値を曲線で表すことも可能です。loess を使うと滑らかな曲線で近似してくれます。

df_male_unemploy |> filter(country %in% CHOSEN_COUNTRIES) |> drop_na(male_unemploy) |>
  ggplot(aes(year, male_unemploy)) + geom_line(aes(col = country)) +
  geom_smooth(formula = 'y~x', method = "loess", se = FALSE)

分布

データの数から、まずは、2020年について見てみる。

df_male_unemploy |> filter(year == 2020) |> filter(!(country %in% REGION))|>
  drop_na(male_unemploy) |>
  ggplot(aes(male_unemploy)) + geom_histogram(binwidth = 2)

参考:SACU の5カ国の値を縦線で書き込むには下のようにします。

df_male_unemploy |> filter(year == 2020) |> filter(country %in% SOUTH_AFRICA_FIVE) 

参考:日本とSACU の5カ国の値を縦線で書き込むには下のようにします。

JP <- 3.024
SAF <- df_male_unemploy |> filter(year == 2020) |> filter(country %in% SOUTH_AFRICA_FIVE) |> pull(male_unemploy)
df_male_unemploy |> filter(year == 2020) |> 
  filter(!(country %in% REGION)) |>
  drop_na(male_unemploy) |>
  ggplot() + geom_histogram(aes(male_unemploy), binwidth = 1) +
  geom_vline(xintercept = SAF, col = "red") + geom_vline(xintercept = JP, col = "blue") +labs(title = "2020年の男性の失業率", subtitle = "日本:青、SACU:赤")

データが十分ある最近の年の値の10カ国の値の棒グラフ

a. 値が大きい方から

df_male_unemploy |> filter(year == 2020) |> drop_na(male_unemploy) |> 
  filter(!(iso2c %in% REGION))|>
  arrange(desc(male_unemploy)) |> head(10) |> 
  ggplot(aes(fct_reorder(country, male_unemploy), male_unemploy)) + geom_col() + 
  coord_flip() + labs(title = "Top 10 Countries", x = "country", y = "")

b. 値が小さい方から

df_male_unemploy |> filter(year == 2020) |> drop_na(male_unemploy) |> 
  filter(!(iso2c %in% REGION))|>
  arrange(male_unemploy) |> head(10) |> 
  ggplot(aes(fct_rev(fct_reorder(country, male_unemploy)), male_unemploy)) + geom_col() + 
  coord_flip() + labs(title = "Lowest 10 Countries", x = "country", y = "unemployment ratio, male")

11. 政府開発援助受給額

データ

  • Net official development assistance and official aid received (current US$) DT.ODA.ALLD.CD [Link]
  • Net official development assistance (ODA) consists of disbursements of loans made on concessional terms (net of repayments of principal) and grants by official agencies of the members of the Development Assistance Committee (DAC), by multilateral institutions, and by non-DAC countries to promote economic development and welfare in countries and territories in the DAC list of ODA recipients. It includes loans with a grant element of at least 25 percent (calculated at a rate of discount of 10 percent). Net official aid refers to aid flows (net of repayments) from official donors to countries and territories in part II of the DAC list of recipients: more advanced countries of Central and Eastern Europe, the countries of the former Soviet Union, and certain advanced developing countries and territories. Official aid is provided under terms and conditions similar to those for ODA. Part II of the DAC List was abolished in 2005. The collection of data on official aid and other resource flows to Part II countries ended with 2004 data. Data are in current U.S. dollars.

データ情報

  • データ名:政府開発援助受給額

  • データコード:DT.ODA.ALLD.CD

  • 変数名:oda

  • 概要:政府開発援助(ODA)の純額は、開発援助委員会(DAC)メンバーの公的機関、多国間機関、DAC非加盟国による、譲許的条件(元本返済を除く)で行われた融資の実行と助成金で構成されます。 DAC の ODA 受領者リストに含まれる国および地域の経済発展と福祉を促進する。これには、少なくとも 25 パーセント(割引率 10 パーセントで計算)の補助金要素を持つローンが含まれます。純公的援助とは、公的ドナーからDACの受取人リストのパートIIにある国および地域への援助の流れ(返済額を差し引いた額)を指します:中央および東ヨーロッパのより先進国、旧ソ連諸国、および一部の先進途上国国と地域。公的援助は、ODA と同様の条件で提供されます。DAC リストのパート II は 2005 年に廃止されました。パート II 諸国への公的援助およびその他の資源の流れに関するデータの収集は 2004 年のデータで終了しました。データは現在の米ドルで表示されます。

データの取得

準備

library(tidyverse)
library(WDI)

WDI パッケージを使って、直接データをダウンロードし、変数名を、ed_exp に指定。

df_oda <- WDI(indicator = c(oda = "DT.ODA.ALLD.CD"))
write_csv(df_oda, "data/oda.csv")
df_oda <- read_csv("data/oda.csv")
Rows: 16758 Columns: 5── Column specification ────────────────────────────────────────────────────────────────
Delimiter: ","
chr (3): country, iso2c, iso3c
dbl (2): year, oda
ℹ 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.

データの確認

df_oda
str(df_oda)
spc_tbl_ [16,758 × 5] (S3: spec_tbl_df/tbl_df/tbl/data.frame)
 $ country: chr [1:16758] "Africa Eastern and Southern" "Africa Eastern and Southern" "Africa Eastern and Southern" "Africa Eastern and Southern" ...
 $ iso2c  : chr [1:16758] "ZH" "ZH" "ZH" "ZH" ...
 $ iso3c  : chr [1:16758] "AFE" "AFE" "AFE" "AFE" ...
 $ year   : num [1:16758] 2022 2021 2020 2019 2018 ...
 $ oda    : num [1:16758] NA NA NA 3.02e+10 2.75e+10 ...
 - attr(*, "spec")=
  .. cols(
  ..   country = col_character(),
  ..   iso2c = col_character(),
  ..   iso3c = col_character(),
  ..   year = col_double(),
  ..   oda = col_double()
  .. )
 - attr(*, "problems")=<externalptr> 
REGION <- c("1A", "1W", "4E", "7E", "8S", "B8", "EU", "F1", "OE", "S1", 
"S2", "S3", "S4", "T2", "T3", "T4", "T5", "T6", "T7", "V1", "V2", 
"V3", "V4", "XC", "XD", "XE", "XF", "XG", "XH", "XI", "XJ", "XL", 
"XM", "XN", "XO", "XP", "XQ", "XT", "XU", "XY", "Z4", "Z7", "ZF", 
"ZG", "ZH", "ZI", "ZJ", "ZQ", "ZT")
df_oda |> filter(iso2c %in% REGION) |> distinct(country, iso2c)
df_oda |> filter(!(iso2c %in% REGION)) |> distinct(country, iso2c)

分析する国のリスト

南部アフリカ関税同盟 The Southern African Customs Union (SACU)

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

ラテンアメリカでジニ指数が大きい4カ国

CHOSEN_COUNTRIES <- c("Suriname", "Belize", "Brazil", "Colombia")

分析

1. 各年毎のデータの数の棒グラフ

df_oda |> drop_na(oda) |> filter(!(iso2c %in% REGION)) |>
  ggplot(aes(year)) + geom_bar()

視覚化

2. 日本の政府開発援助受給額

df_oda |> filter(country == "Japan") |> 
  drop_na(oda) |> arrange(desc(year))

3. 経年変化

a. 日本

df_oda |> filter(country == "Japan") |> drop_na(oda) |>
  ggplot(aes(year, oda)) + geom_line()

気づいたこと・疑問

  • 過去には、受給していたかと思ったが、データのある範囲ではまったくなかった。

b. 南部アフリカ関税同盟

df_oda |> filter(country %in% SOUTH_AFRICA_FIVE) |> drop_na(oda) |>
  ggplot(aes(year, oda)) + geom_line(aes(col = country))

参考:平均的な値を曲線で表すことも可能です。loess を使うと滑らかな曲線で近似してくれます。

df_oda |> filter(country %in% SOUTH_AFRICA_FIVE) |> drop_na(oda) |>
  ggplot(aes(year, oda)) + geom_line(aes(col = country)) +
  geom_smooth(formula = 'y~x', method = "loess", se = FALSE)

気づいたこと・疑問

  • 南アフリカは、1992年ごろまで政府開発援助のデータがないが、受けていなかったのかもしれない。いまは、最大で、10億ドル程度。

c. ラテンアメリカ4カ国

df_oda |> filter(country %in% CHOSEN_COUNTRIES) |> drop_na(oda) |>
  ggplot(aes(year, oda)) + geom_line(aes(col = country))

参考:平均的な値を曲線で表すことも可能です。loess を使うと滑らかな曲線で近似してくれます。

df_oda |> filter(country %in% CHOSEN_COUNTRIES) |> drop_na(oda) |>
  ggplot(aes(year, oda)) + geom_line(aes(col = country)) +
  geom_smooth(formula = 'y~x', method = "loess", se = FALSE)

分布

データの数から、まずは、2020年について見てみる。

日本も含めて、多くの国の値が、0。log10 をとらないと、0 に近い方に値が固まる。log10 スケールを使う時は、値が正のものに制限しないと、値が求められない。

df_oda |> filter(year == 2020) |> filter(!(country %in% REGION))|>
  drop_na(oda) |> filter(oda > 0) |>
  ggplot(aes(oda)) + geom_histogram(bins = 20) + scale_x_log10()

参考:SACU の5カ国の値を縦線で書き込むには下のようにします。

df_oda |> filter(year == 2020) |> filter(country %in% SOUTH_AFRICA_FIVE) 

参考:日本とSACU の5カ国の値を縦線で書き込むには下のようにします。

JP <- 0
SAF <- df_oda |> filter(year == 2020) |> filter(country %in% SOUTH_AFRICA_FIVE) |> pull(oda)
df_oda |> filter(year == 2020) |> filter(!(country %in% REGION))|>
  drop_na(oda) |> filter(oda > 0) |>
  ggplot() + geom_histogram(aes(oda), bins = 20) + scale_x_log10() +
  geom_vline(xintercept = SAF, col = "red") + #geom_vline(xintercept = JP, col = "blue")
  labs(title = "政府開発援助", subtitle = "SACU:赤")

データが十分ある最近の年の値の10カ国の値の棒グラフ

a. 値が大きい方から

df_oda |> filter(year == 2020) |> drop_na(oda) |> 
  filter(!(iso2c %in% REGION))|>
  arrange(desc(oda)) |> head(10) |> 
  ggplot(aes(fct_reorder(country, oda), oda)) + geom_col() + 
  coord_flip() + labs(title = "Top 10 Countries", x = "country", y = "Net official development assistance and official aid received")

b. 値が小さい方から

df_oda |> filter(year == 2020) |> drop_na(oda) |> 
  filter(!(iso2c %in% REGION))|>
  arrange(oda) |> head(10) |> 
  ggplot(aes(fct_rev(fct_reorder(country, oda)), oda)) + geom_col() + 
  coord_flip() + labs(title = "Lowest 10 Countries", x = "country", y = "Net official development assistance and official aid received")

LS0tCnRpdGxlOiAi5o6i57Si55qE44OH44O844K/5YiG5p6QMCAtIEVEQTAiCmF1dGhvcjogIkguIFN1enVraSIKZGF0ZTogIjIwMjTlubQx5pyIMjPml6UiCm91dHB1dDoKICBodG1sX25vdGVib29rOiAKICAgIHRvYzogeWVzCiAgICB0b2NfZmxvYXQ6IHllcwotLS0KCiMjIOiqsumhjAoK5Lul5LiL44Gu5oyH5qiZ44Gu5Lit44GL44KJ44CB5LiA44Gk44KS6YG45oqe44GX44Gm44CB44OH44O844K/44Gu5qaC6KaB77yIZGVzY3JpcHRpb27vvInjgpLoqJjpjLLjgZfjgIHjg4fjg7zjgr/jgpIgV0RJIOOBp+WPluW+l+OBl+OAgeS7peS4i+OBruWIhuaekOOCkuOBmeOCi+OAggoKMS4gIOWQhOW5tOavjuOBruODh+ODvOOCv+OBruaVsOOBruajkuOCsOODqeODlQoyLiAg5pel5pys44Gu44OH44O844K/44Gu5bm044Gu6ZmN6aCG44Gn44Gu6KGo56S6CjMuICDntYzlubTlpInljJbjgpLooajjgZnmipjjgoznt5rjgrDjg6njg5UKICAgIGEuICDml6XmnKwKICAgIGIuICDljZfpg6jjgqLjg5Xjg6rjgqvplqLnqI7lkIznm5/jga7vvJXjgqvlm70KICAgIGMuICDpgbjmip7jgZfjgZ/jgYTjgY/jgaTjgYvjga7lm70KNC4gIOODh+ODvOOCv+OBjOWNgeWIhuOBguOCi+acgOi/keOBruW5tOOBruWApOOBruODkuOCueODiOOCsOODqeODoAo1LiAg44OH44O844K/44GM5Y2B5YiG44GC44KL5pyA6L+R44Gu5bm044Gu5YCk44GuMTDjgqvlm73jga7lgKTjga7mo5LjgrDjg6njg5UKICAgIGEuICDlgKTjgYzlpKfjgY3jgYTmlrnjgYvjgokKICAgIGIuICDlgKTjgYzlsI/jgZXjgYTmlrnjgYvjgokKCuOBneOCjOOBnuOCjOOBq+OBpOOBhOOBpuiAg+Wvn++8iOawl+OBpeOBhOOBn+OBk+OBqOOAgeeWkeWVj+OBquOBqe+8ieOCkuiomOOBmQoKKioyMDIzLjEuMjcuIDIzOjU5Kiog44G+44Gn44GrIE1vb2RsZSDjga7mvJTnv5Ljga7oqrLpoYzjg5zjg4Pjgq/jgrnjgavmj5Dlh7rjgZfjgZ/jgoLjga7jgavjgaTjgYTjgabjga/jgIHjgarjgovjgbnjgY/jgIHml6njgY/opovjgabjgIHjg5XjgqPjg7zjg4njg5Djg4Pjgq/jgpLmm7jjgY3jgb7jgZnjgILjgZ3jgozku6XpmY3jgavmj5Dlh7rjgZXjgozjgZ/jgoLjga7jgoLopovjgb7jgZnjgYzjgIHjg5XjgqPjg7zjg4njg5Djg4Pjgq/jga/pgYXjgY/jgarjgovjgajmgJ3jgaPjgabjgY/jgaDjgZXjgYTjgIIKCiMjIyDjg4fjg7zjgr8KCjEuICBHb3Zlcm5tZW50IGV4cGVuZGl0dXJlIG9uIGVkdWNhdGlvbiwgdG90YWwgKCUgb2YgR0RQKe+8mlNFLlhQRC5UT1RMLkdELlpTIFtbTGlua10oaHR0cHM6Ly9kYXRhLndvcmxkYmFuay5vcmcvaW5kaWNhdG9yL1NFLlhQRC5UT1RMLkdELlpTKV0KCjIuICBTY2hvb2wgZW5yb2xsbWVudCwgcHJpbWFyeSAoJSBncm9zcynvvJpTRS5QUk0uRU5SUiBbW0xpbmtdKGh0dHBzOi8vZGF0YS53b3JsZGJhbmsub3JnL2luZGljYXRvci9TRS5QUk0uRU5SUildCgozLiAgU2Nob29sIGVucm9sbG1lbnQsIHNlY29uZGFyeSAoJSBncm9zcynvvJpTRS5TRUMuRU5SUiBbW0xpbmtdKGh0dHBzOi8vZGF0YS53b3JsZGJhbmsub3JnL2luZGljYXRvci9TRS5TRUMuRU5SUildCgo0LiAgU2Nob29sIGVucm9sbG1lbnQsIHRlcnRpYXJ5ICglIGdyb3NzKe+8mlNFLlRFUi5FTlJSIFtbTGlua10oaHR0cHM6Ly9kYXRhLndvcmxkYmFuay5vcmcvaW5kaWNhdG9yL1NFLlRFUi5FTlJSKV0KCjUuICBNb3J0YWxpdHkgcmF0ZSwgdW5kZXItNSAocGVyIDEsMDAwIGxpdmUgYmlydGhzKe+8mlNILkRZTi5NT1JUIFtbTGlua10oaHR0cHM6Ly9kYXRhYmFuay53b3JsZGJhbmsub3JnL21ldGFkYXRhZ2xvc3Nhcnkvd29ybGQtZGV2ZWxvcG1lbnQtaW5kaWNhdG9ycy9zZXJpZXMvU0guRFlOLk1PUlQpXQoKNi4gIEluY2lkZW5jZSBvZiBISVYgKCUgb2YgdW5pbmZlY3RlZCBwb3B1bGF0aW9uIGFnZXMgMTUtNDkp77yaU0guSElWLklOQ0QuWlMgW1tMaW5rXShodHRwczovL2RhdGEud29ybGRiYW5rLm9yZy9pbmRpY2F0b3IvU0guSElWLklOQ0QuWlM/bG9jYXRpb25zPVNaKV0KCjcuICBTY2hvb2wgZW5yb2xsbWVudCwgcHJpbWFyeSBhbmQgc2Vjb25kYXJ5IChncm9zcyksIGdlbmRlciBwYXJpdHkgaW5kZXggKEdQSSnvvJpTRS5FTlIuUFJTQy5GTS5aUyBbW0xpbmtdKGh0dHBzOi8vZGF0YS53b3JsZGJhbmsub3JnL2luZGljYXRvci9TRS5FTlIuUFJTQy5GTS5aUyldCgo4LiAgUmF0aW8gb2YgZmVtYWxlIHRvIG1hbGUgbGFib3IgZm9yY2UgcGFydGljaXBhdGlvbiByYXRlICglKSAobW9kZWxlZCBJTE8gZXN0aW1hdGUp77yaU0wuVExGLkNBQ1QuRk0uWlMgW1tMaW5rXShodHRwczovL2RhdGEud29ybGRiYW5rLm9yZy9pbmRpY2F0b3IvU0wuVExGLkNBQ1QuRk0uWlMpXQoKOS4gIFVuZW1wbG95bWVudCwgZmVtYWxlICglIG9mIGZlbWFsZSBsYWJvciBmb3JjZSkgKG1vZGVsZWQgSUxPIGVzdGltYXRlKe+8mlNMLlVFTS5UT1RMLkZFLlpTIFtbTGlua10oaHR0cHM6Ly9kYXRhLndvcmxkYmFuay5vcmcvaW5kaWNhdG9yL1NMLlVFTS5UT1RMLkZFLlpTKV0KCjEwLiBVbmVtcGxveW1lbnQsIG1hbGUgKCUgb2YgbWFsZSBsYWJvciBmb3JjZSkgKG1vZGVsZWQgSUxPIGVzdGltYXRlKe+8mlNMLlVFTS5UT1RMLk1BLlpTIFtbTGlua10oaHR0cHM6Ly9kYXRhLndvcmxkYmFuay5vcmcvaW5kaWNhdG9yL1NMLlVFTS5UT1RMLk1BLlpTKV0KCjExLiBOZXQgb2ZmaWNpYWwgZGV2ZWxvcG1lbnQgYXNzaXN0YW5jZSBhbmQgb2ZmaWNpYWwgYWlkIHJlY2VpdmVkIChjdXJyZW50IFVTXCQpIERULk9EQS5BTExELkNEIFtbTGlua10oaHR0cHM6Ly9kYXRhLndvcmxkYmFuay5vcmcvaW5kaWNhdG9yL0RULk9EQS5BTExELkNEKV0KCiMgMS4g5Zu944Gu5pWZ6IKy44Gr6Zai44GZ44KL5pSv5Ye6Cgo+IOamguimge+8muWbveWGhee3j+eUn+eUo++8iEdEUO+8ieOBq+WvvuOBmeOCi+OAgeWbveOBruaVmeiCsuOBq+mWouOBmeOCi+aUr+WHuu+8iEdvdmVybm1lbnQgZXhwZW5kaXR1cmUgb24gZWR1Y2F0aW9uLCB0b3RhbCAoJSBvZiBHRFAp77yJ44Gu44OH44O844K/44Gu5YiG5p6Q44KS6KGM44GGCgojIyDjg4fjg7zjgr8KCi0gICBHb3Zlcm5tZW50IGV4cGVuZGl0dXJlIG9uIGVkdWNhdGlvbiwgdG90YWwgKCUgb2YgR0RQKe+8mlNFLlhQRC5UT1RMLkdELlpTIFtbTGlua10oaHR0cHM6Ly9kYXRhLndvcmxkYmFuay5vcmcvaW5kaWNhdG9yL1NFLlhQRC5UT1RMLkdELlpTKV0KCi0gICBHZW5lcmFsIGdvdmVybm1lbnQgZXhwZW5kaXR1cmUgb24gZWR1Y2F0aW9uIChjdXJyZW50LCBjYXBpdGFsLCBhbmQgdHJhbnNmZXJzKSBpcyBleHByZXNzZWQgYXMgYSBwZXJjZW50YWdlIG9mIEdEUC4gSXQgaW5jbHVkZXMgZXhwZW5kaXR1cmUgZnVuZGVkIGJ5IHRyYW5zZmVycyBmcm9tIGludGVybmF0aW9uYWwgc291cmNlcyB0byBnb3Zlcm5tZW50LiBHZW5lcmFsIGdvdmVybm1lbnQgdXN1YWxseSByZWZlcnMgdG8gbG9jYWwsIHJlZ2lvbmFsIGFuZCBjZW50cmFsIGdvdmVybm1lbnRzLgoKIyMjIOODh+ODvOOCv+aDheWgsQoKLSAgIOODh+ODvOOCv+WQje+8muWbveOBruaVmeiCsumWoumAo+aUr+WHuu+8iEdEUOavlCAl77yJCgotICAg44OH44O844K/44Kz44O844OJ77yaU0UuWFBELlRPVEwuR0QuWlMKCi0gICDlpInmlbDlkI3vvJpgZWRfZXhwYAoKLSAgIOamguimge+8muaVmeiCsuOBq+WvvuOBmeOCi+aUv+W6nOOBruS4gOiIrOaUr+WHuu+8iOe1jOW4uOOAgeizh+acrOOAgeenu+i7ou+8ieOBryBHRFAg44Gu5Ymy5ZCI44Gn6KGo44GV44KM44G+44GZ44CC44GT44KM44Gr44Gv44CB5Zu96Zqb6LOH6YeR5rqQ44GL44KJ5pS/5bqc44G444Gu6YCB6YeR44Gr44KI44Gj44Gm6LOH6YeR5o+Q5L6b44GV44KM44Gf5pSv5Ye644GM5ZCr44G+44KM44G+44GZ44CC5LiA6Iis5pS/5bqc44Go44Gv6YCa5bi444CB5Zyw5pa56Ieq5rK75L2T44CB5Zyw5Z+f5pS/5bqc44CB5Lit5aSu5pS/5bqc44KS5oyH44GX44G+44GZ44CCCgojIyMg44OH44O844K/44Gu5Y+W5b6XCgojIyMjIOa6luWCmQoKYGBge3J9CmxpYnJhcnkodGlkeXZlcnNlKQpsaWJyYXJ5KFdESSkKYGBgCgpXREkg44OR44OD44Kx44O844K444KS5L2/44Gj44Gm44CB55u05o6l44OH44O844K/44KS44OA44Km44Oz44Ot44O844OJ44GX44CB5aSJ5pWw5ZCN44KS44CBYGVkX2V4cGAg44Gr5oyH5a6a44CCCgpgYGB7ciBldmFsID0gRkFMU0V9CmRmX2VkX2V4cCA8LSBXREkoaW5kaWNhdG9yID0gYyhlZF9leHAgPSAiU0UuWFBELlRPVEwuR0QuWlMiKSkKYGBgCgpgYGB7ciBldmFsID0gRkFMU0V9CndyaXRlX2NzdihkZl9lZF9leHAsICJkYXRhL2VkX2V4cC5jc3YiKQpgYGAKCmBgYHtyfQpkZl9lZF9leHAgPC0gcmVhZF9jc3YoImRhdGEvZWRfZXhwLmNzdiIpCmBgYAoKIyMjIOODh+ODvOOCv+OBrueiuuiqjQoKYGBge3J9CmRmX2VkX2V4cApgYGAKCmBgYHtyfQpzdHIoZGZfZWRfZXhwKQpgYGAKCmBgYHtyfQpSRUdJT04gPC0gYygiMUEiLCAiMVciLCAiNEUiLCAiN0UiLCAiOFMiLCAiQjgiLCAiRVUiLCAiRjEiLCAiT0UiLCAiUzEiLCAKIlMyIiwgIlMzIiwgIlM0IiwgIlQyIiwgIlQzIiwgIlQ0IiwgIlQ1IiwgIlQ2IiwgIlQ3IiwgIlYxIiwgIlYyIiwgCiJWMyIsICJWNCIsICJYQyIsICJYRCIsICJYRSIsICJYRiIsICJYRyIsICJYSCIsICJYSSIsICJYSiIsICJYTCIsIAoiWE0iLCAiWE4iLCAiWE8iLCAiWFAiLCAiWFEiLCAiWFQiLCAiWFUiLCAiWFkiLCAiWjQiLCAiWjciLCAiWkYiLCAKIlpHIiwgIlpIIiwgIlpJIiwgIlpKIiwgIlpRIiwgIlpUIikKYGBgCgpgYGB7cn0KZGZfZWRfZXhwIHw+IGZpbHRlcihpc28yYyAlaW4lIFJFR0lPTikgfD4gZGlzdGluY3QoY291bnRyeSwgaXNvMmMpCmBgYAoKYGBge3J9CmRmX2VkX2V4cCB8PiBmaWx0ZXIoIShpc28yYyAlaW4lIFJFR0lPTikpIHw+IGRpc3RpbmN0KGNvdW50cnksIGlzbzJjKQpgYGAKCiMjIyDliIbmnpDjgZnjgovlm73jga7jg6rjgrnjg4gKCiMjIyMgKirljZfpg6jjgqLjg5Xjg6rjgqvplqLnqI7lkIznm58qKiBUaGUgU291dGhlcm4gQWZyaWNhbiBDdXN0b21zIFVuaW9uIChTQUNVKQoKYGBge3J9ClNPVVRIX0FGUklDQV9GSVZFIDwtIGMoIlNvdXRoIEFmcmljYSIsICJOYW1pYmlhIiwgIkVzd2F0aW5pIiwgIkJvdHN3YW5hIiwgIkxlc290aG8iKQpgYGAKCiMjIyMg44Op44OG44Oz44Ki44Oh44Oq44Kr44Gn44K444OL5oyH5pWw44GM5aSn44GN44GE77yU44Kr5Zu9CgpgYGB7cn0KQ0hPU0VOX0NPVU5UUklFUyA8LSBjKCJTdXJpbmFtZSIsICJCZWxpemUiLCAiQnJhemlsIiwgIkNvbG9tYmlhIikKYGBgCgojIyDliIbmnpAKCiMjIyAxLiDlkITlubTmr47jga7jg4fjg7zjgr/jga7mlbDjga7mo5LjgrDjg6njg5UKCmBgYHtyfQpkZl9lZF9leHAgfD4gZHJvcF9uYShlZF9leHApIHw+IGZpbHRlcighKGlzbzJjICVpbiUgUkVHSU9OKSkgfD4KICBnZ3Bsb3QoYWVzKHllYXIpKSArIGdlb21fYmFyKCkKYGBgCgojIyDoppbopprljJYKCiMjIyAyLiDml6XmnKzjga7mlZnogrLosrvvvIglIG9mIEdEUO+8iQoKYGBge3J9CmRmX2VkX2V4cCB8PiBmaWx0ZXIoY291bnRyeSA9PSAiSmFwYW4iKSB8PiAKICBkcm9wX25hKGVkX2V4cCkgfD4gYXJyYW5nZShkZXNjKHllYXIpKQpgYGAKCiMjIyAzLiDntYzlubTlpInljJYKCiMjIyMgYS4g5pel5pysCgpgYGB7cn0KZGZfZWRfZXhwIHw+IGZpbHRlcihjb3VudHJ5ID09ICJKYXBhbiIpIHw+IGRyb3BfbmEoZWRfZXhwKSB8PgogIGdncGxvdChhZXMoeWVhciwgZWRfZXhwKSkgKyBnZW9tX2xpbmUoKQpgYGAKCioq5rCX44Gl44GE44Gf44GT44Go44O755aR5ZWPKioKCi0gICAxOTcw5bm05Luj44Gu5oCl5r+A44Gq5LiK5piH44CBMTk5MOW5tOOBlOOCjeOBruaApea/gOOBquePvuixoeOBr+OAgeS9leOBjOWOn+WboOOBquOBruOBoOOCjeOBhuOAggoKLSAgIDIwMTTlubTjgZTjgo3jgYvjgonmuJvlsJHjgIEyMDE45bm044GU44KN44GL44KJ5aKX5Yqg44CBMjAyMOW5tOOBi+OCiTIwMjHlubTjga/muJvlsJHjgIIKCiMjIyMgYi4g5Y2X6YOo44Ki44OV44Oq44Kr6Zai56iO5ZCM55ufCgpgYGB7cn0KZGZfZWRfZXhwIHw+IGZpbHRlcihjb3VudHJ5ICVpbiUgU09VVEhfQUZSSUNBX0ZJVkUpIHw+IGRyb3BfbmEoZWRfZXhwKSB8PgogIGdncGxvdChhZXMoeWVhciwgZWRfZXhwKSkgKyBnZW9tX2xpbmUoYWVzKGNvbCA9IGNvdW50cnkpKQpgYGAKCioq5Y+C6ICD77ya5bmz5Z2H55qE44Gq5YCk44KS5puy57ea44Gn6KGo44GZ44GT44Go44KC5Y+v6IO944Gn44GZ44CCbG9lc3Mg44KS5L2/44GG44Go5ruR44KJ44GL44Gq5puy57ea44Gn6L+R5Ly844GX44Gm44GP44KM44G+44GZ44CCKioKCmBgYHtyfQpkZl9lZF9leHAgfD4gZmlsdGVyKGNvdW50cnkgJWluJSBTT1VUSF9BRlJJQ0FfRklWRSkgfD4gZHJvcF9uYShlZF9leHApIHw+CiAgZ2dwbG90KGFlcyh5ZWFyLCBlZF9leHApKSArIGdlb21fbGluZShhZXMoY29sID0gY291bnRyeSkpICsKICBnZW9tX3Ntb290aChmb3JtdWxhID0gJ3l+eCcsIG1ldGhvZCA9ICJsb2VzcyIsIHNlID0gRkFMU0UpCmBgYAoKKirmsJfjgaXjgYTjgZ/jgZPjgajjg7vnlpHllY8qKgoKLSAgIOW5s+Wdh+OBp+imi+OCi+OBqOOAgeS4iuaYh+OBl+OBpuOBjeOBpuOBiuOCiuOAgTclIOeoi+W6puOBqOOBhOOBhuWkp+OBjeOBquWJsuWQiOOBq+OBquOBo+OBpuOBhOOCi+OAggoKIyMjIyBjLiDjg6njg4bjg7PjgqLjg6Hjg6rjgqvvvJTjgqvlm70KCmBgYHtyfQpkZl9lZF9leHAgfD4gZmlsdGVyKGNvdW50cnkgJWluJSBDSE9TRU5fQ09VTlRSSUVTKSB8PiBkcm9wX25hKGVkX2V4cCkgfD4KICBnZ3Bsb3QoYWVzKHllYXIsIGVkX2V4cCkpICsgZ2VvbV9saW5lKGFlcyhjb2wgPSBjb3VudHJ5KSkKYGBgCgoqKuWPguiAg++8muW5s+Wdh+eahOOBquWApOOCkuabsue3muOBp+ihqOOBmeOBk+OBqOOCguWPr+iDveOBp+OBmeOAgmxvZXNzIOOCkuS9v+OBhuOBqOa7keOCieOBi+OBquabsue3muOBp+i/keS8vOOBl+OBpuOBj+OCjOOBvuOBmeOAgioqCgpgYGB7cn0KZGZfZWRfZXhwIHw+IGZpbHRlcihjb3VudHJ5ICVpbiUgQ0hPU0VOX0NPVU5UUklFUykgfD4gZHJvcF9uYShlZF9leHApIHw+CiAgZ2dwbG90KGFlcyh5ZWFyLCBlZF9leHApKSArIGdlb21fbGluZShhZXMoY29sID0gY291bnRyeSkpICsKICBnZW9tX3Ntb290aChmb3JtdWxhID0gJ3l+eCcsIG1ldGhvZCA9ICJsb2VzcyIsIHNlID0gRkFMU0UpCmBgYAoKIyMjIOWIhuW4gwoK44OH44O844K/44Gu5pWw44GL44KJ44CB44G+44Ga44Gv44CBMjAyMOW5tOOBq+OBpOOBhOOBpuimi+OBpuOBv+OCi+OAggoKYGBge3J9CmRmX2VkX2V4cCB8PiBmaWx0ZXIoeWVhciA9PSAyMDIwKSB8PiBmaWx0ZXIoIShjb3VudHJ5ICVpbiUgUkVHSU9OKSl8PgogIGRyb3BfbmEoZWRfZXhwKSB8PgogIGdncGxvdChhZXMoZWRfZXhwKSkgKyBnZW9tX2hpc3RvZ3JhbShiaW53aWR0aCA9IDEpCmBgYAoKKirlj4LogIPvvJoqKlNBQ1Ug44Gu77yV44Kr5Zu944Gu5YCk44KS57im57ea44Gn5pu444GN6L6844KA44Gr44Gv5LiL44Gu44KI44GG44Gr44GX44G+44GZ44CCCgpgYGB7cn0KZGZfZWRfZXhwIHw+IGZpbHRlcih5ZWFyID09IDIwMjApIHw+IGZpbHRlcihjb3VudHJ5ICVpbiUgU09VVEhfQUZSSUNBX0ZJVkUpIApgYGAKCioq5Y+C6ICD77ya5pel5pys44GoKipTQUNVIOOBru+8leOCq+WbveOBruWApOOCkue4pue3muOBp+abuOOBjei+vOOCgOOBq+OBr+S4i+OBruOCiOOBhuOBq+OBl+OBvuOBmeOAggoKYGBge3J9CkpQIDwtIDMuNDE2OTgxClNBRiA8LSBkZl9lZF9leHAgfD4gZmlsdGVyKHllYXIgPT0gMjAyMCkgfD4gZmlsdGVyKGNvdW50cnkgJWluJSBTT1VUSF9BRlJJQ0FfRklWRSkgfD4gcHVsbChlZF9leHApCmRmX2VkX2V4cCB8PiBmaWx0ZXIoeWVhciA9PSAyMDIwKSB8PiBmaWx0ZXIoIShjb3VudHJ5ICVpbiUgUkVHSU9OKSl8PgogIGRyb3BfbmEoZWRfZXhwKSB8PgogIGdncGxvdCgpICsgZ2VvbV9oaXN0b2dyYW0oYWVzKGVkX2V4cCksIGJpbndpZHRoID0gMSkgKwogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IFNBRiwgY29sID0gInJlZCIpICsgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gSlAsIGNvbCA9ICJibHVlIikgK2xhYnModGl0bGUgPSAiMjAyMOW5tOOBruaVmeiCsuiyu+OBruWvvkdEUOeZvuWIhueOhyIsIHN1YnRpdGxlID0gIuaXpeacrO+8mumdkuOAgVNBQ1XvvJrotaQiKQpgYGAKCiMjIyDjg4fjg7zjgr/jgYzljYHliIbjgYLjgovmnIDov5Hjga7lubTjga7lgKTjga4xMOOCq+WbveOBruWApOOBruajkuOCsOODqeODlQoKIyMjIyBhLiDlgKTjgYzlpKfjgY3jgYTmlrnjgYvjgokKCmBgYHtyfQpkZl9lZF9leHAgfD4gZmlsdGVyKHllYXIgPT0gMjAyMCkgfD4gZHJvcF9uYShlZF9leHApIHw+IAogIGZpbHRlcighKGlzbzJjICVpbiUgUkVHSU9OKSl8PgogIGFycmFuZ2UoZGVzYyhlZF9leHApKSB8PiBoZWFkKDEwKSB8PiAKICBnZ3Bsb3QoYWVzKGZjdF9yZW9yZGVyKGNvdW50cnksIGVkX2V4cCksIGVkX2V4cCkpICsgZ2VvbV9jb2woKSArIAogIGNvb3JkX2ZsaXAoKSArIGxhYnModGl0bGUgPSAiVG9wIDEwIENvdW50cmllcyIsIHggPSAiY291bnRyeSIsIHkgPSAiR292ZXJubWVudCBleHBlbmRpdHVyZSBvbiBlZHVjYXRpb24sIHRvdGFsICglIG9mIEdEUCkiKQpgYGAKCiMjIyMgYi4g5YCk44GM5bCP44GV44GE5pa544GL44KJCgpgYGB7cn0KZGZfZWRfZXhwIHw+IGZpbHRlcih5ZWFyID09IDIwMjApIHw+IGRyb3BfbmEoZWRfZXhwKSB8PiAKICBmaWx0ZXIoIShpc28yYyAlaW4lIFJFR0lPTikpfD4KICBhcnJhbmdlKGVkX2V4cCkgfD4gaGVhZCgxMCkgfD4gCiAgZ2dwbG90KGFlcyhmY3RfcmV2KGZjdF9yZW9yZGVyKGNvdW50cnksIGVkX2V4cCkpLCBlZF9leHApKSArIGdlb21fY29sKCkgKyAKICBjb29yZF9mbGlwKCkgKyBsYWJzKHRpdGxlID0gIkxvd2VzdCAxMCBDb3VudHJpZXMiLCB4ID0gImNvdW50cnkiLCB5ID0gIkdvdmVybm1lbnQgZXhwZW5kaXR1cmUgb24gZWR1Y2F0aW9uLCB0b3RhbCAoJSBvZiBHRFApIikKYGBgCgojIDIuIOWIneetieWtpuagoeWwseWtpueOhwoKIyMg44OH44O844K/CgotICAgU2Nob29sIGVucm9sbG1lbnQsIHByaW1hcnkgKCUgZ3Jvc3Mp77yaU0UuUFJNLkVOUlIgW1tMaW5rXShodHRwczovL2RhdGEud29ybGRiYW5rLm9yZy9pbmRpY2F0b3IvU0UuUFJNLkVOUlIpXQotICAgR3Jvc3MgZW5yb2xsbWVudCByYXRpbyBpcyB0aGUgcmF0aW8gb2YgdG90YWwgZW5yb2xsbWVudCwgcmVnYXJkbGVzcyBvZiBhZ2UsIHRvIHRoZSBwb3B1bGF0aW9uIG9mIHRoZSBhZ2UgZ3JvdXAgdGhhdCBvZmZpY2lhbGx5IGNvcnJlc3BvbmRzIHRvIHRoZSBsZXZlbCBvZiBlZHVjYXRpb24gc2hvd24uIFByaW1hcnkgZWR1Y2F0aW9uIHByb3ZpZGVzIGNoaWxkcmVuIHdpdGggYmFzaWMgcmVhZGluZywgd3JpdGluZywgYW5kIG1hdGhlbWF0aWNzIHNraWxscyBhbG9uZyB3aXRoIGFuIGVsZW1lbnRhcnkgdW5kZXJzdGFuZGluZyBvZiBzdWNoIHN1YmplY3RzIGFzIGhpc3RvcnksIGdlb2dyYXBoeSwgbmF0dXJhbCBzY2llbmNlLCBzb2NpYWwgc2NpZW5jZSwgYXJ0LCBhbmQgbXVzaWMuCgojIyMg44OH44O844K/5oOF5aCxCgotICAg44OH44O844K/5ZCN77ya5Yid562J5a2m5qCh5bCx5a2m546HCgotICAg44OH44O844K/44Kz44O844OJ77yaU0UuUFJNLkVOUlIKCi0gICDlpInmlbDlkI3vvJpwcmltYXJ5CgotICAg5qaC6KaB77ya57eP5bCx5a2m546H44Gv44CB5bm06b2i44Gr6Zai5L+C44Gq44GP44CB6KGo56S644GV44KM44Gm44GE44KL5pWZ6IKy44Os44OZ44Or44Gr5q2j5byP44Gr5a++5b+c44GZ44KL5bm06b2i5bGk44Gu5Lq65Y+j44Gr5a++44GZ44KL57eP5bCx5a2m6ICF5pWw44Gu5q+U546H44Gn44GZ44CC5Yid562J5pWZ6IKy44Gn44Gv44CB5a2Q5L6b44Gf44Gh44Gr5Z+65pys55qE44Gq6Kqt44G/5pu444GN44CB5pWw5a2m44Gu44K544Kt44Or44Go44CB5q205Y+y44CB5Zyw55CG44CB6Ieq54S256eR5a2m44CB56S+5Lya56eR5a2m44CB6Iq46KGT44CB6Z+z5qW944Gq44Gp44Gu56eR55uu44Gu5Yid5q2p55qE44Gq55CG6Kej44KS5o+Q5L6b44GX44G+44GZ44CCCgojIyMg44OH44O844K/44Gu5Y+W5b6XCgojIyMjIOa6luWCmQoKYGBge3J9CmxpYnJhcnkodGlkeXZlcnNlKQpsaWJyYXJ5KFdESSkKYGBgCgpXREkg44OR44OD44Kx44O844K444KS5L2/44Gj44Gm44CB55u05o6l44OH44O844K/44KS44OA44Km44Oz44Ot44O844OJ44GX44CB5aSJ5pWw5ZCN44KS44CBYGVkX2V4cGAg44Gr5oyH5a6a44CCCgpgYGB7ciBldmFsID0gRkFMU0V9CmRmX3ByaW1hcnkgPC0gV0RJKGluZGljYXRvciA9IGMocHJpbWFyeSA9ICJTRS5QUk0uRU5SUiIpKQpgYGAKCmBgYHtyIGV2YWwgPSBGQUxTRX0Kd3JpdGVfY3N2KGRmX3ByaW1hcnksICJkYXRhL3ByaW1hcnkuY3N2IikKYGBgCgpgYGB7cn0KZGZfcHJpbWFyeSA8LSByZWFkX2NzdigiZGF0YS9wcmltYXJ5LmNzdiIpCmBgYAoKIyMjIOODh+ODvOOCv+OBrueiuuiqjQoKYGBge3J9CmRmX3ByaW1hcnkKYGBgCgpgYGB7cn0Kc3RyKGRmX3ByaW1hcnkpCmBgYAoKYGBge3J9ClJFR0lPTiA8LSBjKCIxQSIsICIxVyIsICI0RSIsICI3RSIsICI4UyIsICJCOCIsICJFVSIsICJGMSIsICJPRSIsICJTMSIsIAoiUzIiLCAiUzMiLCAiUzQiLCAiVDIiLCAiVDMiLCAiVDQiLCAiVDUiLCAiVDYiLCAiVDciLCAiVjEiLCAiVjIiLCAKIlYzIiwgIlY0IiwgIlhDIiwgIlhEIiwgIlhFIiwgIlhGIiwgIlhHIiwgIlhIIiwgIlhJIiwgIlhKIiwgIlhMIiwgCiJYTSIsICJYTiIsICJYTyIsICJYUCIsICJYUSIsICJYVCIsICJYVSIsICJYWSIsICJaNCIsICJaNyIsICJaRiIsIAoiWkciLCAiWkgiLCAiWkkiLCAiWkoiLCAiWlEiLCAiWlQiKQpgYGAKCmBgYHtyfQpkZl9wcmltYXJ5IHw+IGZpbHRlcihpc28yYyAlaW4lIFJFR0lPTikgfD4gZGlzdGluY3QoY291bnRyeSwgaXNvMmMpCmBgYAoKIyMjIOWIhuaekOOBmeOCi+WbveOBruODquOCueODiAoKIyMjIyAqKuWNl+mDqOOCouODleODquOCq+mWoueojuWQjOebnyoqIFRoZSBTb3V0aGVybiBBZnJpY2FuIEN1c3RvbXMgVW5pb24gKFNBQ1UpCgpgYGB7cn0KU09VVEhfQUZSSUNBX0ZJVkUgPC0gYygiU291dGggQWZyaWNhIiwgIk5hbWliaWEiLCAiRXN3YXRpbmkiLCAiQm90c3dhbmEiLCAiTGVzb3RobyIpCmBgYAoKIyMjIyDjg6njg4bjg7PjgqLjg6Hjg6rjgqvjgafjgrjjg4vmjIfmlbDjgYzlpKfjgY3jgYTvvJTjgqvlm70KCmBgYHtyfQpDSE9TRU5fQ09VTlRSSUVTIDwtIGMoIlN1cmluYW1lIiwgIkJlbGl6ZSIsICJCcmF6aWwiLCAiQ29sb21iaWEiKQpgYGAKCiMjIOWIhuaekAoKIyMjIDEuIOWQhOW5tOavjuOBruODh+ODvOOCv+OBruaVsOOBruajkuOCsOODqeODlQoKYGBge3J9CmRmX3ByaW1hcnkgfD4gZHJvcF9uYShwcmltYXJ5KSB8PiBmaWx0ZXIoIShpc28yYyAlaW4lIFJFR0lPTikpIHw+CiAgZ2dwbG90KGFlcyh5ZWFyKSkgKyBnZW9tX2JhcigpCmBgYAoKIyMg6KaW6Kaa5YyWCgojIyMgMi4g5pel5pys44Gu5Yid562J5a2m5qCh5bCx5a2m546HCgpgYGB7cn0KZGZfcHJpbWFyeSB8PiBmaWx0ZXIoY291bnRyeSA9PSAiSmFwYW4iKSB8PiAKICBkcm9wX25hKHByaW1hcnkpIHw+IGFycmFuZ2UoZGVzYyh5ZWFyKSkKYGBgCgojIyMgMy4g57WM5bm05aSJ5YyWCgojIyMjIGEuIOaXpeacrAoKYGBge3J9CmRmX3ByaW1hcnkgfD4gZmlsdGVyKGNvdW50cnkgPT0gIkphcGFuIikgfD4gZHJvcF9uYShwcmltYXJ5KSB8PgogIGdncGxvdChhZXMoeWVhciwgcHJpbWFyeSkpICsgZ2VvbV9saW5lKCkKYGBgCgoqKuawl+OBpeOBhOOBn+OBk+OBqOODu+eWkeWVjyoqCgotICAgMTk3MOW5tOS7o+OBruaApea/gOOBquS4iuaYh+ODu+S4i+mZjeOAgTE5ODDlubTjgZTjgo3jgYvjgonkuIrmmIfjgIHjgZ3jgZPjgafjgIExMDAg44KS6LaF44GI44Gm44GE44KL44CCMTk5NeW5tOOBlOOCjeOBi+OCieOBr+OAgea4m+WwkeOBl+OBpuOBhOOCi+OBjOOAgeOBvuOBoOOAgTEwMOS7peS4iuOBp+OBguOCi+OAguS9leOBjOWOn+WboOOBquOBruOBoOOCjeOBhuOAggoKIyMjIyBiLiDljZfpg6jjgqLjg5Xjg6rjgqvplqLnqI7lkIznm58KCmBgYHtyfQpkZl9wcmltYXJ5IHw+IGZpbHRlcihjb3VudHJ5ICVpbiUgU09VVEhfQUZSSUNBX0ZJVkUpIHw+IGRyb3BfbmEocHJpbWFyeSkgfD4KICBnZ3Bsb3QoYWVzKHllYXIsIHByaW1hcnkpKSArIGdlb21fbGluZShhZXMoY29sID0gY291bnRyeSkpCmBgYAoKKirlj4LogIPvvJrlubPlnYfnmoTjgarlgKTjgpLmm7Lnt5rjgafooajjgZnjgZPjgajjgoLlj6/og73jgafjgZnjgIJsb2VzcyDjgpLkvb/jgYbjgajmu5HjgonjgYvjgarmm7Lnt5rjgafov5HkvLzjgZfjgabjgY/jgozjgb7jgZnjgIIqKgoKYGBge3J9CmRmX3ByaW1hcnkgfD4gZmlsdGVyKGNvdW50cnkgJWluJSBTT1VUSF9BRlJJQ0FfRklWRSkgfD4gZHJvcF9uYShwcmltYXJ5KSB8PgogIGdncGxvdChhZXMoeWVhciwgcHJpbWFyeSkpICsgZ2VvbV9saW5lKGFlcyhjb2wgPSBjb3VudHJ5KSkgKwogIGdlb21fc21vb3RoKGZvcm11bGEgPSAneX54JywgbWV0aG9kID0gImxvZXNzIiwgc2UgPSBGQUxTRSkKYGBgCgoqKuawl+OBpeOBhOOBn+OBk+OBqOODu+eWkeWVjyoqCgotICAgMTAw44KS6LaF44GI44Gm44GE44KL44CCCgojIyMjIGMuIOODqeODhuODs+OCouODoeODquOCq++8lOOCq+WbvQoKYGBge3J9CmRmX3ByaW1hcnkgfD4gZmlsdGVyKGNvdW50cnkgJWluJSBDSE9TRU5fQ09VTlRSSUVTKSB8PiBkcm9wX25hKHByaW1hcnkpIHw+CiAgZ2dwbG90KGFlcyh5ZWFyLCBwcmltYXJ5KSkgKyBnZW9tX2xpbmUoYWVzKGNvbCA9IGNvdW50cnkpKQpgYGAKCioq5Y+C6ICD77ya5bmz5Z2H55qE44Gq5YCk44KS5puy57ea44Gn6KGo44GZ44GT44Go44KC5Y+v6IO944Gn44GZ44CCbG9lc3Mg44KS5L2/44GG44Go5ruR44KJ44GL44Gq5puy57ea44Gn6L+R5Ly844GX44Gm44GP44KM44G+44GZ44CCKioKCmBgYHtyfQpkZl9wcmltYXJ5IHw+IGZpbHRlcihjb3VudHJ5ICVpbiUgQ0hPU0VOX0NPVU5UUklFUykgfD4gZHJvcF9uYShwcmltYXJ5KSB8PgogIGdncGxvdChhZXMoeWVhciwgcHJpbWFyeSkpICsgZ2VvbV9saW5lKGFlcyhjb2wgPSBjb3VudHJ5KSkgKwogIGdlb21fc21vb3RoKGZvcm11bGEgPSAneX54JywgbWV0aG9kID0gImxvZXNzIiwgc2UgPSBGQUxTRSkKYGBgCgojIyMg5YiG5biDCgrjg4fjg7zjgr/jga7mlbDjgYvjgonjgIHjgb7jgZrjga/jgIEyMDIw5bm044Gr44Gk44GE44Gm6KaL44Gm44G/44KL44CCCgpgYGB7cn0KZGZfcHJpbWFyeSB8PiBmaWx0ZXIoeWVhciA9PSAyMDIwKSB8PiBmaWx0ZXIoIShjb3VudHJ5ICVpbiUgUkVHSU9OKSl8PgogIGRyb3BfbmEocHJpbWFyeSkgfD4KICBnZ3Bsb3QoYWVzKHByaW1hcnkpKSArIGdlb21faGlzdG9ncmFtKGJpbndpZHRoID0gNSkKYGBgCgoqKuWPguiAg++8mioqU0FDVSDjga7vvJXjgqvlm73jga7lgKTjgpLnuKbnt5rjgafmm7jjgY3ovrzjgoDjgavjga/kuIvjga7jgojjgYbjgavjgZfjgb7jgZnjgIIKCmBgYHtyfQpkZl9wcmltYXJ5IHw+IGZpbHRlcih5ZWFyID09IDIwMjApIHw+IGZpbHRlcihjb3VudHJ5ICVpbiUgU09VVEhfQUZSSUNBX0ZJVkUpIApgYGAKCioq5Y+C6ICD77ya5pel5pys44GoKipTQUNVIOOBru+8leOCq+WbveOBruWApOOCkue4pue3muOBp+abuOOBjei+vOOCgOOBq+OBr+S4i+OBruOCiOOBhuOBq+OBl+OBvuOBmeOAggoKYGBge3J9CkpQIDwtIDEwMi43MzY4MwpTQUYgPC0gZGZfcHJpbWFyeSB8PiBmaWx0ZXIoeWVhciA9PSAyMDIwKSB8PiBmaWx0ZXIoY291bnRyeSAlaW4lIFNPVVRIX0FGUklDQV9GSVZFKSB8PiBwdWxsKHByaW1hcnkpCmRmX3ByaW1hcnkgfD4gZmlsdGVyKHllYXIgPT0gMjAyMCkgfD4gZmlsdGVyKCEoY291bnRyeSAlaW4lIFJFR0lPTikpfD4KICBkcm9wX25hKHByaW1hcnkpIHw+CiAgZ2dwbG90KCkgKyBnZW9tX2hpc3RvZ3JhbShhZXMocHJpbWFyeSksIGJpbndpZHRoID0gNSkgKwogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IFNBRiwgY29sID0gInJlZCIpICsgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gSlAsIGNvbCA9ICJibHVlIikgK2xhYnModGl0bGUgPSAiMjAyMOW5tOOBruWIneetieWtpuagoeWwseWtpueOhyIsIHN1YnRpdGxlID0gIuaXpeacrO+8mumdkuOAgVNBQ1XvvJrotaQiKQpgYGAKCiMjIyDjg4fjg7zjgr/jgYzljYHliIbjgYLjgovmnIDov5Hjga7lubTjga7lgKTjga4xMOOCq+WbveOBruWApOOBruajkuOCsOODqeODlQoKIyMjIyBhLiDlgKTjgYzlpKfjgY3jgYTmlrnjgYvjgokKCmBgYHtyfQpkZl9wcmltYXJ5IHw+IGZpbHRlcih5ZWFyID09IDIwMjApIHw+IGRyb3BfbmEocHJpbWFyeSkgfD4gCiAgZmlsdGVyKCEoaXNvMmMgJWluJSBSRUdJT04pKXw+CiAgYXJyYW5nZShkZXNjKHByaW1hcnkpKSB8PiBoZWFkKDEwKSB8PiAKICBnZ3Bsb3QoYWVzKGZjdF9yZW9yZGVyKGNvdW50cnksIHByaW1hcnkpLCBwcmltYXJ5KSkgKyBnZW9tX2NvbCgpICsgCiAgY29vcmRfZmxpcCgpICsgbGFicyh0aXRsZSA9ICJUb3AgMTAgQ291bnRyaWVzIiwgeCA9ICJjb3VudHJ5IiwgeSA9ICLliJ3nrYnlrabmoKHlsLHlrabnjociKQpgYGAKCiMjIyMgYi4g5YCk44GM5bCP44GV44GE5pa544GL44KJCgpgYGB7cn0KZGZfcHJpbWFyeSB8PiBmaWx0ZXIoeWVhciA9PSAyMDIwKSB8PiBkcm9wX25hKHByaW1hcnkpIHw+IAogIGZpbHRlcighKGlzbzJjICVpbiUgUkVHSU9OKSl8PgogIGFycmFuZ2UocHJpbWFyeSkgfD4gaGVhZCgxMCkgfD4gCiAgZ2dwbG90KGFlcyhmY3RfcmV2KGZjdF9yZW9yZGVyKGNvdW50cnksIHByaW1hcnkpKSwgcHJpbWFyeSkpICsgZ2VvbV9jb2woKSArIAogIGNvb3JkX2ZsaXAoKSArIGxhYnModGl0bGUgPSAiTG93ZXN0IDEwIENvdW50cmllcyIsIHggPSAiY291bnRyeSIsIHkgPSAi5Yid562J5a2m5qCh5bCx5a2m546HIikKYGBgCgojIDMuIOS4reetieWtpuagoeWwseWtpueOhwoKIyMg44OH44O844K/CgotICAgU2Nob29sIGVucm9sbG1lbnQsIHNlY29uZGFyeSAoJSBncm9zcynvvJpTRS5TRUMuRU5SUiBbW0xpbmtdKGh0dHBzOi8vZGF0YS53b3JsZGJhbmsub3JnL2luZGljYXRvci9TRS5TRUMuRU5SUildCi0gICBHcm9zcyBlbnJvbGxtZW50IHJhdGlvIGlzIHRoZSByYXRpbyBvZiB0b3RhbCBlbnJvbGxtZW50LCByZWdhcmRsZXNzIG9mIGFnZSwgdG8gdGhlIHBvcHVsYXRpb24gb2YgdGhlIGFnZSBncm91cCB0aGF0IG9mZmljaWFsbHkgY29ycmVzcG9uZHMgdG8gdGhlIGxldmVsIG9mIGVkdWNhdGlvbiBzaG93bi4gU2Vjb25kYXJ5IGVkdWNhdGlvbiBjb21wbGV0ZXMgdGhlIHByb3Zpc2lvbiBvZiBiYXNpYyBlZHVjYXRpb24gdGhhdCBiZWdhbiBhdCB0aGUgcHJpbWFyeSBsZXZlbCwgYW5kIGFpbXMgYXQgbGF5aW5nIHRoZSBmb3VuZGF0aW9ucyBmb3IgbGlmZWxvbmcgbGVhcm5pbmcgYW5kIGh1bWFuIGRldmVsb3BtZW50LCBieSBvZmZlcmluZyBtb3JlIHN1YmplY3QtIG9yIHNraWxsLW9yaWVudGVkIGluc3RydWN0aW9uIHVzaW5nIG1vcmUgc3BlY2lhbGl6ZWQgdGVhY2hlcnMuCgojIyMg44OH44O844K/5oOF5aCxCgotICAg44OH44O844K/5ZCN77ya5Lit562J5a2m5qCh5bCx5a2m546HCgotICAg44OH44O844K/44Kz44O844OJ77yaU0UuU0VDLkVOUlIKCi0gICDlpInmlbDlkI3vvJpzZWNvbmRhcnkKCi0gICDmpoLopoHvvJrnt4/lsLHlrabnjofjga/jgIHlubTpvaLjgavplqLkv4LjgarjgY/jgIHooajnpLrjgZXjgozjgabjgYTjgovmlZnogrLjg6zjg5njg6vjgavmraPlvI/jgavlr77lv5zjgZnjgovlubTpvaLlsaTjga7kurrlj6Pjgavlr77jgZnjgovnt4/lsLHlrabogIXmlbDjga7mr5TnjofjgafjgZnjgILkuK3nrYnmlZnogrLjga/jgIHliJ3nrYnmrrXpmo7jgYvjgonlp4vjgb7jgaPjgZ/ln7rnpI7mlZnogrLjga7mj5DkvpvjgpLlrozkuobjgZfjgIHjgojjgorlsILploDmgKfjga7pq5jjgYTmlZnluKvjgavjgojjgovjgojjgormlZnnp5HjgoTmioDog73jgavnibnljJbjgZfjgZ/mjIflsI7jgpLooYzjgYbjgZPjgajjgavjgojjgorjgIHnlJ/mtq/lrabnv5LjgajkurrplpPlvaLmiJDjga7ln7rnpI7jgpLnr4njgY/jgZPjgajjgpLnm67nmoTjgajjgZfjgabjgYTjgb7jgZnjgIIKCiMjIyDjg4fjg7zjgr/jga7lj5blvpcKCiMjIyMg5rqW5YKZCgpgYGB7cn0KbGlicmFyeSh0aWR5dmVyc2UpCmxpYnJhcnkoV0RJKQpgYGAKCldESSDjg5Hjg4PjgrHjg7zjgrjjgpLkvb/jgaPjgabjgIHnm7TmjqXjg4fjg7zjgr/jgpLjg4Djgqbjg7Pjg63jg7zjg4njgZfjgIHlpInmlbDlkI3jgpLjgIFgZWRfZXhwYCDjgavmjIflrprjgIIKCmBgYHtyIGV2YWwgPSBGQUxTRX0KZGZfc2Vjb25kYXJ5IDwtIFdESShpbmRpY2F0b3IgPSBjKHNlY29uZGFyeSA9ICJTRS5TRUMuRU5SUiIpKQpgYGAKCmBgYHtyIGV2YWwgPSBGQUxTRX0Kd3JpdGVfY3N2KGRmX3NlY29uZGFyeSwgImRhdGEvc2Vjb25kYXJ5LmNzdiIpCmBgYAoKYGBge3J9CmRmX3NlY29uZGFyeSA8LSByZWFkX2NzdigiZGF0YS9zZWNvbmRhcnkuY3N2IikKYGBgCgojIyMg44OH44O844K/44Gu56K66KqNCgpgYGB7cn0KZGZfc2Vjb25kYXJ5CmBgYAoKYGBge3J9CnN0cihkZl9zZWNvbmRhcnkpCmBgYAoKYGBge3J9ClJFR0lPTiA8LSBjKCIxQSIsICIxVyIsICI0RSIsICI3RSIsICI4UyIsICJCOCIsICJFVSIsICJGMSIsICJPRSIsICJTMSIsIAoiUzIiLCAiUzMiLCAiUzQiLCAiVDIiLCAiVDMiLCAiVDQiLCAiVDUiLCAiVDYiLCAiVDciLCAiVjEiLCAiVjIiLCAKIlYzIiwgIlY0IiwgIlhDIiwgIlhEIiwgIlhFIiwgIlhGIiwgIlhHIiwgIlhIIiwgIlhJIiwgIlhKIiwgIlhMIiwgCiJYTSIsICJYTiIsICJYTyIsICJYUCIsICJYUSIsICJYVCIsICJYVSIsICJYWSIsICJaNCIsICJaNyIsICJaRiIsIAoiWkciLCAiWkgiLCAiWkkiLCAiWkoiLCAiWlEiLCAiWlQiKQpgYGAKCmBgYHtyfQpkZl9zZWNvbmRhcnkgfD4gZmlsdGVyKGlzbzJjICVpbiUgUkVHSU9OKSB8PiBkaXN0aW5jdChjb3VudHJ5LCBpc28yYykKYGBgCgpgYGB7cn0KZGZfc2Vjb25kYXJ5IHw+IGZpbHRlcighKGlzbzJjICVpbiUgUkVHSU9OKSkgfD4gZGlzdGluY3QoY291bnRyeSwgaXNvMmMpCmBgYAoKIyMjIOWIhuaekOOBmeOCi+WbveOBruODquOCueODiAoKIyMjIyAqKuWNl+mDqOOCouODleODquOCq+mWoueojuWQjOebnyoqIFRoZSBTb3V0aGVybiBBZnJpY2FuIEN1c3RvbXMgVW5pb24gKFNBQ1UpCgpgYGB7cn0KU09VVEhfQUZSSUNBX0ZJVkUgPC0gYygiU291dGggQWZyaWNhIiwgIk5hbWliaWEiLCAiRXN3YXRpbmkiLCAiQm90c3dhbmEiLCAiTGVzb3RobyIpCmBgYAoKIyMjIyDjg6njg4bjg7PjgqLjg6Hjg6rjgqvjgafjgrjjg4vmjIfmlbDjgYzlpKfjgY3jgYTvvJTjgqvlm70KCmBgYHtyfQpDSE9TRU5fQ09VTlRSSUVTIDwtIGMoIlN1cmluYW1lIiwgIkJlbGl6ZSIsICJCcmF6aWwiLCAiQ29sb21iaWEiKQpgYGAKCiMjIOWIhuaekAoKIyMjIDEuIOWQhOW5tOavjuOBruODh+ODvOOCv+OBruaVsOOBruajkuOCsOODqeODlQoKYGBge3J9CmRmX3NlY29uZGFyeSB8PiBkcm9wX25hKHNlY29uZGFyeSkgfD4gZmlsdGVyKCEoaXNvMmMgJWluJSBSRUdJT04pKSB8PgogIGdncGxvdChhZXMoeWVhcikpICsgZ2VvbV9iYXIoKQpgYGAKCiMjIOimluimmuWMlgoKIyMjIDIuIOaXpeacrOOBruS4reetieWtpuagoeWwseWtpueOhwoKYGBge3J9CmRmX3NlY29uZGFyeSB8PiBmaWx0ZXIoY291bnRyeSA9PSAiSmFwYW4iKSB8PiAKICBkcm9wX25hKHNlY29uZGFyeSkgfD4gYXJyYW5nZShkZXNjKHllYXIpKQpgYGAKCiMjIyAzLiDntYzlubTlpInljJYKCiMjIyMgYS4g5pel5pysCgpgYGB7cn0KZGZfc2Vjb25kYXJ5IHw+IGZpbHRlcihjb3VudHJ5ID09ICJKYXBhbiIpIHw+IGRyb3BfbmEoc2Vjb25kYXJ5KSB8PgogIGdncGxvdChhZXMoeWVhciwgc2Vjb25kYXJ5KSkgKyBnZW9tX2xpbmUoKQpgYGAKCioq5rCX44Gl44GE44Gf44GT44Go44O755aR5ZWPKioKCi0gICAyMDAw5bm044GU44KN44GL44KJ5rib5bCR44CB44Gd44Gu5b6M44KC5aSJ5YyW44GM44GC44KL44CC5L2V44GM5Y6f5Zug44Gq44Gu44Gg44KN44GG44CCCgojIyMjIGIuIOWNl+mDqOOCouODleODquOCq+mWoueojuWQjOebnwoKYGBge3J9CmRmX3NlY29uZGFyeSB8PiBmaWx0ZXIoY291bnRyeSAlaW4lIFNPVVRIX0FGUklDQV9GSVZFKSB8PiBkcm9wX25hKHNlY29uZGFyeSkgfD4KICBnZ3Bsb3QoYWVzKHllYXIsIHNlY29uZGFyeSkpICsgZ2VvbV9saW5lKGFlcyhjb2wgPSBjb3VudHJ5KSkKYGBgCgoqKuWPguiAg++8muW5s+Wdh+eahOOBquWApOOCkuabsue3muOBp+ihqOOBmeOBk+OBqOOCguWPr+iDveOBp+OBmeOAgmxvZXNzIOOCkuS9v+OBhuOBqOa7keOCieOBi+OBquabsue3muOBp+i/keS8vOOBl+OBpuOBj+OCjOOBvuOBmeOAgioqCgpgYGB7cn0KZGZfc2Vjb25kYXJ5IHw+IGZpbHRlcihjb3VudHJ5ICVpbiUgU09VVEhfQUZSSUNBX0ZJVkUpIHw+IGRyb3BfbmEoc2Vjb25kYXJ5KSB8PgogIGdncGxvdChhZXMoeWVhciwgc2Vjb25kYXJ5KSkgKyBnZW9tX2xpbmUoYWVzKGNvbCA9IGNvdW50cnkpKSArCiAgZ2VvbV9zbW9vdGgoZm9ybXVsYSA9ICd5fngnLCBtZXRob2QgPSAibG9lc3MiLCBzZSA9IEZBTFNFKQpgYGAKCioq5rCX44Gl44GE44Gf44GT44Go44O755aR5ZWPKioKCi0gICDlubPlnYfjgafopovjgovjgajjgIHkuIDlrprjgZfjgabkuIrmmIfjgZfjgabjgYTjgovjgIIKCiMjIyMgYy4g44Op44OG44Oz44Ki44Oh44Oq44Kr77yU44Kr5Zu9CgpgYGB7cn0KZGZfc2Vjb25kYXJ5IHw+IGZpbHRlcihjb3VudHJ5ICVpbiUgQ0hPU0VOX0NPVU5UUklFUykgfD4gZHJvcF9uYShzZWNvbmRhcnkpIHw+CiAgZ2dwbG90KGFlcyh5ZWFyLCBzZWNvbmRhcnkpKSArIGdlb21fbGluZShhZXMoY29sID0gY291bnRyeSkpCmBgYAoKKirlj4LogIPvvJrlubPlnYfnmoTjgarlgKTjgpLmm7Lnt5rjgafooajjgZnjgZPjgajjgoLlj6/og73jgafjgZnjgIJsb2VzcyDjgpLkvb/jgYbjgajmu5HjgonjgYvjgarmm7Lnt5rjgafov5HkvLzjgZfjgabjgY/jgozjgb7jgZnjgIIqKgoKYGBge3J9CmRmX3NlY29uZGFyeSB8PiBmaWx0ZXIoY291bnRyeSAlaW4lIENIT1NFTl9DT1VOVFJJRVMpIHw+IGRyb3BfbmEoc2Vjb25kYXJ5KSB8PgogIGdncGxvdChhZXMoeWVhciwgc2Vjb25kYXJ5KSkgKyBnZW9tX2xpbmUoYWVzKGNvbCA9IGNvdW50cnkpKSArCiAgZ2VvbV9zbW9vdGgoZm9ybXVsYSA9ICd5fngnLCBtZXRob2QgPSAibG9lc3MiLCBzZSA9IEZBTFNFKQpgYGAKCiMjIyDliIbluIMKCuODh+ODvOOCv+OBruaVsOOBi+OCieOAgeOBvuOBmuOBr+OAgTIwMjDlubTjgavjgaTjgYTjgabopovjgabjgb/jgovjgIIKCmBgYHtyfQpkZl9zZWNvbmRhcnkgfD4gZmlsdGVyKHllYXIgPT0gMjAyMCkgfD4gZmlsdGVyKCEoY291bnRyeSAlaW4lIFJFR0lPTikpfD4KICBkcm9wX25hKHNlY29uZGFyeSkgfD4KICBnZ3Bsb3QoYWVzKHNlY29uZGFyeSkpICsgZ2VvbV9oaXN0b2dyYW0oYmlud2lkdGggPSAxMCkKYGBgCgoqKuWPguiAg++8mioqU0FDVSDjga7vvJXjgqvlm73jga7lgKTjgpLnuKbnt5rjgafmm7jjgY3ovrzjgoDjgavjga/kuIvjga7jgojjgYbjgavjgZfjgb7jgZnjgIIKCmBgYHtyfQpkZl9zZWNvbmRhcnkgfD4gZmlsdGVyKHllYXIgPT0gMjAyMCkgfD4gZmlsdGVyKGNvdW50cnkgJWluJSBTT1VUSF9BRlJJQ0FfRklWRSkgCmBgYAoKKirlj4LogIPvvJrml6XmnKzjgagqKlNBQ1Ug44Gu77yV44Kr5Zu944Gu5YCk44KS57im57ea44Gn5pu444GN6L6844KA44Gr44Gv5LiL44Gu44KI44GG44Gr44GX44G+44GZ44CCCgpgYGB7cn0KSlAgPC0gMTAyLjg0NDgwClNBRiA8LSBkZl9zZWNvbmRhcnkgfD4gZmlsdGVyKHllYXIgPT0gMjAyMCkgfD4gZmlsdGVyKGNvdW50cnkgJWluJSBTT1VUSF9BRlJJQ0FfRklWRSkgfD4gcHVsbChzZWNvbmRhcnkpCmRmX3NlY29uZGFyeSB8PiBmaWx0ZXIoeWVhciA9PSAyMDIwKSB8PiBmaWx0ZXIoIShjb3VudHJ5ICVpbiUgUkVHSU9OKSl8PgogIGRyb3BfbmEoc2Vjb25kYXJ5KSB8PgogIGdncGxvdCgpICsgZ2VvbV9oaXN0b2dyYW0oYWVzKHNlY29uZGFyeSksIGJpbndpZHRoID0gMTApICsKICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSBTQUYsIGNvbCA9ICJyZWQiKSArIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IEpQLCBjb2wgPSAiYmx1ZSIpICtsYWJzKHRpdGxlID0gIjIwMjDlubTjga7kuK3nrYnlrabmoKHlsLHlrabnjociLCBzdWJ0aXRsZSA9ICLml6XmnKzvvJrpnZLjgIFTQUNV77ya6LWkIikKYGBgCgojIyMg44OH44O844K/44GM5Y2B5YiG44GC44KL5pyA6L+R44Gu5bm044Gu5YCk44GuMTDjgqvlm73jga7lgKTjga7mo5LjgrDjg6njg5UKCiMjIyMgYS4g5YCk44GM5aSn44GN44GE5pa544GL44KJCgpgYGB7cn0KZGZfc2Vjb25kYXJ5IHw+IGZpbHRlcih5ZWFyID09IDIwMjApIHw+IGRyb3BfbmEoc2Vjb25kYXJ5KSB8PiAKICBmaWx0ZXIoIShpc28yYyAlaW4lIFJFR0lPTikpfD4KICBhcnJhbmdlKGRlc2Moc2Vjb25kYXJ5KSkgfD4gaGVhZCgxMCkgfD4gCiAgZ2dwbG90KGFlcyhmY3RfcmVvcmRlcihjb3VudHJ5LCBzZWNvbmRhcnkpLCBzZWNvbmRhcnkpKSArIGdlb21fY29sKCkgKyAKICBjb29yZF9mbGlwKCkgKyBsYWJzKHRpdGxlID0gIlRvcCAxMCBDb3VudHJpZXMiLCB4ID0gImNvdW50cnkiLCB5ID0gInNlY29uZGFyeSBzY2hvb2wgZW5yb2xsbWVudCIpCmBgYAoKIyMjIyBiLiDlgKTjgYzlsI/jgZXjgYTmlrnjgYvjgokKCmBgYHtyfQpkZl9zZWNvbmRhcnkgfD4gZmlsdGVyKHllYXIgPT0gMjAyMCkgfD4gZHJvcF9uYShzZWNvbmRhcnkpIHw+IAogIGZpbHRlcighKGlzbzJjICVpbiUgUkVHSU9OKSl8PgogIGFycmFuZ2Uoc2Vjb25kYXJ5KSB8PiBoZWFkKDEwKSB8PiAKICBnZ3Bsb3QoYWVzKGZjdF9yZXYoZmN0X3Jlb3JkZXIoY291bnRyeSwgc2Vjb25kYXJ5KSksIHNlY29uZGFyeSkpICsgZ2VvbV9jb2woKSArIAogIGNvb3JkX2ZsaXAoKSArIGxhYnModGl0bGUgPSAiTG93ZXN0IDEwIENvdW50cmllcyIsIHggPSAiY291bnRyeSIsIHkgPSAic2Vjb25kYXJ5IHNjaG9vbGwgZW5yb2xsbWVudCIpCmBgYAoKIyA0LiDkuK3nrYnlrabmoKHlvozjga7lsLHlrabnjocKCiMjIOODh+ODvOOCvwoKLSAgIFNjaG9vbCBlbnJvbGxtZW50LCB0ZXJ0aWFyeSAoJSBncm9zcynvvJpTRS5URVIuRU5SUiBbW0xpbmtdKGh0dHBzOi8vZGF0YS53b3JsZGJhbmsub3JnL2luZGljYXRvci9TRS5URVIuRU5SUildCi0gICBHcm9zcyBlbnJvbGxtZW50IHJhdGlvIGlzIHRoZSByYXRpbyBvZiB0b3RhbCBlbnJvbGxtZW50LCByZWdhcmRsZXNzIG9mIGFnZSwgdG8gdGhlIHBvcHVsYXRpb24gb2YgdGhlIGFnZSBncm91cCB0aGF0IG9mZmljaWFsbHkgY29ycmVzcG9uZHMgdG8gdGhlIGxldmVsIG9mIGVkdWNhdGlvbiBzaG93bi4gVGVydGlhcnkgZWR1Y2F0aW9uLCB3aGV0aGVyIG9yIG5vdCB0byBhbiBhZHZhbmNlZCByZXNlYXJjaCBxdWFsaWZpY2F0aW9uLCBub3JtYWxseSByZXF1aXJlcywgYXMgYSBtaW5pbXVtIGNvbmRpdGlvbiBvZiBhZG1pc3Npb24sIHRoZSBzdWNjZXNzZnVsIGNvbXBsZXRpb24gb2YgZWR1Y2F0aW9uIGF0IHRoZSBzZWNvbmRhcnkgbGV2ZWwuCgojIyMg44OH44O844K/5oOF5aCxCgotICAg44OH44O844K/5ZCN77ya5Lit562J5a2m5qCh5b6M44Gu5bCx5a2m546HCgotICAg44OH44O844K/44Kz44O844OJ77yaU0UuVEVSLkVOUlIKCi0gICDlpInmlbDlkI3vvJp0ZXJ0aWFyeQoKLSAgIOamguimge+8mue3j+WwseWtpueOh+OBr+OAgeW5tOm9ouOBq+mWouS/guOBquOBj+OAgeihqOekuuOBleOCjOOBpuOBhOOCi+aVmeiCsuODrOODmeODq+OBq+ato+W8j+OBq+WvvuW/nOOBmeOCi+W5tOm9ouWxpOOBruS6uuWPo+OBq+WvvuOBmeOCi+e3j+WwseWtpuiAheaVsOOBruavlOeOh+OBp+OBmeOAgumrmOetieaVmeiCsuOBp+OBr+OAgemrmOW6puOBqueglOeptuizh+agvOOBruacieeEoeOBq+OBi+OBi+OCj+OCieOBmuOAgemAmuW4uOOAgeWFpeWtpuOBruacgOS9juadoeS7tuOBqOOBl+OBpuS4reetieaVmeiCsuODrOODmeODq+OBruaVmeiCsuOCkueEoeS6i+OBq+S/ruS6huOBmeOCi+OBk+OBqOOBjOaxguOCgeOCieOCjOOBvuOBmeOAggoKIyMjIOODh+ODvOOCv+OBruWPluW+lwoKIyMjIyDmupblgpkKCmBgYHtyfQpsaWJyYXJ5KHRpZHl2ZXJzZSkKbGlicmFyeShXREkpCmBgYAoKV0RJIOODkeODg+OCseODvOOCuOOCkuS9v+OBo+OBpuOAgeebtOaOpeODh+ODvOOCv+OCkuODgOOCpuODs+ODreODvOODieOBl+OAgeWkieaVsOWQjeOCkuOAgWBlZF9leHBgIOOBq+aMh+WumuOAggoKYGBge3IgZXZhbCA9IEZBTFNFfQpkZl90ZXJ0aWFyeSA8LSBXREkoaW5kaWNhdG9yID0gYyh0ZXJ0aWFyeSA9ICJTRS5URVIuRU5SUiIpKQpgYGAKCmBgYHtyIGV2YWwgPSBGQUxTRX0Kd3JpdGVfY3N2KGRmX3RlcnRpYXJ5LCAiZGF0YS90ZXJ0aWFyeS5jc3YiKQpgYGAKCmBgYHtyfQpkZl90ZXJ0aWFyeSA8LSByZWFkX2NzdigiZGF0YS90ZXJ0aWFyeS5jc3YiKQpgYGAKCiMjIyDjg4fjg7zjgr/jga7norroqo0KCmBgYHtyfQpkZl90ZXJ0aWFyeQpgYGAKCmBgYHtyfQpzdHIoZGZfdGVydGlhcnkpCmBgYAoKYGBge3J9ClJFR0lPTiA8LSBjKCIxQSIsICIxVyIsICI0RSIsICI3RSIsICI4UyIsICJCOCIsICJFVSIsICJGMSIsICJPRSIsICJTMSIsIAoiUzIiLCAiUzMiLCAiUzQiLCAiVDIiLCAiVDMiLCAiVDQiLCAiVDUiLCAiVDYiLCAiVDciLCAiVjEiLCAiVjIiLCAKIlYzIiwgIlY0IiwgIlhDIiwgIlhEIiwgIlhFIiwgIlhGIiwgIlhHIiwgIlhIIiwgIlhJIiwgIlhKIiwgIlhMIiwgCiJYTSIsICJYTiIsICJYTyIsICJYUCIsICJYUSIsICJYVCIsICJYVSIsICJYWSIsICJaNCIsICJaNyIsICJaRiIsIAoiWkciLCAiWkgiLCAiWkkiLCAiWkoiLCAiWlEiLCAiWlQiKQpgYGAKCmBgYHtyfQpkZl90ZXJ0aWFyeSB8PiBmaWx0ZXIoaXNvMmMgJWluJSBSRUdJT04pIHw+IGRpc3RpbmN0KGNvdW50cnksIGlzbzJjKQpgYGAKCmBgYHtyfQpkZl90ZXJ0aWFyeSB8PiBmaWx0ZXIoIShpc28yYyAlaW4lIFJFR0lPTikpIHw+IGRpc3RpbmN0KGNvdW50cnksIGlzbzJjKQpgYGAKCiMjIyDliIbmnpDjgZnjgovlm73jga7jg6rjgrnjg4gKCiMjIyMgKirljZfpg6jjgqLjg5Xjg6rjgqvplqLnqI7lkIznm58qKiBUaGUgU291dGhlcm4gQWZyaWNhbiBDdXN0b21zIFVuaW9uIChTQUNVKQoKYGBge3J9ClNPVVRIX0FGUklDQV9GSVZFIDwtIGMoIlNvdXRoIEFmcmljYSIsICJOYW1pYmlhIiwgIkVzd2F0aW5pIiwgIkJvdHN3YW5hIiwgIkxlc290aG8iKQpgYGAKCiMjIyMg44Op44OG44Oz44Ki44Oh44Oq44Kr44Gn44K444OL5oyH5pWw44GM5aSn44GN44GE77yU44Kr5Zu9CgpgYGB7cn0KQ0hPU0VOX0NPVU5UUklFUyA8LSBjKCJTdXJpbmFtZSIsICJCZWxpemUiLCAiQnJhemlsIiwgIkNvbG9tYmlhIikKYGBgCgojIyDliIbmnpAKCiMjIyAxLiDlkITlubTmr47jga7jg4fjg7zjgr/jga7mlbDjga7mo5LjgrDjg6njg5UKCmBgYHtyfQpkZl90ZXJ0aWFyeSB8PiBkcm9wX25hKHRlcnRpYXJ5KSB8PiBmaWx0ZXIoIShpc28yYyAlaW4lIFJFR0lPTikpIHw+CiAgZ2dwbG90KGFlcyh5ZWFyKSkgKyBnZW9tX2JhcigpCmBgYAoKIyMg6KaW6Kaa5YyWCgojIyMgMi4g5pel5pys44Gu5pWZ6IKy6LK777yIJSBvZiBHRFDvvIkKCmBgYHtyfQpkZl90ZXJ0aWFyeSB8PiBmaWx0ZXIoY291bnRyeSA9PSAiSmFwYW4iKSB8PiAKICBkcm9wX25hKHRlcnRpYXJ5KSB8PiBhcnJhbmdlKGRlc2MoeWVhcikpCmBgYAoKIyMjIDMuIOe1jOW5tOWkieWMlgoKIyMjIyBhLiDml6XmnKwKCmBgYHtyfQpkZl90ZXJ0aWFyeSB8PiBmaWx0ZXIoY291bnRyeSA9PSAiSmFwYW4iKSB8PiBkcm9wX25hKHRlcnRpYXJ5KSB8PgogIGdncGxvdChhZXMoeWVhciwgdGVydGlhcnkpKSArIGdlb21fbGluZSgpCmBgYAoKKirmsJfjgaXjgYTjgZ/jgZPjgajjg7vnlpHllY8qKgoKLSAgIDE5NzDlubTku6Pjga7mgKXmv4DjgarkuIrmmIfjgIExOTkw5bm044GU44KN44GL44KJ44G+44Gf5aKX5Yqg44Gv44CB5L2V44GM5Y6f5Zug44Gq44Gu44Gg44KN44GG44CCCgotICAg44Gp44Gu44KI44GG44Gr44CB5Lit562J5a2m5qCh5b6M44Gr44Gk44GE44Gm5a6a44KB44Gm44GE44KL44Gu44Gg44KN44GG44CCCgojIyMjIGIuIOWNl+mDqOOCouODleODquOCq+mWoueojuWQjOebnwoKYGBge3J9CmRmX3RlcnRpYXJ5IHw+IGZpbHRlcihjb3VudHJ5ICVpbiUgU09VVEhfQUZSSUNBX0ZJVkUpIHw+IGRyb3BfbmEodGVydGlhcnkpIHw+CiAgZ2dwbG90KGFlcyh5ZWFyLCB0ZXJ0aWFyeSkpICsgZ2VvbV9saW5lKGFlcyhjb2wgPSBjb3VudHJ5KSkKYGBgCgoqKuWPguiAg++8muW5s+Wdh+eahOOBquWApOOCkuabsue3muOBp+ihqOOBmeOBk+OBqOOCguWPr+iDveOBp+OBmeOAgmxvZXNzIOOCkuS9v+OBhuOBqOa7keOCieOBi+OBquabsue3muOBp+i/keS8vOOBl+OBpuOBj+OCjOOBvuOBmeOAgioqCgpgYGB7cn0KZGZfdGVydGlhcnkgfD4gZmlsdGVyKGNvdW50cnkgJWluJSBTT1VUSF9BRlJJQ0FfRklWRSkgfD4gZHJvcF9uYSh0ZXJ0aWFyeSkgfD4KICBnZ3Bsb3QoYWVzKHllYXIsIHRlcnRpYXJ5KSkgKyBnZW9tX2xpbmUoYWVzKGNvbCA9IGNvdW50cnkpKSArCiAgZ2VvbV9zbW9vdGgoZm9ybXVsYSA9ICd5fngnLCBtZXRob2QgPSAibG9lc3MiLCBzZSA9IEZBTFNFKQpgYGAKCioq5rCX44Gl44GE44Gf44GT44Go44O755aR5ZWPKioKCi0gICDlubPlnYfjgafopovjgovjgajjgIHkuIrmmIfjgZfjgabjgY3jgabjgYrjgorjgIE3JSDnqIvluqbjgajjgYTjgYblpKfjgY3jgarlibLlkIjjgavjgarjgaPjgabjgYTjgovjgIIKCiMjIyMgYy4g44Op44OG44Oz44Ki44Oh44Oq44Kr77yU44Kr5Zu9CgpgYGB7cn0KZGZfdGVydGlhcnkgfD4gZmlsdGVyKGNvdW50cnkgJWluJSBDSE9TRU5fQ09VTlRSSUVTKSB8PiBkcm9wX25hKHRlcnRpYXJ5KSB8PgogIGdncGxvdChhZXMoeWVhciwgdGVydGlhcnkpKSArIGdlb21fbGluZShhZXMoY29sID0gY291bnRyeSkpCmBgYAoKKirlj4LogIPvvJrlubPlnYfnmoTjgarlgKTjgpLmm7Lnt5rjgafooajjgZnjgZPjgajjgoLlj6/og73jgafjgZnjgIJsb2VzcyDjgpLkvb/jgYbjgajmu5HjgonjgYvjgarmm7Lnt5rjgafov5HkvLzjgZfjgabjgY/jgozjgb7jgZnjgIIqKgoKYGBge3J9CmRmX3RlcnRpYXJ5IHw+IGZpbHRlcihjb3VudHJ5ICVpbiUgQ0hPU0VOX0NPVU5UUklFUykgfD4gZHJvcF9uYSh0ZXJ0aWFyeSkgfD4KICBnZ3Bsb3QoYWVzKHllYXIsIHRlcnRpYXJ5KSkgKyBnZW9tX2xpbmUoYWVzKGNvbCA9IGNvdW50cnkpKSArCiAgZ2VvbV9zbW9vdGgoZm9ybXVsYSA9ICd5fngnLCBtZXRob2QgPSAibG9lc3MiLCBzZSA9IEZBTFNFKQpgYGAKCiMjIyDliIbluIMKCuODh+ODvOOCv+OBruaVsOOBi+OCieOAgeOBvuOBmuOBr+OAgTIwMjDlubTjgavjgaTjgYTjgabopovjgabjgb/jgovjgIIKCmBgYHtyfQpkZl90ZXJ0aWFyeSB8PiBmaWx0ZXIoeWVhciA9PSAyMDIwKSB8PiBmaWx0ZXIoIShjb3VudHJ5ICVpbiUgUkVHSU9OKSl8PgogIGRyb3BfbmEodGVydGlhcnkpIHw+CiAgZ2dwbG90KGFlcyh0ZXJ0aWFyeSkpICsgZ2VvbV9oaXN0b2dyYW0oYmlud2lkdGggPSAxMCkKYGBgCgoqKuWPguiAg++8mioqU0FDVSDjga7vvJXjgqvlm73jga7lgKTjgpLnuKbnt5rjgafmm7jjgY3ovrzjgoDjgavjga/kuIvjga7jgojjgYbjgavjgZfjgb7jgZnjgIIKCmBgYHtyfQpkZl90ZXJ0aWFyeSB8PiBmaWx0ZXIoeWVhciA9PSAyMDIwKSB8PiBmaWx0ZXIoY291bnRyeSAlaW4lIFNPVVRIX0FGUklDQV9GSVZFKSAKYGBgCgoqKuWPguiAg++8muaXpeacrOOBqCoqU0FDVSDjga7vvJXjgqvlm73jga7lgKTjgpLnuKbnt5rjgafmm7jjgY3ovrzjgoDjgavjga/kuIvjga7jgojjgYbjgavjgZfjgb7jgZnjgIIKCmBgYHtyfQpKUCA8LSA2Mi4xMzU4NApTQUYgPC0gZGZfdGVydGlhcnkgfD4gZmlsdGVyKHllYXIgPT0gMjAyMCkgfD4gZmlsdGVyKGNvdW50cnkgJWluJSBTT1VUSF9BRlJJQ0FfRklWRSkgfD4gcHVsbCh0ZXJ0aWFyeSkKZGZfdGVydGlhcnkgfD4gZmlsdGVyKHllYXIgPT0gMjAyMCkgfD4gZmlsdGVyKCEoY291bnRyeSAlaW4lIFJFR0lPTikpfD4KICBkcm9wX25hKHRlcnRpYXJ5KSB8PgogIGdncGxvdCgpICsgZ2VvbV9oaXN0b2dyYW0oYWVzKHRlcnRpYXJ5KSwgYmlud2lkdGggPSAxMCkgKwogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IFNBRiwgY29sID0gInJlZCIpICsgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gSlAsIGNvbCA9ICJibHVlIikgK2xhYnModGl0bGUgPSAiMjAyMOW5tOOBruS4reetieWtpuagoeW+jOOBruWwseWtpueOhyIsIHN1YnRpdGxlID0gIuaXpeacrO+8mumdkuOAgVNBQ1XvvJrotaQiKQpgYGAKCiMjIyDjg4fjg7zjgr/jgYzljYHliIbjgYLjgovmnIDov5Hjga7lubTjga7lgKTjga4xMOOCq+WbveOBruWApOOBruajkuOCsOODqeODlQoKIyMjIyBhLiDlgKTjgYzlpKfjgY3jgYTmlrnjgYvjgokKCmBgYHtyfQpkZl90ZXJ0aWFyeSB8PiBmaWx0ZXIoeWVhciA9PSAyMDIwKSB8PiBkcm9wX25hKHRlcnRpYXJ5KSB8PiAKICBmaWx0ZXIoIShpc28yYyAlaW4lIFJFR0lPTikpfD4KICBhcnJhbmdlKGRlc2ModGVydGlhcnkpKSB8PiBoZWFkKDEwKSB8PiAKICBnZ3Bsb3QoYWVzKGZjdF9yZW9yZGVyKGNvdW50cnksIHRlcnRpYXJ5KSwgdGVydGlhcnkpKSArIGdlb21fY29sKCkgKyAKICBjb29yZF9mbGlwKCkgKyBsYWJzKHRpdGxlID0gIlRvcCAxMCBDb3VudHJpZXMiLCB4ID0gImNvdW50cnkiLCB5ID0gInRlcnRpYXJ5IHNjaG9vbCBlbnJvbGxtZW50IikKYGBgCgojIyMjIGIuIOWApOOBjOWwj+OBleOBhOaWueOBi+OCiQoKYGBge3J9CmRmX3RlcnRpYXJ5IHw+IGZpbHRlcih5ZWFyID09IDIwMjApIHw+IGRyb3BfbmEodGVydGlhcnkpIHw+IAogIGZpbHRlcighKGlzbzJjICVpbiUgUkVHSU9OKSl8PgogIGFycmFuZ2UodGVydGlhcnkpIHw+IGhlYWQoMTApIHw+IAogIGdncGxvdChhZXMoZmN0X3JldihmY3RfcmVvcmRlcihjb3VudHJ5LCB0ZXJ0aWFyeSkpLCB0ZXJ0aWFyeSkpICsgZ2VvbV9jb2woKSArIAogIGNvb3JkX2ZsaXAoKSArIGxhYnModGl0bGUgPSAiTG93ZXN0IDEwIENvdW50cmllcyIsIHggPSAiY291bnRyeSIsIHkgPSAidGVydGlhcnkgc2Nob29sIGVucm9sbG1lbnQiKQpgYGAKCiMgNS4g5LqU5q2z5pyq5rqA44Gu5q275Lqh546HCgojIyDjg4fjg7zjgr8KCi0gICBNb3J0YWxpdHkgcmF0ZSwgdW5kZXItNSAocGVyIDEsMDAwIGxpdmUgYmlydGhzKe+8mlNILkRZTi5NT1JUIFtbTGlua10oaHR0cHM6Ly9kYXRhYmFuay53b3JsZGJhbmsub3JnL21ldGFkYXRhZ2xvc3Nhcnkvd29ybGQtZGV2ZWxvcG1lbnQtaW5kaWNhdG9ycy9zZXJpZXMvU0guRFlOLk1PUlQpXQoKIyMjIOODh+ODvOOCv+aDheWgsQoKLSAgIOODh+ODvOOCv+WQje+8muS6lOats+acqua6gOOBruatu+S6oeeOhwoKLSAgIOODh+ODvOOCv+OCs+ODvOODie+8mlNILkRZTi5NT1JUCgotICAg5aSJ5pWw5ZCN77yadW5kZXI1CgotICAg5qaC6KaB77yaNSDmrbPmnKrmuoDmrbvkuqHnjofjga/jgIHmjIflrprjgZXjgozjgZ/lubTjga7lubTpvaLliKXmrbvkuqHnjofjgYzpgannlKjjgZXjgozjgovloLTlkIjjgavjgIHmlrDnlJ/lhZDjgYwgNSDmrbPjgavpgZTjgZnjgovliY3jgavmrbvkuqHjgZnjgosgMSwwMDAg5Lq644GC44Gf44KK44Gu56K6546H44Gn44GZ44CCCgojIyMg44OH44O844K/44Gu5Y+W5b6XCgojIyMjIOa6luWCmQoKYGBge3J9CmxpYnJhcnkodGlkeXZlcnNlKQpsaWJyYXJ5KFdESSkKYGBgCgpXREkg44OR44OD44Kx44O844K444KS5L2/44Gj44Gm44CB55u05o6l44OH44O844K/44KS44OA44Km44Oz44Ot44O844OJ44GX44CB5aSJ5pWw5ZCN44KS44CBYGVkX2V4cGAg44Gr5oyH5a6a44CCCgpgYGB7ciBldmFsID0gRkFMU0V9CmRmX3VuZGVyNSA8LSBXREkoaW5kaWNhdG9yID0gYyh1bmRlcjUgPSAiU0guRFlOLk1PUlQiKSkKYGBgCgpgYGB7ciBldmFsID0gRkFMU0V9CndyaXRlX2NzdihkZl91bmRlcjUsICJkYXRhL3VuZGVyNS5jc3YiKQpgYGAKCmBgYHtyfQpkZl91bmRlcjUgPC0gcmVhZF9jc3YoImRhdGEvdW5kZXI1LmNzdiIpCmBgYAoKIyMjIOODh+ODvOOCv+OBrueiuuiqjQoKYGBge3J9CmRmX3VuZGVyNQpgYGAKCmBgYHtyfQpzdHIoZGZfdW5kZXI1KQpgYGAKCmBgYHtyfQpSRUdJT04gPC0gYygiMUEiLCAiMVciLCAiNEUiLCAiN0UiLCAiOFMiLCAiQjgiLCAiRVUiLCAiRjEiLCAiT0UiLCAiUzEiLCAKIlMyIiwgIlMzIiwgIlM0IiwgIlQyIiwgIlQzIiwgIlQ0IiwgIlQ1IiwgIlQ2IiwgIlQ3IiwgIlYxIiwgIlYyIiwgCiJWMyIsICJWNCIsICJYQyIsICJYRCIsICJYRSIsICJYRiIsICJYRyIsICJYSCIsICJYSSIsICJYSiIsICJYTCIsIAoiWE0iLCAiWE4iLCAiWE8iLCAiWFAiLCAiWFEiLCAiWFQiLCAiWFUiLCAiWFkiLCAiWjQiLCAiWjciLCAiWkYiLCAKIlpHIiwgIlpIIiwgIlpJIiwgIlpKIiwgIlpRIiwgIlpUIikKYGBgCgpgYGB7cn0KZGZfdW5kZXI1IHw+IGZpbHRlcihpc28yYyAlaW4lIFJFR0lPTikgfD4gZGlzdGluY3QoY291bnRyeSwgaXNvMmMpCmBgYAoKYGBge3J9CmRmX3VuZGVyNSB8PiBmaWx0ZXIoIShpc28yYyAlaW4lIFJFR0lPTikpIHw+IGRpc3RpbmN0KGNvdW50cnksIGlzbzJjKQpgYGAKCiMjIyDliIbmnpDjgZnjgovlm73jga7jg6rjgrnjg4gKCiMjIyMgKirljZfpg6jjgqLjg5Xjg6rjgqvplqLnqI7lkIznm58qKiBUaGUgU291dGhlcm4gQWZyaWNhbiBDdXN0b21zIFVuaW9uIChTQUNVKQoKYGBge3J9ClNPVVRIX0FGUklDQV9GSVZFIDwtIGMoIlNvdXRoIEFmcmljYSIsICJOYW1pYmlhIiwgIkVzd2F0aW5pIiwgIkJvdHN3YW5hIiwgIkxlc290aG8iKQpgYGAKCiMjIyMg44Op44OG44Oz44Ki44Oh44Oq44Kr44Gn44K444OL5oyH5pWw44GM5aSn44GN44GE77yU44Kr5Zu9CgpgYGB7cn0KQ0hPU0VOX0NPVU5UUklFUyA8LSBjKCJTdXJpbmFtZSIsICJCZWxpemUiLCAiQnJhemlsIiwgIkNvbG9tYmlhIikKYGBgCgojIyDliIbmnpAKCiMjIyAxLiDlkITlubTmr47jga7jg4fjg7zjgr/jga7mlbDjga7mo5LjgrDjg6njg5UKCmBgYHtyfQpkZl91bmRlcjUgfD4gZHJvcF9uYSh1bmRlcjUpIHw+IGZpbHRlcighKGlzbzJjICVpbiUgUkVHSU9OKSkgfD4KICBnZ3Bsb3QoYWVzKHllYXIpKSArIGdlb21fYmFyKCkKYGBgCgojIyDoppbopprljJYKCiMjIyAyLiDkupTmrbPmnKrmuoDmrbvkuqHnjofvvIgxMDAw5Lq644GC44Gf44KK77yJCgpgYGB7cn0KZGZfdW5kZXI1IHw+IGZpbHRlcihjb3VudHJ5ID09ICJKYXBhbiIpIHw+IAogIGRyb3BfbmEodW5kZXI1KSB8PiBhcnJhbmdlKGRlc2MoeWVhcikpCmBgYAoKIyMjIDMuIOe1jOW5tOWkieWMlgoKIyMjIyBhLiDml6XmnKwKCmBgYHtyfQpkZl91bmRlcjUgfD4gZmlsdGVyKGNvdW50cnkgPT0gIkphcGFuIikgfD4gZHJvcF9uYSh1bmRlcjUpIHw+CiAgZ2dwbG90KGFlcyh5ZWFyLCB1bmRlcjUpKSArIGdlb21fbGluZSgpCmBgYAoKKirmsJfjgaXjgYTjgZ/jgZPjgajjg7vnlpHllY8qKgoKLSAgIOe2mee2mueahOOBq+a4m+WwkeOBl+OBpuOBhOOCi+OAggoKLSAgIDE5NjDlubTjgZTjgo3jga80MCUg44Go44GE44GG44GT44Go44Gv44CBMTk1MOW5tOOBlOOCjeOBr+OAgTUwJSDjgZDjgonjgYTjgaDjgaPjgZ/jga7jgaDjgo3jgYbjgYvjgIIKCiMjIyMgYi4g5Y2X6YOo44Ki44OV44Oq44Kr6Zai56iO5ZCM55ufCgpgYGB7cn0KZGZfdW5kZXI1IHw+IGZpbHRlcihjb3VudHJ5ICVpbiUgU09VVEhfQUZSSUNBX0ZJVkUpIHw+IGRyb3BfbmEodW5kZXI1KSB8PgogIGdncGxvdChhZXMoeWVhciwgdW5kZXI1KSkgKyBnZW9tX2xpbmUoYWVzKGNvbCA9IGNvdW50cnkpKQpgYGAKCioq5Y+C6ICD77ya5bmz5Z2H55qE44Gq5YCk44KS5puy57ea44Gn6KGo44GZ44GT44Go44KC5Y+v6IO944Gn44GZ44CCbG9lc3Mg44KS5L2/44GG44Go5ruR44KJ44GL44Gq5puy57ea44Gn6L+R5Ly844GX44Gm44GP44KM44G+44GZ44CCKioKCmBgYHtyfQpkZl91bmRlcjUgfD4gZmlsdGVyKGNvdW50cnkgJWluJSBTT1VUSF9BRlJJQ0FfRklWRSkgfD4gZHJvcF9uYSh1bmRlcjUpIHw+CiAgZ2dwbG90KGFlcyh5ZWFyLCB1bmRlcjUpKSArIGdlb21fbGluZShhZXMoY29sID0gY291bnRyeSkpICsKICBnZW9tX3Ntb290aChmb3JtdWxhID0gJ3l+eCcsIG1ldGhvZCA9ICJsb2VzcyIsIHNlID0gRkFMU0UpCmBgYAoKKirmsJfjgaXjgYTjgZ/jgZPjgajjg7vnlpHllY8qKgoKLSAgIDIwMDDlubTjgZnjgY7jgavkuIrmmIfjgZfjgabjgYTjgovjgYzjgIHjgZ3jgozku6XlpJbjga/jgIHmuJvlsJHjgZfjgabjgYTjgovjgIIKLSAgIOe0m+S6ieOBoOOCjeOBhuOBi+OAggoKIyMjIyBjLiDjg6njg4bjg7PjgqLjg6Hjg6rjgqvvvJTjgqvlm70KCmBgYHtyfQpkZl91bmRlcjUgfD4gZmlsdGVyKGNvdW50cnkgJWluJSBDSE9TRU5fQ09VTlRSSUVTKSB8PiBkcm9wX25hKHVuZGVyNSkgfD4KICBnZ3Bsb3QoYWVzKHllYXIsIHVuZGVyNSkpICsgZ2VvbV9saW5lKGFlcyhjb2wgPSBjb3VudHJ5KSkKYGBgCgoqKuWPguiAg++8muW5s+Wdh+eahOOBquWApOOCkuabsue3muOBp+ihqOOBmeOBk+OBqOOCguWPr+iDveOBp+OBmeOAgmxvZXNzIOOCkuS9v+OBhuOBqOa7keOCieOBi+OBquabsue3muOBp+i/keS8vOOBl+OBpuOBj+OCjOOBvuOBmeOAgioqCgpgYGB7cn0KZGZfdW5kZXI1IHw+IGZpbHRlcihjb3VudHJ5ICVpbiUgQ0hPU0VOX0NPVU5UUklFUykgfD4gZHJvcF9uYSh1bmRlcjUpIHw+CiAgZ2dwbG90KGFlcyh5ZWFyLCB1bmRlcjUpKSArIGdlb21fbGluZShhZXMoY29sID0gY291bnRyeSkpICsKICBnZW9tX3Ntb290aChmb3JtdWxhID0gJ3l+eCcsIG1ldGhvZCA9ICJsb2VzcyIsIHNlID0gRkFMU0UpCmBgYAoKIyMjIOWIhuW4gwoK44OH44O844K/44Gu5pWw44GL44KJ44CB44G+44Ga44Gv44CBMjAyMOW5tOOBq+OBpOOBhOOBpuimi+OBpuOBv+OCi+OAggoKYGBge3J9CmRmX3VuZGVyNSB8PiBmaWx0ZXIoeWVhciA9PSAyMDIwKSB8PiBmaWx0ZXIoIShjb3VudHJ5ICVpbiUgUkVHSU9OKSl8PgogIGRyb3BfbmEodW5kZXI1KSB8PgogIGdncGxvdChhZXModW5kZXI1KSkgKyBnZW9tX2hpc3RvZ3JhbShiaW53aWR0aCA9IDEwKQpgYGAKCioq5Y+C6ICD77yaKipTQUNVIOOBru+8leOCq+WbveOBruWApOOCkue4pue3muOBp+abuOOBjei+vOOCgOOBq+OBr+S4i+OBruOCiOOBhuOBq+OBl+OBvuOBmeOAggoKYGBge3J9CmRmX3VuZGVyNSB8PiBmaWx0ZXIoeWVhciA9PSAyMDIwKSB8PiBmaWx0ZXIoY291bnRyeSAlaW4lIFNPVVRIX0FGUklDQV9GSVZFKSAKYGBgCgoqKuWPguiAg++8muaXpeacrOOBqCoqU0FDVSDjga7vvJXjgqvlm73jga7lgKTjgpLnuKbnt5rjgafmm7jjgY3ovrzjgoDjgavjga/kuIvjga7jgojjgYbjgavjgZfjgb7jgZnjgIIKCmBgYHtyfQpKUCA8LSAyLjQKU0FGIDwtIGRmX3VuZGVyNSB8PiBmaWx0ZXIoeWVhciA9PSAyMDIwKSB8PiBmaWx0ZXIoY291bnRyeSAlaW4lIFNPVVRIX0FGUklDQV9GSVZFKSB8PiBwdWxsKHVuZGVyNSkKZGZfdW5kZXI1IHw+IGZpbHRlcih5ZWFyID09IDIwMjApIHw+IGZpbHRlcighKGNvdW50cnkgJWluJSBSRUdJT04pKXw+CiAgZHJvcF9uYSh1bmRlcjUpIHw+CiAgZ2dwbG90KCkgKyBnZW9tX2hpc3RvZ3JhbShhZXModW5kZXI1KSwgYmlud2lkdGggPSAxMCkgKwogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IFNBRiwgY29sID0gInJlZCIpICsgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gSlAsIGNvbCA9ICJibHVlIikgK2xhYnModGl0bGUgPSAi5LqU5q2z5pyq5rqA44Gu5q275Lqh546H77yIMTAwMOS6uuOBguOBn+OCiu+8iSIsIHN1YnRpdGxlID0gIuaXpeacrO+8mumdkuOAgVNBQ1XvvJrotaQiKQpgYGAKCiMjIyDjg4fjg7zjgr/jgYzljYHliIbjgYLjgovmnIDov5Hjga7lubTjga7lgKTjga4xMOOCq+WbveOBruWApOOBruajkuOCsOODqeODlQoKIyMjIyBhLiDlgKTjgYzlpKfjgY3jgYTmlrnjgYvjgokKCmBgYHtyfQpkZl91bmRlcjUgfD4gZmlsdGVyKHllYXIgPT0gMjAyMCkgfD4gZHJvcF9uYSh1bmRlcjUpIHw+IAogIGZpbHRlcighKGlzbzJjICVpbiUgUkVHSU9OKSl8PgogIGFycmFuZ2UoZGVzYyh1bmRlcjUpKSB8PiBoZWFkKDEwKSB8PiAKICBnZ3Bsb3QoYWVzKGZjdF9yZW9yZGVyKGNvdW50cnksIHVuZGVyNSksIHVuZGVyNSkpICsgZ2VvbV9jb2woKSArIAogIGNvb3JkX2ZsaXAoKSArIGxhYnModGl0bGUgPSAi5LqU5q2z5pyq5rqA44Gu5q275Lqh546H77yIMTAwMOS6uuOBguOBn+OCiu+8iSIsIHggPSAiY291bnRyeSIpCmBgYAoKIyMjIyBiLiDlgKTjgYzlsI/jgZXjgYTmlrnjgYvjgokKCmBgYHtyfQpkZl91bmRlcjUgfD4gZmlsdGVyKHllYXIgPT0gMjAyMCkgfD4gZHJvcF9uYSh1bmRlcjUpIHw+IAogIGZpbHRlcighKGlzbzJjICVpbiUgUkVHSU9OKSl8PgogIGFycmFuZ2UodW5kZXI1KSB8PiBoZWFkKDEwKSB8PiAKICBnZ3Bsb3QoYWVzKGZjdF9yZXYoZmN0X3Jlb3JkZXIoY291bnRyeSwgdW5kZXI1KSksIHVuZGVyNSkpICsgZ2VvbV9jb2woKSArIAogIGNvb3JkX2ZsaXAoKSArIGxhYnModGl0bGUgPSAiTG93ZXN0IDEwIENvdW50cmllcyIsIHkgPSAidW5kZXIgNSBtb3J0YWxpdHkiLCB4ID0gImNvdW50cnkiKQpgYGAKCiMgNi4g5paw6KaPIEhJViDmhJ/mn5PogIXmlbAKCiMjIOODh+ODvOOCvwoKLSAgIEluY2lkZW5jZSBvZiBISVYgKCUgb2YgdW5pbmZlY3RlZCBwb3B1bGF0aW9uIGFnZXMgMTUtNDkp77yaU0guSElWLklOQ0QuWlMgW1tMaW5rXShodHRwczovL2RhdGEud29ybGRiYW5rLm9yZy9pbmRpY2F0b3IvU0guSElWLklOQ0QuWlM/bG9jYXRpb25zPVNaKV0KCiMjIyDjg4fjg7zjgr/mg4XloLEKCi0gICDjg4fjg7zjgr/lkI3vvJrmlrDopo8gSElWIOaEn+afk+iAheaVsAoKLSAgIOODh+ODvOOCv+OCs+ODvOODie+8mlNILkhJVi5JTkNELlpTCgotICAg5aSJ5pWw5ZCN77yabmV3X2hpdgoKLSAgIOamguimge+8muacn+mWk+OBruWJjeOBruW5tOmWk+OBrumdnuaEn+afk+S6uuWPoyAxLDAwMCDkurrlvZPjgZ/jgorjga4gMTUg772eIDQ5IOats+OBrumdnuaEn+afk+mbhuWbo+OBq+OBiuOBkeOCi+aWsOimjyBISVYg5oSf5p+T6ICF5pWw44CCCgojIyMg44OH44O844K/44Gu5Y+W5b6XCgojIyMjIOa6luWCmQoKYGBge3J9CmxpYnJhcnkodGlkeXZlcnNlKQpsaWJyYXJ5KFdESSkKYGBgCgpXREkg44OR44OD44Kx44O844K444KS5L2/44Gj44Gm44CB55u05o6l44OH44O844K/44KS44OA44Km44Oz44Ot44O844OJ44GX44CB5aSJ5pWw5ZCN44KS44CBYGVkX2V4cGAg44Gr5oyH5a6a44CCCgpgYGB7ciBldmFsID0gRkFMU0V9CmRmX25ld19oaXYgPC0gV0RJKGluZGljYXRvciA9IGMobmV3X2hpdiA9ICJTSC5ISVYuSU5DRC5aUyIpKQpgYGAKCmBgYHtyIGV2YWwgPSBGQUxTRX0Kd3JpdGVfY3N2KGRmX25ld19oaXYsICJkYXRhL25ld19oaXYuY3N2IikKYGBgCgpgYGB7cn0KZGZfbmV3X2hpdiA8LSByZWFkX2NzdigiZGF0YS9uZXdfaGl2LmNzdiIpCmBgYAoKIyMjIOODh+ODvOOCv+OBrueiuuiqjQoKYGBge3J9CmRmX25ld19oaXYKYGBgCgpgYGB7cn0Kc3RyKGRmX25ld19oaXYpCmBgYAoKYGBge3J9ClJFR0lPTiA8LSBjKCIxQSIsICIxVyIsICI0RSIsICI3RSIsICI4UyIsICJCOCIsICJFVSIsICJGMSIsICJPRSIsICJTMSIsIAoiUzIiLCAiUzMiLCAiUzQiLCAiVDIiLCAiVDMiLCAiVDQiLCAiVDUiLCAiVDYiLCAiVDciLCAiVjEiLCAiVjIiLCAKIlYzIiwgIlY0IiwgIlhDIiwgIlhEIiwgIlhFIiwgIlhGIiwgIlhHIiwgIlhIIiwgIlhJIiwgIlhKIiwgIlhMIiwgCiJYTSIsICJYTiIsICJYTyIsICJYUCIsICJYUSIsICJYVCIsICJYVSIsICJYWSIsICJaNCIsICJaNyIsICJaRiIsIAoiWkciLCAiWkgiLCAiWkkiLCAiWkoiLCAiWlEiLCAiWlQiKQpgYGAKCmBgYHtyfQpkZl9uZXdfaGl2IHw+IGZpbHRlcihpc28yYyAlaW4lIFJFR0lPTikgfD4gZGlzdGluY3QoY291bnRyeSwgaXNvMmMpCmBgYAoKYGBge3J9CmRmX25ld19oaXYgfD4gZmlsdGVyKCEoaXNvMmMgJWluJSBSRUdJT04pKSB8PiBkaXN0aW5jdChjb3VudHJ5LCBpc28yYykKYGBgCgojIyMg5YiG5p6Q44GZ44KL5Zu944Gu44Oq44K544OICgojIyMjICoq5Y2X6YOo44Ki44OV44Oq44Kr6Zai56iO5ZCM55ufKiogVGhlIFNvdXRoZXJuIEFmcmljYW4gQ3VzdG9tcyBVbmlvbiAoU0FDVSkKCmBgYHtyfQpTT1VUSF9BRlJJQ0FfRklWRSA8LSBjKCJTb3V0aCBBZnJpY2EiLCAiTmFtaWJpYSIsICJFc3dhdGluaSIsICJCb3Rzd2FuYSIsICJMZXNvdGhvIikKYGBgCgojIyMjIOODqeODhuODs+OCouODoeODquOCq+OBp+OCuOODi+aMh+aVsOOBjOWkp+OBjeOBhO+8lOOCq+WbvQoKYGBge3J9CkNIT1NFTl9DT1VOVFJJRVMgPC0gYygiU3VyaW5hbWUiLCAiQmVsaXplIiwgIkJyYXppbCIsICJDb2xvbWJpYSIpCmBgYAoKIyMg5YiG5p6QCgojIyMgMS4g5ZCE5bm05q+O44Gu44OH44O844K/44Gu5pWw44Gu5qOS44Kw44Op44OVCgpgYGB7cn0KZGZfbmV3X2hpdiB8PiBkcm9wX25hKG5ld19oaXYpIHw+IGZpbHRlcighKGlzbzJjICVpbiUgUkVHSU9OKSkgfD4KICBnZ3Bsb3QoYWVzKHllYXIpKSArIGdlb21fYmFyKCkKYGBgCgojIyDoppbopprljJYKCiMjIyAyLiDmlrDopo8gSElWIOaEn+afk+iAheaVsO+8iDEwMDDkurrjgYLjgZ/jgorvvIkKCmBgYHtyfQpkZl9uZXdfaGl2IHw+IGZpbHRlcihjb3VudHJ5ID09ICJKYXBhbiIpIHw+IAogIGRyb3BfbmEobmV3X2hpdikgfD4gYXJyYW5nZShkZXNjKHllYXIpKQpgYGAKCiMjIyAzLiDntYzlubTlpInljJYKCiMjIyMgYS4g5pel5pysCgpgYGB7cn0KZGZfbmV3X2hpdiB8PiBmaWx0ZXIoY291bnRyeSA9PSAiSmFwYW4iKSB8PiBkcm9wX25hKG5ld19oaXYpIHw+CiAgZ2dwbG90KGFlcyh5ZWFyLCBuZXdfaGl2KSkgKyBnZW9tX2xpbmUoKQpgYGAKCioq5rCX44Gl44GE44Gf44GT44Go44O755aR5ZWPKioKCiMjIyMgYi4g5Y2X6YOo44Ki44OV44Oq44Kr6Zai56iO5ZCM55ufCgpgYGB7cn0KZGZfbmV3X2hpdiB8PiBmaWx0ZXIoY291bnRyeSAlaW4lIFNPVVRIX0FGUklDQV9GSVZFKSB8PiBkcm9wX25hKG5ld19oaXYpIHw+CiAgZ2dwbG90KGFlcyh5ZWFyLCBuZXdfaGl2KSkgKyBnZW9tX2xpbmUoYWVzKGNvbCA9IGNvdW50cnkpKQpgYGAKCioq5Y+C6ICD77ya5bmz5Z2H55qE44Gq5YCk44KS5puy57ea44Gn6KGo44GZ44GT44Go44KC5Y+v6IO944Gn44GZ44CCbG9lc3Mg44KS5L2/44GG44Go5ruR44KJ44GL44Gq5puy57ea44Gn6L+R5Ly844GX44Gm44GP44KM44G+44GZ44CCKioKCmBgYHtyfQpkZl9uZXdfaGl2IHw+IGZpbHRlcihjb3VudHJ5ICVpbiUgU09VVEhfQUZSSUNBX0ZJVkUpIHw+IGRyb3BfbmEobmV3X2hpdikgfD4KICBnZ3Bsb3QoYWVzKHllYXIsIG5ld19oaXYpKSArIGdlb21fbGluZShhZXMoY29sID0gY291bnRyeSkpICsKICBnZW9tX3Ntb290aChmb3JtdWxhID0gJ3l+eCcsIG1ldGhvZCA9ICJsb2VzcyIsIHNlID0gRkFMU0UpCmBgYAoKKirmsJfjgaXjgYTjgZ/jgZPjgajjg7vnlpHllY8qKgoKIyMjIyBjLiDjg6njg4bjg7PjgqLjg6Hjg6rjgqvvvJTjgqvlm70KCmBgYHtyfQpkZl9uZXdfaGl2IHw+IGZpbHRlcihjb3VudHJ5ICVpbiUgQ0hPU0VOX0NPVU5UUklFUykgfD4gZHJvcF9uYShuZXdfaGl2KSB8PgogIGdncGxvdChhZXMoeWVhciwgbmV3X2hpdikpICsgZ2VvbV9saW5lKGFlcyhjb2wgPSBjb3VudHJ5KSkKYGBgCgoqKuWPguiAg++8muW5s+Wdh+eahOOBquWApOOCkuabsue3muOBp+ihqOOBmeOBk+OBqOOCguWPr+iDveOBp+OBmeOAgmxvZXNzIOOCkuS9v+OBhuOBqOa7keOCieOBi+OBquabsue3muOBp+i/keS8vOOBl+OBpuOBj+OCjOOBvuOBmeOAgioqCgpgYGB7cn0KZGZfbmV3X2hpdiB8PiBmaWx0ZXIoY291bnRyeSAlaW4lIENIT1NFTl9DT1VOVFJJRVMpIHw+IGRyb3BfbmEobmV3X2hpdikgfD4KICBnZ3Bsb3QoYWVzKHllYXIsIG5ld19oaXYpKSArIGdlb21fbGluZShhZXMoY29sID0gY291bnRyeSkpICsKICBnZW9tX3Ntb290aChmb3JtdWxhID0gJ3l+eCcsIG1ldGhvZCA9ICJsb2VzcyIsIHNlID0gRkFMU0UpCmBgYAoKIyMjIOWIhuW4gwoK44OH44O844K/44Gu5pWw44GL44KJ44CB44G+44Ga44Gv44CBMjAyMOW5tOOBq+OBpOOBhOOBpuimi+OBpuOBv+OCi+OAggoKYGBge3J9CmRmX25ld19oaXYgfD4gZmlsdGVyKHllYXIgPT0gMjAyMCkgfD4gZmlsdGVyKCEoY291bnRyeSAlaW4lIFJFR0lPTikpfD4KICBkcm9wX25hKG5ld19oaXYpIHw+CiAgZ2dwbG90KGFlcyhuZXdfaGl2KSkgKyBnZW9tX2hpc3RvZ3JhbShiaW53aWR0aCA9IDEwKQpgYGAKCioq5Y+C6ICD77yaKipTQUNVIOOBru+8leOCq+WbveOBruWApOOCkue4pue3muOBp+abuOOBjei+vOOCgOOBq+OBr+S4i+OBruOCiOOBhuOBq+OBl+OBvuOBmeOAggoKYGBge3J9CmRmX25ld19oaXYgfD4gZmlsdGVyKHllYXIgPT0gMjAyMCkgfD4gZmlsdGVyKGNvdW50cnkgJWluJSBTT1VUSF9BRlJJQ0FfRklWRSkgCmBgYAoKKirlj4LogIPvvJrml6XmnKzjgagqKlNBQ1Ug44Gu77yV44Kr5Zu944Gu5YCk44KS57im57ea44Gn5pu444GN6L6844KA44Gr44Gv5LiL44Gu44KI44GG44Gr44GX44G+44GZ44CCCgpgYGB7cn0KSlAgPC0gMi40ClNBRiA8LSBkZl9uZXdfaGl2IHw+IGZpbHRlcih5ZWFyID09IDIwMjApIHw+IGZpbHRlcihjb3VudHJ5ICVpbiUgU09VVEhfQUZSSUNBX0ZJVkUpIHw+IHB1bGwobmV3X2hpdikKZGZfbmV3X2hpdiB8PiBmaWx0ZXIoeWVhciA9PSAyMDIwKSB8PiBmaWx0ZXIoIShjb3VudHJ5ICVpbiUgUkVHSU9OKSl8PgogIGRyb3BfbmEobmV3X2hpdikgfD4KICBnZ3Bsb3QoKSArIGdlb21faGlzdG9ncmFtKGFlcyhuZXdfaGl2KSwgYmlud2lkdGggPSAxMCkgKwogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IFNBRiwgY29sID0gInJlZCIpICsgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gSlAsIGNvbCA9ICJibHVlIikgK2xhYnModGl0bGUgPSAi5paw6KaPSElW5oSf5p+T6ICF5pWwIiwgc3VidGl0bGUgPSAi5pel5pys77ya6Z2S44CBU0FDVe+8mui1pCIpCmBgYAoKIyMjIOODh+ODvOOCv+OBjOWNgeWIhuOBguOCi+acgOi/keOBruW5tOOBruWApOOBrjEw44Kr5Zu944Gu5YCk44Gu5qOS44Kw44Op44OVCgojIyMjIGEuIOWApOOBjOWkp+OBjeOBhOaWueOBi+OCiQoKYGBge3J9CmRmX25ld19oaXYgfD4gZmlsdGVyKHllYXIgPT0gMjAyMCkgfD4gZHJvcF9uYShuZXdfaGl2KSB8PiAKICBmaWx0ZXIoIShpc28yYyAlaW4lIFJFR0lPTikpfD4KICBhcnJhbmdlKGRlc2MobmV3X2hpdikpIHw+IGhlYWQoMTApIHw+IAogIGdncGxvdChhZXMoZmN0X3Jlb3JkZXIoY291bnRyeSwgbmV3X2hpdiksIG5ld19oaXYpKSArIGdlb21fY29sKCkgKyAKICBjb29yZF9mbGlwKCkgKyBsYWJzKHRpdGxlID0gIuaWsOimj0hJVuaEn+afk+iAheaVsCIsIHggPSAiY291bnRyeSIpCmBgYAoKIyMjIyBiLiDlgKTjgYzlsI/jgZXjgYTmlrnjgYvjgokKCmBgYHtyfQpkZl9uZXdfaGl2IHw+IGZpbHRlcih5ZWFyID09IDIwMjApIHw+IGRyb3BfbmEobmV3X2hpdikgfD4gCiAgZmlsdGVyKCEoaXNvMmMgJWluJSBSRUdJT04pKXw+CiAgYXJyYW5nZShuZXdfaGl2KSB8PiBoZWFkKDEwKSB8PiAKICBnZ3Bsb3QoYWVzKGZjdF9yZXYoZmN0X3Jlb3JkZXIoY291bnRyeSwgbmV3X2hpdikpLCBuZXdfaGl2KSkgKyBnZW9tX2NvbCgpICsgCiAgY29vcmRfZmxpcCgpICsgbGFicyh0aXRsZSA9ICJMb3dlc3QgMTAgQ291bnRyaWVzIiwgeSA9ICJuZXcgaGl2IGluZmVjdGVkIiwgeCA9ICJjb3VudHJ5IikKYGBgCgojIDcuIOWIneetieS4reetieWtpuagoeWwseWtpueOh++8iOaAp+W3ru+8iQoKIyMg44OH44O844K/CgotICAgU2Nob29sIGVucm9sbG1lbnQsIHByaW1hcnkgYW5kIHNlY29uZGFyeSAoZ3Jvc3MpLCBnZW5kZXIgcGFyaXR5IGluZGV4IChHUEkp77yaU0UuRU5SLlBSU0MuRk0uWlMgW1tMaW5rXShodHRwczovL2RhdGEud29ybGRiYW5rLm9yZy9pbmRpY2F0b3IvU0UuRU5SLlBSU0MuRk0uWlMpXQotICAgR2VuZGVyIHBhcml0eSBpbmRleCBmb3IgZ3Jvc3MgZW5yb2xsbWVudCByYXRpbyBpbiBwcmltYXJ5IGFuZCBzZWNvbmRhcnkgZWR1Y2F0aW9uIGlzIHRoZSByYXRpbyBvZiBnaXJscyB0byBib3lzIGVucm9sbGVkIGF0IHByaW1hcnkgYW5kIHNlY29uZGFyeSBsZXZlbHMgaW4gcHVibGljIGFuZCBwcml2YXRlIHNjaG9vbHMuCgojIyMg44OH44O844K/5oOF5aCxCgotICAg44OH44O844K/5ZCN77ya5Yid562J5Lit562J5a2m5qCh5bCx5a2m546H55S35aWz5q+U77yIR1BJ77yJCgotICAg44OH44O844K/44Kz44O844OJ77yaU0UuRU5SLlBSU0MuRk0uWlMKCi0gICDlpInmlbDlkI3vvJpzY2hvb2xfZ3BpCgotICAg5qaC6KaB77ya5Yid562J5Lit562J5pWZ6IKy44Gr44GK44GR44KL57eP5bCx5a2m546H44Gu55S35aWz5bmz562J5oyH5pWw44Gv44CB5YWs56uL44GK44KI44Gz56eB56uL5a2m5qCh44Gu5Yid562J44GK44KI44Gz5Lit562J5pWZ6IKy44Os44OZ44Or44Gr5Zyo57GN44GZ44KL5aWz5a2Q44Go55S35a2Q44Gu5q+U546H44Gn44GZ44CCCgojIyMg44OH44O844K/44Gu5Y+W5b6XCgojIyMjIOa6luWCmQoKYGBge3J9CmxpYnJhcnkodGlkeXZlcnNlKQpsaWJyYXJ5KFdESSkKYGBgCgpXREkg44OR44OD44Kx44O844K444KS5L2/44Gj44Gm44CB55u05o6l44OH44O844K/44KS44OA44Km44Oz44Ot44O844OJ44GX44CB5aSJ5pWw5ZCN44KS44CBYGVkX2V4cGAg44Gr5oyH5a6a44CCCgpgYGB7ciBldmFsID0gRkFMU0V9CmRmX3NjaG9vbF9ncGkgPC0gV0RJKGluZGljYXRvciA9IGMoc2Nob29sX2dwaSA9ICJTRS5FTlIuUFJTQy5GTS5aUyIpKQpgYGAKCmBgYHtyIGV2YWwgPSBGQUxTRX0Kd3JpdGVfY3N2KGRmX3NjaG9vbF9ncGksICJkYXRhL3NjaG9vbF9ncGkuY3N2IikKYGBgCgpgYGB7cn0KZGZfc2Nob29sX2dwaSA8LSByZWFkX2NzdigiZGF0YS9zY2hvb2xfZ3BpLmNzdiIpCmBgYAoKIyMjIOODh+ODvOOCv+OBrueiuuiqjQoKYGBge3J9CmRmX3NjaG9vbF9ncGkKYGBgCgpgYGB7cn0Kc3RyKGRmX3NjaG9vbF9ncGkpCmBgYAoKYGBge3J9ClJFR0lPTiA8LSBjKCIxQSIsICIxVyIsICI0RSIsICI3RSIsICI4UyIsICJCOCIsICJFVSIsICJGMSIsICJPRSIsICJTMSIsIAoiUzIiLCAiUzMiLCAiUzQiLCAiVDIiLCAiVDMiLCAiVDQiLCAiVDUiLCAiVDYiLCAiVDciLCAiVjEiLCAiVjIiLCAKIlYzIiwgIlY0IiwgIlhDIiwgIlhEIiwgIlhFIiwgIlhGIiwgIlhHIiwgIlhIIiwgIlhJIiwgIlhKIiwgIlhMIiwgCiJYTSIsICJYTiIsICJYTyIsICJYUCIsICJYUSIsICJYVCIsICJYVSIsICJYWSIsICJaNCIsICJaNyIsICJaRiIsIAoiWkciLCAiWkgiLCAiWkkiLCAiWkoiLCAiWlEiLCAiWlQiKQpgYGAKCmBgYHtyfQpkZl9zY2hvb2xfZ3BpIHw+IGZpbHRlcihpc28yYyAlaW4lIFJFR0lPTikgfD4gZGlzdGluY3QoY291bnRyeSwgaXNvMmMpCmBgYAoKYGBge3J9CmRmX3NjaG9vbF9ncGkgfD4gZmlsdGVyKCEoaXNvMmMgJWluJSBSRUdJT04pKSB8PiBkaXN0aW5jdChjb3VudHJ5LCBpc28yYykKYGBgCgojIyMg5YiG5p6Q44GZ44KL5Zu944Gu44Oq44K544OICgojIyMjICoq5Y2X6YOo44Ki44OV44Oq44Kr6Zai56iO5ZCM55ufKiogVGhlIFNvdXRoZXJuIEFmcmljYW4gQ3VzdG9tcyBVbmlvbiAoU0FDVSkKCmBgYHtyfQpTT1VUSF9BRlJJQ0FfRklWRSA8LSBjKCJTb3V0aCBBZnJpY2EiLCAiTmFtaWJpYSIsICJFc3dhdGluaSIsICJCb3Rzd2FuYSIsICJMZXNvdGhvIikKYGBgCgojIyMjIOODqeODhuODs+OCouODoeODquOCq+OBp+OCuOODi+aMh+aVsOOBjOWkp+OBjeOBhO+8lOOCq+WbvQoKYGBge3J9CkNIT1NFTl9DT1VOVFJJRVMgPC0gYygiU3VyaW5hbWUiLCAiQmVsaXplIiwgIkJyYXppbCIsICJDb2xvbWJpYSIpCmBgYAoKIyMg5YiG5p6QCgojIyMgMS4g5ZCE5bm05q+O44Gu44OH44O844K/44Gu5pWw44Gu5qOS44Kw44Op44OVCgpgYGB7cn0KZGZfc2Nob29sX2dwaSB8PiBkcm9wX25hKHNjaG9vbF9ncGkpIHw+IGZpbHRlcighKGlzbzJjICVpbiUgUkVHSU9OKSkgfD4KICBnZ3Bsb3QoYWVzKHllYXIpKSArIGdlb21fYmFyKCkKYGBgCgojIyDoppbopprljJYKCiMjIyAyLiDml6XmnKzjga7liJ3nrYnkuK3nrYnlrabmoKHlsLHlrabnjofjgavjgYrjgZHjgosgR1BJCgpgYGB7cn0KZGZfc2Nob29sX2dwaSB8PiBmaWx0ZXIoY291bnRyeSA9PSAiSmFwYW4iKSB8PiAKICBkcm9wX25hKHNjaG9vbF9ncGkpIHw+IGFycmFuZ2UoZGVzYyh5ZWFyKSkKYGBgCgojIyMgMy4g57WM5bm05aSJ5YyWCgojIyMjIGEuIOaXpeacrAoKYGBge3J9CmRmX3NjaG9vbF9ncGkgfD4gZmlsdGVyKGNvdW50cnkgPT0gIkphcGFuIikgfD4gZHJvcF9uYShzY2hvb2xfZ3BpKSB8PgogIGdncGxvdChhZXMoeWVhciwgc2Nob29sX2dwaSkpICsgZ2VvbV9saW5lKCkKYGBgCgoqKuawl+OBpeOBhOOBn+OBk+OBqOODu+eWkeWVjyoqCgojIyMjIGIuIOWNl+mDqOOCouODleODquOCq+mWoueojuWQjOebnwoKYGBge3J9CmRmX3NjaG9vbF9ncGkgfD4gZmlsdGVyKGNvdW50cnkgJWluJSBTT1VUSF9BRlJJQ0FfRklWRSkgfD4gCiAgZHJvcF9uYShzY2hvb2xfZ3BpKSB8PgogIGdncGxvdChhZXMoeWVhciwgc2Nob29sX2dwaSkpICsgZ2VvbV9saW5lKGFlcyhjb2wgPSBjb3VudHJ5KSkKYGBgCgoqKuWPguiAg++8muW5s+Wdh+eahOOBquWApOOCkuabsue3muOBp+ihqOOBmeOBk+OBqOOCguWPr+iDveOBp+OBmeOAgmxvZXNzIOOCkuS9v+OBhuOBqOa7keOCieOBi+OBquabsue3muOBp+i/keS8vOOBl+OBpuOBj+OCjOOBvuOBmeOAgioqCgpgYGB7cn0KZGZfc2Nob29sX2dwaSB8PiBmaWx0ZXIoY291bnRyeSAlaW4lIFNPVVRIX0FGUklDQV9GSVZFKSB8PiAKICBkcm9wX25hKHNjaG9vbF9ncGkpIHw+CiAgZ2dwbG90KGFlcyh5ZWFyLCBzY2hvb2xfZ3BpKSkgKyBnZW9tX2xpbmUoYWVzKGNvbCA9IGNvdW50cnkpKSArCiAgZ2VvbV9zbW9vdGgoZm9ybXVsYSA9ICd5fngnLCBtZXRob2QgPSAibG9lc3MiLCBzZSA9IEZBTFNFKQpgYGAKCioq5rCX44Gl44GE44Gf44GT44Go44O755aR5ZWPKioKCi0gICDjgobjgovjgoTjgYvjgavmuJvlsJHjgIIxLjAg44Gr6L+R44Gl44GE44Gm44GE44KL44CCCgojIyMjIGMuIOODqeODhuODs+OCouODoeODquOCq++8lOOCq+WbvQoKYGBge3J9CmRmX3NjaG9vbF9ncGkgfD4gZmlsdGVyKGNvdW50cnkgJWluJSBDSE9TRU5fQ09VTlRSSUVTKSB8PiBkcm9wX25hKHNjaG9vbF9ncGkpIHw+CiAgZ2dwbG90KGFlcyh5ZWFyLCBzY2hvb2xfZ3BpKSkgKyBnZW9tX2xpbmUoYWVzKGNvbCA9IGNvdW50cnkpKQpgYGAKCioq5Y+C6ICD77ya5bmz5Z2H55qE44Gq5YCk44KS5puy57ea44Gn6KGo44GZ44GT44Go44KC5Y+v6IO944Gn44GZ44CCbG9lc3Mg44KS5L2/44GG44Go5ruR44KJ44GL44Gq5puy57ea44Gn6L+R5Ly844GX44Gm44GP44KM44G+44GZ44CCKioKCmBgYHtyfQpkZl9zY2hvb2xfZ3BpIHw+IGZpbHRlcihjb3VudHJ5ICVpbiUgQ0hPU0VOX0NPVU5UUklFUykgfD4gZHJvcF9uYShzY2hvb2xfZ3BpKSB8PgogIGdncGxvdChhZXMoeWVhciwgc2Nob29sX2dwaSkpICsgZ2VvbV9saW5lKGFlcyhjb2wgPSBjb3VudHJ5KSkgKwogIGdlb21fc21vb3RoKGZvcm11bGEgPSAneX54JywgbWV0aG9kID0gImxvZXNzIiwgc2UgPSBGQUxTRSkKYGBgCgojIyMg5YiG5biDCgrjg4fjg7zjgr/jga7mlbDjgYvjgonjgIEyMDIw5bm044Gu44OH44O844K/44Gv5bCR44Gq44GE44Gu44Gn44CBMjAxOeW5tOOBq+OBpOOBhOOBpuimi+OBpuOBv+OCi+OAggoKYGBge3J9CmRmX3NjaG9vbF9ncGkgfD4gZmlsdGVyKHllYXIgPT0gMjAxOSkgfD4gZmlsdGVyKCEoY291bnRyeSAlaW4lIFJFR0lPTikpfD4KICBkcm9wX25hKHNjaG9vbF9ncGkpIHw+CiAgZ2dwbG90KGFlcyhzY2hvb2xfZ3BpKSkgKyBnZW9tX2hpc3RvZ3JhbShiaW53aWR0aCA9IDAuMDIpCmBgYAoKKirlj4LogIPvvJoqKlNBQ1Ug44Gu77yV44Kr5Zu944Gu5YCk44KS57im57ea44Gn5pu444GN6L6844KA44Gr44Gv5LiL44Gu44KI44GG44Gr44GX44G+44GZ44CCCgpgYGB7cn0KZGZfc2Nob29sX2dwaSB8PiBmaWx0ZXIoeWVhciA9PSAyMDE5KSB8PiBmaWx0ZXIoY291bnRyeSAlaW4lIFNPVVRIX0FGUklDQV9GSVZFKSAKYGBgCgoqKuWPguiAg++8muaXpeacrOOBqCoqU0FDVSDjga7vvJXjgqvlm73jga7lgKTjgpLnuKbnt5rjgafmm7jjgY3ovrzjgoDjgavjga/kuIvjga7jgojjgYbjgavjgZfjgb7jgZnjgIIKCmBgYHtyfQpKUCA8LSAxLjAwMzQxICMgbm8gcmVjZW50IGRhdGEgYWZ0ZXIgMjAxOQpTQUYgPC0gZGZfc2Nob29sX2dwaSB8PiBmaWx0ZXIoeWVhciA9PSAyMDE5KSB8PiBmaWx0ZXIoY291bnRyeSAlaW4lIFNPVVRIX0FGUklDQV9GSVZFKSB8PiBwdWxsKHNjaG9vbF9ncGkpCmRmX3NjaG9vbF9ncGkgfD4gZmlsdGVyKHllYXIgPT0gMjAxOSkgfD4gZmlsdGVyKCEoY291bnRyeSAlaW4lIFJFR0lPTikpfD4KICBkcm9wX25hKHNjaG9vbF9ncGkpIHw+CiAgZ2dwbG90KCkgKyBnZW9tX2hpc3RvZ3JhbShhZXMoc2Nob29sX2dwaSksIGJpbndpZHRoID0gMC4wMikgKwogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IFNBRiwgY29sID0gInJlZCIpICsgI2dlb21fdmxpbmUoeGludGVyY2VwdCA9IEpQLCBjb2wgPSAiYmx1ZSIpCiAgbGFicyh0aXRsZSA9ICIyMDE55bm044Gu5Yid562J5Lit562J5a2m5qCh5bCx5a2m546HIEdQSSIsIHN1YnRpdGxlID0gIuaXpeacrO+8mumdkuOAgVNBQ1XvvJrotaQiKQpgYGAKCiMjIyDjg4fjg7zjgr/jgYzljYHliIbjgYLjgovmnIDov5Hjga7lubTjga7lgKTjga4xMOOCq+WbveOBruWApOOBruajkuOCsOODqeODlQoKIyMjIyBhLiDlgKTjgYzlpKfjgY3jgYTmlrnjgYvjgokKCmBgYHtyfQpkZl9zY2hvb2xfZ3BpIHw+IGZpbHRlcih5ZWFyID09IDIwMTkpIHw+IGRyb3BfbmEoc2Nob29sX2dwaSkgfD4gCiAgZmlsdGVyKCEoaXNvMmMgJWluJSBSRUdJT04pKXw+CiAgYXJyYW5nZShkZXNjKHNjaG9vbF9ncGkpKSB8PiBoZWFkKDEwKSB8PiAKICBnZ3Bsb3QoYWVzKGZjdF9yZW9yZGVyKGNvdW50cnksIHNjaG9vbF9ncGkpLCBzY2hvb2xfZ3BpKSkgKyBnZW9tX2NvbCgpICsgCiAgY29vcmRfZmxpcCgpICsgbGFicyh0aXRsZSA9ICJUb3AgMTAgQ291bnRyaWVzIiwgeCA9ICJjb3VudHJ5IiwgeSA9ICJwcmltYXJ5IGFuZCBzZWNvbmRhcnkgZW5yb2xsbWVudCwgR1BJIikKYGBgCgojIyMjIGIuIOWApOOBjOWwj+OBleOBhOaWueOBi+OCiQoKYGBge3J9CmRmX3NjaG9vbF9ncGkgfD4gZmlsdGVyKHllYXIgPT0gMjAxOSkgfD4gZHJvcF9uYShzY2hvb2xfZ3BpKSB8PiAKICBmaWx0ZXIoIShpc28yYyAlaW4lIFJFR0lPTikpfD4KICBhcnJhbmdlKHNjaG9vbF9ncGkpIHw+IGhlYWQoMTApIHw+IAogIGdncGxvdChhZXMoZmN0X3JldihmY3RfcmVvcmRlcihjb3VudHJ5LCBzY2hvb2xfZ3BpKSksIHNjaG9vbF9ncGkpKSArIGdlb21fY29sKCkgKyAKICBjb29yZF9mbGlwKCkgKyBsYWJzKHRpdGxlID0gIkxvd2VzdCAxMCBDb3VudHJpZXMiLCB4ID0gImNvdW50cnkiLCB5ID0gInByaW1hcnkgYW5kIHNlY29uZGFyeSBlbnJvbGxtZW50LCBHUEkiKQpgYGAKCiMgOC4g5aWz5oCn5bCx5Yq0546HCgojIyDjg4fjg7zjgr8KCi0gICBSYXRpbyBvZiBmZW1hbGUgdG8gbWFsZSBsYWJvciBmb3JjZSBwYXJ0aWNpcGF0aW9uIHJhdGUgKCUpIChtb2RlbGVkIElMTyBlc3RpbWF0ZSnvvJpTTC5UTEYuQ0FDVC5GTS5aUyBbW0xpbmtdKGh0dHBzOi8vZGF0YS53b3JsZGJhbmsub3JnL2luZGljYXRvci9TTC5UTEYuQ0FDVC5GTS5aUyldCi0gICBMYWJvciBmb3JjZSBwYXJ0aWNpcGF0aW9uIHJhdGUgaXMgdGhlIHByb3BvcnRpb24gb2YgdGhlIHBvcHVsYXRpb24gYWdlcyAxNSBhbmQgb2xkZXIgdGhhdCBpcyBlY29ub21pY2FsbHkgYWN0aXZlOiBhbGwgcGVvcGxlIHdobyBzdXBwbHkgbGFib3IgZm9yIHRoZSBwcm9kdWN0aW9uIG9mIGdvb2RzIGFuZCBzZXJ2aWNlcyBkdXJpbmcgYSBzcGVjaWZpZWQgcGVyaW9kLiBSYXRpbyBvZiBmZW1hbGUgdG8gbWFsZSBsYWJvciBmb3JjZSBwYXJ0aWNpcGF0aW9uIHJhdGUgaXMgY2FsY3VsYXRlZCBieSBkaXZpZGluZyBmZW1hbGUgbGFib3IgZm9yY2UgcGFydGljaXBhdGlvbiByYXRlIGJ5IG1hbGUgbGFib3IgZm9yY2UgcGFydGljaXBhdGlvbiByYXRlIGFuZCBtdWx0aXBseWluZyBieSAxMDAuCgojIyMg44OH44O844K/5oOF5aCxCgotICAg44OH44O844K/5ZCN77ya5aWz5oCn5bCx5Yq0546HCgotICAg44OH44O844K/44Kz44O844OJ77yaU0wuVExGLkNBQ1QuRk0uWlMKCi0gICDlpInmlbDlkI3vvJpqb2JfZ3BpCgotICAg5qaC6KaB77ya5Yq05YON5Y+C5Yqg546H44Go44Gv44CB57WM5riI55qE44Gr5rS75YuV44GX44Gm44GE44KLIDE1IOats+S7peS4iuOBruS6uuWPo+OBruWJsuWQiOOBp+OBguOCiuOAgeaMh+WumuOBleOCjOOBn+acn+mWk+OBq+WVhuWTgeOChOOCteODvOODk+OCueOBrueUn+eUo+OBq+WKtOWDjeWKm+OCkuS+m+e1puOBmeOCi+OBmeOBueOBpuOBruS6uuOAheOCkuaMh+OBl+OBvuOBmeOAguWls+aAp+WKtOWDjeWKm+eOh+OBqOeUt+aAp+WKtOWDjeWKm+eOh+OBruavlOeOh+OBr+OAgeWls+aAp+WKtOWDjeWKm+eOh+OCkueUt+aAp+WKtOWDjeWKm+eOh+OBp+WJsuOBo+OBpjEwMOOCkuS5l+OBmOOBpueul+WHuuOBl+OBvuOBmeOAggoKIyMjIOODh+ODvOOCv+OBruWPluW+lwoKIyMjIyDmupblgpkKCmBgYHtyfQpsaWJyYXJ5KHRpZHl2ZXJzZSkKbGlicmFyeShXREkpCmBgYAoKV0RJIOODkeODg+OCseODvOOCuOOCkuS9v+OBo+OBpuOAgeebtOaOpeODh+ODvOOCv+OCkuODgOOCpuODs+ODreODvOODieOBl+OAgeWkieaVsOWQjeOCkuOAgWBlZF9leHBgIOOBq+aMh+WumuOAggoKYGBge3IgZXZhbCA9IEZBTFNFfQpkZl9qb2JfZ3BpIDwtIFdESShpbmRpY2F0b3IgPSBjKGpvYl9ncGkgPSAiU0wuVExGLkNBQ1QuRk0uWlMiKSkKYGBgCgpgYGB7ciBldmFsID0gRkFMU0V9CndyaXRlX2NzdihkZl9qb2JfZ3BpLCAiZGF0YS9qb2JfZ3BpLmNzdiIpCmBgYAoKYGBge3J9CmRmX2pvYl9ncGkgPC0gcmVhZF9jc3YoImRhdGEvam9iX2dwaS5jc3YiKQpgYGAKCiMjIyDjg4fjg7zjgr/jga7norroqo0KCmBgYHtyfQpkZl9qb2JfZ3BpCmBgYAoKYGBge3J9CnN0cihkZl9qb2JfZ3BpKQpgYGAKCmBgYHtyfQpSRUdJT04gPC0gYygiMUEiLCAiMVciLCAiNEUiLCAiN0UiLCAiOFMiLCAiQjgiLCAiRVUiLCAiRjEiLCAiT0UiLCAiUzEiLCAKIlMyIiwgIlMzIiwgIlM0IiwgIlQyIiwgIlQzIiwgIlQ0IiwgIlQ1IiwgIlQ2IiwgIlQ3IiwgIlYxIiwgIlYyIiwgCiJWMyIsICJWNCIsICJYQyIsICJYRCIsICJYRSIsICJYRiIsICJYRyIsICJYSCIsICJYSSIsICJYSiIsICJYTCIsIAoiWE0iLCAiWE4iLCAiWE8iLCAiWFAiLCAiWFEiLCAiWFQiLCAiWFUiLCAiWFkiLCAiWjQiLCAiWjciLCAiWkYiLCAKIlpHIiwgIlpIIiwgIlpJIiwgIlpKIiwgIlpRIiwgIlpUIikKYGBgCgpgYGB7cn0KZGZfam9iX2dwaSB8PiBmaWx0ZXIoaXNvMmMgJWluJSBSRUdJT04pIHw+IGRpc3RpbmN0KGNvdW50cnksIGlzbzJjKQpgYGAKCmBgYHtyfQpkZl9qb2JfZ3BpIHw+IGZpbHRlcighKGlzbzJjICVpbiUgUkVHSU9OKSkgfD4gZGlzdGluY3QoY291bnRyeSwgaXNvMmMpCmBgYAoKIyMjIOWIhuaekOOBmeOCi+WbveOBruODquOCueODiAoKIyMjIyAqKuWNl+mDqOOCouODleODquOCq+mWoueojuWQjOebnyoqIFRoZSBTb3V0aGVybiBBZnJpY2FuIEN1c3RvbXMgVW5pb24gKFNBQ1UpCgpgYGB7cn0KU09VVEhfQUZSSUNBX0ZJVkUgPC0gYygiU291dGggQWZyaWNhIiwgIk5hbWliaWEiLCAiRXN3YXRpbmkiLCAiQm90c3dhbmEiLCAiTGVzb3RobyIpCmBgYAoKIyMjIyDjg6njg4bjg7PjgqLjg6Hjg6rjgqvjgafjgrjjg4vmjIfmlbDjgYzlpKfjgY3jgYTvvJTjgqvlm70KCmBgYHtyfQpDSE9TRU5fQ09VTlRSSUVTIDwtIGMoIlN1cmluYW1lIiwgIkJlbGl6ZSIsICJCcmF6aWwiLCAiQ29sb21iaWEiKQpgYGAKCiMjIOWIhuaekAoKIyMjIDEuIOWQhOW5tOavjuOBruODh+ODvOOCv+OBruaVsOOBruajkuOCsOODqeODlQoKYGBge3J9CmRmX2pvYl9ncGkgfD4gZHJvcF9uYShqb2JfZ3BpKSB8PiBmaWx0ZXIoIShpc28yYyAlaW4lIFJFR0lPTikpIHw+CiAgZ2dwbG90KGFlcyh5ZWFyKSkgKyBnZW9tX2JhcigpCmBgYAoKIyMg6KaW6Kaa5YyWCgojIyMgMi4g5pel5pys44Gu5aWz5oCn5bCx5Yq0546HCgpgYGB7cn0KZGZfam9iX2dwaSB8PiBmaWx0ZXIoY291bnRyeSA9PSAiSmFwYW4iKSB8PiAKICBkcm9wX25hKGpvYl9ncGkpIHw+IGFycmFuZ2UoZGVzYyh5ZWFyKSkKYGBgCgojIyMgMy4g57WM5bm05aSJ5YyWCgojIyMjIGEuIOaXpeacrAoKYGBge3J9CmRmX2pvYl9ncGkgfD4gZmlsdGVyKGNvdW50cnkgPT0gIkphcGFuIikgfD4gZHJvcF9uYShqb2JfZ3BpKSB8PgogIGdncGxvdChhZXMoeWVhciwgam9iX2dwaSkpICsgZ2VvbV9saW5lKCkKYGBgCgoqKuawl+OBpeOBhOOBn+OBk+OBqOODu+eWkeWVjyoqCgotICAgMjAwMOW5tOOBlOOCjeOBi+OCieOBr+S4iuaYh+OBl+OBpuOBhOOCi+OAguOBqeOCk+OBquaUv+etluWkieabtOOBjOOBguOBo+OBn+OBruOBoOOCjeOBhuOBi+OAggoKLSAgIOOBk+OBruOBvuOBvuOAgeS4iuaYh+OBmeOCi+OBqOOAgTIwNDDlubTjgZTjgo3jgavjga/jgIE5MOOCkui2heOBiOOAgTEwMOOBq+i/keOBpeOBj+OAguOBneOCjOOBp+OAgeWVj+mhjOOBr+ino+axuuOBl+OBn+OBqOiogOOBiOOCi+OBruOBoOOCjeOBhuOBi+OAggoKIyMjIyBiLiDljZfpg6jjgqLjg5Xjg6rjgqvplqLnqI7lkIznm58KCmBgYHtyfQpkZl9qb2JfZ3BpIHw+IGZpbHRlcihjb3VudHJ5ICVpbiUgU09VVEhfQUZSSUNBX0ZJVkUpIHw+IGRyb3BfbmEoam9iX2dwaSkgfD4KICBnZ3Bsb3QoYWVzKHllYXIsIGpvYl9ncGkpKSArIGdlb21fbGluZShhZXMoY29sID0gY291bnRyeSkpCmBgYAoKKirlj4LogIPvvJrlubPlnYfnmoTjgarlgKTjgpLmm7Lnt5rjgafooajjgZnjgZPjgajjgoLlj6/og73jgafjgZnjgIJsb2VzcyDjgpLkvb/jgYbjgajmu5HjgonjgYvjgarmm7Lnt5rjgafov5HkvLzjgZfjgabjgY/jgozjgb7jgZnjgIIqKgoKYGBge3J9CmRmX2pvYl9ncGkgfD4gZmlsdGVyKGNvdW50cnkgJWluJSBTT1VUSF9BRlJJQ0FfRklWRSkgfD4gZHJvcF9uYShqb2JfZ3BpKSB8PgogIGdncGxvdChhZXMoeWVhciwgam9iX2dwaSkpICsgZ2VvbV9saW5lKGFlcyhjb2wgPSBjb3VudHJ5KSkgKwogIGdlb21fc21vb3RoKGZvcm11bGEgPSAneX54JywgbWV0aG9kID0gImxvZXNzIiwgc2UgPSBGQUxTRSkKYGBgCgoqKuawl+OBpeOBhOOBn+OBk+OBqOODu+eWkeWVjyoqCgotICAg5YWo5L2T55qE44Gr44Gv5LiK5piH44GX44Gm44GE44KL44CCCgojIyMjIGMuIOODqeODhuODs+OCouODoeODquOCq++8lOOCq+WbvQoKYGBge3J9CmRmX2pvYl9ncGkgfD4gZmlsdGVyKGNvdW50cnkgJWluJSBDSE9TRU5fQ09VTlRSSUVTKSB8PiBkcm9wX25hKGpvYl9ncGkpIHw+CiAgZ2dwbG90KGFlcyh5ZWFyLCBqb2JfZ3BpKSkgKyBnZW9tX2xpbmUoYWVzKGNvbCA9IGNvdW50cnkpKQpgYGAKCioq5Y+C6ICD77ya5bmz5Z2H55qE44Gq5YCk44KS5puy57ea44Gn6KGo44GZ44GT44Go44KC5Y+v6IO944Gn44GZ44CCbG9lc3Mg44KS5L2/44GG44Go5ruR44KJ44GL44Gq5puy57ea44Gn6L+R5Ly844GX44Gm44GP44KM44G+44GZ44CCKioKCmBgYHtyfQpkZl9qb2JfZ3BpIHw+IGZpbHRlcihjb3VudHJ5ICVpbiUgQ0hPU0VOX0NPVU5UUklFUykgfD4gZHJvcF9uYShqb2JfZ3BpKSB8PgogIGdncGxvdChhZXMoeWVhciwgam9iX2dwaSkpICsgZ2VvbV9saW5lKGFlcyhjb2wgPSBjb3VudHJ5KSkgKwogIGdlb21fc21vb3RoKGZvcm11bGEgPSAneX54JywgbWV0aG9kID0gImxvZXNzIiwgc2UgPSBGQUxTRSkKYGBgCgojIyMg5YiG5biDCgrjg4fjg7zjgr/jga7mlbDjgYvjgonjgIHjgb7jgZrjga/jgIEyMDIw5bm044Gr44Gk44GE44Gm6KaL44Gm44G/44KL44CCCgpgYGB7cn0KZGZfam9iX2dwaSB8PiBmaWx0ZXIoeWVhciA9PSAyMDIwKSB8PiBmaWx0ZXIoIShjb3VudHJ5ICVpbiUgUkVHSU9OKSl8PgogIGRyb3BfbmEoam9iX2dwaSkgfD4KICBnZ3Bsb3QoYWVzKGpvYl9ncGkpKSArIGdlb21faGlzdG9ncmFtKGJpbndpZHRoID0gMTApCmBgYAoKKirlj4LogIPvvJoqKlNBQ1Ug44Gu77yV44Kr5Zu944Gu5YCk44KS57im57ea44Gn5pu444GN6L6844KA44Gr44Gv5LiL44Gu44KI44GG44Gr44GX44G+44GZ44CCCgpgYGB7cn0KZGZfam9iX2dwaSB8PiBmaWx0ZXIoeWVhciA9PSAyMDIwKSB8PiBmaWx0ZXIoY291bnRyeSAlaW4lIFNPVVRIX0FGUklDQV9GSVZFKSAKYGBgCgoqKuWPguiAg++8muaXpeacrOOBqCoqU0FDVSDjga7vvJXjgqvlm73jga7lgKTjgpLnuKbnt5rjgafmm7jjgY3ovrzjgoDjgavjga/kuIvjga7jgojjgYbjgavjgZfjgb7jgZnjgIIKCmBgYHtyfQpKUCA8LSA3NC41MTAyNwpTQUYgPC0gZGZfam9iX2dwaSB8PiBmaWx0ZXIoeWVhciA9PSAyMDIwKSB8PiBmaWx0ZXIoY291bnRyeSAlaW4lIFNPVVRIX0FGUklDQV9GSVZFKSB8PiBwdWxsKGpvYl9ncGkpCmRmX2pvYl9ncGkgfD4gZmlsdGVyKHllYXIgPT0gMjAyMCkgfD4gZmlsdGVyKCEoY291bnRyeSAlaW4lIFJFR0lPTikpfD4KICBkcm9wX25hKGpvYl9ncGkpIHw+CiAgZ2dwbG90KCkgKyBnZW9tX2hpc3RvZ3JhbShhZXMoam9iX2dwaSksIGJpbndpZHRoID0gMTApICsKICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSBTQUYsIGNvbCA9ICJyZWQiKSArIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IEpQLCBjb2wgPSAiYmx1ZSIpICtsYWJzKHRpdGxlID0gIuWls+aAp+OBruWwseWKtOeOhyIsIHN1YnRpdGxlID0gIuaXpeacrO+8mumdkuOAgVNBQ1XvvJrotaQiKQpgYGAKCiMjIyDjg4fjg7zjgr/jgYzljYHliIbjgYLjgovmnIDov5Hjga7lubTjga7lgKTjga4xMOOCq+WbveOBruWApOOBruajkuOCsOODqeODlQoKIyMjIyBhLiDlgKTjgYzlpKfjgY3jgYTmlrnjgYvjgokKCmBgYHtyfQpkZl9qb2JfZ3BpIHw+IGZpbHRlcih5ZWFyID09IDIwMjApIHw+IGRyb3BfbmEoam9iX2dwaSkgfD4gCiAgZmlsdGVyKCEoaXNvMmMgJWluJSBSRUdJT04pKXw+CiAgYXJyYW5nZShkZXNjKGpvYl9ncGkpKSB8PiBoZWFkKDEwKSB8PiAKICBnZ3Bsb3QoYWVzKGZjdF9yZW9yZGVyKGNvdW50cnksIGpvYl9ncGkpLCBqb2JfZ3BpKSkgKyBnZW9tX2NvbCgpICsgCiAgY29vcmRfZmxpcCgpICsgbGFicyh0aXRsZSA9ICJUb3AgMTAgQ291bnRyaWVzIiwgeCA9ICJjb3VudHJ5IiwgeSA9ICJsYWJvciBmb3JjZSBwYXJ0aWNpcGF0aW9uIHJhdGUgb2YgIikKYGBgCgojIyMjIGIuIOWApOOBjOWwj+OBleOBhOaWueOBi+OCiQoKYGBge3J9CmRmX2pvYl9ncGkgfD4gZmlsdGVyKHllYXIgPT0gMjAyMCkgfD4gZHJvcF9uYShqb2JfZ3BpKSB8PiAKICBmaWx0ZXIoIShpc28yYyAlaW4lIFJFR0lPTikpfD4KICBhcnJhbmdlKGpvYl9ncGkpIHw+IGhlYWQoMTApIHw+IAogIGdncGxvdChhZXMoZmN0X3JldihmY3RfcmVvcmRlcihjb3VudHJ5LCBqb2JfZ3BpKSksIGpvYl9ncGkpKSArIGdlb21fY29sKCkgKyAKICBjb29yZF9mbGlwKCkgKyBsYWJzKHRpdGxlID0gIkxvd2VzdCAxMCBDb3VudHJpZXMiLCB4ID0gImNvdW50cnkiLCB5ID0gImxhYm9yIGZvcmNlIHBhcnRpY2lwYXRpb24gcmF0ZSIpCmBgYAoKIyA5LiDlpbPmgKflpLHmpa3njocKCiMjIOODh+ODvOOCvwoKLSAgIFVuZW1wbG95bWVudCwgZmVtYWxlICglIG9mIGZlbWFsZSBsYWJvciBmb3JjZSkgKG1vZGVsZWQgSUxPIGVzdGltYXRlKe+8mlNMLlVFTS5UT1RMLkZFLlpTIFtbTGlua10oaHR0cHM6Ly9kYXRhLndvcmxkYmFuay5vcmcvaW5kaWNhdG9yL1NMLlVFTS5UT1RMLkZFLlpTKV0KLSAgIFVuZW1wbG95bWVudCByZWZlcnMgdG8gdGhlIHNoYXJlIG9mIHRoZSBsYWJvciBmb3JjZSB0aGF0IGlzIHdpdGhvdXQgd29yayBidXQgYXZhaWxhYmxlIGZvciBhbmQgc2Vla2luZyBlbXBsb3ltZW50LgoKIyMjIOODh+ODvOOCv+aDheWgsQoKLSAgIOODh+ODvOOCv+WQje+8muWls+aAp+WksealreeOhwoKLSAgIOODh+ODvOOCv+OCs+ODvOODie+8mlNMLlVFTS5UT1RMLkZFLlpTCgotICAg5aSJ5pWw5ZCN77yaZmVtYWxlX3VuZW1wbG95CgotICAg5qaC6KaB77ya5aSx5qWt546H44Go44Gv44CB5LuV5LqL44Gv44Gq44GP44Gm44KC6IG344Gr5bCx44GP44GT44Go44GM44Gn44GN44CB5rGC6IG344GX44Gm44GE44KL5Yq05YON5Yqb44Gu5Ymy5ZCI44KS5oyH44GX44G+44GZ44CCCgojIyMg44OH44O844K/44Gu5Y+W5b6XCgojIyMjIOa6luWCmQoKYGBge3J9CmxpYnJhcnkodGlkeXZlcnNlKQpsaWJyYXJ5KFdESSkKYGBgCgpXREkg44OR44OD44Kx44O844K444KS5L2/44Gj44Gm44CB55u05o6l44OH44O844K/44KS44OA44Km44Oz44Ot44O844OJ44GX44CB5aSJ5pWw5ZCN44KS44CBYGVkX2V4cGAg44Gr5oyH5a6a44CCCgpgYGB7ciBldmFsID0gRkFMU0V9CmRmX2ZlbWFsZV91bmVtcGxveSA8LSBXREkoaW5kaWNhdG9yID0gYyhmZW1hbGVfdW5lbXBsb3kgPSAiU0wuVUVNLlRPVEwuRkUuWlMiKSkKYGBgCgpgYGB7ciBldmFsID0gRkFMU0V9CndyaXRlX2NzdihkZl9mZW1hbGVfdW5lbXBsb3ksICJkYXRhL2ZlbWFsZV91bmVtcGxveS5jc3YiKQpgYGAKCmBgYHtyfQpkZl9mZW1hbGVfdW5lbXBsb3kgPC0gcmVhZF9jc3YoImRhdGEvZmVtYWxlX3VuZW1wbG95LmNzdiIpCmBgYAoKIyMjIOODh+ODvOOCv+OBrueiuuiqjQoKYGBge3J9CmRmX2ZlbWFsZV91bmVtcGxveQpgYGAKCmBgYHtyfQpzdHIoZGZfZmVtYWxlX3VuZW1wbG95KQpgYGAKCmBgYHtyfQpSRUdJT04gPC0gYygiMUEiLCAiMVciLCAiNEUiLCAiN0UiLCAiOFMiLCAiQjgiLCAiRVUiLCAiRjEiLCAiT0UiLCAiUzEiLCAKIlMyIiwgIlMzIiwgIlM0IiwgIlQyIiwgIlQzIiwgIlQ0IiwgIlQ1IiwgIlQ2IiwgIlQ3IiwgIlYxIiwgIlYyIiwgCiJWMyIsICJWNCIsICJYQyIsICJYRCIsICJYRSIsICJYRiIsICJYRyIsICJYSCIsICJYSSIsICJYSiIsICJYTCIsIAoiWE0iLCAiWE4iLCAiWE8iLCAiWFAiLCAiWFEiLCAiWFQiLCAiWFUiLCAiWFkiLCAiWjQiLCAiWjciLCAiWkYiLCAKIlpHIiwgIlpIIiwgIlpJIiwgIlpKIiwgIlpRIiwgIlpUIikKYGBgCgpgYGB7cn0KZGZfZmVtYWxlX3VuZW1wbG95IHw+IGZpbHRlcihpc28yYyAlaW4lIFJFR0lPTikgfD4gZGlzdGluY3QoY291bnRyeSwgaXNvMmMpCmBgYAoKYGBge3J9CmRmX2ZlbWFsZV91bmVtcGxveSB8PiBmaWx0ZXIoIShpc28yYyAlaW4lIFJFR0lPTikpIHw+IGRpc3RpbmN0KGNvdW50cnksIGlzbzJjKQpgYGAKCiMjIyDliIbmnpDjgZnjgovlm73jga7jg6rjgrnjg4gKCiMjIyMgKirljZfpg6jjgqLjg5Xjg6rjgqvplqLnqI7lkIznm58qKiBUaGUgU291dGhlcm4gQWZyaWNhbiBDdXN0b21zIFVuaW9uIChTQUNVKQoKYGBge3J9ClNPVVRIX0FGUklDQV9GSVZFIDwtIGMoIlNvdXRoIEFmcmljYSIsICJOYW1pYmlhIiwgIkVzd2F0aW5pIiwgIkJvdHN3YW5hIiwgIkxlc290aG8iKQpgYGAKCiMjIyMg44Op44OG44Oz44Ki44Oh44Oq44Kr44Gn44K444OL5oyH5pWw44GM5aSn44GN44GE77yU44Kr5Zu9CgpgYGB7cn0KQ0hPU0VOX0NPVU5UUklFUyA8LSBjKCJTdXJpbmFtZSIsICJCZWxpemUiLCAiQnJhemlsIiwgIkNvbG9tYmlhIikKYGBgCgojIyDliIbmnpAKCiMjIyAxLiDlkITlubTmr47jga7jg4fjg7zjgr/jga7mlbDjga7mo5LjgrDjg6njg5UKCmBgYHtyfQpkZl9mZW1hbGVfdW5lbXBsb3kgfD4gZHJvcF9uYShmZW1hbGVfdW5lbXBsb3kpIHw+IGZpbHRlcighKGlzbzJjICVpbiUgUkVHSU9OKSkgfD4KICBnZ3Bsb3QoYWVzKHllYXIpKSArIGdlb21fYmFyKCkKYGBgCgojIyDoppbopprljJYKCiMjIyAyLiDml6XmnKzjga7lpbPmgKflpLHmpa3njocKCmBgYHtyfQpkZl9mZW1hbGVfdW5lbXBsb3kgfD4gZmlsdGVyKGNvdW50cnkgPT0gIkphcGFuIikgfD4gCiAgZHJvcF9uYShmZW1hbGVfdW5lbXBsb3kpIHw+IGFycmFuZ2UoZGVzYyh5ZWFyKSkKYGBgCgojIyMgMy4g57WM5bm05aSJ5YyWCgojIyMjIGEuIOaXpeacrAoKYGBge3J9CmRmX2ZlbWFsZV91bmVtcGxveSB8PiBmaWx0ZXIoY291bnRyeSA9PSAiSmFwYW4iKSB8PiBkcm9wX25hKGZlbWFsZV91bmVtcGxveSkgfD4KICBnZ3Bsb3QoYWVzKHllYXIsIGZlbWFsZV91bmVtcGxveSkpICsgZ2VvbV9saW5lKCkKYGBgCgoqKuawl+OBpeOBhOOBn+OBk+OBqOODu+eWkeWVjyoqCgotICAgMjAwMOW5tOOBlOOCjeOBi+OCieOAgTIwMTDlubTjgZTjgo3jgb7jgafpnZ7luLjjgavpq5jjgYTmsLTmupbjgavjgarjgaPjgabjgYTjgovjgILkvZXjgYzljp/lm6Djgarjga7jgaDjgo3jgYbjgIIKCiMjIyMgYi4g5Y2X6YOo44Ki44OV44Oq44Kr6Zai56iO5ZCM55ufCgpgYGB7cn0KZGZfZmVtYWxlX3VuZW1wbG95IHw+IGZpbHRlcihjb3VudHJ5ICVpbiUgU09VVEhfQUZSSUNBX0ZJVkUpIHw+IGRyb3BfbmEoZmVtYWxlX3VuZW1wbG95KSB8PgogIGdncGxvdChhZXMoeWVhciwgZmVtYWxlX3VuZW1wbG95KSkgKyBnZW9tX2xpbmUoYWVzKGNvbCA9IGNvdW50cnkpKQpgYGAKCioq5Y+C6ICD77ya5bmz5Z2H55qE44Gq5YCk44KS5puy57ea44Gn6KGo44GZ44GT44Go44KC5Y+v6IO944Gn44GZ44CCbG9lc3Mg44KS5L2/44GG44Go5ruR44KJ44GL44Gq5puy57ea44Gn6L+R5Ly844GX44Gm44GP44KM44G+44GZ44CCKioKCmBgYHtyfQpkZl9mZW1hbGVfdW5lbXBsb3kgfD4gZmlsdGVyKGNvdW50cnkgJWluJSBTT1VUSF9BRlJJQ0FfRklWRSkgfD4gZHJvcF9uYShmZW1hbGVfdW5lbXBsb3kpIHw+CiAgZ2dwbG90KGFlcyh5ZWFyLCBmZW1hbGVfdW5lbXBsb3kpKSArIGdlb21fbGluZShhZXMoY29sID0gY291bnRyeSkpICsKICBnZW9tX3Ntb290aChmb3JtdWxhID0gJ3l+eCcsIG1ldGhvZCA9ICJsb2VzcyIsIHNlID0gRkFMU0UpCmBgYAoKKirmsJfjgaXjgYTjgZ/jgZPjgajjg7vnlpHllY8qKgoKLSAgIOW5s+Wdh+OBp+imi+OCi+OBqOOAgTIzJeeoi+W6puOAggoKIyMjIyBjLiDjg6njg4bjg7PjgqLjg6Hjg6rjgqvvvJTjgqvlm70KCmBgYHtyfQpkZl9mZW1hbGVfdW5lbXBsb3kgfD4gZmlsdGVyKGNvdW50cnkgJWluJSBDSE9TRU5fQ09VTlRSSUVTKSB8PiBkcm9wX25hKGZlbWFsZV91bmVtcGxveSkgfD4KICBnZ3Bsb3QoYWVzKHllYXIsIGZlbWFsZV91bmVtcGxveSkpICsgZ2VvbV9saW5lKGFlcyhjb2wgPSBjb3VudHJ5KSkKYGBgCgoqKuWPguiAg++8muW5s+Wdh+eahOOBquWApOOCkuabsue3muOBp+ihqOOBmeOBk+OBqOOCguWPr+iDveOBp+OBmeOAgmxvZXNzIOOCkuS9v+OBhuOBqOa7keOCieOBi+OBquabsue3muOBp+i/keS8vOOBl+OBpuOBj+OCjOOBvuOBmeOAgioqCgpgYGB7cn0KZGZfZmVtYWxlX3VuZW1wbG95IHw+IGZpbHRlcihjb3VudHJ5ICVpbiUgQ0hPU0VOX0NPVU5UUklFUykgfD4gZHJvcF9uYShmZW1hbGVfdW5lbXBsb3kpIHw+CiAgZ2dwbG90KGFlcyh5ZWFyLCBmZW1hbGVfdW5lbXBsb3kpKSArIGdlb21fbGluZShhZXMoY29sID0gY291bnRyeSkpICsKICBnZW9tX3Ntb290aChmb3JtdWxhID0gJ3l+eCcsIG1ldGhvZCA9ICJsb2VzcyIsIHNlID0gRkFMU0UpCmBgYAoKIyMjIOWIhuW4gwoK44OH44O844K/44Gu5pWw44GL44KJ44CB44G+44Ga44Gv44CBMjAyMOW5tOOBq+OBpOOBhOOBpuimi+OBpuOBv+OCi+OAggoKYGBge3J9CmRmX2ZlbWFsZV91bmVtcGxveSB8PiBmaWx0ZXIoeWVhciA9PSAyMDIwKSB8PiBmaWx0ZXIoIShjb3VudHJ5ICVpbiUgUkVHSU9OKSl8PgogIGRyb3BfbmEoZmVtYWxlX3VuZW1wbG95KSB8PgogIGdncGxvdChhZXMoZmVtYWxlX3VuZW1wbG95KSkgKyBnZW9tX2hpc3RvZ3JhbShiaW53aWR0aCA9IDIpCmBgYAoKKirlj4LogIPvvJoqKlNBQ1Ug44Gu77yV44Kr5Zu944Gu5YCk44KS57im57ea44Gn5pu444GN6L6844KA44Gr44Gv5LiL44Gu44KI44GG44Gr44GX44G+44GZ44CCCgpgYGB7cn0KZGZfZmVtYWxlX3VuZW1wbG95IHw+IGZpbHRlcih5ZWFyID09IDIwMjApIHw+IGZpbHRlcihjb3VudHJ5ICVpbiUgU09VVEhfQUZSSUNBX0ZJVkUpIApgYGAKCioq5Y+C6ICD77ya5pel5pys44GoKipTQUNVIOOBru+8leOCq+WbveOBruWApOOCkue4pue3muOBp+abuOOBjei+vOOCgOOBq+OBr+S4i+OBruOCiOOBhuOBq+OBl+OBvuOBmeOAggoKYGBge3J9CkpQIDwtIDIuNTIwClNBRiA8LSBkZl9mZW1hbGVfdW5lbXBsb3kgfD4gZmlsdGVyKHllYXIgPT0gMjAyMCkgfD4gZmlsdGVyKGNvdW50cnkgJWluJSBTT1VUSF9BRlJJQ0FfRklWRSkgfD4gcHVsbChmZW1hbGVfdW5lbXBsb3kpCmRmX2ZlbWFsZV91bmVtcGxveSB8PiBmaWx0ZXIoeWVhciA9PSAyMDIwKSB8PiBmaWx0ZXIoIShjb3VudHJ5ICVpbiUgUkVHSU9OKSl8PgogIGRyb3BfbmEoZmVtYWxlX3VuZW1wbG95KSB8PgogIGdncGxvdCgpICsgZ2VvbV9oaXN0b2dyYW0oYWVzKGZlbWFsZV91bmVtcGxveSksIGJpbndpZHRoID0gMikgKwogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IFNBRiwgY29sID0gInJlZCIpICsgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gSlAsIGNvbCA9ICJibHVlIikgK2xhYnModGl0bGUgPSAiMjAyMOW5tOOBruWls+aAp+OBruaxguiBt+eOhyIsIHN1YnRpdGxlID0gIuaXpeacrO+8mumdkuOAgVNBQ1XvvJrotaQiKQpgYGAKCiMjIyDjg4fjg7zjgr/jgYzljYHliIbjgYLjgovmnIDov5Hjga7lubTjga7lgKTjga4xMOOCq+WbveOBruWApOOBruajkuOCsOODqeODlQoKIyMjIyBhLiDlgKTjgYzlpKfjgY3jgYTmlrnjgYvjgokKCmBgYHtyfQpkZl9mZW1hbGVfdW5lbXBsb3kgfD4gZmlsdGVyKHllYXIgPT0gMjAyMCkgfD4gZHJvcF9uYShmZW1hbGVfdW5lbXBsb3kpIHw+IAogIGZpbHRlcighKGlzbzJjICVpbiUgUkVHSU9OKSl8PgogIGFycmFuZ2UoZGVzYyhmZW1hbGVfdW5lbXBsb3kpKSB8PiBoZWFkKDEwKSB8PiAKICBnZ3Bsb3QoYWVzKGZjdF9yZW9yZGVyKGNvdW50cnksIGZlbWFsZV91bmVtcGxveSksIGZlbWFsZV91bmVtcGxveSkpICsgZ2VvbV9jb2woKSArIAogIGNvb3JkX2ZsaXAoKSArIGxhYnModGl0bGUgPSAiVG9wIDEwIENvdW50cmllcyIsIHggPSAiY291bnRyeSIsIHkgPSAidW5lbXBsb3ltZW50IHJhdGUsIGZlbWFsZSwgMjAyMCIpCmBgYAoKIyMjIyBiLiDlgKTjgYzlsI/jgZXjgYTmlrnjgYvjgokKCmBgYHtyfQpkZl9mZW1hbGVfdW5lbXBsb3kgfD4gZmlsdGVyKHllYXIgPT0gMjAyMCkgfD4gZHJvcF9uYShmZW1hbGVfdW5lbXBsb3kpIHw+IAogIGZpbHRlcighKGlzbzJjICVpbiUgUkVHSU9OKSl8PgogIGFycmFuZ2UoZmVtYWxlX3VuZW1wbG95KSB8PiBoZWFkKDEwKSB8PiAKICBnZ3Bsb3QoYWVzKGZjdF9yZXYoZmN0X3Jlb3JkZXIoY291bnRyeSwgZmVtYWxlX3VuZW1wbG95KSksIGZlbWFsZV91bmVtcGxveSkpICsgZ2VvbV9jb2woKSArIAogIGNvb3JkX2ZsaXAoKSArIGxhYnModGl0bGUgPSAiTG93ZXN0IDEwIENvdW50cmllcyIsIHggPSAiY291bnRyeSIsIHkgPSAidW5lbXBsb3ltZW50IHJhdGUsIGZlbWFsZSwgMjAyMCIpCmBgYAoKIyAxMC4g55S35oCn5aSx5qWt546HCgojIyDjg4fjg7zjgr8KCi0gICBVbmVtcGxveW1lbnQsIG1hbGUgKCUgb2YgbWFsZSBsYWJvciBmb3JjZSkgKG1vZGVsZWQgSUxPIGVzdGltYXRlKe+8mlNMLlVFTS5UT1RMLk1BLlpTIFtbTGlua10oaHR0cHM6Ly9kYXRhLndvcmxkYmFuay5vcmcvaW5kaWNhdG9yL1NMLlVFTS5UT1RMLk1BLlpTKV0KLSAgIFVuZW1wbG95bWVudCByZWZlcnMgdG8gdGhlIHNoYXJlIG9mIHRoZSBsYWJvciBmb3JjZSB0aGF0IGlzIHdpdGhvdXQgd29yayBidXQgYXZhaWxhYmxlIGZvciBhbmQgc2Vla2luZyBlbXBsb3ltZW50LgoKIyMjIOODh+ODvOOCv+aDheWgsQoKLSAgIOODh+ODvOOCv+WQje+8mueUt+aAp+WksealreeOhwoKLSAgIOODh+ODvOOCv+OCs+ODvOODie+8mlNMLlVFTS5UT1RMLk1BLlpTCgotICAg5aSJ5pWw5ZCN77yabWFsZV91bmVtcGxveQoKLSAgIOamguimge+8muWksealreeOh+OBqOOBr+OAgeS7leS6i+OBr+OBquOBj+OBpuOCguiBt+OBq+WwseOBj+OBk+OBqOOBjOOBp+OBjeOAgeaxguiBt+OBl+OBpuOBhOOCi+WKtOWDjeWKm+OBruWJsuWQiOOCkuaMh+OBl+OBvuOBmeOAggoKIyMjIOODh+ODvOOCv+OBruWPluW+lwoKIyMjIyDmupblgpkKCmBgYHtyfQpsaWJyYXJ5KHRpZHl2ZXJzZSkKbGlicmFyeShXREkpCmBgYAoKV0RJIOODkeODg+OCseODvOOCuOOCkuS9v+OBo+OBpuOAgeebtOaOpeODh+ODvOOCv+OCkuODgOOCpuODs+ODreODvOODieOBl+OAgeWkieaVsOWQjeOCkuOAgWBlZF9leHBgIOOBq+aMh+WumuOAggoKYGBge3IgZXZhbCA9IEZBTFNFfQpkZl9tYWxlX3VuZW1wbG95IDwtIFdESShpbmRpY2F0b3IgPSBjKG1hbGVfdW5lbXBsb3kgPSAiU0wuVUVNLlRPVEwuTUEuWlMiKSkKYGBgCgpgYGB7ciBldmFsID0gRkFMU0V9CndyaXRlX2NzdihkZl9tYWxlX3VuZW1wbG95LCAiZGF0YS9tYWxlX3VuZW1wbG95LmNzdiIpCmBgYAoKYGBge3J9CmRmX21hbGVfdW5lbXBsb3kgPC0gcmVhZF9jc3YoImRhdGEvbWFsZV91bmVtcGxveS5jc3YiKQpgYGAKCiMjIyDjg4fjg7zjgr/jga7norroqo0KCmBgYHtyfQpkZl9tYWxlX3VuZW1wbG95CmBgYAoKYGBge3J9CnN0cihkZl9tYWxlX3VuZW1wbG95KQpgYGAKCmBgYHtyfQpSRUdJT04gPC0gYygiMUEiLCAiMVciLCAiNEUiLCAiN0UiLCAiOFMiLCAiQjgiLCAiRVUiLCAiRjEiLCAiT0UiLCAiUzEiLCAKIlMyIiwgIlMzIiwgIlM0IiwgIlQyIiwgIlQzIiwgIlQ0IiwgIlQ1IiwgIlQ2IiwgIlQ3IiwgIlYxIiwgIlYyIiwgCiJWMyIsICJWNCIsICJYQyIsICJYRCIsICJYRSIsICJYRiIsICJYRyIsICJYSCIsICJYSSIsICJYSiIsICJYTCIsIAoiWE0iLCAiWE4iLCAiWE8iLCAiWFAiLCAiWFEiLCAiWFQiLCAiWFUiLCAiWFkiLCAiWjQiLCAiWjciLCAiWkYiLCAKIlpHIiwgIlpIIiwgIlpJIiwgIlpKIiwgIlpRIiwgIlpUIikKYGBgCgpgYGB7cn0KZGZfbWFsZV91bmVtcGxveSB8PiBmaWx0ZXIoaXNvMmMgJWluJSBSRUdJT04pIHw+IGRpc3RpbmN0KGNvdW50cnksIGlzbzJjKQpgYGAKCmBgYHtyfQpkZl9tYWxlX3VuZW1wbG95IHw+IGZpbHRlcighKGlzbzJjICVpbiUgUkVHSU9OKSkgfD4gZGlzdGluY3QoY291bnRyeSwgaXNvMmMpCmBgYAoKIyMjIOWIhuaekOOBmeOCi+WbveOBruODquOCueODiAoKIyMjIyAqKuWNl+mDqOOCouODleODquOCq+mWoueojuWQjOebnyoqIFRoZSBTb3V0aGVybiBBZnJpY2FuIEN1c3RvbXMgVW5pb24gKFNBQ1UpCgpgYGB7cn0KU09VVEhfQUZSSUNBX0ZJVkUgPC0gYygiU291dGggQWZyaWNhIiwgIk5hbWliaWEiLCAiRXN3YXRpbmkiLCAiQm90c3dhbmEiLCAiTGVzb3RobyIpCmBgYAoKIyMjIyDjg6njg4bjg7PjgqLjg6Hjg6rjgqvjgafjgrjjg4vmjIfmlbDjgYzlpKfjgY3jgYTvvJTjgqvlm70KCmBgYHtyfQpDSE9TRU5fQ09VTlRSSUVTIDwtIGMoIlN1cmluYW1lIiwgIkJlbGl6ZSIsICJCcmF6aWwiLCAiQ29sb21iaWEiKQpgYGAKCiMjIOWIhuaekAoKIyMjIDEuIOWQhOW5tOavjuOBruODh+ODvOOCv+OBruaVsOOBruajkuOCsOODqeODlQoKYGBge3J9CmRmX21hbGVfdW5lbXBsb3kgfD4gZHJvcF9uYShtYWxlX3VuZW1wbG95KSB8PiBmaWx0ZXIoIShpc28yYyAlaW4lIFJFR0lPTikpIHw+CiAgZ2dwbG90KGFlcyh5ZWFyKSkgKyBnZW9tX2JhcigpCmBgYAoKIyMg6KaW6Kaa5YyWCgojIyMgMi4g5pel5pys44Gu55S35oCn5aSx5qWt546HCgpgYGB7cn0KZGZfbWFsZV91bmVtcGxveSB8PiBmaWx0ZXIoY291bnRyeSA9PSAiSmFwYW4iKSB8PiAKICBkcm9wX25hKG1hbGVfdW5lbXBsb3kpIHw+IGFycmFuZ2UoZGVzYyh5ZWFyKSkKYGBgCgojIyMgMy4g57WM5bm05aSJ5YyWCgojIyMjIGEuIOaXpeacrAoKYGBge3J9CmRmX21hbGVfdW5lbXBsb3kgfD4gZmlsdGVyKGNvdW50cnkgPT0gIkphcGFuIikgfD4gZHJvcF9uYShtYWxlX3VuZW1wbG95KSB8PgogIGdncGxvdChhZXMoeWVhciwgbWFsZV91bmVtcGxveSkpICsgZ2VvbV9saW5lKCkKYGBgCgoqKuawl+OBpeOBhOOBn+OBk+OBqOODu+eWkeWVjyoqCgotICAgMjAwMuW5tOOBlOOCjeOBqOOAgTIwMTDlubTjgZTjgo3jgavjg5Tjg7zjgq/jgIIKCi0gICDlhajkvZPjgajjgZfjgabjgIEyJeOBi+OCiTUuNSUKCiMjIyMgYi4g5Y2X6YOo44Ki44OV44Oq44Kr6Zai56iO5ZCM55ufCgpgYGB7cn0KZGZfbWFsZV91bmVtcGxveSB8PiBmaWx0ZXIoY291bnRyeSAlaW4lIFNPVVRIX0FGUklDQV9GSVZFKSB8PiBkcm9wX25hKG1hbGVfdW5lbXBsb3kpIHw+CiAgZ2dwbG90KGFlcyh5ZWFyLCBtYWxlX3VuZW1wbG95KSkgKyBnZW9tX2xpbmUoYWVzKGNvbCA9IGNvdW50cnkpKQpgYGAKCioq5Y+C6ICD77ya5bmz5Z2H55qE44Gq5YCk44KS5puy57ea44Gn6KGo44GZ44GT44Go44KC5Y+v6IO944Gn44GZ44CCbG9lc3Mg44KS5L2/44GG44Go5ruR44KJ44GL44Gq5puy57ea44Gn6L+R5Ly844GX44Gm44GP44KM44G+44GZ44CCKioKCmBgYHtyfQpkZl9tYWxlX3VuZW1wbG95IHw+IGZpbHRlcihjb3VudHJ5ICVpbiUgU09VVEhfQUZSSUNBX0ZJVkUpIHw+IGRyb3BfbmEobWFsZV91bmVtcGxveSkgfD4KICBnZ3Bsb3QoYWVzKHllYXIsIG1hbGVfdW5lbXBsb3kpKSArIGdlb21fbGluZShhZXMoY29sID0gY291bnRyeSkpICsKICBnZW9tX3Ntb290aChmb3JtdWxhID0gJ3l+eCcsIG1ldGhvZCA9ICJsb2VzcyIsIHNlID0gRkFMU0UpCmBgYAoKKirmsJfjgaXjgYTjgZ/jgZPjgajjg7vnlpHllY8qKgoKLSAgIOW5s+Wdh+OBp+imi+OCi+OBqOOAgTIwJSDlvLHjgILml6XmnKzjgajjga/jgIHjgYvjgarjgornlbDjgarjgovjgILkuJbnlYznmoTjgavjga/jgIHjganjgYbjgarjga7jgaDjgo3jgYbjgYvjgIIKCiMjIyMgYy4g44Op44OG44Oz44Ki44Oh44Oq44Kr77yU44Kr5Zu9CgpgYGB7cn0KZGZfbWFsZV91bmVtcGxveSB8PiBmaWx0ZXIoY291bnRyeSAlaW4lIENIT1NFTl9DT1VOVFJJRVMpIHw+IGRyb3BfbmEobWFsZV91bmVtcGxveSkgfD4KICBnZ3Bsb3QoYWVzKHllYXIsIG1hbGVfdW5lbXBsb3kpKSArIGdlb21fbGluZShhZXMoY29sID0gY291bnRyeSkpCmBgYAoKKirlj4LogIPvvJrlubPlnYfnmoTjgarlgKTjgpLmm7Lnt5rjgafooajjgZnjgZPjgajjgoLlj6/og73jgafjgZnjgIJsb2VzcyDjgpLkvb/jgYbjgajmu5HjgonjgYvjgarmm7Lnt5rjgafov5HkvLzjgZfjgabjgY/jgozjgb7jgZnjgIIqKgoKYGBge3J9CmRmX21hbGVfdW5lbXBsb3kgfD4gZmlsdGVyKGNvdW50cnkgJWluJSBDSE9TRU5fQ09VTlRSSUVTKSB8PiBkcm9wX25hKG1hbGVfdW5lbXBsb3kpIHw+CiAgZ2dwbG90KGFlcyh5ZWFyLCBtYWxlX3VuZW1wbG95KSkgKyBnZW9tX2xpbmUoYWVzKGNvbCA9IGNvdW50cnkpKSArCiAgZ2VvbV9zbW9vdGgoZm9ybXVsYSA9ICd5fngnLCBtZXRob2QgPSAibG9lc3MiLCBzZSA9IEZBTFNFKQpgYGAKCiMjIyDliIbluIMKCuODh+ODvOOCv+OBruaVsOOBi+OCieOAgeOBvuOBmuOBr+OAgTIwMjDlubTjgavjgaTjgYTjgabopovjgabjgb/jgovjgIIKCmBgYHtyfQpkZl9tYWxlX3VuZW1wbG95IHw+IGZpbHRlcih5ZWFyID09IDIwMjApIHw+IGZpbHRlcighKGNvdW50cnkgJWluJSBSRUdJT04pKXw+CiAgZHJvcF9uYShtYWxlX3VuZW1wbG95KSB8PgogIGdncGxvdChhZXMobWFsZV91bmVtcGxveSkpICsgZ2VvbV9oaXN0b2dyYW0oYmlud2lkdGggPSAyKQpgYGAKCioq5Y+C6ICD77yaKipTQUNVIOOBru+8leOCq+WbveOBruWApOOCkue4pue3muOBp+abuOOBjei+vOOCgOOBq+OBr+S4i+OBruOCiOOBhuOBq+OBl+OBvuOBmeOAggoKYGBge3J9CmRmX21hbGVfdW5lbXBsb3kgfD4gZmlsdGVyKHllYXIgPT0gMjAyMCkgfD4gZmlsdGVyKGNvdW50cnkgJWluJSBTT1VUSF9BRlJJQ0FfRklWRSkgCmBgYAoKKirlj4LogIPvvJrml6XmnKzjgagqKlNBQ1Ug44Gu77yV44Kr5Zu944Gu5YCk44KS57im57ea44Gn5pu444GN6L6844KA44Gr44Gv5LiL44Gu44KI44GG44Gr44GX44G+44GZ44CCCgpgYGB7cn0KSlAgPC0gMy4wMjQKU0FGIDwtIGRmX21hbGVfdW5lbXBsb3kgfD4gZmlsdGVyKHllYXIgPT0gMjAyMCkgfD4gZmlsdGVyKGNvdW50cnkgJWluJSBTT1VUSF9BRlJJQ0FfRklWRSkgfD4gcHVsbChtYWxlX3VuZW1wbG95KQpkZl9tYWxlX3VuZW1wbG95IHw+IGZpbHRlcih5ZWFyID09IDIwMjApIHw+IAogIGZpbHRlcighKGNvdW50cnkgJWluJSBSRUdJT04pKSB8PgogIGRyb3BfbmEobWFsZV91bmVtcGxveSkgfD4KICBnZ3Bsb3QoKSArIGdlb21faGlzdG9ncmFtKGFlcyhtYWxlX3VuZW1wbG95KSwgYmlud2lkdGggPSAxKSArCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gU0FGLCBjb2wgPSAicmVkIikgKyBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSBKUCwgY29sID0gImJsdWUiKSArbGFicyh0aXRsZSA9ICIyMDIw5bm044Gu55S35oCn44Gu5aSx5qWt546HIiwgc3VidGl0bGUgPSAi5pel5pys77ya6Z2S44CBU0FDVe+8mui1pCIpCmBgYAoKIyMjIOODh+ODvOOCv+OBjOWNgeWIhuOBguOCi+acgOi/keOBruW5tOOBruWApOOBrjEw44Kr5Zu944Gu5YCk44Gu5qOS44Kw44Op44OVCgojIyMjIGEuIOWApOOBjOWkp+OBjeOBhOaWueOBi+OCiQoKYGBge3J9CmRmX21hbGVfdW5lbXBsb3kgfD4gZmlsdGVyKHllYXIgPT0gMjAyMCkgfD4gZHJvcF9uYShtYWxlX3VuZW1wbG95KSB8PiAKICBmaWx0ZXIoIShpc28yYyAlaW4lIFJFR0lPTikpfD4KICBhcnJhbmdlKGRlc2MobWFsZV91bmVtcGxveSkpIHw+IGhlYWQoMTApIHw+IAogIGdncGxvdChhZXMoZmN0X3Jlb3JkZXIoY291bnRyeSwgbWFsZV91bmVtcGxveSksIG1hbGVfdW5lbXBsb3kpKSArIGdlb21fY29sKCkgKyAKICBjb29yZF9mbGlwKCkgKyBsYWJzKHRpdGxlID0gIlRvcCAxMCBDb3VudHJpZXMiLCB4ID0gImNvdW50cnkiLCB5ID0gIiIpCmBgYAoKIyMjIyBiLiDlgKTjgYzlsI/jgZXjgYTmlrnjgYvjgokKCmBgYHtyfQpkZl9tYWxlX3VuZW1wbG95IHw+IGZpbHRlcih5ZWFyID09IDIwMjApIHw+IGRyb3BfbmEobWFsZV91bmVtcGxveSkgfD4gCiAgZmlsdGVyKCEoaXNvMmMgJWluJSBSRUdJT04pKXw+CiAgYXJyYW5nZShtYWxlX3VuZW1wbG95KSB8PiBoZWFkKDEwKSB8PiAKICBnZ3Bsb3QoYWVzKGZjdF9yZXYoZmN0X3Jlb3JkZXIoY291bnRyeSwgbWFsZV91bmVtcGxveSkpLCBtYWxlX3VuZW1wbG95KSkgKyBnZW9tX2NvbCgpICsgCiAgY29vcmRfZmxpcCgpICsgbGFicyh0aXRsZSA9ICJMb3dlc3QgMTAgQ291bnRyaWVzIiwgeCA9ICJjb3VudHJ5IiwgeSA9ICJ1bmVtcGxveW1lbnQgcmF0aW8sIG1hbGUiKQpgYGAKCiMgMTEuIOaUv+W6nOmWi+eZuuaPtOWKqeWPl+e1pumhjQoKIyMg44OH44O844K/CgotICAgTmV0IG9mZmljaWFsIGRldmVsb3BtZW50IGFzc2lzdGFuY2UgYW5kIG9mZmljaWFsIGFpZCByZWNlaXZlZCAoY3VycmVudCBVU1wkKSBEVC5PREEuQUxMRC5DRCBbW0xpbmtdKGh0dHBzOi8vZGF0YS53b3JsZGJhbmsub3JnL2luZGljYXRvci9EVC5PREEuQUxMRC5DRCldCi0gICBOZXQgb2ZmaWNpYWwgZGV2ZWxvcG1lbnQgYXNzaXN0YW5jZSAoT0RBKSBjb25zaXN0cyBvZiBkaXNidXJzZW1lbnRzIG9mIGxvYW5zIG1hZGUgb24gY29uY2Vzc2lvbmFsIHRlcm1zIChuZXQgb2YgcmVwYXltZW50cyBvZiBwcmluY2lwYWwpIGFuZCBncmFudHMgYnkgb2ZmaWNpYWwgYWdlbmNpZXMgb2YgdGhlIG1lbWJlcnMgb2YgdGhlIERldmVsb3BtZW50IEFzc2lzdGFuY2UgQ29tbWl0dGVlIChEQUMpLCBieSBtdWx0aWxhdGVyYWwgaW5zdGl0dXRpb25zLCBhbmQgYnkgbm9uLURBQyBjb3VudHJpZXMgdG8gcHJvbW90ZSBlY29ub21pYyBkZXZlbG9wbWVudCBhbmQgd2VsZmFyZSBpbiBjb3VudHJpZXMgYW5kIHRlcnJpdG9yaWVzIGluIHRoZSBEQUMgbGlzdCBvZiBPREEgcmVjaXBpZW50cy4gSXQgaW5jbHVkZXMgbG9hbnMgd2l0aCBhIGdyYW50IGVsZW1lbnQgb2YgYXQgbGVhc3QgMjUgcGVyY2VudCAoY2FsY3VsYXRlZCBhdCBhIHJhdGUgb2YgZGlzY291bnQgb2YgMTAgcGVyY2VudCkuIE5ldCBvZmZpY2lhbCBhaWQgcmVmZXJzIHRvIGFpZCBmbG93cyAobmV0IG9mIHJlcGF5bWVudHMpIGZyb20gb2ZmaWNpYWwgZG9ub3JzIHRvIGNvdW50cmllcyBhbmQgdGVycml0b3JpZXMgaW4gcGFydCBJSSBvZiB0aGUgREFDIGxpc3Qgb2YgcmVjaXBpZW50czogbW9yZSBhZHZhbmNlZCBjb3VudHJpZXMgb2YgQ2VudHJhbCBhbmQgRWFzdGVybiBFdXJvcGUsIHRoZSBjb3VudHJpZXMgb2YgdGhlIGZvcm1lciBTb3ZpZXQgVW5pb24sIGFuZCBjZXJ0YWluIGFkdmFuY2VkIGRldmVsb3BpbmcgY291bnRyaWVzIGFuZCB0ZXJyaXRvcmllcy4gT2ZmaWNpYWwgYWlkIGlzIHByb3ZpZGVkIHVuZGVyIHRlcm1zIGFuZCBjb25kaXRpb25zIHNpbWlsYXIgdG8gdGhvc2UgZm9yIE9EQS4gUGFydCBJSSBvZiB0aGUgREFDIExpc3Qgd2FzIGFib2xpc2hlZCBpbiAyMDA1LiBUaGUgY29sbGVjdGlvbiBvZiBkYXRhIG9uIG9mZmljaWFsIGFpZCBhbmQgb3RoZXIgcmVzb3VyY2UgZmxvd3MgdG8gUGFydCBJSSBjb3VudHJpZXMgZW5kZWQgd2l0aCAyMDA0IGRhdGEuIERhdGEgYXJlIGluIGN1cnJlbnQgVS5TLiBkb2xsYXJzLgoKIyMjIOODh+ODvOOCv+aDheWgsQoKLSAgIOODh+ODvOOCv+WQje+8muaUv+W6nOmWi+eZuuaPtOWKqeWPl+e1pumhjQoKLSAgIOODh+ODvOOCv+OCs+ODvOODie+8mkRULk9EQS5BTExELkNECgotICAg5aSJ5pWw5ZCN77yaYG9kYWAKCi0gICDmpoLopoHvvJrmlL/lupzplovnmbrmj7TliqnvvIhPREHvvInjga7ntJTpoY3jga/jgIHplovnmbrmj7Tliqnlp5Tlk6HkvJrvvIhEQUPvvInjg6Hjg7Pjg5Djg7zjga7lhaznmoTmqZ/plqLjgIHlpJrlm73plpPmqZ/plqLjgIFEQUPpnZ7liqDnm5/lm73jgavjgojjgovjgIHorbLoqLHnmoTmnaHku7bvvIjlhYPmnKzov5TmuIjjgpLpmaTjgY/vvInjgafooYzjgo/jgozjgZ/ono3os4fjga7lrp/ooYzjgajliqnmiJDph5Hjgafmp4vmiJDjgZXjgozjgb7jgZnjgIIgREFDIOOBriBPREEg5Y+X6aCY6ICF44Oq44K544OI44Gr5ZCr44G+44KM44KL5Zu944GK44KI44Gz5Zyw5Z+f44Gu57WM5riI55m65bGV44Go56aP56WJ44KS5L+D6YCy44GZ44KL44CC44GT44KM44Gr44Gv44CB5bCR44Gq44GP44Go44KCIDI1IOODkeODvOOCu+ODs+ODiO+8iOWJsuW8leeOhyAxMCDjg5Hjg7zjgrvjg7Pjg4jjgafoqIjnrpfvvInjga7oo5zliqnph5HopoHntKDjgpLmjIHjgaTjg63jg7zjg7PjgYzlkKvjgb7jgozjgb7jgZnjgILntJTlhaznmoTmj7Tliqnjgajjga/jgIHlhaznmoTjg4njg4rjg7zjgYvjgolEQUPjga7lj5flj5bkurrjg6rjgrnjg4jjga7jg5Hjg7zjg4hJSeOBq+OBguOCi+WbveOBiuOCiOOBs+WcsOWfn+OBuOOBruaPtOWKqeOBrua1geOCjO+8iOi/lOa4iOmhjeOCkuW3ruOBl+W8leOBhOOBn+mhje+8ieOCkuaMh+OBl+OBvuOBme+8muS4reWkruOBiuOCiOOBs+adseODqOODvOODreODg+ODkeOBruOCiOOCiuWFiOmAsuWbveOAgeaXp+OCvemAo+iruOWbveOAgeOBiuOCiOOBs+S4gOmDqOOBruWFiOmAsumAlOS4iuWbveWbveOBqOWcsOWfn+OAguWFrOeahOaPtOWKqeOBr+OAgU9EQSDjgajlkIzmp5jjga7mnaHku7bjgafmj5DkvpvjgZXjgozjgb7jgZnjgIJEQUMg44Oq44K544OI44Gu44OR44O844OIIElJIOOBryAyMDA1IOW5tOOBq+W7g+atouOBleOCjOOBvuOBl+OBn+OAguODkeODvOODiCBJSSDoq7jlm73jgbjjga7lhaznmoTmj7TliqnjgYrjgojjgbPjgZ3jga7ku5bjga7os4fmupDjga7mtYHjgozjgavplqLjgZnjgovjg4fjg7zjgr/jga7lj47pm4bjga8gMjAwNCDlubTjga7jg4fjg7zjgr/jgafntYLkuobjgZfjgb7jgZfjgZ/jgILjg4fjg7zjgr/jga/nj77lnKjjga7nsbPjg4njg6vjgafooajnpLrjgZXjgozjgb7jgZnjgIIKCiMjIyDjg4fjg7zjgr/jga7lj5blvpcKCiMjIyMg5rqW5YKZCgpgYGB7cn0KbGlicmFyeSh0aWR5dmVyc2UpCmxpYnJhcnkoV0RJKQpgYGAKCldESSDjg5Hjg4PjgrHjg7zjgrjjgpLkvb/jgaPjgabjgIHnm7TmjqXjg4fjg7zjgr/jgpLjg4Djgqbjg7Pjg63jg7zjg4njgZfjgIHlpInmlbDlkI3jgpLjgIFgZWRfZXhwYCDjgavmjIflrprjgIIKCmBgYHtyIGV2YWwgPSBGQUxTRX0KZGZfb2RhIDwtIFdESShpbmRpY2F0b3IgPSBjKG9kYSA9ICJEVC5PREEuQUxMRC5DRCIpKQpgYGAKCmBgYHtyIGV2YWwgPSBGQUxTRX0Kd3JpdGVfY3N2KGRmX29kYSwgImRhdGEvb2RhLmNzdiIpCmBgYAoKYGBge3J9CmRmX29kYSA8LSByZWFkX2NzdigiZGF0YS9vZGEuY3N2IikKYGBgCgojIyMg44OH44O844K/44Gu56K66KqNCgpgYGB7cn0KZGZfb2RhCmBgYAoKYGBge3J9CnN0cihkZl9vZGEpCmBgYAoKYGBge3J9ClJFR0lPTiA8LSBjKCIxQSIsICIxVyIsICI0RSIsICI3RSIsICI4UyIsICJCOCIsICJFVSIsICJGMSIsICJPRSIsICJTMSIsIAoiUzIiLCAiUzMiLCAiUzQiLCAiVDIiLCAiVDMiLCAiVDQiLCAiVDUiLCAiVDYiLCAiVDciLCAiVjEiLCAiVjIiLCAKIlYzIiwgIlY0IiwgIlhDIiwgIlhEIiwgIlhFIiwgIlhGIiwgIlhHIiwgIlhIIiwgIlhJIiwgIlhKIiwgIlhMIiwgCiJYTSIsICJYTiIsICJYTyIsICJYUCIsICJYUSIsICJYVCIsICJYVSIsICJYWSIsICJaNCIsICJaNyIsICJaRiIsIAoiWkciLCAiWkgiLCAiWkkiLCAiWkoiLCAiWlEiLCAiWlQiKQpgYGAKCmBgYHtyfQpkZl9vZGEgfD4gZmlsdGVyKGlzbzJjICVpbiUgUkVHSU9OKSB8PiBkaXN0aW5jdChjb3VudHJ5LCBpc28yYykKYGBgCgpgYGB7cn0KZGZfb2RhIHw+IGZpbHRlcighKGlzbzJjICVpbiUgUkVHSU9OKSkgfD4gZGlzdGluY3QoY291bnRyeSwgaXNvMmMpCmBgYAoKIyMjIOWIhuaekOOBmeOCi+WbveOBruODquOCueODiAoKIyMjIyAqKuWNl+mDqOOCouODleODquOCq+mWoueojuWQjOebnyoqIFRoZSBTb3V0aGVybiBBZnJpY2FuIEN1c3RvbXMgVW5pb24gKFNBQ1UpCgpgYGB7cn0KU09VVEhfQUZSSUNBX0ZJVkUgPC0gYygiU291dGggQWZyaWNhIiwgIk5hbWliaWEiLCAiRXN3YXRpbmkiLCAiQm90c3dhbmEiLCAiTGVzb3RobyIpCmBgYAoKIyMjIyDjg6njg4bjg7PjgqLjg6Hjg6rjgqvjgafjgrjjg4vmjIfmlbDjgYzlpKfjgY3jgYTvvJTjgqvlm70KCmBgYHtyfQpDSE9TRU5fQ09VTlRSSUVTIDwtIGMoIlN1cmluYW1lIiwgIkJlbGl6ZSIsICJCcmF6aWwiLCAiQ29sb21iaWEiKQpgYGAKCiMjIOWIhuaekAoKIyMjIDEuIOWQhOW5tOavjuOBruODh+ODvOOCv+OBruaVsOOBruajkuOCsOODqeODlQoKYGBge3J9CmRmX29kYSB8PiBkcm9wX25hKG9kYSkgfD4gZmlsdGVyKCEoaXNvMmMgJWluJSBSRUdJT04pKSB8PgogIGdncGxvdChhZXMoeWVhcikpICsgZ2VvbV9iYXIoKQpgYGAKCiMjIOimluimmuWMlgoKIyMjIDIuIOaXpeacrOOBruaUv+W6nOmWi+eZuuaPtOWKqeWPl+e1pumhjQoKYGBge3J9CmRmX29kYSB8PiBmaWx0ZXIoY291bnRyeSA9PSAiSmFwYW4iKSB8PiAKICBkcm9wX25hKG9kYSkgfD4gYXJyYW5nZShkZXNjKHllYXIpKQpgYGAKCiMjIyAzLiDntYzlubTlpInljJYKCiMjIyMgYS4g5pel5pysCgpgYGB7cn0KZGZfb2RhIHw+IGZpbHRlcihjb3VudHJ5ID09ICJKYXBhbiIpIHw+IGRyb3BfbmEob2RhKSB8PgogIGdncGxvdChhZXMoeWVhciwgb2RhKSkgKyBnZW9tX2xpbmUoKQpgYGAKCioq5rCX44Gl44GE44Gf44GT44Go44O755aR5ZWPKioKCi0gICDpgY7ljrvjgavjga/jgIHlj5fntabjgZfjgabjgYTjgZ/jgYvjgajmgJ3jgaPjgZ/jgYzjgIHjg4fjg7zjgr/jga7jgYLjgovnr4Tlm7Ljgafjga/jgb7jgaPjgZ/jgY/jgarjgYvjgaPjgZ/jgIIKCiMjIyMgYi4g5Y2X6YOo44Ki44OV44Oq44Kr6Zai56iO5ZCM55ufCgpgYGB7cn0KZGZfb2RhIHw+IGZpbHRlcihjb3VudHJ5ICVpbiUgU09VVEhfQUZSSUNBX0ZJVkUpIHw+IGRyb3BfbmEob2RhKSB8PgogIGdncGxvdChhZXMoeWVhciwgb2RhKSkgKyBnZW9tX2xpbmUoYWVzKGNvbCA9IGNvdW50cnkpKQpgYGAKCioq5Y+C6ICD77ya5bmz5Z2H55qE44Gq5YCk44KS5puy57ea44Gn6KGo44GZ44GT44Go44KC5Y+v6IO944Gn44GZ44CCbG9lc3Mg44KS5L2/44GG44Go5ruR44KJ44GL44Gq5puy57ea44Gn6L+R5Ly844GX44Gm44GP44KM44G+44GZ44CCKioKCmBgYHtyfQpkZl9vZGEgfD4gZmlsdGVyKGNvdW50cnkgJWluJSBTT1VUSF9BRlJJQ0FfRklWRSkgfD4gZHJvcF9uYShvZGEpIHw+CiAgZ2dwbG90KGFlcyh5ZWFyLCBvZGEpKSArIGdlb21fbGluZShhZXMoY29sID0gY291bnRyeSkpICsKICBnZW9tX3Ntb290aChmb3JtdWxhID0gJ3l+eCcsIG1ldGhvZCA9ICJsb2VzcyIsIHNlID0gRkFMU0UpCmBgYAoKKirmsJfjgaXjgYTjgZ/jgZPjgajjg7vnlpHllY8qKgoKLSAgIOWNl+OCouODleODquOCq+OBr+OAgTE5OTLlubTjgZTjgo3jgb7jgafmlL/lupzplovnmbrmj7Tliqnjga7jg4fjg7zjgr/jgYzjgarjgYTjgYzjgIHlj5fjgZHjgabjgYTjgarjgYvjgaPjgZ/jga7jgYvjgoLjgZfjgozjgarjgYTjgILjgYTjgb7jga/jgIHmnIDlpKfjgafjgIExMOWEhOODieODq+eoi+W6puOAggoKIyMjIyBjLiDjg6njg4bjg7PjgqLjg6Hjg6rjgqvvvJTjgqvlm70KCmBgYHtyfQpkZl9vZGEgfD4gZmlsdGVyKGNvdW50cnkgJWluJSBDSE9TRU5fQ09VTlRSSUVTKSB8PiBkcm9wX25hKG9kYSkgfD4KICBnZ3Bsb3QoYWVzKHllYXIsIG9kYSkpICsgZ2VvbV9saW5lKGFlcyhjb2wgPSBjb3VudHJ5KSkKYGBgCgoqKuWPguiAg++8muW5s+Wdh+eahOOBquWApOOCkuabsue3muOBp+ihqOOBmeOBk+OBqOOCguWPr+iDveOBp+OBmeOAgmxvZXNzIOOCkuS9v+OBhuOBqOa7keOCieOBi+OBquabsue3muOBp+i/keS8vOOBl+OBpuOBj+OCjOOBvuOBmeOAgioqCgpgYGB7cn0KZGZfb2RhIHw+IGZpbHRlcihjb3VudHJ5ICVpbiUgQ0hPU0VOX0NPVU5UUklFUykgfD4gZHJvcF9uYShvZGEpIHw+CiAgZ2dwbG90KGFlcyh5ZWFyLCBvZGEpKSArIGdlb21fbGluZShhZXMoY29sID0gY291bnRyeSkpICsKICBnZW9tX3Ntb290aChmb3JtdWxhID0gJ3l+eCcsIG1ldGhvZCA9ICJsb2VzcyIsIHNlID0gRkFMU0UpCmBgYAoKIyMjIOWIhuW4gwoK44OH44O844K/44Gu5pWw44GL44KJ44CB44G+44Ga44Gv44CBMjAyMOW5tOOBq+OBpOOBhOOBpuimi+OBpuOBv+OCi+OAggoK5pel5pys44KC5ZCr44KB44Gm44CB5aSa44GP44Gu5Zu944Gu5YCk44GM44CBMOOAgmxvZzEwIOOCkuOBqOOCieOBquOBhOOBqOOAgTAg44Gr6L+R44GE5pa544Gr5YCk44GM5Zu644G+44KL44CCbG9nMTAg44K544Kx44O844Or44KS5L2/44GG5pmC44Gv44CB5YCk44GM5q2j44Gu44KC44Gu44Gr5Yi26ZmQ44GX44Gq44GE44Go44CB5YCk44GM5rGC44KB44KJ44KM44Gq44GE44CCCgpgYGB7cn0KZGZfb2RhIHw+IGZpbHRlcih5ZWFyID09IDIwMjApIHw+IGZpbHRlcighKGNvdW50cnkgJWluJSBSRUdJT04pKXw+CiAgZHJvcF9uYShvZGEpIHw+IGZpbHRlcihvZGEgPiAwKSB8PgogIGdncGxvdChhZXMob2RhKSkgKyBnZW9tX2hpc3RvZ3JhbShiaW5zID0gMjApICsgc2NhbGVfeF9sb2cxMCgpCmBgYAoKKirlj4LogIPvvJoqKlNBQ1Ug44Gu77yV44Kr5Zu944Gu5YCk44KS57im57ea44Gn5pu444GN6L6844KA44Gr44Gv5LiL44Gu44KI44GG44Gr44GX44G+44GZ44CCCgpgYGB7cn0KZGZfb2RhIHw+IGZpbHRlcih5ZWFyID09IDIwMjApIHw+IGZpbHRlcihjb3VudHJ5ICVpbiUgU09VVEhfQUZSSUNBX0ZJVkUpIApgYGAKCioq5Y+C6ICD77ya5pel5pys44GoKipTQUNVIOOBru+8leOCq+WbveOBruWApOOCkue4pue3muOBp+abuOOBjei+vOOCgOOBq+OBr+S4i+OBruOCiOOBhuOBq+OBl+OBvuOBmeOAggoKYGBge3J9CkpQIDwtIDAKU0FGIDwtIGRmX29kYSB8PiBmaWx0ZXIoeWVhciA9PSAyMDIwKSB8PiBmaWx0ZXIoY291bnRyeSAlaW4lIFNPVVRIX0FGUklDQV9GSVZFKSB8PiBwdWxsKG9kYSkKZGZfb2RhIHw+IGZpbHRlcih5ZWFyID09IDIwMjApIHw+IGZpbHRlcighKGNvdW50cnkgJWluJSBSRUdJT04pKXw+CiAgZHJvcF9uYShvZGEpIHw+IGZpbHRlcihvZGEgPiAwKSB8PgogIGdncGxvdCgpICsgZ2VvbV9oaXN0b2dyYW0oYWVzKG9kYSksIGJpbnMgPSAyMCkgKyBzY2FsZV94X2xvZzEwKCkgKwogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IFNBRiwgY29sID0gInJlZCIpICsgI2dlb21fdmxpbmUoeGludGVyY2VwdCA9IEpQLCBjb2wgPSAiYmx1ZSIpCiAgbGFicyh0aXRsZSA9ICLmlL/lupzplovnmbrmj7TliqkiLCBzdWJ0aXRsZSA9ICJTQUNV77ya6LWkIikKYGBgCgojIyMg44OH44O844K/44GM5Y2B5YiG44GC44KL5pyA6L+R44Gu5bm044Gu5YCk44GuMTDjgqvlm73jga7lgKTjga7mo5LjgrDjg6njg5UKCiMjIyMgYS4g5YCk44GM5aSn44GN44GE5pa544GL44KJCgpgYGB7cn0KZGZfb2RhIHw+IGZpbHRlcih5ZWFyID09IDIwMjApIHw+IGRyb3BfbmEob2RhKSB8PiAKICBmaWx0ZXIoIShpc28yYyAlaW4lIFJFR0lPTikpfD4KICBhcnJhbmdlKGRlc2Mob2RhKSkgfD4gaGVhZCgxMCkgfD4gCiAgZ2dwbG90KGFlcyhmY3RfcmVvcmRlcihjb3VudHJ5LCBvZGEpLCBvZGEpKSArIGdlb21fY29sKCkgKyAKICBjb29yZF9mbGlwKCkgKyBsYWJzKHRpdGxlID0gIlRvcCAxMCBDb3VudHJpZXMiLCB4ID0gImNvdW50cnkiLCB5ID0gIk5ldCBvZmZpY2lhbCBkZXZlbG9wbWVudCBhc3Npc3RhbmNlIGFuZCBvZmZpY2lhbCBhaWQgcmVjZWl2ZWQiKQpgYGAKCiMjIyMgYi4g5YCk44GM5bCP44GV44GE5pa544GL44KJCgpgYGB7cn0KZGZfb2RhIHw+IGZpbHRlcih5ZWFyID09IDIwMjApIHw+IGRyb3BfbmEob2RhKSB8PiAKICBmaWx0ZXIoIShpc28yYyAlaW4lIFJFR0lPTikpfD4KICBhcnJhbmdlKG9kYSkgfD4gaGVhZCgxMCkgfD4gCiAgZ2dwbG90KGFlcyhmY3RfcmV2KGZjdF9yZW9yZGVyKGNvdW50cnksIG9kYSkpLCBvZGEpKSArIGdlb21fY29sKCkgKyAKICBjb29yZF9mbGlwKCkgKyBsYWJzKHRpdGxlID0gIkxvd2VzdCAxMCBDb3VudHJpZXMiLCB4ID0gImNvdW50cnkiLCB5ID0gIk5ldCBvZmZpY2lhbCBkZXZlbG9wbWVudCBhc3Npc3RhbmNlIGFuZCBvZmZpY2lhbCBhaWQgcmVjZWl2ZWQiKQpgYGAK