  }
  
  void Slider::loadThumbnails() {
    const auto &segments = can->route()->segments();
    double max_time = 0;
    for (auto it = segments.rbegin(); it != segments.rend() && !abort_load_thumbnail; ++it) {
      LogReader log;
      std::string qlog = it->second.qlog.toStdString();
      if (!qlog.empty() && log.load(qlog, &abort_load_thumbnail, {cereal::Event::Which::THUMBNAIL, cereal::Event::Which::CONTROLS_STATE}, true, 0, 3)) {
        if (max_time == 0 && !log.events.empty()) {
          max_time = (*(log.events.rbegin()))->mono_time / 1e9 - can->routeStartTime();
 
</s> remove     if (!qlog.empty() && log.load(qlog, &abort_load_thumbnail, {cereal::Event::Which::THUMBNAIL, cereal::Event::Which::CONTROLS_STATE}, true, 0, 3)) {
      if (max_time == 0 && !log.events.empty()) {
        max_time = (*(log.events.rbegin()))->mono_time / 1e9 - can->routeStartTime();
 </s> add     if (!qlog.empty() && log.load(qlog, &abort_parse_qlog, {cereal::Event::Which::THUMBNAIL, cereal::Event::Which::CONTROLS_STATE}, true, 0, 3)) {
      if (it == segments.rbegin() && !log.events.empty()) {
        double max_time = (*(log.events.rbegin()))->mono_time / 1e9 - can->routeStartTime(); </s> remove void Slider::loadThumbnails() {
 </s> add void Slider::parseQLog() { </s> remove       for (auto ev = log.events.cbegin(); ev != log.events.cend() && !abort_load_thumbnail; ++ev) {
 </s> add       for (auto ev = log.events.cbegin(); ev != log.events.cend() && !abort_parse_qlog; ++ev) { </s> remove   abort_load_thumbnail = true;
  thumnail_future.waitForFinished();
 </s> add   abort_parse_qlog = true;
  if (qlog_future) {
    qlog_future->waitForFinished();
  } </s> remove   thumnail_future = QtConcurrent::run(this, &Slider::loadThumbnails);
 </s> add   QObject::connect(can, &AbstractStream::eventsMerged, [this]() {
    if (!qlog_future) {
      qlog_future = std::make_unique<QFuture<void>>(QtConcurrent::run(this, &Slider::parseQLog));
    }
  });
  for (auto it = segments.rbegin(); it != segments.rend() && !abort_parse_qlog; ++it) {
  }
  
  void Slider::loadThumbnails() {
    const auto &segments = can->route()->segments();
  for (auto it = segments.rbegin(); it != segments.rend() && !abort_parse_qlog; ++it) {
  for (auto it = segments.rbegin(); it != segments.rend() && !abort_parse_qlog; ++it) {
      LogReader log;
      std::string qlog = it->second.qlog.toStdString();
      if (!qlog.empty() && log.load(qlog, &abort_load_thumbnail, {cereal::Event::Which::THUMBNAIL, cereal::Event::Which::CONTROLS_STATE}, true, 0, 3)) {
        if (max_time == 0 && !log.events.empty()) {
          max_time = (*(log.events.rbegin()))->mono_time / 1e9 - can->routeStartTime();
keep keep keep keep replace replace keep keep keep keep keep
 cabana: fix seeking issue (#28346)

* fix seekto

* rename loadThumbnail to parseQLog 
tools/cabana/videowidget.cc