Sys.setlocale(category = "LC_ALL", locale = "zh_TW.UTF-8") 
[1] "zh_TW.UTF-8/zh_TW.UTF-8/zh_TW.UTF-8/C/zh_TW.UTF-8/zh_TW.UTF-8"
# 避免中文亂碼

安裝需要的packages

library(readr)
library(dplyr)
library(jiebaR)
library(tidyr)
library(tidytext)
library(igraph)
library(topicmodels)
library(stringr)
library(ggplot2)
library(data.table)

載入世界杯舉辦年度與舉辦國家之相關資料

getwd()
[1] "/Users/arielchang/Desktop/0514"
setwd("/Users/arielchang/Desktop/0514") 
worldCups<-fread("WorldCups.csv",
              header = T,stringsAsFactors = F, encoding = "UTF-8")
head(worldCups,20)
    Year      Country     Winner     Runners-Up       Third
 1: 1930      Uruguay    Uruguay      Argentina         USA
 2: 1934        Italy      Italy Czechoslovakia     Germany
 3: 1938       France      Italy        Hungary      Brazil
 4: 1950       Brazil    Uruguay         Brazil      Sweden
 5: 1954  Switzerland Germany FR        Hungary     Austria
 6: 1958       Sweden     Brazil         Sweden      France
 7: 1962        Chile     Brazil Czechoslovakia       Chile
 8: 1966      England    England     Germany FR    Portugal
 9: 1970       Mexico     Brazil          Italy  Germany FR
10: 1974      Germany Germany FR    Netherlands      Poland
11: 1978    Argentina  Argentina    Netherlands      Brazil
12: 1982        Spain      Italy     Germany FR      Poland
13: 1986       Mexico  Argentina     Germany FR      France
14: 1990        Italy Germany FR      Argentina       Italy
15: 1994          USA     Brazil          Italy      Sweden
16: 1998       France     France         Brazil     Croatia
17: 2002  Korea/Japan     Brazil        Germany      Turkey
18: 2006      Germany      Italy         France     Germany
19: 2010 South Africa      Spain    Netherlands     Germany
20: 2014       Brazil    Germany      Argentina Netherlands
            Fourth GoalsScored QualifiedTeams MatchesPlayed
 1:     Yugoslavia          70             13            18
 2:        Austria          70             16            17
 3:         Sweden          84             15            18
 4:          Spain          88             13            22
 5:        Uruguay         140             16            26
 6:     Germany FR         126             16            35
 7:     Yugoslavia          89             16            32
 8:   Soviet Union          89             16            32
 9:        Uruguay          95             16            32
10:         Brazil          97             16            38
11:          Italy         102             16            38
12:         France         146             24            52
13:        Belgium         132             24            52
14:        England         115             24            52
15:       Bulgaria         141             24            52
16:    Netherlands         171             32            64
17: Korea Republic         161             32            64
18:       Portugal         147             32            64
19:        Uruguay         145             32            64
20:         Brazil         171             32            64
    Attendance
 1:    590.549
 2:    363.000
 3:    375.700
 4:  1.045.246
 5:    768.607
 6:    819.810
 7:    893.172
 8:  1.563.135
 9:  1.603.975
10:  1.865.753
11:  1.545.791
12:  2.109.723
13:  2.394.031
14:  2.516.215
15:  3.587.538
16:  2.785.100
17:  2.705.197
18:  3.359.439
19:  3.178.856
20:  3.386.810

載入世界杯舉辦比賽資訊

getwd()
[1] "/Users/arielchang/Desktop/0514"
setwd("/Users/arielchang/Desktop/0514") 
WorldCupMatches<-fread("WorldCupMatches.csv",
              header = T,stringsAsFactors = F, encoding = "UTF-8")
head(WorldCupMatches)
   Year             Datetime   Stage        Stadium
1: 1930 13 Jul 1930 - 15:00  Group 1        Pocitos
2: 1930 13 Jul 1930 - 15:00  Group 4 Parque Central
3: 1930 14 Jul 1930 - 12:45  Group 2 Parque Central
4: 1930 14 Jul 1930 - 14:50  Group 3        Pocitos
5: 1930 15 Jul 1930 - 16:00  Group 1 Parque Central
6: 1930 16 Jul 1930 - 14:45  Group 1 Parque Central
          City Home Team Name Home Team Goals
1: Montevideo          France               4
2: Montevideo             USA               3
3: Montevideo      Yugoslavia               2
4: Montevideo         Romania               3
5: Montevideo       Argentina               1
6: Montevideo           Chile               3
   Away Team Goals Away Team Name Win conditions Attendance
1:               1         Mexico                      4444
2:               0        Belgium                     18346
3:               1         Brazil                     24059
4:               1           Peru                      2549
5:               0         France                     23409
6:               0         Mexico                      9249
   Half-time Home Goals Half-time Away Goals
1:                    3                    0
2:                    2                    0
3:                    2                    0
4:                    1                    0
5:                    0                    0
6:                    1                    0
                  Referee              Assistant 1
