準備

  1. (自分のPCまたは教室のPCに)ログイン

  2. ウェッブ・ブラウザー(Google Chrome など)を起動

  3. (別のタブまたは ウィンドウで)PositCloud にログイン[Posit.cloud]

    • アカウントのない人はサイン・アップ [共有プロジェクト] から、Save a Permanent Copy)

    • RStudio を自分のコンピュータにインストールしている人は起動

  4. リンクの右上の Raw ボタンの右の Copy a raw file からコピーして演習用 R Markdown ファイルを作成(あとで再度解説します)[Rmd]

ファイル

ファイルを作成するときの注意

  1. Posit Cloud のときは、まず、Login し、intro2rj のプロジェクトに入り、 ファイルから、ges001 のフォルダーを選択して、移動します。この中に、data フォルダが作成されていることを確認し、このges001 に、新しく作成したファイルを保存します。新しく作成したファイルの入っているフォルダーの中に、data フォルダがあることが大切です。そこに、データを書き込みます。

  2. RStudio の場合には、まずは、あたらしい Project を作成します。File > New Project から作成します。すでに、作成してある場合は、それを、Open Project や、Recent Project から開きます。その中に、新しいファイルを作成します。作成したフォルダーに、data フォルダがあることを確認してください。新しく作成したファイルの入っているフォルダーの中に、data フォルダがあることが大切です。そこに、データを書き込みます。


ファイルを提出するときの注意

RStudio の場合には、自分の PC に作成したファイルがありますから、問題ないと思いますが、Posit Cloud で作成した場合には、提出したいファイルの左にあるチェックボックスをチェックします。Files の 右端にある、ギアマークの Export を押すと、ダウンロードできます。それを提出してください。末尾が、nb.html となっているものを提出していただくのがよいですが、よくわからないときは、nb.html ファイルと、Rmd ファイルと両方提出してください、

課題1について

第7週

02/01(TH)  気候変動に対する対策

       気候変動と貧困の連鎖

第7週は、南部アフリカや南アジアなど気候変動から大きな影響を受けている国々の現状を取り上げます。

02/06 (TU) Rでデータサイエンス7:都市部と農村部の生活状況の格差  [Main]・[授業]

Urban and rural development

Access to electricity, urban (% of urban population):EG.ELC.ACCS.UR.ZS [Link]

Access to electricity, rural (% of rural population):EG.ELC.ACCS.RU.ZS [Link]

People using at least basic drinking water services, urban (% of urban population):SH.H2O.BASW.UR.ZS [Link]

People using at least basic sanitation services, rural (% of rural population):SH.STA.BASS.RU.ZS [Link]

People using at least basic sanitation services, urban (% of urban population):SH.STA.BASS.UR.ZS [Link]

People using at least basic drinking water services, rural (% of rural population):SH.H2O.BASW.RU.ZS [Link]

探索的データ分析(EDA)ワークフロー


探索的データ分析(Exploratory Data Analysis)ワークフロー(続き)

  • 分析・視覚化
    • 各年毎のデータの数の棒グラフ
    • 経年変化
      • 日本(身近な馴染みのあるデータを確認)
      • 南部アフリカ関税同盟、選択した国・地域
    • 分布
      • ヒストグラム(年を指定した度数分布)
      • 値が大きい10カ国とその値の棒グラフ
      • 値が小さい10カ国とその値の棒グラフ
    • 相関
      • 散布図(scatter plot)x-軸と、y-軸に、それぞれの変数をとる
      • 相関係数
  • 各項目に、気づいたこと、疑問などを記録

演習 2月6日(火)

