orienteering - using r to optimise mini mountain marathon routes - pete dodd sheffield r users march...
Post on 17-Jul-2015
193 Views
Preview:
TRANSCRIPT
This talk
Using R to grab, visualize, and analyse data from a mini mountainmarathon
I getting data from web tables with rvestI manipulating the dataI visualisation with ggplot2I mapping with ggmapI analysis of speeds and leg lengthsI genetic algorithms for optimisation with GA
rvest
library(rvest)library(ggplot2)rurl <- 'http://www.sportident.co.uk/results/....html'rurl %>% html() %>% html_table() %>% as.data.frame() %>%
ggplot(.,aes(x=Score)) %>%+geom_histogram(binwidth=10) %>% print
Data manipulationdata frame sdf with position, score and route:
## [1] "Pos" "Name"## [3] "Team" "Category"## [5] "Score" "Time"## [7] "Points" "Bonus.Penalty"## [9] "Manual.Adj" "Controls..in.order.visited"
data frame sdf splits:
## [1] "Pos" "Name" "Category" "Score"## [5] "Time" "X.U.00A0." "X.U.00A0..1" "X.U.00A0..2"## [9] "X.U.00A0..3" "X.U.00A0..4" "X.U.00A0..5" "X.U.00A0..6"## [13] "X.U.00A0..7" "X.U.00A0..8" "X.U.00A0..9" "X.U.00A0..10"## [17] "X.U.00A0..11" "X.U.00A0..12" "X.U.00A0..13" "X.U.00A0..14"## [21] "X.U.00A0..15" "X.U.00A0..16" "X.U.00A0..17" "X.U.00A0..18"## [25] "X.U.00A0..19"
Data manipulation
CN <- c('S1',paste0('10',1:9),paste0('1',10:24),'F1')
getpath <- function(pos){tt <- tdf$Controls..in.order.visited[pos]tt2 <- unlist(strsplit(tt,', '))tt3 <- sapply(X=tt2,FUN = function(x)which(CN==x))g <- G[tt3,] #df of controlsg$Pos <- posg$Pos <- factor(g$Pos)tt <- gettimez(sdf[pos,6:ncol(sdf)]) #splitsg$split <- tt[!is.na(tt)]return(g)
}
Data manipulationlibrary(grid) #for arrowBP <- ggplot(data=G,aes(x=LON,y=LAT,label=Value)) +
geom_point(shape=1,size=3) +geom_text(size=4,hjust=-.5,color='red') +
scale_shape_discrete(solid=FALSE)
for(i in 1:nrow(tdf)){GP <- BP+
geom_segment(data=getpath(i),aes(xend=c(tail(LON,n=-1),NA),yend=c(tail(LAT,n=-1),NA),color=split),arrow = arrow(angle = 15, ends = "last", length = unit(0.2, "inches")),alpha=.9)+ggtitle(paste0(i,': ',tdf[i,2],'\nScore: ',tdf$Score[i],', penalty: ',tdf$Bonus.Penalty[i]))+scale_colour_gradient(limits=c(0,45),high='red',low='blue') + theme(plot.title = element_text(hjust = 0))
ggsave(GP,file=paste0('graphs/GP',sprintf("%03d",i),'.png'))}
Use FFMPEG to make movie!
Mapping
library(ggmap)bbox <- make_bbox(LON, LAT, G, f = .8)map <- get_map(location = bbox,maptype='terrain')mp <- ggmap(map) + geom_point(data=G,aes(x=LON,y=LAT),shape=1,size=3)+
geom_text(data=G,aes(x=LON,y=LAT,label=Value),size=4,hjust=-.5,color='red')+scale_shape_discrete(solid=FALSE) + ylim(c(min(G$LAT)-eps,max(G$LAT)+eps)) +
xlim(c(min(G$LON)-eps,max(G$LON)+eps))
NB geom_leg needed rather than arrow for some reason.
Mapping
Lessons:
I easy to use & integrates well with ggplot2I osm can be used rather than google, but service only runs in
middle of night!I discrete zoom levels can be awkward if you’re in betweenI bbox’s are square; although you can trim the display with xlim
etc.I usual shenanigans with different coordinate systems
Analysis
●
●
●
●
●
●
●
●
●
●
●
●
●
●●
●
●
●
●
●
●
●
●
●●
●
30
40
20
20
30
20
20
30
30
20
10
30
20 30
30
20
20
20
20
10
20
403030
53.23
53.25
53.27
53.29
53.31
−1.64 −1.62 −1.60 −1.58 −1.56LON
LAT
Analysis
Need a way of standardizing the leg durations, given splits fromdifferent runners.
One might imagine for leg i and runner j , split Tij
Tij = di/sj
where di is an inherent leg duration, and sj is a relative speed. Then
logTij = log di − log sj
Suggests linear regression:
lm(log(split) ~ leg + Pos + 0)
Analysis
●
●
●●●
●●
●
●
●
●
●
●
●●
●
●
●●
●
●●●●
●
●
●●●
●●
●●
●
●
●
●●●
●
●●
●
●
●
●●●
●
●●
●●●●●
●
●●
●
●●●
●
●
●
●●
●
●
●
●●●
●
●
●●
●
●
●
●●●●
●
●
●
●
●
●
●
●
●
●
●
●●
●
●
●
●
●
●●
●●●
●
●
●●
●
●●
●
●●
●
●●●
●●
●
●
●
●●
●
●
●
●●
●
●
●
●
●
●
●
●
●
●
●
●
●●
●
●
●
●
●●
●
●
●
●
●
●
●
●
●
●
●
●
●
●●
●
●
●
●
●
●
●
●
●
●
●
●
●
0.00
0.25
0.50
0.75
1.00
0 50 100 150position
Spe
ed r
elat
ive
to w
inne
r
Optimization problem
I Combinatorial optimisation problem, similar to the travellingsalesman problem
I These problems are (NP) hardI Need to encode routes and their fitness (including penalties)
I sample a route as a permutation of 1:no_checkpoints,extracting the points between 1 and no_checkpoints
I 26! ≈ 4× 1026 (cf Avogadro’s number)I =⇒ need heuristics; not true solutions
Genetic algorithms
A class of optimization algorithms inspired by evolution.
There is a population of solutions with:
I a notion of fitnessI generationsI mutationI crossover (sex)
Package GA
Makes using these techniques pretty easy:
GA <- ga(type = "permutation", fitness = fitness,min = 1, max = length(ptz),popSize = 1e2, maxiter = 1e4,run = 5e3, pmutation = 0.2)
Package GA
0 2000 4000 6000 8000 10000
010
020
030
040
0
Generation
Fitn
ess
valu
e
●●●●●●
●
●●●●●●●●●
●●●●●●●●
●●●●●●●●●●
●●●●●●●●●●●●●●●●●●●●●●●●
●●●●●●●●●●●●●
●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●
●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●
●●●●
●●●●●●
●●●●●●●●●●●●●
●●●●●●●●●●●●●●●●●●
●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●
●●●●●●●●●●●●●●●●●●●●●●
●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●
●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●
●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●
●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●
●●●●●●●●●●●●●●●●●
●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●
●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●
●●●●●●●●●●●●●●●●●●●●●●●●●
●●●●●●●●●●●●●●●●●
●●●●●
●●●
●●●
●●●●●●●●●
●●●
●
●●
●●●
●●●●●●●●●●●●●●●●●●
●●
●●●●
●●●
●●
●●●
●
●
●●
●
●●●●●
●●●●
●●●●●●●●●●●
●●●●●●●
●
●
●●●●●
●
●●●●●
●●
●●●●●●●●●
●●●●●●●●●
●
●●●
●●●●
●●●●●●●●●●●●●●●
●●●●●●●●●●
●●●●●●●●●●●●●●
●
●
●●●●●●●●●●
●●
●●●
●
●●●●
●●●●●●●●●●●
●●●
●●
●●●●
●●●
●
●●●●●●●●●●●●●●
●●
●●●●●●●●
●●●●●●
●●●●●
●
●●●●●
●●●●●●
●
●●●●
●●●
●●
●●●
●
●●●
●
●
●●
●●●●
●●
●●
●●●●●
●
●●●
●●●●●●
●●●
●
●●
●
●
●●
●●●●
●●●
●●●●
●●●
●
●●●
●●
●
●
●●
●
●●●●●●●●●●●●●●●●●
●●●●
●
●
●
●●
●●●●
●
●●●●
●
●
●
●
●
●
●●●
●●●
●●●
●
●
●
●●●●●●●●
●
●
●●●●
●●
●●
●●●
●●
●
●
●
●●
●
●●●●●●●●
●●
●
●●●●●
●●
●●●●
●●
●
●●●
●●●●●
●
●
●
●
●
●
●
●●
●●
●●●●●●
●●
●●●●●●●
●●●
●●●●
●
●
●
●●●●●
●●
●●
●●●
●
●
●●
●●●●
●
●
●
●●●●
●●●
●
●●●●●
●●●
●
●
●●●●
●
●●●●●●
●
●
●
●
●●●●●
●●
●
●●
●●
●
●
●●
●●
●
●
●●●●
●●●
●
●
●
●●
●●
●●
●
●●●
●
●●●
●●
●●●
●
●●●
●●●●●●●
●●●●●●●●●
●●●
●●●●
●
●●●
●●●●●
●●
●●
●
●●●●●●
●
●●●●●
●●
●
●
●
●
●
●
●●●●
●●●●
●●
●●●
●
●
●●●●
●
●
●
●●●
●
●●
●
●●
●●
●●
●●●●
●
●
●●
●
●●
●●●
●●●
●●
●●●
●●
●
●
●●●
●
●●
●●●●●●●●●●●●●●
●
●●●●●●
●●●●
●●●
●●
●
●
●
●●●
●●
●●●●●
●
●●
●●●●
●●
●
●
●
●●
●●●
●●
●
●
●●●●
●
●
●
●
●●
●●
●
●●
●●●
●
●●●
●
●
●
●●●●
●
●●●●●
●
●
●●●●●
●
●●●●●●●●●●
●●
●●
●
●
●
●●
●●●●
●●
●
●●●●
●
●
●●●
●●●
●
●
●
●
●
●
●
●
●
●
●●●
●
●●
●
●
●
●
●
●
●●●●●
●●
●
●
●●
●●●●●
●
●
●●
●
●●
●●
●
●
●
●●
●
●●●●●
●●●
●
●●●●●●●
●●
●
●
●●●
●
●
●
●●
●●
●●
●●●●
●
●●
●●
●
●
●
●
●●
●
●●●●●
●●●●
●●●
●
●●
●
●●●●●●●
●●
●●●●●●●
●●●●
●●
●●
●
●
●●
●
●
●
●
●
●
●
●
●
●●●●
●
●●●●
●●●
●
●
●
●●
●●●
●●
●
●
●●●●
●
●
●
●
●●
●
●
●●●
●●
●●
●
●●
●●●
●
●●
●
●●●●●●
●●●
●
●
●●
●
●●●
●
●
●●
●●●
●
●●
●●●●
●
●●●
●●
●●●●●●
●
●●
●
●
●
●
●
●
●
●●●●●
●
●
●
●
●●
●●
●●●●●●●
●
●
●●●●
●●
●●●
●
●
●●●●●
●●
●●
●
●
●●
●
●
●●●
●●●
●●
●●
●
●
●
●
●●●●●●●●●●
●●
●●●●●●
●
●
●●
●
●
●●●
●●●●●●●●●
●●
●
●
●●
●
●
●●●
●
●●
●
●
●●
●
●●●●●
●
●
●●
●
●●
●
●●
●
●
●
●●●
●●●
●●●
●
●●
●●●●
●●●●●●
●●
●●●
●●●
●●
●
●
●●●
●
●●●
●
●
●●●●●●
●●●●
●●
●●
●●
●
●●
●●
●●●●
●
●●
●
●●●●●●●●●
●
●●●
●●
●
●●
●●
●●●●
●
●●●●●●●●
●
●●
●●●●
●●●●
●
●
●●
●●
●●●
●
●●●
●●
●
●
●
●
●●●●●●●●
●
●
●
●●
●
●
●●●
●
●●
●●
●●●
●●
●●●●●●
●●
●
●●
●
●●●●●●
●●●
●●●●●
●●●●●
●
●●
●●
●
●
●●●●
●●●
●●
●
●●●
●
●
●
●
●
●●
●●●
●
●
●●●●●
●●●
●
●●●●
●●
●
●
●●●
●●●●
●
●●
●
●
●
●
●●
●●●●
●●
●
●
●
●●●●
●●●●●
●●
●
●
●●
●
●●
●
●
●
●●●
●
●●●●
●
●●
●
●●
●●●●
●
●
●
●●
●
●
●
●
●
●●
●●●●
●
●●
●●●●
●
●●●
●●●●
●●●
●●●●●●●
●●●
●
●
●●
●
●●●●
●
●
●●●
●●●●
●●●●●
●●
●●
●
●
●●●
●
●●●
●●
●
●●
●
●
●
●●●
●●
●
●●
●●●●●●
●
●
●●●●●
●
●
●●
●●●●
●●●●
●
●
●
●
●
●
●●●
●
●●●●●●●
●●
●
●●●●●●●●●●
●●●●●●●●●●
●●●●
●●
●
●●●●
●
●
●●
●
●●
●●
●●●
●
●
●●●
●●
●●●●
●●
●●
●
●●
●
●
●
●●
●
●
●
●
●
●●
●
●
●
●
●
●
●
●
●
●●●
●●●
●
●
●
●●
●●●
●
●
●
●
●●
●
●●
●●●●
●
●
●●
●●●
●
●
●●●
●
●
●●
●
●●●
●●●●
●●●
●●●●
●●
●
●
●●
●●
●
●●●●
●
●●●
●●●
●●●
●●
●●●
●
●
●●
●
●
●
●●
●
●●
●●
●●
●
●●●●●
●●
●
●
●●●●●●●●
●●●●●●
●●●
●
●●
●
●
●
●
●●●
●●●●●●●
●●●
●●●
●
●●
●●●●●
●●
●●
●
●
●
●●●●●●
●
●●
●
●●
●
●
●●●●
●●
●●●
●
●●●●●●
●●●●
●●
●●●●
●
●●
●●
●
●●●
●
●●
●
●●●●
●●●
●
●
●
●●
●●●●
●●●●●●
●●
●
●
●
●●●
●
●●
●●●●●
●
●●●
●
●●●●
●●●●
●●●●
●●●●
●●
●
●
●●
●●●●
●●●
●●
●
●●●●●●●●●
●●●●
●
●●●
●
●●
●
●●
●
●●●
●●●●●●
●●●
●
●
●●●
●
●●●
●
●●
●●
●
●
●●
●
●
●
●●●●
●
●●
●●●●●
●●●
●
●
●●●
●
●●
●
●
●●
●●●●
●
●
●●●●●
●●●●●●
●
●
●●●●●●●●
●●
●●●●●●●
●●
●
●
●
●
●
●●●●●●
●●
●●●
●●
●
●●●●●●
●
●
●●●
●
●
●
●●●●●●
●●
●
●
●
●
●
●
●
●●●●
●●●●●●
●●
●
●
●
●●
●
●
●
●●
●
●
●
●
●
●
●
●
●
●●
●
●
●
●
●●
●
●
●
●●●
●
●●●
●
●
●
●
●●
●
●●
●
●
●
●
●
●
●
●
●●
●
●
●
●
●
●
●
●
●
●
●●●●●●●
●●
●
●
●●●
●
●●
●
●●
●
●
●
●●
●
●●
●●●
●
●
●
●●
●●●●
●
●
●
●
●
●●
●●●
●
●
●
●
●
●
●
●
●
●●
●
●
●●
●
●●●
●
●
●
●
●
●●
●
●
●●
●
●
●
●
●●
●
●
●
●●●
●
●
●
●●
●●
●●
●
●
●
●
●
●
●
●●
●
●
●●
●
●
●●
●
●
●
●
●●●
●●
●
●●●
●
●
●
●
●
●●●●●
●
●●
●
●
●
●
●●●●
●
●
●
●
●●
●
●
●●
●●●●●
●●
●●●
●●
●
●●
●
●●
●
●
●
●
●
●●●●●●
●
●●
●
●
●
●
●
●●●●●
●
●
●●
●
●●●
●
●
●
●
●
●
●
●
●
●●●●●
●●●●●●
●
●●
●
●
●●●
●●
●
●●
●●●
●●●
●●●●●●
●
●
●●
●●
●
●●
●
●
●
●
●●●
●●●●
●
●
●
●●
●●
●●●●
●●
●●●●
●
●●
●●
●●
●●●
●
●●●
●
●
●●
●
●●
●
●
●
●
●●
●●●
●
●
●
●
●
●●
●
●●
●
●●●
●
●
●
●
●
●●
●
●●
●●●
●
●
●
●
●
●
●
●●
●
●
●
●●
●●
●
●●●
●●
●
●
●
●●●●
●●●
●●
●
●
●
●
●●
●
●●●
●●●
●●●●●
●●●
●
●●
●
●●
●●
●
●
●●
●●
●
●
●
●●●
●●●●
●
●
●
●
●●●●●●
●
●
●●
●●●●
●●
●
●●●●
●●
●
●
●
●●
●
●
●
●
●
●
●
●
●●
●
●
●
●
●●●●●
●●●
●●●
●
●●●●●
●●
●●●●
●●
●
●
●
●●●●
●●●●
●●
●
●
●●
●●
●●●
●
●
●
●
●●
●●●
●
●
●
●●●
●●●●
●
●
●
●
●●●
●
●●
●●
●
●●●
●
●
●
●●
●
●●
●
●
●●●
●●
●
●●●
●●●
●●●
●
●●●
●
●
●●
●●●
●●
●
●
●●●
●
●●
●
●
●
●●●●
●
●
●●
●
●
●●●
●
●
●●
●
●●
●●●●●●●●
●
●●●●●●
●●●
●
●●●
●
●
●●●
●
●
●●●
●
●
●
●●●
●
●●●
●●
●●
●
●
●
●
●●
●●
●●
●
●●
●
●●
●
●●
●●
●●
●●
●
●
●
●
●
●
●●
●
●
●●●●
●●●●
●●
●
●●
●●
●
●●●
●
●
●
●●●●●
●
●●●
●●
●
●●●●
●
●●●
●
●
●
●●●●
●
●●●●
●
●●●
●
●●
●
●●
●●●
●●●
●
●
●
●
●●●●
●
●
●●●●
●●●●●●
●●
●
●
●
●
●
●●●●●●
●●●●
●●●●●●
●●●
●
●●●
●●●●●
●
●
●●
●●●●
●
●
●●
●
●●●
●
●
●
●●●
●
●●
●
●
●●
●
●
●
●
●●●●
●●●
●●
●●
●
●●●●●●
●●●
●●
●●
●●●●●
●
●●●●●●●●●●●●●●●●●●
●●●●●
●
●
●
●●●
●●●
●●●●●●
●
●●●
●●●●
●●●●
●
●●●
●
●●●
●
●
●
●
●
●
●
●
●
●●●
●●●
●●●●
●
●●●●●●
●
●
●●
●
●●●●●
●
●
●
●
●
●
●●●●
●
●●
●●●●
●
●●●●●●●●●
●●●
●
●
●
●●●●●●
●●●●●
●
●●●●
●
●
●●●
●●●
●
●●●
●●
●●●●●●●●●●
●●●●●●●
●●●
●
●
●●●
●
●●
●
●
●●●●●●●●●
●●●●
●
●●
●
●●●●
●●
●
●
●●●●
●
●●
●●
●
●
●●●
●●●●●
●
●
●●●●
●●
●●●
●
●
●●●
●
●●
●
●
●●●●●●●●
●
●
●
●
●
●●
●
●●●
●●
●●
●
●
●
●●
●
●●
●●●
●●●
●●
●
●●●●
●●●
●
●●●
●
●●
●
●
●●●●●
●
●●
●
●
●
●●●●
●●
●●
●●●●
●●
●●●
●●●
●
●●●
●
●●●
●●●●
●
●●●●
●
●●●
●
●●●●
●●
●
●
●
●
●●
●
●●
●●●●●●●●●●
●
●●●●●
●●
●
●●
●
●●
●
●●●●●●
●●●●
●
●
●●●
●●●
●
●
●●●
●
●●
●●●
●
●
●●●
●●●
●
●
●●●●
●●●●●●●
●
●
●●
●
●
●
●
●
●●●
●
●
●●
●●
●●●●
●
●●
●
●
●●●●
●
●
●●●●
●●●
●
●●●●
●●●●
●●●●
●
●
●●●
●●●
●●●●●●●●●●●
●
●
●●
●●●
●
●●●●
●●●●●●●
●
●
●●●
●
●●
●
●
●
●●●●●●●
●
●
●●
●●●
●●●
●
●
●
●
●
●
●
●●●●●
●
●●
●●
●
●●●
●●
●●●●●●●●
●
●
●
●
●●
●
●●
●
●●
●
●
●
●
●●
●●
●
●
●
●
●●
●
●
●
●
●●●●
●
●
●●●
●●●
●●
●
●
●
●
●
●●●●
●
●
●
●
●
●●
●●
●●
●●●●
●●
●
●●
●●
●
●●
●
●
●●
●
●
●
●
●●
●●
●●
●
●
●
●
●
●
●
●●
●
●●●
●
●●
●
●●
●●
●●
●●
●
●●●
●
●
●
●
●
●●●
●●
●●
●●
●
●●
●●
●●
●
●●
●●●●
●●●●
●
●
●
●
●
●
●
●
●●●
●
●
●
●
●●●
●●●
●●
●
●
●
●●
●●●●
●●
●
●●●
●
●
●●●●
●●
●●●
●●●●●
●
●
●
●●●●●
●
●
●●●
●
●●●
●
●
●●●
●●
●
●
●●●
●
●
●
●
●●
●●●
●●
●
●●●●●
●●●
●●●●
●●●●
●●●
●●●
●●
●●
●
●
●●
●●
●
●
●
●
●
●●
●
●●●
●
●
●●
●
●
●
●
●
●
●
●
●
●
●
●
●
●●●●
●
●
●
●
●●
●
●
●
●
●
●
●
●
●
●
●
●●
●●
●
●
●
●
●
●
●
●
●
●●●●
●
●
●
●●
●●
●●●●
●●●
●
●●
●●
●●
●●
●
●●
●
●
●
●
●
●
●
●
●
●
●
●
●●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●●
●
●
●●
●
●
●●
●
●
●
●
●
●
●●
●
●●
●
●
●●●
●
●
●
●
●●●
●
●
●
●
●●
●
●●
●
●
●●
●
●●
●●
●
●
●
●●
●
●●●
●●
●
●
●
●●●●●●●
●●●
●●●
●
●
●
●
●
●
●●●●●
●
●●●
●
●
●
●●
●
●
●
●
●
●
●
●
●●
●●
●
●
●●
●
●●●●●
●
●●
●
●
●
●●
●
●
●●
●
●
●
●
●
●
●
●
●●●
●
●
●
●●
●
●
●
●●
●
●
●
●
●
●
●
●
●
●
●●
●
●
●●
●●
●
●●●
●●●
●
●
●
●
●
●
●
●
●
●
●
●
●●
●
●●●
●
●
●
●
●
●
●
●
●
●
●
●●
●
●●
●●
●
●●
●
●
●
●●
●
●
●
●
●
●
●
●
●●
●
●
●
●
●
●
●
●
●●
●
●
●
●
●
●●
●
●
●
●●●
●
●
●
●
●●●
●●
●
●
●
●●●
●
●
●
●●
●
●
●
●
●
●
●
●●●
●
●●
●●
●
●●●
●
●
●●
●
●
●
●
●
●●
●
●●
●
●●
●
●
●
●●
●
●
●
●●
●
●●
●
●
●
●
●●
●●
●
●
●
●●●
●
●
●
●
●
●
●
●●
●
●
●
●
●●
●
●
●
●
●●
●
●
●
●
●
●
●
●
●
●
●
●
●●
●
●
●
●●
●
●
●
●●
●●
●
●
●
●●●●●
●
●
●
●
●●
●
●
●
●●
●
●●
●●●
●
●
●
●
●
●
●●●
●
●
●
●
●●
●
●
●
●
●●●●
●
●●
●
●●
●
●●●
●●●●●
●●●
●
●●●●
●
●●
●●
●●
●
●
●●
●
●
●●●
●●●
●
●
●
●
●
●●
●●
●●
●●
●
●
●●
●●
●
●
●●
●
●
●
●
●
●
●
●
●●●●
●
●●
●
●
●
●
●
●
●●
●
●
●
●●
●
●
●
●
●
●●●
●
●●
●
●
●
●
●
●●
●
●
●
●
●
●
●
●
●●
●
●
●
●
●●●
●
●●
●●
●
●●
●
●
●
●●
●
●●
●
●
●
●
●
●●
●
●
●
●
●
●
●
●●
●●
●
●●
●
●
●
●
●●
●
●
●●
●●
●●●●●●
●●
●
●
●
●●●●
●●
●●●
●
●●●●
●
●●●●
●●●
●●●
●●
●
●
●●●
●
●
●
●
●
●●
●●
●●
●●
●
●
●
●
●
●●●
●
●
●
●
●●
●●●
●●
●
●
●
●
●
●●
●
●
●
●
●
●●●●
●●
●●●
●
●●
●●
●
●
●
●●●
●●●●●●●●
●●
●●
●●●●●●
●●●●
●●●●
●
●●
●
●●
●
●●
●
●●●●●
●●
●
●●●●
●
●
●
●●
●●
●●●
●
●
●
●●●
●
●
●●●
●●
●●
●●●
●●
●
●
●
●●●
●
●
●
●
●●
●
●
●
●●●●
●●
●
●●
●
●●
●
●
●
●●
●
●
●●
●
●
●
●●●●
●
●
●●●
●
●
●●●
●
●
●●●●●●
●●●
●●
●
●
●
●
●●●
●
●●
●
●●●
●
●●
●
●●
●
●
●●
●●●●
●
●
●●
●●
●
●●
●
●
●
●
●
●
●●●●
●●●●
●
●●
●
●●●
●●●●
●●●
●●
●
●●●●
●
●
●
●
●●
●
●
●●
●●
●
●
●
●
●
●
●
●●●●
●
●
●
●
●
●
●
●
●
●
●
●●
●
●●
●●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●●●
●●
●
●
●
●●
●
●
●●
●
●●
●
●
●
●
●●
●
●
●
●
●
●
●
●
●
●
●●
●
●
●
●
●
●●●●
●
●
●●
●
●
●●
●
●
●●
●
●
●
●●
●
●
●
●
●
●
●●
●
●
●
●
●●●
●●●
●
●●●
●●
●
●
●●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●●
●●
●
●●
●
●●
●
●
●●
●●
●
●
●●●●
●●●
●●
●●
●
●●●
●
●
●
●
●●
●●
●●●●●●●
●
●●
●
●●●●
●●
●●
●●
●●●●
●●●●●●
●
●●
●
●
●●
●
●
●
●●
●●
●
●
●
●●
●●●
●
●
●
●
●●
●
●
●●
●
●
●●
●●
●●
●
●
●
●●●●
●●
●
●●
●●●●●●●
●
●●
●
●
●●
●●
●●
●
●●
●●
●●
●
●
●
●
●
●
●
●
●
●
●●
●●
●●
●
●
●●
●
●●
●●●
●
●
●
●
●●
●
●●●
●
●●
●
●●
●
●●
●
●
●
●
●●
●●
●●
●
●
●
●
●
●
●
●
●
●
●
●
●●
●
●
●
●●
●
●●●
●
●
●●
●●
●
●●●●
●
●●
●
●
●
●
●
●
●●
●
●
●
●
●
●
●
●
●
●
●
●●
●
●
●
●●
●
●●
●
●
●
●
●
●
●
●
●●
●●
●
●
●
●●●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●●
●
●
●
●●●
●
●●
●
●●●●
●●
●●●
●
●
●
●●●
●
●●
●
●
●●
●
●
●●
●●
●●
●●
●●●●●
●
●
●●
●
●
●
●
●●
●
●
●
●●●●
●
●
●
●
●●
●
●●
●
●
●●
●
●
●
●
●●
●●
●
●
●
●
●●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●●●●
●●
●
●
●
●
●
●
●
●
●
●●
●●
●
●
●●
●●
●
●●
●
●
●
●●
●
●
●
●
●●
●
●
●●
●●
●
●●
●
●
●●
●
●
●
●
●●●●●●●
●
●
●
●
●
●
●●●
●●●●
●●
●●●
●
●●
●
●
●
●
●
●
●
●
●●
●●●●
●●
●
●●
●●
●
●
●
●
●
●●●
●
●
●●
●●●
●●●
●●
●
●
●
●●●
●
●●
●
●●
●
●
●
●
●●●
●●
●
●
●
●
●
●
●
●
●●
●
●
●
●
●
●●
●
●
●
●●
●
●
●
●
●
●
●
●
●●●
●
●
●
●
●
●
●
●
●
●
●
●●●
●
●
●
●●
●●●
●●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●●
●
●●
●●
●
●
●
●
●
●
●●
●
●
●
●
●
●●
●
●
●
●●●
●
●
●
●●●●●
●●
●
●●
●
●●●●●
●
●
●
●●
●●●
●●
●●●
●●●
●
●
●
●
●●
●
●
●
●●
●
●●
●
●
●
●●●
●
●
●
●
●●●●●
●●
●
●●
●
●●
●●●
●
●
●●●
●●●●
●
●●●
●●
●
●
●
●●●
●
●
●
●●
●●●●●
●●●●●●
●●●●●
●●
●
●●●●
●
●
●
●
●●●
●●●●
●●
●●●
●●●
●●
●
●
●
●
●
●
●
●
●●●
●
●
●
●
●●
●
●
●
●
●●
●
●●
●
●
●
●
●
●
●
●●●
●
●
●●
●●
●
●●●●●
●●
●●
●●●●
●●●●
●
●●
●
●
●●
●
●
●
●
●●
●●
●●●●●●
●
●●
●
●●
●
●
●
●●●●
●
●●
●
●
●
●●●
●
●
●●
●
●
●●●
●●
●
●●
●●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●●
●
●
●
●●
●
●●
●
●
●●●●
●
●
●
●
●●●
●
●
●●●●●●●
●●
●●
●●●
●
●
●●●●●●
●●
●●
●
●
●
●
●●●●●●
●●
●●
●
●
●
●
●●●
●
●●●
●
●
●●●
●●
●●●
●●●●●●
●
●
●
●●●●
●
●●●
●
●
●●●
●●
●
●●●●
●●
●●
●●●●●●●
●●
●●
●
●
●●
●
●
●●
●
●
●●
●●●●
●●●
●●●
●●●
●●●●●
●●
●
●●
●●
●
●
●
●●
●
●
●●
●
●
●
●●●●
●
●●
●
●
●
●
●
●
●
●●
●
●
●
●
●
●
●●
●●
●●
●●
●
●●●
●
●
●
●
●●●
●
●
●●
●
●
●
●
●
●
●
●
●●●
●
●
●
●
●
●
●
●
●
●●
●●●
●
●
●●
●
●
●
●●
●
●
●
●
●●
●●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●●
●
●
●
●
●●●●●
●
●
●●●
●
●●
●
●
●
●
●
●
●
●
●●
●
●
●●
●
●●
●●
●
●
●●
●
●●
●
●●
●
●
●
●
●
●●
●●●●
●
●
●
●
●
●●
●
●
●
●
●
●●
●
●●
●
●
●
●
●
●
●
●●
●
●
●
●
●
●
●
●●
●
●
●●
●●
●
●
●
●
●●
●●
●
●●
●
●
●●
●●
●
●
●●●
●
●●
●●●
●
●●●●●
●●
●
●
●
●
●
●●
●●●
●
●●
●●●
●●●●●●
●
●
●
●●
●●●
●●
●●
●●
●
●●●●●●
●●●
●
●
●
●
●
●●●●
●
●
●●
●
●●
●●
●●
●●●●●
●
●
●●●
●●●
●●
●
●●●●
●
●●
●
●
●
●●●●
●●●
●
●
●●●
●●
●
●
●
●
●
●●●●●
●●
●●
●
●●●●●●
●●
●●
●
●●
●
●
●
●
●
●●●●●
●
●
●
●
●●●
●●●
●●●●●
●
●●●●
●
●●●
●●●●●
●●
●●
●●
●
●
●●●●
●●●●●●
●●
●
●●●●
●
●●
●
●●
●
●
●
●
●
●●●●
●
●●●●●●
●●●●
●●●●
●
●
●●
●
●●●●
●
●
●
●
●
●●
●
●
●●
●
●
●
●
●
●
●
●
●
●
●●
●
●
●●●
●●
●
●
●
●
●
●
●●●
●●
●
●
●
●●
●
●
●
●●
●
●
●
●●
●●●
●●
●
●
●
●
●
●
●
●
●●
●●●●
●●
●
●
●
●
●
●●●
●
●●●
●
●●
●●
●
●●
●
●
●
●
●
●●
●●
●●●●●●
●
●
●
●
●
●
●●
●
●
●
●
●●
●
●
●●●
●●
●
●
●
●
●
●
●
●
●●●●
●
●●
●
●
●
●
●●
●
●
●●
●
●
●
●
●
●
●●
●●
●
●
●
●
●●●
●
●
●
●
●
●
●●
●
●
●
●
●●
●
●
●●
●●
●●
●
●●
●
●
●●
●
●●
●
●
●●●
●
●●
●
●
●
●
●●
●●
●
●
●
●
●
●
●
●●
●●●
●
●
●
●●
●●
●●●●
●●●●
●●
●
●●●
●
●
●
●
●●
●●
●
●●
●
●
●
●
●●
●
●
●
●●
●
●
●●
●
●
●
●
●
●●
●
●●
●●
●
●
●
●
●
●
●
●
●●
●●
●
●
●
●●
●
●●
●●
●●
●
●
●
●
●●
●
●
●
●
●
●
●
●●
●●
●
●
●
●●
●●
●
●
●●
●
●
●
●
●
●
●
●
●
●
●
●
●
●●
●
●
●
●
●
●●
●
●
●●
●
●●
●
●
●
●
●
●●
●●
●●
●
●●●
●●
●
●
●
●
●
●
●●
●
●
●
●
●
●
●●
●
●●
●
●
●
●
●
●
●
●
●
●●
●
●●
●
●●●●
●
●●
●
●
●
●
●
●
●
●
●
●
●
●
●●
●●
●
●
●
●
●
●
●●●
●
●
●
●●
●
●
●
●
●
●
●
●
●●
●
●●
●
●
●
●●
●
●
●
●●
●
●●
●
●●
●
●●
●
●
●
●●●
●
●
●
●
●●●
●●●●
●
●
●
●
●
●●●
●
●
●
●
●●●
●
●
●
●
●●
●●
●
●
●●
●
●●
●
●
●
●
●●●●●●●
●
●●
●●
●
●●●
●●
●●
●●
●
●
●●●●●●
●
●●●●
●
●
●●
●
●
●
●
●●●
●
●●
●●●●●
●
●●
●
●
●
●
●
●●
●
●
●●●
●
●
●●
●
●
●
●
●
●●
●
●
●
●
●
●
●
●
●
●●
●●
●●
●
●●●
●
●
●●●●●
●
●
●●●
●●
●
●
●
●●
●
●●●
●
●
●
●●
●
●
●
●
●
●●●
●●●●●●●●●●●●
●
●
●
●
●●●●
●●
●
●
●●●●
●●●●
●
●●●
●●
●●
●
●●
●●
●●
●
●
●
●
●●●●
●●
●
●●
●●●●●●
●
●
●
●
●
●
●
●
●
●
●
●●●●
●
●
●
●
●
●
●
●●
●
●
●
●
●
●
●
●
●
●
●●
●●
●
●●
●
●
●
●●●
●●
●
●
●
●●
●
●●
●
●
●●
●
●
●
●
●
●
●
●
●●●
●
●
●
●
●
●
●●
●
●●●
●
●
●
●●
●
●
●
●
●●
●
●●●
●
●
●
●●
●
●
●●●
●
●
●
●●
●
●
●
●
●
●●●
●●
●●
●
●
●
●
●
●
●
●
●
●●
●
●
●●●
●
●
●
●
●
●
●
●●
●●●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●●
●
●●
●
●
●●●
●●
●
●●
●●●●
●●
●
●
●
●
●
●
●●
●
●
●●
●
●
●
●
●
●●
●●
●●
●●
●
●
●
●●●
●●
●
●●
●●
●
●●
●
●
●
●
●
●
●
●
●●●
●
●
●●
●
●
●
●●
●
●
●
●
●●
●
●●
●●
●●
●
●●●
●●
●
●
●●●
●
●
●
●
●●
●
●
●●
●
●
●
●
●●●●●
●
●
●
●●●
●
●●●
●
●●
●
●●●
●
●
●
●
●
●
●
●
●
●●
●●
●
●●●
●
●
●
●
●
●
●
●
●
●
●
●
●●●●
●
●
●●
●
●
●
●
●
●
●●●
●
●●
●
●
●●
●
●
●
●
●
●
●●●
●●●
●●
●●●
●
●
●
●●
●
●●●●●●
●●●●●●
●
●●●
●
●●●
●●
●●
●
●●
●●●●
●
●
●●●●
●●●
●
●●●●
●
●
●
●
●
●
●●
●●
●●●
●●●●●
●●●
●●●●
●
●●●●●
●
●
●
●
●
●
●●
●
●
●
●
●●●●
●
●●●
●
●
●
●●
●
●
●●●●
●
●●●
●
●
●●●●
●●●
●●
●●●●●
●
●●
●●
●
●●●●●●●
●●●●●●
●●●●
●●●
●●●●
●
●
●●●
●
●
●●
●
●●
●●●●
●●
●
●
●●●
●●
●●●
●
●
●●●●●●
●
●
●
●
●●●
●
●●●
●
●●●●●●●●●
●●●●
●●●
●●●●●●
●●●
●
●
●
●
●
●●
●
●
●
●
●
●
●
●●
●
●●
●
●
●
●●
●
●
●
●
●
●
●
●
●
●●
●
●
●
●
●
●●
●
●
●●
●
●●●
●●●●
●●
●
●●●
●●
●●
●
●
●
●
●●●
●●●●●
●●●
●
●
●●
●
●●
●
●
●●●●
●
●●
●●
●
●
●●
●
●
●
●●●
●●●
●
●●●●●
●
●●
●
●●●
●●
●●
●●●●●
●●●●●●
●●●
●
●●
●●
●●
●
●
●
●
●
●●●●
●●
●
●
●●
●●
●
●●●
●
●●
●
●
●
●
●
●
●●
●
●
●●
●●
●
●
●
●
●●●●
●
●●●
●●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●●●●●
●
●
●
●
●●
●
●
●
●
●
●
●
●
●●●
●●
●●
●
●
●●
●
●
●
●
●
●●
●
●
●
●●●
●
●●
●●
●●●●●●●●●●●
●
●●
●●●●
●●●●
●●
●
●●
●●●
●
●●
●●
●
●●●
●
●
●
●
●●●●
●●
●
●●
●●●
●
●
●
●
●
●●●●●
●
●●
●●
●
●
●
●
●
●
●
●●
●●●●
●●●●
●●
●
●●
●●●
●●●●●●
●
●●●●
●
●
●●
●●●●
●●
●
●
●
●●
●●
●
●
●●
●
●
●●
●
●●
●
●
●●●●
●
●●●
●
●
●●
●●
●●
●
●
●●
●●
●
●●●●
●●●
●●
●●●●●
●
●●
●●
●●●●
●
●●●
●●●●
●●●●
●●
●
●●●
●
●●●
●●●●●●●●
●
●
●
●●●●●●
●●●
●
●
●●●●●●
●
●
●
●
●
●
●
●
●●
●●
●●
●
●
●●●●●●
●
●
●
●
●●
●
●
●●
●
●●
●
●
●
●
●
●
●
●
●
●
●●
●●
●
●
●
●
●
●
●
●
●
●
●
●
●●
●
●
●
●
●
●●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●●
●
●
●
●●
●
●
●
●●●
●
●●
●
●
●
●
●
●●
●●●
●
●
●●●
●
●
●●
●●●●
●
●●
●
●
●
●
●●
●●
●
●
●
●
●
●
●
●
●●
●
●
●
●
●
●
●
●
●
●●
●
●
●
●
●
●
●●
●
●●
●
●
●
●
●
●
●
●
●
●●
●
●●
●
●
●
●
●
●
●
●
●
●
●●●
●●●
●
●
●
●
●
●
●
●
●
●●●●
●
●●
●
●
●
●
●●
●
●
●
●
●
●
●
●
●
●
●
●
●●
●
●●
●●
●
●
●
●
●
●
●●●
●
●
●
●
●
●●
●
●
●
●
●
●
●
●
●●
●●●
●
●
●●
●
●
●
●
●
●
●
●
●
●
●●●
●
●●●
●●
●●
●
●
●
●●
●
●
●
●
●●
●
●
●
●
●
●
●
●
●●
●
●
●●
●
●
●●●
●
●
●
●
●
●●
●
●●
●
●
●
●
●
●
●
●
●
●●●
●
●
●
●
●
●
●
●
●
●
●
●●
●●
●
●
●
●
●●●
●
●
●
●
●
●
●
●
●●
●
●
●●
●
●●●
●
●●
●
●
●
●
●
●
●
●●
●
●
●
●
●
●●●
●
●
●
●
●
●
●
●●
●
●●
●
●
●
●
●
●
●
●●
●
●
●
●
●
●
●
●●
●
●●
●●
●
●
●●
●
●
●
●
●
●●
●●●
●●
●
●
●
●
●
●
●
●●
●
●
●●
●
●●
●●
●
●●
●
●
●
●
●
●●●
●●
●●
●●
●
●
●●
●
●
●
●
●
●
●
●
●
●
●●
●
●
●
●
●
●
●
●●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●●
●
●●
●
●
●
●
●●
●
●
●
●
●
●
●
●
●
●
●
●
●
●●●
●
●
●
●
●●
●
●
●
●
●
●
●
●●
●
●
●
●●
●●
●
●
●●●
●
●
●
●
●
●●●
●
●●
●●●
●●●
●●
●
●
●
●
●
●
●●
●
●
●●
●
●
●
●●
●
●
●●
●
●●
●●
●
●
●
●
●
●
●
●
●●
●
●
●
●●
●●●
●
●
●●
●●●●
●
●
●
●
●●
●
●●
●
●●●
●
●
●
●
●
●
●●
●
●
●
●
●
●
●●
●
●●
●●
●
●
●
●●
●
●
●
●
●
●
●
●
●
●●
●
●
●●
●
●
●
●●●
●
●
●●
●
●
●
●
●
●
●
●
●●
●
●
●
●●
●●
●
●
●
●●●
●●
●
●
●
●
●
●
●
●
●●
●●
●
●●
●
●●
●
●●
●●
●
●
●
●
●
●
●
●●
●
●
●
●●
●●
●
●●
●
●●
●
●●●
●
●
●●
●
●●●●
●
●
●
●
●●●
●
●
●●
●
●
●●
●
●
●
●
●
●●
●
●●
●●●●●●
●
●●
●
●
●●
●
●
●●
●
●
●
●
●●
●
●
●●
●
●
●
●
●
●
●
●●●●
●●●
●
●
●●●
●
●
●
●
●
●
●
●
●
●
●
●●●
●●
●
●●●
●
●
●
●●
●●
●
●
●●
●●
●●
●
●
●●
●
●
●
●
●
●
●
●
●
●
●●
●●
●●●
●
●●
●●●●
●
●
●●
●●●●●●
●
●●
●
●
●●
●●
●
●●
●
●
●
●
●
●
●
●
●●
●
●
●
●●●●●●●
●●●
●●●●
●●●●●
●●●
●
●●
●
●
●●●●●●●
●●
●●●
●
●
●●
●●
●
●●
●
●
●
●
●
●
●●
●
●
●●●●●
●●
●●
●
●●
●●●
●●●
●●●●
●
●
●
●●
●●●●●●
●
●●
●●
●●
●
●●
●
●
●
●
●
●●
●
●
●●●●
●
●
●
●
●
●●
●
●
●●●
●●
●●
●
●●
●
●●●●
●
●
●
●●
●●
●
●●
●●●●
●
●●
●
●
●●
●
●
●
●●●
●●●
●●
●●
●●
●●●
●●●●
●
●
●
●●
●●
●
●
●
BestMean
Solution
●
●
●
●
●
●
●
●
●
●
●
●
●
● ●
●
●
●
●
●
●
●
●●
●
●
30
40
20
20
30
20
20
30
30
20
10
30
20 30
30
20
20
20
20
10
20
403030
0
10
20
30
40
split
Final Score: 463, Raw Score: 470Time: 246mins, penalty: 7
Figure 4: Cf winner’s score of 440
top related