1: LOMBARDI Domingo (URU)    CRISTOPHE Henry (BEL)
2:      MACIAS Jose (ARG) MATEUCCI Francisco (URU)
3:    TEJADA Anibal (URU)  VALLARINO Ricardo (URU)
4:  WARNKEN Alberto (CHI)      LANGENUS Jean (BEL)
5:    REGO Gilberto (BRA)     SAUCEDO Ulises (BOL)
6:  CRISTOPHE Henry (BEL)  APHESTEGUY Martin (URU)
                  Assistant 2 RoundID MatchID
1:        REGO Gilberto (BRA)     201    1096
2:      WARNKEN Alberto (CHI)     201    1090
3:        BALWAY Thomas (FRA)     201    1093
4:   MATEUCCI Francisco (URU)     201    1098
5: RADULESCU Constantin (ROU)     201    1085
6:        LANGENUS Jean (BEL)     201    1095
   Home Team Initials Away Team Initials
1:                FRA                MEX
2:                USA                BEL
3:                YUG                BRA
4:                ROU                PER
5:                ARG                FRA
6:                CHI                MEX

載入世界杯比賽球員資料

getwd()
[1] "/Users/arielchang/Desktop/0514"
setwd("/Users/arielchang/Desktop/0514") 
WorldCupPlayers<-fread("WorldCupPlayers.csv",
              header = T,stringsAsFactors = F, encoding = "UTF-8")
head(WorldCupPlayers,20)
    RoundID MatchID Team Initials          Coach Name
 1:     201    1096           FRA CAUDRON Raoul (FRA)
 2:     201    1096           MEX    LUQUE Juan (MEX)
 3:     201    1096           FRA CAUDRON Raoul (FRA)
 4:     201    1096           MEX    LUQUE Juan (MEX)
 5:     201    1096           FRA CAUDRON Raoul (FRA)
 6:     201    1096           MEX    LUQUE Juan (MEX)
 7:     201    1096           FRA CAUDRON Raoul (FRA)
 8:     201    1096           MEX    LUQUE Juan (MEX)
 9:     201    1096           FRA CAUDRON Raoul (FRA)
10:     201    1096           MEX    LUQUE Juan (MEX)
11:     201    1096           FRA CAUDRON Raoul (FRA)
12:     201    1096           MEX    LUQUE Juan (MEX)
13:     201    1096           FRA CAUDRON Raoul (FRA)
14:     201    1096           MEX    LUQUE Juan (MEX)
15:     201    1096           FRA CAUDRON Raoul (FRA)
16:     201    1096           MEX    LUQUE Juan (MEX)
17:     201    1096           FRA CAUDRON Raoul (FRA)
18:     201    1096           MEX    LUQUE Juan (MEX)
19:     201    1096           FRA CAUDRON Raoul (FRA)
20:     201    1096           MEX    LUQUE Juan (MEX)
    Line-up Shirt Number       Player Name Position
 1:       S            0       Alex THEPOT       GK
 2:       S            0   Oscar BONFIGLIO       GK
 3:       S            0  Marcel LANGILLER         
 4:       S            0      Juan CARRENO         
 5:       S            0   Ernest LIBERATI         
 6:       S            0      Rafael GARZA        C
 7:       S            0   Andre MASCHINOT         
 8:       S            0     Hilario LOPEZ         
 9:       S            0   Etienne MATTLER         
10:       S            0    Dionisio MEJIA         
11:       S            0      Marcel PINEL         
12:       S            0      Felipe ROSAS         
13:       S            0   Alex VILLAPLANE        C
14:       S            0      Manuel ROSAS         
15:       S            0    Lucien LAURENT         
16:       S            0         Jose RUIZ         
17:       S            0    Marcel CAPELLE         
18:       S            0   Alfredo SANCHEZ         
19:       S            0 Augustin CHANTREL         
20:       S            0    Efrain AMEZCUA         
        Event
 1:          
 2:          
 3:      G40'
 4:      G70'
 5:          
 6:          
 7: G43' G87'
 8:          
 9:          
10:          
11:          
12:          
13:          
14:          
15:      G19'
16:          
17:          
18:          
19:          
20:          

只選取需要的欄位

allData = merge(WorldCupMatches,WorldCupPlayers,by=c("RoundID","MatchID")) %>%
  distinct()
head(allData)
   RoundID MatchID Year             Datetime   Stage
1:     201    1084 1930 22 Jul 1930 - 14:45  Group 1
2:     201    1084 1930 22 Jul 1930 - 14:45  Group 1
3:     201    1084 1930 22 Jul 1930 - 14:45  Group 1
4:     201    1084 1930 22 Jul 1930 - 14:45  Group 1
5:     201    1084 1930 22 Jul 1930 - 14:45  Group 1
6:     201    1084 1930 22 Jul 1930 - 14:45  Group 1
              Stadium        City Home Team Name
1: Estadio Centenario Montevideo       Argentina
2: Estadio Centenario Montevideo       Argentina
3: Estadio Centenario Montevideo       Argentina
4: Estadio Centenario Montevideo       Argentina
5: Estadio Centenario Montevideo       Argentina
6: Estadio Centenario Montevideo       Argentina
   Home Team Goals Away Team Goals Away Team Name
1:               3               1          Chile
2:               3               1          Chile
3:               3               1          Chile
4:               3               1          Chile
5:               3               1          Chile
6:               3               1          Chile
   Win conditions Attendance Half-time Home Goals
