internal static string SearchFFU(string ProductType, string ProductCode, string OperatorCode, out string FoundProductType)
        {
            if (ProductType == "")
            {
                ProductType = null;
            }
            if (ProductCode == "")
            {
                ProductCode = null;
            }
            if (OperatorCode == "")
            {
                OperatorCode = null;
            }

            if (ProductCode != null)
            {
                ProductCode  = ProductCode.ToUpper();
                ProductType  = null;
                OperatorCode = null;
            }
            if (ProductType != null)
            {
                ProductType = ProductType.ToUpper();
                if (ProductType.StartsWith("RM") && !ProductType.StartsWith("RM-"))
                {
                    ProductType = "RM-" + ProductType.Substring(2);
                }
            }
            if (OperatorCode != null)
            {
                OperatorCode = OperatorCode.ToUpper();
            }

            DiscoveryQueryParameters DiscoveryQueryParams = new DiscoveryQueryParameters
            {
                manufacturerName            = "Microsoft",
                manufacturerProductLine     = "Lumia",
                packageType                 = "Firmware",
                packageClass                = "Public",
                manufacturerHardwareModel   = ProductType,
                manufacturerHardwareVariant = ProductCode,
                operatorName                = OperatorCode
            };
            DiscoveryParameters DiscoveryParams = new DiscoveryParameters
            {
                query = DiscoveryQueryParams
            };

            DataContractJsonSerializer Serializer1 = new DataContractJsonSerializer(typeof(DiscoveryParameters));
            MemoryStream JsonStream1 = new MemoryStream();

            Serializer1.WriteObject(JsonStream1, DiscoveryParams);
            JsonStream1.Seek(0L, SeekOrigin.Begin);
            string JsonContent = new StreamReader(JsonStream1).ReadToEnd();

            Uri RequestUri = new Uri("https://api.swrepository.com/rest-api/discovery/1/package");

            HttpClient HttpClient = new HttpClient();

            HttpClient.DefaultRequestHeaders.UserAgent.TryParseAdd("SoftwareRepository");
            HttpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

            Task <HttpResponseMessage> HttpPostTask = HttpClient.PostAsync(RequestUri, new StringContent(JsonContent, Encoding.UTF8, "application/json"));

            HttpPostTask.Wait();
            HttpResponseMessage Response = HttpPostTask.Result;

            string JsonResultString = "";

            if (Response.StatusCode == HttpStatusCode.OK)
            {
                Task <string> ReadResponseTask = Response.Content.ReadAsStringAsync();
                ReadResponseTask.Wait();
                JsonResultString = ReadResponseTask.Result;
            }

            SoftwarePackage Package = null;

            using (MemoryStream JsonStream2 = new MemoryStream(Encoding.UTF8.GetBytes(JsonResultString)))
            {
                DataContractJsonSerializer Serializer2      = new DataContractJsonSerializer(typeof(SoftwarePackages));
                SoftwarePackages           SoftwarePackages = (SoftwarePackages)Serializer2.ReadObject(JsonStream2);
                if (SoftwarePackages != null)
                {
                    Package = SoftwarePackages.softwarePackages.FirstOrDefault <SoftwarePackage>();
                }
            }

            if (Package == null)
            {
                throw new WPinternalsException("FFU not found");
            }

            FoundProductType = Package.manufacturerHardwareModel[0];

            SoftwareFile FileInfo = Package.files.Where(f => f.fileName.EndsWith(".ffu", StringComparison.OrdinalIgnoreCase)).First();

            Uri           FileInfoUri     = new Uri("https://api.swrepository.com/rest-api/discovery/fileurl/1/" + Package.id + "/" + FileInfo.fileName);
            Task <string> GetFileInfoTask = HttpClient.GetStringAsync(FileInfoUri);

            GetFileInfoTask.Wait();
            string FileInfoString = GetFileInfoTask.Result;

            string        FfuUrl  = "";
            FileUrlResult FileUrl = null;

            using (MemoryStream JsonStream3 = new MemoryStream(Encoding.UTF8.GetBytes(FileInfoString)))
            {
                DataContractJsonSerializer Serializer3 = new DataContractJsonSerializer(typeof(FileUrlResult));
                FileUrl = (FileUrlResult)Serializer3.ReadObject(JsonStream3);
                if (FileUrl != null)
                {
                    FfuUrl = FileUrl.url;
                }
            }

            HttpClient.Dispose();

            return(FfuUrl);
        }
        internal static string SearchENOSW(string ProductType, string PhoneFirmwareRevision)
        {
            if (ProductType == "")
            {
                ProductType = null;
            }

            if (ProductType != null)
            {
                ProductType = ProductType.ToUpper();
                if (ProductType.StartsWith("RM") && !ProductType.StartsWith("RM-"))
                {
                    ProductType = "RM-" + ProductType.Substring(2);
                }
            }

            DiscoveryQueryParameters DiscoveryQueryParams = new DiscoveryQueryParameters
            {
                manufacturerName          = "Microsoft",
                manufacturerProductLine   = "Lumia",
                packageType               = "Test Mode",
                packageClass              = "Public",
                manufacturerHardwareModel = ProductType
            };
            DiscoveryParameters DiscoveryParams = new DiscoveryParameters
            {
                query = DiscoveryQueryParams
            };

            DataContractJsonSerializer Serializer1 = new DataContractJsonSerializer(typeof(DiscoveryParameters));
            MemoryStream JsonStream1 = new MemoryStream();

            Serializer1.WriteObject(JsonStream1, DiscoveryParams);
            JsonStream1.Seek(0L, SeekOrigin.Begin);
            string JsonContent = new StreamReader(JsonStream1).ReadToEnd();

            Uri RequestUri = new Uri("https://api.swrepository.com/rest-api/discovery/1/package");

            HttpClient HttpClient = new HttpClient();

            HttpClient.DefaultRequestHeaders.UserAgent.TryParseAdd("SoftwareRepository");
            HttpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

            Task <HttpResponseMessage> HttpPostTask = HttpClient.PostAsync(RequestUri, new StringContent(JsonContent, Encoding.UTF8, "application/json"));

            HttpPostTask.Wait();
            HttpResponseMessage Response = HttpPostTask.Result;

            string JsonResultString = "";

            if (Response.StatusCode == HttpStatusCode.OK)
            {
                Task <string> ReadResponseTask = Response.Content.ReadAsStringAsync();
                ReadResponseTask.Wait();
                JsonResultString = ReadResponseTask.Result;
            }

            SoftwarePackage Package = null;

            using (MemoryStream JsonStream2 = new MemoryStream(Encoding.UTF8.GetBytes(JsonResultString)))
            {
                DataContractJsonSerializer Serializer2      = new DataContractJsonSerializer(typeof(SoftwarePackages));
                SoftwarePackages           SoftwarePackages = (SoftwarePackages)Serializer2.ReadObject(JsonStream2);
                if (SoftwarePackages != null)
                {
                    foreach (SoftwarePackage pkg in SoftwarePackages.softwarePackages)
                    {
                        Package = SoftwarePackages.softwarePackages.FirstOrDefault <SoftwarePackage>();
                    }
                }
            }

            if (Package == null)
            {
                throw new WPinternalsException("ENOSW package not found", "No ENOSW package has been found in the remote software repository for the requested model.");
            }

            SoftwareFile FileInfo = Package.files.Where(f => f.fileName.EndsWith(".secwim", StringComparison.OrdinalIgnoreCase)).First();

            SoftwareFile  DPLF       = Package.files.Where(f => f.fileName.EndsWith(".dpl", StringComparison.OrdinalIgnoreCase)).First();
            Uri           DPLUri     = new Uri("https://api.swrepository.com/rest-api/discovery/fileurl/1/" + Package.id + "/" + DPLF.fileName);
            Task <string> GetDPLTask = HttpClient.GetStringAsync(DPLUri);

            GetDPLTask.Wait();
            string DPLString = GetDPLTask.Result;

            string        DPLUrl     = "";
            FileUrlResult FileUrlDPL = null;

            using (MemoryStream JsonStream3 = new MemoryStream(Encoding.UTF8.GetBytes(DPLString)))
            {
                DataContractJsonSerializer Serializer3 = new DataContractJsonSerializer(typeof(FileUrlResult));
                FileUrlDPL = (FileUrlResult)Serializer3.ReadObject(JsonStream3);
                if (FileUrlDPL != null)
                {
                    DPLUrl = FileUrlDPL.url;
                }
            }

            if (DPLUrl == "")
            {
                throw new WPinternalsException("DPL not found", "No DPL has been found in the remote software repository for the requested model.");
            }

            Task <string> GetDPLStrTask = HttpClient.GetStringAsync(DPLUrl);

            GetDPLStrTask.Wait();
            string DPLStrString = GetDPLStrTask.Result;

            DPL.Package   dpl;
            XmlSerializer serializer = new XmlSerializer(typeof(DPL.Package));

            using (StringReader reader = new StringReader(DPLStrString.Replace("ft:", "").Replace("dpl:", "").Replace("typedes:", "")))
            {
                dpl = (DPL.Package)serializer.Deserialize(reader);
            }

            foreach (DPL.File file in dpl.Content.Files.File)
            {
                string name = file.Name;

                DPL.Range range = file.Extensions.MmosWimFile.UseCaseCompatibilities.Compatibility.FirstOrDefault().Range;

                if (IsFirmwareBetween(PhoneFirmwareRevision, range.From, range.To))
                {
                    FileInfo = Package.files.Where(f => f.fileName.EndsWith(name, StringComparison.OrdinalIgnoreCase)).First();
                }
            }

            Uri           FileInfoUri     = new Uri("https://api.swrepository.com/rest-api/discovery/fileurl/1/" + Package.id + "/" + FileInfo.fileName);
            Task <string> GetFileInfoTask = HttpClient.GetStringAsync(FileInfoUri);

            GetFileInfoTask.Wait();
            string FileInfoString = GetFileInfoTask.Result;

            string        ENOSWUrl = "";
            FileUrlResult FileUrl  = null;

            using (MemoryStream JsonStream3 = new MemoryStream(Encoding.UTF8.GetBytes(FileInfoString)))
            {
                DataContractJsonSerializer Serializer3 = new DataContractJsonSerializer(typeof(FileUrlResult));
                FileUrl = (FileUrlResult)Serializer3.ReadObject(JsonStream3);
                if (FileUrl != null)
                {
                    ENOSWUrl = FileUrl.url;
                }
            }

            HttpClient.Dispose();

            return(ENOSWUrl);
        }