I have been reading Mathletics by Wayne L. Winston and watching the 2018 Winter Olympics. I thought it might be fun to combine the Pythagorean Expectation, developed for baseball but applied to various other sports also, to the game of curling. I wrote the code and ran the program prior to the Women’s medal matches. Spoiler alert - Sweden won the Gold medal (with Korean getting the Silver) and Japan won the Bronze medal.
An analysis of Women’s Curling at the 2018 Winter Olympics in South Korea. The technique to predict future matches is based on the Baseball Pythagorean Theorem. The exponents for the Pythagorean Expetctaion were tested against games played to date on February 21, 2018 from 1.9 to 4.1 (by 0.1). Empirically 3.4 had the lowest mean-squared-error of that set
library('rvest')
participants <- "Women" # Set for output reasons
#Specifying the url for desired website to be scrapped
url <- 'http://results.worldcurling.org/Championship/DisplayResults?tournamentId=561&associationId=0&teamNumber=0&drawNumber=0'
exponent <- 3.4 # The exponent to use for the Pythagorean Expectation, determined empirically
The website www.worldcurling.org is accessed for game data
#Reading the HTML code from the website
webpage <- read_html(url)
#Using CSS selectors to scrape the rankings section
rank_data_html <- html_nodes(webpage,'.game-table')
num_games = length(rank_data_html)
The dowloaded webpage is scraped for the appropriate data
games <- matrix(nrow = num_games, ncol = 4)
# Scrape the data from the webpage
for (i in seq_len(num_games)) {
this_result <- rank_data_html[i]
teams <- html_text(html_nodes(this_result,".game-team"))
scores <- html_text(html_nodes(this_result,".game-total"))
games[i,c(1,2)] <- trimws(gsub('\r\n', '', teams))
games[i,c(3,4)] <- strtoi(trimws(gsub('\r\n', '', scores)))
}
rm(i, scores, teams, this_result)
At this point, data for all Women’s Curling games at the Olympics has been retrieved and stored in a matrix named games. We will split this matrix into a matrix of only the games that have already completed and the games scheduled to be held (as of February 22, 2018)
completeGames <- games[!is.na(games)[,3],]
# Get a list of the teams that are playing
teams <- unique(games[,1])
if (!is.na(pmatch("To Be", teams))) teams = teams[-length(teams)]
# Take a subset of the games that are scheduled to come
scheduledGames <- matrix(nrow=nrow(games[is.na(games)[,3],]), ncol = 6)
scheduledGames[,1] <- games[is.na(games)[,3],1]
scheduledGames[,4] <- games[is.na(games)[,3],2]
scheduledGames <- scheduledGames[!grepl("To Be", scheduledGames[,1]),]
# Get a list of the teams that are scheduled to play
upcomingTeams <- unique(c(scheduledGames[,1],scheduledGames[,4]))
Based on each team’s record, determine the percentage of games they have won.
standings = matrix(nrow=length(teams), ncol = 5)
count <- 1L
for(team in teams) {
wins <- sum(strtoi(completeGames[grepl(team, completeGames[,1]),3]) > strtoi(completeGames[grepl(team, completeGames[,1]),4])) +
sum(strtoi(completeGames[grepl(team, completeGames[,2]),4]) > strtoi(completeGames[grepl(team, completeGames[,2]),3]))
losses <- sum(strtoi(completeGames[grepl(team, completeGames[,1]),3]) < strtoi(completeGames[grepl(team, completeGames[,1]),4])) +
sum(strtoi(completeGames[grepl(team, completeGames[,2]),4]) < strtoi(completeGames[grepl(team, completeGames[,2]),3]))
standings[count,1] <- team
standings[count,2] <- wins
standings[count,3] <- losses
# standings[count,4] <- wins / (wins + losses)
standings[count,4] <- paste0(formatC(100 * (wins / (wins + losses)), format = "f", digits = 2), "%")
count <- count + 1L
print(paste(team, wins, losses, sep = ","))
}
[1] "Japan,5,4"
[1] "Olympic Athlete From Russia,2,7"
[1] "Denmark,1,8"
[1] "Switzerland,4,5"
[1] "Canada,4,5"
[1] "China,4,5"
[1] "Great Britain,6,3"
[1] "United States of America,4,5"
[1] "Korea,8,1"
[1] "Sweden,7,2"
# Clean up
rm(count, wins, losses, team)
No we can compute the Pythagorean Expectation for each team.
count <- 0L
for (team in teams) {
count <- count + 1L
scored <- sum(strtoi(completeGames[grepl(team, completeGames[,1]),3])) +
sum(strtoi(completeGames[grepl(team, completeGames[,2]),4]))
allowed <- sum(strtoi(completeGames[grepl(team, completeGames[,1]),4])) +
sum(strtoi(completeGames[grepl(team, completeGames[,2]),3]))
pythagorean <- (scored^exponent) / ((scored^exponent) + (allowed^exponent))
pythagorean <- paste0(formatC(100 * pythagorean, format = "f", digits = 2), "%")
standings[count,5] <- pythagorean
print(paste(team, pythagorean, sep=" = "))
}
[1] "Japan = 55.94%"
[1] "Olympic Athlete From Russia = 14.41%"
[1] "Denmark = 22.45%"
[1] "Switzerland = 57.34%"
[1] "Canada = 61.84%"
[1] "China = 39.02%"
[1] "Great Britain = 57.22%"
[1] "United States of America = 37.60%"
[1] "Korea = 85.97%"
[1] "Sweden = 72.67%"
standings <- as.data.frame(standings)
names(standings) <- c("Team", "Wins", "Losses", "Standing", "Pythagorean")
print(standings)
rm(count, pythagorean, allowed, scored, team)
Finally, prepare and list the upcoming games with each team’s standings and Pythagorean Expectation.
for (team in upcomingTeams) {
scheduledGames[grep(team, scheduledGames[,1]),2] <- as.character(standings[grep(team, standings[,1]),4])
scheduledGames[grep(team, scheduledGames[,1]),3] <- as.character(standings[grep(team, standings[,1]),5])
scheduledGames[grep(team, scheduledGames[,4]),5] <- as.character(standings[grep(team, standings[,1]),4])
scheduledGames[grep(team, scheduledGames[,4]),6] <- as.character(standings[grep(team, standings[,1]),5])
}
rm(team)
scheduledGames <- as.data.frame(scheduledGames)
names(scheduledGames) <- c("Team1", "Standings1", "Pythagorean1", "Team2", "Standings2", "Pythagorean2")
print(scheduledGames)
Interpreting this table, Sweden has been playing at a 72.67% level while winning 77.78% of their games. The other team, Great Britain has been playing at a 57.22% level. It is thought that these percentages are a better indication of their records than their actual record because the Pythagorean Expectation takes the score into account. A team that wins by several points is playing better than a team that barely wins by one point.
LS0tDQp0aXRsZTogIlIgTm90ZWJvb2sgb24gV29tZW4ncyBDdXJsaW5nIDIwMTggT2x5bXBpY3MiDQphdXRob3I6ICJEci4gQ2xpZnRvbiBCYWxkd2luIg0Kb3V0cHV0OiBodG1sX25vdGVib29rDQotLS0NCg0KQW4gYW5hbHlzaXMgb2YgV29tZW4ncyBDdXJsaW5nIGF0IHRoZSAyMDE4IFdpbnRlciBPbHltcGljcyBpbiBTb3V0aCBLb3JlYS4gVGhlIHRlY2huaXF1ZSB0byBwcmVkaWN0IGZ1dHVyZSBtYXRjaGVzIGlzIGJhc2VkIG9uIHRoZSBCYXNlYmFsbCBQeXRoYWdvcmVhbiBUaGVvcmVtLiANClRoZSBleHBvbmVudHMgZm9yIHRoZSBQeXRoYWdvcmVhbiBFeHBldGN0YWlvbiB3ZXJlIHRlc3RlZCBhZ2FpbnN0IGdhbWVzIHBsYXllZCB0byBkYXRlIG9uIEZlYnJ1YXJ5IDIxLCAyMDE4IGZyb20gMS45IHRvIDQuMSAoYnkgMC4xKS4gRW1waXJpY2FsbHkgMy40IGhhZCB0aGUgbG93ZXN0IG1lYW4tc3F1YXJlZC1lcnJvciBvZiB0aGF0IHNldA0KDQpgYGB7cn0NCmxpYnJhcnkoJ3J2ZXN0JykNCnBhcnRpY2lwYW50cyA8LSAiV29tZW4iICMgU2V0IGZvciBvdXRwdXQgcmVhc29ucw0KDQojU3BlY2lmeWluZyB0aGUgdXJsIGZvciBkZXNpcmVkIHdlYnNpdGUgdG8gYmUgc2NyYXBwZWQNCnVybCA8LSAnaHR0cDovL3Jlc3VsdHMud29ybGRjdXJsaW5nLm9yZy9DaGFtcGlvbnNoaXAvRGlzcGxheVJlc3VsdHM/dG91cm5hbWVudElkPTU2MSZhc3NvY2lhdGlvbklkPTAmdGVhbU51bWJlcj0wJmRyYXdOdW1iZXI9MCcNCg0KZXhwb25lbnQgPC0gMy40ICMgVGhlIGV4cG9uZW50IHRvIHVzZSBmb3IgdGhlIFB5dGhhZ29yZWFuIEV4cGVjdGF0aW9uLCBkZXRlcm1pbmVkIGVtcGlyaWNhbGx5IA0KDQpgYGANCg0KVGhlIHdlYnNpdGUgd3d3LndvcmxkY3VybGluZy5vcmcgaXMgYWNjZXNzZWQgZm9yIGdhbWUgZGF0YQ0KDQpgYGB7cn0NCiNSZWFkaW5nIHRoZSBIVE1MIGNvZGUgZnJvbSB0aGUgd2Vic2l0ZQ0Kd2VicGFnZSA8LSByZWFkX2h0bWwodXJsKQ0KDQojVXNpbmcgQ1NTIHNlbGVjdG9ycyB0byBzY3JhcGUgdGhlIHJhbmtpbmdzIHNlY3Rpb24NCnJhbmtfZGF0YV9odG1sIDwtIGh0bWxfbm9kZXMod2VicGFnZSwnLmdhbWUtdGFibGUnKQ0KDQpudW1fZ2FtZXMgPSBsZW5ndGgocmFua19kYXRhX2h0bWwpDQoNCmBgYA0KDQpUaGUgZG93bG9hZGVkIHdlYnBhZ2UgaXMgc2NyYXBlZCBmb3IgdGhlIGFwcHJvcHJpYXRlIGRhdGENCg0KYGBge3J9DQpnYW1lcyA8LSBtYXRyaXgobnJvdyA9IG51bV9nYW1lcywgbmNvbCA9IDQpDQoNCiMgU2NyYXBlIHRoZSBkYXRhIGZyb20gdGhlIHdlYnBhZ2UNCmZvciAoaSBpbiBzZXFfbGVuKG51bV9nYW1lcykpIHsNCiAgdGhpc19yZXN1bHQgPC0gcmFua19kYXRhX2h0bWxbaV0NCiAgdGVhbXMgPC0gaHRtbF90ZXh0KGh0bWxfbm9kZXModGhpc19yZXN1bHQsIi5nYW1lLXRlYW0iKSkNCiAgc2NvcmVzIDwtIGh0bWxfdGV4dChodG1sX25vZGVzKHRoaXNfcmVzdWx0LCIuZ2FtZS10b3RhbCIpKQ0KICBnYW1lc1tpLGMoMSwyKV0gPC0gdHJpbXdzKGdzdWIoJ1xyXG4nLCAnJywgdGVhbXMpKQ0KICBnYW1lc1tpLGMoMyw0KV0gPC0gc3RydG9pKHRyaW13cyhnc3ViKCdcclxuJywgJycsIHNjb3JlcykpKQ0KfQ0KDQpybShpLCBzY29yZXMsIHRlYW1zLCB0aGlzX3Jlc3VsdCkNCg0KYGBgDQoNCkF0IHRoaXMgcG9pbnQsIGRhdGEgZm9yIGFsbCBXb21lbidzIEN1cmxpbmcgZ2FtZXMgYXQgdGhlIE9seW1waWNzIGhhcyBiZWVuIHJldHJpZXZlZCBhbmQgc3RvcmVkIGluIGEgbWF0cml4IG5hbWVkIGdhbWVzLiBXZSB3aWxsIHNwbGl0IHRoaXMgbWF0cml4IGludG8gYSBtYXRyaXggb2Ygb25seSB0aGUgZ2FtZXMgdGhhdCBoYXZlIGFscmVhZHkgY29tcGxldGVkIGFuZCB0aGUgZ2FtZXMgc2NoZWR1bGVkIHRvIGJlIGhlbGQgKGFzIG9mIEZlYnJ1YXJ5IDIyLCAyMDE4KQ0KDQpgYGB7ciBDb21wbGV0ZWRHYW1lc30NCmNvbXBsZXRlR2FtZXMgPC0gZ2FtZXNbIWlzLm5hKGdhbWVzKVssM10sXQ0KDQojIEdldCBhIGxpc3Qgb2YgdGhlIHRlYW1zIHRoYXQgYXJlIHBsYXlpbmcNCnRlYW1zIDwtIHVuaXF1ZShnYW1lc1ssMV0pDQppZiAoIWlzLm5hKHBtYXRjaCgiVG8gQmUiLCB0ZWFtcykpKSB0ZWFtcyA9IHRlYW1zWy1sZW5ndGgodGVhbXMpXQ0KDQpgYGANCg0KYGBge3IgU2NoZWR1bGVkR2FtZXN9DQojIFRha2UgYSBzdWJzZXQgb2YgdGhlIGdhbWVzIHRoYXQgYXJlIHNjaGVkdWxlZCB0byBjb21lDQpzY2hlZHVsZWRHYW1lcyA8LSBtYXRyaXgobnJvdz1ucm93KGdhbWVzW2lzLm5hKGdhbWVzKVssM10sXSksIG5jb2wgPSA2KQ0Kc2NoZWR1bGVkR2FtZXNbLDFdIDwtIGdhbWVzW2lzLm5hKGdhbWVzKVssM10sMV0NCnNjaGVkdWxlZEdhbWVzWyw0XSA8LSBnYW1lc1tpcy5uYShnYW1lcylbLDNdLDJdDQpzY2hlZHVsZWRHYW1lcyA8LSBzY2hlZHVsZWRHYW1lc1shZ3JlcGwoIlRvIEJlIiwgc2NoZWR1bGVkR2FtZXNbLDFdKSxdDQoNCiMgR2V0IGEgbGlzdCBvZiB0aGUgdGVhbXMgdGhhdCBhcmUgc2NoZWR1bGVkIHRvIHBsYXkNCnVwY29taW5nVGVhbXMgPC0gdW5pcXVlKGMoc2NoZWR1bGVkR2FtZXNbLDFdLHNjaGVkdWxlZEdhbWVzWyw0XSkpDQoNCmBgYA0KDQpCYXNlZCBvbiBlYWNoIHRlYW0ncyByZWNvcmQsIGRldGVybWluZSB0aGUgcGVyY2VudGFnZSBvZiBnYW1lcyB0aGV5IGhhdmUgd29uLg0KDQpgYGB7cn0NCnN0YW5kaW5ncyA9IG1hdHJpeChucm93PWxlbmd0aCh0ZWFtcyksIG5jb2wgPSA1KQ0KY291bnQgPC0gMUwNCmZvcih0ZWFtIGluIHRlYW1zKSB7DQogIHdpbnMgPC0gc3VtKHN0cnRvaShjb21wbGV0ZUdhbWVzW2dyZXBsKHRlYW0sIGNvbXBsZXRlR2FtZXNbLDFdKSwzXSkgPiBzdHJ0b2koY29tcGxldGVHYW1lc1tncmVwbCh0ZWFtLCBjb21wbGV0ZUdhbWVzWywxXSksNF0pKSArDQogICAgc3VtKHN0cnRvaShjb21wbGV0ZUdhbWVzW2dyZXBsKHRlYW0sIGNvbXBsZXRlR2FtZXNbLDJdKSw0XSkgPiBzdHJ0b2koY29tcGxldGVHYW1lc1tncmVwbCh0ZWFtLCBjb21wbGV0ZUdhbWVzWywyXSksM10pKQ0KICBsb3NzZXMgPC0gc3VtKHN0cnRvaShjb21wbGV0ZUdhbWVzW2dyZXBsKHRlYW0sIGNvbXBsZXRlR2FtZXNbLDFdKSwzXSkgPCBzdHJ0b2koY29tcGxldGVHYW1lc1tncmVwbCh0ZWFtLCBjb21wbGV0ZUdhbWVzWywxXSksNF0pKSArDQogICAgc3VtKHN0cnRvaShjb21wbGV0ZUdhbWVzW2dyZXBsKHRlYW0sIGNvbXBsZXRlR2FtZXNbLDJdKSw0XSkgPCBzdHJ0b2koY29tcGxldGVHYW1lc1tncmVwbCh0ZWFtLCBjb21wbGV0ZUdhbWVzWywyXSksM10pKQ0KICBzdGFuZGluZ3NbY291bnQsMV0gPC0gdGVhbQ0KICBzdGFuZGluZ3NbY291bnQsMl0gPC0gd2lucw0KICBzdGFuZGluZ3NbY291bnQsM10gPC0gbG9zc2VzDQojICBzdGFuZGluZ3NbY291bnQsNF0gPC0gd2lucyAvICh3aW5zICsgbG9zc2VzKQ0KICBzdGFuZGluZ3NbY291bnQsNF0gPC0gcGFzdGUwKGZvcm1hdEMoMTAwICogKHdpbnMgLyAod2lucyArIGxvc3NlcykpLCBmb3JtYXQgPSAiZiIsIGRpZ2l0cyA9IDIpLCAiJSIpDQogIGNvdW50IDwtIGNvdW50ICsgMUwNCiAgcHJpbnQocGFzdGUodGVhbSwgd2lucywgbG9zc2VzLCBzZXAgPSAiLCIpKQ0KfQ0KDQojIENsZWFuIHVwDQpybShjb3VudCwgd2lucywgbG9zc2VzLCB0ZWFtKQ0KYGBgDQoNCk5vIHdlIGNhbiBjb21wdXRlIHRoZSBQeXRoYWdvcmVhbiBFeHBlY3RhdGlvbiBmb3IgZWFjaCB0ZWFtLg0KDQpgYGB7cn0NCmNvdW50IDwtIDBMDQpmb3IgKHRlYW0gaW4gdGVhbXMpIHsNCiAgICBjb3VudCA8LSBjb3VudCArIDFMDQogICAgc2NvcmVkIDwtIHN1bShzdHJ0b2koY29tcGxldGVHYW1lc1tncmVwbCh0ZWFtLCBjb21wbGV0ZUdhbWVzWywxXSksM10pKSArDQogICAgICAgIHN1bShzdHJ0b2koY29tcGxldGVHYW1lc1tncmVwbCh0ZWFtLCBjb21wbGV0ZUdhbWVzWywyXSksNF0pKQ0KICAgIGFsbG93ZWQgPC0gc3VtKHN0cnRvaShjb21wbGV0ZUdhbWVzW2dyZXBsKHRlYW0sIGNvbXBsZXRlR2FtZXNbLDFdKSw0XSkpICsNCiAgICAgICAgc3VtKHN0cnRvaShjb21wbGV0ZUdhbWVzW2dyZXBsKHRlYW0sIGNvbXBsZXRlR2FtZXNbLDJdKSwzXSkpDQogICAgcHl0aGFnb3JlYW4gPC0gKHNjb3JlZF5leHBvbmVudCkgLyAoKHNjb3JlZF5leHBvbmVudCkgKyAoYWxsb3dlZF5leHBvbmVudCkpDQogICAgcHl0aGFnb3JlYW4gPC0gcGFzdGUwKGZvcm1hdEMoMTAwICogcHl0aGFnb3JlYW4sIGZvcm1hdCA9ICJmIiwgZGlnaXRzID0gMiksICIlIikNCiAgICBzdGFuZGluZ3NbY291bnQsNV0gPC0gcHl0aGFnb3JlYW4NCiAgICBwcmludChwYXN0ZSh0ZWFtLCBweXRoYWdvcmVhbiwgc2VwPSIgPSAiKSkNCn0NCg0Kc3RhbmRpbmdzIDwtIGFzLmRhdGEuZnJhbWUoc3RhbmRpbmdzKQ0KbmFtZXMoc3RhbmRpbmdzKSA8LSBjKCJUZWFtIiwgIldpbnMiLCAiTG9zc2VzIiwgIlN0YW5kaW5nIiwgIlB5dGhhZ29yZWFuIikNCg0KcHJpbnQoc3RhbmRpbmdzKQ0Kcm0oY291bnQsIHB5dGhhZ29yZWFuLCBhbGxvd2VkLCBzY29yZWQsIHRlYW0pDQoNCmBgYA0KDQpGaW5hbGx5LCBwcmVwYXJlIGFuZCBsaXN0IHRoZSB1cGNvbWluZyBnYW1lcyB3aXRoIGVhY2ggdGVhbSdzIHN0YW5kaW5ncyBhbmQgUHl0aGFnb3JlYW4gRXhwZWN0YXRpb24uDQoNCmBgYHtyfQ0KZm9yICh0ZWFtIGluIHVwY29taW5nVGVhbXMpIHsNCiAgICBzY2hlZHVsZWRHYW1lc1tncmVwKHRlYW0sIHNjaGVkdWxlZEdhbWVzWywxXSksMl0gPC0gYXMuY2hhcmFjdGVyKHN0YW5kaW5nc1tncmVwKHRlYW0sIHN0YW5kaW5nc1ssMV0pLDRdKQ0KICAgIHNjaGVkdWxlZEdhbWVzW2dyZXAodGVhbSwgc2NoZWR1bGVkR2FtZXNbLDFdKSwzXSA8LSBhcy5jaGFyYWN0ZXIoc3RhbmRpbmdzW2dyZXAodGVhbSwgc3RhbmRpbmdzWywxXSksNV0pDQogICAgc2NoZWR1bGVkR2FtZXNbZ3JlcCh0ZWFtLCBzY2hlZHVsZWRHYW1lc1ssNF0pLDVdIDwtIGFzLmNoYXJhY3RlcihzdGFuZGluZ3NbZ3JlcCh0ZWFtLCBzdGFuZGluZ3NbLDFdKSw0XSkNCiAgICBzY2hlZHVsZWRHYW1lc1tncmVwKHRlYW0sIHNjaGVkdWxlZEdhbWVzWyw0XSksNl0gPC0gYXMuY2hhcmFjdGVyKHN0YW5kaW5nc1tncmVwKHRlYW0sIHN0YW5kaW5nc1ssMV0pLDVdKQ0KfQ0Kcm0odGVhbSkNCg0Kc2NoZWR1bGVkR2FtZXMgPC0gYXMuZGF0YS5mcmFtZShzY2hlZHVsZWRHYW1lcykNCm5hbWVzKHNjaGVkdWxlZEdhbWVzKSA8LSBjKCJUZWFtMSIsICJTdGFuZGluZ3MxIiwgIlB5dGhhZ29yZWFuMSIsICJUZWFtMiIsICJTdGFuZGluZ3MyIiwgIlB5dGhhZ29yZWFuMiIpDQoNCnByaW50KHNjaGVkdWxlZEdhbWVzKQ0KDQpgYGANCg0KDQpJbnRlcnByZXRpbmcgdGhpcyB0YWJsZSwgYHIgc2NoZWR1bGVkR2FtZXNbMSwxXWAgaGFzIGJlZW4gcGxheWluZyBhdCBhIGByIHNjaGVkdWxlZEdhbWVzWzEsM11gIGxldmVsIHdoaWxlIHdpbm5pbmcgYHIgc2NoZWR1bGVkR2FtZXNbMSwyXWAgb2YgdGhlaXIgZ2FtZXMuIFRoZSBvdGhlciB0ZWFtLCBgciBzY2hlZHVsZWRHYW1lc1sxLDRdYCBoYXMgYmVlbiBwbGF5aW5nIGF0IGEgYHIgc2NoZWR1bGVkR2FtZXNbMSw2XWAgbGV2ZWwuIEl0IGlzIHRob3VnaHQgdGhhdCB0aGVzZSBwZXJjZW50YWdlcyBhcmUgYSBiZXR0ZXIgaW5kaWNhdGlvbiBvZiB0aGVpciByZWNvcmRzIHRoYW4gdGhlaXIgYWN0dWFsIHJlY29yZCBiZWNhdXNlIHRoZSBQeXRoYWdvcmVhbiBFeHBlY3RhdGlvbiB0YWtlcyB0aGUgc2NvcmUgaW50byBhY2NvdW50LiBBIHRlYW0gdGhhdCB3aW5zIGJ5IHNldmVyYWwgcG9pbnRzIGlzIHBsYXlpbmcgYmV0dGVyIHRoYW4gYSB0ZWFtIHRoYXQgYmFyZWx5IHdpbnMgYnkgb25lIHBvaW50Lg==