1:                     41459                    2
2:                     41459                    2
3:                     41459                    2
4:                     41459                    2
5:                     41459                    2
6:                     41459                    2
   Half-time Away Goals             Referee
1:                    1 LANGENUS Jean (BEL)
2:                    1 LANGENUS Jean (BEL)
3:                    1 LANGENUS Jean (BEL)
4:                    1 LANGENUS Jean (BEL)
5:                    1 LANGENUS Jean (BEL)
6:                    1 LANGENUS Jean (BEL)
             Assistant 1          Assistant 2
1: CRISTOPHE Henry (BEL) SAUCEDO Ulises (BOL)
2: CRISTOPHE Henry (BEL) SAUCEDO Ulises (BOL)
3: CRISTOPHE Henry (BEL) SAUCEDO Ulises (BOL)
4: CRISTOPHE Henry (BEL) SAUCEDO Ulises (BOL)
5: CRISTOPHE Henry (BEL) SAUCEDO Ulises (BOL)
6: CRISTOPHE Henry (BEL) SAUCEDO Ulises (BOL)
   Home Team Initials Away Team Initials Team Initials
1:                ARG                CHI           ARG
2:                ARG                CHI           CHI
3:                ARG                CHI           ARG
4:                ARG                CHI           CHI
5:                ARG                CHI           ARG
6:                ARG                CHI           CHI
               Coach Name Line-up Shirt Number
1: OLAZAR Francisco (ARG)       S            0
2:      ORTH Gyorgy (HUN)       S            0
3: OLAZAR Francisco (ARG)       S            0
4:      ORTH Gyorgy (HUN)       S            0
5: OLAZAR Francisco (ARG)       S            0
6:      ORTH Gyorgy (HUN)       S            0
          Player Name Position Event
1:       Angel BOSSIO       GK      
2:     Roberto CORTES       GK      
3:  Francisco VARALLO               
4:     Victor MORALES               
5:   Jose DELLA TORRE               
6: Guillermo SAAVEDRA               

建立社群網路圖

# 取出阿根廷隊、先發各隊長與勝場得分的關係,勝場分數2分以上的角度觀察
link <- allData %>%
      filter(.$'Home Team Name'=="Argentina") %>%
      filter(.$'Home Team Goals'>=1 & .$`Line-up`=="S" &  .$Position=="C"
             & .$`Team Initials`=="ARG") %>%
      select('Player Name', 'Home Team Goals')
link
         Player Name Home Team Goals
1    Manuel FERREIRA               3
2    Manuel FERREIRA               1
3    Manuel FERREIRA               6
4     Pedro DELLACHA               1
5     Pedro DELLACHA               3
6      Ruben NAVARRO               1
7     Antonio RATTIN               2
8     Antonio RATTIN               2
9    Roberto PERFUMO               4
10   Roberto PERFUMO               1
11   Miguel BRINDISI               1
12     Enrique WOLFF               1
13 Daniel PASSARELLA               2
14 Daniel PASSARELLA               2
15 Daniel PASSARELLA               6
16 Daniel PASSARELLA               2
17 Daniel PASSARELLA               2
18 Daniel PASSARELLA               4
19 Daniel PASSARELLA               1
20    Diego MARADONA               2
21    Diego MARADONA               3
22    Diego MARADONA               1
23    Diego MARADONA               1
24    Diego MARADONA               2
25    Diego MARADONA               4
26    Diego MARADONA               2
27 Daniel PASSARELLA               3
28    Diego MARADONA               2
29     Diego SIMEONE               1
30     Diego SIMEONE               5
31 Gabriel BATISTUTA               1
32     Diego SIMEONE               2
33    Diego MARADONA               3
34    Diego MARADONA               2
35        MASCHERANO               3
36        MASCHERANO               4
37        MASCHERANO               1
38             MESSI               1
39             MESSI               2
40             MESSI               1
41             MESSI               1
42             VERON               1
43             SORIN               2
44             SORIN               6
45             SORIN               2

建立網路關係

FIFANetwork <- graph_from_data_frame(d=link, directed=F)
FIFANetwork
IGRAPH 6ea88dd UN-- 21 45 -- 
+ attr: name (v/c)
+ edges from 6ea88dd (vertex names):
 [1] Manuel FERREIRA  --3 Manuel FERREIRA  --1
 [3] Manuel FERREIRA  --6 Pedro DELLACHA   --1
 [5] Pedro DELLACHA   --3 Ruben NAVARRO    --1
 [7] Antonio RATTIN   --2 Antonio RATTIN   --2
 [9] Roberto PERFUMO  --4 Roberto PERFUMO  --1
[11] Miguel BRINDISI  --1 Enrique WOLFF    --1
[13] Daniel PASSARELLA--2 Daniel PASSARELLA--2
[15] Daniel PASSARELLA--6 Daniel PASSARELLA--2
+ ... omitted several edges

畫出網路圖;為確保同一份程式碼,產出的結果都是一致

set.seed(777)
plot(FIFANetwork)

# 由圖中可以看出到2014為止勝場得分幅度最大的是
# Daniel PASSARELLA及MARADONA
# 而MESSI當隊長時平均勝場得分是1-2分,可能是因為有名的關係,
# 他當隊長,敵隊比較謹慎,也有可能正直青黃交接期隊友素質參差不齊

