/// <summary>
        /// Runs the code example.
        /// </summary>
        /// <param name="user">The AdWords user.</param>
        public void Run(AdWordsUser user)
        {
            // Get the BudgetService.
              BudgetService budgetService =
              (BudgetService) user.GetService(AdWordsService.v201309.BudgetService);

              // Get the CampaignService.
              CampaignService campaignService =
              (CampaignService) user.GetService(AdWordsService.v201309.CampaignService);

              // Create the campaign budget.
              Budget budget = new Budget();
              budget.name = "Interplanetary Cruise Budget #" + ExampleUtilities.GetRandomString();
              budget.period = BudgetBudgetPeriod.DAILY;
              budget.deliveryMethod = BudgetBudgetDeliveryMethod.STANDARD;
              budget.amount = new Money();
              budget.amount.microAmount = 500000;

              BudgetOperation budgetOperation = new BudgetOperation();
              budgetOperation.@operator = Operator.ADD;
              budgetOperation.operand = budget;

              try {
            BudgetReturnValue budgetRetval = budgetService.mutate(new BudgetOperation[] {budgetOperation});
            budget = budgetRetval.value[0];
              } catch (Exception ex) {
            throw new System.ApplicationException("Failed to add shared budget.", ex);
              }

              List<CampaignOperation> operations = new List<CampaignOperation>();

              for (int i = 0; i < NUM_ITEMS; i++) {
            // Create the campaign.
            Campaign campaign = new Campaign();
            campaign.name = "Interplanetary Cruise #" + ExampleUtilities.GetRandomString();
            campaign.status = CampaignStatus.PAUSED;

            BiddingStrategyConfiguration biddingConfig = new BiddingStrategyConfiguration();
            biddingConfig.biddingStrategyType = BiddingStrategyType.MANUAL_CPC;

            // Optional: provide BiddingScheme.
            ManualCpcBiddingScheme biddingScheme = new ManualCpcBiddingScheme();
            biddingScheme.enhancedCpcEnabled = true;
            biddingConfig.biddingScheme = biddingScheme;

            campaign.biddingStrategyConfiguration = biddingConfig;

            campaign.budget = new Budget();
            campaign.budget.budgetId = budget.budgetId;

            // Set the campaign network options.
            campaign.networkSetting = new NetworkSetting();
            campaign.networkSetting.targetGoogleSearch = true;
            campaign.networkSetting.targetSearchNetwork = true;
            campaign.networkSetting.targetContentNetwork = false;
            campaign.networkSetting.targetPartnerSearchNetwork = false;

            // Set the campaign settings for Advanced location options.
            GeoTargetTypeSetting geoSetting = new GeoTargetTypeSetting();
            geoSetting.positiveGeoTargetType = GeoTargetTypeSettingPositiveGeoTargetType.DONT_CARE;
            geoSetting.negativeGeoTargetType = GeoTargetTypeSettingNegativeGeoTargetType.DONT_CARE;

            // Set the campaign settings for near-exact and near-phrase matches.
            KeywordMatchSetting keywordSetting = new KeywordMatchSetting();
            keywordSetting.optIn = false;

            campaign.settings = new Setting[] {geoSetting, keywordSetting};

            // Optional: Set the start date.
            campaign.startDate = DateTime.Now.AddDays(1).ToString("yyyyMMdd");

            // Optional: Set the end date.
            campaign.endDate = DateTime.Now.AddYears(1).ToString("yyyyMMdd");

            // Optional: Set the campaign ad serving optimization status.
            campaign.adServingOptimizationStatus = AdServingOptimizationStatus.ROTATE;

            // Optional: Set the frequency cap.
            FrequencyCap frequencyCap = new FrequencyCap();
            frequencyCap.impressions = 5;
            frequencyCap.level = Level.ADGROUP;
            frequencyCap.timeUnit = TimeUnit.DAY;
            campaign.frequencyCap = frequencyCap;

            // Create the operation.
            CampaignOperation operation = new CampaignOperation();
            operation.@operator = Operator.ADD;
            operation.operand = campaign;

            operations.Add(operation);
              }

              try {
            // Add the campaign.
            CampaignReturnValue retVal = campaignService.mutate(operations.ToArray());

            // Display the results.
            if (retVal != null && retVal.value != null && retVal.value.Length > 0) {
              foreach (Campaign newCampaign in retVal.value) {
            Console.WriteLine("Campaign with name = '{0}' and id = '{1}' was added.",
                newCampaign.name, newCampaign.id);
              }
            } else {
              Console.WriteLine("No campaigns were added.");
            }
              } catch (Exception ex) {
            throw new System.ApplicationException("Failed to add campaigns.", ex);
              }
        }
        /// <summary>
        /// Runs the code example.
        /// </summary>
        /// <param name="user">The AdWords user.</param>
        /// <param name="campaignId">Id of the campaign to which ad groups are
        /// added.</param>
        public void Run(AdWordsUser user, long campaignId)
        {
            // Get the AdGroupService.
              AdGroupService adGroupService =
              (AdGroupService) user.GetService(AdWordsService.v201309.AdGroupService);

              List<AdGroupOperation> operations = new List<AdGroupOperation>();

              for (int i = 0; i < NUM_ITEMS; i++) {
            // Create the ad group.
            AdGroup adGroup = new AdGroup();
            adGroup.name = string.Format("Earth to Mars Cruises #{0}",
            ExampleUtilities.GetRandomString());
            adGroup.status = AdGroupStatus.ENABLED;
            adGroup.campaignId = campaignId;

            // Set the ad group bids.
            BiddingStrategyConfiguration biddingConfig = new BiddingStrategyConfiguration();

            CpmBid cpmBid = new CpmBid();
            cpmBid.bid = new Money();
            cpmBid.bid.microAmount = 10000000;

            biddingConfig.bids = new Bids[] {cpmBid};

            adGroup.biddingStrategyConfiguration = biddingConfig;

            // Optional: Set targeting restrictions.
            // These setting only affect serving for the Display Network.
            TargetingSetting targetingSetting = new TargetingSetting();

            TargetingSettingDetail placementDetail = new TargetingSettingDetail();
            placementDetail.criterionTypeGroup = CriterionTypeGroup.PLACEMENT;
            placementDetail.targetAll = true;

            TargetingSettingDetail verticalDetail = new TargetingSettingDetail();
            verticalDetail.criterionTypeGroup = CriterionTypeGroup.VERTICAL;
            verticalDetail.targetAll = false;

            targetingSetting.details = new TargetingSettingDetail[] {placementDetail, verticalDetail};

            adGroup.settings = new Setting[] {targetingSetting};

            // Create the operation.
            AdGroupOperation operation = new AdGroupOperation();
            operation.@operator = Operator.ADD;
            operation.operand = adGroup;

            operations.Add(operation);
              }

              try {
            // Create the ad group.
            AdGroupReturnValue retVal = adGroupService.mutate(operations.ToArray());

            // Display the results.
            if (retVal != null && retVal.value != null && retVal.value.Length > 0) {
              foreach (AdGroup newAdGroup in retVal.value) {
            Console.WriteLine("Ad group with id = '{0}' and name = '{1}' was created.",
                newAdGroup.id, newAdGroup.name);
              }
            } else {
              Console.WriteLine("No ad groups were created.");
            }
              } catch (Exception ex) {
            throw new System.ApplicationException("Failed to create ad groups.", ex);
              }
        }
        /// <summary>
        /// Creates the campaign with a shared bidding strategy.
        /// </summary>
        /// <param name="campaignService">The campaign service.</param>
        /// <param name="name">The campaign name.</param>
        /// <param name="biddingStrategyId">The bidding strategy id.</param>
        /// <param name="sharedBudgetId">The shared budget id.</param>
        /// <returns>The campaign object.</returns>
        private Campaign CreateCampaignWithBiddingStrategy(CampaignService campaignService, string name,
        long biddingStrategyId, long sharedBudgetId)
        {
            // Create campaign.
              Campaign campaign = new Campaign();
              campaign.name = name;

              // Set the budget.
              campaign.budget = new Budget();
              campaign.budget.budgetId = sharedBudgetId;

              // Set bidding strategy (required).
              BiddingStrategyConfiguration biddingStrategyConfiguration =
              new BiddingStrategyConfiguration();
              biddingStrategyConfiguration.biddingStrategyId = biddingStrategyId;

              campaign.biddingStrategyConfiguration = biddingStrategyConfiguration;

              // Set keyword matching setting (required).
              KeywordMatchSetting keywordMatchSetting = new KeywordMatchSetting();
              keywordMatchSetting.optIn = true;
              campaign.settings = new Setting[] {keywordMatchSetting};

              // Set network targeting (recommended).
              NetworkSetting networkSetting = new NetworkSetting();
              networkSetting.targetGoogleSearch = true;
              networkSetting.targetSearchNetwork = true;
              networkSetting.targetContentNetwork = true;
              campaign.networkSetting = networkSetting;

              // Create operation.
              CampaignOperation operation = new CampaignOperation();
              operation.operand = campaign;
              operation.@operator = Operator.ADD;

              return campaignService.mutate(new CampaignOperation[] {operation}).value[0];
        }
        /// <summary>
        /// Creates a test campaign for running further tests.
        /// </summary>
        /// <param name="user">The AdWords user.</param>
        /// <param name="biddingStrategy">The bidding strategy to be used.</param>
        /// <returns>The campaign id.</returns>
        public long CreateCampaign(AdWordsUser user, BiddingStrategyType strategyType)
        {
            CampaignService campaignService =
              (CampaignService) user.GetService(AdWordsService.v201309.CampaignService);

              BiddingStrategyConfiguration biddingConfig = new BiddingStrategyConfiguration();
              biddingConfig.biddingStrategyType = strategyType;

              CampaignOperation campaignOperation = new CampaignOperation();
              campaignOperation.@operator = Operator.ADD;
              campaignOperation.operand = new Campaign();
              campaignOperation.operand.name =
              string.Format("Campaign {0}", DateTime.Now.ToString("yyyy-M-d H:m:s.ffffff"));
              campaignOperation.operand.status = CampaignStatus.PAUSED;
              campaignOperation.operand.biddingStrategyConfiguration = biddingConfig;
              campaignOperation.operand.budget = new Budget();
              campaignOperation.operand.budget.period = BudgetBudgetPeriod.DAILY;
              campaignOperation.operand.budget.amount = new Money();
              campaignOperation.operand.budget.amount.microAmount = 100000000;
              campaignOperation.operand.budget.deliveryMethod = BudgetBudgetDeliveryMethod.STANDARD;
              KeywordMatchSetting matchSetting = new KeywordMatchSetting();
              matchSetting.optIn = true;
              campaignOperation.operand.settings = new Setting[] {matchSetting};

              CampaignReturnValue retVal =
              campaignService.mutate(new CampaignOperation[] {campaignOperation});
              return retVal.value[0].id;
        }
        /// <summary>
        /// Creates a test adgroup for running further tests.
        /// </summary>
        /// <param name="user">The AdWords user.</param>
        /// <param name="campaignId">The campaign id for which the adgroup is created.</param>
        /// <param name="isCpmBid">True, if a ManualCPM bid is to be used.</param>
        /// <returns>The adgroup id.</returns>
        public long CreateAdGroup(AdWordsUser user, long campaignId, bool isCpmBid)
        {
            AdGroupService adGroupService =
              (AdGroupService) user.GetService(AdWordsService.v201309.AdGroupService);

              AdGroupOperation adGroupOperation = new AdGroupOperation();
              adGroupOperation.@operator = Operator.ADD;
              adGroupOperation.operand = new AdGroup();
              adGroupOperation.operand.campaignId = campaignId;
              adGroupOperation.operand.name =
              string.Format("AdGroup {0}", DateTime.Now.ToString("yyyy-M-d H:m:s.ffffff"));
              adGroupOperation.operand.status = AdGroupStatus.ENABLED;

              if (isCpmBid) {
            BiddingStrategyConfiguration biddingConfig = new BiddingStrategyConfiguration();
            CpmBid cpmBid = new CpmBid();
            cpmBid.bid = new Money();
            cpmBid.bid.microAmount = 10000000;
            biddingConfig.bids = new Bids[] {cpmBid};
            adGroupOperation.operand.biddingStrategyConfiguration = biddingConfig;
              } else {
            BiddingStrategyConfiguration biddingConfig = new BiddingStrategyConfiguration();
            CpcBid cpcBid = new CpcBid();
            cpcBid.bid = new Money();
            cpcBid.bid.microAmount = 10000000;
            biddingConfig.bids = new Bids[] {cpcBid};
            adGroupOperation.operand.biddingStrategyConfiguration = biddingConfig;
              }
              AdGroupReturnValue retVal = adGroupService.mutate(new AdGroupOperation[] {adGroupOperation});
              return retVal.value[0].id;
        }
        /// <summary>
        /// Runs the code example.
        /// </summary>
        /// <param name="user">The AdWords user.</param>
        /// <param name="adGroupId">Id of the ad group that contains the keyword.
        /// </param>
        /// <param name="keywordId">Id of the keyword to be updated.</param>
        public void Run(AdWordsUser user, long adGroupId, long keywordId)
        {
            // Get the AdGroupCriterionService.
              AdGroupCriterionService adGroupCriterionService =
              (AdGroupCriterionService) user.GetService(AdWordsService.v201309.AdGroupCriterionService);

              // Since we are not updating any keyword-specific fields, it is enough to
              // create a criterion object.
              Criterion criterion = new Criterion();
              criterion.id = keywordId;

              // Create ad group criterion.
              BiddableAdGroupCriterion biddableAdGroupCriterion = new BiddableAdGroupCriterion();
              biddableAdGroupCriterion.adGroupId = adGroupId;
              biddableAdGroupCriterion.criterion = criterion;

              // Create the bids.
              BiddingStrategyConfiguration biddingConfig = new BiddingStrategyConfiguration();
              CpcBid cpcBid = new CpcBid();
              cpcBid.bid = new Money();
              cpcBid.bid.microAmount = 1000000;
              biddingConfig.bids = new Bids[] {cpcBid};

              biddableAdGroupCriterion.biddingStrategyConfiguration = biddingConfig;

              // Create the operation.
              AdGroupCriterionOperation operation = new AdGroupCriterionOperation();
              operation.@operator = Operator.SET;
              operation.operand = biddableAdGroupCriterion;

              try {
            // Update the keyword.
            AdGroupCriterionReturnValue retVal =
            adGroupCriterionService.mutate(new AdGroupCriterionOperation[] {operation});

            // Display the results.
            if (retVal != null && retVal.value != null && retVal.value.Length > 0) {
              AdGroupCriterion adGroupCriterion = retVal.value[0];
              long bidAmount = 0;
              foreach (Bids bids in (adGroupCriterion as BiddableAdGroupCriterion).
              biddingStrategyConfiguration.bids) {
            if (bids is CpcBid) {
              bidAmount = (bids as CpcBid).bid.microAmount;
              break;
            }
              }

              Console.WriteLine("Keyword with ad group id = '{0}', id = '{1}' was updated with " +
              "bid amount = '{2}' micros.", adGroupCriterion.adGroupId,
              adGroupCriterion.criterion.id, bidAmount);
            } else {
              Console.WriteLine("No keyword was updated.");
            }
              } catch (Exception ex) {
            throw new System.ApplicationException("Failed to update keyword.", ex);
              }
        }