General Statistics

length(unique(focal_player_with_unobserved_byweek_all$guild_id))
[1] 22
length(unique(focal_player_with_unobserved_byweek_all$week))
[1] 30
nrow(guild_cluster_selection)
[1] 307
nrow(focal_player_with_unobserved_byweek_all)
[1] 28835
length(unique(focal_player_with_unobserved_byweek_all$player_id))
[1] 2414
hist(individual_a_byweek$count_obs,breaks = 30)

table(individual_a_byweek$count_guild)

   1    2    3    4    5    6    7 
1547  562  216   67   18    3    1 
table(focal_player_with_unobserved_byweek_all$is_churn)

    0     1 
28336   499 
table(focal_player_with_unobserved_byweek_all$change_guild)

    0     1 
27195  1640 
hist(focal_player_with_unobserved_byweek_all$mean_level,breaks=60)

hist(focal_player_with_unobserved_byweek_all$total_time,breaks=100)

week_summary<-focal_player_with_unobserved_byweek_all %>% group_by(week) %>% summarise(level=mean(mean_level),time=mean(total_time),days_in_60 = mean(days_in_60))
plot(week_summary$week,week_summary$level)

plot(week_summary$week,week_summary$time)

plot(week_summary$week,week_summary$days_in_60)

hist(focal_player_with_unobserved_byweek_all$days_in_60,breaks=20)

Analysis on unobserved a

General Stats

  • Summary Stats of Unobserved a
summary(focal_player_with_unobserved_byweek_all$unobserved_a)
    Min.  1st Qu.   Median     Mean  3rd Qu.     Max. 
-2.86700 -0.10500  0.07478  0.05613  0.22830  3.17000 
  • Unobserved a by week
test<-focal_player_with_unobserved_byweek_all %>% group_by(week) %>% summarise(mean_a = mean(unobserved_a))
plot(test)

test<-focal_player_with_unobserved_byweek_all %>% group_by(week) %>% summarise(var_a = var(unobserved_a))
plot(test)

Unobserved a by Churn

  • Individual a: Churn vs not churn
focal_player_with_unobserved_byweek_all %>% group_by(floor_level,is_churn) %>% summarise(mean_a = mean(unobserved_a),sd_a = sd(unobserved_a),count_player=n())
  • Relative a(a-mean a in guild): Churn vs not churn
focal_player_with_unobserved_byweek_all %>% group_by(floor_level,is_churn) %>% summarise(mean_a = mean(relative_a),sd_a = sd(relative_a),count_player=n())

Unobserved a by changing guilds

  • Individual a: Change guild vs not changing guild
focal_player_with_unobserved_byweek_all %>% group_by(floor_level,lead_change_guild) %>% summarise(mean_a = mean(unobserved_a),mean_relative_a = mean(relative_a),count=n())
  • Individual a grouped by total number of guilds
individual_a_byweek %>% group_by(count_guild) %>% summarise(mean_a_a = mean(mean_a),count=n())

Empirical evidence of unobserved a based on connection data and observed characterisitcs

  • The effect of observed characteristics on connection strength for guild 1
plot(connection_pair_byguild[[1]]$level_diff,connection_pair_byguild[[1]]$connection_strength,xlab="abosolute level difference",ylab ="connection strength")

plot(connection_pair_byguild[[1]]$level60_diff,connection_pair_byguild[[1]]$connection_strength,xlab="abosolute level60 difference",ylab ="connection strength")

plot(connection_pair_byguild[[1]]$time_diff,connection_pair_byguild[[1]]$connection_strength,xlab="abosolute time difference",ylab ="connection strength")

plot(connection_pair_byguild[[1]]$a_diff,connection_pair_byguild[[1]]$connection_strength,xlab="abosolute a difference",ylab ="connection strength")

  • The effect of observed characteristics on percentage connection strength for guild 1
plot(percentage_connection_pair_byguild[[1]]$level_diff,percentage_connection_pair_byguild[[1]]$connection_strength,xlab="abosolute level difference",ylab ="Percentage connection strength")

plot(percentage_connection_pair_byguild[[1]]$level60_diff,percentage_connection_pair_byguild[[1]]$connection_strength,xlab="abosolute level60 difference",ylab ="Percentage connection strength")

plot(percentage_connection_pair_byguild[[1]]$time_diff,percentage_connection_pair_byguild[[1]]$connection_strength,xlab="abosolute time difference",ylab ="Percentage connection strength")

plot(percentage_connection_pair_byguild[[1]]$a_diff,percentage_connection_pair_byguild[[1]]$connection_strength,xlab="abosolute a difference",ylab ="Percentage connection strength")

  • The effect of observed characteristics on connection: guild 207
plot(connection_pair_byguild[[207]]$level_diff,connection_pair_byguild[[207]]$connection_strength,xlab="abosolute level difference",ylab ="connection strength")

plot(connection_pair_byguild[[207]]$level60_diff,connection_pair_byguild[[207]]$connection_strength,xlab="abosolute level60 difference",ylab ="connection strength")

plot(connection_pair_byguild[[207]]$time_diff,connection_pair_byguild[[207]]$connection_strength,xlab="abosolute time difference",ylab ="connection strength")

plot(connection_pair_byguild[[207]]$a_diff,connection_pair_byguild[[207]]$connection_strength,xlab="abosolute a difference",ylab ="connection strength")

  • The effect of observed characteristics on percentage connection: guild 207
plot(percentage_connection_pair_byguild[[207]]$level_diff,percentage_connection_pair_byguild[[207]]$connection_strength,xlab="abosolute level difference",ylab ="percentage connection strength")

plot(percentage_connection_pair_byguild[[207]]$level60_diff,percentage_connection_pair_byguild[[207]]$connection_strength,xlab="abosolute level60 difference",ylab ="percentage connection strength")

plot(percentage_connection_pair_byguild[[207]]$time_diff,percentage_connection_pair_byguild[[207]]$connection_strength,xlab="abosolute time difference",ylab ="percentage connection strength")

plot(percentage_connection_pair_byguild[[207]]$a_diff,percentage_connection_pair_byguild[[207]]$connection_strength,xlab="abosolute a difference",ylab ="percentage connection strength")

  • The effect of level on connection(all guilds)
