1 はじめに

1.1 データサイエンス?

データから情報を得るときには、大体次のような手順をとります。

  1. 準備 Setup
  2. データを取得 Import data
  3. データ構造の確認 View data
  4. 必要に応じて整形 Transform data
  5. 視覚化 Visualize data
  6. データを理解 Understand data
  7. レポートなどにまとめる Communicate data

問いをもちデータを取得し、視覚化などを通して、データを理解し、さらに問いを深めるサイクルが、データサイエンスの核だと思います。

R を使った分析の一つの例を、見て行きます。一つ一つのコード(コンピュータ・プログラム)の簡単な説明は、加えますが、あまりそれに捉われず、データサイエンスとは何かを考えながら、雰囲気を味わってください。

1.2 R のパッケージを活用

1.2.1 準備 Setup

世界銀行(World Bank)の、世界開発指標(WDI: World Development Indicators)の一つの、GDP(Gross Domestic Product 国内総生産)のデータから始めます。GDP にも何種類かの尺度がありますが、次のものを見てみます。

  • NY.GDP.MKTP.CD: GDP (current US$)

NY.GDP.MKTP.CD は、データコードと言われるもので、世界開発指標(WDI)には、一つづつ決まっています。

World Development Indicators のサイトの下にある、Data Themes(テーマ)からテーマを選択し、下にスクロールすると、Code をみることができます。ちなみに、ここで利用する NY.GDP.MKTP.CD: GDP (current US$) は、テーマの Economy(経済)の、一番上にあります。

経済用語の英語はよく知らないという方は、ブラウザー(Edge, Google Chrome, Safari など)の翻訳機能を使うのも良いでしょう。ただ、そのページの対話型の機能(interactive function)を利用するときは、翻訳機能をOFF にする必要がある場合もありますので、注意してください。

エラーメッセージを調べるときなどに、英語のほうが情報がたくさん得られますから、言語を、英語に変更しておきます。

R には、WDI のデータを取得する R のツール(パッケージ)WDI がありますから、それを使います。また、データを取り扱うための基本的なツール(パッケージ)tidyverse を使いますので、次のコードで、これらを読み込みます。

Sys.setenv(LANG = "en")
library(tidyverse)
library(WDI)

データを保存する場所を作成しておくことをお勧めします。保存しておくときは、このディレクトリを使います。

dir.create("./data")

1.2.2 データ取得 Import data

データを取得します。少し時間がかかります。取得したデータに、df_gdp などと、わかりやすい名前をつけます。dfdata frame の略で、R で標準的なデータの形式です。

df_gdp <- WDI(country = "all", 
              indicator = c(gdp = "NY.GDP.MKTP.CD"), 
              extra = TRUE)

このコードで、全ての国の GDP を取得できます。GDP の値は、NY.GDP.MKTP.CD という名前の列にありますが、覚えやすいように、gdp という名前に変更しておきます。extra = TRUE とすることによって、それぞれの国についての情報などが追加されます。

1.2.3 データ構造の確認

最初の数行だけを見るには、head(df_dgp) とします。

head(df_gdp)

データの構造を見るときには、str(df_gdp) もよく使われます。今度は、列が縦に並んで表示されます。

str(df_gdp)
'data.frame':   16758 obs. of  13 variables:
 $ country    : chr  "Afghanistan" "Afghanistan" "Afghanistan" "Afghanistan" ...
 $ iso2c      : chr  "AF" "AF" "AF" "AF" ...
 $ iso3c      : chr  "AFG" "AFG" "AFG" "AFG" ...
 $ year       : int  1963 1962 1961 1960 2003 2002 2001 2000 1995 1994 ...
 $ gdp        : num  7.51e+08 5.47e+08 5.49e+08 5.38e+08 4.54e+09 ...
  ..- attr(*, "label")= chr "GDP (current US$)"
 $ status     : chr  "" "" "" "" ...
 $ lastupdated: chr  "2023-05-10" "2023-05-10" "2023-05-10" "2023-05-10" ...
 $ region     : chr  "South Asia" "South Asia" "South Asia" "South Asia" ...
 $ capital    : chr  "Kabul" "Kabul" "Kabul" "Kabul" ...
 $ longitude  : chr  "69.1761" "69.1761" "69.1761" "69.1761" ...
 $ latitude   : chr  "34.5228" "34.5228" "34.5228" "34.5228" ...
 $ income     : chr  "Low income" "Low income" "Low income" "Low income" ...
 $ lending    : chr  "IDA" "IDA" "IDA" "IDA" ...

概要 (summary(df_gdp)) からもある程度わかります。

summary(df_gdp) 
   country             iso2c              iso3c                year     
 Length:16758       Length:16758       Length:16758       Min.   :1960  
 Class :character   Class :character   Class :character   1st Qu.:1975  
 Mode  :character   Mode  :character   Mode  :character   Median :1991  
                                                          Mean   :1991  
                                                          3rd Qu.:2007  
                                                          Max.   :2022  
                                                                        
      gdp               status          lastupdated           region         
 Min.   :8.824e+06   Length:16758       Length:16758       Length:16758      
 1st Qu.:2.442e+09   Class :character   Class :character   Class :character  
 Median :1.784e+10   Mode  :character   Mode  :character   Mode  :character  
 Mean   :1.161e+12                                                           
 3rd Qu.:2.156e+11                                                           
 Max.   :9.653e+13                                                           
 NA's   :3602                                                                
   capital           longitude           latitude            income         
 Length:16758       Length:16758       Length:16758       Length:16758      
 Class :character   Class :character   Class :character   Class :character  
 Mode  :character   Mode  :character   Mode  :character   Mode  :character  
                                                                            
                                                                            
                                                                            
                                                                            
   lending         
 Length:16758      
 Class :character  
 Mode  :character  
                   
                   
                   
                   

国のリストをみてみましょう。とても長いリストの中には、地域名も含まれています。

df_gdp %>% distinct(country) %>% pull()
  [1] "Afghanistan"                                         
  [2] "Africa Eastern and Southern"                         
  [3] "Africa Western and Central"                          
  [4] "Albania"                                             
  [5] "Algeria"                                             
  [6] "American Samoa"                                      
  [7] "Andorra"                                             
  [8] "Angola"                                              
  [9] "Antigua and Barbuda"                                 
 [10] "Arab World"                                          
 [11] "Argentina"                                           
 [12] "Armenia"                                             
 [13] "Aruba"                                               
 [14] "Australia"                                           
 [15] "Austria"                                             
 [16] "Azerbaijan"                                          
 [17] "Bahamas, The"                                        
 [18] "Bahrain"                                             
 [19] "Bangladesh"                                          
 [20] "Barbados"                                            
 [21] "Belarus"                                             
 [22] "Belgium"                                             
 [23] "Belize"                                              
 [24] "Benin"                                               
 [25] "Bermuda"                                             
 [26] "Bhutan"                                              
 [27] "Bolivia"                                             
 [28] "Bosnia and Herzegovina"                              
 [29] "Botswana"                                            
 [30] "Brazil"                                              
 [31] "British Virgin Islands"                              
 [32] "Brunei Darussalam"                                   
 [33] "Bulgaria"                                            
 [34] "Burkina Faso"                                        
 [35] "Burundi"                                             
 [36] "Cabo Verde"                                          
 [37] "Cambodia"                                            
 [38] "Cameroon"                                            
 [39] "Canada"                                              
 [40] "Caribbean small states"                              
 [41] "Cayman Islands"                                      
 [42] "Central African Republic"                            
 [43] "Central Europe and the Baltics"                      
 [44] "Chad"                                                
 [45] "Channel Islands"                                     
 [46] "Chile"                                               
 [47] "China"                                               
 [48] "Colombia"                                            
 [49] "Comoros"                                             
 [50] "Congo, Dem. Rep."                                    
 [51] "Congo, Rep."                                         
 [52] "Costa Rica"                                          
 [53] "Cote d'Ivoire"                                       
 [54] "Croatia"                                             
 [55] "Cuba"                                                
 [56] "Curacao"                                             
 [57] "Cyprus"                                              
 [58] "Czechia"                                             
 [59] "Denmark"                                             
 [60] "Djibouti"                                            
 [61] "Dominica"                                            
 [62] "Dominican Republic"                                  
 [63] "Early-demographic dividend"                          
 [64] "East Asia & Pacific"                                 
 [65] "East Asia & Pacific (excluding high income)"         
 [66] "East Asia & Pacific (IDA & IBRD countries)"          
 [67] "Ecuador"                                             
 [68] "Egypt, Arab Rep."                                    
 [69] "El Salvador"                                         
 [70] "Equatorial Guinea"                                   
 [71] "Eritrea"                                             
 [72] "Estonia"                                             
 [73] "Eswatini"                                            
 [74] "Ethiopia"                                            
 [75] "Euro area"                                           
 [76] "Europe & Central Asia"                               
 [77] "Europe & Central Asia (excluding high income)"       
 [78] "Europe & Central Asia (IDA & IBRD countries)"        
 [79] "European Union"                                      
 [80] "Faroe Islands"                                       
 [81] "Fiji"                                                
 [82] "Finland"                                             
 [83] "Fragile and conflict affected situations"            
 [84] "France"                                              
 [85] "French Polynesia"                                    
 [86] "Gabon"                                               
 [87] "Gambia, The"                                         
 [88] "Georgia"                                             
 [89] "Germany"                                             
 [90] "Ghana"                                               
 [91] "Gibraltar"                                           
 [92] "Greece"                                              
 [93] "Greenland"                                           
 [94] "Grenada"                                             
 [95] "Guam"                                                
 [96] "Guatemala"                                           
 [97] "Guinea"                                              
 [98] "Guinea-Bissau"                                       
 [99] "Guyana"                                              
[100] "Haiti"                                               
[101] "Heavily indebted poor countries (HIPC)"              
[102] "High income"                                         
[103] "Honduras"                                            
[104] "Hong Kong SAR, China"                                
[105] "Hungary"                                             
[106] "IBRD only"                                           
[107] "Iceland"                                             
[108] "IDA & IBRD total"                                    
[109] "IDA blend"                                           
[110] "IDA only"                                            
[111] "IDA total"                                           
[112] "India"                                               
[113] "Indonesia"                                           
[114] "Iran, Islamic Rep."                                  
[115] "Iraq"                                                
[116] "Ireland"                                             
[117] "Isle of Man"                                         
[118] "Israel"                                              
[119] "Italy"                                               
[120] "Jamaica"                                             
[121] "Japan"                                               
[122] "Jordan"                                              
[123] "Kazakhstan"                                          
[124] "Kenya"                                               
[125] "Kiribati"                                            
[126] "Korea, Dem. People's Rep."                           
[127] "Korea, Rep."                                         
[128] "Kosovo"                                              
[129] "Kuwait"                                              
[130] "Kyrgyz Republic"                                     
[131] "Lao PDR"                                             
[132] "Late-demographic dividend"                           
[133] "Latin America & Caribbean"                           
[134] "Latin America & Caribbean (excluding high income)"   
[135] "Latin America & the Caribbean (IDA & IBRD countries)"
[136] "Latvia"                                              
[137] "Least developed countries: UN classification"        
[138] "Lebanon"                                             
[139] "Lesotho"                                             
[140] "Liberia"                                             
[141] "Libya"                                               
[142] "Liechtenstein"                                       
[143] "Lithuania"                                           
[144] "Low & middle income"                                 
[145] "Low income"                                          
[146] "Lower middle income"                                 
[147] "Luxembourg"                                          
[148] "Macao SAR, China"                                    
[149] "Madagascar"                                          
[150] "Malawi"                                              
[151] "Malaysia"                                            
[152] "Maldives"                                            
[153] "Mali"                                                
[154] "Malta"                                               
[155] "Marshall Islands"                                    
[156] "Mauritania"                                          
[157] "Mauritius"                                           
[158] "Mexico"                                              
[159] "Micronesia, Fed. Sts."                               
[160] "Middle East & North Africa"                          
[161] "Middle East & North Africa (excluding high income)"  
[162] "Middle East & North Africa (IDA & IBRD countries)"   
[163] "Middle income"                                       
[164] "Moldova"                                             
[165] "Monaco"                                              
[166] "Mongolia"                                            
[167] "Montenegro"                                          
[168] "Morocco"                                             
[169] "Mozambique"                                          
[170] "Myanmar"                                             
[171] "Namibia"                                             
[172] "Nauru"                                               
[173] "Nepal"                                               
[174] "Netherlands"                                         
[175] "New Caledonia"                                       
[176] "New Zealand"                                         
[177] "Nicaragua"                                           
[178] "Niger"                                               
[179] "Nigeria"                                             
[180] "North America"                                       
[181] "North Macedonia"                                     
[182] "Northern Mariana Islands"                            
[183] "Norway"                                              
[184] "Not classified"                                      
[185] "OECD members"                                        
[186] "Oman"                                                
[187] "Other small states"                                  
[188] "Pacific island small states"                         
[189] "Pakistan"                                            
[190] "Palau"                                               
[191] "Panama"                                              
[192] "Papua New Guinea"                                    
[193] "Paraguay"                                            
[194] "Peru"                                                
[195] "Philippines"                                         
[196] "Poland"                                              
[197] "Portugal"                                            
[198] "Post-demographic dividend"                           
[199] "Pre-demographic dividend"                            
[200] "Puerto Rico"                                         
[201] "Qatar"                                               
[202] "Romania"                                             
[203] "Russian Federation"                                  
[204] "Rwanda"                                              
[205] "Samoa"                                               
[206] "San Marino"                                          
[207] "Sao Tome and Principe"                               
[208] "Saudi Arabia"                                        
[209] "Senegal"                                             
[210] "Serbia"                                              
[211] "Seychelles"                                          
[212] "Sierra Leone"                                        
[213] "Singapore"                                           
[214] "Sint Maarten (Dutch part)"                           
[215] "Slovak Republic"                                     
[216] "Slovenia"                                            
[217] "Small states"                                        
[218] "Solomon Islands"                                     
[219] "Somalia"                                             
[220] "South Africa"                                        
[221] "South Asia"                                          
[222] "South Asia (IDA & IBRD)"                             
[223] "South Sudan"                                         
[224] "Spain"                                               
[225] "Sri Lanka"                                           
[226] "St. Kitts and Nevis"                                 
[227] "St. Lucia"                                           
[228] "St. Martin (French part)"                            
[229] "St. Vincent and the Grenadines"                      
[230] "Sub-Saharan Africa"                                  
[231] "Sub-Saharan Africa (excluding high income)"          
[232] "Sub-Saharan Africa (IDA & IBRD countries)"           
[233] "Sudan"                                               
[234] "Suriname"                                            
[235] "Sweden"                                              
[236] "Switzerland"                                         
[237] "Syrian Arab Republic"                                
[238] "Tajikistan"                                          
[239] "Tanzania"                                            
[240] "Thailand"                                            
[241] "Timor-Leste"                                         
[242] "Togo"                                                
[243] "Tonga"                                               
[244] "Trinidad and Tobago"                                 
[245] "Tunisia"                                             
[246] "Turkiye"                                             
[247] "Turkmenistan"                                        
[248] "Turks and Caicos Islands"                            
[249] "Tuvalu"                                              
[250] "Uganda"                                              
[251] "Ukraine"                                             
[252] "United Arab Emirates"                                
[253] "United Kingdom"                                      
[254] "United States"                                       
[255] "Upper middle income"                                 
[256] "Uruguay"                                             
[257] "Uzbekistan"                                          
[258] "Vanuatu"                                             
[259] "Venezuela, RB"                                       
[260] "Vietnam"                                             
[261] "Virgin Islands (U.S.)"                               
[262] "West Bank and Gaza"                                  
[263] "World"                                               
[264] "Yemen, Rep."                                         
[265] "Zambia"                                              
[266] "Zimbabwe"                                            

今回は下のように、%>%(パイプと呼びます) で繋げてコードを書きました。

df_gdp %>% distinct(country) %>% pull()

最初は、データ、その中の、異なる国を選択して、書き出してくださいというものです。

これは、

pull(distinct(df_gdp, country))

と同じです。どんどん、かっこの中に入れ子になって複雑になるので、一つ一つのステップを、順に書いたものが、最初のものになります。

df_gdp %>% head()
df_gdp %>% str()

なども可能です。かっこの中に最初に入るものが直前のもの、ここでは、データになっています。

1.2.4 必要に応じて整形 Transform data

変数が多いので、日本の部分だけ filter を使って選択します。country が Japan と一致する場合のみを選択するときは、== を使います。数値ではないので、引用符をつけます。半角を使ってください。

df_gdp %>% filter(country == "Japan")
df_gdp %>% filter(country == "Japan") %>% head(2)

2行目の、gdp の、4.940878e+12 は、Scientific notation と言われるもので、 \[4.940878 \times 10^{12} = 4,940,887,800,000\] を意味します。e+3 は千(thousand)、e+6 は百万(million)、e+9 は、10億(billion)、e+12 は、兆(trillion)ですから、日本の、2021 年の GDP は、約5兆ドルとなります。

1.2.5 視覚化 data visualization

1.2.5.1 Fig 1. 日本のGDP の経年変化を折線グラフ(line graph)

df_gdp %>% filter(country == "Japan") %>%
  ggplot(aes(x = year, y = gdp)) + geom_line()

df_gdp %>% filter(country == "Japan") %>%
  ggplot(aes(x = year, y = gdp)) + geom_line()

日本を選択したときに、それに名前をつけておいて、それを使うこともできますが、名前がどんどん増えるので、それに続けて、コードを書いていく方法をとっています。

ggplot(aes(x = year, y = gdp)) + geom_line()

の部分が、グラフを描く部分で、「x 軸を、year、y 軸を、gdp として、それを、折線グラフで描いてください」というコードです。

