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