変形(transformation)

  • 行の選択filter(country %in% c("Japan", "China"), distinct(country), drop_na(value)

  • 列の選択select(country, iso2c, year, var1, var2, region)

  • 横並びの変数を縦並びに:name 列と、value 列を作り、var_1, var_2, … , var_n を name 列に、対応する値を value 列に

    • pivot_longer(cols = c(var_1, var_2, ... , var_n))

    • pivot_longer(cols = c(female_unemploy, male_unemploy))

    • pivot_longer(cols = c(electricity_urban, electricity_rural))

    • pivot_longer(cols = electricity_urban:sanitation_rural))

  • 活用:pivot_longer(cols = c(var1, var2))|> ggplot(aes(year, value, col = name) + geom_line()

箱ひげ図(boxplot)

カテゴリ変数(country, region, income など)毎の分布を描く

  • ggplot(aes(categorical_var, numerical_var)) + geom_boxplot()

  • ggplot(aes(region, electricity_urban)) + geom_boxplot()

  • ggplot(aes(income, electricity_rural)) + geom_boxplot()

  • pivot_longer(cols = c(var1, var2)) |> ggplot(aes(name, value)) + geom_boxplot()

  • year は、整数なので数値変数(numerical variable)。これを カテゴリー変数として扱うためには、factor(year) を使う。x 軸のラベルなどはあとから修正が必要。

    • filter(year %in% c(1960,1990,2020))|> ggplot(aes(factor(year), var)) + geom_boxplot()

内容

データ情報

  • Access to electricity, urban (% of urban population):EG.ELC.ACCS.UR.ZS [Link]

  • Access to electricity, rural (% of rural population):EG.ELC.ACCS.RU.ZS [Link]

  • People using at least basic drinking water services, urban (% of urban population):SH.H2O.BASW.UR.ZS [Link]

  • People using at least basic drinking water services, rural (% of rural population):SH.H2O.BASW.RU.ZS [Link]

  • People using at least basic sanitation services, urban (% of urban population):SH.STA.BASS.UR.ZS [Link]

  • People using at least basic sanitation services, rural (% of rural population):SH.STA.BASS.RU.ZS [Link]


データの取得

準備

library(tidyverse)
library(WDI)

df_service <- WDI(
  indicator = c(electricity_urban = "EG.ELC.ACCS.UR.ZS",
                electricity_rural = "EG.ELC.ACCS.RU.ZS",
                water_urban = "SH.H2O.BASW.UR.ZS",
                water_rural = "SH.H2O.BASW.RU.ZS",
                sanitation_urban = "SH.STA.BASS.UR.ZS",
                sanitation_rural = "SH.STA.BASS.RU.ZS"
                ), extra = TRUE)
write_csv(df_service, "data/service.csv")
df_service <- read_csv("data/service.csv")
Rows: 16758 Columns: 18── Column specification ─────────────────────────────────────────────────────────────────
Delimiter: ","
chr  (7): country, iso2c, iso3c, region, capital, income, lending
dbl  (9): year, electricity_urban, electricity_rural, water_urban, water_rural, sanit...
lgl  (1): status
date (1): lastupdated
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.

データの確認

df_service

データの変数(列)の確認

str(df_service)
spc_tbl_ [16,758 × 18] (S3: spec_tbl_df/tbl_df/tbl/data.frame)
 $ country          : chr [1:16758] "Afghanistan" "Afghanistan" "Afghanistan" "Afghanistan" ...
 $ iso2c            : chr [1:16758] "AF" "AF" "AF" "AF" ...
 $ iso3c            : chr [1:16758] "AFG" "AFG" "AFG" "AFG" ...
 $ year             : num [1:16758] 2014 1971 2006 2013 1995 ...
 $ status           : logi [1:16758] NA NA NA NA NA NA ...
 $ lastupdated      : Date[1:16758], format: "2023-12-18" "2023-12-18" ...
 $ electricity_urban: num [1:16758] 98.7 NA 81.6 92.2 NA ...
 $ electricity_rural: num [1:16758] 86.5 NA 19.3 60.2 NA ...
 $ water_urban      : num [1:16758] 82.1 NA 64.3 79.9 NA ...
 $ water_rural      : num [1:16758] 52.2 NA 30.9 49.4 NA ...
 $ sanitation_urban : num [1:16758] 54.4 NA 38.5 52.3 NA ...
 $ sanitation_rural : num [1:16758] 38.3 NA 25.9 36.8 NA ...
 $ region           : chr [1:16758] "South Asia" "South Asia" "South Asia" "South Asia" ...
 $ capital          : chr [1:16758] "Kabul" "Kabul" "Kabul" "Kabul" ...
 $ longitude        : num [1:16758] 69.2 69.2 69.2 69.2 69.2 ...
 $ latitude         : num [1:16758] 34.5 34.5 34.5 34.5 34.5 ...
 $ income           : chr [1:16758] "Low income" "Low income" "Low income" "Low income" ...
 $ lending          : chr [1:16758] "IDA" "IDA" "IDA" "IDA" ...
 - attr(*, "spec")=
  .. cols(
  ..   country = col_character(),
  ..   iso2c = col_character(),
  ..   iso3c = col_character(),
  ..   year = col_double(),
  ..   status = col_logical(),
  ..   lastupdated = col_date(format = ""),
  ..   electricity_urban = col_double(),
  ..   electricity_rural = col_double(),
  ..   water_urban = col_double(),
  ..   water_rural = col_double(),
  ..   sanitation_urban = col_double(),
  ..   sanitation_rural = col_double(),
  ..   region = col_character(),
  ..   capital = col_character(),
  ..   longitude = col_double(),
  ..   latitude = col_double(),
  ..   income = col_character(),
  ..   lending = col_character()
  .. )
 - attr(*, "problems")=<externalptr> 

変形

変数の選択(selecting)

df_serv <- df_service |> 
  select(country, iso2c, year, electricity_urban:sanitation_rural, region, income)
df_serv

縦長の表(Long Table)に変換

electricity_urban の列から sanitation_rural の列までを、変数を name に、値を value に入れて、縦に並べます。

df_serv_long <- df_serv |> 
  pivot_longer(electricity_urban:sanitation_rural)
df_serv_long

各年毎のデータの数の確認

df_serv_long |> drop_na(value) |> 
  ggplot(aes(year)) + geom_bar()


各指標ごとに積み上げ棒グラフにしてみます

fillcol に変えるとどうなるでしょうか。

df_serv_long |> drop_na(value) |> 
  ggplot(aes(year, fill = name)) + geom_bar()

気づいたこと、疑問


国と地域

地域の iso2c コード

country には、国と地域両方が入っています。地域の iso2c は以下のものです。

REGION <- c("1A", "1W", "4E", "6F", "6N", "6X", "7E", "8S", "A4", "A5", 
"A9", "B1", "B2", "B3", "B4", "B6", "B7", "B8", "C4", "C5", "C6", 
"C7", "C8", "C9", "D2", "D3", "D4", "D5", "D6", "D7", "EU", "F1", 
"F6", "M1", "M2", "N6", "OE", "R6", "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", "ZB", "ZF", "ZG", "ZH", "ZI", 
"ZJ", "ZQ", "ZT")

地域のリストを表示

df_serv |> filter(iso2c %in% REGION) |> distinct(country, iso2c)

国名とその地域・所得レベルを表示

df_serv |> filter(!(iso2c %in% REGION)) |> distinct(country, iso2c,region,income)

国や地域の選択

ASEAN <- c("BN", "KH", "ID", "LA", "MY", "MM", "PH", "SG", "VN")
BRICS <- c("Brazil", "Russian Federation", "India", "China", "South Africa")
SACU <- c("South Africa", "Namibia", "Eswatini", "Botswana", "Lesotho")
CHOSEN_COUNTRIES <- c("Suriname", "Belize", "Brazil", "Colombia")

変数同士の相関関係: NA ではないところのみ選択

df_serv |> filter(!(iso2c %in% REGION)) |> # 地域以外(国のみ選択)
  drop_na(electricity_urban:sanitation_rural) |> 
  select(electricity_urban:sanitation_rural) |> cor()
                  electricity_urban electricity_rural water_urban water_rural
electricity_urban         1.0000000         0.8314102   0.7628490   0.7248691
electricity_rural         0.8314102         1.0000000   0.7927840   0.8637606
water_urban               0.7628490         0.7927840   1.0000000   0.8391167
water_rural               0.7248691         0.8637606   0.8391167   1.0000000
sanitation_urban          0.7930134         0.8937821   0.7681716   0.8306062
sanitation_rural          0.7496970         0.8945593   0.7598583   0.8644760
                  sanitation_urban sanitation_rural
electricity_urban        0.7930134        0.7496970
electricity_rural        0.8937821        0.8945593
water_urban              0.7681716        0.7598583
water_rural              0.8306062        0.8644760
sanitation_urban         1.0000000        0.9196274
sanitation_rural         0.9196274        1.0000000

値の正負:正の相関・負の相関、1に近いと強い正の相関、-1に近いと強い負の相関

相関係数:散布図の近似(回帰)直線の傾きが正なら正、負なら負、直線に近い程、1 または-1 に近い


経年変化

a. 日本

df_serv_long |> filter(country == "Japan") |> drop_na(value) |>
  ggplot(aes(year, value, col = name)) + geom_line()


df_serv_long |> filter(country == "Japan") |> drop_na(value)

df_serv_long |> filter(iso2c %in% ASEAN) |> drop_na(value) |>
  ggplot(aes(year, value, col = country, linetype = name)) + geom_line()


df_serv_long |> filter(iso2c %in% ASEAN) |> drop_na(value) |> 
  filter(value < 80) |>
  ggplot(aes(year, value, col = country, linetype = name)) + geom_line()


df_serv_long |> filter(country %in% SACU) |> drop_na(value) |>
  ggplot(aes(year, value, col = country, linetype = name)) + geom_line()


箱ひげ図(Boxplot)

df_serv_long |> filter(name == "electricity_rural") |> 
  filter(region != "Aggregates") |> drop_na(value) |>
  ggplot(aes(region, value)) + geom_boxplot() + coord_flip()


df_serv |> filter(region != "Aggregates") |> drop_na(electricity_rural) |>
  ggplot(aes(region, electricity_rural)) + geom_boxplot() + coord_flip()


df_serv_long |> filter(name %in% c("electricity_rural", "electricity_urban")) |> 
  filter(income != "Aggregates") |> drop_na(value) |>
  ggplot(aes(income, value, fill = name)) + geom_boxplot() + coord_flip()


df_serv_long |> filter(income != "Aggregates", income != "Not classified") |> drop_na(value) |>
  ggplot(aes(income, value, fill = name)) + geom_boxplot() + coord_flip()

ファイルリンク

基本的には、PositCloud(https://posit.cloud/)を使って実習

  • 探索的データ分析(EDA) -
    • 課題2:例 男女別失業率(unemployment.Rmd) [リンク], [Rmd]
    • 課題2:テンプレート:w7eda_template.Rmd [リンク], [Rmd]

2023.2.10.23:59 までに Moodle の課題2提出ボックスに提出してください。

できたグラフだけでも構いませんから、期限までに提出してください。解説を加え、課題2再提出ボックスを作成する予定です。

課題2

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

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

2 経年変化を表す折れ線グラフ a. 日本、またはデータがある国 b. 選択したいくつかの国

3 複数の指標の値を一列に含む縦長の表(Long Table)を作成し   a. 日本、またはデータがある国の、複数の指標を色分けした経年変化のグラフ   b. 選択したいくつかの国についての経年変化のグラフを、国を色分けし、指標は線の種類を変えたグラフ


課題2 つづき

4 二つのデータの散布図- NA は取り除くこと。(log10 スケールを用いる場合は値が正のもののみに限定) a. (地域を除き)国のみの散布図 (近似(回帰)直線を表示) b. 最近の年の(地域を除き)国のみの散布図 (近似(回帰)直線を表示) c. b に対応する相関係数

5 カテゴリー変数(Categorical Variable: region, income, year など)と、数値変数(Numberical Variable)一組についての箱ヒゲ図(Boxplot)

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

2023.2.10.23:59 までに Moodle の課題2提出ボックスに提出してください。


確認作業

  • Preview で確認。

  • Web Browser で、w5_c123456.nb.html など、R Notebook を見て確認。

  • もし、問題があれば、Run ボタンの右の三角から、Run All を選択し、エラーがでないか確認。

  • 最初にもどる。


エラー対応

  • 入力したときには、例を参照して、スペルを確認。全角や変数名の空白は問題を起こす。括弧 () や引用符がペアでマッチしているか、確認。引用符が入っていなかったり、== のところが、= だったり、Error は様々。
  • File not found のときは、データを読み込むコードを再実行。それでもうまくいかないときは、data フォルダに、データ(***.csv)が入っているかを確認、なければ、data フォルダがあることを確認、なければ作成して読み込みを実行。
  • Object not found のエラーがでたときには、上から順に、Run (Code Chunk の右上の三角印を押して実行)。または、エラー箇所にカーソルを置き、Run ボタンの右の三角から、Run All Chunks Above を選択して実行。
  • 実行できていても、結果が見えないことがある。そのときは、Code Chunk の下にある、山二つの記号を押す。結果の表示、非表示の切り替え。
  • Error message を読む。エラーが出た Code Chunk と、Error message を、ChatGPT や、Google Bard, Google Search に入れ解決方法を探る。
  • Posit.Cloud で、Error 137 が出た時はメモリーオーバーなので、例など不要な部分を削除。ただし、一番上の、YAML は、かならず残すこと。

参考文献

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

  2. Posit Recipes(旧 Posit Primers): The Basics 対話型の演習サイトの最初 [Link]

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

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

  5. 箱ひげ図の見方 Link、外れ値検出のある箱ひげ図 Link

  6. Video: Histogram, Boxplot

LS0tCnRpdGxlOiAiR0VTIDAwMSDmvJTnv5I3IgphdXRob3I6ICJILiBTdXp1a2kiCmRhdGU6ICIyMDI05bm0MuaciDbml6UiCm91dHB1dDoKICBodG1sX25vdGVib29rOiBkZWZhdWx0CiAgaHRtbF9kb2N1bWVudDoKICAgIGRmX3ByaW50OiBwYWdlZAogIGlvc2xpZGVzX3ByZXNlbnRhdGlvbjoKICAgIHdpZGVzY3JlZW46IHRydWUKICAgIGRmX3ByaW50OiBwYWdlZAotLS0KCiMjIOa6luWCmQoKMS4gIO+8iOiHquWIhuOBrlBD44G+44Gf44Gv5pWZ5a6k44GuUEPjgavvvInjg63jgrDjgqTjg7MKCjIuICDjgqbjgqfjg4Pjg5bjg7vjg5bjg6njgqbjgrbjg7zvvIhHb29nbGUgQ2hyb21lIOOBquOBqe+8ieOCkui1t+WLlQoKICAgIC0gICBNb29kbGUg44GuIEdFUzAwMSDntYzmuIjjgajntYzmuIjlrabjga7jgrXjgqTjg4jjgYvjgonjgIHjgZPjga7jgrnjg6njgqTjg4njga7jg5rjg7zjgrjjgpLooajnpLrvvIjjg6rjg7Pjgq/jgIxS44Gn44OH44O844K/44K144Kk44Ko44Oz44K544CNWyoqaHR0cHM6Ly9kcy1zbC5naXRodWIuaW8vaW50cm8yci9nZXMwMDEvKipdKGh0dHBzOi8vZHMtc2wuZ2l0aHViLmlvL2ludHJvMnIvZ2VzMDAxLynvvIkKCjMuICDvvIjliKXjga7jgr/jg5bjgb7jgZ/jga8g44Km44Kj44Oz44OJ44Km44Gn77yJUG9zaXRDbG91ZCDjgavjg63jgrDjgqTjg7NbW1Bvc2l0LmNsb3VkXShodHRwczovL3Bvc2l0LmNsb3VkLyldCgogICAgLSAgIOOCouOCq+OCpuODs+ODiOOBruOBquOBhOS6uuOBr+OCteOCpOODs+ODu+OCouODg+ODlyBbW+WFseacieODl+ODreOCuOOCp+OCr+ODiF0oaHR0cHM6Ly9wb3NpdC5jbG91ZC9jb250ZW50LzU1Mzk3NjMpXSDjgYvjgonjgIFTYXZlIGEgUGVybWFuZW50IENvcHnvvIkKCiAgICAtICAgUlN0dWRpbyDjgpLoh6rliIbjga7jgrPjg7Pjg5Tjg6Xjg7zjgr/jgavjgqTjg7Pjgrnjg4jjg7zjg6vjgZfjgabjgYTjgovkurrjga/otbfli5UKCjQuICDjg6rjg7Pjgq/jga7lj7PkuIrjga4gUmF3IOODnOOCv+ODs+OBruWPs+OBriBDb3B5IGEgcmF3IGZpbGUg44GL44KJ44Kz44OU44O844GX44Gm5ryU57+S55SoIFIgTWFya2Rvd24g44OV44Kh44Kk44Or44KS5L2c5oiQ77yI44GC44Go44Gn5YaN5bqm6Kej6Kqs44GX44G+44GZ77yJW1tSbWRdKGh0dHBzOi8vZ2l0aHViLmNvbS9kcy1zbC9pbnRybzJyL2Jsb2IvbWFpbi9kb2NzL2dlczAwMS91bmVtcGxveW1lbnQuUm1kKV0KCiMjIOODleOCoeOCpOODqwoKIyMjIOODleOCoeOCpOODq+OCkuS9nOaIkOOBmeOCi+OBqOOBjeOBruazqOaEjwoKMS4gIFBvc2l0IENsb3VkIOOBruOBqOOBjeOBr+OAgeOBvuOBmuOAgUxvZ2luIOOBl+OAgWludHJvMnJqIOOBruODl+ODreOCuOOCp+OCr+ODiOOBq+WFpeOCiuOAgSDjg5XjgqHjgqTjg6vjgYvjgonjgIFnZXMwMDEg44Gu44OV44Kp44Or44OA44O844KS6YG45oqe44GX44Gm44CB56e75YuV44GX44G+44GZ44CC44GT44Gu5Lit44Gr44CBZGF0YSDjg5Xjgqnjg6vjg4DjgYzkvZzmiJDjgZXjgozjgabjgYTjgovjgZPjgajjgpLnorroqo3jgZfjgIHjgZPjga5nZXMwMDEg44Gr44CB5paw44GX44GP5L2c5oiQ44GX44Gf44OV44Kh44Kk44Or44KS5L+d5a2Y44GX44G+44GZ44CC5paw44GX44GP5L2c5oiQ44GX44Gf44OV44Kh44Kk44Or44Gu5YWl44Gj44Gm44GE44KL44OV44Kp44Or44OA44O844Gu5Lit44Gr44CBZGF0YSDjg5Xjgqnjg6vjg4DjgYzjgYLjgovjgZPjgajjgYzlpKfliIfjgafjgZnjgILjgZ3jgZPjgavjgIHjg4fjg7zjgr/jgpLmm7jjgY3ovrzjgb/jgb7jgZnjgIIKCjIuICBSU3R1ZGlvIOOBruWgtOWQiOOBq+OBr+OAgeOBvuOBmuOBr+OAgeOBguOBn+OCieOBl+OBhOOAgFByb2plY3Qg44KS5L2c5oiQ44GX44G+44GZ44CCRmlsZSBcPiBOZXcgUHJvamVjdCDjgYvjgonkvZzmiJDjgZfjgb7jgZnjgILjgZnjgafjgavjgIHkvZzmiJDjgZfjgabjgYLjgovloLTlkIjjga/jgIHjgZ3jgozjgpLjgIFPcGVuIFByb2plY3Qg44KE44CBUmVjZW50IFByb2plY3Qg44GL44KJ6ZaL44GN44G+44GZ44CC44Gd44Gu5Lit44Gr44CB5paw44GX44GE44OV44Kh44Kk44Or44KS5L2c5oiQ44GX44G+44GZ44CC5L2c5oiQ44GX44Gf44OV44Kp44Or44OA44O844Gr44CBZGF0YSDjg5Xjgqnjg6vjg4DjgYzjgYLjgovjgZPjgajjgpLnorroqo3jgZfjgabjgY/jgaDjgZXjgYTjgILmlrDjgZfjgY/kvZzmiJDjgZfjgZ/jg5XjgqHjgqTjg6vjga7lhaXjgaPjgabjgYTjgovjg5Xjgqnjg6vjg4Djg7zjga7kuK3jgavjgIFkYXRhIOODleOCqeODq+ODgOOBjOOBguOCi+OBk+OBqOOBjOWkp+WIh+OBp+OBmeOAguOBneOBk+OBq+OAgeODh+ODvOOCv+OCkuabuOOBjei+vOOBv+OBvuOBmeOAggoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgojIyMg44OV44Kh44Kk44Or44KS5o+Q5Ye644GZ44KL44Go44GN44Gu5rOo5oSPCgpSU3R1ZGlvIOOBruWgtOWQiOOBq+OBr+OAgeiHquWIhuOBriBQQyDjgavkvZzmiJDjgZfjgZ/jg5XjgqHjgqTjg6vjgYzjgYLjgorjgb7jgZnjgYvjgonjgIHllY/poYzjgarjgYTjgajmgJ3jgYTjgb7jgZnjgYzjgIFQb3NpdCBDbG91ZCDjgafkvZzmiJDjgZfjgZ/loLTlkIjjgavjga/jgIHmj5Dlh7rjgZfjgZ/jgYTjg5XjgqHjgqTjg6vjga7lt6bjgavjgYLjgovjg4Hjgqfjg4Pjgq/jg5zjg4Pjgq/jgrnjgpLjg4Hjgqfjg4Pjgq/jgZfjgb7jgZnjgIJGaWxlcyDjga4g5Y+z56uv44Gr44GC44KL44CB44Ku44Ki44Oe44O844Kv44GuIEV4cG9ydCDjgpLmirzjgZnjgajjgIHjg4Djgqbjg7Pjg63jg7zjg4njgafjgY3jgb7jgZnjgILjgZ3jgozjgpLmj5Dlh7rjgZfjgabjgY/jgaDjgZXjgYTjgILmnKvlsL7jgYzjgIFuYi5odG1sIOOBqOOBquOBo+OBpuOBhOOCi+OCguOBruOCkuaPkOWHuuOBl+OBpuOBhOOBn+OBoOOBj+OBruOBjOOCiOOBhOOBp+OBmeOBjOOAgeOCiOOBj+OCj+OBi+OCieOBquOBhOOBqOOBjeOBr+OAgW5iLmh0bWwg44OV44Kh44Kk44Or44Go44CBUm1kIOODleOCoeOCpOODq+OBqOS4oeaWueaPkOWHuuOBl+OBpuOBj+OBoOOBleOBhOOAgQoKIyMjIOiqsumhjDHjgavjgaTjgYTjgaYKCi0gICDoqrLpoYwx77ya6Kej6KqsIFvjg6rjg7Pjgq9dKGh0dHBzOi8vZHMtc2wuZ2l0aHViLmlvL2ludHJvMnIvZ2VzMDAxL3c1YV9yZXNwb25zZS5uYi5odG1sKQotICAg6Kqy6aGMMe+8muino+etlOS+iyBb44Oq44Oz44KvXShodHRwczovL2RzLXNsLmdpdGh1Yi5pby9pbnRybzJyL2dlczAwMS93NWVkYTAubmIuaHRtbCkKCiMjIOesrDfpgLEKCjAyLzAxKFRIKSDjgIDmsJflgJnlpInli5Xjgavlr77jgZnjgovlr77nrZYKCuOAgOOAgOOAgOOAgOOAgOOAgCDmsJflgJnlpInli5Xjgajosqflm7Djga7pgKPpjpYKCuesrDfpgLHjga/jgIHljZfpg6jjgqLjg5Xjg6rjgqvjgoTljZfjgqLjgrjjgqLjgarjganmsJflgJnlpInli5XjgYvjgonlpKfjgY3jgarlvbHpn7/jgpLlj5fjgZHjgabjgYTjgovlm73jgIXjga7nj77nirbjgpLlj5bjgorkuIrjgZLjgb7jgZnjgIIKCjAyLzA2IChUVSnjgIBS44Gn44OH44O844K/44K144Kk44Ko44Oz44K5N++8mumDveW4gumDqOOBqOi+suadkemDqOOBrueUn+a0u+eKtuazgeOBruagvOW3ruOAgCBbW01haW5dKGh0dHBzOi8vZHMtc2wuZ2l0aHViLmlvL2ludHJvMnIvZ2VzMDAxL2dlczAwMS1tYWluLm5iLmh0bWwpXeODu1vmjojmpa1dCgpVcmJhbiBhbmQgcnVyYWwgZGV2ZWxvcG1lbnQKCkFjY2VzcyB0byBlbGVjdHJpY2l0eSwgdXJiYW4gKCUgb2YgdXJiYW4gcG9wdWxhdGlvbinvvJpFRy5FTEMuQUNDUy5VUi5aUyBbW0xpbmtdKGh0dHBzOi8vZGF0YS53b3JsZGJhbmsub3JnL2luZGljYXRvci9FRy5FTEMuQUNDUy5VUi5aUyldCgpBY2Nlc3MgdG8gZWxlY3RyaWNpdHksIHJ1cmFsICglIG9mIHJ1cmFsIHBvcHVsYXRpb24p77yaRUcuRUxDLkFDQ1MuUlUuWlMgW1tMaW5rXShodHRwczovL2RhdGEud29ybGRiYW5rLm9yZy9pbmRpY2F0b3IvRUcuRUxDLkFDQ1MuUlUuWlMpXQoKUGVvcGxlIHVzaW5nIGF0IGxlYXN0IGJhc2ljIGRyaW5raW5nIHdhdGVyIHNlcnZpY2VzLCB1cmJhbiAoJSBvZiB1cmJhbiBwb3B1bGF0aW9uKe+8mlNILkgyTy5CQVNXLlVSLlpTIFtbTGlua10oaHR0cHM6Ly9kYXRhLndvcmxkYmFuay5vcmcvaW5kaWNhdG9yL1NILkgyTy5CQVNXLlpTKV0KClBlb3BsZSB1c2luZyBhdCBsZWFzdCBiYXNpYyBzYW5pdGF0aW9uIHNlcnZpY2VzLCBydXJhbCAoJSBvZiBydXJhbCBwb3B1bGF0aW9uKe+8mlNILlNUQS5CQVNTLlJVLlpTIFtbTGlua10oaHR0cHM6Ly9kYXRhLndvcmxkYmFuay5vcmcvaW5kaWNhdG9yL1NILlNUQS5CQVNTLlJVLlpTKV0KClBlb3BsZSB1c2luZyBhdCBsZWFzdCBiYXNpYyBzYW5pdGF0aW9uIHNlcnZpY2VzLCB1cmJhbiAoJSBvZiB1cmJhbiBwb3B1bGF0aW9uKe+8mlNILlNUQS5CQVNTLlVSLlpTIFtbTGlua10oaHR0cHM6Ly9kYXRhLndvcmxkYmFuay5vcmcvaW5kaWNhdG9yL1NILlNUQS5CQVNTLlVSLlpTKV0KClBlb3BsZSB1c2luZyBhdCBsZWFzdCBiYXNpYyBkcmlua2luZyB3YXRlciBzZXJ2aWNlcywgcnVyYWwgKCUgb2YgcnVyYWwgcG9wdWxhdGlvbinvvJpTSC5IMk8uQkFTVy5SVS5aUyBbW0xpbmtdKGh0dHBzOi8vZGF0YS53b3JsZGJhbmsub3JnL2luZGljYXRvci9TSC5IMk8uQkFTVy5SVS5aUyldCgojIyDmjqLntKLnmoTjg4fjg7zjgr/liIbmnpDvvIhFREHvvInjg6/jg7zjgq/jg5Xjg63jg7wKCi0gICDooajpoYwgVGl0bGUKLSAgIOamguimgSBBYnN0cmFjdAotICAg44OH44O844K/5oOF5aCx77ya44OH44O844K/5ZCN44CB44OH44O844K/44Kz44O844OJ44CB5aSJ5pWw5ZCN44CB44OH44O844K/5qaC6KaBCi0gICDjg4fjg7zjgr/jga7lj5blvpcgLSDjg4Djgqbjg7Pjg63jg7zjg4njgZfjgabkv53lrZjjgZfjgabjgYrjgY8KICAgIC0gICDmupblgpnvvJpgbGlicmFyeSh0aWR5dmVyc2UpOyBsaWJyYXJ5KFdESSlgCiAgICAtICAgYGRmX3c2ZWRhIDwtIFdESShpbmRpY2F0b3IgPSBjKGNvMnBjYXAgPSAiRU4uQVRNLkNPMkUuUEMiLCAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcmVzdCA9ICJBRy5MTkQuRlJTVC5aUyIpLCBleHRyYSA9IFRSVUUpYAogICAgLSAgICrkuozjgaTku6XkuIrjga7mjIfmqJnjgIHjgZ3jgozjgZ7jgozjgavlpInmlbDlkI0qIGBjbzJwY2FwYCwgYGZvcmVzdGAKICAgIC0gICDov73liqDmg4XloLHvvJpgZXh0cmEgPSBUUlVFYDsgYHJlZ2lvbmAg5Zyw5Z+f5oOF5aCxLCBgaW5jb21lYCDlj47lhaXjg6zjg5njg6sKICAgIC0gICDjg4fjg7zjgr/jga7norroqo3vvJrjg4fjg7zjgr/jgYzljYHliIbjgYLjgovjgYvjgIHlm73lkI3jg6rjgrnjg4jjgIHlnLDln5/lkI3jg6rjgrnjg4gKLSAgIOWIhuaekOOBmeOCi+WbveOBruODquOCueODiO+8muWNl+mDqOOCouODleODquOCq+mWoueojuWQjOebn+OAgeWbveOChOWcsOWfn+OCkumBuOaKngoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgojIyMg5o6i57Si55qE44OH44O844K/5YiG5p6Q77yIRXhwbG9yYXRvcnkgRGF0YSBBbmFseXNpc++8ieODr+ODvOOCr+ODleODreODvO+8iOe2muOBje+8iQoKLSAgIOWIhuaekOODu+imluimmuWMlgogICAgLSAgIOWQhOW5tOavjuOBruODh+ODvOOCv+OBruaVsOOBruajkuOCsOODqeODlQogICAgLSAgIOe1jOW5tOWkieWMlgogICAgICAgIC0gICDml6XmnKzvvIjouqvov5HjgarpprTmn5Pjgb/jga7jgYLjgovjg4fjg7zjgr/jgpLnorroqo3vvIkKICAgICAgICAtICAg5Y2X6YOo44Ki44OV44Oq44Kr6Zai56iO5ZCM55uf44CB6YG45oqe44GX44Gf5Zu944O75Zyw5Z+fCiAgICAtICAg5YiG5biDCiAgICAgICAgLSAgIOODkuOCueODiOOCsOODqeODoO+8iOW5tOOCkuaMh+WumuOBl+OBn+W6puaVsOWIhuW4g++8iQogICAgICAgIC0gICDlgKTjgYzlpKfjgY3jgYQxMOOCq+WbveOBqOOBneOBruWApOOBruajkuOCsOODqeODlQogICAgICAgIC0gICDlgKTjgYzlsI/jgZXjgYQxMOOCq+WbveOBqOOBneOBruWApOOBruajkuOCsOODqeODlQogICAgLSAgIOebuOmWogogICAgICAgIC0gICDmlaPluIPlm7PvvIhzY2F0dGVyIHBsb3TvvIl4Lei7uOOBqOOAgXkt6Lu444Gr44CB44Gd44KM44Ge44KM44Gu5aSJ5pWw44KS44Go44KLCiAgICAgICAgLSAgIOebuOmWouS/guaVsAotICAg5ZCE6aCF55uu44Gr44CB5rCX44Gl44GE44Gf44GT44Go44CB55aR5ZWP44Gq44Gp44KS6KiY6YyyCgojIOa8lOe/kiAy5pyINuaXpe+8iOeBq++8iQoKIyMg5aSJ5b2i77yIdHJhbnNmb3JtYXRpb27vvIkKCi0gICAqKuihjOOBrumBuOaKnioq77yaYGZpbHRlcihjb3VudHJ5ICVpbiUgYygiSmFwYW4iLCAiQ2hpbmEiKWAsIGBkaXN0aW5jdChjb3VudHJ5KWAsIGBkcm9wX25hKHZhbHVlKWAKCi0gICAqKuWIl+OBrumBuOaKnioq77yaYHNlbGVjdChjb3VudHJ5LCBpc28yYywgeWVhciwgdmFyMSwgdmFyMiwgcmVnaW9uKWAKCi0gICAqKuaoquS4puOBs+OBruWkieaVsOOCkue4puS4puOBs+OBqyoq77yabmFtZSDliJfjgajjgIF2YWx1ZSDliJfjgpLkvZzjgorjgIF2YXJfMSwgdmFyXzIsIC4uLiAsIHZhcl9uIOOCkiBuYW1lIOWIl+OBq+OAgeWvvuW/nOOBmeOCi+WApOOCkuOAgHZhbHVlIOWIl+OBqwoKICAgIC0gICBgcGl2b3RfbG9uZ2VyKGNvbHMgPSBjKHZhcl8xLCB2YXJfMiwgLi4uICwgdmFyX24pKWAKCiAgICAtICAgYHBpdm90X2xvbmdlcihjb2xzID0gYyhmZW1hbGVfdW5lbXBsb3ksIG1hbGVfdW5lbXBsb3kpKWAKCiAgICAtICAgYHBpdm90X2xvbmdlcihjb2xzID0gYyhlbGVjdHJpY2l0eV91cmJhbiwgZWxlY3RyaWNpdHlfcnVyYWwpKWAKCiAgICAtICAgYHBpdm90X2xvbmdlcihjb2xzID0gZWxlY3RyaWNpdHlfdXJiYW46c2FuaXRhdGlvbl9ydXJhbCkpYAoKLSAgICoq5rS755So77yaKipgcGl2b3RfbG9uZ2VyKGNvbHMgPSBjKHZhcjEsIHZhcjIpKXw+IGdncGxvdChhZXMoeWVhciwgdmFsdWUsIGNvbCA9IG5hbWUpICsgZ2VvbV9saW5lKClgCgojIyDnrrHjgbLjgZLlm7PvvIhib3hwbG9077yJCgrjgqvjg4bjgrTjg6rlpInmlbDvvIhjb3VudHJ5LCByZWdpb24sIGluY29tZSDjgarjganvvInmr47jga7liIbluIPjgpLmj4/jgY8KCi0gICBgZ2dwbG90KGFlcyhjYXRlZ29yaWNhbF92YXIsIG51bWVyaWNhbF92YXIpKSArIGdlb21fYm94cGxvdCgpYAoKLSAgIGBnZ3Bsb3QoYWVzKHJlZ2lvbiwgZWxlY3RyaWNpdHlfdXJiYW4pKSArIGdlb21fYm94cGxvdCgpYAoKLSAgIGBnZ3Bsb3QoYWVzKGluY29tZSwgZWxlY3RyaWNpdHlfcnVyYWwpKSArIGdlb21fYm94cGxvdCgpYAoKLSAgIGBwaXZvdF9sb25nZXIoY29scyA9IGModmFyMSwgdmFyMikpIHw+IGdncGxvdChhZXMobmFtZSwgdmFsdWUpKSArIGdlb21fYm94cGxvdCgpYAoKLSAgIHllYXIg44Gv44CB5pW05pWw44Gq44Gu44Gn5pWw5YCk5aSJ5pWw77yIbnVtZXJpY2FsIHZhcmlhYmxl77yJ44CC44GT44KM44KSIOOCq+ODhuOCtOODquODvOWkieaVsOOBqOOBl+OBpuaJseOBhuOBn+OCgeOBq+OBr+OAgWBmYWN0b3IoeWVhYHIpIOOCkuS9v+OBhuOAgmB4YCDou7jjga7jg6njg5njg6vjgarjganjga/jgYLjgajjgYvjgonkv67mraPjgYzlv4XopoHjgIIKCiAgICAtICAgYGZpbHRlcih5ZWFyICVpbiUgYygxOTYwLDE5OTAsMjAyMCkpfD4gZ2dwbG90KGFlcyhmYWN0b3IoeWVhciksIHZhcikpICsgZ2VvbV9ib3hwbG90KClgCgojIyDlhoXlrrkKCiMjIyDjg4fjg7zjgr/mg4XloLEKCi0gICBBY2Nlc3MgdG8gZWxlY3RyaWNpdHksIHVyYmFuICglIG9mIHVyYmFuIHBvcHVsYXRpb24p77yaRUcuRUxDLkFDQ1MuVVIuWlMgW1tMaW5rXShodHRwczovL2RhdGEud29ybGRiYW5rLm9yZy9pbmRpY2F0b3IvRUcuRUxDLkFDQ1MuVVIuWlMpXQoKLSAgIEFjY2VzcyB0byBlbGVjdHJpY2l0eSwgcnVyYWwgKCUgb2YgcnVyYWwgcG9wdWxhdGlvbinvvJpFRy5FTEMuQUNDUy5SVS5aUyBbW0xpbmtdKGh0dHBzOi8vZGF0YS53b3JsZGJhbmsub3JnL2luZGljYXRvci9FRy5FTEMuQUNDUy5SVS5aUyldCgotICAgUGVvcGxlIHVzaW5nIGF0IGxlYXN0IGJhc2ljIGRyaW5raW5nIHdhdGVyIHNlcnZpY2VzLCB1cmJhbiAoJSBvZiB1cmJhbiBwb3B1bGF0aW9uKe+8mlNILkgyTy5CQVNXLlVSLlpTIFtbTGlua10oaHR0cHM6Ly9kYXRhLndvcmxkYmFuay5vcmcvaW5kaWNhdG9yL1NILkgyTy5CQVNXLlpTKV0KCi0gICBQZW9wbGUgdXNpbmcgYXQgbGVhc3QgYmFzaWMgZHJpbmtpbmcgd2F0ZXIgc2VydmljZXMsIHJ1cmFsICglIG9mIHJ1cmFsIHBvcHVsYXRpb24p77yaU0guSDJPLkJBU1cuUlUuWlMgW1tMaW5rXShodHRwczovL2RhdGEud29ybGRiYW5rLm9yZy9pbmRpY2F0b3IvU0guSDJPLkJBU1cuUlUuWlMpXQoKLSAgIFBlb3BsZSB1c2luZyBhdCBsZWFzdCBiYXNpYyBzYW5pdGF0aW9uIHNlcnZpY2VzLCB1cmJhbiAoJSBvZiB1cmJhbiBwb3B1bGF0aW9uKe+8mlNILlNUQS5CQVNTLlVSLlpTIFtbTGlua10oaHR0cHM6Ly9kYXRhLndvcmxkYmFuay5vcmcvaW5kaWNhdG9yL1NILlNUQS5CQVNTLlVSLlpTKV0KCi0gICBQZW9wbGUgdXNpbmcgYXQgbGVhc3QgYmFzaWMgc2FuaXRhdGlvbiBzZXJ2aWNlcywgcnVyYWwgKCUgb2YgcnVyYWwgcG9wdWxhdGlvbinvvJpTSC5TVEEuQkFTUy5SVS5aUyBbW0xpbmtdKGh0dHBzOi8vZGF0YS53b3JsZGJhbmsub3JnL2luZGljYXRvci9TSC5TVEEuQkFTUy5SVS5aUyldCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiMjIyDjg4fjg7zjgr/jga7lj5blvpcKCiMjIyMg5rqW5YKZCgpgYGB7cn0KbGlicmFyeSh0aWR5dmVyc2UpCmxpYnJhcnkoV0RJKQpgYGAKCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKYGBge3IgZXZhbCA9IEZBTFNFfQpkZl9zZXJ2aWNlIDwtIFdESSgKICBpbmRpY2F0b3IgPSBjKGVsZWN0cmljaXR5X3VyYmFuID0gIkVHLkVMQy5BQ0NTLlVSLlpTIiwKICAgICAgICAgICAgICAgIGVsZWN0cmljaXR5X3J1cmFsID0gIkVHLkVMQy5BQ0NTLlJVLlpTIiwKICAgICAgICAgICAgICAgIHdhdGVyX3VyYmFuID0gIlNILkgyTy5CQVNXLlVSLlpTIiwKICAgICAgICAgICAgICAgIHdhdGVyX3J1cmFsID0gIlNILkgyTy5CQVNXLlJVLlpTIiwKICAgICAgICAgICAgICAgIHNhbml0YXRpb25fdXJiYW4gPSAiU0guU1RBLkJBU1MuVVIuWlMiLAogICAgICAgICAgICAgICAgc2FuaXRhdGlvbl9ydXJhbCA9ICJTSC5TVEEuQkFTUy5SVS5aUyIKICAgICAgICAgICAgICAgICksIGV4dHJhID0gVFJVRSkKYGBgCgpgYGB7ciBldmFsPUZBTFNFfQp3cml0ZV9jc3YoZGZfc2VydmljZSwgImRhdGEvc2VydmljZS5jc3YiKQpgYGAKCmBgYHtyfQpkZl9zZXJ2aWNlIDwtIHJlYWRfY3N2KCJkYXRhL3NlcnZpY2UuY3N2IikKYGBgCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiMjIyDjg4fjg7zjgr/jga7norroqo0KCmBgYHtyfQpkZl9zZXJ2aWNlCmBgYAoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgojIyMg44OH44O844K/44Gu5aSJ5pWw77yI5YiX77yJ44Gu56K66KqNCgpgYGB7cn0Kc3RyKGRmX3NlcnZpY2UpCmBgYAoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgojIyMg5aSJ5b2iCgojIyMjIOWkieaVsOOBrumBuOaKnu+8iHNlbGVjdGluZ++8iQoKYGBge3J9CmRmX3NlcnYgPC0gZGZfc2VydmljZSB8PiAKICBzZWxlY3QoY291bnRyeSwgaXNvMmMsIHllYXIsIGVsZWN0cmljaXR5X3VyYmFuOnNhbml0YXRpb25fcnVyYWwsIHJlZ2lvbiwgaW5jb21lKQpkZl9zZXJ2CmBgYAoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgojIyMg57im6ZW344Gu6KGo77yITG9uZyBUYWJsZe+8ieOBq+WkieaPmwoKKmBlbGVjdHJpY2l0eV91cmJhbmAg44Gu5YiX44GL44KJIGBzYW5pdGF0aW9uX3J1cmFsYCDjga7liJfjgb7jgafjgpLjgIHlpInmlbDjgpIgbmFtZSDjgavjgIHlgKTjgpIgdmFsdWUg44Gr5YWl44KM44Gm44CB57im44Gr5Lim44G544G+44GZ44CCKgoKYGBge3J9CmRmX3NlcnZfbG9uZyA8LSBkZl9zZXJ2IHw+IAogIHBpdm90X2xvbmdlcihlbGVjdHJpY2l0eV91cmJhbjpzYW5pdGF0aW9uX3J1cmFsKQpkZl9zZXJ2X2xvbmcKYGBgCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiMjIyDlkITlubTmr47jga7jg4fjg7zjgr/jga7mlbDjga7norroqo0KCmBgYHtyfQpkZl9zZXJ2X2xvbmcgfD4gZHJvcF9uYSh2YWx1ZSkgfD4gCiAgZ2dwbG90KGFlcyh5ZWFyKSkgKyBnZW9tX2JhcigpCmBgYAoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgojIyMjIOWQhOaMh+aomeOBlOOBqOOBq+epjeOBv+S4iuOBkuajkuOCsOODqeODleOBq+OBl+OBpuOBv+OBvuOBmQoKYGZpbGxgIOOCkiBgY29sYCDjgavlpInjgYjjgovjgajjganjgYbjgarjgovjgafjgZfjgofjgYbjgYvjgIIKCmBgYHtyfQpkZl9zZXJ2X2xvbmcgfD4gZHJvcF9uYSh2YWx1ZSkgfD4gCiAgZ2dwbG90KGFlcyh5ZWFyLCBmaWxsID0gbmFtZSkpICsgZ2VvbV9iYXIoKQpgYGAKCioq5rCX44Gl44GE44Gf44GT44Go44CB55aR5ZWPKioKCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKIyMjIOWbveOBqOWcsOWfnwoKIyMjIyDlnLDln5/jga4gYGlzbzJjYCDjgrPjg7zjg4kKCmNvdW50cnkg44Gr44Gv44CB5Zu944Go5Zyw5Z+f5Lih5pa544GM5YWl44Gj44Gm44GE44G+44GZ44CC5Zyw5Z+f44GuIGlzbzJjIOOBr+S7peS4i+OBruOCguOBruOBp+OBmeOAggoKYGBge3J9ClJFR0lPTiA8LSBjKCIxQSIsICIxVyIsICI0RSIsICI2RiIsICI2TiIsICI2WCIsICI3RSIsICI4UyIsICJBNCIsICJBNSIsIAoiQTkiLCAiQjEiLCAiQjIiLCAiQjMiLCAiQjQiLCAiQjYiLCAiQjciLCAiQjgiLCAiQzQiLCAiQzUiLCAiQzYiLCAKIkM3IiwgIkM4IiwgIkM5IiwgIkQyIiwgIkQzIiwgIkQ0IiwgIkQ1IiwgIkQ2IiwgIkQ3IiwgIkVVIiwgIkYxIiwgCiJGNiIsICJNMSIsICJNMiIsICJONiIsICJPRSIsICJSNiIsICJTMSIsICJTMiIsICJTMyIsICJTNCIsICJUMiIsIAoiVDMiLCAiVDQiLCAiVDUiLCAiVDYiLCAiVDciLCAiVjEiLCAiVjIiLCAiVjMiLCAiVjQiLCAiWEMiLCAiWEQiLCAKIlhFIiwgIlhGIiwgIlhHIiwgIlhIIiwgIlhJIiwgIlhKIiwgIlhMIiwgIlhNIiwgIlhOIiwgIlhPIiwgIlhQIiwgCiJYUSIsICJYVCIsICJYVSIsICJYWSIsICJaNCIsICJaNyIsICJaQiIsICJaRiIsICJaRyIsICJaSCIsICJaSSIsIAoiWkoiLCAiWlEiLCAiWlQiKQpgYGAKCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKIyMjIyDlnLDln5/jga7jg6rjgrnjg4jjgpLooajnpLoKCmBgYHtyIGV2YWw9RkFMU0V9CmRmX3NlcnYgfD4gZmlsdGVyKGlzbzJjICVpbiUgUkVHSU9OKSB8PiBkaXN0aW5jdChjb3VudHJ5LCBpc28yYykKYGBgCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiMjIyMg5Zu95ZCN44Go44Gd44Gu5Zyw5Z+f44O75omA5b6X44Os44OZ44Or44KS6KGo56S6CgpgYGB7ciBldmFsPUZBTFNFfQpkZl9zZXJ2IHw+IGZpbHRlcighKGlzbzJjICVpbiUgUkVHSU9OKSkgfD4gZGlzdGluY3QoY291bnRyeSwgaXNvMmMscmVnaW9uLGluY29tZSkKYGBgCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiMjIyDlm73jgoTlnLDln5/jga7pgbjmip4KCmBgYHtyfQpBU0VBTiA8LSBjKCJCTiIsICJLSCIsICJJRCIsICJMQSIsICJNWSIsICJNTSIsICJQSCIsICJTRyIsICJWTiIpCmBgYAoKYGBge3J9CkJSSUNTIDwtIGMoIkJyYXppbCIsICJSdXNzaWFuIEZlZGVyYXRpb24iLCAiSW5kaWEiLCAiQ2hpbmEiLCAiU291dGggQWZyaWNhIikKYGBgCgpgYGB7cn0KU0FDVSA8LSBjKCJTb3V0aCBBZnJpY2EiLCAiTmFtaWJpYSIsICJFc3dhdGluaSIsICJCb3Rzd2FuYSIsICJMZXNvdGhvIikKYGBgCgpgYGB7cn0KQ0hPU0VOX0NPVU5UUklFUyA8LSBjKCJTdXJpbmFtZSIsICJCZWxpemUiLCAiQnJhemlsIiwgIkNvbG9tYmlhIikKYGBgCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiMjIyDlpInmlbDlkIzlo6vjga7nm7jplqLplqLkv4I6IE5BIOOBp+OBr+OBquOBhOOBqOOBk+OCjeOBruOBv+mBuOaKngoKYGBge3J9CmRmX3NlcnYgfD4gZmlsdGVyKCEoaXNvMmMgJWluJSBSRUdJT04pKSB8PiAjIOWcsOWfn+S7peWklu+8iOWbveOBruOBv+mBuOaKnu+8iQogIGRyb3BfbmEoZWxlY3RyaWNpdHlfdXJiYW46c2FuaXRhdGlvbl9ydXJhbCkgfD4gCiAgc2VsZWN0KGVsZWN0cmljaXR5X3VyYmFuOnNhbml0YXRpb25fcnVyYWwpIHw+IGNvcigpCmBgYAoK5YCk44Gu5q2j6LKg77ya5q2j44Gu55u46Zai44O76LKg44Gu55u46Zai44CBMeOBq+i/keOBhOOBqOW8t+OBhOato+OBruebuOmWouOAgS0x44Gr6L+R44GE44Go5by344GE6LKg44Gu55u46ZaiCgrnm7jplqLkv4LmlbDvvJrmlaPluIPlm7Pjga7ov5HkvLzvvIjlm57luLDvvInnm7Tnt5rjga7lgr7jgY3jgYzmraPjgarjgonmraPjgIHosqDjgarjgonosqDjgIHnm7Tnt5rjgavov5HjgYTnqIvjgIExIOOBvuOBn+OBry0xIOOBq+i/keOBhAoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgojIyMg57WM5bm05aSJ5YyWCgojIyMgYS4g5pel5pysCgpgYGB7cn0KZGZfc2Vydl9sb25nIHw+IGZpbHRlcihjb3VudHJ5ID09ICJKYXBhbiIpIHw+IGRyb3BfbmEodmFsdWUpIHw+CiAgZ2dwbG90KGFlcyh5ZWFyLCB2YWx1ZSwgY29sID0gbmFtZSkpICsgZ2VvbV9saW5lKCkKYGBgCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCmBgYHtyfQpkZl9zZXJ2X2xvbmcgfD4gZmlsdGVyKGNvdW50cnkgPT0gIkphcGFuIikgfD4gZHJvcF9uYSh2YWx1ZSkKYGBgCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCmBgYHtyfQpkZl9zZXJ2X2xvbmcgfD4gZmlsdGVyKGlzbzJjICVpbiUgQVNFQU4pIHw+IGRyb3BfbmEodmFsdWUpIHw+CiAgZ2dwbG90KGFlcyh5ZWFyLCB2YWx1ZSwgY29sID0gY291bnRyeSwgbGluZXR5cGUgPSBuYW1lKSkgKyBnZW9tX2xpbmUoKQpgYGAKCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKYGBge3J9CmRmX3NlcnZfbG9uZyB8PiBmaWx0ZXIoaXNvMmMgJWluJSBBU0VBTikgfD4gZHJvcF9uYSh2YWx1ZSkgfD4gCiAgZmlsdGVyKHZhbHVlIDwgODApIHw+CiAgZ2dwbG90KGFlcyh5ZWFyLCB2YWx1ZSwgY29sID0gY291bnRyeSwgbGluZXR5cGUgPSBuYW1lKSkgKyBnZW9tX2xpbmUoKQpgYGAKCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKYGBge3J9CmRmX3NlcnZfbG9uZyB8PiBmaWx0ZXIoY291bnRyeSAlaW4lIFNBQ1UpIHw+IGRyb3BfbmEodmFsdWUpIHw+CiAgZ2dwbG90KGFlcyh5ZWFyLCB2YWx1ZSwgY29sID0gY291bnRyeSwgbGluZXR5cGUgPSBuYW1lKSkgKyBnZW9tX2xpbmUoKQpgYGAKCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKIyMjIOeuseOBsuOBkuWbs++8iEJveHBsb3TvvIkKCmBgYHtyfQpkZl9zZXJ2X2xvbmcgfD4gZmlsdGVyKG5hbWUgPT0gImVsZWN0cmljaXR5X3J1cmFsIikgfD4gCiAgZmlsdGVyKHJlZ2lvbiAhPSAiQWdncmVnYXRlcyIpIHw+IGRyb3BfbmEodmFsdWUpIHw+CiAgZ2dwbG90KGFlcyhyZWdpb24sIHZhbHVlKSkgKyBnZW9tX2JveHBsb3QoKSArIGNvb3JkX2ZsaXAoKQpgYGAKCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKYGBge3J9CmRmX3NlcnYgfD4gZmlsdGVyKHJlZ2lvbiAhPSAiQWdncmVnYXRlcyIpIHw+IGRyb3BfbmEoZWxlY3RyaWNpdHlfcnVyYWwpIHw+CiAgZ2dwbG90KGFlcyhyZWdpb24sIGVsZWN0cmljaXR5X3J1cmFsKSkgKyBnZW9tX2JveHBsb3QoKSArIGNvb3JkX2ZsaXAoKQpgYGAKCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKYGBge3J9CmRmX3NlcnZfbG9uZyB8PiBmaWx0ZXIobmFtZSAlaW4lIGMoImVsZWN0cmljaXR5X3J1cmFsIiwgImVsZWN0cmljaXR5X3VyYmFuIikpIHw+IAogIGZpbHRlcihpbmNvbWUgIT0gIkFnZ3JlZ2F0ZXMiKSB8PiBkcm9wX25hKHZhbHVlKSB8PgogIGdncGxvdChhZXMoaW5jb21lLCB2YWx1ZSwgZmlsbCA9IG5hbWUpKSArIGdlb21fYm94cGxvdCgpICsgY29vcmRfZmxpcCgpCmBgYAoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpgYGB7ciBmaWcuaGVpZ2h0PTcsIGZpZy53aWR0aD03fQpkZl9zZXJ2X2xvbmcgfD4gZmlsdGVyKGluY29tZSAhPSAiQWdncmVnYXRlcyIsIGluY29tZSAhPSAiTm90IGNsYXNzaWZpZWQiKSB8PiBkcm9wX25hKHZhbHVlKSB8PgogIGdncGxvdChhZXMoaW5jb21lLCB2YWx1ZSwgZmlsbCA9IG5hbWUpKSArIGdlb21fYm94cGxvdCgpICsgY29vcmRfZmxpcCgpCmBgYAoKIyMg44OV44Kh44Kk44Or44Oq44Oz44KvCgrln7rmnKznmoTjgavjga/jgIFQb3NpdENsb3Vk77yIPGh0dHBzOi8vcG9zaXQuY2xvdWQvPu+8ieOCkuS9v+OBo+OBpuWun+e/kgoKLSAgIOaOoue0oueahOODh+ODvOOCv+WIhuaekO+8iEVEQe+8iSAtCiAgICAtICAg6Kqy6aGMMjrkvosg55S35aWz5Yil5aSx5qWt546H77yIdW5lbXBsb3ltZW50LlJtZO+8iSBbW+ODquODs+OCr10oaHR0cHM6Ly9kcy1zbC5naXRodWIuaW8vaW50cm8yci9nZXMwMDEvdW5lbXBsb3ltZW50Lm5iLmh0bWwpXSwgW1tSbWRdKGh0dHBzOi8vZ2l0aHViLmNvbS9kcy1zbC9pbnRybzJyL2Jsb2IvbWFpbi9kb2NzL2dlczAwMS91bmVtcGxveW1lbnQuUm1kKV0KICAgIC0gICDoqrLpoYwy77ya44OG44Oz44OX44Os44O844OI77yadzdlZGFfdGVtcGxhdGUuUm1kIFtb44Oq44Oz44KvXShodHRwczovL2RzLXNsLmdpdGh1Yi5pby9pbnRybzJyL2dlczAwMS93N2VkYV90ZW1wbGF0ZS5uYi5odG1sKV0sIFtbUm1kXShodHRwczovL2dpdGh1Yi5jb20vZHMtc2wvaW50cm8yci9ibG9iL21haW4vZG9jcy9nZXMwMDEvdzdlZGFfdGVtcGxhdGUuUm1kKV0KCioqMjAyMy4yLjEwLjIzOjU5Kiog44G+44Gn44GrIE1vb2RsZSDjga7oqrLpoYzvvJLmj5Dlh7rjg5zjg4Pjgq/jgrnjgavmj5Dlh7rjgZfjgabjgY/jgaDjgZXjgYTjgIIKCuOBp+OBjeOBn+OCsOODqeODleOBoOOBkeOBp+OCguani+OBhOOBvuOBm+OCk+OBi+OCieOAgeacn+mZkOOBvuOBp+OBq+aPkOWHuuOBl+OBpuOBj+OBoOOBleOBhOOAguino+iqrOOCkuWKoOOBiOOAgeiqsumhjO+8kuWGjeaPkOWHuuODnOODg+OCr+OCueOCkuS9nOaIkOOBmeOCi+S6iOWumuOBp+OBmeOAggoKIyMg6Kqy6aGMMgoK5Lul5LiL44Gu5oyH5qiZ44Gu5Lit44GL44KJ44CB5LqM44Gk5Lul5LiK77yI6KSH5pWw77yJ44KS6YG45oqe44GX44Gm44CB44OH44O844K/44Gu5qaC6KaB77yIZGVzY3JpcHRpb27vvInjgpLoqJjpjLLjgZfjgIHjg4fjg7zjgr/jgpIgV0RJIOOBp+WPluW+l+OBl+OAgeS7peS4i+OBruWIhuaekOOCkuOBmeOCi+OAggoKMSDlkITlubTmr47jga7jg4fjg7zjgr/jga7mlbDjga7mo5LjgrDjg6njg5UKCjIg57WM5bm05aSJ5YyW44KS6KGo44GZ5oqY44KM57ea44Kw44Op44OVIGEuIOaXpeacrOOAgeOBvuOBn+OBr+ODh+ODvOOCv+OBjOOBguOCi+WbvSBiLiDpgbjmip7jgZfjgZ/jgYTjgY/jgaTjgYvjga7lm70KCjMg6KSH5pWw44Gu5oyH5qiZ44Gu5YCk44KS5LiA5YiX44Gr5ZCr44KA57im6ZW344Gu6KGo77yITG9uZyBUYWJsZe+8ieOCkuS9nOaIkOOBlyDjgIAgYS4g5pel5pys44CB44G+44Gf44Gv44OH44O844K/44GM44GC44KL5Zu944Gu44CB6KSH5pWw44Gu5oyH5qiZ44KS6Imy5YiG44GR44GX44Gf57WM5bm05aSJ5YyW44Gu44Kw44Op44OVIOOAgCBiLiDpgbjmip7jgZfjgZ/jgYTjgY/jgaTjgYvjga7lm73jgavjgaTjgYTjgabjga7ntYzlubTlpInljJbjga7jgrDjg6njg5XjgpLjgIHlm73jgpLoibLliIbjgZHjgZfjgIHmjIfmqJnjga/nt5rjga7nqK7poZ7jgpLlpInjgYjjgZ/jgrDjg6njg5UKCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKIyMjIOiqsumhjDIg44Gk44Gl44GNCgo0IOS6jOOBpOOBruODh+ODvOOCv+OBruaVo+W4g+Wbsy0gTkEg44Gv5Y+W44KK6Zmk44GP44GT44Go44CC77yIbG9nMTAg44K544Kx44O844Or44KS55So44GE44KL5aC05ZCI44Gv5YCk44GM5q2j44Gu44KC44Gu44Gu44G/44Gr6ZmQ5a6a77yJIGEuIO+8iOWcsOWfn+OCkumZpOOBje+8ieWbveOBruOBv+OBruaVo+W4g+WbsyDvvIjov5HkvLzvvIjlm57luLDvvInnm7Tnt5rjgpLooajnpLrvvIkgYi4g5pyA6L+R44Gu5bm044Gu77yI5Zyw5Z+f44KS6Zmk44GN77yJ5Zu944Gu44G/44Gu5pWj5biD5Zuz44CA77yI6L+R5Ly877yI5Zue5biw77yJ55u057ea44KS6KGo56S677yJIGMuIGIg44Gr5a++5b+c44GZ44KL55u46Zai5L+C5pWwCgo1IOOCq+ODhuOCtOODquODvOWkieaVsO+8iENhdGVnb3JpY2FsIFZhcmlhYmxlOiByZWdpb24sIGluY29tZSwgeWVhciDjgarjganvvInjgajjgIHmlbDlgKTlpInmlbDvvIhOdW1iZXJpY2FsIFZhcmlhYmxl77yJ5LiA57WE44Gr44Gk44GE44Gm44Gu566x44OS44Ky5Zuz77yIQm94cGxvdO+8iQoK44Gd44KM44Ge44KM44Gr44Gk44GE44Gm6ICD5a+f77yI5rCX44Gl44GE44Gf44GT44Go44CB55aR5ZWP44Gq44Gp77yJ44KS6KiY44GZCgoqKjIwMjMuMi4xMC4yMzo1OSoqIOOBvuOBp+OBqyBNb29kbGUg44Gu6Kqy6aGM77yS5o+Q5Ye644Oc44OD44Kv44K544Gr5o+Q5Ye644GX44Gm44GP44Gg44GV44GE44CCCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiMjIyDnorroqo3kvZzmpa0KCi0gICBQcmV2aWV3IOOBp+eiuuiqjeOAggoKLSAgIFdlYiBCcm93c2VyIOOBp+OAgXc1X2MxMjM0NTYubmIuaHRtbCDjgarjganjgIFSIE5vdGVib29rIOOCkuimi+OBpueiuuiqjeOAggoKLSAgIOOCguOBl+OAgeWVj+mhjOOBjOOBguOCjOOBsOOAgVJ1biDjg5zjgr/jg7Pjga7lj7Pjga7kuInop5LjgYvjgonjgIFSdW4gQWxsIOOCkumBuOaKnuOBl+OAgeOCqOODqeODvOOBjOOBp+OBquOBhOOBi+eiuuiqjeOAggoKLSAgIOacgOWIneOBq+OCguOBqeOCi+OAggoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgojIyMg44Ko44Op44O85a++5b+cCgotICAg5YWl5Yqb44GX44Gf44Go44GN44Gr44Gv44CB5L6L44KS5Y+C54Wn44GX44Gm44CB44K544Oa44Or44KS56K66KqN44CC5YWo6KeS44KE5aSJ5pWw5ZCN44Gu56m655m944Gv5ZWP6aGM44KS6LW344GT44GZ44CC5ous5byn44CAKCkg44KE5byV55So56ym44GM44Oa44Ki44Gn44Oe44OD44OB44GX44Gm44GE44KL44GL44CB56K66KqN44CC5byV55So56ym44GM5YWl44Gj44Gm44GE44Gq44GL44Gj44Gf44KK44CBPT0g44Gu44Go44GT44KN44GM44CBPSDjgaDjgaPjgZ/jgorjgIFFcnJvciDjga/mp5jjgIXjgIIKLSAgIEZpbGUgbm90IGZvdW5kIOOBruOBqOOBjeOBr+OAgeODh+ODvOOCv+OCkuiqreOBv+i+vOOCgOOCs+ODvOODieOCkuWGjeWun+ihjOOAguOBneOCjOOBp+OCguOBhuOBvuOBj+OBhOOBi+OBquOBhOOBqOOBjeOBr+OAgWRhdGEg44OV44Kp44Or44OA44Gr44CB44OH44O844K/77yIXCpcKlwqLmNzdu+8ieOBjOWFpeOBo+OBpuOBhOOCi+OBi+OCkueiuuiqjeOAgeOBquOBkeOCjOOBsOOAgWRhdGEg44OV44Kp44Or44OA44GM44GC44KL44GT44Go44KS56K66KqN44CB44Gq44GR44KM44Gw5L2c5oiQ44GX44Gm6Kqt44G/6L6844G/44KS5a6f6KGM44CCCi0gICBPYmplY3Qgbm90IGZvdW5kIOOBruOCqOODqeODvOOBjOOBp+OBn+OBqOOBjeOBq+OBr+OAgeS4iuOBi+OCiemghuOBq+OAgVJ1biDvvIhDb2RlIENodW5rIOOBruWPs+S4iuOBruS4ieinkuWNsOOCkuaKvOOBl+OBpuWun+ihjO+8ieOAguOBvuOBn+OBr+OAgeOCqOODqeODvOeuh+aJgOOBq+OCq+ODvOOCveODq+OCkue9ruOBjeOAgVJ1biDjg5zjgr/jg7Pjga7lj7Pjga7kuInop5LjgYvjgonjgIFSdW4gQWxsIENodW5rcyBBYm92ZSDjgpLpgbjmip7jgZfjgablrp/ooYzjgIIKLSAgIOWun+ihjOOBp+OBjeOBpuOBhOOBpuOCguOAgee1kOaenOOBjOimi+OBiOOBquOBhOOBk+OBqOOBjOOBguOCi+OAguOBneOBruOBqOOBjeOBr+OAgUNvZGUgQ2h1bmsg44Gu5LiL44Gr44GC44KL44CB5bGx5LqM44Gk44Gu6KiY5Y+344KS5oq844GZ44CC57WQ5p6c44Gu6KGo56S644CB6Z2e6KGo56S644Gu5YiH44KK5pu/44GI44CCCi0gICBFcnJvciBtZXNzYWdlIOOCkuiqreOCgOOAguOCqOODqeODvOOBjOWHuuOBnyBDb2RlIENodW5rIOOBqOOAgUVycm9yIG1lc3NhZ2Ug44KS44CBQ2hhdEdQVCDjgoTjgIFHb29nbGUgQmFyZCwgR29vZ2xlIFNlYXJjaCDjgavlhaXjgozop6Pmsbrmlrnms5XjgpLmjqLjgovjgIIKLSAgIFBvc2l0LkNsb3VkIOOBp+OAgUVycm9yIDEzNyDjgYzlh7rjgZ/mmYLjga/jg6Hjg6Ljg6rjg7zjgqrjg7zjg5Djg7zjgarjga7jgafjgIHkvovjgarjgankuI3opoHjgarpg6jliIbjgpLliYrpmaTjgILjgZ/jgaDjgZfjgIHkuIDnlarkuIrjga7jgIFZQU1MIOOBr+OAgeOBi+OBquOCieOBmuaui+OBmeOBk+OBqOOAggoKIyMg5Y+C6ICD5paH54yuCgotICAg6Kqy6aGMMe+8muino+iqrCBb44Oq44Oz44KvXShodHRwczovL2RzLXNsLmdpdGh1Yi5pby9pbnRybzJyL2dlczAwMS93NWFfcmVzcG9uc2UubmIuaHRtbCnjg7vop6PnrZTkvosgW+ODquODs+OCr10oaHR0cHM6Ly9kcy1zbC5naXRodWIuaW8vaW50cm8yci9nZXMwMDEvdzVlZGEwLm5iLmh0bWwpCi0gICDnrKw26YCx5ryU57+S77ya6Kej562U5L6LIFvjg6rjg7Pjgq9dKGh0dHBzOi8vZHMtc2wuZ2l0aHViLmlvL2ludHJvMnIvZ2VzMDAxL3c2ZWRhMC5uYi5odG1sKQoKMS4gIOOAjOOBv+OCk+OBquOBruODh+ODvOOCv+OCteOCpOOCqOODs+OCuSAtIERhdGEgU2NpZW5jZSBmb3IgQWxs44CNW1vjga/jgZjjgoHjgabjga7jg4fjg7zjgr/jgrXjgqTjgqjjg7PjgrldKGh0dHBzOi8vaWN1LWhzdXp1a2kuZ2l0aHViLmlvL2RzNGFqL2ZpcnN0LWV4YW1wbGUuaHRtbCNmaXJzdC1leGFtcGxlKV0KCiAgICA8IS0tIC0gICDlsI7lhaXjgajjgZfjgabjgIFHRFDvvIjlm73lhoXnt4/nlJ/nlKPvvInjga7jg4fjg7zjgr/jgpLkvb/jgaPjgaboqqzmmI7jgZfjgabjgYTjgb7jgZnjgIIgLS0+CgoyLiAgUG9zaXQgUmVjaXBlc++8iOaXpyBQb3NpdCBQcmltZXJz77yJOiBUaGUgQmFzaWNzIOWvvuipseWei+OBrua8lOe/kuOCteOCpOODiOOBruacgOWInSBbW0xpbmtdKGh0dHBzOi8vcG9zaXQuY2xvdWQvbGVhcm4vcmVjaXBlcyldCgozLiAgUG9zaXQgQ2hlYXQgU2hlZXQuIOaXqeimi+ihqOOBp+OBmeOAguWNsOWIt+OBl+OBpuS9v+OBhuOBn+OCgeOBq+OAgVBERiDjgoLmj5DkvpvjgZfjgabjgYTjgb7jgZnjgIJbW1NpdGUgTGlua10oaHR0cHM6Ly9yc3R1ZGlvLmdpdGh1Yi5pby9jaGVhdHNoZWV0cy8pXQoKNC4gIERhdGFDYW1wIENoZWF0IFNoZWV0OiBUaWR5dmVyc2UgZm9yIEJpZ2lubmVycy4g44OH44O844K/44K144Kk44Ko44Oz44K544Gu5pWZ6IKy44KS44GX44Gm44GE44KL5Lya56S+44Gu5pep6KaL6KGo44Gu5LiA44Gk44Gn44GZ44CC5Z+65pys44GM57Ch5Y2Y44Gr44G+44Go44G+44Gj44Gm44GE44G+44GZ44CCW1tMaW5rXShodHRwczovL2ltYWdlcy5kYXRhY2FtcC5jb20vaW1hZ2UvdXBsb2FkL3YxNjc2MzAyNjk3L01hcmtldGluZy9CbG9nL1RpZHl2ZXJzZV9DaGVhdF9TaGVldC5wZGYpXQoKNS4gIOeuseOBsuOBkuWbs+OBruimi+aWuSBbTGlua10oaHR0cHM6Ly9iZWxsY3VydmUuanAvc3RhdGlzdGljcy9jb3Vyc2UvNTIyMC5odG1sKeOAgeWkluOCjOWApOaknOWHuuOBruOBguOCi+euseOBsuOBkuWbsyBbTGlua10oaHR0cHM6Ly9iZWxsY3VydmUuanAvc3RhdGlzdGljcy9jb3Vyc2UvNTIyMi5odG1sKQoKNi4gIFZpZGVvOiBbSGlzdG9ncmFtXShodHRwczovL3ZpbWVvLmNvbS8yMjE2MDczNDEpLCBbQm94cGxvdF0oaHR0cHM6Ly92aW1lby5jb20vMjIyMzU4MDM0KQo=