plot(connection_pair_byguild_all$level_diff,connection_pair_byguild_all$connection_strength,xlab="abosolute level difference",ylab ="connection strength")

  • The effect of level on percentage connection(all guilds)
plot(percentage_connection_pair_byguild_all$level_diff,percentage_connection_pair_byguild_all$connection_strength,xlab="abosolute level difference",ylab ="percentage connection strength")

  • The effect of time on connection(all guilds)
plot(connection_pair_byguild_all$time_diff,connection_pair_byguild_all$connection_strength,xlab="abosolute time difference",ylab ="connection strength")

  • The effect of level60_time on percentage connection(all guilds)
plot(percentage_connection_pair_byguild_all$level60_diff,percentage_connection_pair_byguild_all$connection_strength,xlab="abosolute level60 difference",ylab ="percentage connection strength")

  • The effect of unobserved a on connection(all guilds)
plot(connection_pair_byguild_all$a_diff,connection_pair_byguild_all$connection_strength,xlab="abosolute a difference",ylab ="connection strength")

  • The effect of unobserved a on percentage connection(all guilds)
plot(percentage_connection_pair_byguild_all$a_diff,percentage_connection_pair_byguild_all$connection_strength,xlab="abosolute a difference",ylab ="percentage connection strength")

  • Players of same level,level60,time but different a: connection
temp<-filter(connection_pair_byguild_all,level_diff<1, level60_diff<1,time_diff<20)
plot(temp$a_diff,temp$connection_strength)

  • Players of same level,level60,time but different a: percentage connection
temp<-filter(percentage_connection_pair_byguild_all,level_diff<1, level60_diff<1,time_diff<20)
plot(temp$a_diff,temp$connection_strength)

Individual level a trend

Group By Frequency of Changing Guild

  • Players that frequent change guild
test<-filter(focal_player_with_unobserved_byweek_all,player_id==127)
ggplot(test,aes(x=week,y=relative_a))+geom_line()

test<-filter(focal_player_with_unobserved_byweek_all,player_id==10044)
ggplot(test,aes(x=week,y=relative_a))+geom_line()

test<-filter(focal_player_with_unobserved_byweek_all,player_id==6534)
ggplot(test,aes(x=week,y=relative_a))+geom_line()

  • Players that never change a guild
test<-filter(focal_player_with_unobserved_byweek_all,player_id==30)
ggplot(test,aes(x=week,y=relative_a))+geom_line()

test<-filter(focal_player_with_unobserved_byweek_all,player_id==44)
ggplot(test,aes(x=week,y=relative_a))+geom_line()

test<-filter(focal_player_with_unobserved_byweek_all,player_id==62)
ggplot(test,aes(x=week,y=relative_a))+geom_line()

Group By Mean a

  • Players with low average a
test<-filter(focal_player_with_unobserved_byweek_all,player_id %in% low_mean_player_sample)
ggplot(test,aes(x=week,y=unobserved_a,color=factor(player_id)))+geom_line()

ggplot(test,aes(x=week,y=relative_a,color=factor(player_id)))+geom_line()

The percentage of changing guild is

test<-filter(focal_player_with_unobserved_byweek_all,player_id %in% low_mean_player)
table(test$change_guild)[2]/nrow(test)
         1 
0.05979062 
  • Players with high average a
test<-filter(focal_player_with_unobserved_byweek_all,player_id %in% high_mean_player_sample)
ggplot(test,aes(x=week,y=unobserved_a,color=factor(player_id)))+geom_line()

ggplot(test,aes(x=week,y=relative_a,color=factor(player_id)))+geom_line()

The percentage of changing guild is

test<-filter(focal_player_with_unobserved_byweek_all,player_id %in% high_mean_player)
table(test$change_guild)[2]/nrow(test)
         1 
0.06062303 

Group By Variance in a

  • Players with low variance in a
test<-filter(focal_player_with_unobserved_byweek_all,player_id %in% low_var_player_sample)
ggplot(test,aes(x=week,y=unobserved_a,color=factor(player_id)))+geom_line()

ggplot(test,aes(x=week,y=relative_a,color=factor(player_id)))+geom_line()

The percentage of changing guild is

test<-filter(focal_player_with_unobserved_byweek_all,player_id %in% low_var_player)
table(test$change_guild)[2]/nrow(test)
         1 
0.04874185 

Summary stats of unobserved a

summary(test$unobserved_a)
    Min.  1st Qu.   Median     Mean  3rd Qu.     Max. 
-1.54500 -0.08191  0.07628  0.06426  0.21520  1.09900 

Summary stats of relative a

summary(test$relative_a)
     Min.   1st Qu.    Median      Mean   3rd Qu.      Max. 
-1.608000 -0.135500  0.021610  0.009263  0.159000  1.036000 
  • Players with high variance in a
test<-filter(focal_player_with_unobserved_byweek_all,player_id %in% high_var_player_sample)
ggplot(test,aes(x=week,y=unobserved_a,color=factor(player_id)))+geom_line()

ggplot(test,aes(x=week,y=relative_a,color=factor(player_id)))+geom_line()

Percentage of changing guilds

test<-filter(focal_player_with_unobserved_byweek_all,player_id %in% high_var_player)
table(test$change_guild)[2]/nrow(test)
         1 
0.08177313 

Summary stats of unobserved a

summary(test$unobserved_a)
    Min.  1st Qu.   Median     Mean  3rd Qu.     Max. 
-2.86700 -0.21110  0.06833  0.03279  0.28230  3.17000 

Summary stats of relative a

summary(test$relative_a)
    Min.  1st Qu.   Median     Mean  3rd Qu.     Max. 
-3.02200 -0.26700  0.01064 -0.02665  0.22610  3.01400 

Guild level a trend

  • Unobserved a by guild
ggplot(guild_a_byweek,aes(x=week,y=mean_a,group=guild_id,colour=factor(guild_id)))+geom_line()

ggplot(guild_a_byweek,aes(x=week,y=var_a,group=guild_id,colour=factor(guild_id)))+geom_line()

