/**
  * @param int $summit_id
  * @return string
  * @throws EntityValidationException
  * @throws NotFoundEntityException
  */
 public function getSpeakerConfirmationLink($summit_id)
 {
     $confirmation_page = SummitConfirmSpeakerPage::getBy(intval($summit_id));
     if (!$confirmation_page) {
         throw new NotFoundEntityException('Confirmation Speaker Page not set on current summit!');
     }
     $url = $confirmation_page->getAbsoluteLiveLink(false);
     if ($this->hasAssistanceFor($summit_id)) {
         throw new EntityValidationException(sprintf('this is already an assistance request for speaker %s on summit id %s', $this->ID, $summit_id));
     }
     $request = $this->createAssistanceFor($summit_id);
     $token = null;
     $already_exists = false;
     do {
         $token = $request->generateConfirmationToken();
         $already_exists = intval(PresentationSpeakerSummitAssistanceConfirmationRequest::get()->filter(['SummitID' => intval($summit_id), 'SpeakerID:ExactMatch:not' => $this->ID, 'ConfirmationHash' => PresentationSpeakerSummitAssistanceConfirmationRequest::HashConfirmationToken($token)])->count()) > 1;
     } while ($already_exists);
     $request->write();
     return $url . 'confirm?t=' . base64_encode($token);
 }