From b319479defa69d2d93a1aa54438eceaf18d4a80b Mon Sep 17 00:00:00 2001 From: Alessandro Autiero Date: Tue, 4 Feb 2025 13:50:01 +0100 Subject: [PATCH] 10.0.6 --- archive/README.md | 8 -- archive/move.py | 66 ---------- archive/versions.txt | 85 ------------- common/lib/src/constant/game.dart | 3 +- common/lib/src/util/build.dart | 115 ++++++++++++++---- common/lib/src/util/dll.dart | 2 +- common/lib/src/util/process.dart | 6 +- gui/dependencies/dlls/cobalt.dll | Bin 0 -> 58880 bytes .../src/controller/backend_controller.dart | 1 - gui/lib/src/controller/dll_controller.dart | 13 +- .../src/widget/game/game_start_button.dart | 6 +- gui/lib/src/widget/message/version.dart | 36 +----- gui/lib/src/widget/page/settings_page.dart | 4 +- gui/pubspec.yaml | 2 +- 14 files changed, 112 insertions(+), 235 deletions(-) delete mode 100644 archive/README.md delete mode 100644 archive/move.py delete mode 100644 archive/versions.txt create mode 100644 gui/dependencies/dlls/cobalt.dll diff --git a/archive/README.md b/archive/README.md deleted file mode 100644 index 8991a13..0000000 --- a/archive/README.md +++ /dev/null @@ -1,8 +0,0 @@ -# Builds Archive - -Builds are stored on a Cloudflare R2 instance at `https://builds.rebootfn.org/versions.json`. -If you want to move them to another AWS-compatible object storage, run: -``` -python move.py -``` -and provide the required parameters. \ No newline at end of file diff --git a/archive/move.py b/archive/move.py deleted file mode 100644 index e3caf17..0000000 --- a/archive/move.py +++ /dev/null @@ -1,66 +0,0 @@ -import argparse -import os -import requests -import boto3 - -from concurrent.futures import ThreadPoolExecutor, as_completed -from urllib.parse import urlparse - -def upload_url_to_s3(s3_client, bucket_name, url, object_key): - response = requests.get(url, stream=True, verify=False, headers={"Cookie": "_c_t_c=1"}) - response.raise_for_status() - s3_client.upload_fileobj(response.raw, bucket_name, object_key) - return url, object_key - -def derive_key_from_url(url, prefix=None): - parsed = urlparse(url) - filename = os.path.basename(parsed.path) - if prefix: - return f"{prefix}/{filename}" - else: - return filename - -def main(): - parser = argparse.ArgumentParser(description="Upload multiple URLs from versions.txt to an S3 bucket concurrently.") - parser.add_argument('--bucket', required=True, help="Name of the S3 bucket.") - parser.add_argument('--concurrency', required=True, type=int, help="Number of concurrent uploads.") - parser.add_argument('--versions-file', default='versions.txt', help="File containing one URL per line.") - parser.add_argument('--access-key', required=True, help="AWS Access Key ID.") - parser.add_argument('--secret-key', required=True, help="AWS Secret Access Key.") - parser.add_argument('--endpoint-url', required=True, help="Custom endpoint URL for S3 or S3-compatible storage.") - args = parser.parse_args() - - bucket_name = args.bucket - concurrency = args.concurrency - versions_file = args.versions_file - access_key = args.access_key - secret_key = args.secret_key - endpoint_url = args.endpoint_url - - with open(versions_file, 'r') as f: - urls = [line.strip() for line in f if line.strip()] - - print(f"Uploading {len(urls)} files...") - s3_params = {} - if access_key and secret_key: - s3_params['aws_access_key_id'] = access_key - s3_params['aws_secret_access_key'] = secret_key - if endpoint_url: - s3_params['endpoint_url'] = endpoint_url - - s3 = boto3.client('s3', **s3_params) - - futures = [] - with ThreadPoolExecutor(max_workers=concurrency) as executor: - for url in urls: - object_key = derive_key_from_url(url) - futures.append(executor.submit(upload_url_to_s3, s3, bucket_name, url, object_key)) - for future in as_completed(futures): - try: - uploaded_url, uploaded_key = future.result() - print(f"Uploaded: {uploaded_url}") - except Exception as e: - print(f"Error uploading: {e}") - -if __name__ == "__main__": - main() diff --git a/archive/versions.txt b/archive/versions.txt deleted file mode 100644 index f092152..0000000 --- a/archive/versions.txt +++ /dev/null @@ -1,85 +0,0 @@ -https://builds.rebootfn.org/1.7.2.zip -https://builds.rebootfn.org/1.8.rar -https://builds.rebootfn.org/1.8.1.rar -https://builds.rebootfn.org/1.8.2.rar -https://builds.rebootfn.org/1.9.rar -https://builds.rebootfn.org/1.9.1.rar -https://builds.rebootfn.org/1.10.rar -https://builds.rebootfn.org/1.11.zip -https://builds.rebootfn.org/2.1.0.zip -https://builds.rebootfn.org/2.2.0.rar -https://builds.rebootfn.org/2.3.rar -https://builds.rebootfn.org/2.4.0.zip -https://builds.rebootfn.org/2.4.2.zip -https://builds.rebootfn.org/2.5.0.rar -https://builds.rebootfn.org/3.0.zip -https://builds.rebootfn.org/3.1.rar -https://builds.rebootfn.org/3.1.1.zip -https://builds.rebootfn.org/3.2.zip -https://builds.rebootfn.org/3.3.rar -https://builds.rebootfn.org/3.5.rar -https://builds.rebootfn.org/3.6.zip -https://builds.rebootfn.org/4.0.zip -https://builds.rebootfn.org/4.1.zip -https://builds.rebootfn.org/4.2.zip -https://builds.rebootfn.org/4.4.rar -https://builds.rebootfn.org/4.5.rar -https://builds.rebootfn.org/5.00.rar -https://builds.rebootfn.org/5.0.1.rar -https://builds.rebootfn.org/5.10.rar -https://builds.rebootfn.org/5.21.rar -https://builds.rebootfn.org/5.30.rar -https://builds.rebootfn.org/5.40.rar -https://builds.rebootfn.org/6.00.rar -https://builds.rebootfn.org/6.01.rar -https://builds.rebootfn.org/6.1.1.rar -https://builds.rebootfn.org/6.02.rar -https://builds.rebootfn.org/6.2.1.rar -https://builds.rebootfn.org/6.10.rar -https://builds.rebootfn.org/6.10.1.rar -https://builds.rebootfn.org/6.10.2.rar -https://builds.rebootfn.org/6.21.rar -https://builds.rebootfn.org/6.22.rar -https://builds.rebootfn.org/6.30.rar -https://builds.rebootfn.org/6.31.rar -https://builds.rebootfn.org/7.00.rar -https://builds.rebootfn.org/7.10.rar -https://builds.rebootfn.org/7.20.rar -https://builds.rebootfn.org/7.30.zip -https://builds.rebootfn.org/7.40.rar -https://builds.rebootfn.org/8.00.zip -https://builds.rebootfn.org/8.20.rar -https://builds.rebootfn.org/8.30.rar -https://builds.rebootfn.org/8.40.zip -https://builds.rebootfn.org/8.50.zip -https://builds.rebootfn.org/8.51.rar -https://builds.rebootfn.org/9.00.zip -https://builds.rebootfn.org/9.01.zip -https://builds.rebootfn.org/9.10.rar -https://builds.rebootfn.org/9.21.zip -https://builds.rebootfn.org/9.30.zip -https://builds.rebootfn.org/9.40.zip -https://builds.rebootfn.org/9.41.rar -https://builds.rebootfn.org/10.00.zip -https://builds.rebootfn.org/10.10.zip -https://builds.rebootfn.org/10.20.zip -https://builds.rebootfn.org/10.31.zip -https://builds.rebootfn.org/10.40.rar -https://builds.rebootfn.org/11.00.zip -https://builds.rebootfn.org/11.31.rar -https://builds.rebootfn.org/12.00.rar -https://builds.rebootfn.org/12.21.zip -https://builds.rebootfn.org/12.50.zip -https://builds.rebootfn.org/12.61.zip -https://builds.rebootfn.org/13.00.rar -https://builds.rebootfn.org/13.40.zip -https://builds.rebootfn.org/14.00.rar -https://builds.rebootfn.org/14.40.rar -https://builds.rebootfn.org/14.60.rar -https://builds.rebootfn.org/15.30.rar -https://builds.rebootfn.org/16.40.rar -https://builds.rebootfn.org/17.30.zip -https://builds.rebootfn.org/17.50.zip -https://builds.rebootfn.org/18.40.zip -https://builds.rebootfn.org/19.10.rar -https://builds.rebootfn.org/20.40.zip \ No newline at end of file diff --git a/common/lib/src/constant/game.dart b/common/lib/src/constant/game.dart index c84c875..9d4537d 100644 --- a/common/lib/src/constant/game.dart +++ b/common/lib/src/constant/game.dart @@ -22,4 +22,5 @@ const List kCannotConnectErrors = [ "UOnlineAccountCommon::ForceLogout" ]; const String kGameFinishedLine = "PlayersLeft: 1"; -const String kDisplayInitializedLine = "Display"; +const String kDisplayLine = "Display"; +const String kDisplayInitializedLine = "Initialized"; \ No newline at end of file diff --git a/common/lib/src/util/build.dart b/common/lib/src/util/build.dart index 544cf12..4db15c4 100644 --- a/common/lib/src/util/build.dart +++ b/common/lib/src/util/build.dart @@ -13,37 +13,99 @@ import 'package:http/http.dart' as http; const String kStopBuildDownloadSignal = "kill"; -final Uri _archiveSourceUrl = Uri.parse("https://builds.rebootfn.org/versions.json"); final int _ariaPort = 6800; final Uri _ariaEndpoint = Uri.parse('http://localhost:$_ariaPort/jsonrpc'); final Duration _ariaMaxSpawnTime = const Duration(seconds: 10); final String _ariaSecret = "RebootLauncher"; final RegExp _rarProgressRegex = RegExp("^((100)|(\\d{1,2}(.\\d*)?))%\$"); +final List downloadableBuilds = [ + FortniteBuild(version: Version.parse("1.7.2"), link: "https://public.simplyblk.xyz/1.7.2.zip", available: true), + FortniteBuild(version: Version.parse("1.8"), link: "https://public.simplyblk.xyz/1.8.rar", available: true), + FortniteBuild(version: Version.parse("1.8.1"), link: "https://public.simplyblk.xyz/1.8.1.rar", available: true), + FortniteBuild(version: Version.parse("1.8.2"), link: "https://public.simplyblk.xyz/1.8.2.rar", available: true), + FortniteBuild(version: Version.parse("1.9"), link: "https://public.simplyblk.xyz/1.9.rar", available: true), + FortniteBuild(version: Version.parse("1.9.1"), link: "https://public.simplyblk.xyz/1.9.1.rar", available: true), + FortniteBuild(version: Version.parse("1.10"), link: "https://public.simplyblk.xyz/1.10.rar", available: true), + FortniteBuild(version: Version.parse("1.11"), link: "https://public.simplyblk.xyz/1.11.zip", available: true), + FortniteBuild(version: Version.parse("2.1.0"), link: "https://public.simplyblk.xyz/2.1.0.zip", available: true), + FortniteBuild(version: Version.parse("2.2.0"), link: "https://public.simplyblk.xyz/2.2.0.rar", available: true), + FortniteBuild(version: Version.parse("2.3"), link: "https://public.simplyblk.xyz/2.3.rar", available: true), + FortniteBuild(version: Version.parse("2.4.0"), link: "https://public.simplyblk.xyz/2.4.0.zip", available: true), + FortniteBuild(version: Version.parse("2.4.2"), link: "https://public.simplyblk.xyz/2.4.2.zip", available: true), + FortniteBuild(version: Version.parse("2.5.0"), link: "https://public.simplyblk.xyz/2.5.0.rar", available: true), + FortniteBuild(version: Version.parse("3.0"), link: "https://public.simplyblk.xyz/3.0.zip", available: true), + FortniteBuild(version: Version.parse("3.1"), link: "https://public.simplyblk.xyz/3.1.rar", available: true), + FortniteBuild(version: Version.parse("3.1.1"), link: "https://public.simplyblk.xyz/3.1.1.zip", available: true), + FortniteBuild(version: Version.parse("3.2"), link: "https://public.simplyblk.xyz/3.2.zip", available: true), + FortniteBuild(version: Version.parse("3.3"), link: "https://public.simplyblk.xyz/3.3.rar", available: true), + FortniteBuild(version: Version.parse("3.5"), link: "https://public.simplyblk.xyz/3.5.rar", available: true), + FortniteBuild(version: Version.parse("3.6"), link: "https://public.simplyblk.xyz/3.6.zip", available: true), + FortniteBuild(version: Version.parse("4.0"), link: "https://public.simplyblk.xyz/4.0.zip", available: true), + FortniteBuild(version: Version.parse("4.1"), link: "https://public.simplyblk.xyz/4.1.zip", available: true), + FortniteBuild(version: Version.parse("4.2"), link: "https://public.simplyblk.xyz/4.2.zip", available: true), + FortniteBuild(version: Version.parse("4.4"), link: "https://public.simplyblk.xyz/4.4.rar", available: true), + FortniteBuild(version: Version.parse("4.5"), link: "https://public.simplyblk.xyz/4.5.rar", available: true), + FortniteBuild(version: Version.parse("5.00"), link: "https://public.simplyblk.xyz/5.00.rar", available: true), + FortniteBuild(version: Version.parse("5.0.1"), link: "https://public.simplyblk.xyz/5.0.1.rar", available: true), + FortniteBuild(version: Version.parse("5.10"), link: "https://public.simplyblk.xyz/5.10.rar", available: true), + FortniteBuild(version: Version.parse("5.21"), link: "https://public.simplyblk.xyz/5.21.rar", available: true), + FortniteBuild(version: Version.parse("5.30"), link: "https://public.simplyblk.xyz/5.30.rar", available: true), + FortniteBuild(version: Version.parse("5.40"), link: "https://public.simplyblk.xyz/5.40.rar", available: true), + FortniteBuild(version: Version.parse("6.00"), link: "https://public.simplyblk.xyz/6.00.rar", available: true), + FortniteBuild(version: Version.parse("6.01"), link: "https://public.simplyblk.xyz/6.01.rar", available: true), + FortniteBuild(version: Version.parse("6.1.1"), link: "https://public.simplyblk.xyz/6.1.1.rar", available: true), + FortniteBuild(version: Version.parse("6.02"), link: "https://public.simplyblk.xyz/6.02.rar", available: true), + FortniteBuild(version: Version.parse("6.2.1"), link: "https://public.simplyblk.xyz/6.2.1.rar", available: true), + FortniteBuild(version: Version.parse("6.10"), link: "https://public.simplyblk.xyz/6.10.rar", available: true), + FortniteBuild(version: Version.parse("6.10.1"), link: "https://public.simplyblk.xyz/6.10.1.rar", available: true), + FortniteBuild(version: Version.parse("6.10.2"), link: "https://public.simplyblk.xyz/6.10.2.rar", available: true), + FortniteBuild(version: Version.parse("6.21"), link: "https://public.simplyblk.xyz/6.21.rar", available: true), + FortniteBuild(version: Version.parse("6.22"), link: "https://public.simplyblk.xyz/6.22.rar", available: true), + FortniteBuild(version: Version.parse("6.30"), link: "https://public.simplyblk.xyz/6.30.rar", available: true), + FortniteBuild(version: Version.parse("6.31"), link: "https://public.simplyblk.xyz/6.31.rar", available: true), + FortniteBuild(version: Version.parse("7.00"), link: "https://public.simplyblk.xyz/7.00.rar", available: true), + FortniteBuild(version: Version.parse("7.10"), link: "https://public.simplyblk.xyz/7.10.rar", available: true), + FortniteBuild(version: Version.parse("7.20"), link: "https://public.simplyblk.xyz/7.20.rar", available: true), + FortniteBuild(version: Version.parse("7.30"), link: "https://public.simplyblk.xyz/7.30.zip", available: true), + FortniteBuild(version: Version.parse("7.40"), link: "https://public.simplyblk.xyz/7.40.rar", available: true), + FortniteBuild(version: Version.parse("8.00"), link: "https://public.simplyblk.xyz/8.00.zip", available: true), + FortniteBuild(version: Version.parse("8.20"), link: "https://public.simplyblk.xyz/8.20.rar", available: true), + FortniteBuild(version: Version.parse("8.30"), link: "https://public.simplyblk.xyz/8.30.rar", available: true), + FortniteBuild(version: Version.parse("8.40"), link: "https://public.simplyblk.xyz/8.40.zip", available: true), + FortniteBuild(version: Version.parse("8.50"), link: "https://public.simplyblk.xyz/8.50.zip", available: true), + FortniteBuild(version: Version.parse("8.51"), link: "https://public.simplyblk.xyz/8.51.rar", available: true), + FortniteBuild(version: Version.parse("9.00"), link: "https://public.simplyblk.xyz/9.00.zip", available: true), + FortniteBuild(version: Version.parse("9.01"), link: "https://public.simplyblk.xyz/9.01.zip", available: true), + FortniteBuild(version: Version.parse("9.10"), link: "https://public.simplyblk.xyz/9.10.rar", available: true), + FortniteBuild(version: Version.parse("9.21"), link: "https://public.simplyblk.xyz/9.21.zip", available: true), + FortniteBuild(version: Version.parse("9.30"), link: "https://public.simplyblk.xyz/9.30.zip", available: true), + FortniteBuild(version: Version.parse("9.40"), link: "https://public.simplyblk.xyz/9.40.zip", available: true), + FortniteBuild(version: Version.parse("9.41"), link: "https://public.simplyblk.xyz/9.41.rar", available: true), + FortniteBuild(version: Version.parse("10.00"), link: "https://public.simplyblk.xyz/10.00.zip", available: true), + FortniteBuild(version: Version.parse("10.10"), link: "https://public.simplyblk.xyz/10.10.zip", available: true), + FortniteBuild(version: Version.parse("10.20"), link: "https://public.simplyblk.xyz/10.20.zip", available: true), + FortniteBuild(version: Version.parse("10.31"), link: "https://public.simplyblk.xyz/10.31.zip", available: true), + FortniteBuild(version: Version.parse("10.40"), link: "https://public.simplyblk.xyz/10.40.rar", available: true), + FortniteBuild(version: Version.parse("11.00"), link: "https://public.simplyblk.xyz/11.00.zip", available: true), + FortniteBuild(version: Version.parse("11.31"), link: "https://public.simplyblk.xyz/11.31.rar", available: true), + FortniteBuild(version: Version.parse("12.00"), link: "https://public.simplyblk.xyz/12.00.rar", available: true), + FortniteBuild(version: Version.parse("12.21"), link: "https://public.simplyblk.xyz/12.21.zip", available: true), + FortniteBuild(version: Version.parse("12.50"), link: "https://public.simplyblk.xyz/12.50.zip", available: true), + FortniteBuild(version: Version.parse("12.61"), link: "https://public.simplyblk.xyz/12.61.zip", available: true), + FortniteBuild(version: Version.parse("13.00"), link: "https://public.simplyblk.xyz/13.00.rar", available: true), + FortniteBuild(version: Version.parse("13.40"), link: "https://public.simplyblk.xyz/13.40.zip", available: true), + FortniteBuild(version: Version.parse("14.00"), link: "https://public.simplyblk.xyz/14.00.rar", available: true), + FortniteBuild(version: Version.parse("14.40"), link: "https://public.simplyblk.xyz/14.40.rar", available: true), + FortniteBuild(version: Version.parse("14.60"), link: "https://public.simplyblk.xyz/14.60.rar", available: true), + FortniteBuild(version: Version.parse("15.30"), link: "https://public.simplyblk.xyz/15.30.rar", available: true), + FortniteBuild(version: Version.parse("16.40"), link: "https://public.simplyblk.xyz/16.40.rar", available: true), + FortniteBuild(version: Version.parse("17.30"), link: "https://public.simplyblk.xyz/17.30.zip", available: true), + FortniteBuild(version: Version.parse("17.50"), link: "https://public.simplyblk.xyz/17.50.zip", available: true), + FortniteBuild(version: Version.parse("18.40"), link: "https://public.simplyblk.xyz/18.40.zip", available: true), + FortniteBuild(version: Version.parse("19.10"), link: "https://public.simplyblk.xyz/19.10.rar", available: true), + FortniteBuild(version: Version.parse("20.40"), link: "https://public.simplyblk.xyz/20.40.zip", available: true), +]; -Future> fetchBuilds(ignored) async { - final response = await http.get(_archiveSourceUrl); - if (response.statusCode != 200) { - return []; - } - - return jsonDecode(response.body) - .map((entry) { - try { - final fileUrl = entry as String; - final fileName = Uri.parse(fileUrl).pathSegments.last; - final fileNameWithoutExtension = path.basenameWithoutExtension(fileName); - return FortniteBuild( - version: Version.parse(fileNameWithoutExtension), - link: entry, - available: true - ); - }catch(_) { - return null; - } - }) - .whereType() - .toList(); -} Future downloadArchiveBuild(FortniteBuildDownloadOptions options) async { final fileName = options.build.link.substring(options.build.link.lastIndexOf("/") + 1); @@ -150,7 +212,8 @@ Future _startAriaServer() async { "--rpc-allow-origin-all", "--rpc-secret=$_ariaSecret", "--rpc-listen-port=$_ariaPort", - "--file-allocation=none" + "--file-allocation=none", + "--check-certificate=false" ], window: false ); diff --git a/common/lib/src/util/dll.dart b/common/lib/src/util/dll.dart index 9a101db..bbfa5c6 100644 --- a/common/lib/src/util/dll.dart +++ b/common/lib/src/util/dll.dart @@ -25,7 +25,7 @@ Future downloadDependency(InjectableDll dll, String outputPath) async { case InjectableDll.console: name = "console.dll"; case InjectableDll.auth: - name = "starfall.dll"; + name = "cobalt.dll"; case InjectableDll.memoryLeak: name = "memory.dll"; case InjectableDll.gameServer: diff --git a/common/lib/src/util/process.dart b/common/lib/src/util/process.dart index d7e526a..714a0b4 100644 --- a/common/lib/src/util/process.dart +++ b/common/lib/src/util/process.dart @@ -264,17 +264,13 @@ void handleGameOutput({ }else if(line.contains(kGameFinishedLine) && host) { log("[FORTNITE_OUTPUT_HANDLER] Detected match end: $line"); onMatchEnd(); - }else if(line.contains(kDisplayInitializedLine) && host) { + }else if(line.contains(kDisplayLine) && line.contains(kDisplayInitializedLine) && host) { log("[FORTNITE_OUTPUT_HANDLER] Detected display attach: $line"); onDisplayAttached(); } } String _parseUsername(String username, bool host) { - if(host) { - return "Player${Random().nextInt(1000)}"; - } - if (username.isEmpty) { return kDefaultPlayerName; } diff --git a/gui/dependencies/dlls/cobalt.dll b/gui/dependencies/dlls/cobalt.dll new file mode 100644 index 0000000000000000000000000000000000000000..ae744d8d22ea8ea877faa8ac87591760c412d706 GIT binary patch literal 58880 zcmeFadwf*Y)jzyvG82YCm;o6KUf`&MMk6?ofWd&wq$dv)D{t|^M2Rf=gcJpFVFit zf4sl7rM6J(>QL<(sjjxArB#tu1*K59MQUo1$}d|gt!b?f&dSZrap|Pr z_m#c+Q2xw~#&dt*nT~v|IdBSPzMnGBw zwC`qw4j%6`Q9yAsW7!;(3YiDFBt(47tOf~D$Ow*2Cn3Dd-M?h)F^WkhMsj8SjIA6) z5&h#fu{h{Ee!^Ir0UIUk{}K9*Gpc89W^4fb9`7?t33e#RoOc7hh-GTK-VVh0M`EmI zR;a#Ksby@}On^X>&BAjFp0tk#RnHP=tZ^(d;&_PG!+6p@9^}kw6NtQx{m8W8*_MWc zsE5-FDy`vAo#S)>2JpD>7)pvLeLN|=`aA+SAOLFfo0Ld>JXCL}JyZt}moa3`@&1^? zp_qs0g@VnkKqQ$n$evM$58z4rco-{9Oa6Z{D#voa(ZSfDd@W=9@j-eArHl2nXQ>=H zB+2S)vbqa-Yq}V-UlEsMOKoy=oE(#F_KD_%^YIOg$!d=r*)3hwLu8U4S-spQ$E+Js zPTu&kY_HfgB0sv)WxImc5wqF}OZ`NSn$*|jNVhHFTn@sAdrV61PU=`$eNp>e6NM{X zZdvW6`l?6Ji&^(ZfDttj0XZ?_1W-tFL+!Ipq*{8tr0l@+5__-eMbz$0YQT>ilI57+ zC26}7iG&<;mSF%2z^~dtd4zl_L1+~De6N!VSzCEES?Q7*Q9gI{@+(C7F~^n%fBEQ_ z<;Y1m58Rs3R%*5k`R0*)J+f*&4@O2V+$~4TUB%R&=+&s-m0$RBbeYQqw(S#5a&)2` zMVCb{cl4IKTu^+-suxX9G}xz?Ba!IsTu{uyAIn)sh>lw>>9t3`O=xPLeLCwbUKE}y z$GjkfOiG~>;yeL*5)qPBC{M{!hf>^Y=IKb8%`#N%-A+9s$Cgpo_9dK;qA{Q$CDF%5 z%`!*L^~X4TpEm0(s+YLX>p)3j=(aGgr$<)(Xldbo?LX@XaiyyUD&t948At}AusR<> zzK~45teRBEhNEbDXSl|%`fPsHI)n06=M)4!bpsg>UrE0rHEfpWo0YM0WS0Z!@P`B( zC#$74Uz8)ss@JwbE@z;%T{IoyCVrg6Ph@v-&xWHGs^>cDCs|fceGIlzj;<#eEZj!% zlDCza4Gj=Jw3g(fj`Nc`?xddaZYK+taGt-OsP#C29R8!MqO@Kcr>R$Y|0+U4m4$H< z3uoh-1}r&3h!6CBv&$hz6=;rkg_pF)T^RSPA7WJbX?SAHM7==p=HZd>X&bKKxw@8iDQPceCj;!w)1%1FK9PX-6hY;>H*Hu3$RiB zvU*Tk1vu5$y>w{XuOEp_W28T$pwA>l5U^9v@esC1XQIkqoJYo)HvQq zwU^qfw==zs7hza_rkw9nF9rL(J~i840GmD8<}2w7EtCrmkcLUV0*saCz&@xgOUdUV z4-J%n55(1GSCyP zrqZCQ@Kmaw_|zkQ^&Q>jppM_hAql_w+dc#pg?}%H&PjzYd$(&OAgFjiD}@gRt2q@; z8;L6*$0`pdoFRB9o5_}#dBMFE&}SHpDqbexyo$2PCIsX<*@EIr$lOQE#|M(Y*ta{N zV9{mc{ZytZ;T(f9z$_M+t}1_YO}w|F41>e^{W>_B~R2L=L6zXZ^cMRC}(@OLn^>^cBhI=;YH9vMhPniEao*%kku(Vp?|mzIbBvO?)9sT z=u9DbbjYg1Us4hG+e`6Puxn_};ciR#44^@V;CrufBB8Yb4X~~LItCxC&mw8YH<*#K>^?p?rCM%#;$JZB^@u za8zjy@+A6EAV1w_kk#GM07`gJK$iI6SRu!@%EZTpLz~e8``K-M_Om;-W7fIv=U|u* zkQ!P2K#u*SpIWeSZ`c;|77SjV#aQI1Cp-Zft`WQHJv3G}9G#3=FFe@~f8r*ft1oC* zAaigU&^H{NggpDkEW~B?1PIfky^c0+mSYtjIdXHAL$;S8h6bVUDgqQK7E^Ala#%}z z0=w&w9rm*;x7i(SZo8wyBda%Wlhvv`Ir6C^bebHyY*^0PXUx^k&!Deb>^jEC*8h#T zk9<0TqkYKHCJ-p*{0E^m=x99xZ4_z;2yKy$_G5uIHFPQ}eUDR{Dya1lS{_GJZXmww zw><{I`eQ}YD`Sg4@E7#%glh%?yr><58w+F3ry>&m<|OAo0})c%eqdlUxa35SDBPnL z-lzR4SvcG`xCEu;g11p!!roOuiI}yWXmD9#$Q6^h0PtEJ=#c@GX&D4ytqu$ju!=D4 zXRmkF*w0p6ZT5WhMuYuUeB1N=E)SykCTM^|VfV^mf>94VJsOLMN#q2$xeikIk!kGI z+K!U4ALM;q(xU`rb$OK>IqC?_loN3FFqYJAdBag!=7pT_STaLt!$dMz{ z*9EoOYZ!w)jY2hgE2_wzY^w0s9a;8?6kOu4PppK}lqIdrCOEUp@8y*giAp-tDmi78 zO4g1^IImcX(WU(hquOuirJwXtC^%{K#(zWI4<;LM(XkCU9_>%VMEeJzJv0$RtQkI( zpDf7>iGKAUHz_q_Qtti+x*-2CS0{SXp8u4qje2y$ZqgA~G5!nRpm7_yAg1#}#qH6^|6PpLga-}0%?X$x0Us~}Qn zDT&foMd_8UMsgL}U=Rao4)!kHjv5Xox7Qw0F(@&8xoJcclcw!}Rb|@ApypTgd}O)d za$^YsoL^BSmV3@R$kJi5PsFzm3JG)N@JjZH9tmkT(lA?I57JOrUjXR<(ltoe$g$0x zpn+tYePZdb-4W%YNiwY0R(J(x@@Ov1l?~?#ym)2-+t{^;kkrf93ey^H}A)7*bzV)XV zcqF*|+y{6JvdgzV$fFQne(o;?6n4n^8v*rvXm{j3f%u0cN!9uoqET;^{Ru1KHblKE z?T=gk6VXlHYdo8-uZAHyp!H((k|9!;zn^Xz4txc%EP&$g*IviylsCR%-#CFATIXU^ zfUz;=dML=z6HsqzJv2fFJ8IBU?bYR9B!zonB7_uv%41v#KjTp@g{=ZgQg}o_xfFhl zxGsfXA}XXnxVjYXLljcj*AC!CGs z2SXZNcJdkW6lfn_K`l$zHx3ZP zBf2tnS&f$ah3&cz7D}}1KY5I|>lZxA+x05}rFK0gpwzA%i0bXyhA7(Q*>uBF-enU; zv`e4U(!1<<<2lkw4LVIUC=A!j`3(?<(k?;oX%!QxeW$+qpA;-SfI$0@>VoIt)()Oe zy?kdgq4#M=7a)u|fAcS7$8sMa)c4NA*PLQ(%W)SgcIx*iGkWzHY!XB`$(!wRWZ@l% zGJDq^e0#UMNusgkaNl1{I2RLba?yT~o`+`bOE}Ll^1ewWRM?IA6(`!eI(f=j4mV6L zaaJHu@(SZovtP}1BjJmAEppU41JNOyHg6Ic?Y^{43101e*O6}(&XFTCKgGVZWoQ=m zP+mt26yHFgV6W){IeMi{j#zgg?HIz=PURRl1$OPb80OosVNiJy%`tzu92LZV?AijZ zeCkyWpW2@1Q*V-d>brayU`#K3zst5Hz@_0Q#nY)&Tk^0c`{HuRPk>iAu=czK0|%%_cr6Jz*U{vLU+RUgU220cR*y8P`^Q zOgd08fI)bWTiIeU2;*PD%D##|->)glsHva;&Di)1sE?FLOs>(?0KqG`Fkq6nF!b3Z zz`2H4a#!#e7sgdQ%7sxQpd^f-fO0$9ggCdOdpuQSPU714507YyKJLCsQ^xV8JP3=UL?g;gc$sX;Q zO9?I{F_&@A{SO{PXF9Au=TVQO=01#A6t30dxdhuJ7wz%P6|BEb zerq(1^{>%+mtuvrUpsU;`sw#`$Ovv+O|9tD{sof=BlrwAf|Uc>U(NxFyAWRwalET_ zyypcTw}-JxO?#T~Y`}xz7$(EDZu+S*MYM0H->?qHr&E_2FVu(PD5SHlHHc{!J^4=!pGZzA;#-R$<%lC2U?7 zS7zlM_O_X2HD9q5?j6FOk=LVd4CVOdU)M`7Me1JOK=d=4RF zhz3%^y8!XpF2MD4@S>kQKHs;m>0io3_Lyxwq5? z$)Zol%QudpMr*%!1-03yVl;Y-xgd(asP&b+^`XXc+7a`sf5hgtzu=7uuwLzr44M?X zH}Z+ezHvY5_F)a>_p0&8K-PjRd)E$tyoci^?8R+NgvWA^m*#Lf+A8Q7Ivsgtd)Idf zf=wZjzmey6Q@)w{e0+Xo$vzVHUJ^EFLBa_Vc048QQ^xTe2s@#i;EPW47JLNZLD=Xu z2;0q(k1ylD@TP__^-o z_@X)G1$%)WD396@fH;=JH~<6@aS%c=q4%Oo`35M6d-MDyZ0-4xqX}ia_kut|$)=tU zpGhnw&DKJZ0%&=$ob|c9@vt&YF8R29YQh<=W2}4=w&)h)K&`CN ztM(4^V-9d$QTS)S>h={7zRzC%Z#j~X+9y6EK|ip8@&}nHYeUWQ2H1qeqV{=mtZ0#} z?vXcq&NqPUa_rKx`!uWeXCIg`&*pO<5$rUD$0lr?6(Agg7P z9L-1Ik)s%dWzeO=Wo;JPi!Q@i66HWEB?N(J{t))3${_Tmjid!Y@D;ouXFX4c9~@Dp z&IY0bBuvV=Xee(Obo5eeXY`)sFZjS0TZ|}nw$AWlpGH04L;G&I1oFS64X!1eU*{?= zU&wW6e8TxVNPEA~7?_YMG9Wc%mHDPKww!ykzyB$b$S|N{K0*ItkJGA#Vqy#(oqhY-KjSFUaRG=&ezSLH}|z^EK|Ko=Y`hKk|#( zdm0gc#fSFxmeF)bry9lq2X9SJ!a0doLE{aYgR>)yw-vB1QsH4bsqCfWdd!8`lY3o` zUJqr%x#jhFo3YL7EiRgd^TekK0Uv1hTlPC>(S%C@{0N1%l-tp093_4OD~(sRN8u=Y zHWf`D>>@1MuIaPmjBlNN#}p3G=D3H5XQ( zJO zG7b4Sp`%%XpU{zpV$ZTiyXu{C)-GpnjtHv1cVNRCI9GU({Ooct75S z3VnXWeiSEy?J;qr@|t?oU+1BtmJb^-uSL6T0?xB3ry{nAAQjQOY;<-3xpZnT(!NlP zj$547)JP0K3nHGwy(VSiPK_9fsZ>gP?IOxo=x`z;2or;7Xxi2yZ=#`JuO*xxVDFl* zHq~(n=P5{RrXvv5%+CQ;|3sPOizTxu5pZl4TEzXQd|AafJT6+s@ecgQ<;Iz~B&$t% zmDE#Y*!|E4sP-pv0k}`r z)$Uwf?d-Q>feuObX+5O~$!K#OPFKH)B$piRenL=(;Z+>2RQLF!?NEJeFW!WK`-1lC z04-Q7^Uwk`ZzgUbU~j?ng=2U+jp2!lK{Q&(9YfA-s{ILP0DZJy`{A3Uv_)?TrNs!Q z`z&F&tO=(byZDA8>!Cis`dzlP`4wK*JJ^UXd;`Xy&DXn!q@mv*@Fn(?7N0T)<6Sig zMOZ%@Czgp@a(pG9-(tn|i3TV9Dr_b9UHr4t)Wil2njqJCEs^zZ2U9F_;zI>E4s{1; z3{RI!_9!Povo4!u>J9*1${91E9wZ)QvL3{4S$Mb(v5uL zQ3{9`_#4^8oc-}-v#YSLj-5hh)=D5?C*K;YvJNeg6E6-yA2=3z$EW^5M=M9wzLGuR znZ|tykb^=WL+&x)fgHR;PbYqXhG*W2gZatN!_E^20EL!vS(o)7|_60Ug|Ccubzf^D0$ps&h?stD~_HCyg#b=S+eZ=f5fflcX{IH68giy)7Sc$WU?oZ6L zehI+0#JKTOhx%h}CLc}{Xbkn)?>LuA#Vla_a|jJ*p+|frN9=bvIe5X-Bm={ZI2)&q zFx)TNZ~qujt!ojoX!yKIII${N?{{In%V539tA^+FqEOm;f8<-ShMZbw=!^YwE zP+}8hIENAVO0=+*4%$!gtIs0TR$xgEls5?_cB#c*fSV|^EFtR)UnyWFf?m&m` z*V?g1wqN_~VA@L1GLTr*;o>VRA@>@OHbuUV44X2Lzp?I{Bf+f7VC7XtpnUsZDgd;(X3=b8{e9T=Fed_yi z0ZlZOSo3y&X6Bw=)|G~gHB(RXn<<=1<0aqe4cPd47$T&xiVCO zEYXc#wE`O_MGtxPamTOXRF)hO18!=i+DilOFYsCEnhv_mQdxin%K`0W?pfQZyWlTg z@s<4Fh16GbFyb-HekMn!`&CE)9VCWY^fDXza2lCYh=)vV^fCuJsu)X&tE*|0Exm#| zC>IUeuYLcOWH;&aUl48)?j>Org)xU& zQuD2H)Z!Yl$-NdAQaFRNxKOFF_NDPl*UQq&AGvj{UVi4t@;1oznDTTVCP{-=Lk9rB zOT$2G?Oc)SGDVK^@{Bd%q+rXz32GV~;DW+t!1@23A& zeFjZ7Z0$p$u(WIJR?#spdPX$exkpA>fPZ1MelazW^AY6kC%IZ%AuNkIf88%M*c1mLr`mCTeO68 z0k;lk>Z!J!VYF>0Z79*^fQL0$R0c?T^5<+ zhYNHD{bojvlGZP9F=eu>B1&pcGaHCe9imQMwUc8{=p07OvIMmYE)a)P&G z$R)>f72O4L(_J9gb-$}dYeysL+C)Cuf+=F*IT3^yevyTF6vGl!wb~KG7PW(d$U+;z z?Opd0zH0rHG&s`X00eUkK?Vr|+QssG*%49z;rIIhaT8=6R=Cz@IgSS-h*S{l0~xUp zwm^tIim#=OuV0c1sn+l5B!TLa<*4lNZm&UQJ87?!s>;_cET+ zSg(igaUgj+N6B4BK~zT9TNNI)200#X9DyDYxth|Ecny~`dRf|PhCFg0C@IlLT7vo| z(=9N=q=44}k)%l%fIJw{CV2!rsa>9-r$9Z?NtMv`9(2jzjL&s@Pz8Iy??Pr6g<{e& ziStF3vT#0`DGvaiwS07W$jC5{to9R4S^EJUd~;0}__JhaJ@Y`~2~rSGyIu+kOr_{{ z8^&Zi-KIz@b=+F0iNG%#f&V47aNa!HXLLlIRtp9+r$>DMX|z1>203Z3B-=z?Koh;b z%HiW(9KKu^=R(ESw8gY=2#r&29wlRtGU`Xk7@&+xM#aEMRmLR{xn@@MS^c&M|R8lP@(BHIiJCx!W76e;0B8UDP{&ZO(^Km&bp8+ z6k$*c`Klx;L((+(2!RY2ABB9O6SK}(4}8J3b*di6FeQ7XtmHJb)5r3Qz}!gV;o!I8)HN!Kz*auR*)&n;|O!&~A2_N!t;Ob&QabBA=^y4&BptmpSU!s_U`pMRg z83@51>;O}!|CY%%^cGL1OJ{^XmSq;^#2z+d1n}!s$|WPdj%P17L)76Mu9Sma*`r&FhVU5~ zS}SaoUJ~;o8@%{9CGDdPdYl`DC4*pU$kWEx_AH|IZ_H3eJ|iLX3L{7C;Y$rLA3ZvF zda9BXwa5`qs*g4XUVJ@m9oK8j#G6* z_$Gr`de!!DlB4vhr>AU5s_Mv*G>$UrPI6?;m1@3_OW5d~3<*>l&Gb6)wkg+}WTwo^ z1cFz%O<2Q*rXG`#Co(LB@u4w8_lq8kWc)x6{vZz57B50W!6&3^%?XKkzVPJGFpuuZ z!9BzdS|R_vHGXQ11}1mf@)OQoa6#c3QVYQnilH}f?hML9Pr&Qbz1j?aif;=97{B`S z0LC3TpjAxan1ps$ILdkejOpA3w99b#kIhybUUH8U zSzHR-*M>6=f8MBsE4`?lR;u=m!)dGu4rKc?X=@Lhyd^!!;}GJ@n$<=PnaxO6e7t6$ zr}WLyfVK(O2-2E?Ea7dF(n-7-L*+&_X$=`f6T$^XhTe!{)-_U!3dI7ct`z>ecwfLP ztzWD(XX{GiL7nMJ6T^uHJOo?9`6Oc4h3@7%t;TM_2>(8{wSxPc^gCzBKqf`=Xp=#B zs_e?#6m z?VApEV$>&`he{ZmZ{5>^T5`6()EY*~WPa3oEs~TmI3~TEPzn5s5zAg8PLV2#h;>{*dl#-G*A)WX z<)S8NFLGEHPl(QkC8V7236X^#tU*M{9=c^{J^HN$H|vtpg1PJBf}_3(&=MC}BqN5q zt;nLNQ3-N)xRKW8oJI_Exi<4mJ;czd5>~;!@mt8CmXnnhEx!pYP;N0(a0LSkXzlr7 zERU0IM6GckkJho=&|tt5eN=icuyzs~#1K4rS5#|Pjm@iP7#4+!M+*&oj=N91wHhHr||DO<=qgo*Vo-cs$m zLx}_oyLreuID`#b;BcX|mvSz(2cRe@t3Z1chEt^i+5yHMJ~cC|Pd}>Q(jVEZp~nnb zA=+Q&HLpFDx}2Qn$immIMWBosti$Aj%9kJ@_2~qZb~og;CcdqKNhaB3iWYD3;&>FD z%|*6Jz7TOY&%l)?shsxOvGc1HpUXSgjS@9Grx8t@qpQ!+jk;Xofm@6}VnQ&A2lVDp z72-`Kq)_?@$F>lf$1C-qc0x%up7$wfCnEivS?&FQ2t@}ZU0aF`Fc|0nOQeDLEwPXRwg2zyZIimyc_%u2sa|HWcK$R+K4N!wUpBDy1+w zp8hMHBmX6NJg#ANMfScuzM@$Ve2Tv|3D%Ae8{cU(a(o6eIuGb;2$+6 zoU_30e5(z#4C_sogyAgZ^4iE%<<60QIUOv6G=B5*xaUGX@e#-Q<*GNIM8PxVyo7Tz zesaQ-kq*4k5v%xAVOeC+NaQCk?QqGXoD!BPw^g+14$O^)(c&zJv?1td1wgd z57v?q>a||eNTp%f#?n@+YP}d~LVz2J7vwO-OSIgwDq}LfRObvyjuQ}hz?OG9KtrfQ zxn2*qRBm{Az19y_^Ew#z1NB()!Wr1nXFHK>bHLO++`PqG3I%wV?~6)&?Y1YYo0f^9RtM`GtEmvX{KK#rY#% z(E;@Zf;wZNi>EjimNO(q8){pP6XTYtsgX`)S}2jCg2@FnBvfW zhq13(UqNc{WMp7?aD$C{2u8w}hHz7gJBlJneIenTY#;GQ8KfFYg^nXMii9s=i&sh- z23P=2L(bFk^7VqyKZk*t2X2SfCW&B7qeD|fFueM;6LdWTWe+IF378^#&)=Xk;I}wM zL=DJ9q*$9jN}eF@z~%43Q%L<(>l;DQ;(XC!j1S)8jXZ9&6LxG790w{27z z5J@9<&mq%c@47&YyL)tM$CKX)9LquEJ zh=(lL3(#kSQ*Q0}JjELu0Oy$C63&yTvZN~GEmOQMvT|qWMP*5IzDG(zIl7gju>$EE z)H#b)0t3tjlGZMuJ#&)4s^YB}oGYwdTOA7HBW&A*$il@02wSyJ|BCC>*&lG7ya+HV zr7NK@fx5z7qBqS@)JCd2pRj9^Ca^~H>XpO8LM}If|5(K_RTarE2{x zMbOLK;1urH#!f*RZ})+*N$oG-^!_d)M@xk+L{gD&UdHzOaxeMNQB(0zh1Az-ey>8ae`*Ai!XGHTt8B%dOZ`vcf;1xGghm}k`W zTjWrO;Zj99#xuN9&v391ZX)Jbx8{fp*ujX0@(fs>fWi4p!E6F1r^Chz*h(-`9vLuW z7Q$8YE>|Z=M>;HU0+6v1#Fq^buO!}O2$v!B57nnIVY<%~By1p&19|dS-3-|%23q7O zRnaKP>QlRUVK@PLHCWRawbUeQsX>7nLPSW5+M;x(Ckv(*Aa4PP78MAh0So~Tv)@jK z*T{lA#0rOwR&gWS4X+#;63aE;jC~COn@zCUAV*|$-imaXgRF2=r-iqw#7EF0FW*%h z85k2eVhu0h#An2Tj#YjxsxOMfEyVcH`Kc^A^BGTh+?_8PIwh60uoFeYeKSZ8Y1D zj-Z7gxw=$<3U(sYULT)I@L8CS4^!$yy@0mzbuQua>9iLS&I+{20zTnui*814zREs6 zXix{ie7xyh2qisYZ;jF;r41;&4kD_^%4jA2)n6iLP} z3@vPvMVuyLCzWpn$)pQNIG`FIt7u17pS~(8mZ=aOs6tL2ypRxYI`Gp)F~gUp{NhBw zHi|nv`hE<2GGiMGY|*JWXb}VEOux4kBDu|FKsWMg{Uo&0UCsS zZ_(ZBvC-smEa|5)KN_UJl01d1Qo_j-cTK6^%ke`j`!n1Ok5RkDm89;`*XoftKXSkgUZeM5D=jY6 zZxc2cm3#7g`75tQ;Yi#(_(L#iRFSMy+>e1qa0urQs&3z@jWJXT+(4z$6p1(Qi`lbK z|9mNXG?0_*eR=;t^mO1)L*h&I!(bltzw&rEfK{#`bloTZA07{UjCmp*lj({g=|1iI z;U`bl^{`1a-$+B_k-Ei55e{?+MvQd2iiS&o8k8@_D3bYNK&Ez9zt~<7L3b}*V@ew( zL=l`}fNFQsbuxVn3QAvvp2u=rg8Y8ku>_CTe}X^HLZF+gfrT4S1N6#2O z!afN5Q;d0GTFU0&Wd<*NkMx=!lpa*=&>30ja&7>jpG&1 zDUl=f`cLvmg#{$2tTm`{i_)lCOsE34>*~u2W%~4%ZqD2*_d3jD?Fj5X*b1x0x!fg+T-X`>KdL=7q^cA zs;lZ4f5E`v{EUucHgLcg_Ay7L!+EYERhiL=KE!ODgK1NuA<1242@yUGc+g1_jwQ!+ zbMqF(`O%U1~*1sbP;wNG$+VF+QlGf|cppawrY9`|BCgK$E|*Oy zpkS=xr65PSf`qEiW-+H5cbceTkM>ur--niGWELhf_flqYMrL+0^I^(7IU{pyGV@!s zEs&`ZBaaU0mqw6*Bs_W%^*{_l#1b6KwD{z-cwSl@D~Ke%gU7K(!_oRUqK7>O{ANkt z7L3HPX>Z|vog}N{vDCyKxY*MWo-El~Tk6gwU+VMG0CYHcz=t&hziG=5BMrAN$p>1U z$5#;L^jhCz8=X3N1+f|;op$=;0IU&Q;wK*_Wir0a$~1gilze>Kl-Wbr;G*jfx-*$v$Qu9DX}^U{1? zWH$m2zgu=$OkfUySt+N$qFhgbP5jPda0?{DnW0k{+a@ew*1K$->qU6$EjS?ND`>-I z9%>iJPXM_ABXR?4@_O5o@386~KPgfc)N zyhC~KdSL53{5UDZmBu4mJAp}*p&w~BZM3dLn`H7Pd0U7MM1whlepVH>@5lw6gmXPk z0C8(%lzRjEn($q07o>b(ZvD7bm&t~pLuhG8+>CHLQ}!YKmux764(#=eC#z)`N^A&X zY8S3k7A%CYmBJJm&If)WuB(JLiQ4}K^KE*4e3POE){T@04VO&HBnr$*9tBy-^r5qb zR(gaFJcJ*%qvv})dEBn@v4<3QKgm?eh6OVz=aK0$D=ie@okpEtE5qDe9HV|BE9UtK zw&)h4xg5wXqb}j=o6{wnpGE`{#;DdMOpg5sbJu&9QN`1Tjxl#TlbKtPnV~H32~z!& zc2c(C&~_58YW-SM*w`SdHQaoP!GjV^`OV57N(*Nuy z@5gt))5Q9Bzq=;yWmD??r_cUf8T;&K2fE>E2kCsoSMpqV$Q$|7^kAS#dCP6Y{_$qyfvrNzC{c_JtEOKIY$_@b6Fg_h z6HXTYw&FW&8I@{}T#_60VGGP5cXvA)KE}U-2%CE3?!At|$H!8U z3EM{dwAqN`CzHy1=wrM{jo#F)WNYu?mg9bH?ho+`TRIEV5=aB-w4kh7X1J+iaNaUx z#V?hW$%XM@+5YR?Vm}!82fy)_--9b~AA?g~wnvm5qg^}(R%)vD5Yo88up1@>Bw9ZD;&{R|N8r})x= zR31N>$4p0WH^Vy)_5{k{QC;pM|vJF6G=EfM@Nvo zqD|NU{Vv%}Z;-(fSAq3{)T#$R91jeV(*cMZjiT+a;!6m&JAd#aWNK5u3pB;5eZWyu z?fgVf4-O+D`U$U&{pez#?|qWYh`qdLll5JswH$cm+FqdP5}2$#B@$zCR{3j0hyHda z#Har^AwjEi;Z_u7>TBWEc%Rz3Yqhz8!~BhJgz=9Va=$}_D^M295!XMY^jw}+W2>4mvwFoFlA(HI~_E;C<+r%XfP1*s+8T+8{bhsYi%|PAT z>GEd7eCyMJCoZ21XEP7) zfwDj0&BhPJJMsQD{Fr{S%UAM}lBZrg9&bRyEsIiHR=2+-9>O%dD}U&1^xwvpxu#5x z+~{IAlg{KoFS8Mfi2-C05WE#*TQ48qdDjp47=Y$x-NjVw*a8JWPADV>Hi7o z9me(NN!qmh_~6O$j}IpLNPBwr4?YWg&>qA*KyN70>xfz3r_&euXGEsMyG%+B|6fnq zt3-g_wZyf6XyP5_^CN#V!Og+^iU~YWE?)3o)<2f3=h@mLpb2yd z`M(hPD&_wI`MuVMFB1Qj%rhr}jyWA$w4Sa+c#(E55yWe?u{Wl`MefsRegPFIPIgvjet_Y4lr`&4z8E*F(5H zcYcERjida=_^r93um?rl)jjxysdX7Lw1+VBamh%Lg+~{I>G1j5@6a;sanRIeg5AiB zcK|2-x(d7&zU;XZFGND@@WGSch`ej!@5shG5$_jFtRp5ih!oux=%Z!V2WTkLHJ}^oFghDX<*} z;s3blK<81EfYihr;kJOGRMz*?vwrfhkrhdp!t+3M4mYUuBDoF7!@KvORoWifM#ulx z5)~^G44j1XE*wna{V>)@A}j1k);KGzM*fTBe}OwJ59;xD7$XgUz@>B2wTp}F7#dNrt3yAE>2yZJD1NkO>PCnZ4tR}X#* ztW$Z6uS))o!{>bJOZ>eQsjWmm?*aWrK`28R7vef~mJv-hgO+#@tEqs6JI z3@?)`+-twTT0H+4j^WZm}3zoA0XI+u*S8~Q_+*nigDKDk`AHkD&QMfyzTQR_8`4vhh9IU?I>@RY~o zPfLc^pGj|M{^%U)V}k*$>LwA0dO|} zPhxgt(Nkk0@8tFyfN@HDJII^*nZiX(keuXQexPy}QYA_gZktH1n=gXJX$#g@C|8dxw8&W+?wMy@A%Y7PQY zmV6rf^cs`MZb!8~&%jvIi)GhgF%Qox;cP%8;T(pYg<0A;*22jC@_(eWl2Aw#P_W`1 z7$3k30EP)_%nq_y&*PmhxsR8@UOb2tH3>Ta)}KI7*yJQ7rQcOrXHpu!kEbAN{kT+M zdJz8T<0Pp?6*h;5c@W{ zN9aeU1O$gGPXLDraau+@Xde9AD>TUiN#LFzZ}@MHfM{WY?rGyPPYuRe!a0+2(AN2K zq#oCHX~EFQH=VFCM`Cefm=my#61b>ELqSS7C!koOH8~Z2|?Fz`zjZ_UW!hzoH_foA~XEtskK0k*p7$so*YcM4QU{5^=myw#_ zJ+O!H3E-$5@yYq#U7zx?E!``@1V1L}~Hp0FZEf_WfXi91Cn@itXpW2eHAa6Sfy z70avH6!#zp@mQrK()pCGkO08yXh4z+5ihK8$c5eV4s-`Tpne7tg{i9Gn&B-Z*15z2 z2D2=G+>himN@9dw4N>P#tw16%<4)8J9g5|SMSAcc$uVZlMI1PKNb3SzT*4yS=F)Jl zh$3dtfo}(#i5!>oh(-q3JoSpxiO9kL0(w_R7WI90!r4J;5b41`fqXkODCQ%Yii8dt zWeY@E*NCzUj#C!HgMSh;u7#8mGtTATv-r20f6w9HMg03P+M1YA!{e*?_mBDaH~Dub z{|@o*yZJY*zY;S9{9+y#bQbe?2fnwNdN8ga2kyJTWHmbEXd61UL-#Fx>NntaeTer( zVu^++7UltKHh-+lqHVz>s8(294Tlf%AzE>A-23st@~n9I#xje772Jz>$()4V;Xo<?uu5pAn%1%#^56MR!C&IhQ=U5WXL24siUxp7buzv_iiXAT>IVKYB#;~ z-eBxb{0}ff9ef@;|LI^!dlHb%DLOQOL5m}wg5M4ZWNa4@ef%>(GR@?J_+z=XAJYC; zMVq=DQ(I+?cJ=#$lAH7Zy^pQC+_%n0bMbn$i}5bKKT-TEybbRRdc#^j*rNZO)ocA8 ziqVJG>J$fW`FM}oII*TQq^Q@oF|EF6vcBZMyuymfdt~HGmU(?O$@(r#tB>M(eLq4U z?iZZ=pYWYeDGgX0Ha)#Z53?T^`3v-Ls~-MY4_!}){02RISPu{BVG;ao`mEQ(=kzdVhk#e<;WzcL zPY*B9`N=c*)#bF)ke40`DmZ=_k$ymL|1b6Msht9Io*oADuu%_h)Wa@4{H7lMTo1SF zbd35W9d4w}PZ}{1&e78s>fz@j^8cx)v-SS@o}O0p@Jck-lg|+TU7R zU)fq8ZVt{XqVmWWNncAtD?sctQEqXlbbyA(r^rfm!nlV;6U>{KLJ@MZ3PmGx0@UY5J%0Cqka=vQ)QxSIRa<9?Dty@Niud1z=YMYx|>uO07j0OHYvudxaT~mubs-M*oR2XY*86A%b&TMb3Lx+xv&>n6JhHBRZ+gsNJ4f=(1 z=i)a8;xl{B`Lo>kBS52~v>9+CEGm|Y=Sy?Tq&Y>>B1xp?Wu(q85_xma=h=l)MVVCS z=J8UgV!l)~Un(w@$`Jvna>-o|I^s{{EH2h@7tfI@ic^_oRIF?<&rIV$famFD%IE44 z5I?^dOcS%5q1j*oxTsbnQHw}&=I00oIkR&F19PRa`O^7wB{yfYXtp$`l+!Mh%0Qu5 zDk}s9wirsXsk#kEb%!FuSW)X>yYFO`Ku&B6|N>+3_ONu^;$ zS{IboH8nR&t6Qbo#$avztXXI?2@%xFq`8nhdbV8hmZtg)EX=0tg2@!|-By|J*SWXD@&_p00j$9D|5FAnG!8(N)HSBv+%UVpWpu_Ec_1Y%P25qhFm~m-V!7GyW`Rjoa zF~4Z~d^9jyq$}2n@De=?%oOS2b47T$4sX-bSLo@h^{`G4S%JW3=ZLULhqvls*uVo% zw2C%9wAlUM_(*Y`pAp0dz9ZnndN?9m?8P1f{NDo{x_@*&HJ!gB2A|&*cs4zB=pk`d zRMJvUp&8E-Jb|C#`8GjPdDs+Tlkq%&yaz_)VLON&LE-Jl+dd)>+gBN%jPB}YZ0k=L zgO7CF58=nt^83@`ybx#@AM(2>?!iNJ(?3Lq^oBMjq+N{N`%|vl=_ou-c*bW-94~L) z0({_({2crb#`5oD?BFPQgnPWa&MnA9x#NAXjltsgr*gOG?X&41;@^X(CJl$Oh*#s2 zE(hX2{nM}0BUn0K9PLT}bi`AtoQ~%hfk(0=p6HW~NAex*V+OD@EpMd!q%Dvg>TsZa z+tTnxqeU>%6M5U$ZrBg>8K zC+Rr+b&Q~Aw1MbRUy$6lZlToZAL3a~lUI6qs*~tzTShNSQ0kY)wDO&h1Hp_B^)YQ# z_I&}LeR0P6xA3(HFf%^`DA#d+CM-Qg^tX(lP5Hz_2iiXJL+z8dq@Yx{!EbuM5kKjl zsuAgQeIYz!e2vtXba|xHA1M!`E-wGH_8R&@<2b$iNc|{AnJX&!e|7_GdhuVaA?CnQbT| z!I;Y%8M_1N=kfJjgiDr|FMVbGZ7+U$&5h-cy?6A?S9Xp6KDE8i!To+s!3c|NoDSVWb9rKD-E(taVYukf5XjWVODwL(qH2oo3C*irMY?&W>6HG#U zmJ;kxT=h+eG6}GL@F-wwS_n1_9z6&Rn9J>E?%UCRvjOX1HJA)uP2${8k0|!4A$!7U zs;^aQU2_S9`JR!hKFjT{Yrt|i4~?cioK?02*UHMggd+h4HVoKug1IyCt|VA-2F%CH zdNN@gPtJe^I9?zV#__5$V9PjO4PX-L68tUWc%6VTxT~{5)GqWX=Ei2Lk#>cU%iu>~ zFD40F+uE$Gp)~mdH83ustn0=bZ>(QMy8_#OuFD~$)VX|KUibD4*p{ihd>h5*=1ZFd4A4e#DLs=9EVn z`ytL4V{zCP1hYhy+|EKRM4H6XjeaG4;OY=+M;3GRFjhr;u4?CL*3a0=F-W)R zLQz>se%L!$-1u!Cd7 zEUyUhC6k9I4LI7So|VIMFhm2pUJ%e;pv{c0C@A7B@n8!a{23(dBLX0&mViA|z57LQ}+bezb}Y|LY)o93{| z1C!b&);Qeu0CX62u&s=(qB_PRaw4AWoEkTZTQ4N4H95azo#xqNEqlz!nmR3;+3P1T zI}SbV-x=3NGVp-JM3QyL?CwViKk)LG<7*`zGpFUTc-SLm@HF+DvFsEjkDXF~B0HsM z3OmI#nK^VmHUa%RpvB968;MD`FsIqPlig!B=dp!Z_?k^$Q}IHX+@c9A_t9)Fqc~8P z80Gd-xq0mDEb~e16EnVEq1X4}O;N0DO1*_m zS(e47;6<=g26R0+9pRK5z{dkVj!l^}Y1lC^AwIrsT#adxjZH#-PC|c9nloX5!|WuZ zF_00$Ipf-<>Uv1BX?zgR_4rzc$2@@qY&n-LFi+L>k#O!pR?W95e;zZ9&t~K2*oLzQ zENxinF_^r=n^#8A)#B(>$PGb=4F)-NKG@PkZY~VeYO<9uSo$5M*^2OF)U{b+z z9-i?z48=Sb#4*G??&4dBL#|zBizWL^Aebk1%6Bk!vvtC&EMVT6eaPa^$sZ4WVWu22 zjj@1fOconcnpI;)zn(TVn@#<*g-uX$AZPqQ1lDB_9vPHQW7(KUE%?P^4vf{vJlNti zTvKi~%bhcJc+7w`PLxlZY(XE62hAMjE@o^4o*#3XL=P*nW8jcS8lGvKm5p09X4u-F z)yDbEx3PTiGG(`wO{k}_Jb?{kdu<+!!68o9CU`|YLq0nuA9HIOKG(HfG+xYXyy+os zD?BJ_8f#)>Z$mi2#OSRerjyO=WRp{*OL1|D;P1d6h1fA9S>t7l(ZBrJ43SgF%b%{7 zH^SSHhD|zwLMp#YPp?8q_1&+BM!FQ~TocPZ9sJFt`cLHiZJ|CSI)IzGA0){?CUW)s2UIA_`4r6C-)^F<6grxNHoYjBzq~j-zd& z)5e_2SmwmoaRTO?GjV|AU1 z!1Hgt%mT!3!Q)C5l_eK9Dzp|TSmc?blwF8@oltcU_^V!Uok#yzd>v>{LEh) z5ZFq<`o9exx20f{cEYX!Z&MoHn}B&Rx#Xw8h5;Ku*{x|X=_%M=;N6=B^8gkAtS=3= z3b0PVM*IBVb95n<|9g%u^BF!STS3d zHV1=k%td)PlL`e}lx2+}96mAjFFISORf0zP1csxk6@2?WSYKfr#|ly*_9vsh%frDC z=8$WNqQACXsR)HyLySpjHGn1B^k*~DV4@Zu>ixcTX}G;D*ix@o{CmriV0(B?k`GfB zD2u$ZR@^l2K-+>=9HxzcJ!o3o9Byy)wcuzVTu0{tWwmvULH3%#sh5tQ8GF-6FUEld z^Ae>rzAvd*a%qLXaL%my=4Qq=nk&ILPWnq*JG^Z9(uyTU&UEXda7$fncy*&vojj{< z_p~eZ9?v(ta@CdWG4rCj*03T#g)0`hR@JsQ)m68Gyj+oxVp8WI#k=TI%p8C3RIMqd#+^cn}i{b!K;HL@?$XmXj#8e-iC)Nz(Wl?XSL=BmumlrZG#OTonW^q%eH+=1Gt^^m=7lRFU zGHgOabL+aV+YX{Y7Ng9%sH1&#Q2E*_D_9_1<0`wD=wRsox9RAr|68uLWH7#F#}YrJ zMHq-lrr2kocEi^nMTT(L;jBeXYgUC*1L!Mi2@$CBR+O%w%SX*Y&m0ep>YLN`^-D*T zp{cj0m-27rDg@g&SYhWgQ)hL%64; z&&}9BJRMLBk<`poT_1$FT5rJmeq>HvYa8b8GjzBT46SLxeSjcaz}Dby0p(ptG1xEK zK}BuVn62xY8ZehNa=!wzy$ScuIyx{Rx2{Wi3izj-2F)AVg4Ip9%w}*=-Q3g;YAec? zEWdP_ud)KIsh%y`lMWM*dIrvMhpm~-XQ0B5|Et?-sli~jx}}v<#x;o`E-|!l9?{Ru zxF*)frm{8s(ivlmSao}_vAUtDnF`V5p2w=|T3Z^LR^#eJbxSSg&~??dq19{ga}}z` zxWi{;1zXlOg<4zIz+=KjLk31`OR%F!sa9%NH3u2wRvikiMgvigp3?wVfnQKSzXUsi zbzvoFWQju4z)MJ}hS))fO+kuBz+(eBDQupok2;5)pNdxpS#4X>%r)&Z*EO}w1cjNn zN7Od6dG^fNGj;tKk&hOy4FWF>Wduej+@dt$&RZJBE0!fnb6IU0T@o=|ur~?j$2E~~ z+hVxtITV)(4!D}ehe)HNHCR~}pyUcEXPGGI$A+(``tL%8z-8()W3pq0T8J1xy4)hWUy z{fMATZ$J;OSq4#f+res(VyrbQd0!{E)Q>)v$#uSfkCaA?gAyKF(}tfgQfy7@T6Et3 z+YhMmPbYmFYy0P~mR@f7Ln2}PYKitKXpcdha_|UG8v7R<@-@CX?#{fYF>8@`1@2&0 z^Wh|XO-^kzyre(;C3u`3-RZ2xV67I;Y+8}y(pL<7;_Q9@kaI5MI9A3CNygjwJ zVgv^qGXwW4sN&J+Vw$Li6R$htoV`);7P+c@t?jEka*CWlJ`UY9ez7w60)D?HJ(^-5 z05MM<&)56{84%N>$-&_FOQ+2*DgTwGKw{$m#~<34TZ)Iy8#@v9;5mr6G*RpU{uy!F z3%nT*$3ghC9*-k@8P6f$3?Te?5@Y{FJpKHO&c!~$Q~X~d95WgFYKS`!&YOaLH^e;% zpT?$R2jXJOhB^ZXG*{N27QFV@cnh9W9ui>};tLR`@J=1R8R7kScv}$u70&~}8Af>K0ugs3{0^Q&fNw!)UMS)Y zgwrkrZ-7e(&sikmZiH*_5S=!JPwDYE!daz^{Q+<{!Yj)lPsHh+EgKgD5An?i2k^X! zIEBHBgwAY3I6;O?0Cyma=yA_wI7$nkO@O-*{uR%k5g$f))#Zr)9D0KA%%zMyMmPvJ z;UPWTjIbL|GvNIQ|M(5`CE^1J%~(sUN8Ew1>MESGB3^^=B|KDi0O2qmk{gBJszF}^ zXEVZ^YB3flj&LWur11|!_YhtVr(rVUH3%Qk^1>+ApAET3-HB6DLkaZDRkZ_aPkl?(c{YyUWbS1<99XezjXLk zghzBZg%j4pHh`uB;oW$iLY%^9Zw3r!FntKEw+I_WXZ$np@U|n2;PC*b3!%FcIEYhN zkB9iDaNY(nUWySuh^GoT`w7;Yu9dA50d#J3tYWBuE-gsfWR=@7)9xH#`vI@3pYgf7|)BVePd9UB= z*T=lq-OtKriNyCUlKnzHow6K|`9AWA%W|{KC&?#}k+vjr`+f;~*}hrgId|C}#$G6& zF*(`pGPlPl?Kt+_9#@%+ROIb9{;nK?fDe>gd|`4-l?bLW3T@z zneV^2ds)`>e_|T6SNCeJ&%BpRz3o3TtigDZG&FDD5(Mt0guz2M&P zCU75j1y;=J{(av;-Cua=Z3=G&D{w!!KhobE;aebl0M>6y#NVo=vAhEje-OMiybZi9 zydAtfyaViqcZ7F>cZPR?cZGL@cZUP;9`ImzPuSgceBSoo8{15L*c{V!{M>;5%4(pNH`211s@F`10M??2Okfg0FQ@HginG`h9|%i;Ysi* za0H$Vp9-G_pAMe^p9xQar^2o9GJ{z6`x5IPcdGLIk56*$l zg*)K$kly+51@O%^LGkN>-&*5Jn{x9KQ!56}v69+mecDd*O zi{Ojlh43ZtrSKy7GB^$|hA)S&fS15m!dJmd;V#t2GWcrv8u(iHI{13{1~>sPhi`;$ zf^UXzfp3LxgH^Og4c6f#es5rZNFh88XJ8ZQXW<-d;rDsuUqE;fF2O6{+u=LlJK?+F zyWxA_d*L#CANKG2QN9Nd|3Ua6_+j`FcqRNO{220o9N|wO{7LvJ_}BP-1>5&G@NePY z!M}%}hM$3-g;!yH{s2D*{}KKZ{5<>u{32Y1{|x^H{ww@9`0wyP;D5ra;g{f-;aA{S z;n(2T;WywK{3iSs{5Jd!{4V?+{64$}{s8_E{s{gU{sdkNe+t*(&*0DDFW@iXui$^d zU*q`V^4l5W_kw%Fo51#c@b=W@UQhIOo|^mCn|25H{J*#vtRTI9aDRAncnjn|0Qql; z{I+tv%I&`xi1Y@*Tf^JH+amw%kpK3`e+Sr)^mc@If_H{@LH@fU|J{(^?r;FTuRlQg-ks~+|9pQycY(b2Hw5_)b<6AJKMdt>MtO$A`@${oeklJ4qP@-@*Vtcs7TWjOxW1f&^0dQq;d!tO zr#X|10Xpk*4lF}!4dF7R)?gW4Yw-E745>AQ%P?7kz5W0%e;M*>2>1E}yl}5Sz_Scz zHN=-8tp>~RRf8{tJ5iq(q5dy+<9q!P3laYkw1-RKMet>C99|4x4qpK;fv<$Gf|t7G zk#SXLdv~EdEQ7CxuYs?HuY<3LZ-5ii<6Y ze)s|SLHHr~VfYbvCHCh>;m2CK8=%)d9!LE>;kHk?f5F+Go^&nuHaK3VKLE#hoRrJ@|cijhmj_C)8;- zj1SO0K6Jz7J|8FiBiC}TkK>P#-Y4){H@@5t&_(9cxec!)5{h$iHv9PFt?)NhJ<<`2!0C|6he9`?$b+kM zXSB-uwcAEFEokd#I^^I1{YSNSbhNcko3kJw3C!&n-6RiRjqH#IuG?EXhP2O~e(t=E zc{9%&BCnwx+1k-Q^n&3{0eSRh_Dp#W&3$2dcW!o4!@RTv-?5HA=&!oueKS%4tM!_` zMz8C>LER>NA##3)8l$VH}$e! z(W_E|x~?Ssvi6~5I2lPsld)txnMj(+aR3R45frMN-jJEEP{BQf8{0s-&u^TB@E>(*ATX9ZHAOk#sa2OUKiRw3#la zE9q*wmaeCjj6W01gfihwBoocVGVx3zV`j>kN~W5rW$GEl^qWC5WQNU%88u^O+)S9J zSvD(X)vTFyQ_1?X!E7iS&PKA)Y%CkkCbDL>oULT5*;=-qRdW7ZFc->&bCFy$7t6(S ziJX}$=PJ2su9mCk6w7Y~WebI6>qKSC#AU0PvPCLZ)v8%_OUe85!F))zP9z`A$MW%f zB5&r)`AWVjTdST|3jRW{5GsTVkwUZ(E5r+lf>|gRDursHR;U-0qQ4j{hKk{0q!=y6 zit%EiXco)GO0in373)Q%= 20 ? rebootAboveS20DllFile : rebootBeforeS20DllFile, false); @@ -171,7 +170,7 @@ class DllController extends GetxController { case InjectableDll.auth: return backendDll; case InjectableDll.gameServer: - return gameServerDll; + return customGameServerDll; case InjectableDll.memoryLeak: return memoryLeakDll; } @@ -182,7 +181,7 @@ class DllController extends GetxController { case InjectableDll.console: return "${dllsDirectory.path}\\console.dll"; case InjectableDll.auth: - return "${dllsDirectory.path}\\starfall.dll"; + return "${dllsDirectory.path}\\cobalt.dll"; case InjectableDll.gameServer: return "${dllsDirectory.path}\\reboot.dll"; case InjectableDll.memoryLeak: diff --git a/gui/lib/src/widget/game/game_start_button.dart b/gui/lib/src/widget/game/game_start_button.dart index c7da027..18c1a0e 100644 --- a/gui/lib/src/widget/game/game_start_button.dart +++ b/gui/lib/src/widget/game/game_start_button.dart @@ -250,7 +250,7 @@ class _LaunchButtonState extends State { log("[${host ? 'HOST' : 'GAME'}] Generating instance args..."); final gameArgs = createRebootArgs( host ? _hostingController.accountUsername.text : _gameController.username.text, - host ? _hostingController.accountPassword.text :_gameController.password.text, + host ? _hostingController.accountPassword.text : _gameController.password.text, host, hostType, false, @@ -495,6 +495,7 @@ class _LaunchButtonState extends State { const Duration(days: 1) ); this._pingOperation = pingOperation; + _gameServerInfoBar?.close(); _gameServerInfoBar = showRebootInfoBar( translations.checkGameServerFixMessage(gameServerPort), action: Button( @@ -508,8 +509,9 @@ class _LaunchButtonState extends State { final result = await pingOperation.future; _gameServerInfoBar?.close(); return result; - }finally { + }catch(_) { _gameServerInfoBar?.close(); + return false; } } diff --git a/gui/lib/src/widget/message/version.dart b/gui/lib/src/widget/message/version.dart index 26334e0..69262fb 100644 --- a/gui/lib/src/widget/message/version.dart +++ b/gui/lib/src/widget/message/version.dart @@ -35,18 +35,12 @@ class _AddVersionDialogState extends State { final Rxn _progress = Rxn(); final RxInt _speed = RxInt(0); - late Future> _fetchFuture; - SendPort? _downloadPort; Object? _error; StackTrace? _stackTrace; @override void initState() { - _fetchFuture = compute(fetchBuilds, null).then((value) { - _updateFormDefaults(); - return value; - }); super.initState(); } @@ -60,6 +54,7 @@ class _AddVersionDialogState extends State { void _cancelDownload() { _downloadPort?.send(kStopBuildDownloadSignal); WindowsTaskbar.setProgressMode(TaskbarProgressMode.noProgress); + stopDownloadServer(); } @override @@ -68,28 +63,10 @@ class _AddVersionDialogState extends State { child: Obx(() { switch(_status.value){ case _DownloadStatus.form: - return FutureBuilder( - future: _fetchFuture, - builder: (context, snapshot) { - if (snapshot.hasError) { - WidgetsBinding.instance.addPostFrameCallback((_) => _onDownloadError(snapshot.error, snapshot.stackTrace)); - } - - final data = snapshot.data; - if (data == null) { - return ProgressDialog( - text: translations.fetchingBuilds, - showButton: widget.closable, - onStop: () => Navigator.of(context).pop() - ); - } - - return Obx(() => FormDialog( - content: _buildFormBody(data), - buttons: _formButtons - )); - } - ); + return Obx(() => FormDialog( + content: _buildFormBody(downloadableBuilds), + buttons: _formButtons + )); case _DownloadStatus.downloading: case _DownloadStatus.extracting: return GenericDialog( @@ -256,7 +233,7 @@ class _AddVersionDialogState extends State { style: FluentTheme.maybeOf(context)?.typography.body, ), - if(timeLeft != null) + if(timeLeft != null && timeLeft != -1) Text( translations.timeLeft(timeLeft), style: FluentTheme.maybeOf(context)?.typography.body, @@ -450,7 +427,6 @@ class _AddVersionDialogState extends State { return; } - print("${bestDisk.path}\\FortniteBuilds\\${build.version}"); final pathText = "${bestDisk.path}FortniteBuilds\\${build.version}"; _pathController.text = pathText; _pathController.selection = TextSelection.collapsed(offset: pathText.length); diff --git a/gui/lib/src/widget/page/settings_page.dart b/gui/lib/src/widget/page/settings_page.dart index 69d302a..14e68e6 100644 --- a/gui/lib/src/widget/page/settings_page.dart +++ b/gui/lib/src/widget/page/settings_page.dart @@ -184,10 +184,10 @@ class _SettingsPageState extends RebootPageState { return createFileSetting( title: translations.settingsOldServerFileName, description: translations.settingsServerFileDescription, - controller: _dllController.gameServerDll, + controller: _dllController.customGameServerDll, onReset: () { final path = _dllController.getDefaultDllPath(InjectableDll.gameServer); - _dllController.gameServerDll.text = path; + _dllController.customGameServerDll.text = path; _dllController.download(InjectableDll.gameServer, path); } ); diff --git a/gui/pubspec.yaml b/gui/pubspec.yaml index be082f9..2462172 100644 --- a/gui/pubspec.yaml +++ b/gui/pubspec.yaml @@ -1,6 +1,6 @@ name: reboot_launcher description: Graphical User Interface for Project Reboot -version: "10.0.5" +version: "10.0.6" publish_to: 'none'