public async static Task <byte[]> ZlibDecompressAsync(this ReadOnlyMemory <byte> bytesToDecompress)
        {
            using var inputStream = new MemoryStream();
            await inputStream.WriteAsync(bytesToDecompress);

            using var outputStream        = new MemoryStream();
            inputStream.Position          = 0;
            using var decompressionStream = new InflaterInputStream(inputStream);
            await decompressionStream.CopyToAsync(outputStream);

            return(outputStream.ToArray());
        }
        private async Task DownloadGroup(IEnumerable <ManifestFile> group, Dictionary <string, PackageFile> manifest)
        {
            foreach (var mFile in group)
            {
                var ext = mFile.MetaData.Type > FileType.NORMAL_FILE ? ".compressed" : "";
                var url = $"/projects/{project}/releases/{mFile.MetaData.Version}/files/{mFile.FullName.Replace('\\', '/')}{ext}";

                PackageFile pFile;
                if (!manifest.TryGetValue(url, out pFile))
                {
                    throw new Exception("404");
                }

                var binUrl = $"projects/{project}/releases/{version}/packages/files/{pFile.BinName}";
                while (true)
                {
                    var req = WebRequest.CreateHttp(new Uri(region.UpdateBase, binUrl));
                    req.AddRange(pFile.Offset, pFile.Offset + pFile.Length - 1);
                    try {
                        using (var res = await req.GetResponseAsync())
                            using (var src = res.GetResponseStream()) {
                                using (var save = this.GetStream(mFile, true)) {
                                    long start = save.Position;

                                    if (mFile.MetaData.Type > FileType.NORMAL_FILE && mFile.MetaData.Type != FileType.COMPRESSED_ARCHIVE)
                                    {
                                        using (var wrap = new InflaterInputStream(src))
                                            await wrap.CopyToAsync(save);
                                    }
                                    else
                                    {
                                        await src.CopyToAsync(save);
                                    }

                                    if (save.Position - start != mFile.CompletedSize)
                                    {
                                        throw new Exception("File not properly downloaded: " + mFile.FullName);
                                    }
                                }
                            }
                        break;
                    } catch (ZipException) {
                    } catch (IOException) { }
                }

                Interlocked.Add(ref patchingDone, mFile.CompletedSize);
            }
        }