private static ICardPicker PurchaseOrder()
        {
            var highPriority = new CardPickByPriority(
                CardAcceptance.For(Cards.Province, ShouldBuyProvinceOverDuchyDuke),
                CardAcceptance.For(Cards.Duke, gameState => ShouldBuyDukeOverDuchy(gameState) && ShouldBuyDuchyDukeOverPowerUp(gameState)),
                CardAcceptance.For(Cards.Duchy, ShouldBuyDuchyDukeOverPowerUp),
                CardAcceptance.For(Cards.Duke, ShouldBuyDuchyDukeOverPowerUp),
                CardAcceptance.For(Cards.Estate, gameState => CountOfPile(Cards.Province, gameState) < 2),
                CardAcceptance.For(Cards.Duke, gameState => ShouldBuyDukeOverDuchy(gameState) && AtEndGame(gameState)),
                CardAcceptance.For(Cards.Duchy, AtEndGame),
                CardAcceptance.For(Cards.Duke, AtEndGame),
                CardAcceptance.For(Cards.Caravan, CanDoubleCaravan),
                CardAcceptance.For(Cards.Cartographer, gameState => CountAllOwned(Cards.Cartographer, gameState) < 2),
                CardAcceptance.For(Cards.Gold, gameState => gameState.Self.AvailableBuys <= 1));

            var buildOrder = new CardPickByBuildOrder(
                CardAcceptance.For(Cards.Bridge),
                CardAcceptance.For(Cards.Silver),
                CardAcceptance.For(Cards.Silver),
                CardAcceptance.For(Cards.Bridge));

            var lowPriority = new CardPickByPriority(
                        CardAcceptance.For(Cards.Caravan),
                        CardAcceptance.For(Cards.Estate, gameState => CountOfPile(Cards.Province, gameState) < 4),
                        CardAcceptance.For(Cards.Silver));

            return new CardPickConcatenator(highPriority, buildOrder, lowPriority);
        }
        private static ICardPicker PurchaseOrder()
        {
            var highPriority = new CardPickByPriority(
                    CardAcceptance.For(Cards.Province, gameState => gameState.Self.AvailableBuys >= 4 || CountAllOwned(Cards.Province, gameState) > 0),
                    CardAcceptance.For(Cards.Duchy, gameState => CountAllOwned(Cards.Province, gameState) >= 3),
                    CardAcceptance.For(Cards.Estate, gameState => CountOfPile(Cards.Province, gameState) <= 1));
                    //CardAcceptance.For(Cards.Jester, gameState => CountAllOwned(Cards.Jester, gameState) == 0));  // jester actually hurts in a non mirror match

            /*//  Intuitive guess as to the right build order, not correct it seeems.
            var buildOrder = new CardPickByBuildOrder(
                Cards.Armory,
                Cards.Silver,
                Cards.WanderingMinstrel,
                Cards.Watchtower,
                Cards.Rats,
                Cards.Watchtower);*/

            var buildOrder = new CardPickByBuildOrder(
                CardAcceptance.For(Cards.Armory),
                CardAcceptance.For(Cards.Watchtower),
                CardAcceptance.For(Cards.Rats),
                CardAcceptance.For(Cards.Watchtower));

            var lowPriority = new CardPickByPriority(
                    CardAcceptance.For(Cards.Bridge, ShouldBuyBridge),
                    CardAcceptance.For(Cards.WanderingMinstrel),
                    CardAcceptance.For(Cards.Watchtower, gameState => CountAllOwned(Cards.Watchtower, gameState) < 3));

            return new CardPickConcatenator(highPriority, buildOrder, lowPriority);
        }
        private static ICardPicker PurchaseOrder(bool shouldApprentice)
        {
            var openning = new CardPickByPriority(
                          CardAcceptance.For(Cards.IronWorks, 1),
                          CardAcceptance.For(Cards.Chapel, 1));

            var ironworksGains = new CardPickForCondition(
                gameState => CardBeingPlayedIs(Cards.IronWorks, gameState),
                new CardPickByPriority(
                    CardAcceptance.For(Cards.GreatHall, gameState => !HasChainingDeck(gameState)),
                    CardAcceptance.For(Cards.WorkersVillage)
                ));

            return new CardPickConcatenator(
                openning,
                ironworksGains);
            /*
            return new CardPickByPriority(
                          CardAcceptance.For(Cards.IronWorks, 1),
                          CardAcceptance.For(Cards.Chapel, 1),
                          CardAcceptance.For(Cards.GreatHall, gameState => CardBeingPlayedIs(Cards.IronWorks, gameState) && !HasChainingDeck(gameState)),
                          CardAcceptance.For(Cards.Peddler, 3),
                          CardAcceptance.For(Cards.Militia, gameState => HasChainingDeck(gameState)),
                          CardAcceptance.For(Cards.KingsCourt, gameState => HasChainingDeck(gameState) && CountAllOwned(Cards.KingsCourt, gameState) == 0),
                          CardAcceptance.For(Cards.KingsCourt, gameState => HasChainingDeck(gameState) && CountAllOwned(Cards.KingsCourt, gameState) == 0),
                          CardAcceptance.For(Cards.Peddler),
                          CardAcceptance.For(Cards.WorkersVillage),
                          CardAcceptance.For(Cards.Pawn),
                          );*/
        }
        private static ICardPicker PurchaseOrder()
        {
            var highPriority = new CardPickByPriority(
                    CardAcceptance.For(Cards.Embassy, gameState => CountAllOwned(Cards.Embassy, gameState) < 1),
                    CardAcceptance.For(Cards.Duchy),
                    CardAcceptance.For(Cards.Duke));

            var buildOrder = new CardPickByBuildOrder(
                CardAcceptance.For(Cards.Silver),
                CardAcceptance.For(Cards.Warehouse),
                CardAcceptance.For(Cards.Silver),
                CardAcceptance.For(Cards.Silver),
                CardAcceptance.For(Cards.Silver),
                CardAcceptance.For(Cards.Silver),
                CardAcceptance.For(Cards.Warehouse),
                CardAcceptance.For(Cards.Silver),
                CardAcceptance.For(Cards.Silver),
                CardAcceptance.For(Cards.Silver),
                CardAcceptance.For(Cards.Silver),
                CardAcceptance.For(Cards.Warehouse));

            var lowPriority = new CardPickByPriority(
                        CardAcceptance.For(Cards.Silver));

            return new CardPickConcatenator(highPriority, buildOrder, lowPriority);
        }
        private static ICardPicker PurchaseOrder()
        {
            var highPriority = new CardPickByPriority(
                    CardAcceptance.For(Cards.Province, ShouldBuyProvinces),
                    CardAcceptance.For(Cards.Duchy, gameState => CountAllOwned(Cards.Province, gameState) >= 3),
                    CardAcceptance.For(Cards.Estate, gameState => CountOfPile(Cards.Province, gameState) <= 1),
                    CardAcceptance.For(Cards.Salvager, gameState => CountAllOwned(Cards.Copper, gameState) >= 6 && CountAllOwned(Cards.Salvager, gameState) == 0),
                    CardAcceptance.For(Cards.Lookout, gameState => CountAllOwned(Cards.Copper, gameState) >= 6 && CountAllOwned(Cards.Lookout, gameState) == 0),
                    CardAcceptance.For(Cards.Silver, gameState => CountAllOwned(Cards.Silver, gameState) + CountAllOwned(Cards.Festival, gameState) < 2)
                    );

            var buildOrder = new CardPickByBuildOrder(
                CardAcceptance.For(Cards.Festival),
                CardAcceptance.For(Cards.Library),
                CardAcceptance.For(Cards.Festival),
                CardAcceptance.For(Cards.Highway),
                CardAcceptance.For(Cards.Highway),
                CardAcceptance.For(Cards.Festival),
                CardAcceptance.For(Cards.Festival),
                CardAcceptance.For(Cards.Library),
                CardAcceptance.For(Cards.Festival)
                );

            var lowPriority = new CardPickByPriority(
                CardAcceptance.For(Cards.Highway));

            return new CardPickConcatenator(highPriority, buildOrder, lowPriority);
        }
        private static ICardPicker PurchaseOrder()
        {
            var highPriority = new CardPickByPriority(
                        CardAcceptance.For(Cards.Province),
                        CardAcceptance.For(Cards.Duchy, gameState => CountOfPile(Cards.Province, gameState) <= 4));

            var buildOrder = new CardPickByBuildOrder(
                CardAcceptance.For(Cards.FishingVillage),
                CardAcceptance.For(Cards.Chapel));

            var lowPriority = new CardPickByPriority(
                        CardAcceptance.For(Cards.FishingVillage, gameState => CountAllOwned(Cards.FishingVillage, gameState) < 2),
                        CardAcceptance.For(Cards.PoorHouse));

            return new CardPickConcatenator(highPriority, buildOrder, lowPriority);
        }
        private static ICardPicker PurchaseOrder()
        {
            var highPriority = new CardPickByPriority(
                CardAcceptance.For(Cards.Province),
                CardAcceptance.For(Cards.IllGottenGains, DefaultStrategies.ShouldGainIllGottenGains),
                CardAcceptance.For(Cards.Gold, gameState => CountOfPile(Cards.Province, gameState) >= 6),
                CardAcceptance.For(Cards.Duchy),
                CardAcceptance.For(Cards.Estate, gameState => CountOfPile(Cards.Province, gameState) < 2));

            var buildOrder = new CardPickByBuildOrder(
                CardAcceptance.For(Cards.Silver));

            var lowPriority = new CardPickByPriority(
                        CardAcceptance.For(Cards.Silver),
                        CardAcceptance.For(Cards.Copper));

            return new CardPickConcatenator(highPriority, buildOrder, lowPriority);
        }
        private static ICardPicker PurchaseOrder()
        {
            var highPriority = new CardPickByPriority(
                    CardAcceptance.For(Cards.Province, gameState => CountAllOwned(Cards.Gold, gameState) >=2),
                    CardAcceptance.For(Cards.Duchy, gameState => CountOfPile(Cards.Province, gameState) <= 4),
                    CardAcceptance.For(Cards.Gold),
                    CardAcceptance.For(Cards.Laboratory));

            var buildOrder = new CardPickByBuildOrder(
                CardAcceptance.For(Cards.SpiceMerchant),
                CardAcceptance.For(Cards.Silver),
                CardAcceptance.For(Cards.Warehouse));

            var lowPriority = new CardPickByPriority(
                        CardAcceptance.For(Cards.Silver),
                        CardAcceptance.For(Cards.Estate, gameState => CountOfPile(Cards.Province, gameState) <= 4));

            return new CardPickConcatenator(highPriority, buildOrder, lowPriority);
        }
        private static ICardPicker PurchaseOrder(ICardPicker trashOrder)
        {
            var highPriority = new CardPickByPriority(
                        CardAcceptance.For(Cards.Province, gameState => CountAllOwned(trashOrder, gameState) <= 3),
                        CardAcceptance.For(Cards.Library, gameState => CountAllOwned(Cards.Library, gameState) < 1),
                        CardAcceptance.For(Cards.Count, gameState => CountAllOwned(Cards.Count, gameState) < 1));

            var buildOrder = new CardPickByBuildOrder(
                CardAcceptance.For(Cards.FishingVillage),
                CardAcceptance.For(Cards.Library),
                CardAcceptance.For(Cards.Count),
                CardAcceptance.For(Cards.Library));

            var lowPriority = new CardPickByPriority(
                        CardAcceptance.For(Cards.PoorHouse, gameState => CountAllOwned(Cards.PoorHouse, gameState) < 2 &&
                                                                            CountAllOwned(Cards.Count, gameState) >= 1),
                        CardAcceptance.For(Cards.FishingVillage));

            return new CardPickConcatenator(highPriority, buildOrder, lowPriority);
        }
        private static ICardPicker PurchaseOrder(bool shouldBuySpiceMerchant, bool shouldBuyPlaza)
        {
            var highPriority = new CardPickByPriority(
                    CardAcceptance.For(Cards.Province, CardAcceptance.AlwaysMatch, CardAcceptance.OverPayMaxAmount));

            var buildOrder = new CardPickByBuildOrder(
                shouldBuySpiceMerchant == true ? CardAcceptance.For(Cards.SpiceMerchant) : CardAcceptance.For(Cards.Silver),
                CardAcceptance.For(Cards.Silver),
                CardAcceptance.For(Cards.Embassy),
                CardAcceptance.For(Cards.Tunnel),
                CardAcceptance.For(Cards.Embassy),
                shouldBuyPlaza ? CardAcceptance.For(Cards.Plaza) : null);

            var lowPriority = new CardPickByPriority(
                        CardAcceptance.For(Cards.Duchy, gameState => CountOfPile(Cards.Province, gameState) <= 4),
                        CardAcceptance.For(Cards.Tunnel, gameState => gameState.Self.AllOwnedCards.Count > 13),
                        CardAcceptance.For(Cards.Silver));

            return new CardPickConcatenator(highPriority, buildOrder, lowPriority);
        }
        static ICardPicker PurchaseOrder()
        {
            var highPriority = new CardPickByPriority(
                        CardAcceptance.For(Cards.Province, gameState => gameState.players.CurrentPlayer.AllOwnedCards.CountOf(Cards.Gold) > 2),
                        CardAcceptance.For(Cards.Duchy, gameState => CountOfPile(Cards.Province, gameState) < 5),
                        CardAcceptance.For(Cards.Estate, gameState => CountOfPile(Cards.Province, gameState) < 2),
                        CardAcceptance.For(Cards.Gold));

            var buildOrder = new CardPickByBuildOrder(
                CardAcceptance.For(Cards.Silver),
                CardAcceptance.For(Cards.Warehouse),
                CardAcceptance.For(Cards.Silver),
                CardAcceptance.For(Cards.Silver),
                CardAcceptance.For(Cards.Warehouse));

            var lowPriority = new CardPickByPriority(
                        CardAcceptance.For(Cards.Silver));

            return new CardPickConcatenator(highPriority, buildOrder, lowPriority);
        }
        private static ICardPicker PurchaseOrder()
        {
            var highPriority = new CardPickByPriority(
                    CardAcceptance.For(Cards.GreatHall, gameState => CardBeingPlayedIs(Cards.IronWorks, gameState)),
                    CardAcceptance.For(Cards.Province),
                    CardAcceptance.For(Cards.HuntingGrounds, gameState => CountAllOwned(Cards.Gold, gameState) >= 1 ),
                    CardAcceptance.For(Cards.Gold),
                    CardAcceptance.For(Cards.Pillage, gameState => CountAllOwned(Cards.Gold, gameState) == 0),
                    CardAcceptance.For(Cards.Duchy, gameState => CountOfPile(Cards.Province, gameState) <= 4));

            var buildOrder = new CardPickByBuildOrder(
                CardAcceptance.For(Cards.IronWorks),
                CardAcceptance.For(Cards.Silver));

            var lowPriority = new CardPickByPriority(
                    CardAcceptance.For(Cards.IronWorks, gameState => CountAllOwned(Cards.IronWorks, gameState) < 2),
                    CardAcceptance.For(Cards.Remodel),
                    CardAcceptance.For(Cards.Silver));

            return new CardPickConcatenator(highPriority, buildOrder, lowPriority);
        }
        private static ICardPicker PurchaseOrder()
        {
            var highPriority = new CardPickByPriority(
                        CardAcceptance.For(Cards.Province),
                        CardAcceptance.For(Cards.Duchy, gameState => CountOfPile(Cards.Province, gameState) <= 2),
                        CardAcceptance.For(Cards.Estate, gameState => CountOfPile(Cards.Province, gameState) <= 2),
                        CardAcceptance.For(Cards.Butcher, gameState => CountAllOwned(Cards.Butcher, gameState) < 2),
                        CardAcceptance.For(Cards.Estate, gameState => CountOfPile(Cards.Province, gameState) <= 3));

            var buildOrder = new CardPickByBuildOrder(
                CardAcceptance.For(Cards.Silver, gameState => CountAllOwned(Cards.Plaza, gameState) == 0),
                CardAcceptance.For(Cards.Watchtower),
                CardAcceptance.For(Cards.Plaza),
                CardAcceptance.For(Cards.Plaza),
                CardAcceptance.For(Cards.Watchtower)
                );

            var lowPriority = new CardPickByPriority(
                        CardAcceptance.For(Cards.Watchtower, gameState => CountAllOwned(Cards.Butcher, gameState) + CountAllOwned(Cards.Watchtower, gameState) < CountAllOwned(Cards.Plaza, gameState)),
                        CardAcceptance.For(Cards.Plaza),
                        CardAcceptance.For(Cards.Watchtower));

            return new CardPickConcatenator(highPriority, buildOrder, lowPriority);
        }