LS0tCnRpdGxlOiAiV293IFJlc3VsdCBBbmFseXNpcyIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQojIyBHZW5lcmFsIFN0YXRpc3RpY3MKCi0gTnVtYmVyIG9mIEd1aWxkcwoKYGBge3J9Cmxlbmd0aCh1bmlxdWUoZm9jYWxfcGxheWVyX3dpdGhfdW5vYnNlcnZlZF9ieXdlZWtfYWxsJGd1aWxkX2lkKSkKYGBgCgotIE51bWJlciBvZiBXZWVrcwoKYGBge3J9Cmxlbmd0aCh1bmlxdWUoZm9jYWxfcGxheWVyX3dpdGhfdW5vYnNlcnZlZF9ieXdlZWtfYWxsJHdlZWspKQpgYGAKCi0gVG90YWwgTnVtYmVyIG9mIGd1aWxkKndlZWsKCmBgYHtyfQpucm93KGd1aWxkX2NsdXN0ZXJfc2VsZWN0aW9uKQpgYGAKCi0gVG90YWwgTnVtYmVyIG9mIFBsYXllcnMKCmBgYHtyfQpucm93KGZvY2FsX3BsYXllcl93aXRoX3Vub2JzZXJ2ZWRfYnl3ZWVrX2FsbCkKYGBgCgotIFRvdGFsIE51bWJlciBvZiB1bmlxdWUgUGxheWVycwoKYGBge3J9Cmxlbmd0aCh1bmlxdWUoZm9jYWxfcGxheWVyX3dpdGhfdW5vYnNlcnZlZF9ieXdlZWtfYWxsJHBsYXllcl9pZCkpCmBgYAoKLSBEaXN0cmlidXRpb25zIG9mIE51bWJlciBvZiBvYnNlcnZhdGlvbnMgcGVyIHBsYXllcgpgYGB7cn0KaGlzdChpbmRpdmlkdWFsX2FfYnl3ZWVrJGNvdW50X29icyxicmVha3MgPSAzMCkKYGBgCi0gTnVtYmVyIG9mIGd1aWxkcyBwZXIgcGxheWVyIAoKYGBge3J9CnRhYmxlKGluZGl2aWR1YWxfYV9ieXdlZWskY291bnRfZ3VpbGQpCmBgYAoKLSBUb3RhbCBPYnNlcnZhdGlvbnMgb2YgQ2h1cm5pbmdzCgpgYGB7cn0KdGFibGUoZm9jYWxfcGxheWVyX3dpdGhfdW5vYnNlcnZlZF9ieXdlZWtfYWxsJGlzX2NodXJuKQpgYGAKCi0gVG90YWwgT2JzZXJ2YXRpb25zIG9mIGNoYW5naW5nIGd1aWxkcwpgYGB7cn0KdGFibGUoZm9jYWxfcGxheWVyX3dpdGhfdW5vYnNlcnZlZF9ieXdlZWtfYWxsJGNoYW5nZV9ndWlsZCkKYGBgCgotIERpc3RyaWJ1dGlvbnMgb2YgbGV2ZWwKCmBgYHtyfQpoaXN0KGZvY2FsX3BsYXllcl93aXRoX3Vub2JzZXJ2ZWRfYnl3ZWVrX2FsbCRtZWFuX2xldmVsLGJyZWFrcz02MCkKYGBgCgoKLSBEaXN0cmlidXRpb24gb2YgdG90YWwgYXZhaWxhYmxlIHRpbWUKCmBgYHtyfQpoaXN0KGZvY2FsX3BsYXllcl93aXRoX3Vub2JzZXJ2ZWRfYnl3ZWVrX2FsbCR0b3RhbF90aW1lLGJyZWFrcz0xMDApCmBgYAoKCi0gQXZlcmFnZSBsZXZlbC9wbGF5aW5nIHRpbWUvdGltZSBhdCA2MCB0cmVuZCBvdmVyIHdlZWsKCgpgYGB7cn0Kd2Vla19zdW1tYXJ5PC1mb2NhbF9wbGF5ZXJfd2l0aF91bm9ic2VydmVkX2J5d2Vla19hbGwgJT4lIGdyb3VwX2J5KHdlZWspICU+JSBzdW1tYXJpc2UobGV2ZWw9bWVhbihtZWFuX2xldmVsKSx0aW1lPW1lYW4odG90YWxfdGltZSksZGF5c19pbl82MCA9IG1lYW4oZGF5c19pbl82MCkpCgpwbG90KHdlZWtfc3VtbWFyeSR3ZWVrLHdlZWtfc3VtbWFyeSRsZXZlbCkKcGxvdCh3ZWVrX3N1bW1hcnkkd2Vlayx3ZWVrX3N1bW1hcnkkdGltZSkKcGxvdCh3ZWVrX3N1bW1hcnkkd2Vlayx3ZWVrX3N1bW1hcnkkZGF5c19pbl82MCkKYGBgCgoKCgoKCgoKLSBEaXN0cmlidXRpb25zIG9mIHRpbWUgc3RheWluZyBhdCBsZXZlbCA2MAoKYGBge3J9Cmhpc3QoZm9jYWxfcGxheWVyX3dpdGhfdW5vYnNlcnZlZF9ieXdlZWtfYWxsJGRheXNfaW5fNjAsYnJlYWtzPTIwKQpgYGAKCgoKCgoKCiMjIEFuYWx5c2lzIG9uIHVub2JzZXJ2ZWQgYQoKCiMjIyBHZW5lcmFsIFN0YXRzCi0gU3VtbWFyeSBTdGF0cyBvZiBVbm9ic2VydmVkIGEKCmBgYHtyfQpzdW1tYXJ5KGZvY2FsX3BsYXllcl93aXRoX3Vub2JzZXJ2ZWRfYnl3ZWVrX2FsbCR1bm9ic2VydmVkX2EpCmBgYAoKCi0gVW5vYnNlcnZlZCBhIGJ5IHdlZWsKCmBgYHtyfQp0ZXN0PC1mb2NhbF9wbGF5ZXJfd2l0aF91bm9ic2VydmVkX2J5d2Vla19hbGwgJT4lIGdyb3VwX2J5KHdlZWspICU+JSBzdW1tYXJpc2UobWVhbl9hID0gbWVhbih1bm9ic2VydmVkX2EpKQpwbG90KHRlc3QpCmBgYAoKYGBge3J9CnRlc3Q8LWZvY2FsX3BsYXllcl93aXRoX3Vub2JzZXJ2ZWRfYnl3ZWVrX2FsbCAlPiUgZ3JvdXBfYnkod2VlaykgJT4lIHN1bW1hcmlzZSh2YXJfYSA9IHZhcih1bm9ic2VydmVkX2EpKQpwbG90KHRlc3QpCmBgYAoKCiMjIyBVbm9ic2VydmVkIGEgYnkgQ2h1cm4KCgotIEluZGl2aWR1YWwgYTogQ2h1cm4gdnMgbm90IGNodXJuCmBgYHtyfQpmb2NhbF9wbGF5ZXJfd2l0aF91bm9ic2VydmVkX2J5d2Vla19hbGwgJT4lIGdyb3VwX2J5KGZsb29yX2xldmVsLGlzX2NodXJuKSAlPiUgc3VtbWFyaXNlKG1lYW5fYSA9IG1lYW4odW5vYnNlcnZlZF9hKSxzZF9hID0gc2QodW5vYnNlcnZlZF9hKSxjb3VudF9wbGF5ZXI9bigpKQpgYGAKCgotIFJlbGF0aXZlIGEoYS1tZWFuIGEgaW4gZ3VpbGQpOiBDaHVybiB2cyBub3QgY2h1cm4KYGBge3J9CmZvY2FsX3BsYXllcl93aXRoX3Vub2JzZXJ2ZWRfYnl3ZWVrX2FsbCAlPiUgZ3JvdXBfYnkoZmxvb3JfbGV2ZWwsaXNfY2h1cm4pICU+JSBzdW1tYXJpc2UobWVhbl9hID0gbWVhbihyZWxhdGl2ZV9hKSxzZF9hID0gc2QocmVsYXRpdmVfYSksY291bnRfcGxheWVyPW4oKSkKYGBgCgojIyMgVW5vYnNlcnZlZCBhIGJ5IGNoYW5naW5nIGd1aWxkcwoKLSBJbmRpdmlkdWFsIGE6IENoYW5nZSBndWlsZCB2cyBub3QgY2hhbmdpbmcgZ3VpbGQKCmBgYHtyfQpmb2NhbF9wbGF5ZXJfd2l0aF91bm9ic2VydmVkX2J5d2Vla19hbGwgJT4lIGdyb3VwX2J5KGZsb29yX2xldmVsLGxlYWRfY2hhbmdlX2d1aWxkKSAlPiUgc3VtbWFyaXNlKG1lYW5fYSA9IG1lYW4odW5vYnNlcnZlZF9hKSxtZWFuX3JlbGF0aXZlX2EgPSBtZWFuKHJlbGF0aXZlX2EpLGNvdW50PW4oKSkKYGBgCgotIEluZGl2aWR1YWwgYSBncm91cGVkIGJ5IHRvdGFsIG51bWJlciBvZiBndWlsZHMKYGBge3J9CmluZGl2aWR1YWxfYV9ieXdlZWsgJT4lIGdyb3VwX2J5KGNvdW50X2d1aWxkKSAlPiUgc3VtbWFyaXNlKG1lYW5fYV9hID0gbWVhbihtZWFuX2EpLGNvdW50PW4oKSkKYGBgCgoKCiMjIyBFbXBpcmljYWwgZXZpZGVuY2Ugb2YgdW5vYnNlcnZlZCBhIGJhc2VkIG9uIGNvbm5lY3Rpb24gZGF0YSBhbmQgb2JzZXJ2ZWQgY2hhcmFjdGVyaXNpdGNzCgoKLSBUaGUgZWZmZWN0IG9mIG9ic2VydmVkIGNoYXJhY3RlcmlzdGljcyBvbiBjb25uZWN0aW9uIHN0cmVuZ3RoIGZvciBndWlsZCAxCgpgYGB7cn0KcGxvdChjb25uZWN0aW9uX3BhaXJfYnlndWlsZFtbMV1dJGxldmVsX2RpZmYsY29ubmVjdGlvbl9wYWlyX2J5Z3VpbGRbWzFdXSRjb25uZWN0aW9uX3N0cmVuZ3RoLHhsYWI9ImFib3NvbHV0ZSBsZXZlbCBkaWZmZXJlbmNlIix5bGFiID0iY29ubmVjdGlvbiBzdHJlbmd0aCIpCnBsb3QoY29ubmVjdGlvbl9wYWlyX2J5Z3VpbGRbWzFdXSRsZXZlbDYwX2RpZmYsY29ubmVjdGlvbl9wYWlyX2J5Z3VpbGRbWzFdXSRjb25uZWN0aW9uX3N0cmVuZ3RoLHhsYWI9ImFib3NvbHV0ZSBsZXZlbDYwIGRpZmZlcmVuY2UiLHlsYWIgPSJjb25uZWN0aW9uIHN0cmVuZ3RoIikKcGxvdChjb25uZWN0aW9uX3BhaXJfYnlndWlsZFtbMV1dJHRpbWVfZGlmZixjb25uZWN0aW9uX3BhaXJfYnlndWlsZFtbMV1dJGNvbm5lY3Rpb25fc3RyZW5ndGgseGxhYj0iYWJvc29sdXRlIHRpbWUgZGlmZmVyZW5jZSIseWxhYiA9ImNvbm5lY3Rpb24gc3RyZW5ndGgiKQpwbG90KGNvbm5lY3Rpb25fcGFpcl9ieWd1aWxkW1sxXV0kYV9kaWZmLGNvbm5lY3Rpb25fcGFpcl9ieWd1aWxkW1sxXV0kY29ubmVjdGlvbl9zdHJlbmd0aCx4bGFiPSJhYm9zb2x1dGUgYSBkaWZmZXJlbmNlIix5bGFiID0iY29ubmVjdGlvbiBzdHJlbmd0aCIpCmBgYAoKLSBUaGUgZWZmZWN0IG9mIG9ic2VydmVkIGNoYXJhY3RlcmlzdGljcyBvbiBwZXJjZW50YWdlIGNvbm5lY3Rpb24gc3RyZW5ndGggZm9yIGd1aWxkIDEKCmBgYHtyfQpwbG90KHBlcmNlbnRhZ2VfY29ubmVjdGlvbl9wYWlyX2J5Z3VpbGRbWzFdXSRsZXZlbF9kaWZmLHBlcmNlbnRhZ2VfY29ubmVjdGlvbl9wYWlyX2J5Z3VpbGRbWzFdXSRjb25uZWN0aW9uX3N0cmVuZ3RoLHhsYWI9ImFib3NvbHV0ZSBsZXZlbCBkaWZmZXJlbmNlIix5bGFiID0iUGVyY2VudGFnZSBjb25uZWN0aW9uIHN0cmVuZ3RoIikKcGxvdChwZXJjZW50YWdlX2Nvbm5lY3Rpb25fcGFpcl9ieWd1aWxkW1sxXV0kbGV2ZWw2MF9kaWZmLHBlcmNlbnRhZ2VfY29ubmVjdGlvbl9wYWlyX2J5Z3VpbGRbWzFdXSRjb25uZWN0aW9uX3N0cmVuZ3RoLHhsYWI9ImFib3NvbHV0ZSBsZXZlbDYwIGRpZmZlcmVuY2UiLHlsYWIgPSJQZXJjZW50YWdlIGNvbm5lY3Rpb24gc3RyZW5ndGgiKQpwbG90KHBlcmNlbnRhZ2VfY29ubmVjdGlvbl9wYWlyX2J5Z3VpbGRbWzFdXSR0aW1lX2RpZmYscGVyY2VudGFnZV9jb25uZWN0aW9uX3BhaXJfYnlndWlsZFtbMV1dJGNvbm5lY3Rpb25fc3RyZW5ndGgseGxhYj0iYWJvc29sdXRlIHRpbWUgZGlmZmVyZW5jZSIseWxhYiA9IlBlcmNlbnRhZ2UgY29ubmVjdGlvbiBzdHJlbmd0aCIpCnBsb3QocGVyY2VudGFnZV9jb25uZWN0aW9uX3BhaXJfYnlndWlsZFtbMV1dJGFfZGlmZixwZXJjZW50YWdlX2Nvbm5lY3Rpb25fcGFpcl9ieWd1aWxkW1sxXV0kY29ubmVjdGlvbl9zdHJlbmd0aCx4bGFiPSJhYm9zb2x1dGUgYSBkaWZmZXJlbmNlIix5bGFiID0iUGVyY2VudGFnZSBjb25uZWN0aW9uIHN0cmVuZ3RoIikKYGBgCgoKLSBUaGUgZWZmZWN0IG9mIG9ic2VydmVkIGNoYXJhY3RlcmlzdGljcyBvbiBjb25uZWN0aW9uOiBndWlsZCAyMDcKCmBgYHtyfQpwbG90KGNvbm5lY3Rpb25fcGFpcl9ieWd1aWxkW1syMDddXSRsZXZlbF9kaWZmLGNvbm5lY3Rpb25fcGFpcl9ieWd1aWxkW1syMDddXSRjb25uZWN0aW9uX3N0cmVuZ3RoLHhsYWI9ImFib3NvbHV0ZSBsZXZlbCBkaWZmZXJlbmNlIix5bGFiID0iY29ubmVjdGlvbiBzdHJlbmd0aCIpCnBsb3QoY29ubmVjdGlvbl9wYWlyX2J5Z3VpbGRbWzIwN11dJGxldmVsNjBfZGlmZixjb25uZWN0aW9uX3BhaXJfYnlndWlsZFtbMjA3XV0kY29ubmVjdGlvbl9zdHJlbmd0aCx4bGFiPSJhYm9zb2x1dGUgbGV2ZWw2MCBkaWZmZXJlbmNlIix5bGFiID0iY29ubmVjdGlvbiBzdHJlbmd0aCIpCnBsb3QoY29ubmVjdGlvbl9wYWlyX2J5Z3VpbGRbWzIwN11dJHRpbWVfZGlmZixjb25uZWN0aW9uX3BhaXJfYnlndWlsZFtbMjA3XV0kY29ubmVjdGlvbl9zdHJlbmd0aCx4bGFiPSJhYm9zb2x1dGUgdGltZSBkaWZmZXJlbmNlIix5bGFiID0iY29ubmVjdGlvbiBzdHJlbmd0aCIpCnBsb3QoY29ubmVjdGlvbl9wYWlyX2J5Z3VpbGRbWzIwN11dJGFfZGlmZixjb25uZWN0aW9uX3BhaXJfYnlndWlsZFtbMjA3XV0kY29ubmVjdGlvbl9zdHJlbmd0aCx4bGFiPSJhYm9zb2x1dGUgYSBkaWZmZXJlbmNlIix5bGFiID0iY29ubmVjdGlvbiBzdHJlbmd0aCIpCmBgYAoKLSBUaGUgZWZmZWN0IG9mIG9ic2VydmVkIGNoYXJhY3RlcmlzdGljcyBvbiBwZXJjZW50YWdlIGNvbm5lY3Rpb246IGd1aWxkIDIwNwoKYGBge3J9CnBsb3QocGVyY2VudGFnZV9jb25uZWN0aW9uX3BhaXJfYnlndWlsZFtbMjA3XV0kbGV2ZWxfZGlmZixwZXJjZW50YWdlX2Nvbm5lY3Rpb25fcGFpcl9ieWd1aWxkW1syMDddXSRjb25uZWN0aW9uX3N0cmVuZ3RoLHhsYWI9ImFib3NvbHV0ZSBsZXZlbCBkaWZmZXJlbmNlIix5bGFiID0icGVyY2VudGFnZSBjb25uZWN0aW9uIHN0cmVuZ3RoIikKcGxvdChwZXJjZW50YWdlX2Nvbm5lY3Rpb25fcGFpcl9ieWd1aWxkW1syMDddXSRsZXZlbDYwX2RpZmYscGVyY2VudGFnZV9jb25uZWN0aW9uX3BhaXJfYnlndWlsZFtbMjA3XV0kY29ubmVjdGlvbl9zdHJlbmd0aCx4bGFiPSJhYm9zb2x1dGUgbGV2ZWw2MCBkaWZmZXJlbmNlIix5bGFiID0icGVyY2VudGFnZSBjb25uZWN0aW9uIHN0cmVuZ3RoIikKcGxvdChwZXJjZW50YWdlX2Nvbm5lY3Rpb25fcGFpcl9ieWd1aWxkW1syMDddXSR0aW1lX2RpZmYscGVyY2VudGFnZV9jb25uZWN0aW9uX3BhaXJfYnlndWlsZFtbMjA3XV0kY29ubmVjdGlvbl9zdHJlbmd0aCx4bGFiPSJhYm9zb2x1dGUgdGltZSBkaWZmZXJlbmNlIix5bGFiID0icGVyY2VudGFnZSBjb25uZWN0aW9uIHN0cmVuZ3RoIikKcGxvdChwZXJjZW50YWdlX2Nvbm5lY3Rpb25fcGFpcl9ieWd1aWxkW1syMDddXSRhX2RpZmYscGVyY2VudGFnZV9jb25uZWN0aW9uX3BhaXJfYnlndWlsZFtbMjA3XV0kY29ubmVjdGlvbl9zdHJlbmd0aCx4bGFiPSJhYm9zb2x1dGUgYSBkaWZmZXJlbmNlIix5bGFiID0icGVyY2VudGFnZSBjb25uZWN0aW9uIHN0cmVuZ3RoIikKYGBgCgoKLSBUaGUgZWZmZWN0IG9mIGxldmVsIG9uIGNvbm5lY3Rpb24oYWxsIGd1aWxkcykKCmBgYHtyfQpwbG90KGNvbm5lY3Rpb25fcGFpcl9ieWd1aWxkX2FsbCRsZXZlbF9kaWZmLGNvbm5lY3Rpb25fcGFpcl9ieWd1aWxkX2FsbCRjb25uZWN0aW9uX3N0cmVuZ3RoLHhsYWI9ImFib3NvbHV0ZSBsZXZlbCBkaWZmZXJlbmNlIix5bGFiID0iY29ubmVjdGlvbiBzdHJlbmd0aCIpCmBgYAoKLSBUaGUgZWZmZWN0IG9mIGxldmVsIG9uIHBlcmNlbnRhZ2UgY29ubmVjdGlvbihhbGwgZ3VpbGRzKQoKYGBge3J9CnBsb3QocGVyY2VudGFnZV9jb25uZWN0aW9uX3BhaXJfYnlndWlsZF9hbGwkbGV2ZWxfZGlmZixwZXJjZW50YWdlX2Nvbm5lY3Rpb25fcGFpcl9ieWd1aWxkX2FsbCRjb25uZWN0aW9uX3N0cmVuZ3RoLHhsYWI9ImFib3NvbHV0ZSBsZXZlbCBkaWZmZXJlbmNlIix5bGFiID0icGVyY2VudGFnZSBjb25uZWN0aW9uIHN0cmVuZ3RoIikKYGBgCgoKLSBUaGUgZWZmZWN0IG9mIHRpbWUgb24gY29ubmVjdGlvbihhbGwgZ3VpbGRzKQoKYGBge3J9CnBsb3QoY29ubmVjdGlvbl9wYWlyX2J5Z3VpbGRfYWxsJHRpbWVfZGlmZixjb25uZWN0aW9uX3BhaXJfYnlndWlsZF9hbGwkY29ubmVjdGlvbl9zdHJlbmd0aCx4bGFiPSJhYm9zb2x1dGUgdGltZSBkaWZmZXJlbmNlIix5bGFiID0iY29ubmVjdGlvbiBzdHJlbmd0aCIpCmBgYAoKCi0gVGhlIGVmZmVjdCBvZiBsZXZlbDYwX3RpbWUgb24gcGVyY2VudGFnZSBjb25uZWN0aW9uKGFsbCBndWlsZHMpCgpgYGB7cn0KcGxvdChwZXJjZW50YWdlX2Nvbm5lY3Rpb25fcGFpcl9ieWd1aWxkX2FsbCRsZXZlbDYwX2RpZmYscGVyY2VudGFnZV9jb25uZWN0aW9uX3BhaXJfYnlndWlsZF9hbGwkY29ubmVjdGlvbl9zdHJlbmd0aCx4bGFiPSJhYm9zb2x1dGUgbGV2ZWw2MCBkaWZmZXJlbmNlIix5bGFiID0icGVyY2VudGFnZSBjb25uZWN0aW9uIHN0cmVuZ3RoIikKYGBgCgotIFRoZSBlZmZlY3Qgb2YgdW5vYnNlcnZlZCBhIG9uIGNvbm5lY3Rpb24oYWxsIGd1aWxkcykKCmBgYHtyfQpwbG90KGNvbm5lY3Rpb25fcGFpcl9ieWd1aWxkX2FsbCRhX2RpZmYsY29ubmVjdGlvbl9wYWlyX2J5Z3VpbGRfYWxsJGNvbm5lY3Rpb25fc3RyZW5ndGgseGxhYj0iYWJvc29sdXRlIGEgZGlmZmVyZW5jZSIseWxhYiA9ImNvbm5lY3Rpb24gc3RyZW5ndGgiKQpgYGAKCi0gVGhlIGVmZmVjdCBvZiB1bm9ic2VydmVkIGEgb24gcGVyY2VudGFnZSBjb25uZWN0aW9uKGFsbCBndWlsZHMpCgpgYGB7cn0KcGxvdChwZXJjZW50YWdlX2Nvbm5lY3Rpb25fcGFpcl9ieWd1aWxkX2FsbCRhX2RpZmYscGVyY2VudGFnZV9jb25uZWN0aW9uX3BhaXJfYnlndWlsZF9hbGwkY29ubmVjdGlvbl9zdHJlbmd0aCx4bGFiPSJhYm9zb2x1dGUgYSBkaWZmZXJlbmNlIix5bGFiID0icGVyY2VudGFnZSBjb25uZWN0aW9uIHN0cmVuZ3RoIikKYGBgCgoKLSBQbGF5ZXJzIG9mIHNhbWUgbGV2ZWwsbGV2ZWw2MCx0aW1lIGJ1dCBkaWZmZXJlbnQgYTogY29ubmVjdGlvbgoKYGBge3J9CnRlbXA8LWZpbHRlcihjb25uZWN0aW9uX3BhaXJfYnlndWlsZF9hbGwsbGV2ZWxfZGlmZjwxLCBsZXZlbDYwX2RpZmY8MSx0aW1lX2RpZmY8MjApCnBsb3QodGVtcCRhX2RpZmYsdGVtcCRjb25uZWN0aW9uX3N0cmVuZ3RoKQpgYGAKCi0gUGxheWVycyBvZiBzYW1lIGxldmVsLGxldmVsNjAsdGltZSBidXQgZGlmZmVyZW50IGE6IHBlcmNlbnRhZ2UgY29ubmVjdGlvbgoKYGBge3J9CnRlbXA8LWZpbHRlcihwZXJjZW50YWdlX2Nvbm5lY3Rpb25fcGFpcl9ieWd1aWxkX2FsbCxsZXZlbF9kaWZmPDEsIGxldmVsNjBfZGlmZjwxLHRpbWVfZGlmZjwyMCkKcGxvdCh0ZW1wJGFfZGlmZix0ZW1wJGNvbm5lY3Rpb25fc3RyZW5ndGgpCmBgYAoKCiMjIyBJbmRpdmlkdWFsIGxldmVsIGEgdHJlbmQKCgojIyMjIEdyb3VwIEJ5IEZyZXF1ZW5jeSBvZiBDaGFuZ2luZyBHdWlsZAoKLSBQbGF5ZXJzIHRoYXQgZnJlcXVlbnQgY2hhbmdlIGd1aWxkCmBgYHtyfQp0ZXN0PC1maWx0ZXIoZm9jYWxfcGxheWVyX3dpdGhfdW5vYnNlcnZlZF9ieXdlZWtfYWxsLHBsYXllcl9pZD09MTI3KQpnZ3Bsb3QodGVzdCxhZXMoeD13ZWVrLHk9cmVsYXRpdmVfYSkpK2dlb21fbGluZSgpCmBgYAoKYGBge3J9CnRlc3Q8LWZpbHRlcihmb2NhbF9wbGF5ZXJfd2l0aF91bm9ic2VydmVkX2J5d2Vla19hbGwscGxheWVyX2lkPT0xMDA0NCkKZ2dwbG90KHRlc3QsYWVzKHg9d2Vlayx5PXJlbGF0aXZlX2EpKStnZW9tX2xpbmUoKQpgYGAKCmBgYHtyfQp0ZXN0PC1maWx0ZXIoZm9jYWxfcGxheWVyX3dpdGhfdW5vYnNlcnZlZF9ieXdlZWtfYWxsLHBsYXllcl9pZD09NjUzNCkKZ2dwbG90KHRlc3QsYWVzKHg9d2Vlayx5PXJlbGF0aXZlX2EpKStnZW9tX2xpbmUoKQpgYGAKCgotIFBsYXllcnMgdGhhdCBuZXZlciBjaGFuZ2UgYSBndWlsZAoKYGBge3J9CnRlc3Q8LWZpbHRlcihmb2NhbF9wbGF5ZXJfd2l0aF91bm9ic2VydmVkX2J5d2Vla19hbGwscGxheWVyX2lkPT0zMCkKZ2dwbG90KHRlc3QsYWVzKHg9d2Vlayx5PXJlbGF0aXZlX2EpKStnZW9tX2xpbmUoKQpgYGAKCmBgYHtyfQp0ZXN0PC1maWx0ZXIoZm9jYWxfcGxheWVyX3dpdGhfdW5vYnNlcnZlZF9ieXdlZWtfYWxsLHBsYXllcl9pZD09NDQpCmdncGxvdCh0ZXN0LGFlcyh4PXdlZWsseT1yZWxhdGl2ZV9hKSkrZ2VvbV9saW5lKCkKYGBgCgpgYGB7cn0KdGVzdDwtZmlsdGVyKGZvY2FsX3BsYXllcl93aXRoX3Vub2JzZXJ2ZWRfYnl3ZWVrX2FsbCxwbGF5ZXJfaWQ9PTYyKQpnZ3Bsb3QodGVzdCxhZXMoeD13ZWVrLHk9cmVsYXRpdmVfYSkpK2dlb21fbGluZSgpCmBgYAoKIyMjIyBHcm91cCBCeSBNZWFuIGEKCi0gUGxheWVycyB3aXRoIGxvdyBhdmVyYWdlIGEKCmBgYHtyfQp0ZXN0PC1maWx0ZXIoZm9jYWxfcGxheWVyX3dpdGhfdW5vYnNlcnZlZF9ieXdlZWtfYWxsLHBsYXllcl9pZCAlaW4lIGxvd19tZWFuX3BsYXllcl9zYW1wbGUpCmdncGxvdCh0ZXN0LGFlcyh4PXdlZWsseT11bm9ic2VydmVkX2EsY29sb3I9ZmFjdG9yKHBsYXllcl9pZCkpKStnZW9tX2xpbmUoKQpnZ3Bsb3QodGVzdCxhZXMoeD13ZWVrLHk9cmVsYXRpdmVfYSxjb2xvcj1mYWN0b3IocGxheWVyX2lkKSkpK2dlb21fbGluZSgpCmBgYAoKVGhlIHBlcmNlbnRhZ2Ugb2YgY2hhbmdpbmcgZ3VpbGQgaXMgCmBgYHtyfQp0ZXN0PC1maWx0ZXIoZm9jYWxfcGxheWVyX3dpdGhfdW5vYnNlcnZlZF9ieXdlZWtfYWxsLHBsYXllcl9pZCAlaW4lIGxvd19tZWFuX3BsYXllcikKdGFibGUodGVzdCRjaGFuZ2VfZ3VpbGQpWzJdL25yb3codGVzdCkKYGBgCgoKLSBQbGF5ZXJzIHdpdGggaGlnaCBhdmVyYWdlIGEKCmBgYHtyfQp0ZXN0PC1maWx0ZXIoZm9jYWxfcGxheWVyX3dpdGhfdW5vYnNlcnZlZF9ieXdlZWtfYWxsLHBsYXllcl9pZCAlaW4lIGhpZ2hfbWVhbl9wbGF5ZXJfc2FtcGxlKQpnZ3Bsb3QodGVzdCxhZXMoeD13ZWVrLHk9dW5vYnNlcnZlZF9hLGNvbG9yPWZhY3RvcihwbGF5ZXJfaWQpKSkrZ2VvbV9saW5lKCkKZ2dwbG90KHRlc3QsYWVzKHg9d2Vlayx5PXJlbGF0aXZlX2EsY29sb3I9ZmFjdG9yKHBsYXllcl9pZCkpKStnZW9tX2xpbmUoKQpgYGAKClRoZSBwZXJjZW50YWdlIG9mIGNoYW5naW5nIGd1aWxkIGlzIApgYGB7cn0KdGVzdDwtZmlsdGVyKGZvY2FsX3BsYXllcl93aXRoX3Vub2JzZXJ2ZWRfYnl3ZWVrX2FsbCxwbGF5ZXJfaWQgJWluJSBoaWdoX21lYW5fcGxheWVyKQp0YWJsZSh0ZXN0JGNoYW5nZV9ndWlsZClbMl0vbnJvdyh0ZXN0KQpgYGAKCiMjIyMgR3JvdXAgQnkgVmFyaWFuY2UgaW4gYQotIFBsYXllcnMgd2l0aCBsb3cgdmFyaWFuY2UgaW4gYQoKYGBge3J9CnRlc3Q8LWZpbHRlcihmb2NhbF9wbGF5ZXJfd2l0aF91bm9ic2VydmVkX2J5d2Vla19hbGwscGxheWVyX2lkICVpbiUgbG93X3Zhcl9wbGF5ZXJfc2FtcGxlKQpnZ3Bsb3QodGVzdCxhZXMoeD13ZWVrLHk9dW5vYnNlcnZlZF9hLGNvbG9yPWZhY3RvcihwbGF5ZXJfaWQpKSkrZ2VvbV9saW5lKCkKZ2dwbG90KHRlc3QsYWVzKHg9d2Vlayx5PXJlbGF0aXZlX2EsY29sb3I9ZmFjdG9yKHBsYXllcl9pZCkpKStnZW9tX2xpbmUoKQpgYGAKVGhlIHBlcmNlbnRhZ2Ugb2YgY2hhbmdpbmcgZ3VpbGQgaXMgCmBgYHtyfQp0ZXN0PC1maWx0ZXIoZm9jYWxfcGxheWVyX3dpdGhfdW5vYnNlcnZlZF9ieXdlZWtfYWxsLHBsYXllcl9pZCAlaW4lIGxvd192YXJfcGxheWVyKQp0YWJsZSh0ZXN0JGNoYW5nZV9ndWlsZClbMl0vbnJvdyh0ZXN0KQpgYGAKClN1bW1hcnkgc3RhdHMgb2YgdW5vYnNlcnZlZCBhCgpgYGB7cn0Kc3VtbWFyeSh0ZXN0JHVub2JzZXJ2ZWRfYSkKCgoKYGBgCgpTdW1tYXJ5IHN0YXRzIG9mIHJlbGF0aXZlIGEKYGBge3J9CnN1bW1hcnkodGVzdCRyZWxhdGl2ZV9hKQpgYGAKCgoKCi0gUGxheWVycyB3aXRoIGhpZ2ggdmFyaWFuY2UgaW4gYQpgYGB7cn0KdGVzdDwtZmlsdGVyKGZvY2FsX3BsYXllcl93aXRoX3Vub2JzZXJ2ZWRfYnl3ZWVrX2FsbCxwbGF5ZXJfaWQgJWluJSBoaWdoX3Zhcl9wbGF5ZXJfc2FtcGxlKQpnZ3Bsb3QodGVzdCxhZXMoeD13ZWVrLHk9dW5vYnNlcnZlZF9hLGNvbG9yPWZhY3RvcihwbGF5ZXJfaWQpKSkrZ2VvbV9saW5lKCkKZ2dwbG90KHRlc3QsYWVzKHg9d2Vlayx5PXJlbGF0aXZlX2EsY29sb3I9ZmFjdG9yKHBsYXllcl9pZCkpKStnZW9tX2xpbmUoKQoKYGBgCgpQZXJjZW50YWdlIG9mIGNoYW5naW5nIGd1aWxkcwpgYGB7cn0KdGVzdDwtZmlsdGVyKGZvY2FsX3BsYXllcl93aXRoX3Vub2JzZXJ2ZWRfYnl3ZWVrX2FsbCxwbGF5ZXJfaWQgJWluJSBoaWdoX3Zhcl9wbGF5ZXIpCnRhYmxlKHRlc3QkY2hhbmdlX2d1aWxkKVsyXS9ucm93KHRlc3QpCmBgYAoKU3VtbWFyeSBzdGF0cyBvZiB1bm9ic2VydmVkIGEKCmBgYHtyfQpzdW1tYXJ5KHRlc3QkdW5vYnNlcnZlZF9hKQpgYGAKClN1bW1hcnkgc3RhdHMgb2YgcmVsYXRpdmUgYQpgYGB7cn0Kc3VtbWFyeSh0ZXN0JHJlbGF0aXZlX2EpCmBgYAoKCgoKIyMjIEd1aWxkIGxldmVsIGEgdHJlbmQKLSBVbm9ic2VydmVkIGEgYnkgZ3VpbGQKYGBge3J9CmdncGxvdChndWlsZF9hX2J5d2VlayxhZXMoeD13ZWVrLHk9bWVhbl9hLGdyb3VwPWd1aWxkX2lkLGNvbG91cj1mYWN0b3IoZ3VpbGRfaWQpKSkrZ2VvbV9saW5lKCkKZ2dwbG90KGd1aWxkX2FfYnl3ZWVrLGFlcyh4PXdlZWsseT12YXJfYSxncm91cD1ndWlsZF9pZCxjb2xvdXI9ZmFjdG9yKGd1aWxkX2lkKSkpK2dlb21fbGluZSgpCgpgYGAKCg==