public PayoutWinnerInfo payoutWinners(HashMap<PokerBot, Integer> botHandStrengths)
	{	
		// Calculate with the involved bots how much each bot put in the main pot and how much per side pot
		ArrayList<Integer> involvedBotBets = new ArrayList<Integer>();
		for(Entry<PokerBot, Integer> entry : botHandStrengths.entrySet())
			involvedBotBets.add(botBetSizes.get(entry.getKey()));
		Collections.sort(involvedBotBets);
		ArrayList<Integer> potsAmountPerBot = new ArrayList<Integer>();
		int previousAmount = 0;
		for(int i = 0; i < involvedBotBets.size(); i++)
		{
			potsAmountPerBot.add(involvedBotBets.get(i) - previousAmount);
			previousAmount = involvedBotBets.get(i);
		}
		
		// Get the sizes of the main pot and the side pots
		ArrayList<PokerBot> bots = new ArrayList<PokerBot>(botHandStrengths.keySet());
		ArrayList<Integer> pots = getPots(bots);
		
		// Calculate per pot part which players are winning it
		ArrayList<ArrayList<PokerBot>> winnerPerPot = new ArrayList<ArrayList<PokerBot>>();
		int potIndex = 0;
		int sumHandledPots = 0;
		while(botHandStrengths.size() > 0)
		{		
			// Get out of the remaining bots the bot(s) that has/have the best hand
			int bestHandValue = 0;
			ArrayList<PokerBot> currentBestBots = new ArrayList<PokerBot>();
			for(Entry<PokerBot, Integer> entry : botHandStrengths.entrySet())
			{
				int value = entry.getValue();
				if(value > bestHandValue)
					currentBestBots.clear();
				if(value >= bestHandValue)
				{
					bestHandValue = value;
					currentBestBots.add(entry.getKey());
				}					
			}
				
			// Calculate for each bot with currently the best hand in which remaining pots he is involved
			int maxPotIndex = 0;
			int maxSumHandledPots = 0;
			for(int i = 0; i < currentBestBots.size(); i++)
			{
				int currentPotIndex = potIndex;
				int currentSumHandledPots = sumHandledPots;
				PokerBot currentBot = currentBestBots.get(i);
				botHandStrengths.remove(currentBot);
				while(botBetSizes.get(currentBot) > currentSumHandledPots)
				{
					ArrayList<PokerBot> currentPotWinners = new ArrayList<PokerBot>();
					if(currentPotIndex <= winnerPerPot.size() - 1)
					{
						currentPotWinners = winnerPerPot.get(currentPotIndex);
						currentPotWinners.add(currentBot);
						winnerPerPot.set(currentPotIndex, currentPotWinners);
					}
					else
					{
						currentPotWinners.add(currentBot);
						winnerPerPot.add(currentPotWinners);
					}
					//currentSumHandledPots += pots.get(currentPotIndex++);
					currentSumHandledPots += potsAmountPerBot.get(currentPotIndex++);
				}
				maxPotIndex = Math.max(maxPotIndex, currentPotIndex);
				maxSumHandledPots = Math.max(maxSumHandledPots, currentSumHandledPots);
			}
			potIndex = maxPotIndex;
			sumHandledPots = maxSumHandledPots;
		}
		
		return new PayoutWinnerInfo(pots, winnerPerPot);
	}