private static List<AttackTransferMove> getNecessarySupportMoves(BotState state, Region neededHelpRegion,
			int missingArmies, int minimumUsefulArmies) {
		List<AttackTransferMove> out = new ArrayList<>();
		List<Region> ownedNeighbors = new ArrayList<>();
		ownedNeighbors.addAll(neededHelpRegion.getOwnedNeighbors(state));
		ownedNeighbors = RegionValueCalculator.sortRegionsByDefenceRegionValue(state, ownedNeighbors);
		int stillMissingArmies = missingArmies;
		for (int i = ownedNeighbors.size() - 1; i >= 0; i--) {
			Region ownedNeighbor = ownedNeighbors.get(i);
			int neededDefenceArmies;
			if (ownedNeighbor.getDefenceRegionValue() < RegionValueCalculator.LOWEST_MEDIUM_PRIORITY_VALUE
					|| (neededHelpRegion.getDefenceRegionValue() >= RegionValueCalculator.LOWEST_HIGH_PRIORITY_VALUE && ownedNeighbor
							.getDefenceRegionValue() < RegionValueCalculator.LOWEST_HIGH_PRIORITY_VALUE)) {
				neededDefenceArmies = 0;
			} else {
				neededDefenceArmies = NeededArmiesCalculator.getNeededDefenseArmies(ownedNeighbor).defendingArmiesFullDeployment;
			}
			int possibleSpareArmies = Math.min(ownedNeighbor.getIdleArmies(), ownedNeighbor.getArmiesAfterDeployment()
					- neededDefenceArmies);
			int transferingArmies = Math.min(stillMissingArmies, possibleSpareArmies);
			if (transferingArmies > 0) {
				AttackTransferMove atm = new AttackTransferMove(state.getMyPlayerName(), ownedNeighbor,
						neededHelpRegion, transferingArmies);
				out.add(atm);
			}
			stillMissingArmies -= transferingArmies;
			minimumUsefulArmies -= transferingArmies;
		}
		// if (stillMissingArmies == 0) {
		if (minimumUsefulArmies <= 0) {
			return out;
		} else {
			return new ArrayList<AttackTransferMove>();
		}
	}