Warning: [38;5;238mRemoved 1 row containing missing values

と表示されています。値がない年があることを言っています。2022年のデータがないことがわかっていますから、最初から削除してこくことも可能です。

1.2.6 データの理解 Understand data

視覚化によって見えてくることがいくつもありますね。どんなことがわかりますか。気づいたこと(observation)をあげてみましょう。

コードを描くことではなく、この部分が、データサイエンスの核の部分です。気づいたことを列挙してみましょう。

1.2.7 さまざまな視覚化

1.2.7.1 Fig 2. 各年ごとのデータの数

summary(df_gdp) で、データ自体は、1960年から2022年までのようですが、日本も、2022年のデータはありませんでしたから、年によって、どの程度データがあるか、調べてみます。

df_gdp %>% drop_na(gdp) %>% ggplot(aes(x = year)) + geom_bar()

df_gdp %>% drop_na(gdp) %>% ggplot(aes(x = year)) + geom_bar()

バー・グラフを使いますが、gdp の値が、欠損値(NA: not available)のデータを削除してから、グラフを描きます。

1.2.7.2 2021年のGDPの降順での表示(1)

最新の2021年のデータはすべてあるわけではなさそうですが、gdp の値が大きい順に並べてみましょう。

df_gdp %>% filter(year == 2021) %>% drop_na(gdp) %>% arrange(desc(gdp))

1.2.7.3 2021年のGDPの降順での表示(2)

最初に、World と表示され、グループや、カテゴリーのデータもあるようですから、それを、まず、削除することが必要です。region の列を見ると、World などは、Aggregates となっているので、そのようなものを削除すればよさそうです。数値の大きい順に並べたいので、desc 降順(descending order)にします。

df_gdp %>% filter(year == 2021, region != "Aggregates") %>% 
  drop_na(gdp) %>% arrange(desc(gdp))

これは、グラフではありませんが、これも一つの視覚化とも考えられないことはありません。

上位7カ国は、United States, China, Japan, Germany, India, United Kingdom, France であることがわかりました。8番目は、Italy でここまでが、GDP が 2兆ドルを越している国となります。

1.2.7.4 Fig 3. 2021年時のGDP上位7カ国のGDP経年変化

df_gdp %>% filter(iso2c %in% c("US", "CN", "JP", "DE", "IN", "GB", "FR")) %>%
  ggplot(aes(x = year, y = gdp, col = iso2c)) + geom_line()

df_gdp %>% filter(iso2c %in% c("US", "CN", "JP", "DE", "IN", "GB", "FR")) %>%
  ggplot(aes(x = year, y = gdp, col = iso2c)) + geom_line()

ここでは、最初に、filter を使って、7カ国のデータを選択しています。 そのときには、%in% として、国名を、combine するといういみで、c() とひとまとめにします。数字ではなく、文字なので、引用符で囲んでいます。この場合は、single quote でも構いませんが、半角を使ってください。

このグラフからは、どのようなことがわかりますか。気づいたことを書いてみましょう。

もう少し、このようなグラフをみてみたいというような、メモも大切です。

1.2.7.5 Fig 4. 世界のGDP における割合(1)

df_gdp %>% 
  filter(region != "Aggregates") %>% drop_na(gdp) %>% 
  group_by(year) %>% mutate(gdp_ratio = gdp/sum(gdp)) %>% ungroup() %>%
  filter(iso2c %in% c("US", "CN", "JP", "DE", "IN", "GB", "FR"))  %>%
  ggplot(aes(x = year, y = gdp_ratio, fill = iso2c)) + geom_area() +
  geom_line(col = "black", position = "stack", linewidth = 0.3) + 
  scale_y_continuous(labels = scales::percent_format(accuracy = 1))

まず、下の部分が新しいですが、ここでは、年毎にグループにして、その上で、新しい dgp_ratio という名前の列を追加し、その gdp の値を、gdp 合計で割っています。すなわち、世界の、GDP における割合が計算されています。

  group_by(year) %>% mutate(gdp_ratio = gdp/sum(gdp)) %>% ungroup() %>%

下の部分では、geom_area を使って、fill=iso2c により、iso2c ごとに、違う色を塗って、position = “stack” により、積み上げ型の、グラフを描き、境目がわかりやすいように、0.3 の太さの黒の線を描いてください。また、y 軸は、小数点以下を省いたパーセント表示に変えてください。というコードです。

  ggplot(aes(x = year, y = gdp_ratio, fill = iso2c)) + geom_area() +
  geom_line(col = "black", position = "stack", linewidth = 0.3) + 
  scale_y_continuous(labels = scales::percent_format(accuracy = 1))

1.2.7.6 Fig 4. 世界のGDP における割合(2)

これは、上から、iso2c の アルファベットの順番になっていますが、積み上げの順序を変更することもできます。

df_gdp %>% 
  filter(region != "Aggregates") %>% drop_na(gdp) %>% 
  group_by(year) %>% mutate(gdp_ratio = gdp/sum(gdp)) %>% ungroup() %>%
  filter(iso2c %in% c("US", "CN", "JP", "DE", "IN", "GB", "FR"))  %>%
  mutate(iso2co = factor(iso2c, levels = c("IN", "CN", "FR", "GB", "DE", "JP", "US"))) %>%
  ggplot(aes(x = year, y = gdp_ratio, fill = iso2co)) + geom_area() +
  geom_line(col = "black", position = "stack", linewidth = 0.3) + 
  scale_y_continuous(labels = scales::percent_format(accuracy = 1))

これらは、世界全体の GPT における割合です。

どのようなことがわかりますか。

主要国で、60%〜70% を占めていることがわかります。それぞれの国や、幾つかの国の影響力も、ある程度みることができるように見えます。

気づいたこと、疑問に思ったことなどを、書き出してみてください。

GDP が大きな国と、小さな国があるのはわかりますが、それは、どのように分布しているのでしょうか。

1.2.7.7 Fig 5. 2021年の世界の国のGDPの分布(1)

df_gdp %>% drop_na(gdp) %>% 
  filter(year == 2021) %>% filter(region != "Aggregates") %>%
  ggplot(aes(gdp)) + geom_histogram()

小さいところに集中していることがわかりますが、scale_x_log10() を加え、対数軸をとってみます。

\(log10(1000) = 3\), \(log10(1000000) = 6\), \(log10(1000000000) = 9\) などになります。

1.2.7.8 Fig 6. 2021年の世界の国のGDPの分布(2)

df_gdp %>% drop_na(gdp) %>% 
  filter(year == 2021) %>% filter(region != "Aggregates") %>%
  ggplot(aes(gdp)) + geom_histogram() + scale_x_log10()

幅を変更したり、分ける個数を変更するには binwidth = 0.5 や、bins = 20 を、geom_histogram() のかっこの中に入れます。

1.2.7.9 Fig 7. 2021年の世界の国のGDPの分布(3)

また、密度曲線に変えるには、geom_density を使います。

df_gdp %>% drop_na(gdp) %>% 
  filter(year == 2021) %>% filter(region != "Aggregates") %>%
  ggplot(aes(gdp)) + geom_density() + scale_x_log10()

1.2.7.10 Fig 8. 2021年の世界の国のGDPの分布(4)

これは、2021年のデータですが、density の変化を見てみます。alpha の値は透明度です。

df_gdp %>% drop_na(gdp) %>% 
  filter(year %in% c(1961, 1971, 1981, 1991, 2001, 2011, 2021)) %>%
  ggplot(aes(gdp, fill = factor(year))) + geom_density(alpha = 0.4) + scale_x_log10()

1.2.7.11 Fig 9. 2021年の世界の国のGDPの分布(5)

少しみにくいので、分けてみます。

df_gdp %>% drop_na(gdp) %>% 
  filter(year %in% c(1971, 1981, 1991, 2001, 2011, 2021)) %>%
  ggplot(aes(gdp, fill = factor(year))) + 
  geom_density() + scale_x_log10() + facet_wrap(~year)

1.2.7.12 Fig 10. 地域ごとの GDP の分布

いくつかのグループごとに分布をみてみることも可能です。それには、Boxplot が有効です。

df_gdp %>% drop_na(gdp) %>% filter(region != "Aggregates") %>%
  drop_na(region) %>% filter(year %in% c(2021)) %>%
  ggplot(aes(gdp, region, fill = region)) + 
  geom_boxplot() + scale_x_log10() + labs(y = "") + 
  theme(legend.position = "none")

1.2.7.13 Fig 11. 収入の多寡による分類ごとの GDP 分布

df_gdp %>% drop_na(gdp) %>% filter(region != "Aggregates") %>%
  drop_na(income) %>% filter(year %in% c(2021)) %>%
  mutate(level = factor(income, c("High income", "Upper middle income", "Lower middle income", "Low income"))) %>%
  ggplot(aes(gdp, level, fill = income)) + 
  geom_boxplot() + scale_x_log10() + labs(y = "") + 
  theme(legend.position = "none")

これからも、いろいろなことがわかりますね。

1.2.7.14 世界地図の準備

地図で、国の income level をみてみましょう。

library(maps)
gdp_short <- df_gdp %>% filter(year == 2021, region != "Aggregates") %>%
  select(iso2c, gdp, income)
map_world <- map_data('world')
map_gdp <- map_world %>% 
  mutate(iso2c = iso.alpha(region, n=2)) %>% 
  left_join(gdp_short, by = "iso2c") 
head(map_gdp)

1.2.7.15 Fig 12. Income Level による色分け地図

map_gdp %>% mutate(income_level = factor(income, levels = c("High income", "Upper middle income", "Lower middle income", "Low income", "Not classified", NA))) %>%
  ggplot() +
  geom_map(aes(long, lat, map_id = region, fill = income_level), map = map_world, col = "black", size = 0.1) 
Warning: Ignoring unknown aesthetics: x and y

1.2.7.16 Fig 13. GDP による色分け地図

map_gdp %>% 
  ggplot() +
  geom_map(aes(x=long, y=lat, map_id = region, fill = gdp), map = map_world, col = "black", size = 0.1) 
Warning: Ignoring unknown aesthetics: x and y

1.3 練習

  1. それぞれのグラフから、わかったこと、問いなどを列挙してみましょう。
  2. Fig 1 の Japan の部分を他の国や、グループ(World など)に変えてみてください。何がわかりますか。
  3. Fig 3 の iso2c で選択する、国を変更してください。何がわかりますか。
  4. Fig 4 または Fig 5 の iso2c の部分を他の国に変更してください。何がわかりますか。
  5. Fig 5 または Fig 6 の、区間の幅や、数を 変更してみてください。何がわかりますか。
  6. Fig 7, Fig 8, Fig 9 の年を変更してみてください。何がわかりますか。
  7. Fig 12, Fig 13 の年を変更してみてください。何がわかりますか。

1.4 まとめ

今回は、経済指標である、GDP を使いました。データサイエンスについて少しずつ、学んでいきます。

コードの説明は、簡単にしかしていませんから、理解するのは難しいと思いますが、いくつかのことは、ご理解いただけると思います。

  • それほど、長くはない、コードで、データを見ていく。R は対話型(interactive)のプログラミング言語と言われています。

  • コードに続けて、結果が表示されるので、コードと出力の対応が見やすい。また、コメントや説明も併記することができる。これは、RMarkdown という形式の中で、コードを書いていることによるものです。RMarkdown は、再現性(reproducibility)と、プログラム・コードの内容をコンピュータにわかるようにでなく、人間にもわかるように記述する(Literate Programming)を実現しています。

  • 視覚化(Visualization)によって、わかることが色々とある。また、視覚化の方法もたくさんあり、いろいろな見方をすることで、データについての理解が深まっていく。

  • 視覚化を通して、データを理解すること、問いを持ち、他の視覚化などを用いて、さらに、理解を深めることがたいせつ。

  • 理解したことを元にして、さらに、そのデータ、または、他のデータを使って、新たな発見をしていく。

統計的な指標も用いますが、それらによって、新しい知識を生み出すとも表現しますが、そのような営み全体が、データサイエンスの核をなす部分だと思います。

2 World Bank: WDI

世界銀行(World Bank)の WDI を使いました。どのようなものか確認しておきましょう。

2.1 世界銀行(World Bank

世界開発指標は、世界銀行が提供している、オープンデータの一つで、他にも、たくさんのデータを提供しています。また、オープンデータについて、世界銀行は、厳密な定義をしています。

2.1.1 オープンデータの定義(Open Data Defined

オープンデータという言葉は、厳密な意味を持っています。データまたはコンテンツは、出所が明示されオープンという性質が維持されれば、誰でも自由に利用、再利用、再配布できるものを言います。

  1. データは法的にオープンでなければなりません。つまり、パブリックドメインに置かれ、最小限の制限で自由に使用できなければなりません。

  2. データは技術的にオープンでなければなりません。つまり、誰でも自由に使える一般的なソフトウェアツールを使ってデータにアクセスし、機械で読み取ることが可読な電子フォーマットで提供されていなければならなりません。パスワードやファイアウォールによる制限を受けずに、公共のサーバーで、だれでもアクセスできなければなりません。また、オープンデータを見つけやすくするために、さまざまな組織がオープンデータカタログを作成し管理してく必要があります。

データはだれのものでしょうか? パブリックデータのパブリックとは?

2.2 世界開発指標(WDI)

  • World Development Indicators (WDI) : 世界銀行が開発に関する各国間比較可能なデータの集大成である1400の時系列指標(the World Bank’s premier compilation of cross-country comparable data on development; 1400 time series indicators)
    • テーマ別(Themes): 貧困と格差、人間、環境、経済、国家と市場、グローバルリンク集(Poverty and Inequality, People, Environment, Economy, States and Markets, Global Links)
    • オープンデータとデータバンク(Open Data & DataBank): Explore data, Query database
    • Bulk Download: Excel, CSV
    • API Documentation

2.2.1 世界のさまざまな課題

https://datatopics.worldbank.org/world-development-indicators/

  1. 貧困と不平等(Poverty and Inequality):貧困、繁栄、消費、所得分配
  2. 人々(People):人口動態、教育、労働、健康、ジェンダー
  3. 環境(Environment):農業、気候変動、エネルギー、生物多様性、水、衛生
  4. 経済(Economy):成長、経済構造、所得と貯蓄、貿易、労働生産性
  5. 国家と市場(States and Markets):ビジネス、株式市場、軍事、通信、輸送、テクノロジー
  6. グローバルリンク(Global Links):債務、貿易、援助への依存、難民、観光、移住

2.2.2 ダッシュボード・データの取得・データコード

さまざまな国際機関では、データを、Excel 形式や、CSV (Comma Separated Values)形式などで、提供する以外に、ダッシュボード形式で、グラフを生成するなどして、データを視覚化をある程度できるようにしています。さらに、コンピュータのアプリケーションでデータを直接取得できるように、API (Application Program Interface) を提供しています。

世界開発指標(WDI)は、これらを、すべて統一した形で提供しているために、非常に使いやすいデータベースになっています。また、上にリストしているように、1400余のさまざまなデータを提供しているために、最初に調べてみることをお勧めするデータベースです。

分析を考えると、Excel や、CSV でダウンロードして、それから、データを読み込むよりも、R で直接データを取得する方が、便利ですので、このコースでは、その方法を、説明しています。

データを探すことも、R の中ですることが可能ですが、データベースに慣れるためにも、WDI のホームページから、トピックを選択して、データを探し、説明も調べて、取得したいデータ・コードを調べることも非常に有効です。

いろいろなトピックに、どのような指標があるか調べて、興味のある、データ・コードをリストしてください。データの名前も同時に、記録しておくと良いでしょう。

2.3 世界銀行以外の国際機関のパブリックデータ

世界銀行以外にも、それぞれの機関がデータを提供しています。どれも、少しずつ使いやすくなってきています。少しずつ、いくつかのデータベースに、アクセスして、できれば、API の利用の仕方も、習得して、データを調べることに少しずつ慣れていっていただければと思います。

下のリストは、私が個人的に、何度か使ったことのある、データベースです。他にも、たくさんのデータベースがありますので、ぜひ、調べてみてください。

  • 国際連合 UNdata
  • 経済協力開発機構 OECD data
  • 世界格差データベース(World Inequality Database)WID
  • 欧州連合の統計局 Eurostat
  • データで見る私たちの世界 Our World in Data

なども、同様の、ダッシュボードを備えており、データの提供もしている。

日本では、

2.4 持続的開発目標(SDGs) データ

2.5 課題

世界開発指標(WDI)の、データで、調べてみたい データコードをいくつか見つけて、書き出してください。

3 R の パッケージ WDI の活用

WDI パッケージで、データをダウンロードしたり、探したり、詳細情報を得たりできます。

検索や、ダウンロード方法が理解できるように、例示してありますが、ざっと確認して、3.3 のテンプレートを利用すると、グラフを描くこともできます。

3.1 指標 WDI 検索

WDI のホームページで、データコードを調べることができますが、R の WDI のパッケージにも、WDIsearch() という関数があり、これを利用して、検索することが可能です。

string に、検索語を入れ、field には、name または、indicator とします。すると、indicator と、name を調べられます。

RStudio の右下の窓の、Help に、WDIsearch と入れると、使い方を示してくれます。

下の Code でも WDIsearch の Help を開いてくれます。

?WDIsearch

下にいくつか例を挙げてみましょう。

3.1.1 検索例 1(WDI名)

WDIsearch(string = "gdp", field = "name", short = TRUE, cache = NULL)
WDIsearch(string = "military expenditure", field = "name", short = TRUE, cache = NULL)

3.1.2 検索例 2(WDI)

WDIsearch(string = "NY.GDP.MKTP.CD", field = "indicator", short = TRUE, cache = NULL)

3.1.3 練習 2. - 検索(short)

名前で検索(“” の間に、(なるべく簡単な)検索文字列を入れてください。)

WDIsearch(string = "", field = "name", short = TRUE, cache = NULL)

Indicator で検索(“” の間に、調べたい indicator を入れてください。)

WDIsearch(string = "", field = "indicator", short = TRUE, cache = NULL)

3.1.4 詳しい情報を得るには

short = FALSE とします。時間がかかるので、検索は、Indicator と、名前などの情報をもったファイルを手元に持っておくことにします。

wdi_cache <- WDIcache()

右上の窓枠(pane)から、wdi_cache を探して、中身を見てみましょう。series と、country の二つのデータ・フレームからなっているリストです。三角印や、右から二番目の巻物のようなアイコンをクリックすると中身が見えます。

WDIsearch(string = "CPI Price", field = "name", short = FALSE, cache = NULL)

でも、下の、検索と同じ結果を得ますが、cache = wdi_cache を使うと、ダウンロードする情報を減らすことができるということです。

short = FALSE では、データの概要 (description) も得ることができます。

3.1.5 検索例 3(WDI名)

WDIsearch(string = "CPI Price", field = "name", short = FALSE, cache = wdi_cache)
  • CPTOTNSXN: CPI Price, nominal
    • The consumer price index reflects the change in prices for the average consumer of a constant basket of consumer goods. Data is not seasonally adjusted.

3.1.6 検索例 4(WDI)

WDIsearch(string = "NY.GDP.MKTP.KD.ZG", field = "indicator", short = FALSE, cache = wdi_cache)

3.1.7 練習 2 - 検索(long w/ cache)

string と、field を、ふたつとも入れてください。

WDIsearch(string = "", field = "", short = FALSE, cache = wdi_cache)

3.2 指標 WDI データのダウンロード

Indicator が決まったら、ダウンロードします。

右下の、Help Tab に WDI と入れると、使い方もわかります。

?WDI

3.2.1 ダウンロード例 1-1

df_gdp1 <- WDI(country = "all", indicator = "NY.GDP.MKTP.CD")
df_gdp1

3.2.2 ダウンロード例 1-2

df_gdp2 <- WDI(country = "all", indicator = c(gdp = "NY.GDP.MKTP.CD"))
df_gdp2

3.2.3 ダウンロード例 1-3

df_gdp3 <- WDI(country = "all", indicator = c(gdp = "NY.GDP.MKTP.CD"), extra=TRUE, cache=wdi_cache)
df_gdp3

3.2.4 ダウンロード例 1-4

df_gdp4 <- WDI(country = c("CN","GB","JP","IN","US","DE"), indicator = c(gdp = "NY.GDP.MKTP.CD"), extra=TRUE, cache=wdi_cache)
df_gdp4

3.2.4.1 ダウンロード例 2-1

  • NY.GDP.DEFL.KD.ZG: Inflation, GDP deflator (annual %)
  • CPTOTNSXN: CPI Price, nominal
df_gdp21 <- WDI(country = "all", 
                indicator = c(gdp_deflator = "NY.GDP.DEFL.KD.ZG", 
                              cpi_price = "CPTOTNSXN"), 
                extra=TRUE, cache=wdi_cache)
df_gdp21
str(df_gdp21)
'data.frame':   24238 obs. of  14 variables:
 $ country     : chr  "Advanced Economies" "Advanced Economies" "Advanced Economies" "Advanced Economies" ...
 $ iso2c       : chr  "AME" "AME" "AME" "AME" ...
 $ iso3c       : chr  "" "" "" "" ...
 $ year        : int  1987 1988 1989 1990 1991 1992 1993 1994 1995 1996 ...
 $ status      : chr  "" "" "" "" ...
 $ lastupdated : chr  "2020-07-27" "2020-07-27" "2020-07-27" "2020-07-27" ...
 $ gdp_deflator: num  NA NA NA NA NA NA NA NA NA NA ...
  ..- attr(*, "label")= chr "Inflation, GDP deflator (annual %)"
 $ cpi_price   : num  58.7 60.5 63 66 69.1 ...
  ..- attr(*, "label")= chr "CPI Price,not seas.adj,,,"
 $ region      : chr  NA NA NA NA ...
 $ capital     : chr  NA NA NA NA ...
 $ longitude   : chr  NA NA NA NA ...
 $ latitude    : chr  NA NA NA NA ...
 $ income      : chr  NA NA NA NA ...
 $ lending     : chr  NA NA NA NA ...
summary(df_gdp21)
   country             iso2c              iso3c                year     
 Length:24238       Length:24238       Length:24238       Min.   :1960  
 Class :character   Class :character   Class :character   1st Qu.:1982  
 Mode  :character   Mode  :character   Mode  :character   Median :1997  
                                                          Mean   :1995  
                                                          3rd Qu.:2009  
                                                          Max.   :2022  
                                                                        
    status          lastupdated         gdp_deflator         cpi_price     
 Length:24238       Length:24238       Min.   :  -98.704   Min.   :  0.00  
 Class :character   Class :character   1st Qu.:    2.315   1st Qu.: 55.95  
 Mode  :character   Mode  :character   Median :    5.256   Median : 83.28  
                                       Mean   :   25.299   Mean   : 84.18  
                                       3rd Qu.:   10.386   3rd Qu.:108.75  
                                       Max.   :26765.858   Max.   :551.25  
                                       NA's   :11881       NA's   :18676   
    region            capital           longitude           latitude        
 Length:24238       Length:24238       Length:24238       Length:24238      
 Class :character   Class :character   Class :character   Class :character  
 Mode  :character   Mode  :character   Mode  :character   Mode  :character  
                                                                            
                                                                            
                                                                            
                                                                            
    income            lending         
 Length:24238       Length:24238      
 Class :character   Class :character  
 Mode  :character   Mode  :character  
                                      
                                      
                                      
                                      

右上の窓枠の、Environment も見てみましょう。

3.3 可視化 Visualization

グラフ(Chart)を描いて視覚化しよう

3.3.1 グラフ 1

df_gdp4 %>% ggplot(aes(year, gdp, col=country)) + geom_line()

3.3.2 グラフ 2

df_gdp4 %>% drop_na(gdp) %>% 
  ggplot(aes(year, gdp, col=country)) + geom_line() +
  labs(title = paste("WDI - NY.GDP.MKTP.CD: ", "gdp"))

3.3.3 テンプレート Templates

3.3.3.1 一つの国についての、一つの指標(WDI)と、その略称から、折線グラフを作成

Line Plot with one indicator with abbreviation and one country

chosen_indicator <- "SL.UEM.TOTL.NE.ZS"
short_name <- "unemployment"
chosen_country <- "United States"
WDI(country = "all", indicator = c(short_name = chosen_indicator), extra=TRUE, cache=wdi_cache) %>%
  filter(country == chosen_country) %>% 
  ggplot(aes(year, short_name)) + geom_line() +
  labs(title = paste("WDI ", chosen_indicator, ": ", short_name, " - ", chosen_country),
       y = short_name)

3.3.3.2 一つの国についての、一つの指標(WDI)から、折線グラフを作成

Line Plot with one indicator and one country

chosen_indicator <- "SL.UEM.TOTL.NE.ZS"
chosen_country <- "United States"
WDI(country = "all", indicator = c(chosen_indicator = chosen_indicator), 
    extra=TRUE, cache=wdi_cache) %>%
  filter(country == chosen_country) %>% 
  ggplot(aes(year, chosen_indicator)) + geom_line() +
  labs(title = paste("WDI ", chosen_indicator, " - ", chosen_country), 
       y = chosen_indicator)

3.3.3.3 いくつかの国についての、一つの指標(WDI)と、その略称から、折線グラフを作成

Line Plot with one indicator with abbreviation and several countries

chosen_indicator <- "SL.UEM.TOTL.NE.ZS"
short_name <- "unemployment"
chosen_countries <- c("United States","United Kingdom", "Japan")
WDI(country = "all", indicator = c(short_name = chosen_indicator), extra=TRUE, cache=wdi_cache) %>% drop_na(short_name) %>% 
  filter(country %in% chosen_countries) %>% 
  ggplot(aes(year, short_name, col = country)) + geom_line() +
  labs(title = paste("WDI ", chosen_indicator, ": ", short_name), y = short_name)

3.3.3.4 一つの国についての、二つの指標(WDI)と、その略称から、折線グラフを作成

Line Plot with two indicators with abbreviation and one country

chosen_indicator_1 <- "NY.GDP.DEFL.KD.ZG"
short_name_1 <- "gdp_deflator"
chosen_indicator_2 <- "CPTOTSAXNZGY"
short_name_2 <- "cpi_price"
chosen_country <- "United States"
WDI(country = "all", indicator = c(short_name_1 = chosen_indicator_1, short_name_2 = chosen_indicator_2), extra=TRUE, cache=wdi_cache) %>% 
  filter(country == chosen_country) %>% 
  pivot_longer(c(short_name_1, short_name_2), names_to = "class", values_to = "value") %>% drop_na(value) %>%
  ggplot(aes(year, value, col = class)) + geom_line() +
  labs(title = paste("WDI ", chosen_indicator_1, ": ", short_name_1, "\n", chosen_indicator_2, ": ", short_name_2, " - ", chosen_country)) +
  scale_color_manual(labels = c(short_name_1, short_name_2), values = scales::hue_pal()(2))

chosen_indicator_1 <- "SL.TLF.CACT.MA.NE.ZS"
short_name_1 <- "male"
chosen_indicator_2 <- "SL.TLF.CACT.FE.NE.ZS"
short_name_2 <- "female"
chosen_country <- "United States"
WDI(country = "all", indicator = c(short_name_1 = chosen_indicator_1, short_name_2 = chosen_indicator_2), extra=TRUE, cache=wdi_cache) %>% 
  filter(country == chosen_country) %>% 
  pivot_longer(c(short_name_1, short_name_2), names_to = "class", values_to = "value") %>% drop_na(value) %>%
  ggplot(aes(year, value, col = class)) + geom_line() +
  labs(title = paste("WDI ", chosen_indicator_1, ": ", short_name_1, "\n", chosen_indicator_2, ": ", short_name_2, " - ", chosen_country)) +
  scale_color_manual(labels = c(short_name_1, short_name_2), values = scales::hue_pal()(2))

3.3.3.5 いくつかの国についての、二つの指標(WDI)と、その略称から、折線グラフを作成

Line Plot with two indicators with abbreviation and several countries

chosen_indicator_1 <- "NY.GDP.DEFL.KD.ZG"
short_name_1 <- "gdp_deflator"
chosen_indicator_2 <- "CPTOTSAXNZGY"
short_name_2 <- "cpi_price"
chosen_countries <- c("United States", "France", "Japan")
WDI(country = "all", indicator = c(short_name_1 = chosen_indicator_1, short_name_2 = chosen_indicator_2), extra=TRUE, cache=wdi_cache) %>% 
  filter(country %in% chosen_countries) %>% 
  pivot_longer(c(short_name_1, short_name_2), names_to = "class", values_to = "value") %>% drop_na(value) %>%
  ggplot(aes(year, value, linetype = class, col = country)) + geom_line() +
  labs(title = paste("WDI ", chosen_indicator_1, ": ", short_name_1, "\n", chosen_indicator_2, ": ", short_name_2)) +
  scale_linetype_manual(labels = c(short_name_1, short_name_2), values = c("solid", "dashed"))

chosen_indicator_1 <- "SL.TLF.CACT.MA.NE.ZS"
short_name_1 <- "male"
chosen_indicator_2 <- "SL.TLF.CACT.FE.NE.ZS"
short_name_2 <- "female"
chosen_countries <- c("United States", "France", "Japan")
WDI(country = "all", indicator = c(short_name_1 = chosen_indicator_1, short_name_2 = chosen_indicator_2), extra=TRUE, cache=wdi_cache) %>% 
  filter(country %in% chosen_countries) %>% 
  pivot_longer(c(short_name_1, short_name_2), names_to = "class", values_to = "value") %>% drop_na(value) %>%
  ggplot(aes(year, value, linetype = class, col = country)) + geom_line() +
  labs(title = paste("WDI ", chosen_indicator_1, ": ", short_name_1, "\n", chosen_indicator_2, ": ", short_name_2)) +
  scale_linetype_manual(labels = c(short_name_1, short_name_2), values = c("solid", "dashed"))

3.4 練習

上のテンプレートをコピーして、下に貼り付け、指標 indicator と、略称 short_name と、いくつかの国名 chosen_countries を、入れ替えて、試してみてください。

自分で課題を考え、データを選べることは、とても大切だということだと思います。

3.5 プロジェクト

他の WDI のデータで、はじめにの部分と、同様のことをしてみましょう。

  1. 最初に、gdp = "NY.GDP.MKTP.CD" としましたが、GNI per capita, Atlas method (current US$): NY.GNP.PCAP.CD に変えてみましょう。
df_gnppcap <- WDI(country = "all", 
              indicator = c(gnppcap = "NY.GNP.PCAP.CD"), 
              extra = TRUE)
  1. World Development Indicators のサイトの下にある、Data Themes(テーマ)から自分が調べたいテーマを選び、そのテーマから、データコードを取得して、同様の分析をしてみてください。データがあまりない場合もありますので、ある程度データが多いものを選択することをお勧めします。

  2. 可能なら、3 の内容も含めて、選択した、WDI について、調べてみましょう。

4 参考 - 今後の学習のために

4.1 RNotebook の活用

下のリンクを開き、右上の Code ボタンから、Download Rmd を選択すると、ダウンロードできますから、ダインロードしたものを、プロジェクト・フォールダーに移動またはコピーしてください。ダウンロードできないときは、Ctrl を押しながら、Download Rmd をクリックすると、Save As で保存できると思います。ブラウザーによって仕様が異なりますから、適切な方法を選んでください。

Windows でも、Mac でも提供されている、Google Chrome の場合には、Code ボタンから、ダンロードされるはずです。

4.3 練習問題 Posit Primers

Posit Primers https://posit.cloud/learn/primers

4.4 R w/ Chat GPT

  • RTutor: https://rtutor.ai
    • アカウントを作成せずに、ChatGPT を使った、R プログラミングを体験できます。
    • すでに読み込んである、データと、テンプレートが、あり日本語のテンプレートもあります。ChatGPT にコード作成を依頼するときは、英語の方が良いようです。
    • 手元の、PC からデータを読み込んで試すことも可能です。

Chat GPT などの、AI の利用に興味がある方は、このリンクを参照してください。

LS0tCnRpdGxlOiAi44Gv44GY44KB44Gm44Gu44OH44O844K/44O744K144Kk44Ko44Oz44K5IgphdXRob3I6ICLpiLTmnKjlr5vvvIhIaXJvc2hpIFN1enVrae+8iSIKZGF0ZTogIkxhc3QgVXBkYXRlZDogYHIgU3lzLkRhdGUoKWAiCm91dHB1dDoKICBpb3NsaWRlc19wcmVzZW50YXRpb246IAogICAgaGlnaGxpZ2h0OiB0YW5nbwogICAgd2lkZXNjcmVlbjogeWVzCiAgICBzbWFsbGVyOiB5ZXMKICBodG1sX25vdGVib29rOgogICAgdG9jOiB5ZXMKICAgIHRvY19mbG9hdDogeWVzCiAgICBoaWdobGlnaHQ6IHRhbmdvCiAgICB0aGVtZTogY2VydWxlYW4KICAgIG51bWJlcl9zZWN0aW9uczogeWVzCi0tLQojIOOBr+OBmOOCgeOBqwoKIyMg44OH44O844K/44K144Kk44Ko44Oz44K577yfCgrjg4fjg7zjgr/jgYvjgonmg4XloLHjgpLlvpfjgovjgajjgY3jgavjga/jgIHlpKfkvZPmrKHjga7jgojjgYbjgarmiYvpoIbjgpLjgajjgorjgb7jgZnjgIIKCjEuIOa6luWCmSBTZXR1cAoyLiDjg4fjg7zjgr/jgpLlj5blvpcgSW1wb3J0IGRhdGEKMy4g44OH44O844K/5qeL6YCg44Gu56K66KqNIFZpZXcgZGF0YQo0LiDlv4XopoHjgavlv5zjgZjjgabmlbTlvaIgVHJhbnNmb3JtIGRhdGEKNS4g6KaW6Kaa5YyWIFZpc3VhbGl6ZSBkYXRhCjYuIOODh+ODvOOCv+OCkueQhuinoyBVbmRlcnN0YW5kIGRhdGEKNy4g44Os44Od44O844OI44Gq44Gp44Gr44G+44Go44KB44KLIENvbW11bmljYXRlIGRhdGEKCiFbXShodHRwczovL2QzM3d1YnJma2kwbDY4LmNsb3VkZnJvbnQubmV0Lzc5NWMwMzliYTI1MjA0NTVkODMzYjQwMzRiZWZjOGNmMzYwYTcwYmEvNTU4YTUvZGlhZ3JhbXMvZGF0YS1zY2llbmNlLWV4cGxvcmUucG5nKQoK5ZWP44GE44KS44KC44Gh44OH44O844K/44KS5Y+W5b6X44GX44CB6KaW6Kaa5YyW44Gq44Gp44KS6YCa44GX44Gm44CB44OH44O844K/44KS55CG6Kej44GX44CB44GV44KJ44Gr5ZWP44GE44KS5rex44KB44KL44K144Kk44Kv44Or44GM44CB44OH44O844K/44K144Kk44Ko44Oz44K544Gu5qC444Gg44Go5oCd44GE44G+44GZ44CCCgo+IFIg44KS5L2/44Gj44Gf5YiG5p6Q44Gu5LiA44Gk44Gu5L6L44KS44CB6KaL44Gm6KGM44GN44G+44GZ44CC5LiA44Gk5LiA44Gk44Gu44Kz44O844OJ77yI44Kz44Oz44OU44Ol44O844K/44O744OX44Ot44Kw44Op44Og77yJ44Gu57Ch5Y2Y44Gq6Kqs5piO44Gv44CB5Yqg44GI44G+44GZ44GM44CB44GC44G+44KK44Gd44KM44Gr5o2J44KP44KM44Ga44CB44OH44O844K/44K144Kk44Ko44Oz44K544Go44Gv5L2V44GL44KS6ICD44GI44Gq44GM44KJ44CB6Zuw5Zuy5rCX44KS5ZGz44KP44Gj44Gm44GP44Gg44GV44GE44CCCgojIyBSIOOBruODkeODg+OCseODvOOCuOOCkua0u+eUqAoKIyMjIOa6luWCmSBTZXR1cAoK5LiW55WM6YqA6KGM77yIV29ybGQgQmFua++8ieOBruOAgeS4lueVjOmWi+eZuuaMh+aome+8iFdESTogV29ybGQgRGV2ZWxvcG1lbnQgSW5kaWNhdG9yc++8ieOBruS4gOOBpOOBruOAgUdEUO+8iEdyb3NzIERvbWVzdGljIFByb2R1Y3Qg5Zu95YaF57eP55Sf55Sj77yJ44Gu44OH44O844K/44GL44KJ5aeL44KB44G+44GZ44CCR0RQIOOBq+OCguS9leeorumhnuOBi+OBruWwuuW6puOBjOOBguOCiuOBvuOBmeOBjOOAgeasoeOBruOCguOBruOCkuimi+OBpuOBv+OBvuOBmeOAggoKKiBOWS5HRFAuTUtUUC5DRDogR0RQIChjdXJyZW50IFVTJCkKCk5ZLkdEUC5NS1RQLkNEIOOBr+OAgeODh+ODvOOCv+OCs+ODvOODieOBqOiogOOCj+OCjOOCi+OCguOBruOBp+OAgeS4lueVjOmWi+eZuuaMh+aome+8iFdESe+8ieOBq+OBr+OAgeS4gOOBpOOBpeOBpOaxuuOBvuOBo+OBpuOBhOOBvuOBmeOAggoKW1dvcmxkIERldmVsb3BtZW50IEluZGljYXRvcnNdKGh0dHBzOi8vZGF0YXRvcGljcy53b3JsZGJhbmsub3JnL3dvcmxkLWRldmVsb3BtZW50LWluZGljYXRvcnMvKSDjga7jgrXjgqTjg4jjga7kuIvjgavjgYLjgovjgIFEYXRhIFRoZW1lc++8iOODhuODvOODnu+8ieOBi+OCieODhuODvOODnuOCkumBuOaKnuOBl+OAgeS4i+OBq+OCueOCr+ODreODvOODq+OBmeOCi+OBqOOAgUNvZGUg44KS44G/44KL44GT44Go44GM44Gn44GN44G+44GZ44CC44Gh44Gq44G/44Gr44CB44GT44GT44Gn5Yip55So44GZ44KLIE5ZLkdEUC5NS1RQLkNEOiBHRFAgKGN1cnJlbnQgVVMkKSDjga/jgIHjg4bjg7zjg57jga4gRWNvbm9tee+8iOe1jOa4iO+8ieOBruOAgeS4gOeVquS4iuOBq+OBguOCiuOBvuOBmeOAggoK57WM5riI55So6Kqe44Gu6Iux6Kqe44Gv44KI44GP55+l44KJ44Gq44GE44Go44GE44GG5pa544Gv44CB44OW44Op44Km44K244O877yIRWRnZSwgR29vZ2xlIENocm9tZSwgU2FmYXJpIOOBquOBqe+8ieOBrue/u+ios+apn+iDveOCkuS9v+OBhuOBruOCguiJr+OBhOOBp+OBl+OCh+OBhuOAguOBn+OBoOOAgeOBneOBruODmuODvOOCuOOBruWvvuipseWei+OBruapn+iDve+8iGludGVyYWN0aXZlIGZ1bmN0aW9u77yJ44KS5Yip55So44GZ44KL44Go44GN44Gv44CB57+76Kiz5qmf6IO944KST0ZGIOOBq+OBmeOCi+W/heimgeOBjOOBguOCi+WgtOWQiOOCguOBguOCiuOBvuOBmeOBruOBp+OAgeazqOaEj+OBl+OBpuOBj+OBoOOBleOBhOOAggoKCgrjgqjjg6njg7zjg6Hjg4Pjgrvjg7zjgrjjgpLoqr/jgbnjgovjgajjgY3jgarjganjgavjgIHoi7Hoqp7jga7jgbvjgYbjgYzmg4XloLHjgYzjgZ/jgY/jgZXjgpPlvpfjgonjgozjgb7jgZnjgYvjgonjgIHoqIDoqp7jgpLjgIHoi7Hoqp7jgavlpInmm7TjgZfjgabjgYrjgY3jgb7jgZnjgIIKClIg44Gr44Gv44CBV0RJIOOBruODh+ODvOOCv+OCkuWPluW+l+OBmeOCiyBSIOOBruODhOODvOODq++8iOODkeODg+OCseODvOOCuO+8iWBXRElgIOOBjOOBguOCiuOBvuOBmeOBi+OCieOAgeOBneOCjOOCkuS9v+OBhOOBvuOBmeOAguOBvuOBn+OAgeODh+ODvOOCv+OCkuWPluOCiuaJseOBhuOBn+OCgeOBruWfuuacrOeahOOBquODhOODvOODq++8iOODkeODg+OCseODvOOCuO+8iWB0aWR5dmVyc2VgIOOCkuS9v+OBhOOBvuOBmeOBruOBp+OAgeasoeOBruOCs+ODvOODieOBp+OAgeOBk+OCjOOCieOCkuiqreOBv+i+vOOBv+OBvuOBmeOAggoKYGBge3J9ClN5cy5zZXRlbnYoTEFORyA9ICJlbiIpCmxpYnJhcnkodGlkeXZlcnNlKQpsaWJyYXJ5KFdESSkKYGBgCgrjg4fjg7zjgr/jgpLkv53lrZjjgZnjgovloLTmiYDjgpLkvZzmiJDjgZfjgabjgYrjgY/jgZPjgajjgpLjgYrli6fjgoHjgZfjgb7jgZnjgILkv53lrZjjgZfjgabjgYrjgY/jgajjgY3jga/jgIHjgZPjga7jg4fjgqPjg6zjgq/jg4jjg6rjgpLkvb/jgYTjgb7jgZnjgIIKCmBgYHtyIGV2YWw9RkFMU0V9CmRpci5jcmVhdGUoIi4vZGF0YSIpCmBgYAoKIyMjIOODh+ODvOOCv+WPluW+lyBJbXBvcnQgZGF0YQoK44OH44O844K/44KS5Y+W5b6X44GX44G+44GZ44CC5bCR44GX5pmC6ZaT44GM44GL44GL44KK44G+44GZ44CC5Y+W5b6X44GX44Gf44OH44O844K/44Gr44CBYGRmX2dkcGAg44Gq44Gp44Go44CB44KP44GL44KK44KE44GZ44GE5ZCN5YmN44KS44Gk44GR44G+44GZ44CCYGRmYCDjga8gYGRhdGEgZnJhbWVgIOOBrueVpeOBp+OAgVIg44Gn5qiZ5rqW55qE44Gq44OH44O844K/44Gu5b2i5byP44Gn44GZ44CCCgpgYGB7ciBjYWNoZT1UUlVFfQpkZl9nZHAgPC0gV0RJKGNvdW50cnkgPSAiYWxsIiwgCiAgICAgICAgICAgICAgaW5kaWNhdG9yID0gYyhnZHAgPSAiTlkuR0RQLk1LVFAuQ0QiKSwgCiAgICAgICAgICAgICAgZXh0cmEgPSBUUlVFKQpgYGAKCuOBk+OBruOCs+ODvOODieOBp+OAgeWFqOOBpuOBruWbveOBriBHRFAg44KS5Y+W5b6X44Gn44GN44G+44GZ44CCR0RQIOOBruWApOOBr+OAgWBOWS5HRFAuTUtUUC5DRGAg44Go44GE44GG5ZCN5YmN44Gu5YiX44Gr44GC44KK44G+44GZ44GM44CB6Kaa44GI44KE44GZ44GE44KI44GG44Gr44CBZ2RwIOOBqOOBhOOBhuWQjeWJjeOBq+WkieabtOOBl+OBpuOBiuOBjeOBvuOBmeOAgmBleHRyYSA9IFRSVUVgIOOBqOOBmeOCi+OBk+OBqOOBq+OCiOOBo+OBpuOAgeOBneOCjOOBnuOCjOOBruWbveOBq+OBpOOBhOOBpuOBruaDheWgseOBquOBqeOBjOi/veWKoOOBleOCjOOBvuOBmeOAggoKCgojIyMg44OH44O844K/5qeL6YCg44Gu56K66KqNCgrmnIDliJ3jga7mlbDooYzjgaDjgZHjgpLopovjgovjgavjga/jgIFgaGVhZChkZl9kZ3ApYCDjgajjgZfjgb7jgZnjgIIKCmBgYHtyfQpoZWFkKGRmX2dkcCkKYGBgCgoKCuODh+ODvOOCv+OBruani+mAoOOCkuimi+OCi+OBqOOBjeOBq+OBr+OAgWBzdHIoZGZfZ2RwKWAg44KC44KI44GP5L2/44KP44KM44G+44GZ44CC5LuK5bqm44Gv44CB5YiX44GM57im44Gr5Lim44KT44Gn6KGo56S644GV44KM44G+44GZ44CCCgpgYGB7cn0Kc3RyKGRmX2dkcCkKYGBgCgoKCuamguimgSAoYHN1bW1hcnkoZGZfZ2RwKWApIOOBi+OCieOCguOBguOCi+eoi+W6puOCj+OBi+OCiuOBvuOBmeOAggoKYGBge3J9CnN1bW1hcnkoZGZfZ2RwKSAKYGBgCgoKCuWbveOBruODquOCueODiOOCkuOBv+OBpuOBv+OBvuOBl+OCh+OBhuOAguOBqOOBpuOCgumVt+OBhOODquOCueODiOOBruS4reOBq+OBr+OAgeWcsOWfn+WQjeOCguWQq+OBvuOCjOOBpuOBhOOBvuOBmeOAggoKYGBge3J9CmRmX2dkcCAlPiUgZGlzdGluY3QoY291bnRyeSkgJT4lIHB1bGwoKQpgYGAKCgoK5LuK5Zue44Gv5LiL44Gu44KI44GG44Gr44CBYCU+JWDvvIjjg5HjgqTjg5fjgajlkbzjgbPjgb7jgZnvvIkg44Gn57mL44GS44Gm44Kz44O844OJ44KS5pu444GN44G+44GX44Gf44CCCgpgYGAKZGZfZ2RwICU+JSBkaXN0aW5jdChjb3VudHJ5KSAlPiUgcHVsbCgpCmBgYAoK5pyA5Yid44Gv44CB44OH44O844K/44CB44Gd44Gu5Lit44Gu44CB55Ww44Gq44KL5Zu944KS6YG45oqe44GX44Gm44CB5pu444GN5Ye644GX44Gm44GP44Gg44GV44GE44Go44GE44GG44KC44Gu44Gn44GZ44CCCgrjgZPjgozjga/jgIEKYGBgCnB1bGwoZGlzdGluY3QoZGZfZ2RwLCBjb3VudHJ5KSkKYGBgCuOBqOWQjOOBmOOBp+OBmeOAguOBqeOCk+OBqeOCk+OAgeOBi+OBo+OBk+OBruS4reOBq+WFpeOCjOWtkOOBq+OBquOBo+OBpuikh+mbkeOBq+OBquOCi+OBruOBp+OAgeS4gOOBpOS4gOOBpOOBruOCueODhuODg+ODl+OCkuOAgemghuOBq+abuOOBhOOBn+OCguOBruOBjOOAgeacgOWIneOBruOCguOBruOBq+OBquOCiuOBvuOBmeOAggoKYGBgCmRmX2dkcCAlPiUgaGVhZCgpCmRmX2dkcCAlPiUgc3RyKCkKYGBgCuOBquOBqeOCguWPr+iDveOBp+OBmeOAguOBi+OBo+OBk+OBruS4reOBq+acgOWIneOBq+WFpeOCi+OCguOBruOBjOebtOWJjeOBruOCguOBruOAgeOBk+OBk+OBp+OBr+OAgeODh+ODvOOCv+OBq+OBquOBo+OBpuOBhOOBvuOBmeOAggoKCgojIyMg5b+F6KaB44Gr5b+c44GY44Gm5pW05b2iIFRyYW5zZm9ybSBkYXRhCgrlpInmlbDjgYzlpJrjgYTjga7jgafjgIHml6XmnKzjga7pg6jliIbjgaDjgZEgYGZpbHRlcmAg44KS5L2/44Gj44Gm6YG45oqe44GX44G+44GZ44CCY291bnRyeSDjgYwgSmFwYW4g44Go5LiA6Ie044GZ44KL5aC05ZCI44Gu44G/44KS6YG45oqe44GZ44KL44Go44GN44Gv44CBYD09YCDjgpLkvb/jgYTjgb7jgZnjgILmlbDlgKTjgafjga/jgarjgYTjga7jgafjgIHlvJXnlKjnrKbjgpLjgaTjgZHjgb7jgZnjgILljYrop5LjgpLkvb/jgaPjgabjgY/jgaDjgZXjgYTjgIIKCmBgYHtyfQpkZl9nZHAgJT4lIGZpbHRlcihjb3VudHJ5ID09ICJKYXBhbiIpCmBgYAoKCgpgYGB7cn0KZGZfZ2RwICU+JSBmaWx0ZXIoY291bnRyeSA9PSAiSmFwYW4iKSAlPiUgaGVhZCgyKQpgYGAK77yS6KGM55uu44Gu44CBZ2RwIOOBruOAgTQuOTQwODc4ZSsxMiDjga/jgIFTY2llbnRpZmljIG5vdGF0aW9uIOOBqOiogOOCj+OCjOOCi+OCguOBruOBp+OAgQokJDQuOTQwODc4IFx0aW1lcyAxMF57MTJ9ID0gNCw5NDAsODg3LDgwMCwwMDAkJArjgpLmhI/lkbPjgZfjgb7jgZnjgIJgZSszYCDjga/ljYPvvIh0aG91c2FuZO+8ieOAgWBlKzZgIOOBr+eZvuS4h++8iG1pbGxpb27vvInjgIFgZSs5YCDjga/jgIExMOWEhO+8iGJpbGxpb27vvInjgIFgZSsxMmAg44Gv44CB5YWG77yIdHJpbGxpb27vvInjgafjgZnjgYvjgonjgIHml6XmnKzjga7jgIEyMDIxIOW5tOOBriBHRFAg44Gv44CB57SENeWFhuODieODq+OBqOOBquOCiuOBvuOBmeOAggoKCgojIyMg6KaW6Kaa5YyWIGRhdGEgdmlzdWFsaXphdGlvbgoKIyMjIyBGaWcgMS4g5pel5pys44GuR0RQIOOBrue1jOW5tOWkieWMluOCkuaKmOe3muOCsOODqeODle+8iGxpbmUgZ3JhcGjvvIkKCmBgYHtyfQpkZl9nZHAgJT4lIGZpbHRlcihjb3VudHJ5ID09ICJKYXBhbiIpICU+JQogIGdncGxvdChhZXMoeCA9IHllYXIsIHkgPSBnZHApKSArIGdlb21fbGluZSgpCmBgYAoKCgpgYGAKZGZfZ2RwICU+JSBmaWx0ZXIoY291bnRyeSA9PSAiSmFwYW4iKSAlPiUKICBnZ3Bsb3QoYWVzKHggPSB5ZWFyLCB5ID0gZ2RwKSkgKyBnZW9tX2xpbmUoKQpgYGAKCuaXpeacrOOCkumBuOaKnuOBl+OBn+OBqOOBjeOBq+OAgeOBneOCjOOBq+WQjeWJjeOCkuOBpOOBkeOBpuOBiuOBhOOBpuOAgeOBneOCjOOCkuS9v+OBhuOBk+OBqOOCguOBp+OBjeOBvuOBmeOBjOOAgeWQjeWJjeOBjOOBqeOCk+OBqeOCk+Wil+OBiOOCi+OBruOBp+OAgeOBneOCjOOBq+e2muOBkeOBpuOAgeOCs+ODvOODieOCkuabuOOBhOOBpuOBhOOBj+aWueazleOCkuOBqOOBo+OBpuOBhOOBvuOBmeOAggoKYGdncGxvdChhZXMoeCA9IHllYXIsIHkgPSBnZHApKSArIGdlb21fbGluZSgpYAoK44Gu6YOo5YiG44GM44CB44Kw44Op44OV44KS5o+P44GP6YOo5YiG44Gn44CB44CMeCDou7jjgpLjgIF5ZWFy44CBeSDou7jjgpLjgIFnZHAg44Go44GX44Gm44CB44Gd44KM44KS44CB5oqY57ea44Kw44Op44OV44Gn5o+P44GE44Gm44GP44Gg44GV44GE44CN44Go44GE44GG44Kz44O844OJ44Gn44GZ44CCCgpXYXJuaW5nOiBbMzg7NTsyMzhtUmVtb3ZlZCAxIHJvdyBjb250YWluaW5nIG1pc3NpbmcgdmFsdWVzCgrjgajooajnpLrjgZXjgozjgabjgYTjgb7jgZnjgILlgKTjgYzjgarjgYTlubTjgYzjgYLjgovjgZPjgajjgpLoqIDjgaPjgabjgYTjgb7jgZnjgIIyMDIy5bm044Gu44OH44O844K/44GM44Gq44GE44GT44Go44GM44KP44GL44Gj44Gm44GE44G+44GZ44GL44KJ44CB5pyA5Yid44GL44KJ5YmK6Zmk44GX44Gm44GT44GP44GT44Go44KC5Y+v6IO944Gn44GZ44CCCgoKCiMjIyDjg4fjg7zjgr/jga7nkIbop6MgVW5kZXJzdGFuZCBkYXRhCgroppbopprljJbjgavjgojjgaPjgabopovjgYjjgabjgY/jgovjgZPjgajjgYzjgYTjgY/jgaTjgoLjgYLjgorjgb7jgZnjga3jgILjganjgpPjgarjgZPjgajjgYzjgo/jgYvjgorjgb7jgZnjgYvjgILmsJfjgaXjgYTjgZ/jgZPjgajvvIhvYnNlcnZhdGlvbu+8ieOCkuOBguOBkuOBpuOBv+OBvuOBl+OCh+OBhuOAggoK44Kz44O844OJ44KS5o+P44GP44GT44Go44Gn44Gv44Gq44GP44CB44GT44Gu6YOo5YiG44GM44CB44OH44O844K/44K144Kk44Ko44Oz44K544Gu5qC444Gu6YOo5YiG44Gn44GZ44CC5rCX44Gl44GE44Gf44GT44Go44KS5YiX5oyZ44GX44Gm44G/44G+44GX44KH44GG44CCCgoKCiMjIyDjgZXjgb7jgZbjgb7jgaroppbopprljJYKCiMjIyMgRmlnIDIuIOWQhOW5tOOBlOOBqOOBruODh+ODvOOCv+OBruaVsAoKYHN1bW1hcnkoZGZfZ2RwKWAg44Gn44CB44OH44O844K/6Ieq5L2T44Gv44CBMTk2MOW5tOOBi+OCiTIwMjLlubTjgb7jgafjga7jgojjgYbjgafjgZnjgYzjgIHml6XmnKzjgoLjgIEyMDIy5bm044Gu44OH44O844K/44Gv44GC44KK44G+44Gb44KT44Gn44GX44Gf44GL44KJ44CB5bm044Gr44KI44Gj44Gm44CB44Gp44Gu56iL5bqm44OH44O844K/44GM44GC44KL44GL44CB6Kq/44G544Gm44G/44G+44GZ44CCCgpgYGB7cn0KZGZfZ2RwICU+JSBkcm9wX25hKGdkcCkgJT4lIGdncGxvdChhZXMoeCA9IHllYXIpKSArIGdlb21fYmFyKCkKYGBgCgoKCmBgYApkZl9nZHAgJT4lIGRyb3BfbmEoZ2RwKSAlPiUgZ2dwbG90KGFlcyh4ID0geWVhcikpICsgZ2VvbV9iYXIoKQpgYGAKCuODkOODvOODu+OCsOODqeODleOCkuS9v+OBhOOBvuOBmeOBjOOAgWBnZHBgIOOBruWApOOBjOOAgeasoOaQjeWApO+8iE5BOiBub3QgYXZhaWxhYmxl77yJ44Gu44OH44O844K/44KS5YmK6Zmk44GX44Gm44GL44KJ44CB44Kw44Op44OV44KS5o+P44GN44G+44GZ44CCCgojIyMjIDIwMjHlubTjga5HRFDjga7pmY3poIbjgafjga7ooajnpLrvvIjvvJHvvIkKCuacgOaWsOOBrjIwMjHlubTjga7jg4fjg7zjgr/jga/jgZnjgbnjgabjgYLjgovjgo/jgZHjgafjga/jgarjgZXjgZ3jgYbjgafjgZnjgYzjgIFgZ2RwYCDjga7lgKTjgYzlpKfjgY3jgYTpoIbjgavkuKbjgbnjgabjgb/jgb7jgZfjgofjgYbjgIIKCmBgYHtyfQpkZl9nZHAgJT4lIGZpbHRlcih5ZWFyID09IDIwMjEpICU+JSBkcm9wX25hKGdkcCkgJT4lIGFycmFuZ2UoZGVzYyhnZHApKQpgYGAKCgoKIyMjIyAyMDIx5bm044GuR0RQ44Gu6ZmN6aCG44Gn44Gu6KGo56S677yI77yS77yJCgrmnIDliJ3jgavjgIFXb3JsZCDjgajooajnpLrjgZXjgozjgIHjgrDjg6vjg7zjg5fjgoTjgIHjgqvjg4bjgrTjg6rjg7zjga7jg4fjg7zjgr/jgoLjgYLjgovjgojjgYbjgafjgZnjgYvjgonjgIHjgZ3jgozjgpLjgIHjgb7jgZrjgIHliYrpmaTjgZnjgovjgZPjgajjgYzlv4XopoHjgafjgZnjgIJgcmVnaW9uYCDjga7liJfjgpLopovjgovjgajjgIFXb3JsZCDjgarjganjga/jgIFBZ2dyZWdhdGVzIOOBqOOBquOBo+OBpuOBhOOCi+OBruOBp+OAgeOBneOBruOCiOOBhuOBquOCguOBruOCkuWJiumZpOOBmeOCjOOBsOOCiOOBleOBneOBhuOBp+OBmeOAguaVsOWApOOBruWkp+OBjeOBhOmghuOBq+S4puOBueOBn+OBhOOBruOBp+OAgWBkZXNjYCDpmY3poIbvvIhkZXNjZW5kaW5nIG9yZGVy77yJ44Gr44GX44G+44GZ44CCCgpgYGB7cn0KZGZfZ2RwICU+JSBmaWx0ZXIoeWVhciA9PSAyMDIxLCByZWdpb24gIT0gIkFnZ3JlZ2F0ZXMiKSAlPiUgCiAgZHJvcF9uYShnZHApICU+JSBhcnJhbmdlKGRlc2MoZ2RwKSkKYGBgCgoKCuOBk+OCjOOBr+OAgeOCsOODqeODleOBp+OBr+OBguOCiuOBvuOBm+OCk+OBjOOAgeOBk+OCjOOCguS4gOOBpOOBruimluimmuWMluOBqOOCguiAg+OBiOOCieOCjOOBquOBhOOBk+OBqOOBr+OBguOCiuOBvuOBm+OCk+OAggoK5LiK5L2N77yX44Kr5Zu944Gv44CBVW5pdGVkIFN0YXRlcywgQ2hpbmEsIEphcGFuLCBHZXJtYW55LCBJbmRpYSwgVW5pdGVkIEtpbmdkb20sIEZyYW5jZSDjgafjgYLjgovjgZPjgajjgYzjgo/jgYvjgorjgb7jgZfjgZ/jgII455Wq55uu44Gv44CBSXRhbHkg44Gn44GT44GT44G+44Gn44GM44CBR0RQIOOBjCAy5YWG44OJ44Or44KS6LaK44GX44Gm44GE44KL5Zu944Go44Gq44KK44G+44GZ44CCCgoKCiMjIyMgRmlnIDMuIDIwMjHlubTmmYLjga5HRFDkuIrkvY0344Kr5Zu944GuR0RQ57WM5bm05aSJ5YyWCgpgYGB7cn0KZGZfZ2RwICU+JSBmaWx0ZXIoaXNvMmMgJWluJSBjKCJVUyIsICJDTiIsICJKUCIsICJERSIsICJJTiIsICJHQiIsICJGUiIpKSAlPiUKICBnZ3Bsb3QoYWVzKHggPSB5ZWFyLCB5ID0gZ2RwLCBjb2wgPSBpc28yYykpICsgZ2VvbV9saW5lKCkKYGBgCgoKCmBgYApkZl9nZHAgJT4lIGZpbHRlcihpc28yYyAlaW4lIGMoIlVTIiwgIkNOIiwgIkpQIiwgIkRFIiwgIklOIiwgIkdCIiwgIkZSIikpICU+JQogIGdncGxvdChhZXMoeCA9IHllYXIsIHkgPSBnZHAsIGNvbCA9IGlzbzJjKSkgKyBnZW9tX2xpbmUoKQpgYGAKCuOBk+OBk+OBp+OBr+OAgeacgOWIneOBq+OAgWBmaWx0ZXJgIOOCkuS9v+OBo+OBpuOAgTfjgqvlm73jga7jg4fjg7zjgr/jgpLpgbjmip7jgZfjgabjgYTjgb7jgZnjgIIK44Gd44Gu44Go44GN44Gr44Gv44CBYCVpbiVgIOOBqOOBl+OBpuOAgeWbveWQjeOCkuOAgWNvbWJpbmUg44GZ44KL44Go44GE44GG44GE44G/44Gn44CBYGMoKWAg44Go44Gy44Go44G+44Go44KB44Gr44GX44G+44GZ44CC5pWw5a2X44Gn44Gv44Gq44GP44CB5paH5a2X44Gq44Gu44Gn44CB5byV55So56ym44Gn5Zuy44KT44Gn44GE44G+44GZ44CC44GT44Gu5aC05ZCI44Gv44CBc2luZ2xlIHF1b3RlIOOBp+OCguani+OBhOOBvuOBm+OCk+OBjOOAgeWNiuinkuOCkuS9v+OBo+OBpuOBj+OBoOOBleOBhOOAggoK44GT44Gu44Kw44Op44OV44GL44KJ44Gv44CB44Gp44Gu44KI44GG44Gq44GT44Go44GM44KP44GL44KK44G+44GZ44GL44CC5rCX44Gl44GE44Gf44GT44Go44KS5pu444GE44Gm44G/44G+44GX44KH44GG44CCCgrjgoLjgYblsJHjgZfjgIHjgZPjga7jgojjgYbjgarjgrDjg6njg5XjgpLjgb/jgabjgb/jgZ/jgYTjgajjgYTjgYbjgojjgYbjgarjgIHjg6Hjg6LjgoLlpKfliIfjgafjgZnjgIIKCgoKIyMjIyBGaWcgNC4g5LiW55WM44GuR0RQIOOBq+OBiuOBkeOCi+WJsuWQiO+8iO+8ke+8iQoKYGBge3J9CmRmX2dkcCAlPiUgCiAgZmlsdGVyKHJlZ2lvbiAhPSAiQWdncmVnYXRlcyIpICU+JSBkcm9wX25hKGdkcCkgJT4lIAogIGdyb3VwX2J5KHllYXIpICU+JSBtdXRhdGUoZ2RwX3JhdGlvID0gZ2RwL3N1bShnZHApKSAlPiUgdW5ncm91cCgpICU+JQogIGZpbHRlcihpc28yYyAlaW4lIGMoIlVTIiwgIkNOIiwgIkpQIiwgIkRFIiwgIklOIiwgIkdCIiwgIkZSIikpICAlPiUKICBnZ3Bsb3QoYWVzKHggPSB5ZWFyLCB5ID0gZ2RwX3JhdGlvLCBmaWxsID0gaXNvMmMpKSArIGdlb21fYXJlYSgpICsKICBnZW9tX2xpbmUoY29sID0gImJsYWNrIiwgcG9zaXRpb24gPSAic3RhY2siLCBsaW5ld2lkdGggPSAwLjMpICsgCiAgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscyA9IHNjYWxlczo6cGVyY2VudF9mb3JtYXQoYWNjdXJhY3kgPSAxKSkKYGBgCgoKCuOBvuOBmuOAgeS4i+OBrumDqOWIhuOBjOaWsOOBl+OBhOOBp+OBmeOBjOOAgeOBk+OBk+OBp+OBr+OAgeW5tOavjuOBq+OCsOODq+ODvOODl+OBq+OBl+OBpuOAgeOBneOBruS4iuOBp+OAgeaWsOOBl+OBhCBgZGdwX3JhdGlvYCDjgajjgYTjgYblkI3liY3jga7liJfjgpLov73liqDjgZfjgIHjgZ3jga4gZ2RwIOOBruWApOOCkuOAgWdkcCDlkIjoqIjjgaflibLjgaPjgabjgYTjgb7jgZnjgILjgZnjgarjgo/jgaHjgIHkuJbnlYzjga7jgIFHRFAg44Gr44GK44GR44KL5Ymy5ZCI44GM6KiI566X44GV44KM44Gm44GE44G+44GZ44CCCgpgYGAKICBncm91cF9ieSh5ZWFyKSAlPiUgbXV0YXRlKGdkcF9yYXRpbyA9IGdkcC9zdW0oZ2RwKSkgJT4lIHVuZ3JvdXAoKSAlPiUKYGBgCgrkuIvjga7pg6jliIbjgafjga/jgIFgZ2VvbV9hcmVhYCDjgpLkvb/jgaPjgabjgIFgZmlsbD1pc28yY2Ag44Gr44KI44KK44CBYGlzbzJjYCDjgZTjgajjgavjgIHpgZXjgYboibLjgpLloZfjgaPjgabjgIFwb3NpdGlvbiA9ICJzdGFjayIg44Gr44KI44KK44CB56mN44G/5LiK44GS5Z6L44Gu44CB44Kw44Op44OV44KS5o+P44GN44CB5aKD55uu44GM44KP44GL44KK44KE44GZ44GE44KI44GG44Gr44CBMC4zICDjga7lpKrjgZXjga7pu5Ljga7nt5rjgpLmj4/jgYTjgabjgY/jgaDjgZXjgYTjgILjgb7jgZ/jgIF5IOi7uOOBr+OAgeWwj+aVsOeCueS7peS4i+OCkuecgeOBhOOBn+ODkeODvOOCu+ODs+ODiOihqOekuuOBq+WkieOBiOOBpuOBj+OBoOOBleOBhOOAguOBqOOBhOOBhuOCs+ODvOODieOBp+OBmeOAggoKYGBgCiAgZ2dwbG90KGFlcyh4ID0geWVhciwgeSA9IGdkcF9yYXRpbywgZmlsbCA9IGlzbzJjKSkgKyBnZW9tX2FyZWEoKSArCiAgZ2VvbV9saW5lKGNvbCA9ICJibGFjayIsIHBvc2l0aW9uID0gInN0YWNrIiwgbGluZXdpZHRoID0gMC4zKSArIAogIHNjYWxlX3lfY29udGludW91cyhsYWJlbHMgPSBzY2FsZXM6OnBlcmNlbnRfZm9ybWF0KGFjY3VyYWN5ID0gMSkpCmBgYAoKIyMjIyBGaWcgNC4g5LiW55WM44GuR0RQIOOBq+OBiuOBkeOCi+WJsuWQiO+8iO+8ku+8iQoK44GT44KM44Gv44CB5LiK44GL44KJ44CBaXNvMmMg44GuIOOCouODq+ODleOCoeODmeODg+ODiOOBrumghueVquOBq+OBquOBo+OBpuOBhOOBvuOBmeOBjOOAgeepjeOBv+S4iuOBkuOBrumghuW6j+OCkuWkieabtOOBmeOCi+OBk+OBqOOCguOBp+OBjeOBvuOBmeOAggoKYGBge3J9CmRmX2dkcCAlPiUgCiAgZmlsdGVyKHJlZ2lvbiAhPSAiQWdncmVnYXRlcyIpICU+JSBkcm9wX25hKGdkcCkgJT4lIAogIGdyb3VwX2J5KHllYXIpICU+JSBtdXRhdGUoZ2RwX3JhdGlvID0gZ2RwL3N1bShnZHApKSAlPiUgdW5ncm91cCgpICU+JQogIGZpbHRlcihpc28yYyAlaW4lIGMoIlVTIiwgIkNOIiwgIkpQIiwgIkRFIiwgIklOIiwgIkdCIiwgIkZSIikpICAlPiUKICBtdXRhdGUoaXNvMmNvID0gZmFjdG9yKGlzbzJjLCBsZXZlbHMgPSBjKCJJTiIsICJDTiIsICJGUiIsICJHQiIsICJERSIsICJKUCIsICJVUyIpKSkgJT4lCiAgZ2dwbG90KGFlcyh4ID0geWVhciwgeSA9IGdkcF9yYXRpbywgZmlsbCA9IGlzbzJjbykpICsgZ2VvbV9hcmVhKCkgKwogIGdlb21fbGluZShjb2wgPSAiYmxhY2siLCBwb3NpdGlvbiA9ICJzdGFjayIsIGxpbmV3aWR0aCA9IDAuMykgKyAKICBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzID0gc2NhbGVzOjpwZXJjZW50X2Zvcm1hdChhY2N1cmFjeSA9IDEpKQpgYGAKCgoK44GT44KM44KJ44Gv44CB5LiW55WM5YWo5L2T44GuIEdQVCDjgavjgYrjgZHjgovlibLlkIjjgafjgZnjgIIKCuOBqeOBruOCiOOBhuOBquOBk+OBqOOBjOOCj+OBi+OCiuOBvuOBmeOBi+OAggoK5Li76KaB5Zu944Gn44CBNjAl44CcNzAlIOOCkuWNoOOCgeOBpuOBhOOCi+OBk+OBqOOBjOOCj+OBi+OCiuOBvuOBmeOAguOBneOCjOOBnuOCjOOBruWbveOChOOAgeW5vuOBpOOBi+OBruWbveOBruW9semfv+WKm+OCguOAgeOBguOCi+eoi+W6puOBv+OCi+OBk+OBqOOBjOOBp+OBjeOCi+OCiOOBhuOBq+imi+OBiOOBvuOBmeOAggoK5rCX44Gl44GE44Gf44GT44Go44CB55aR5ZWP44Gr5oCd44Gj44Gf44GT44Go44Gq44Gp44KS44CB5pu444GN5Ye644GX44Gm44G/44Gm44GP44Gg44GV44GE44CCCgpHRFAg44GM5aSn44GN44Gq5Zu944Go44CB5bCP44GV44Gq5Zu944GM44GC44KL44Gu44Gv44KP44GL44KK44G+44GZ44GM44CB44Gd44KM44Gv44CB44Gp44Gu44KI44GG44Gr5YiG5biD44GX44Gm44GE44KL44Gu44Gn44GX44KH44GG44GL44CCCgoKCiMjIyMgRmlnIDUuIDIwMjHlubTjga7kuJbnlYzjga7lm73jga5HRFDjga7liIbluIPvvIjvvJHvvIkKCmBgYHtyfQpkZl9nZHAgJT4lIGRyb3BfbmEoZ2RwKSAlPiUgCiAgZmlsdGVyKHllYXIgPT0gMjAyMSkgJT4lIGZpbHRlcihyZWdpb24gIT0gIkFnZ3JlZ2F0ZXMiKSAlPiUKICBnZ3Bsb3QoYWVzKGdkcCkpICsgZ2VvbV9oaXN0b2dyYW0oKQpgYGAKCgoK5bCP44GV44GE44Go44GT44KN44Gr6ZuG5Lit44GX44Gm44GE44KL44GT44Go44GM44KP44GL44KK44G+44GZ44GM44CBYHNjYWxlX3hfbG9nMTAoKWAg44KS5Yqg44GI44CB5a++5pWw6Lu444KS44Go44Gj44Gm44G/44G+44GZ44CCCgokbG9nMTAoMTAwMCkgPSAzJCwgJGxvZzEwKDEwMDAwMDApID0gNiQsICRsb2cxMCgxMDAwMDAwMDAwKSA9IDkkIOOBquOBqeOBq+OBquOCiuOBvuOBmeOAggoKCgoKIyMjIyBGaWcgNi4gMjAyMeW5tOOBruS4lueVjOOBruWbveOBrkdEUOOBruWIhuW4g++8iO+8ku+8iQoKYGBge3J9CmRmX2dkcCAlPiUgZHJvcF9uYShnZHApICU+JSAKICBmaWx0ZXIoeWVhciA9PSAyMDIxKSAlPiUgZmlsdGVyKHJlZ2lvbiAhPSAiQWdncmVnYXRlcyIpICU+JQogIGdncGxvdChhZXMoZ2RwKSkgKyBnZW9tX2hpc3RvZ3JhbSgpICsgc2NhbGVfeF9sb2cxMCgpCmBgYAoK5bmF44KS5aSJ5pu044GX44Gf44KK44CB5YiG44GR44KL5YCL5pWw44KS5aSJ5pu044GZ44KL44Gr44GvIGBiaW53aWR0aCA9IDAuNWAg44KE44CBYGJpbnMgPSAyMGAg44KS44CBYGdlb21faGlzdG9ncmFtKClgIOOBruOBi+OBo+OBk+OBruS4reOBq+WFpeOCjOOBvuOBmeOAggoKCgojIyMjIEZpZyA3LiAyMDIx5bm044Gu5LiW55WM44Gu5Zu944GuR0RQ44Gu5YiG5biD77yI77yT77yJCgrjgb7jgZ/jgIHlr4bluqbmm7Lnt5rjgavlpInjgYjjgovjgavjga/jgIFgZ2VvbV9kZW5zaXR5YCDjgpLkvb/jgYTjgb7jgZnjgIIKCmBgYHtyfQpkZl9nZHAgJT4lIGRyb3BfbmEoZ2RwKSAlPiUgCiAgZmlsdGVyKHllYXIgPT0gMjAyMSkgJT4lIGZpbHRlcihyZWdpb24gIT0gIkFnZ3JlZ2F0ZXMiKSAlPiUKICBnZ3Bsb3QoYWVzKGdkcCkpICsgZ2VvbV9kZW5zaXR5KCkgKyBzY2FsZV94X2xvZzEwKCkKYGBgCgoKCiMjIyMgRmlnIDguIDIwMjHlubTjga7kuJbnlYzjga7lm73jga5HRFDjga7liIbluIPvvIjvvJTvvIkKCuOBk+OCjOOBr+OAgTIwMjHlubTjga7jg4fjg7zjgr/jgafjgZnjgYzjgIFkZW5zaXR5IOOBruWkieWMluOCkuimi+OBpuOBv+OBvuOBmeOAgmFscGhhIOOBruWApOOBr+mAj+aYjuW6puOBp+OBmeOAggoKYGBge3J9CmRmX2dkcCAlPiUgZHJvcF9uYShnZHApICU+JSAKICBmaWx0ZXIoeWVhciAlaW4lIGMoMTk2MSwgMTk3MSwgMTk4MSwgMTk5MSwgMjAwMSwgMjAxMSwgMjAyMSkpICU+JQogIGdncGxvdChhZXMoZ2RwLCBmaWxsID0gZmFjdG9yKHllYXIpKSkgKyBnZW9tX2RlbnNpdHkoYWxwaGEgPSAwLjQpICsgc2NhbGVfeF9sb2cxMCgpCmBgYAoKCgojIyMjIEZpZyA5LiAyMDIx5bm044Gu5LiW55WM44Gu5Zu944GuR0RQ44Gu5YiG5biD77yI77yV77yJCgrlsJHjgZfjgb/jgavjgY/jgYTjga7jgafjgIHliIbjgZHjgabjgb/jgb7jgZnjgIIKCmBgYHtyfQpkZl9nZHAgJT4lIGRyb3BfbmEoZ2RwKSAlPiUgCiAgZmlsdGVyKHllYXIgJWluJSBjKDE5NzEsIDE5ODEsIDE5OTEsIDIwMDEsIDIwMTEsIDIwMjEpKSAlPiUKICBnZ3Bsb3QoYWVzKGdkcCwgZmlsbCA9IGZhY3Rvcih5ZWFyKSkpICsgCiAgZ2VvbV9kZW5zaXR5KCkgKyBzY2FsZV94X2xvZzEwKCkgKyBmYWNldF93cmFwKH55ZWFyKQpgYGAKCgoKIyMjIyBGaWcgMTAuIOWcsOWfn+OBlOOBqOOBriBHRFAg44Gu5YiG5biDCgrjgYTjgY/jgaTjgYvjga7jgrDjg6vjg7zjg5fjgZTjgajjgavliIbluIPjgpLjgb/jgabjgb/jgovjgZPjgajjgoLlj6/og73jgafjgZnjgILjgZ3jgozjgavjga/jgIFCb3hwbG90IOOBjOacieWKueOBp+OBmeOAggoKYGBge3J9CmRmX2dkcCAlPiUgZHJvcF9uYShnZHApICU+JSBmaWx0ZXIocmVnaW9uICE9ICJBZ2dyZWdhdGVzIikgJT4lCiAgZHJvcF9uYShyZWdpb24pICU+JSBmaWx0ZXIoeWVhciAlaW4lIGMoMjAyMSkpICU+JQogIGdncGxvdChhZXMoZ2RwLCByZWdpb24sIGZpbGwgPSByZWdpb24pKSArIAogIGdlb21fYm94cGxvdCgpICsgc2NhbGVfeF9sb2cxMCgpICsgbGFicyh5ID0gIiIpICsgCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKQpgYGAKCgoKIyMjIyBGaWcgMTEuIOWPjuWFpeOBruWkmuWvoeOBq+OCiOOCi+WIhumhnuOBlOOBqOOBriBHRFAg5YiG5biDCgpgYGB7cn0KZGZfZ2RwICU+JSBkcm9wX25hKGdkcCkgJT4lIGZpbHRlcihyZWdpb24gIT0gIkFnZ3JlZ2F0ZXMiKSAlPiUKICBkcm9wX25hKGluY29tZSkgJT4lIGZpbHRlcih5ZWFyICVpbiUgYygyMDIxKSkgJT4lCiAgbXV0YXRlKGxldmVsID0gZmFjdG9yKGluY29tZSwgYygiSGlnaCBpbmNvbWUiLCAiVXBwZXIgbWlkZGxlIGluY29tZSIsICJMb3dlciBtaWRkbGUgaW5jb21lIiwgIkxvdyBpbmNvbWUiKSkpICU+JQogIGdncGxvdChhZXMoZ2RwLCBsZXZlbCwgZmlsbCA9IGluY29tZSkpICsgCiAgZ2VvbV9ib3hwbG90KCkgKyBzY2FsZV94X2xvZzEwKCkgKyBsYWJzKHkgPSAiIikgKyAKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpCmBgYAoK44GT44KM44GL44KJ44KC44CB44GE44KN44GE44KN44Gq44GT44Go44GM44KP44GL44KK44G+44GZ44Gt44CCCgojIyMjIOS4lueVjOWcsOWbs+OBrua6luWCmQoK5Zyw5Zuz44Gn44CB5Zu944GuIGluY29tZSBsZXZlbCDjgpLjgb/jgabjgb/jgb7jgZfjgofjgYbjgIIKCmBgYHtyIGNhY2hlPVRSVUV9CmxpYnJhcnkobWFwcykKZ2RwX3Nob3J0IDwtIGRmX2dkcCAlPiUgZmlsdGVyKHllYXIgPT0gMjAyMSwgcmVnaW9uICE9ICJBZ2dyZWdhdGVzIikgJT4lCiAgc2VsZWN0KGlzbzJjLCBnZHAsIGluY29tZSkKbWFwX3dvcmxkIDwtIG1hcF9kYXRhKCd3b3JsZCcpCm1hcF9nZHAgPC0gbWFwX3dvcmxkICU+JSAKICBtdXRhdGUoaXNvMmMgPSBpc28uYWxwaGEocmVnaW9uLCBuPTIpKSAlPiUgCiAgbGVmdF9qb2luKGdkcF9zaG9ydCwgYnkgPSAiaXNvMmMiKSAKaGVhZChtYXBfZ2RwKQpgYGAKCiMjIyMgRmlnIDEyLiBJbmNvbWUgTGV2ZWwg44Gr44KI44KL6Imy5YiG44GR5Zyw5ZuzCgpgYGB7ciBjYWNoZSA9IFRSVUV9Cm1hcF9nZHAgJT4lIG11dGF0ZShpbmNvbWVfbGV2ZWwgPSBmYWN0b3IoaW5jb21lLCBsZXZlbHMgPSBjKCJIaWdoIGluY29tZSIsICJVcHBlciBtaWRkbGUgaW5jb21lIiwgIkxvd2VyIG1pZGRsZSBpbmNvbWUiLCAiTG93IGluY29tZSIsICJOb3QgY2xhc3NpZmllZCIsIE5BKSkpICU+JQogIGdncGxvdCgpICsKICBnZW9tX21hcChhZXMobG9uZywgbGF0LCBtYXBfaWQgPSByZWdpb24sIGZpbGwgPSBpbmNvbWVfbGV2ZWwpLCBtYXAgPSBtYXBfd29ybGQsIGNvbCA9ICJibGFjayIsIHNpemUgPSAwLjEpIApgYGAKCiMjIyMgRmlnIDEzLiBHRFAg44Gr44KI44KL6Imy5YiG44GR5Zyw5ZuzCgpgYGB7ciBjYWNoZSA9IFRSVUV9Cm1hcF9nZHAgJT4lIAogIGdncGxvdCgpICsKICBnZW9tX21hcChhZXMoeD1sb25nLCB5PWxhdCwgbWFwX2lkID0gcmVnaW9uLCBmaWxsID0gZ2RwKSwgbWFwID0gbWFwX3dvcmxkLCBjb2wgPSAiYmxhY2siLCBzaXplID0gMC4xKSAKYGBgCgojIyDnt7Tnv5IKCjEuIOOBneOCjOOBnuOCjOOBruOCsOODqeODleOBi+OCieOAgeOCj+OBi+OBo+OBn+OBk+OBqOOAgeWVj+OBhOOBquOBqeOCkuWIl+aMmeOBl+OBpuOBv+OBvuOBl+OCh+OBhuOAggoyLiBGaWcgMSDjga7jgIBKYXBhbiDjga7pg6jliIbjgpLku5bjga7lm73jgoTjgIHjgrDjg6vjg7zjg5fvvIhXb3JsZCDjgarjganvvInjgavlpInjgYjjgabjgb/jgabjgY/jgaDjgZXjgYTjgILkvZXjgYzjgo/jgYvjgorjgb7jgZnjgYvjgIIKMy4gRmlnIDMg44GuIGlzbzJjIOOBp+mBuOaKnuOBmeOCi+OAgeWbveOCkuWkieabtOOBl+OBpuOBj+OBoOOBleOBhOOAguS9leOBjOOCj+OBi+OCiuOBvuOBmeOBi+OAggo0LiBGaWcgNCDjgb7jgZ/jga8gRmlnIDUg44GuIGlzbzJjIOOBrumDqOWIhuOCkuS7luOBruWbveOBq+WkieabtOOBl+OBpuOBj+OBoOOBleOBhOOAguS9leOBjOOCj+OBi+OCiuOBvuOBmeOBi+OAggo1LiBGaWcgNSDjgb7jgZ/jga8gRmlnIDYg44Gu44CB5Yy66ZaT44Gu5bmF44KE44CB5pWw44KSIOWkieabtOOBl+OBpuOBv+OBpuOBj+OBoOOBleOBhOOAguS9leOBjOOCj+OBi+OCiuOBvuOBmeOBi+OAggo2LiBGaWcgNywgRmlnIDgsIEZpZyA5IOOBruW5tOOCkuWkieabtOOBl+OBpuOBv+OBpuOBj+OBoOOBleOBhOOAguS9leOBjOOCj+OBi+OCiuOBvuOBmeOBi+OAggo3LiBGaWcgMTIsIEZpZyAxMyDjga7lubTjgpLlpInmm7TjgZfjgabjgb/jgabjgY/jgaDjgZXjgYTjgILkvZXjgYzjgo/jgYvjgorjgb7jgZnjgYvjgIIKCiMjIOOBvuOBqOOCgQoK5LuK5Zue44Gv44CB57WM5riI5oyH5qiZ44Gn44GC44KL44CBR0RQIOOCkuS9v+OBhOOBvuOBl+OBn+OAguODh+ODvOOCv+OCteOCpOOCqOODs+OCueOBq+OBpOOBhOOBpuWwkeOBl+OBmuOBpOOAgeWtpuOCk+OBp+OBhOOBjeOBvuOBmeOAggoK44Kz44O844OJ44Gu6Kqs5piO44Gv44CB57Ch5Y2Y44Gr44GX44GL44GX44Gm44GE44G+44Gb44KT44GL44KJ44CB55CG6Kej44GZ44KL44Gu44Gv6Zuj44GX44GE44Go5oCd44GE44G+44GZ44GM44CB44GE44GP44Gk44GL44Gu44GT44Go44Gv44CB44GU55CG6Kej44GE44Gf44Gg44GR44KL44Go5oCd44GE44G+44GZ44CCCgoqIOOBneOCjOOBu+OBqeOAgemVt+OBj+OBr+OBquOBhOOAgeOCs+ODvOODieOBp+OAgeODh+ODvOOCv+OCkuimi+OBpuOBhOOBj+OAglIg44Gv5a++6Kmx5Z6L77yIaW50ZXJhY3RpdmXvvInjga7jg5fjg63jgrDjg6njg5/jg7PjgrDoqIDoqp7jgajoqIDjgo/jgozjgabjgYTjgb7jgZnjgIIKCiog44Kz44O844OJ44Gr57aa44GR44Gm44CB57WQ5p6c44GM6KGo56S644GV44KM44KL44Gu44Gn44CB44Kz44O844OJ44Go5Ye65Yqb44Gu5a++5b+c44GM6KaL44KE44GZ44GE44CC44G+44Gf44CB44Kz44Oh44Oz44OI44KE6Kqs5piO44KC5L216KiY44GZ44KL44GT44Go44GM44Gn44GN44KL44CC44GT44KM44Gv44CBUk1hcmtkb3duIOOBqOOBhOOBhuW9ouW8j+OBruS4reOBp+OAgeOCs+ODvOODieOCkuabuOOBhOOBpuOBhOOCi+OBk+OBqOOBq+OCiOOCi+OCguOBruOBp+OBmeOAglJNYXJrZG93biDjga/jgIHlho3nj77mgKfvvIhyZXByb2R1Y2liaWxpdHnvvInjgajjgIHjg5fjg63jgrDjg6njg6Djg7vjgrPjg7zjg4njga7lhoXlrrnjgpLjgrPjg7Pjg5Tjg6Xjg7zjgr/jgavjgo/jgYvjgovjgojjgYbjgavjgafjgarjgY/jgIHkurrplpPjgavjgoLjgo/jgYvjgovjgojjgYbjgavoqJjov7DjgZnjgovvvIhMaXRlcmF0ZSBQcm9ncmFtbWluZ++8ieOCkuWun+ePvuOBl+OBpuOBhOOBvuOBmeOAggoKKiDoppbopprljJbvvIhWaXN1YWxpemF0aW9u77yJ44Gr44KI44Gj44Gm44CB44KP44GL44KL44GT44Go44GM6Imy44CF44Go44GC44KL44CC44G+44Gf44CB6KaW6Kaa5YyW44Gu5pa55rOV44KC44Gf44GP44GV44KT44GC44KK44CB44GE44KN44GE44KN44Gq6KaL5pa544KS44GZ44KL44GT44Go44Gn44CB44OH44O844K/44Gr44Gk44GE44Gm44Gu55CG6Kej44GM5rex44G+44Gj44Gm44GE44GP44CCCgoqIOimluimmuWMluOCkumAmuOBl+OBpuOAgeODh+ODvOOCv+OCkueQhuino+OBmeOCi+OBk+OBqOOAgeWVj+OBhOOCkuaMgeOBoeOAgeS7luOBruimluimmuWMluOBquOBqeOCkueUqOOBhOOBpuOAgeOBleOCieOBq+OAgeeQhuino+OCkua3seOCgeOCi+OBk+OBqOOBjOOBn+OBhOOBm+OBpOOAggoKKiDnkIbop6PjgZfjgZ/jgZPjgajjgpLlhYPjgavjgZfjgabjgIHjgZXjgonjgavjgIHjgZ3jga7jg4fjg7zjgr/jgIHjgb7jgZ/jga/jgIHku5bjga7jg4fjg7zjgr/jgpLkvb/jgaPjgabjgIHmlrDjgZ/jgarnmbropovjgpLjgZfjgabjgYTjgY/jgIIKCue1seioiOeahOOBquaMh+aomeOCgueUqOOBhOOBvuOBmeOBjOOAgeOBneOCjOOCieOBq+OCiOOBo+OBpuOAgeaWsOOBl+OBhOefpeitmOOCkueUn+OBv+WHuuOBmeOBqOOCguihqOePvuOBl+OBvuOBmeOBjOOAgeOBneOBruOCiOOBhuOBquWWtuOBv+WFqOS9k+OBjOOAgeODh+ODvOOCv+OCteOCpOOCqOODs+OCueOBruaguOOCkuOBquOBmemDqOWIhuOBoOOBqOaAneOBhOOBvuOBmeOAggoKIyBXb3JsZCBCYW5rOiBXREkKCuS4lueVjOmKgOihjO+8iFdvcmxkIEJhbmvvvInjga4gV0RJIOOCkuS9v+OBhOOBvuOBl+OBn+OAguOBqeOBruOCiOOBhuOBquOCguOBruOBi+eiuuiqjeOBl+OBpuOBiuOBjeOBvuOBl+OCh+OBhuOAggoKIyMg5LiW55WM6YqA6KGM77yIW1dvcmxkIEJhbmtdKGh0dHBzOi8vd3d3LndvcmxkYmFuay5vcmcvZW4vaG9tZSnvvIkKCiogW+S4lueVjOmKgOihjOOCquODvOODl+ODs+ODh+ODvOOCv10oaHR0cHM6Ly9kYXRhLndvcmxkYmFuay5vcmcpCiogW+ODh+ODvOOCv+OCq+OCv+ODreOCsF0oaHR0cHM6Ly9kYXRhY2F0YWxvZy53b3JsZGJhbmsub3JnL2hvbWUpCiogW+S4lueVjOmWi+eZuuaMh+aome+8iFdESe+8iV0oaHR0cHM6Ly9kYXRhdG9waWNzLndvcmxkYmFuay5vcmcvd29ybGQtZGV2ZWxvcG1lbnQtaW5kaWNhdG9ycy8pCgrkuJbnlYzplovnmbrmjIfmqJnjga/jgIHkuJbnlYzpioDooYzjgYzmj5DkvpvjgZfjgabjgYTjgovjgIHjgqrjg7zjg5fjg7Pjg4fjg7zjgr/jga7kuIDjgaTjgafjgIHku5bjgavjgoLjgIHjgZ/jgY/jgZXjgpPjga7jg4fjg7zjgr/jgpLmj5DkvpvjgZfjgabjgYTjgb7jgZnjgILjgb7jgZ/jgIHjgqrjg7zjg5fjg7Pjg4fjg7zjgr/jgavjgaTjgYTjgabjgIHkuJbnlYzpioDooYzjga/jgIHljrPlr4bjgarlrprnvqnjgpLjgZfjgabjgYTjgb7jgZnjgIIKCiMjIyDjgqrjg7zjg5fjg7Pjg4fjg7zjgr/jga7lrprnvqnvvIhbT3BlbiBEYXRhIERlZmluZWRdKGh0dHA6Ly9vcGVuZGF0YXRvb2xraXQud29ybGRiYW5rLm9yZy9lbi9lc3NlbnRpYWxzLmh0bWwp77yJCgrjgqrjg7zjg5fjg7Pjg4fjg7zjgr/jgajjgYTjgYboqIDokYnjga/jgIHljrPlr4bjgarmhI/lkbPjgpLmjIHjgaPjgabjgYTjgb7jgZnjgILjg4fjg7zjgr/jgb7jgZ/jga/jgrPjg7Pjg4bjg7Pjg4Tjga/jgIHlh7rmiYDjgYzmmI7npLrjgZXjgozjgqrjg7zjg5fjg7PjgajjgYTjgYbmgKfos6rjgYzntq3mjIHjgZXjgozjgozjgbDjgIHoqrDjgafjgoLoh6rnlLHjgavliKnnlKjjgIHlho3liKnnlKjjgIHlho3phY3luIPjgafjgY3jgovjgoLjga7jgpLoqIDjgYTjgb7jgZnjgIIKCjEuIOODh+ODvOOCv+OBr+azleeahOOBq+OCquODvOODl+ODs+OBp+OBquOBkeOCjOOBsOOBquOCiuOBvuOBm+OCk+OAguOBpOOBvuOCiuOAgeODkeODluODquODg+OCr+ODieODoeOCpOODs+OBq+e9ruOBi+OCjOOAgeacgOWwj+mZkOOBruWItumZkOOBp+iHqueUseOBq+S9v+eUqOOBp+OBjeOBquOBkeOCjOOBsOOBquOCiuOBvuOBm+OCk+OAggoKMi4g44OH44O844K/44Gv5oqA6KGT55qE44Gr44Kq44O844OX44Oz44Gn44Gq44GR44KM44Gw44Gq44KK44G+44Gb44KT44CC44Gk44G+44KK44CB6Kqw44Gn44KC6Ieq55Sx44Gr5L2/44GI44KL5LiA6Iis55qE44Gq44K944OV44OI44Km44Kn44Ki44OE44O844Or44KS5L2/44Gj44Gm44OH44O844K/44Gr44Ki44Kv44K744K544GX44CB5qmf5qKw44Gn6Kqt44G/5Y+W44KL44GT44Go44GM5Y+v6Kqt44Gq6Zu75a2Q44OV44Kp44O844Oe44OD44OI44Gn5o+Q5L6b44GV44KM44Gm44GE44Gq44GR44KM44Gw44Gq44KJ44Gq44KK44G+44Gb44KT44CC44OR44K544Ov44O844OJ44KE44OV44Kh44Kk44Ki44Km44Kp44O844Or44Gr44KI44KL5Yi26ZmQ44KS5Y+X44GR44Ga44Gr44CB5YWs5YWx44Gu44K144O844OQ44O844Gn44CB44Gg44KM44Gn44KC44Ki44Kv44K744K544Gn44GN44Gq44GR44KM44Gw44Gq44KK44G+44Gb44KT44CC44G+44Gf44CB44Kq44O844OX44Oz44OH44O844K/44KS6KaL44Gk44GR44KE44GZ44GP44GZ44KL44Gf44KB44Gr44CB44GV44G+44GW44G+44Gq57WE57mU44GM44Kq44O844OX44Oz44OH44O844K/44Kr44K/44Ot44Kw44KS5L2c5oiQ44GX566h55CG44GX44Gm44GP5b+F6KaB44GM44GC44KK44G+44GZ44CCCgo8Y2VudGVyPjxmb250IHNpemU9IjMiPuODh+ODvOOCv+OBr+OBoOOCjOOBruOCguOBruOBp+OBl+OCh+OBhuOBiz8gIOODkeODluODquODg+OCr+ODh+ODvOOCv+OBruODkeODluODquODg+OCr+OBqOOBr++8nzwvZm9udD48L2NlbnRlcj4KCiMjIOS4lueVjOmWi+eZuuaMh+aome+8iFdESe+8iQoKKiBbV29ybGQgRGV2ZWxvcG1lbnQgSW5kaWNhdG9ycyAoV0RJKV0oaHR0cHM6Ly9kYXRhdG9waWNzLndvcmxkYmFuay5vcmcvd29ybGQtZGV2ZWxvcG1lbnQtaW5kaWNhdG9ycy8pIDog5LiW55WM6YqA6KGM44GM6ZaL55m644Gr6Zai44GZ44KL5ZCE5Zu96ZaT5q+U6LyD5Y+v6IO944Gq44OH44O844K/44Gu6ZuG5aSn5oiQ44Gn44GC44KLMTQwMOOBruaZguezu+WIl+aMh+aome+8iHRoZSBXb3JsZCBCYW5r4oCZcyBwcmVtaWVyIGNvbXBpbGF0aW9uIG9mIGNyb3NzLWNvdW50cnkgY29tcGFyYWJsZSBkYXRhIG9uIGRldmVsb3BtZW50OyAxNDAwIHRpbWUgc2VyaWVzIGluZGljYXRvcnPvvIkKICAtIOODhuODvOODnuWIpe+8iFRoZW1lc++8iTog6LKn5Zuw44Go5qC85beu44CB5Lq66ZaT44CB55Kw5aKD44CB57WM5riI44CB5Zu95a6244Go5biC5aC044CB44Kw44Ot44O844OQ44Or44Oq44Oz44Kv6ZuG77yIUG92ZXJ0eSBhbmQgSW5lcXVhbGl0eSwgUGVvcGxlLCBFbnZpcm9ubWVudCwgRWNvbm9teSwgU3RhdGVzIGFuZCBNYXJrZXRzLCBHbG9iYWwgTGlua3PvvIkKICAtIOOCquODvOODl+ODs+ODh+ODvOOCv+OBqOODh+ODvOOCv+ODkOODs+OCr++8iE9wZW4gRGF0YSAmIERhdGFCYW5r77yJOiBFeHBsb3JlIGRhdGEsIFF1ZXJ5IGRhdGFiYXNlCiAgLSBCdWxrIERvd25sb2FkOiBFeGNlbCwgQ1NWCiAgLSBBUEkgRG9jdW1lbnRhdGlvbgogIAojIyMg5LiW55WM44Gu44GV44G+44GW44G+44Gq6Kqy6aGMCgpodHRwczovL2RhdGF0b3BpY3Mud29ybGRiYW5rLm9yZy93b3JsZC1kZXZlbG9wbWVudC1pbmRpY2F0b3JzLwoKMS4g6LKn5Zuw44Go5LiN5bmz562J77yIUG92ZXJ0eSBhbmQgSW5lcXVhbGl0ee+8ie+8muiyp+WbsOOAgee5geaghOOAgea2iOiyu+OAgeaJgOW+l+WIhumFjQoyLiDkurrjgIXvvIhQZW9wbGXvvInvvJrkurrlj6Pli5XmhYvjgIHmlZnogrLjgIHlirTlg43jgIHlgaXlurfjgIHjgrjjgqfjg7Pjg4Djg7wKMy4g55Kw5aKD77yIRW52aXJvbm1lbnTvvInvvJrovrLmpa3jgIHmsJflgJnlpInli5XjgIHjgqjjg43jg6vjgq7jg7zjgIHnlJ/nianlpJrmp5jmgKfjgIHmsLTjgIHooZvnlJ8KNC4g57WM5riI77yIRWNvbm9tee+8ie+8muaIkOmVt+OAgee1jOa4iOani+mAoOOAgeaJgOW+l+OBqOiyr+iThOOAgeiyv+aYk+OAgeWKtOWDjeeUn+eUo+aApwo1LiDlm73lrrbjgajluILloLTvvIhTdGF0ZXMgYW5kIE1hcmtldHPvvInvvJrjg5Pjgrjjg43jgrnjgIHmoKrlvI/luILloLTjgIHou43kuovjgIHpgJrkv6HjgIHovLjpgIHjgIHjg4bjgq/jg47jg63jgrjjg7wKNi4g44Kw44Ot44O844OQ44Or44Oq44Oz44Kv77yIR2xvYmFsIExpbmtz77yJ77ya5YK15YuZ44CB6LK/5piT44CB5o+05Yqp44G444Gu5L6d5a2Y44CB6Zuj5rCR44CB6Kaz5YWJ44CB56e75L2PCgojIyMg44OA44OD44K344Ol44Oc44O844OJ44O744OH44O844K/44Gu5Y+W5b6X44O744OH44O844K/44Kz44O844OJCgrjgZXjgb7jgZbjgb7jgarlm73pmpvmqZ/plqLjgafjga/jgIHjg4fjg7zjgr/jgpLjgIFFeGNlbCDlvaLlvI/jgoTjgIFDU1YgKENvbW1hIFNlcGFyYXRlZCBWYWx1ZXPvvInlvaLlvI/jgarjganjgafjgIHmj5DkvpvjgZnjgovku6XlpJbjgavjgIHjg4Djg4Pjgrfjg6Xjg5zjg7zjg4nlvaLlvI/jgafjgIHjgrDjg6njg5XjgpLnlJ/miJDjgZnjgovjgarjganjgZfjgabjgIHjg4fjg7zjgr/jgpLoppbopprljJbjgpLjgYLjgovnqIvluqbjgafjgY3jgovjgojjgYbjgavjgZfjgabjgYTjgb7jgZnjgILjgZXjgonjgavjgIHjgrPjg7Pjg5Tjg6Xjg7zjgr/jga7jgqLjg5fjg6rjgrHjg7zjgrfjg6fjg7Pjgafjg4fjg7zjgr/jgpLnm7TmjqXlj5blvpfjgafjgY3jgovjgojjgYbjgavjgIFBUEkgKEFwcGxpY2F0aW9uIFByb2dyYW0gSW50ZXJmYWNlKSDjgpLmj5DkvpvjgZfjgabjgYTjgb7jgZnjgIIKCuS4lueVjOmWi+eZuuaMh+aome+8iFdESe+8ieOBr+OAgeOBk+OCjOOCieOCkuOAgeOBmeOBueOBpue1seS4gOOBl+OBn+W9ouOBp+aPkOS+m+OBl+OBpuOBhOOCi+OBn+OCgeOBq+OAgemdnuW4uOOBq+S9v+OBhOOChOOBmeOBhOODh+ODvOOCv+ODmeODvOOCueOBq+OBquOBo+OBpuOBhOOBvuOBmeOAguOBvuOBn+OAgeS4iuOBq+ODquOCueODiOOBl+OBpuOBhOOCi+OCiOOBhuOBq+OAgTE0MDDkvZnjga7jgZXjgb7jgZbjgb7jgarjg4fjg7zjgr/jgpLmj5DkvpvjgZfjgabjgYTjgovjgZ/jgoHjgavjgIHmnIDliJ3jgavoqr/jgbnjgabjgb/jgovjgZPjgajjgpLjgYrli6fjgoHjgZnjgovjg4fjg7zjgr/jg5njg7zjgrnjgafjgZnjgIIKCuWIhuaekOOCkuiAg+OBiOOCi+OBqOOAgUV4Y2VsIOOChOOAgUNTViDjgafjg4Djgqbjg7Pjg63jg7zjg4njgZfjgabjgIHjgZ3jgozjgYvjgonjgIHjg4fjg7zjgr/jgpLoqq3jgb/ovrzjgoDjgojjgorjgoLjgIFSIOOBp+ebtOaOpeODh+ODvOOCv+OCkuWPluW+l+OBmeOCi+aWueOBjOOAgeS+v+WIqeOBp+OBmeOBruOBp+OAgeOBk+OBruOCs+ODvOOCueOBp+OBr+OAgeOBneOBruaWueazleOCkuOAgeiqrOaYjuOBl+OBpuOBhOOBvuOBmeOAggoK44OH44O844K/44KS5o6i44GZ44GT44Go44KC44CBUiDjga7kuK3jgafjgZnjgovjgZPjgajjgYzlj6/og73jgafjgZnjgYzjgIHjg4fjg7zjgr/jg5njg7zjgrnjgavmhaPjgozjgovjgZ/jgoHjgavjgoLjgIFXREkg44Gu44Ob44O844Og44Oa44O844K444GL44KJ44CB44OI44OU44OD44Kv44KS6YG45oqe44GX44Gm44CB44OH44O844K/44KS5o6i44GX44CB6Kqs5piO44KC6Kq/44G544Gm44CB5Y+W5b6X44GX44Gf44GE44OH44O844K/44O744Kz44O844OJ44KS6Kq/44G544KL44GT44Go44KC6Z2e5bi444Gr5pyJ5Yq544Gn44GZ44CCCgrjgYTjgo3jgYTjgo3jgarjg4jjg5Tjg4Pjgq/jgavjgIHjganjga7jgojjgYbjgarmjIfmqJnjgYzjgYLjgovjgYvoqr/jgbnjgabjgIHoiIjlkbPjga7jgYLjgovjgIHjg4fjg7zjgr/jg7vjgrPjg7zjg4njgpLjg6rjgrnjg4jjgZfjgabjgY/jgaDjgZXjgYTjgILjg4fjg7zjgr/jga7lkI3liY3jgoLlkIzmmYLjgavjgIHoqJjpjLLjgZfjgabjgYrjgY/jgajoia/jgYTjgafjgZfjgofjgYbjgIIKCgojIyDkuJbnlYzpioDooYzku6XlpJbjga7lm73pmpvmqZ/plqLjga7jg5Hjg5bjg6rjg4Pjgq/jg4fjg7zjgr8KCuS4lueVjOmKgOihjOS7peWkluOBq+OCguOAgeOBneOCjOOBnuOCjOOBruapn+mWouOBjOODh+ODvOOCv+OCkuaPkOS+m+OBl+OBpuOBhOOBvuOBmeOAguOBqeOCjOOCguOAgeWwkeOBl+OBmuOBpOS9v+OBhOOChOOBmeOBj+OBquOBo+OBpuOBjeOBpuOBhOOBvuOBmeOAguWwkeOBl+OBmuOBpOOAgeOBhOOBj+OBpOOBi+OBruODh+ODvOOCv+ODmeODvOOCueOBq+OAgeOCouOCr+OCu+OCueOBl+OBpuOAgeOBp+OBjeOCjOOBsOOAgUFQSSDjga7liKnnlKjjga7ku5XmlrnjgoLjgIHnv5LlvpfjgZfjgabjgIHjg4fjg7zjgr/jgpLoqr/jgbnjgovjgZPjgajjgavlsJHjgZfjgZrjgaTmhaPjgozjgabjgYTjgaPjgabjgYTjgZ/jgaDjgZHjgozjgbDjgajmgJ3jgYTjgb7jgZnjgIIKCuS4i+OBruODquOCueODiOOBr+OAgeengeOBjOWAi+S6uueahOOBq+OAgeS9leW6puOBi+S9v+OBo+OBn+OBk+OBqOOBruOBguOCi+OAgeODh+ODvOOCv+ODmeODvOOCueOBp+OBmeOAguS7luOBq+OCguOAgeOBn+OBj+OBleOCk+OBruODh+ODvOOCv+ODmeODvOOCueOBjOOBguOCiuOBvuOBmeOBruOBp+OAgeOBnOOBsuOAgeiqv+OBueOBpuOBv+OBpuOBj+OBoOOBleOBhOOAggoKKiDlm73pmpvpgKPlkIjjgIBbVU5kYXRhXShodHRwczovL2RhdGEudW4ub3JnKQoqIOe1jOa4iOWNlOWKm+mWi+eZuuapn+ani+OAgFtPRUNEIGRhdGFdKGh0dHBzOi8vZGF0YS5vZWNkLm9yZynjgIEKKiDkuJbnlYzmoLzlt67jg4fjg7zjgr/jg5njg7zjgrnvvIhXb3JsZCBJbmVxdWFsaXR5IERhdGFiYXNl77yJW1dJRF0oaHR0cHM6Ly93aWQud29ybGQp44CBCiog5qyn5bee6YCj5ZCI44Gu57Wx6KiI5bGA44CAW0V1cm9zdGF0XShodHRwczovL2VjLmV1cm9wYS5ldS9ldXJvc3RhdCnjgIEKKiDjg4fjg7zjgr/jgafopovjgovnp4HjgZ/jgaHjga7kuJbnlYzjgIBbT3VyIFdvcmxkIGluIERhdGFdKGh0dHBzOi8vb3Vyd29ybGRpbmRhdGEub3JnKQoK44Gq44Gp44KC44CB5ZCM5qeY44Gu44CB44OA44OD44K344Ol44Oc44O844OJ44KS5YKZ44GI44Gm44GK44KK44CB44OH44O844K/44Gu5o+Q5L6b44KC44GX44Gm44GE44KL44CCCgo8cD4K5pel5pys44Gn44Gv44CBCgoqIFtlLVN0YXRdKGh0dHBzOi8vd3d3LmUtc3RhdC5nby5qcC8p44CBCiogW+ODgOODg+OCt+ODpeODnOODvOODiV0oaHR0cHM6Ly9kYXNoYm9hcmQuZS1zdGF0LmdvLmpwKQoKIyMg5oyB57aa55qE6ZaL55m655uu5qiZ77yIU0RHc++8iSDjg4fjg7zjgr8KCiog5LiW55WM6YqA6KGM77yaaHR0cHM6Ly9kYXRhYmFuay53b3JsZGJhbmsub3JnL3NvdXJjZS9zdXN0YWluYWJsZS1kZXZlbG9wbWVudC1nb2Fscy0oc2RncykKKiDlm73pgKPvvJpodHRwczovL3Vuc3RhdHMudW4ub3JnL3NkZ3MvZGF0YXBvcnRhbC9kYXRhYmFzZQoqIOODh+ODvOOCv+OBp+imi+OCi+engeOBn+OBoeOBruS4lueVjO+8mk91ciBXb3JsZCBpbiBEYXRhIFNHRCBUcmFja2VyOiBodHRwczovL3NkZy10cmFja2VyLm9yZy8KKiBTREcgSW5kZXg6IGh0dHBzOi8vZGFzaGJvYXJkcy5zZGdpbmRleC5vcmcvbWFwCgojIyDoqrLpoYwKCuS4lueVjOmWi+eZuuaMh+aome+8iFdESe+8ieOBruOAgeODh+ODvOOCv+OBp+OAgeiqv+OBueOBpuOBv+OBn+OBhCDjg4fjg7zjgr/jgrPjg7zjg4njgpLjgYTjgY/jgaTjgYvopovjgaTjgZHjgabjgIHmm7jjgY3lh7rjgZfjgabjgY/jgaDjgZXjgYTjgIIKCgojIFIg44GuIOODkeODg+OCseODvOOCuCBXREkg44Gu5rS755SoCgpgV0RJYCDjg5Hjg4PjgrHjg7zjgrjjgafjgIHjg4fjg7zjgr/jgpLjg4Djgqbjg7Pjg63jg7zjg4njgZfjgZ/jgorjgIHmjqLjgZfjgZ/jgorjgIHoqbPntLDmg4XloLHjgpLlvpfjgZ/jgorjgafjgY3jgb7jgZnjgIIKCuaknOe0ouOChOOAgeODgOOCpuODs+ODreODvOODieaWueazleOBjOeQhuino+OBp+OBjeOCi+OCiOOBhuOBq+OAgeS+i+ekuuOBl+OBpuOBguOCiuOBvuOBmeOBjOOAgeOBluOBo+OBqOeiuuiqjeOBl+OBpuOAgTMuMyDjga7jg4bjg7Pjg5fjg6zjg7zjg4jjgpLliKnnlKjjgZnjgovjgajjgIHjgrDjg6njg5XjgpLmj4/jgY/jgZPjgajjgoLjgafjgY3jgb7jgZnjgIIKCiMjIOaMh+aomSBXREkg5qSc57SiCgpXREkg44Gu44Ob44O844Og44Oa44O844K444Gn44CB44OH44O844K/44Kz44O844OJ44KS6Kq/44G544KL44GT44Go44GM44Gn44GN44G+44GZ44GM44CBUiDjga4gV0RJIOOBruODkeODg+OCseODvOOCuOOBq+OCguOAgWBXRElzZWFyY2goKWAg44Go44GE44GG6Zai5pWw44GM44GC44KK44CB44GT44KM44KS5Yip55So44GX44Gm44CB5qSc57Si44GZ44KL44GT44Go44GM5Y+v6IO944Gn44GZ44CCCgpgc3RyaW5nYCDjgavjgIHmpJzntKLoqp7jgpLlhaXjgozjgIFgZmllbGRgIOOBq+OBr+OAgW5hbWUg44G+44Gf44Gv44CBaW5kaWNhdG9yIOOBqOOBl+OBvuOBmeOAguOBmeOCi+OBqOOAgWluZGljYXRvciDjgajjgIFuYW1lIOOCkuiqv+OBueOCieOCjOOBvuOBmeOAggoKUlN0dWRpbyDjga7lj7PkuIvjga7nqpPjga7jgIFIZWxwIOOBq+OAgVdESXNlYXJjaCDjgajlhaXjgozjgovjgajjgIHkvb/jgYTmlrnjgpLnpLrjgZfjgabjgY/jgozjgb7jgZnjgIIKCuS4i+OBriBDb2RlIOOBp+OCguOAgFdESXNlYXJjaCDjga4gSGVscCDjgpLplovjgYTjgabjgY/jgozjgb7jgZnjgIIKCmBgYHtyIGV2YWw9RkFMU0V9Cj9XRElzZWFyY2gKYGBgCgrkuIvjgavjgYTjgY/jgaTjgYvkvovjgpLmjJnjgZLjgabjgb/jgb7jgZfjgofjgYbjgIIKCiMjIyDmpJzntKLkvosgMe+8iFdESeWQje+8iQoKYGBge3IgY2FjaGU9VFJVRX0KV0RJc2VhcmNoKHN0cmluZyA9ICJnZHAiLCBmaWVsZCA9ICJuYW1lIiwgc2hvcnQgPSBUUlVFLCBjYWNoZSA9IE5VTEwpCmBgYAoKYGBge3J9CldESXNlYXJjaChzdHJpbmcgPSAibWlsaXRhcnkgZXhwZW5kaXR1cmUiLCBmaWVsZCA9ICJuYW1lIiwgc2hvcnQgPSBUUlVFLCBjYWNoZSA9IE5VTEwpCmBgYAoKIyMjIOaknOe0ouS+iyAy77yIV0RJ77yJCgpgYGB7ciBjYWNoZT1UUlVFfQpXRElzZWFyY2goc3RyaW5nID0gIk5ZLkdEUC5NS1RQLkNEIiwgZmllbGQgPSAiaW5kaWNhdG9yIiwgc2hvcnQgPSBUUlVFLCBjYWNoZSA9IE5VTEwpCmBgYAogIAojIyMg57e057+SIDIuIC0g5qSc57Si77yIc2hvcnTvvIkKCuWQjeWJjeOBp+aknOe0ou+8iCIiIOOBrumWk+OBq+OAge+8iOOBquOCi+OBueOBj+ewoeWNmOOBqu+8ieaknOe0ouaWh+Wtl+WIl+OCkuWFpeOCjOOBpuOBj+OBoOOBleOBhOOAgu+8iQoKYGBge3IgY2FjaGU9VFJVRX0KV0RJc2VhcmNoKHN0cmluZyA9ICIiLCBmaWVsZCA9ICJuYW1lIiwgc2hvcnQgPSBUUlVFLCBjYWNoZSA9IE5VTEwpCmBgYAoKSW5kaWNhdG9yIOOBp+aknOe0ou+8iCIiIOOBrumWk+OBq+OAgeiqv+OBueOBn+OBhCBpbmRpY2F0b3Ig44KS5YWl44KM44Gm44GP44Gg44GV44GE44CC77yJCgpgYGB7ciBjYWNoZT1UUlVFfQpXRElzZWFyY2goc3RyaW5nID0gIiIsIGZpZWxkID0gImluZGljYXRvciIsIHNob3J0ID0gVFJVRSwgY2FjaGUgPSBOVUxMKQpgYGAKCiMjIyDoqbPjgZfjgYTmg4XloLHjgpLlvpfjgovjgavjga8KCmBzaG9ydCA9IEZBTFNFYCDjgajjgZfjgb7jgZnjgILmmYLplpPjgYzjgYvjgYvjgovjga7jgafjgIHmpJzntKLjga/jgIFJbmRpY2F0b3Ig44Go44CB5ZCN5YmN44Gq44Gp44Gu5oOF5aCx44KS44KC44Gj44Gf44OV44Kh44Kk44Or44KS5omL5YWD44Gr5oyB44Gj44Gm44GK44GP44GT44Go44Gr44GX44G+44GZ44CCCgpgYGB7ciBjYWNoZT1UUlVFLCBldmFsPUZBTFNFfQp3ZGlfY2FjaGUgPC0gV0RJY2FjaGUoKQpgYGAKYGBge3IgZWNobz1GQUxTRSwgZXZhbD1GQUxTRX0Kd3JpdGVfcmRzKHdkaV9jYWNoZSwgIi4vZGF0YS93ZGlfY2FjaGUuUkRhdGEiKQpgYGAKYGBge3IgZWNobz1GQUxTRX0Kd2RpX2NhY2hlIDwtIHJlYWRfcmRzKCIuL2RhdGEvd2RpX2NhY2hlLlJEYXRhIikKYGBgCgoK5Y+z5LiK44Gu56qT5p6g77yIcGFuZe+8ieOBi+OCieOAgWB3ZGlfY2FjaGVgIOOCkuaOouOBl+OBpuOAgeS4rei6q+OCkuimi+OBpuOBv+OBvuOBl+OCh+OBhuOAgnNlcmllcyDjgajjgIFjb3VudHJ5IOOBruS6jOOBpOOBruODh+ODvOOCv+ODu+ODleODrOODvOODoOOBi+OCieOBquOBo+OBpuOBhOOCi+ODquOCueODiOOBp+OBmeOAguS4ieinkuWNsOOChOOAgeWPs+OBi+OCieS6jOeVquebruOBruW3u+eJqeOBruOCiOOBhuOBquOCouOCpOOCs+ODs+OCkuOCr+ODquODg+OCr+OBmeOCi+OBqOS4rei6q+OBjOimi+OBiOOBvuOBmeOAggoKYGBge3J9CldESXNlYXJjaChzdHJpbmcgPSAiQ1BJIFByaWNlIiwgZmllbGQgPSAibmFtZSIsIHNob3J0ID0gRkFMU0UsIGNhY2hlID0gTlVMTCkKYGBgCgrjgafjgoLjgIHkuIvjga7jgIHmpJzntKLjgajlkIzjgZjntZDmnpzjgpLlvpfjgb7jgZnjgYzjgIFgY2FjaGUgPSB3ZGlfY2FjaGVgIOOCkuS9v+OBhuOBqOOAgeODgOOCpuODs+ODreODvOODieOBmeOCi+aDheWgseOCkua4m+OCieOBmeOBk+OBqOOBjOOBp+OBjeOCi+OBqOOBhOOBhuOBk+OBqOOBp+OBmeOAggoKc2hvcnQgPSBGQUxTRSDjgafjga/jgIHjg4fjg7zjgr/jga7mpoLopoEgKGRlc2NyaXB0aW9uKSDjgoLlvpfjgovjgZPjgajjgYzjgafjgY3jgb7jgZnjgIIKICAKIyMjIOaknOe0ouS+iyAz77yIV0RJ5ZCN77yJCgpgYGB7cn0KV0RJc2VhcmNoKHN0cmluZyA9ICJDUEkgUHJpY2UiLCBmaWVsZCA9ICJuYW1lIiwgc2hvcnQgPSBGQUxTRSwgY2FjaGUgPSB3ZGlfY2FjaGUpCmBgYAoKLSBDUFRPVE5TWE46IENQSSBQcmljZSwgbm9taW5hbAogIC0gVGhlIGNvbnN1bWVyIHByaWNlIGluZGV4IHJlZmxlY3RzIHRoZSBjaGFuZ2UgaW4gcHJpY2VzIGZvciB0aGUgYXZlcmFnZSBjb25zdW1lciBvZiBhIGNvbnN0YW50IGJhc2tldCBvZiBjb25zdW1lciBnb29kcy4gRGF0YSBpcyBub3Qgc2Vhc29uYWxseSBhZGp1c3RlZC4KCiMjIyDmpJzntKLkvosgNO+8iFdESe+8iQoKYGBge3J9CldESXNlYXJjaChzdHJpbmcgPSAiTlkuR0RQLk1LVFAuS0QuWkciLCBmaWVsZCA9ICJpbmRpY2F0b3IiLCBzaG9ydCA9IEZBTFNFLCBjYWNoZSA9IHdkaV9jYWNoZSkKYGBgCgogIAojIyMg57e057+SIDIgLSDmpJzntKLvvIhsb25nIHcvIGNhY2hl77yJCgpgc3RyaW5nYCDjgajjgIFgZmllbGRgIOOCkuOAgeOBteOBn+OBpOOBqOOCguWFpeOCjOOBpuOBj+OBoOOBleOBhOOAggoKYGBge3IgZXZhbD1GQUxTRX0KV0RJc2VhcmNoKHN0cmluZyA9ICIiLCBmaWVsZCA9ICIiLCBzaG9ydCA9IEZBTFNFLCBjYWNoZSA9IHdkaV9jYWNoZSkKYGBgCgojIyDmjIfmqJkgV0RJIOODh+ODvOOCv+OBruODgOOCpuODs+ODreODvOODiQoKSW5kaWNhdG9yIOOBjOaxuuOBvuOBo+OBn+OCieOAgeODgOOCpuODs+ODreODvOODieOBl+OBvuOBmeOAggoK5Y+z5LiL44Gu44CBSGVscCBUYWIg44GrIFdESSDjgajlhaXjgozjgovjgajjgIHkvb/jgYTmlrnjgoLjgo/jgYvjgorjgb7jgZnjgIIKCmBgYHtyIGV2YWw9RkFMU0V9Cj9XREkKYGBgCiAgCiMjIyDjg4Djgqbjg7Pjg63jg7zjg4nkvosgMS0xCgpgYGB7ciBjYWNoZT1UUlVFfQpkZl9nZHAxIDwtIFdESShjb3VudHJ5ID0gImFsbCIsIGluZGljYXRvciA9ICJOWS5HRFAuTUtUUC5DRCIpCmRmX2dkcDEKYGBgCgogIAojIyMg44OA44Km44Oz44Ot44O844OJ5L6LIDEtMgoKYGBge3IgY2FjaGU9VFJVRX0KZGZfZ2RwMiA8LSBXREkoY291bnRyeSA9ICJhbGwiLCBpbmRpY2F0b3IgPSBjKGdkcCA9ICJOWS5HRFAuTUtUUC5DRCIpKQpkZl9nZHAyCmBgYAoKICAKIyMjIOODgOOCpuODs+ODreODvOODieS+iyAxLTMKCmBgYHtyIGNhY2hlPVRSVUV9CmRmX2dkcDMgPC0gV0RJKGNvdW50cnkgPSAiYWxsIiwgaW5kaWNhdG9yID0gYyhnZHAgPSAiTlkuR0RQLk1LVFAuQ0QiKSwgZXh0cmE9VFJVRSwgY2FjaGU9d2RpX2NhY2hlKQpkZl9nZHAzCmBgYAoKICAKIyMjIOODgOOCpuODs+ODreODvOODieS+iyAxLTQKCmBgYHtyIGNhY2hlPVRSVUV9CmRmX2dkcDQgPC0gV0RJKGNvdW50cnkgPSBjKCJDTiIsIkdCIiwiSlAiLCJJTiIsIlVTIiwiREUiKSwgaW5kaWNhdG9yID0gYyhnZHAgPSAiTlkuR0RQLk1LVFAuQ0QiKSwgZXh0cmE9VFJVRSwgY2FjaGU9d2RpX2NhY2hlKQpkZl9nZHA0CmBgYAoKIyMjIyDjg4Djgqbjg7Pjg63jg7zjg4nkvosgMi0xCgoqIE5ZLkdEUC5ERUZMLktELlpHOiBJbmZsYXRpb24sIEdEUCBkZWZsYXRvciAoYW5udWFsICUpCiogQ1BUT1ROU1hOOiBDUEkgUHJpY2UsIG5vbWluYWwKCmBgYHtyIGNhY2hlPVRSVUV9CmRmX2dkcDIxIDwtIFdESShjb3VudHJ5ID0gImFsbCIsIAogICAgICAgICAgICAgICAgaW5kaWNhdG9yID0gYyhnZHBfZGVmbGF0b3IgPSAiTlkuR0RQLkRFRkwuS0QuWkciLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3BpX3ByaWNlID0gIkNQVE9UTlNYTiIpLCAKICAgICAgICAgICAgICAgIGV4dHJhPVRSVUUsIGNhY2hlPXdkaV9jYWNoZSkKZGZfZ2RwMjEKYGBgCgpgYGB7cn0Kc3RyKGRmX2dkcDIxKQpgYGAKCmBgYHtyfQpzdW1tYXJ5KGRmX2dkcDIxKQpgYGAKCuWPs+S4iuOBrueqk+aeoOOBruOAgUVudmlyb25tZW50IOOCguimi+OBpuOBv+OBvuOBl+OCh+OBhuOAggoKCiMjIOWPr+imluWMliBWaXN1YWxpemF0aW9uCgrjgrDjg6njg5XvvIhDaGFydO+8ieOCkuaPj+OBhOOBpuimluimmuWMluOBl+OCiOOBhgoKIyMjIOOCsOODqeODlSAxCgpgYGB7cn0KZGZfZ2RwNCAlPiUgZ2dwbG90KGFlcyh5ZWFyLCBnZHAsIGNvbD1jb3VudHJ5KSkgKyBnZW9tX2xpbmUoKQpgYGAKCiMjIyDjgrDjg6njg5UgMgoKYGBge3J9CmRmX2dkcDQgJT4lIGRyb3BfbmEoZ2RwKSAlPiUgCiAgZ2dwbG90KGFlcyh5ZWFyLCBnZHAsIGNvbD1jb3VudHJ5KSkgKyBnZW9tX2xpbmUoKSArCiAgbGFicyh0aXRsZSA9IHBhc3RlKCJXREkgLSBOWS5HRFAuTUtUUC5DRDogIiwgImdkcCIpKQpgYGAKCiMjIyDjg4bjg7Pjg5fjg6zjg7zjg4ggVGVtcGxhdGVzCgojIyMjIOS4gOOBpOOBruWbveOBq+OBpOOBhOOBpuOBruOAgeS4gOOBpOOBruaMh+aome+8iFdESe+8ieOBqOOAgeOBneOBrueVpeensOOBi+OCieOAgeaKmOe3muOCsOODqeODleOCkuS9nOaIkAoKTGluZSBQbG90IHdpdGggb25lIGluZGljYXRvciB3aXRoIGFiYnJldmlhdGlvbiBhbmQgb25lIGNvdW50cnkKCmBgYHtyIGNhY2hlPVRSVUV9CmNob3Nlbl9pbmRpY2F0b3IgPC0gIlNMLlVFTS5UT1RMLk5FLlpTIgpzaG9ydF9uYW1lIDwtICJ1bmVtcGxveW1lbnQiCmNob3Nlbl9jb3VudHJ5IDwtICJVbml0ZWQgU3RhdGVzIgpXREkoY291bnRyeSA9ICJhbGwiLCBpbmRpY2F0b3IgPSBjKHNob3J0X25hbWUgPSBjaG9zZW5faW5kaWNhdG9yKSwgZXh0cmE9VFJVRSwgY2FjaGU9d2RpX2NhY2hlKSAlPiUKICBmaWx0ZXIoY291bnRyeSA9PSBjaG9zZW5fY291bnRyeSkgJT4lIAogIGdncGxvdChhZXMoeWVhciwgc2hvcnRfbmFtZSkpICsgZ2VvbV9saW5lKCkgKwogIGxhYnModGl0bGUgPSBwYXN0ZSgiV0RJICIsIGNob3Nlbl9pbmRpY2F0b3IsICI6ICIsIHNob3J0X25hbWUsICIgLSAiLCBjaG9zZW5fY291bnRyeSksCiAgICAgICB5ID0gc2hvcnRfbmFtZSkKYGBgCgojIyMjIOS4gOOBpOOBruWbveOBq+OBpOOBhOOBpuOBruOAgeS4gOOBpOOBruaMh+aome+8iFdESe+8ieOBi+OCieOAgeaKmOe3muOCsOODqeODleOCkuS9nOaIkAoKTGluZSBQbG90IHdpdGggb25lIGluZGljYXRvciBhbmQgb25lIGNvdW50cnkKCmBgYHtyIGNhY2hlPVRSVUV9CmNob3Nlbl9pbmRpY2F0b3IgPC0gIlNMLlVFTS5UT1RMLk5FLlpTIgpjaG9zZW5fY291bnRyeSA8LSAiVW5pdGVkIFN0YXRlcyIKV0RJKGNvdW50cnkgPSAiYWxsIiwgaW5kaWNhdG9yID0gYyhjaG9zZW5faW5kaWNhdG9yID0gY2hvc2VuX2luZGljYXRvciksIAogICAgZXh0cmE9VFJVRSwgY2FjaGU9d2RpX2NhY2hlKSAlPiUKICBmaWx0ZXIoY291bnRyeSA9PSBjaG9zZW5fY291bnRyeSkgJT4lIAogIGdncGxvdChhZXMoeWVhciwgY2hvc2VuX2luZGljYXRvcikpICsgZ2VvbV9saW5lKCkgKwogIGxhYnModGl0bGUgPSBwYXN0ZSgiV0RJICIsIGNob3Nlbl9pbmRpY2F0b3IsICIgLSAiLCBjaG9zZW5fY291bnRyeSksIAogICAgICAgeSA9IGNob3Nlbl9pbmRpY2F0b3IpCmBgYAoKIyMjIyDjgYTjgY/jgaTjgYvjga7lm73jgavjgaTjgYTjgabjga7jgIHkuIDjgaTjga7mjIfmqJnvvIhXREnvvInjgajjgIHjgZ3jga7nlaXnp7DjgYvjgonjgIHmipjnt5rjgrDjg6njg5XjgpLkvZzmiJAKCkxpbmUgUGxvdCB3aXRoIG9uZSBpbmRpY2F0b3Igd2l0aCBhYmJyZXZpYXRpb24gYW5kIHNldmVyYWwgY291bnRyaWVzCgpgYGB7ciBjYWNoZT1UUlVFfQpjaG9zZW5faW5kaWNhdG9yIDwtICJTTC5VRU0uVE9UTC5ORS5aUyIKc2hvcnRfbmFtZSA8LSAidW5lbXBsb3ltZW50IgpjaG9zZW5fY291bnRyaWVzIDwtIGMoIlVuaXRlZCBTdGF0ZXMiLCJVbml0ZWQgS2luZ2RvbSIsICJKYXBhbiIpCldESShjb3VudHJ5ID0gImFsbCIsIGluZGljYXRvciA9IGMoc2hvcnRfbmFtZSA9IGNob3Nlbl9pbmRpY2F0b3IpLCBleHRyYT1UUlVFLCBjYWNoZT13ZGlfY2FjaGUpICU+JSBkcm9wX25hKHNob3J0X25hbWUpICU+JSAKICBmaWx0ZXIoY291bnRyeSAlaW4lIGNob3Nlbl9jb3VudHJpZXMpICU+JSAKICBnZ3Bsb3QoYWVzKHllYXIsIHNob3J0X25hbWUsIGNvbCA9IGNvdW50cnkpKSArIGdlb21fbGluZSgpICsKICBsYWJzKHRpdGxlID0gcGFzdGUoIldESSAiLCBjaG9zZW5faW5kaWNhdG9yLCAiOiAiLCBzaG9ydF9uYW1lKSwgeSA9IHNob3J0X25hbWUpCmBgYAoKCiMjIyMg5LiA44Gk44Gu5Zu944Gr44Gk44GE44Gm44Gu44CB5LqM44Gk44Gu5oyH5qiZ77yIV0RJ77yJ44Go44CB44Gd44Gu55Wl56ew44GL44KJ44CB5oqY57ea44Kw44Op44OV44KS5L2c5oiQCgpMaW5lIFBsb3Qgd2l0aCB0d28gaW5kaWNhdG9ycyB3aXRoIGFiYnJldmlhdGlvbiBhbmQgb25lIGNvdW50cnkKCmBgYHtyIGNhY2hlPVRSVUV9CmNob3Nlbl9pbmRpY2F0b3JfMSA8LSAiTlkuR0RQLkRFRkwuS0QuWkciCnNob3J0X25hbWVfMSA8LSAiZ2RwX2RlZmxhdG9yIgpjaG9zZW5faW5kaWNhdG9yXzIgPC0gIkNQVE9UU0FYTlpHWSIKc2hvcnRfbmFtZV8yIDwtICJjcGlfcHJpY2UiCmNob3Nlbl9jb3VudHJ5IDwtICJVbml0ZWQgU3RhdGVzIgpXREkoY291bnRyeSA9ICJhbGwiLCBpbmRpY2F0b3IgPSBjKHNob3J0X25hbWVfMSA9IGNob3Nlbl9pbmRpY2F0b3JfMSwgc2hvcnRfbmFtZV8yID0gY2hvc2VuX2luZGljYXRvcl8yKSwgZXh0cmE9VFJVRSwgY2FjaGU9d2RpX2NhY2hlKSAlPiUgCiAgZmlsdGVyKGNvdW50cnkgPT0gY2hvc2VuX2NvdW50cnkpICU+JSAKICBwaXZvdF9sb25nZXIoYyhzaG9ydF9uYW1lXzEsIHNob3J0X25hbWVfMiksIG5hbWVzX3RvID0gImNsYXNzIiwgdmFsdWVzX3RvID0gInZhbHVlIikgJT4lIGRyb3BfbmEodmFsdWUpICU+JQogIGdncGxvdChhZXMoeWVhciwgdmFsdWUsIGNvbCA9IGNsYXNzKSkgKyBnZW9tX2xpbmUoKSArCiAgbGFicyh0aXRsZSA9IHBhc3RlKCJXREkgIiwgY2hvc2VuX2luZGljYXRvcl8xLCAiOiAiLCBzaG9ydF9uYW1lXzEsICJcbiIsIGNob3Nlbl9pbmRpY2F0b3JfMiwgIjogIiwgc2hvcnRfbmFtZV8yLCAiIC0gIiwgY2hvc2VuX2NvdW50cnkpKSArCiAgc2NhbGVfY29sb3JfbWFudWFsKGxhYmVscyA9IGMoc2hvcnRfbmFtZV8xLCBzaG9ydF9uYW1lXzIpLCB2YWx1ZXMgPSBzY2FsZXM6Omh1ZV9wYWwoKSgyKSkKYGBgCgpgYGB7ciBjYWNoZT1UUlVFfQpjaG9zZW5faW5kaWNhdG9yXzEgPC0gIlNMLlRMRi5DQUNULk1BLk5FLlpTIgpzaG9ydF9uYW1lXzEgPC0gIm1hbGUiCmNob3Nlbl9pbmRpY2F0b3JfMiA8LSAiU0wuVExGLkNBQ1QuRkUuTkUuWlMiCnNob3J0X25hbWVfMiA8LSAiZmVtYWxlIgpjaG9zZW5fY291bnRyeSA8LSAiVW5pdGVkIFN0YXRlcyIKV0RJKGNvdW50cnkgPSAiYWxsIiwgaW5kaWNhdG9yID0gYyhzaG9ydF9uYW1lXzEgPSBjaG9zZW5faW5kaWNhdG9yXzEsIHNob3J0X25hbWVfMiA9IGNob3Nlbl9pbmRpY2F0b3JfMiksIGV4dHJhPVRSVUUsIGNhY2hlPXdkaV9jYWNoZSkgJT4lIAogIGZpbHRlcihjb3VudHJ5ID09IGNob3Nlbl9jb3VudHJ5KSAlPiUgCiAgcGl2b3RfbG9uZ2VyKGMoc2hvcnRfbmFtZV8xLCBzaG9ydF9uYW1lXzIpLCBuYW1lc190byA9ICJjbGFzcyIsIHZhbHVlc190byA9ICJ2YWx1ZSIpICU+JSBkcm9wX25hKHZhbHVlKSAlPiUKICBnZ3Bsb3QoYWVzKHllYXIsIHZhbHVlLCBjb2wgPSBjbGFzcykpICsgZ2VvbV9saW5lKCkgKwogIGxhYnModGl0bGUgPSBwYXN0ZSgiV0RJICIsIGNob3Nlbl9pbmRpY2F0b3JfMSwgIjogIiwgc2hvcnRfbmFtZV8xLCAiXG4iLCBjaG9zZW5faW5kaWNhdG9yXzIsICI6ICIsIHNob3J0X25hbWVfMiwgIiAtICIsIGNob3Nlbl9jb3VudHJ5KSkgKwogIHNjYWxlX2NvbG9yX21hbnVhbChsYWJlbHMgPSBjKHNob3J0X25hbWVfMSwgc2hvcnRfbmFtZV8yKSwgdmFsdWVzID0gc2NhbGVzOjpodWVfcGFsKCkoMikpCmBgYAoKIyMjIyDjgYTjgY/jgaTjgYvjga7lm73jgavjgaTjgYTjgabjga7jgIHkuozjgaTjga7mjIfmqJnvvIhXREnvvInjgajjgIHjgZ3jga7nlaXnp7DjgYvjgonjgIHmipjnt5rjgrDjg6njg5XjgpLkvZzmiJAKCkxpbmUgUGxvdCB3aXRoIHR3byBpbmRpY2F0b3JzIHdpdGggYWJicmV2aWF0aW9uIGFuZCBzZXZlcmFsIGNvdW50cmllcwoKYGBge3IgY2FjaGU9VFJVRX0KY2hvc2VuX2luZGljYXRvcl8xIDwtICJOWS5HRFAuREVGTC5LRC5aRyIKc2hvcnRfbmFtZV8xIDwtICJnZHBfZGVmbGF0b3IiCmNob3Nlbl9pbmRpY2F0b3JfMiA8LSAiQ1BUT1RTQVhOWkdZIgpzaG9ydF9uYW1lXzIgPC0gImNwaV9wcmljZSIKY2hvc2VuX2NvdW50cmllcyA8LSBjKCJVbml0ZWQgU3RhdGVzIiwgIkZyYW5jZSIsICJKYXBhbiIpCldESShjb3VudHJ5ID0gImFsbCIsIGluZGljYXRvciA9IGMoc2hvcnRfbmFtZV8xID0gY2hvc2VuX2luZGljYXRvcl8xLCBzaG9ydF9uYW1lXzIgPSBjaG9zZW5faW5kaWNhdG9yXzIpLCBleHRyYT1UUlVFLCBjYWNoZT13ZGlfY2FjaGUpICU+JSAKICBmaWx0ZXIoY291bnRyeSAlaW4lIGNob3Nlbl9jb3VudHJpZXMpICU+JSAKICBwaXZvdF9sb25nZXIoYyhzaG9ydF9uYW1lXzEsIHNob3J0X25hbWVfMiksIG5hbWVzX3RvID0gImNsYXNzIiwgdmFsdWVzX3RvID0gInZhbHVlIikgJT4lIGRyb3BfbmEodmFsdWUpICU+JQogIGdncGxvdChhZXMoeWVhciwgdmFsdWUsIGxpbmV0eXBlID0gY2xhc3MsIGNvbCA9IGNvdW50cnkpKSArIGdlb21fbGluZSgpICsKICBsYWJzKHRpdGxlID0gcGFzdGUoIldESSAiLCBjaG9zZW5faW5kaWNhdG9yXzEsICI6ICIsIHNob3J0X25hbWVfMSwgIlxuIiwgY2hvc2VuX2luZGljYXRvcl8yLCAiOiAiLCBzaG9ydF9uYW1lXzIpKSArCiAgc2NhbGVfbGluZXR5cGVfbWFudWFsKGxhYmVscyA9IGMoc2hvcnRfbmFtZV8xLCBzaG9ydF9uYW1lXzIpLCB2YWx1ZXMgPSBjKCJzb2xpZCIsICJkYXNoZWQiKSkKYGBgCgoKYGBge3IgY2FjaGU9VFJVRX0KY2hvc2VuX2luZGljYXRvcl8xIDwtICJTTC5UTEYuQ0FDVC5NQS5ORS5aUyIKc2hvcnRfbmFtZV8xIDwtICJtYWxlIgpjaG9zZW5faW5kaWNhdG9yXzIgPC0gIlNMLlRMRi5DQUNULkZFLk5FLlpTIgpzaG9ydF9uYW1lXzIgPC0gImZlbWFsZSIKY2hvc2VuX2NvdW50cmllcyA8LSBjKCJVbml0ZWQgU3RhdGVzIiwgIkZyYW5jZSIsICJKYXBhbiIpCldESShjb3VudHJ5ID0gImFsbCIsIGluZGljYXRvciA9IGMoc2hvcnRfbmFtZV8xID0gY2hvc2VuX2luZGljYXRvcl8xLCBzaG9ydF9uYW1lXzIgPSBjaG9zZW5faW5kaWNhdG9yXzIpLCBleHRyYT1UUlVFLCBjYWNoZT13ZGlfY2FjaGUpICU+JSAKICBmaWx0ZXIoY291bnRyeSAlaW4lIGNob3Nlbl9jb3VudHJpZXMpICU+JSAKICBwaXZvdF9sb25nZXIoYyhzaG9ydF9uYW1lXzEsIHNob3J0X25hbWVfMiksIG5hbWVzX3RvID0gImNsYXNzIiwgdmFsdWVzX3RvID0gInZhbHVlIikgJT4lIGRyb3BfbmEodmFsdWUpICU+JQogIGdncGxvdChhZXMoeWVhciwgdmFsdWUsIGxpbmV0eXBlID0gY2xhc3MsIGNvbCA9IGNvdW50cnkpKSArIGdlb21fbGluZSgpICsKICBsYWJzKHRpdGxlID0gcGFzdGUoIldESSAiLCBjaG9zZW5faW5kaWNhdG9yXzEsICI6ICIsIHNob3J0X25hbWVfMSwgIlxuIiwgY2hvc2VuX2luZGljYXRvcl8yLCAiOiAiLCBzaG9ydF9uYW1lXzIpKSArCiAgc2NhbGVfbGluZXR5cGVfbWFudWFsKGxhYmVscyA9IGMoc2hvcnRfbmFtZV8xLCBzaG9ydF9uYW1lXzIpLCB2YWx1ZXMgPSBjKCJzb2xpZCIsICJkYXNoZWQiKSkKYGBgCgoKIyMg57e057+SCgrkuIrjga7jg4bjg7Pjg5fjg6zjg7zjg4jjgpLjgrPjg5Tjg7zjgZfjgabjgIHkuIvjgavosrzjgorku5jjgZHjgIHmjIfmqJkgYGluZGljYXRvcmAg44Go44CB55Wl56ewIGBzaG9ydF9uYW1lYCDjgajjgIHjgYTjgY/jgaTjgYvjga7lm73lkI0gYGNob3Nlbl9jb3VudHJpZXNgIOOCkuOAgeWFpeOCjOabv+OBiOOBpuOAgeippuOBl+OBpuOBv+OBpuOBj+OBoOOBleOBhOOAggoKPCEtLSAjIyMg5a2m55Sf44GM6YG45oqe44GX44Gf5LiW55WM6ZaL55m65oyH5qiZ77yIV0RJ77yJ44Gu5L6LIC0tPgoKPCEtLSAxOeS6uuOBruWPl+ism+eUn+OBq+OAgeiIiOWRs+OBruOBguOCi+aMh+aomeOCkumBuOOCk+OBp+OAgeODhuODs+ODl+ODrOODvOODiOOCkuS9v+OBo+OBpuOAgeWPr+imluWMluOCkuOBl+OBpuOBv+OBpuOBj+OBoOOBleOBhOOAgeOBqOiqsumhjOOBq+WHuuOBl+OBn+aZguOBq+OAgeiqv+OBueOBpuOBj+OCjOOBn+OCguOBruOBp+OBmeOAgiAtLT4KCjwhLS0gYGBge3J9IC0tPgo8IS0tIHVybF9pbmRpY2F0b3JzIDwtICJodHRwczovL2RzLXNsLmdpdGh1Yi5pby9pbnRybzJyL2RhdGEvaW5kaWNhdG9ycy5jc3YiIC0tPgo8IS0tIGRmX2luZGljYXRvcnMgPC0gcmVhZF9jc3YodXJsX2luZGljYXRvcnMpICU+JSBsZWZ0X2pvaW4od2RpX2NhY2hlJHNlcmllcykgLS0+CjwhLS0gd3JpdGVfY3N2KGRmX2luZGljYXRvcnMsICIuL2RhdGEvaW5kaWNhdG9ycy5jc3YiKSAtLT4KPCEtLSBkZl9pbmRpY2F0b3JzICU+JSBkaXN0aW5jdChpbmRpY2F0b3IsIG5hbWUpICU+JSBhcnJhbmdlKGluZGljYXRvcikgLS0+CjwhLS0gYGBgIC0tPgoK6Ieq5YiG44Gn6Kqy6aGM44KS6ICD44GI44CB44OH44O844K/44KS6YG444G544KL44GT44Go44Gv44CB44Go44Gm44KC5aSn5YiH44Gg44Go44GE44GG44GT44Go44Gg44Go5oCd44GE44G+44GZ44CCCgoKIyMg44OX44Ot44K444Kn44Kv44OICgrku5bjga4gV0RJIOOBruODh+ODvOOCv+OBp+OAgeOBr+OBmOOCgeOBq+OBrumDqOWIhuOBqOOAgeWQjOanmOOBruOBk+OBqOOCkuOBl+OBpuOBv+OBvuOBl+OCh+OBhuOAggoKMS4g5pyA5Yid44Gr44CBYGdkcCA9ICJOWS5HRFAuTUtUUC5DRCJgIOOBqOOBl+OBvuOBl+OBn+OBjOOAgUdOSSBwZXIgY2FwaXRhLCBBdGxhcyBtZXRob2QgKGN1cnJlbnQgVVMkKTogTlkuR05QLlBDQVAuQ0Qg44Gr5aSJ44GI44Gm44G/44G+44GX44KH44GG44CCCgpgYGB7ciBjYWNoZT1UUlVFfQpkZl9nbnBwY2FwIDwtIFdESShjb3VudHJ5ID0gImFsbCIsIAogICAgICAgICAgICAgIGluZGljYXRvciA9IGMoZ25wcGNhcCA9ICJOWS5HTlAuUENBUC5DRCIpLCAKICAgICAgICAgICAgICBleHRyYSA9IFRSVUUpCmBgYAoKMi4gW1dvcmxkIERldmVsb3BtZW50IEluZGljYXRvcnNdKGh0dHBzOi8vZGF0YXRvcGljcy53b3JsZGJhbmsub3JnL3dvcmxkLWRldmVsb3BtZW50LWluZGljYXRvcnMvKSDjga7jgrXjgqTjg4jjga7kuIvjgavjgYLjgovjgIFEYXRhIFRoZW1lc++8iOODhuODvOODnu+8ieOBi+OCieiHquWIhuOBjOiqv+OBueOBn+OBhOODhuODvOODnuOCkumBuOOBs+OAgeOBneOBruODhuODvOODnuOBi+OCieOAgeODh+ODvOOCv+OCs+ODvOODieOCkuWPluW+l+OBl+OBpuOAgeWQjOanmOOBruWIhuaekOOCkuOBl+OBpuOBv+OBpuOBj+OBoOOBleOBhOOAguODh+ODvOOCv+OBjOOBguOBvuOCiuOBquOBhOWgtOWQiOOCguOBguOCiuOBvuOBmeOBruOBp+OAgeOBguOCi+eoi+W6puODh+ODvOOCv+OBjOWkmuOBhOOCguOBruOCkumBuOaKnuOBmeOCi+OBk+OBqOOCkuOBiuWLp+OCgeOBl+OBvuOBmeOAggoKMy4g5Y+v6IO944Gq44KJ44CBMyDjga7lhoXlrrnjgoLlkKvjgoHjgabjgIHpgbjmip7jgZfjgZ/jgIFXREkg44Gr44Gk44GE44Gm44CB6Kq/44G544Gm44G/44G+44GX44KH44GG44CCCgojIOWPguiAgyAtIOS7iuW+jOOBruWtpue/kuOBruOBn+OCgeOBqwoKIyMgUk5vdGVib29rIOOBrua0u+eUqAoK5LiL44Gu44Oq44Oz44Kv44KS6ZaL44GN44CB5Y+z5LiK44GuIENvZGUg44Oc44K/44Oz44GL44KJ44CBRG93bmxvYWQgUm1kIOOCkumBuOaKnuOBmeOCi+OBqOOAgeODgOOCpuODs+ODreODvOODieOBp+OBjeOBvuOBmeOBi+OCieOAgeODgOOCpOODs+ODreODvOODieOBl+OBn+OCguOBruOCkuOAgeODl+ODreOCuOOCp+OCr+ODiOODu+ODleOCqeODvOODq+ODgOODvOOBq+enu+WLleOBvuOBn+OBr+OCs+ODlOODvOOBl+OBpuOBj+OBoOOBleOBhOOAguODgOOCpuODs+ODreODvOODieOBp+OBjeOBquOBhOOBqOOBjeOBr+OAgUN0cmwg44KS5oq844GX44Gq44GM44KJ44CBRG93bmxvYWQgUm1kIOOCkuOCr+ODquODg+OCr+OBmeOCi+OBqOOAgVNhdmUgQXMg44Gn5L+d5a2Y44Gn44GN44KL44Go5oCd44GE44G+44GZ44CC44OW44Op44Km44K244O844Gr44KI44Gj44Gm5LuV5qeY44GM55Ww44Gq44KK44G+44GZ44GL44KJ44CB6YGp5YiH44Gq5pa55rOV44KS6YG444KT44Gn44GP44Gg44GV44GE44CCCgotICAgPGh0dHBzOi8vZHMtc2wuZ2l0aHViLmlvL2ludHJvMnIvUk5vdGVib29rLUoubmIuaHRtbD4KLSAgIDxodHRwczovL2RzLXNsLmdpdGh1Yi5pby9pbnRybzJyL1JtYXJrZG93bi1KLm5iLmh0bWw+CgpXaW5kb3dzIOOBp+OCguOAgU1hYyDjgafjgoLmj5DkvpvjgZXjgozjgabjgYTjgovjgIFHb29nbGUgQ2hyb21lIOOBruWgtOWQiOOBq+OBr+OAgUNvZGUg44Oc44K/44Oz44GL44KJ44CB44OA44Oz44Ot44O844OJ44GV44KM44KL44Gv44Ga44Gn44GZ44CCCgoKIyMg5Y+C6ICD5paH54yuIFJlZmVyZW5jZXMKCi0gICBSIEZvciBEYXRhIFNjaWVuY2UsIGJ5IEguIFdpY2toYW06IDxodHRwczovL3I0ZHMuaGFkLmNvLm56PgoKICAgIC0gICBJbnRyb2R1Y3Rpb246IDxodHRwczovL3I0ZHMuaGFkLmNvLm56L2V4cGxvcmUtaW50cm8uaHRtbCNleHBsb3JlLWludHJvPgoKLSAgIEJvb2tkb3duOiA8aHR0cHM6Ly9ib29rZG93bi5vcmc+LCBbQXJjaGl2ZV0oaHR0cHM6Ly9ib29rZG93bi5vcmcvaG9tZS9hcmNoaXZlLykKCi0gICBbR2V0IFN0YXJ0ZWQ6IFIgU3R1ZGlvIOOBpyBSIOOCkuOBr+OBmOOCgeOCiOOBhuOAgVIgTWFya2Rvd25dKGh0dHBzOi8vZHMtc2wuZ2l0aHViLmlvL2ludHJvMnIvZ2V0c3RhcnRlZC5odG1sKQoKLSAgIFtJbnRyb2R1Y3RvbiB0byBSXShodHRwczovL2RzLXNsLmdpdGh1Yi5pby9pbnRybzJyL2ludHJvMnIubmIuaHRtbCMzX0RhdGFfQW5hbHlzaXNfVXNpbmdfUlN0dWRpbykKCi0gICBbUuOBp+OBr+OBmOOCgeOCi+ODh+ODvOOCv+ODu+OCteOCpOOCqOODs+OCuV0oaHR0cHM6Ly9kcy1zbC5naXRodWIuaW8vaW50cm8yci9pbnRybzJyai5uYi5odG1sKQoKLSAgIFtEYXRhIEFuYWx5c2lzIGZvciBSZXNlYXJjaGVycyAyMDIyXShodHRwczovL2ljdS1oc3V6dWtpLmdpdGh1Yi5pby9kYTRyMjAyMi8pCgotICAgW+ODh+ODvOOCv+ODu+OCteOCpOOCqOODs+OCueOCkuWni+OCgeOBvuOBl+OCh+OBhiAtIERhdGEgU2NpZW5jZSBmb3IgQWxsXShodHRwczovL2ljdS1oc3V6dWtpLmdpdGh1Yi5pby9kczRhai8pCgojIyDnt7Tnv5LllY/poYwgUG9zaXQgUHJpbWVycwoKUG9zaXQgUHJpbWVycyA8aHR0cHM6Ly9wb3NpdC5jbG91ZC9sZWFybi9wcmltZXJzPgoKIyMjIOacgOWIneOBrua8lOe/kiB7LX0KCi0gICBbVmlzdWFsaXphdGlvbiBCYXNpY3NdKGh0dHBzOi8vcnN0dWRpby5jbG91ZC9sZWFybi9wcmltZXJzLzEuMSkKLSAgIFtQcm9ncmFtbWluZyBCYXNpY3NdKGh0dHBzOi8vcnN0dWRpby5jbG91ZC9sZWFybi9wcmltZXJzLzEuMikKCgojIyBSIHcvIENoYXQgR1BUCgotIFJUdXRvcjogaHR0cHM6Ly9ydHV0b3IuYWkKICAtIOOCouOCq+OCpuODs+ODiOOCkuS9nOaIkOOBm+OBmuOBq+OAgUNoYXRHUFQg44KS5L2/44Gj44Gf44CBUiDjg5fjg63jgrDjg6njg5/jg7PjgrDjgpLkvZPpqJPjgafjgY3jgb7jgZnjgIIKICAtIOOBmeOBp+OBq+iqreOBv+i+vOOCk+OBp+OBguOCi+OAgeODh+ODvOOCv+OBqOOAgeODhuODs+ODl+ODrOODvOODiOOBjOOAgeOBguOCiuaXpeacrOiqnuOBruODhuODs+ODl+ODrOODvOODiOOCguOBguOCiuOBvuOBmeOAgkNoYXRHUFQg44Gr44Kz44O844OJ5L2c5oiQ44KS5L6d6aC844GZ44KL44Go44GN44Gv44CB6Iux6Kqe44Gu5pa544GM6Imv44GE44KI44GG44Gn44GZ44CCCiAgLSDmiYvlhYPjga7jgIFQQyAg44GL44KJ44OH44O844K/44KS6Kqt44G/6L6844KT44Gn6Kmm44GZ44GT44Go44KC5Y+v6IO944Gn44GZ44CCCgpDaGF0IEdQVCDjgarjganjga7jgIFBSSDjga7liKnnlKjjgavoiIjlkbPjgYzjgYLjgovmlrnjga/jgIHjgZPjga5b44Oq44Oz44KvXShodHRwczovL2ljdS1oc3V6dWtpLmdpdGh1Yi5pby9kc19lZHVjYXRpb24vY2hhdGdwdC5odG1sKeOCkuWPgueFp+OBl+OBpuOBj+OBoOOBleOBhOOAggoKCg==