接著我們分析我們比較關注的角色MESSI跟MARADONA,並加上顏色

set.seed(777)
# V(FIFANetwork)$color <- ifelse(V(FIFANetwork)$type=="poster", "gold", "lightblue")
#V(FIFANetwork)$color<-
# ifelse(V(FIFANetwork)$'Player Name'=="MESSI","red","lightblue")
V(FIFANetwork)$color="lightblue"
V(FIFANetwork)["MESSI"]$color="red"
V(FIFANetwork)["Diego MARADONA"]$color="gold"
#V(FIFANetwork)[c("MESSI")]$color="lightblue"
plot(FIFANetwork )

set.seed(777)
# 顯示有超過4個關聯,也就是當過四次隊長以上的資料顯示出來
labels <- degree(FIFANetwork)
V(FIFANetwork)$label <- names(labels)
plot(FIFANetwork, vertex.size=15, edge.arrow.size=.2,
     vertex.label=ifelse(degree(FIFANetwork) > 4, V(FIFANetwork)$label, NA),  vertex.label.ces=.5)

# 從圖中可以看出 MESSI(阿根廷-梅西)、MARADONA(阿根廷-馬拉杜拉)、PASSARELLA(阿根廷-巴薩里拉)這三位擔任隊長期間有四次以上

接著我們找出隊長與敗場的關係

# 取出阿根廷隊、先發各隊長與敗場得分的關係,勝場0分不算,以有進球的角度觀察
link <- allData %>%
      filter(.$'Home Team Name'=="Argentina") %>%
      filter(.$'Away Team Goals'>=1 & .$`Line-up`=="S" &  .$Position=="C"
             & .$`Team Initials`=="ARG") %>%
      select('Player Name', 'Away Team Goals')
link
         Player Name Away Team Goals
1    Manuel FERREIRA               1
2    Manuel FERREIRA               1
3     Pedro DELLACHA               3
4     Pedro DELLACHA               1
5     Antonio RATTIN               1
6    Roberto PERFUMO               1
7    Roberto PERFUMO               1
8    Miguel BRINDISI               2
9      Enrique WOLFF               1
10 Daniel PASSARELLA               1
11 Daniel PASSARELLA               1
12 Daniel PASSARELLA               1
13 Daniel PASSARELLA               1
14 Daniel PASSARELLA               3
15    Diego MARADONA               1
16    Diego MARADONA               1
17    Diego MARADONA               1
18    Diego MARADONA               1
19     Oscar RUGGERI               2
20 Daniel PASSARELLA               1
21    Diego MARADONA               1
22     Diego SIMEONE               2
23    Diego MARADONA               2
24        MASCHERANO               1
25        MASCHERANO               4
26        MASCHERANO               1
27             MESSI               1
28             VERON               1
29             SORIN               1
30             SORIN               1
# 畫出網路圖
set.seed(999)
# 建立網路關係
FIFANetwork <- graph_from_data_frame(d=link, directed=F)
V(FIFANetwork)$color="lightblue"
V(FIFANetwork)["MESSI"]$color="red"
V(FIFANetwork)["Diego MARADONA"]$color="gold"
plot(FIFANetwork)

# 由圖中可以看出MASHERANO(馬斯切拉諾)、DELLACHA、PASSARELLA(巴薩里拉)這些隊長可能是運氣比較不好
#以高分落敗,而我們關心的馬拉杜納跟梅西大部分是以1-2分落敗

接著我們找勝敗雙方球員的關係

取出跟阿根廷隊係,交戰的隊伍成員資料

# 取出跟阿根廷隊係,交戰的隊伍成員資料
enemy_team <- allData %>%
      filter( (.$'Home Team Name'=="Argentina"|.$'Away Team Name'=="Argentina")
              & .$`Team Initials`!="ARG") %>%
        mutate(win=ifelse(.$'Home Team Name'=="Argentina",1,0)) %>%
          mutate(lose=ifelse(.$'Home Team Name'!="Argentina",1,0)) %>%
      select(ename='Player Name', loseg='Away Team Goals', wing='Home Team Goals',  
             MatchID,RoundID ,oteam=`Team Initials`,win,lose)
head(enemy_team)
               ename loseg wing MatchID RoundID oteam win
1     Roberto CORTES     1    3    1084     201   CHI   1
2     Victor MORALES     1    3    1084     201   CHI   1
3 Guillermo SAAVEDRA     1    3    1084     201   CHI   1
4 Guillermo SUBIABRE     1    3    1084     201   CHI   1
5      Arturo TORRES     1    3    1084     201   CHI   1
6    Casimiro TORRES     1    3    1084     201   CHI   1
  lose
1    0
2    0
3    0
4    0
5    0
6    0

取出跟阿根廷隊資料並且統計跟敵人之間的勝場關係

# 取出跟阿根廷隊係,交戰的隊伍成員資料
agentina_team <- allData %>%
  filter( .$`Team Initials`=="ARG") %>%
      select(name='Player Name', MatchID,RoundID ) %>%
      merge(enemy_team,by=c("MatchID","RoundID")) %>%
      distinct()
head(agentina_team)
  MatchID RoundID         name              ename loseg
