package Ġp 2 p . br ah ms . manager Ċ Ċ import Ġkotlinx . serialization . Experimental Serialization Api Ċ import Ġmain . Preferences Ċ import Ġmain . random Sub Set Ċ import Ġmessaging . P 2 P Com municator Ċ import Ġmessaging . p 2 p .* Ċ import Ġp 2 p . br ah ms . History Ċ import Ġp 2 p . br ah ms . View Ċ import Ġjava . util .* Ċ import Ġjava . util . concurrent . Concurrent HashMap Ċ import Ġkotlin . time . Experimental Time Ċ Ċ @ Experimental Serialization Api Ċ @ Experimental Time Ċ object ĠPull Manager Ġ: ĠP 2 P Msg Listener Ġ{ ĊĠĠĠ Ġprivate Ġval Ġrequests : ĠConcurrent HashMap < Peer , ĠPull Request > Ġ= ĠConcurrent HashMap () ĊĠĠĠ Ġval Ġpull s : ĠMutable Set < Peer > Ġ= ĠCollections . synchronized Set ( mutable Set Of ()) ĊĊĠĠĠ Ġfun Ġreset () Ġ{ ĊĠĠĠĠĠĠĠ Ġpull s . clear () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġpull ( peers : ĠCollection < Peer >) Ġ{ ĊĠĠĠĠĠĠĠ Ġrequests . clear () ĊĠĠĠĠĠĠĠ Ġpeers . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpull Request Ġ= ĠPull Request ( Preferences . pull Limit ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrequests [ it ] Ġ= Ġpull Request ĊĠĠĠĠĠĠĠĠĠĠĠ ĠP 2 P Com municator . send ( pull Request , Ġit ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġreceive ( msg : ĠP 2 P Msg ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( msg Ġis ĠPull Response Ġ&& Ġrequests . containsKey ( msg . sender )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġonline Ne ighbours : ĠSet < Peer > Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmsg . ne ighbour Sample . filter Ġ{ Ġit Ġ!= ĠPreferences . self Ġ}. filter ( View :: is Online ). toSet () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠHistory . next ( online Ne ighbours ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpull s . addAll ( online Ne ighbours ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( msg Ġis ĠPull Request ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠP 2 P Com municator . send ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPull Response ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠView . view . random Sub Set ( msg . limit ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmsg . sender ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊ Ċ }