Program: 80874
Project: 80874
Buggy source:
@Override @SneakyThrows public void fillTabList(ProxiedPlayer player,TabList tabList,TabListContext context){
  if (config.verticalMode) {
    tabList=tabList.flip();
    context=new GenericTabListContext(tabList.getRows(),tabList.getColumns(),player,context.getPlayerManager());
    context=context.setPlayer(BungeeTabListPlus.getInstance().getConnectedPlayerManager().getPlayer(context.getViewer()));
  }
  if (config.autoShrinkTabList) {
    tabList.setShouldShrink(true);
  }
  final TabListContext finalContext=context;
  List<Section> topSections=topSectionsProvider.stream().flatMap(f -> f.apply(finalContext).stream()).collect(Collectors.toCollection(ArrayList::new));
  List<Section> botSections=botSectionsProvider.stream().flatMap(f -> f.apply(finalContext).stream()).collect(Collectors.toCollection(ArrayList::new));
  preCalculateSections(context,topSections);
  preCalculateSections(context,botSections);
  for (Iterator<Section> iterator=topSections.iterator(); iterator.hasNext(); ) {
    Section topSection=iterator.next();
    if (topSection.getMaxSize() == 0) {
      iterator.remove();
    }
  }
  for (Iterator<Section> iterator=botSections.iterator(); iterator.hasNext(); ) {
    Section botSection=iterator.next();
    if (botSection.getMaxSize() == 0) {
      iterator.remove();
    }
  }
  Layout<Section> layout=layoutManager.calculateLayout(topSections,botSections,context);
  for (int i=0; i < tabList.getSize(); i++) {
    Optional<Layout<Section>.SlotData> slotData=layout.getSlotData(i);
    if (slotData.isPresent()) {
      Layout<Section>.SlotData data=slotData.get();
      tabList.setSlot(i,data.getSection().getSlotAt(context,data.getSlotIndex(),data.getSectionSize()));
    }
  }
  if (showHeaderFooter) {
    tabList.setHeader(header.buildSlot(context).getText());
    tabList.setFooter(footer.buildSlot(context).getText());
  }
  if (BungeeTabListPlus.isVersion18()) {
    tabList.setDefaultSkin(plugin.getSkinManager().getSkin(config.defaultSkin));
  }
  tabList.setDefaultPing(config.defaultPing);
}

Fixed version (ground truth):
@Override @SneakyThrows public void fillTabList(ProxiedPlayer player,TabList tabList,TabListContext context){
  if (config.verticalMode) {
    tabList=tabList.flip();
    context=new GenericTabListContext(tabList.getRows(),tabList.getColumns(),player,context.getPlayerManager()).setPlayer(context.getPlayer());
  }
  if (config.autoShrinkTabList) {
    tabList.setShouldShrink(true);
  }
  final TabListContext finalContext=context;
  List<Section> topSections=topSectionsProvider.stream().flatMap(f -> f.apply(finalContext).stream()).collect(Collectors.toCollection(ArrayList::new));
  List<Section> botSections=botSectionsProvider.stream().flatMap(f -> f.apply(finalContext).stream()).collect(Collectors.toCollection(ArrayList::new));
  preCalculateSections(context,topSections);
  preCalculateSections(context,botSections);
  for (Iterator<Section> iterator=topSections.iterator(); iterator.hasNext(); ) {
    Section topSection=iterator.next();
    if (topSection.getMaxSize() == 0) {
      iterator.remove();
    }
  }
  for (Iterator<Section> iterator=botSections.iterator(); iterator.hasNext(); ) {
    Section botSection=iterator.next();
    if (botSection.getMaxSize() == 0) {
      iterator.remove();
    }
  }
  Layout<Section> layout=layoutManager.calculateLayout(topSections,botSections,context);
  for (int i=0; i < tabList.getSize(); i++) {
    Optional<Layout<Section>.SlotData> slotData=layout.getSlotData(i);
    if (slotData.isPresent()) {
      Layout<Section>.SlotData data=slotData.get();
      tabList.setSlot(i,data.getSection().getSlotAt(context,data.getSlotIndex(),data.getSectionSize()));
    }
  }
  if (showHeaderFooter) {
    tabList.setHeader(header.buildSlot(context).getText());
    tabList.setFooter(footer.buildSlot(context).getText());
  }
  if (BungeeTabListPlus.isVersion18()) {
    tabList.setDefaultSkin(plugin.getSkinManager().getSkin(config.defaultSkin));
  }
  tabList.setDefaultPing(config.defaultPing);
}