1    1084     201 Angel BOSSIO     Roberto CORTES     1
2    1084     201 Angel BOSSIO     Victor MORALES     1
3    1084     201 Angel BOSSIO Guillermo SAAVEDRA     1
4    1084     201 Angel BOSSIO Guillermo SUBIABRE     1
5    1084     201 Angel BOSSIO      Arturo TORRES     1
6    1084     201 Angel BOSSIO    Casimiro TORRES     1
  wing oteam win lose
1    3   CHI   1    0
2    3   CHI   1    0
3    3   CHI   1    0
4    3   CHI   1    0
5    3   CHI   1    0
6    3   CHI   1    0

分析MESSI與他隊球員的勝敗關係

set.seed(888)
# 建立網路關係
agentina_network <- agentina_team %>%
  filter(name=="MESSI")%>%
  group_by(name ,ename ) %>%
  summarise(losesum=sum(lose),winsum=sum(win)) %>%
  select(name ,ename, winsum,losesum) %>%
graph_from_data_frame(directed=F)
agentina_network
IGRAPH 50cd1e0 UN-- 366 365 -- 
+ attr: name (v/c), winsum (e/n), losesum (e/n)
+ edges from 50cd1e0 (vertex names):
 [1] MESSI--A BAUTISTA   MESSI--A GUARDADO  
 [3] MESSI--A MEDINA     MESSI--A. GUARDADO 
 [5] MESSI--A. HAGHIGHI  MESSI--A. NAELSON  
 [7] MESSI--ADELEYE      MESSI--AFOLABI     
 [9] MESSI--AGBIM        MESSI--AHMAD       
[11] MESSI--AIYENUGBA    MESSI--AKALE       
[13] MESSI--ALDERWEIRELD MESSI--ALIREZA     
[15] MESSI--AMBROSE      MESSI--AMEOBI      
+ ... omitted several edges
# V(agentina_network)$color="lightblue"
V(agentina_network)$color=ifelse(E(agentina_network)$winsum-E(agentina_network)$losesum>0,"green",ifelse(E(agentina_network)$winsum-E(agentina_network)$losesum<0,"red","lightblue"))
被替換的項目不是替換值長度的倍數
plot(agentina_network)

