static void Main(string[] args)
        {
            List <PhoneAcc> accounts = new List <PhoneAcc>(); // List for storing the final accounts to be displayed
            IDList          idList   = new IDList();          // Class for storing ID list retrieved from the web service

            // Start timing
            Stopwatch stopWatch = new Stopwatch();

            stopWatch.Start();

            // Retrieve the list of account IDs from the web service
            idList = getIDListFromWeb(null);

            if (env == (int)Env.Debugging)
            {
                Console.WriteLine("Retrieved ID list: " + idList.ToString());
            }

            // Process the retrieved accounts and store valid accounts
            processPhoneAcc(idList, ref accounts, numRes);

            // While the retrieved list has a token for retrieving even more phone accounts
            // Keep retrieving and processing accounts
            while (!String.IsNullOrEmpty(idList.token))
            {
                // Retrieve the list of account IDs from the web service
                idList = getIDListFromWeb(idList.token);

                if (env == (int)Env.Debugging)
                {
                    Console.WriteLine("Retrieved ID list: " + idList.ToString());
                }

                // Process the retrieved accounts and store valid accounts
                processPhoneAcc(idList, ref accounts, numRes);
            }

            // Sort the collected accounts based on name
            AccNameCompare nameCompare = new AccNameCompare();

            accounts.Sort(nameCompare);

            // Stop timing
            stopWatch.Stop();

            long time = stopWatch.ElapsedMilliseconds;

            // Print out the result
            Console.WriteLine();
            Console.WriteLine("Time elapsed: {0} ms", time);
            Console.WriteLine();
            Console.WriteLine(accounts.Count + " results sorted by name: ");
            for (int i = 0; i < accounts.Count; i++)
            {
                Console.WriteLine(accounts[i].ToString());
            }


            // Wait for return key to pause the console
            Console.ReadLine();
        } // end of Main()
        /// <summary>
        /// Process phone accounts retrieved from web service
        /// Store phone accounts with valid US phone numbers and youngest age to the account list
        /// </summary>
        /// <param name="idList">The list of account IDs retrieved from web service</param>
        /// <param name="accounts">The list of phone accounts to collect</param>
        /// <param name="numRes">The number of account to collect</param>
        private static void processPhoneAcc(IDList idList, ref List <PhoneAcc> accounts, int numRes)
        {
            // Iterate through all the retrieved IDs
            // Using each ID, retrieve the account from the web service
            // Add [numRes] accounts with valid number to the account list
            // If the number of accounts retrieved from web service is less than [numRes]
            // Add all the retrieved accounts with valid number
            int maxAgeIndex = 0; // track the ID of the account the max age among the collecte accounts

            for (int i = 0; i < idList.result.Count; i++)
            {
                string json = null;

                using (WebClient webClient = new WebClient())
                {
                    // Retrieve the account using ID
                    try
                    {
                        // URL: endpoint + detail route + retrieved id of account
                        json = webClient.DownloadString(ENDPOINT_URL + DETAIL_ROUTE + idList.result[i]);
                    }
                    catch (Exception e)
                    {
                        Console.WriteLine(e);
                    }
                }

                PhoneAcc acc = JsonConvert.DeserializeObject <PhoneAcc>(json);

                if (env == (int)Env.Debugging)
                {
                    Console.WriteLine("Retrieved account: " + acc.ToString());
                }

                if (acc.hasValidNumber())
                {
                    // If not enough results have been collected
                    if (accounts.Count < numRes)
                    {
                        if (env == (int)Env.Debugging)
                        {
                            Console.WriteLine("Adding account with ID: " + acc.id);
                        }
                        accounts.Add(acc);

                        // Update the index of the account with max age
                        if (acc.age >= accounts[maxAgeIndex].age)
                        {
                            // The index of the new acc is count - 1
                            maxAgeIndex = accounts.Count - 1;
                        }
                    }
                    // If enough results have been collected
                    else
                    {
                        // Compare the retrieved acc to the collected acc with max age
                        if (acc.age < accounts[maxAgeIndex].age)
                        {
                            if (env == (int)Env.Debugging)
                            {
                                Console.WriteLine("Replacing account " + accounts[maxAgeIndex].id + " with account " + acc.id);
                            }
                            // Replace the acc with max age with the retrieved acc
                            accounts[maxAgeIndex] = acc;

                            // Update the index of the account with max age
                            maxAgeIndex = getMaxAgeIndex(accounts);
                        }
                    }
                }
            }
        }