# 我們針對MESSI與其他國家隊員進行關係分析,由圖中可紅色的表是MESS敗場比較多,綠色代表勝場比較多
LS0tCnRpdGxlOiAi5YiG5p6QRklGQeeQg+WToeWLneaVl+mXnOS/giIKYXV0aG9yOiAiIgpkYXRlOiAiMjAxOS8wNS8xMyIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQpgYGB7cn0KU3lzLnNldGxvY2FsZShjYXRlZ29yeSA9ICJMQ19BTEwiLCBsb2NhbGUgPSAiemhfVFcuVVRGLTgiKSAKIyDpgb/lhY3kuK3mlofkuoLnorwKYGBgCgojIyDlronoo53pnIDopoHnmoRwYWNrYWdlcwpgYGB7ciBlY2hvID0gRiwgcmVzdWx0cyA9ICdoaWRlJ30KcGFja2FnZXMgPSBjKCJyZWFkciIsICJkcGx5ciIsICJqaWViYVIiLCAidGlkeXIiLCAidGlkeXRleHQiLCAiaWdyYXBoIiwgInRvcGljbW9kZWxzIiwgInN0cmluZ3IiLCAiZ2dwbG90MiIsICJkYXRhLnRhYmxlIikKZXhpc3RpbmcgPSBhcy5jaGFyYWN0ZXIoaW5zdGFsbGVkLnBhY2thZ2VzKClbLDFdKQpmb3IocGtnIGluIHBhY2thZ2VzWyEocGFja2FnZXMgJWluJSBleGlzdGluZyldKSBpbnN0YWxsLnBhY2thZ2VzKHBrZykKYGBgCgpgYGB7cn0KbGlicmFyeShyZWFkcikKbGlicmFyeShkcGx5cikKbGlicmFyeShqaWViYVIpCmxpYnJhcnkodGlkeXIpCmxpYnJhcnkodGlkeXRleHQpCmxpYnJhcnkoaWdyYXBoKQpsaWJyYXJ5KHRvcGljbW9kZWxzKQpsaWJyYXJ5KHN0cmluZ3IpCmxpYnJhcnkoZ2dwbG90MikKbGlicmFyeShkYXRhLnRhYmxlKQpgYGAKCgojIyDovInlhaXkuJbnlYzmna/oiInovqblubTluqboiIfoiInovqblnIvlrrbkuYvnm7jpl5zos4fmlpkKYGBge3J9CmdldHdkKCkKc2V0d2QoIi9Vc2Vycy9hcmllbGNoYW5nL0Rlc2t0b3AvMDUxNCIpIAp3b3JsZEN1cHM8LWZyZWFkKCJXb3JsZEN1cHMuY3N2IiwKICAgICAgICAgICAgICBoZWFkZXIgPSBULHN0cmluZ3NBc0ZhY3RvcnMgPSBGLCBlbmNvZGluZyA9ICJVVEYtOCIpCmhlYWQod29ybGRDdXBzLDIwKQpgYGAKCiMjIOi8ieWFpeS4lueVjOadr+iIiei+puavlOizveizh+ioigpgYGB7cn0KZ2V0d2QoKQpzZXR3ZCgiL1VzZXJzL2FyaWVsY2hhbmcvRGVza3RvcC8wNTE0IikgCldvcmxkQ3VwTWF0Y2hlczwtZnJlYWQoIldvcmxkQ3VwTWF0Y2hlcy5jc3YiLAogICAgICAgICAgICAgIGhlYWRlciA9IFQsc3RyaW5nc0FzRmFjdG9ycyA9IEYsIGVuY29kaW5nID0gIlVURi04IikKaGVhZChXb3JsZEN1cE1hdGNoZXMpCmBgYAoKIyMg6LyJ5YWl5LiW55WM5p2v5q+U6LO955CD5ZOh6LOH5paZCmBgYHtyfQpnZXR3ZCgpCnNldHdkKCIvVXNlcnMvYXJpZWxjaGFuZy9EZXNrdG9wLzA1MTQiKSAKV29ybGRDdXBQbGF5ZXJzPC1mcmVhZCgiV29ybGRDdXBQbGF5ZXJzLmNzdiIsCiAgICAgICAgICAgICAgaGVhZGVyID0gVCxzdHJpbmdzQXNGYWN0b3JzID0gRiwgZW5jb2RpbmcgPSAiVVRGLTgiKQpoZWFkKFdvcmxkQ3VwUGxheWVycywyMCkKYGBgCgojIyDlj6rpgbjlj5bpnIDopoHnmoTmrITkvY0KYGBge3J9CmFsbERhdGEgPSBtZXJnZShXb3JsZEN1cE1hdGNoZXMsV29ybGRDdXBQbGF5ZXJzLGJ5PWMoIlJvdW5kSUQiLCJNYXRjaElEIikpICU+JQogIGRpc3RpbmN0KCkKCmhlYWQoYWxsRGF0YSkKYGBgCgojIyDlu7rnq4vnpL7nvqTntrLot6/lnJYKYGBge3J9CiMg5Y+W5Ye66Zi/5qC55bu36ZqK44CB5YWI55m85ZCE6ZqK6ZW36IiH5Yud5aC05b6X5YiG55qE6Zec5L+C77yM5Yud5aC05YiG5pW4MuWIhuS7peS4iueahOinkuW6puingOWvnwpsaW5rIDwtIGFsbERhdGEgJT4lCiAgICAgIGZpbHRlciguJCdIb21lIFRlYW0gTmFtZSc9PSJBcmdlbnRpbmEiKSAlPiUKICAgICAgZmlsdGVyKC4kJ0hvbWUgVGVhbSBHb2Fscyc+PTEgJiAuJGBMaW5lLXVwYD09IlMiICYgIC4kUG9zaXRpb249PSJDIgogICAgICAgICAgICAgJiAuJGBUZWFtIEluaXRpYWxzYD09IkFSRyIpICU+JQogICAgICBzZWxlY3QoJ1BsYXllciBOYW1lJywgJ0hvbWUgVGVhbSBHb2FscycpCmxpbmsKYGBgCgojIyDlu7rnq4vntrLot6/pl5zkv4IKYGBge3J9CkZJRkFOZXR3b3JrIDwtIGdyYXBoX2Zyb21fZGF0YV9mcmFtZShkPWxpbmssIGRpcmVjdGVkPUYpCkZJRkFOZXR3b3JrCmBgYAoKIyMg55Wr5Ye657ay6Lev5ZyWO+eCuueiuuS/neWQjOS4gOS7veeoi+W8j+eivO+8jOeUouWHuueahOe1kOaenOmDveaYr+S4gOiHtApgYGB7cn0Kc2V0LnNlZWQoNzc3KQpwbG90KEZJRkFOZXR3b3JrKQojIOeUseWcluS4reWPr+S7peeci+WHuuWIsDIwMTTngrrmraLli53loLTlvpfliIbluYXluqbmnIDlpKfnmoTmmK8KIyBEYW5pZWwgUEFTU0FSRUxMQeWPik1BUkFET05BCiMg6ICMTUVTU0nnlbbpmorplbfmmYLlubPlnYfli53loLTlvpfliIbmmK8xLTLliIbvvIzlj6/og73mmK/lm6DngrrmnInlkI3nmoTpl5zkv4LvvIwKIyDku5bnlbbpmorplbfvvIzmlbXpmormr5TovIPorLnmhY7vvIzkuZ/mnInlj6/og73mraPnm7TpnZLpu4PkuqTmjqXmnJ/pmorlj4vntKDos6rlj4Plt67kuI3pvYoKCmBgYAoKIyMg5o6l6JGX5oiR5YCR5YiG5p6Q5oiR5YCR5q+U6LyD6Zec5rOo55qE6KeS6ImyTUVTU0not59NQVJBRE9OQe+8jOS4puWKoOS4iumhj+iJsgpgYGB7cn0Kc2V0LnNlZWQoNzc3KQoKIyBWKEZJRkFOZXR3b3JrKSRjb2xvciA8LSBpZmVsc2UoVihGSUZBTmV0d29yaykkdHlwZT09InBvc3RlciIsICJnb2xkIiwgImxpZ2h0Ymx1ZSIpCiNWKEZJRkFOZXR3b3JrKSRjb2xvcjwtCiMgaWZlbHNlKFYoRklGQU5ldHdvcmspJCdQbGF5ZXIgTmFtZSc9PSJNRVNTSSIsInJlZCIsImxpZ2h0Ymx1ZSIpCgpWKEZJRkFOZXR3b3JrKSRjb2xvcj0ibGlnaHRibHVlIgpWKEZJRkFOZXR3b3JrKVsiTUVTU0kiXSRjb2xvcj0icmVkIgpWKEZJRkFOZXR3b3JrKVsiRGllZ28gTUFSQURPTkEiXSRjb2xvcj0iZ29sZCIKCiNWKEZJRkFOZXR3b3JrKVtjKCJNRVNTSSIpXSRjb2xvcj0ibGlnaHRibHVlIgpwbG90KEZJRkFOZXR3b3JrICkKYGBgCgpgYGB7cn0Kc2V0LnNlZWQoNzc3KQoKIyDpoa/npLrmnInotoXpgY405YCL6Zec6IGv77yM5Lmf5bCx5piv55W26YGO5Zub5qyh6ZqK6ZW35Lul5LiK55qE6LOH5paZ6aGv56S65Ye65L6GCmxhYmVscyA8LSBkZWdyZWUoRklGQU5ldHdvcmspClYoRklGQU5ldHdvcmspJGxhYmVsIDwtIG5hbWVzKGxhYmVscykKCnBsb3QoRklGQU5ldHdvcmssIHZlcnRleC5zaXplPTE1LCBlZGdlLmFycm93LnNpemU9LjIsCiAgICAgdmVydGV4LmxhYmVsPWlmZWxzZShkZWdyZWUoRklGQU5ldHdvcmspID4gNCwgVihGSUZBTmV0d29yaykkbGFiZWwsIE5BKSwgIHZlcnRleC5sYWJlbC5jZXM9LjUpCgojIOW+nuWcluS4reWPr+S7peeci+WHuiBNRVNTSSjpmL/moLnlu7ct5qKF6KW/KeOAgU1BUkFET05BKOmYv+agueW7ty3ppqzmi4nmnZzmi4kp44CBUEFTU0FSRUxMQSjpmL/moLnlu7ct5be06Jap6YeM5ouJKemAmeS4ieS9jeaTlOS7u+maiumVt+acn+mWk+acieWbm+asoeS7peS4igoKYGBgCgojI+aOpeiRl+aIkeWAkeaJvuWHuumaiumVt+iIh+aVl+WgtOeahOmXnOS/ggpgYGB7cn0KIyDlj5blh7rpmL/moLnlu7fpmorjgIHlhYjnmbzlkITpmorplbfoiIfmlZfloLTlvpfliIbnmoTpl5zkv4LvvIzli53loLQw5YiG5LiN566X77yM5Lul5pyJ6YCy55CD55qE6KeS5bqm6KeA5a+fCmxpbmsgPC0gYWxsRGF0YSAlPiUKICAgICAgZmlsdGVyKC4kJ0hvbWUgVGVhbSBOYW1lJz09IkFyZ2VudGluYSIpICU+JQogICAgICBmaWx0ZXIoLiQnQXdheSBUZWFtIEdvYWxzJz49MSAmIC4kYExpbmUtdXBgPT0iUyIgJiAgLiRQb3NpdGlvbj09IkMiCiAgICAgICAgICAgICAmIC4kYFRlYW0gSW5pdGlhbHNgPT0iQVJHIikgJT4lCiAgICAgIHNlbGVjdCgnUGxheWVyIE5hbWUnLCAnQXdheSBUZWFtIEdvYWxzJykKbGluawpgYGAKCmBgYHtyfQojIOeVq+WHuue2sui3r+WclgpzZXQuc2VlZCg5OTkpCiMg5bu656uL57ay6Lev6Zec5L+CCkZJRkFOZXR3b3JrIDwtIGdyYXBoX2Zyb21fZGF0YV9mcmFtZShkPWxpbmssIGRpcmVjdGVkPUYpClYoRklGQU5ldHdvcmspJGNvbG9yPSJsaWdodGJsdWUiClYoRklGQU5ldHdvcmspWyJNRVNTSSJdJGNvbG9yPSJyZWQiClYoRklGQU5ldHdvcmspWyJEaWVnbyBNQVJBRE9OQSJdJGNvbG9yPSJnb2xkIgpwbG90KEZJRkFOZXR3b3JrKQoKIyDnlLHlnJbkuK3lj6/ku6XnnIvlh7pNQVNIRVJBTk8o6aas5pav5YiH5ouJ6Ku+KeOAgURFTExBQ0hB44CBUEFTU0FSRUxMQSjlt7Tolqnph4zmi4kp6YCZ5Lqb6ZqK6ZW35Y+v6IO95piv6YGL5rCj5q+U6LyD5LiN5aW9Cgoj5Lul6auY5YiG6JC95pWX77yM6ICM5oiR5YCR6Zec5b+D55qE6aas5ouJ5p2c57SN6Lef5qKF6KW/5aSn6YOo5YiG5piv5LulMS0y5YiG6JC95pWXCgpgYGAKCiMjIOaOpeiRl+aIkeWAkeaJvuWLneaVl+mbmeaWueeQg+WToeeahOmXnOS/ggojIyDlj5blh7rot5/pmL/moLnlu7fpmorkv4LvvIzkuqTmiLDnmoTpmorkvI3miJDlk6Hos4fmlpkKYGBge3J9CiMg5Y+W5Ye66Lef6Zi/5qC55bu36ZqK5L+C77yM5Lqk5oiw55qE6ZqK5LyN5oiQ5ZOh6LOH5paZCmVuZW15X3RlYW0gPC0gYWxsRGF0YSAlPiUKICAgICAgZmlsdGVyKCAoLiQnSG9tZSBUZWFtIE5hbWUnPT0iQXJnZW50aW5hInwuJCdBd2F5IFRlYW0gTmFtZSc9PSJBcmdlbnRpbmEiKQogICAgICAgICAgICAgICYgLiRgVGVhbSBJbml0aWFsc2AhPSJBUkciKSAlPiUKICAgICAgICBtdXRhdGUod2luPWlmZWxzZSguJCdIb21lIFRlYW0gTmFtZSc9PSJBcmdlbnRpbmEiLDEsMCkpICU+JQogICAgICAgICAgbXV0YXRlKGxvc2U9aWZlbHNlKC4kJ0hvbWUgVGVhbSBOYW1lJyE9IkFyZ2VudGluYSIsMSwwKSkgJT4lCiAgICAgIHNlbGVjdChlbmFtZT0nUGxheWVyIE5hbWUnLCBsb3NlZz0nQXdheSBUZWFtIEdvYWxzJywgd2luZz0nSG9tZSBUZWFtIEdvYWxzJywgIAogICAgICAgICAgICAgTWF0Y2hJRCxSb3VuZElEICxvdGVhbT1gVGVhbSBJbml0aWFsc2Asd2luLGxvc2UpCmhlYWQoZW5lbXlfdGVhbSkKYGBgCgojIyDlj5blh7rot5/pmL/moLnlu7fpmoros4fmlpnkuKbkuJTntbHoqIjot5/mlbXkurrkuYvplpPnmoTli53loLTpl5zkv4IKYGBge3J9CiMg5Y+W5Ye66Lef6Zi/5qC55bu36ZqK5L+C77yM5Lqk5oiw55qE6ZqK5LyN5oiQ5ZOh6LOH5paZCmFnZW50aW5hX3RlYW0gPC0gYWxsRGF0YSAlPiUKICBmaWx0ZXIoIC4kYFRlYW0gSW5pdGlhbHNgPT0iQVJHIikgJT4lCiAgICAgIHNlbGVjdChuYW1lPSdQbGF5ZXIgTmFtZScsIE1hdGNoSUQsUm91bmRJRCApICU+JQogICAgICBtZXJnZShlbmVteV90ZWFtLGJ5PWMoIk1hdGNoSUQiLCJSb3VuZElEIikpICU+JQogICAgICBkaXN0aW5jdCgpCmhlYWQoYWdlbnRpbmFfdGVhbSkKCmBgYAoKIyMg5YiG5p6QTUVTU0noiIfku5bpmornkIPlk6HnmoTli53mlZfpl5zkv4IKYGBge3J9CnNldC5zZWVkKDg4OCkKIyDlu7rnq4vntrLot6/pl5zkv4IKYWdlbnRpbmFfbmV0d29yayA8LSBhZ2VudGluYV90ZWFtICU+JQogIGZpbHRlcihuYW1lPT0iTUVTU0kiKSU+JQogIGdyb3VwX2J5KG5hbWUgLGVuYW1lICkgJT4lCiAgc3VtbWFyaXNlKGxvc2VzdW09c3VtKGxvc2UpLHdpbnN1bT1zdW0od2luKSkgJT4lCiAgc2VsZWN0KG5hbWUgLGVuYW1lLCB3aW5zdW0sbG9zZXN1bSkgJT4lCmdyYXBoX2Zyb21fZGF0YV9mcmFtZShkaXJlY3RlZD1GKQoKYWdlbnRpbmFfbmV0d29yawoKIyBWKGFnZW50aW5hX25ldHdvcmspJGNvbG9yPSJsaWdodGJsdWUiCgpWKGFnZW50aW5hX25ldHdvcmspJGNvbG9yPWlmZWxzZShFKGFnZW50aW5hX25ldHdvcmspJHdpbnN1bS1FKGFnZW50aW5hX25ldHdvcmspJGxvc2VzdW0+MCwiZ3JlZW4iLGlmZWxzZShFKGFnZW50aW5hX25ldHdvcmspJHdpbnN1bS1FKGFnZW50aW5hX25ldHdvcmspJGxvc2VzdW08MCwicmVkIiwibGlnaHRibHVlIikpCgpwbG90KGFnZW50aW5hX25ldHdvcmspCgojIOaIkeWAkemHneWwjU1FU1NJ6IiH5YW25LuW5ZyL5a626ZqK5ZOh6YCy6KGM6Zec5L+C5YiG5p6Q77yM55Sx5ZyW5Lit5Y+v57SF6Imy55qE6KGo5pivTUVTU+aVl+WgtOavlOi8g+Wkmu+8jOe2oOiJsuS7o+ihqOWLneWgtOavlOi8g+WkmgpgYGAKCg==