From acf387418598e1ac521ac6be533f1bc0c3cf4cfe Mon Sep 17 00:00:00 2001 From: Rob Greene Date: Mon, 3 Jan 2022 18:24:39 -0600 Subject: [PATCH 1/2] Merging in 'acx' tool, merging gradle builds --- app/ac-acx/README.md | 150 ++++++++ app/ac-acx/build.gradle | 36 ++ app/ac-acx/gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 59536 bytes .../gradle/wrapper/gradle-wrapper.properties | 5 + .../io/github/applecommander/acx/Main.java | 101 ++++++ .../acx/PrintExceptionMessageHandler.java | 25 ++ .../github/applecommander/acx/SystemType.java | 96 +++++ .../applecommander/acx/VersionProvider.java | 17 + .../base/ReadOnlyDiskImageCommandOptions.java | 12 + .../acx/base/ReadWriteDiskCommandOptions.java | 14 + .../ReadWriteDiskCommandWithGlobOptions.java | 38 ++ .../acx/base/ReusableCommandOptions.java | 41 +++ .../acx/command/ConvertCommand.java | 39 +++ .../acx/command/CopyFileCommand.java | 75 ++++ .../acx/command/CreateDiskCommand.java | 79 +++++ .../acx/command/DeleteCommand.java | 31 ++ .../acx/command/DiskMapCommand.java | 96 +++++ .../acx/command/ExportCommand.java | 161 +++++++++ .../acx/command/ImportCommand.java | 330 ++++++++++++++++++ .../acx/command/InfoCommand.java | 30 ++ .../acx/command/ListCommand.java | 143 ++++++++ .../acx/command/LockCommand.java | 17 + .../acx/command/MkdirCommand.java | 55 +++ .../acx/command/RenameDiskCommand.java | 32 ++ .../acx/command/RenameFileCommand.java | 67 ++++ .../acx/command/RmdirCommand.java | 79 +++++ .../acx/command/UnlockCommand.java | 17 + .../acx/converter/DataSizeConverter.java | 48 +++ .../acx/converter/DiskConverter.java | 19 + .../acx/converter/IntegerTypeConverter.java | 19 + .../acx/converter/SystemTypeConverter.java | 11 + .../fileutil/DosFileEntryReaderWriter.java | 113 ++++++ .../acx/fileutil/FileEntryReader.java | 54 +++ .../acx/fileutil/FileEntryWriter.java | 46 +++ .../acx/fileutil/FileUtils.java | 101 ++++++ .../acx/fileutil/NakedosFileEntryReader.java | 22 ++ .../acx/fileutil/OverrideFileEntryReader.java | 188 ++++++++++ .../fileutil/PascalFileEntryReaderWriter.java | 82 +++++ .../fileutil/ProdosFileEntryReaderWriter.java | 116 ++++++ .../acx/fileutil/RdosFileEntryReader.java | 43 +++ .../filestreamer/FileStreamer.java | 205 +++++++++++ .../filestreamer/FileTuple.java | 42 +++ .../filestreamer/TypeOfFile.java | 15 + .../filters/AppleSingleFileFilter.java | 84 +++++ .../applecommander/filters/RawFileFilter.java | 25 ++ .../acx/converter/DataSizeConverterTest.java | 27 ++ .../filestreamer/FileStreamerTest.java | 85 +++++ .../filestreamer/FileTupleTest.java | 31 ++ .../src/test/resources/disks/MERLIN8PRO1.DSK | Bin 0 -> 143360 bytes .../src/test/resources/disks/UniDOS_3.3.dsk | Bin 0 -> 819200 bytes app/ac-cli/build.gradle | 5 +- app/ac-swing/build.gradle | 2 +- app/ac-swt-linux-aarch64/build.gradle | 5 +- app/ac-swt-linux-x86_64/build.gradle | 5 +- app/ac-swt-macosx-aarch64/build.gradle | 5 +- app/ac-swt-macosx-x86_64/build.gradle | 5 +- app/ac-swt-win32-x86_64/build.gradle | 5 +- gradle.properties | 2 + lib/ac-api/build.gradle | 3 + lib/ac-swt-common/build.gradle | 3 + settings.gradle | 1 + 61 files changed, 3196 insertions(+), 7 deletions(-) create mode 100644 app/ac-acx/README.md create mode 100644 app/ac-acx/build.gradle create mode 100644 app/ac-acx/gradle/wrapper/gradle-wrapper.jar create mode 100644 app/ac-acx/gradle/wrapper/gradle-wrapper.properties create mode 100644 app/ac-acx/src/main/java/io/github/applecommander/acx/Main.java create mode 100644 app/ac-acx/src/main/java/io/github/applecommander/acx/PrintExceptionMessageHandler.java create mode 100644 app/ac-acx/src/main/java/io/github/applecommander/acx/SystemType.java create mode 100644 app/ac-acx/src/main/java/io/github/applecommander/acx/VersionProvider.java create mode 100644 app/ac-acx/src/main/java/io/github/applecommander/acx/base/ReadOnlyDiskImageCommandOptions.java create mode 100644 app/ac-acx/src/main/java/io/github/applecommander/acx/base/ReadWriteDiskCommandOptions.java create mode 100644 app/ac-acx/src/main/java/io/github/applecommander/acx/base/ReadWriteDiskCommandWithGlobOptions.java create mode 100644 app/ac-acx/src/main/java/io/github/applecommander/acx/base/ReusableCommandOptions.java create mode 100644 app/ac-acx/src/main/java/io/github/applecommander/acx/command/ConvertCommand.java create mode 100644 app/ac-acx/src/main/java/io/github/applecommander/acx/command/CopyFileCommand.java create mode 100644 app/ac-acx/src/main/java/io/github/applecommander/acx/command/CreateDiskCommand.java create mode 100644 app/ac-acx/src/main/java/io/github/applecommander/acx/command/DeleteCommand.java create mode 100644 app/ac-acx/src/main/java/io/github/applecommander/acx/command/DiskMapCommand.java create mode 100644 app/ac-acx/src/main/java/io/github/applecommander/acx/command/ExportCommand.java create mode 100644 app/ac-acx/src/main/java/io/github/applecommander/acx/command/ImportCommand.java create mode 100644 app/ac-acx/src/main/java/io/github/applecommander/acx/command/InfoCommand.java create mode 100644 app/ac-acx/src/main/java/io/github/applecommander/acx/command/ListCommand.java create mode 100644 app/ac-acx/src/main/java/io/github/applecommander/acx/command/LockCommand.java create mode 100644 app/ac-acx/src/main/java/io/github/applecommander/acx/command/MkdirCommand.java create mode 100644 app/ac-acx/src/main/java/io/github/applecommander/acx/command/RenameDiskCommand.java create mode 100644 app/ac-acx/src/main/java/io/github/applecommander/acx/command/RenameFileCommand.java create mode 100644 app/ac-acx/src/main/java/io/github/applecommander/acx/command/RmdirCommand.java create mode 100644 app/ac-acx/src/main/java/io/github/applecommander/acx/command/UnlockCommand.java create mode 100644 app/ac-acx/src/main/java/io/github/applecommander/acx/converter/DataSizeConverter.java create mode 100644 app/ac-acx/src/main/java/io/github/applecommander/acx/converter/DiskConverter.java create mode 100644 app/ac-acx/src/main/java/io/github/applecommander/acx/converter/IntegerTypeConverter.java create mode 100644 app/ac-acx/src/main/java/io/github/applecommander/acx/converter/SystemTypeConverter.java create mode 100644 app/ac-acx/src/main/java/io/github/applecommander/acx/fileutil/DosFileEntryReaderWriter.java create mode 100644 app/ac-acx/src/main/java/io/github/applecommander/acx/fileutil/FileEntryReader.java create mode 100644 app/ac-acx/src/main/java/io/github/applecommander/acx/fileutil/FileEntryWriter.java create mode 100644 app/ac-acx/src/main/java/io/github/applecommander/acx/fileutil/FileUtils.java create mode 100644 app/ac-acx/src/main/java/io/github/applecommander/acx/fileutil/NakedosFileEntryReader.java create mode 100644 app/ac-acx/src/main/java/io/github/applecommander/acx/fileutil/OverrideFileEntryReader.java create mode 100644 app/ac-acx/src/main/java/io/github/applecommander/acx/fileutil/PascalFileEntryReaderWriter.java create mode 100644 app/ac-acx/src/main/java/io/github/applecommander/acx/fileutil/ProdosFileEntryReaderWriter.java create mode 100644 app/ac-acx/src/main/java/io/github/applecommander/acx/fileutil/RdosFileEntryReader.java create mode 100644 app/ac-acx/src/main/java/io/github/applecommander/filestreamer/FileStreamer.java create mode 100644 app/ac-acx/src/main/java/io/github/applecommander/filestreamer/FileTuple.java create mode 100644 app/ac-acx/src/main/java/io/github/applecommander/filestreamer/TypeOfFile.java create mode 100644 app/ac-acx/src/main/java/io/github/applecommander/filters/AppleSingleFileFilter.java create mode 100644 app/ac-acx/src/main/java/io/github/applecommander/filters/RawFileFilter.java create mode 100644 app/ac-acx/src/test/java/io/github/applecommander/acx/converter/DataSizeConverterTest.java create mode 100644 app/ac-acx/src/test/java/io/github/applecommander/filestreamer/FileStreamerTest.java create mode 100644 app/ac-acx/src/test/java/io/github/applecommander/filestreamer/FileTupleTest.java create mode 100644 app/ac-acx/src/test/resources/disks/MERLIN8PRO1.DSK create mode 100644 app/ac-acx/src/test/resources/disks/UniDOS_3.3.dsk diff --git a/app/ac-acx/README.md b/app/ac-acx/README.md new file mode 100644 index 0000000..0fd0399 --- /dev/null +++ b/app/ac-acx/README.md @@ -0,0 +1,150 @@ +# `ac`, extended + +This is a revamp of the venerable `ac` command-line utility with a more modern command-line interface. + +# Sample Run + +All of the commands use `-d` to designate the disk. If there are many commands, setting the environment variable `ACX_DISK_NAME` can be used to simplify commands. + +For example, this sequence: +1. Creates a ProDOS disk image (pulling ProDOS from the 2.4.2 system master). +2. Imports and tokenizes the sample `startup.bas` program and places it on the disk as `STARTUP`. +3. Lists the resulting disk. + +``` +$ cat > startup.bas +10 TEXT:HOME:GR +20 FOR Y=0 TO 3 +30 FOR X=0 TO 3 +40 COLOR=Y*4+X +50 FOR A=0 TO 9 +60 HLIN X*10,X*10+9 AT Y*10+A +70 NEXT A,X,Y +80 END + + +$ export ACX_DISK_NAME=sample.po +$ acx create --format=ProDOS_2_4_2.dsk --name=SAMPLES --size=140k --type=prodos +$ acx import --basic startup.bas --name=STARTUP + +$ acx list --native +File: sample.po +Name: /SAMPLES/ +* PRODOS SYS 035 01/02/2022 01/13/2018 17,128 +* BASIC.SYSTEM SYS 021 01/02/2022 01/13/2018 10,240 A=$2000 + STARTUP BAS 001 01/02/2022 01/02/2022 97 A=$0801 +ProDOS format; 110592 bytes free; 32768 bytes used. +``` + + +# Usage + +``` +$ acx --help +Usage: acx [-hVv] [--debug] [--quiet] [COMMAND] + +'ac' experimental utility + +Options: + --debug Show detailed stack traces. + -h, --help Show this help message and exit. + --quiet Turn off all logging. + -v, --verbose Be verbose. Multiple occurrences increase logging. + -V, --version Print version information and exit. + +Commands: + convert Uncompress a ShrinkIt or Binary II file; + copy, cp Copy files between disks. + create, mkdisk Rename volume of a disk image. + delete, del, rm Delete file(s) from a disk image. + diskmap, map Show disk usage map. + export, x, get Export file(s) from a disk image. + help Displays help information about the specified command + import, put Import file onto disk. + info, i Show information on a disk image(s). + list, ls List directory of disk image(s). + lock Lock file(s) on a disk image. + mkdir, md Create a directory on disk. + rename, ren Rename file on a disk image. + rename-disk Rename volume of a disk image. + rmdir, rd Remove a directory on disk. + unlock Unlock file(s) on a disk image. +``` + +## Info + +``` +$ acx info --help +Usage: acx info [-h] ... + +Show information on a disk image(s). + +Parameters: + ... Image(s) to process. + +Options: + -h, --help Show help for subcommand. +``` + +``` +$ acx info "Beagle Graphics.dsk" +File Name: Beagle Graphics.dsk +Disk Name: DISK VOLUME #254 +Physical Size (bytes): 143360 +Free Space (bytes): 20480 +Used Space (bytes): 122880 +Physical Size (KB): 140 +Free Space (KB): 20 +Used Space (KB): 120 +Archive Order: DOS +Disk Format: DOS 3.3 +Total Sectors: 560 +Free Sectors: 80 +Used Sectors: 480 +Tracks On Disk: 35 +Sectors On Disk: 16 +``` + +## List + +``` +$ acx list --help +Usage: acx list [-hr] [--[no-]column] [--deleted] [--[no-]footer] [--[no-] + header] [--globs=[,...]]... [-n | -s | -l] + [--file | --directory] ... + +List directory of disk image(s). + +Parameters: + ... Image(s) to process. + +Options: + --[no-]column Show column headers. + --deleted Show deleted files. + --directory Only include directories. + --file Only include files. + --[no-]footer Show footer. + --globs=[,...] + File glob(s) to match. + -h, --help Show help for subcommand. + --[no-]header Show header. + -r, --[no-]recursive Display directory recursively. +File display formatting: + -l, --long, --detail Use long/detailed directory format. + -n, --native Use native directory format (default). + -s, --short, --standard Use brief directory format. +``` + +``` +$ acx list --no-recursive DEVCD.HDV +File: DEVCD.HDV +Name: /DEV.CD/ + TOOLS DIR 002 06/25/1990 04/13/1989 1,024 + II.DISK.CENTRAL DIR 001 06/25/1990 04/13/1989 512 + UTILITIES DIR 002 06/25/1990 04/13/1989 1,024 + READ.ME.FIRST DIR 001 06/25/1990 04/21/1989 512 + GUIDED.TOURS DIR 001 06/25/1990 04/13/1989 512 + FINDER.DATA FND 001 06/25/1990 10/12/1989 172 + DEVELOP DIR 001 07/05/1990 06/25/1990 512 +ProDOS format; 1701376 bytes free; 19270144 bytes used. +``` diff --git a/app/ac-acx/build.gradle b/app/ac-acx/build.gradle new file mode 100644 index 0000000..302ec75 --- /dev/null +++ b/app/ac-acx/build.gradle @@ -0,0 +1,36 @@ +plugins { + id 'org.springframework.boot' version "$springBoot" + id 'java' + id 'application' +} + +sourceCompatibility = 11 +targetCompatibility = 11 + +repositories { + mavenCentral() +} + +dependencies { + implementation "info.picocli:picocli:$picocliVersion" + implementation project(':lib:ac-api') + implementation "net.sf.applecommander:ShrinkItArchive:$shkVersion" + implementation "net.sf.applecommander:applesingle-api:$asVersion" + implementation "net.sf.applecommander:bastools-api:$btVersion" + + testImplementation "junit:junit:$junitVersion" +} + +application { + mainClass = 'io.github.applecommander.acx.Main' +} + +bootJar { + archiveBaseName = 'AppleCommander' + archiveAppendix = 'acx' + manifest { + attributes 'Implementation-Title': "AppleCommander 'acx'", + 'Implementation-Version': archiveVersion + } + from('../../LICENSE') +} diff --git a/app/ac-acx/gradle/wrapper/gradle-wrapper.jar b/app/ac-acx/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000000000000000000000000000000000000..7454180f2ae8848c63b8b4dea2cb829da983f2fa GIT binary patch literal 59536 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 QuEJmfE|#`Dqx|px0L@K;Y5)KL literal 0 HcmV?d00001 diff --git a/app/ac-acx/gradle/wrapper/gradle-wrapper.properties b/app/ac-acx/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 0000000..e750102 --- /dev/null +++ b/app/ac-acx/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,5 @@ +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-7.3-bin.zip +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists diff --git a/app/ac-acx/src/main/java/io/github/applecommander/acx/Main.java b/app/ac-acx/src/main/java/io/github/applecommander/acx/Main.java new file mode 100644 index 0000000..b279d6c --- /dev/null +++ b/app/ac-acx/src/main/java/io/github/applecommander/acx/Main.java @@ -0,0 +1,101 @@ +package io.github.applecommander.acx; + +import java.util.logging.Handler; +import java.util.logging.Level; +import java.util.logging.LogManager; +import java.util.logging.Logger; + +import io.github.applecommander.acx.command.ConvertCommand; +import io.github.applecommander.acx.command.CopyFileCommand; +import io.github.applecommander.acx.command.CreateDiskCommand; +import io.github.applecommander.acx.command.DeleteCommand; +import io.github.applecommander.acx.command.DiskMapCommand; +import io.github.applecommander.acx.command.ExportCommand; +import io.github.applecommander.acx.command.ImportCommand; +import io.github.applecommander.acx.command.InfoCommand; +import io.github.applecommander.acx.command.ListCommand; +import io.github.applecommander.acx.command.LockCommand; +import io.github.applecommander.acx.command.MkdirCommand; +import io.github.applecommander.acx.command.RenameDiskCommand; +import io.github.applecommander.acx.command.RenameFileCommand; +import io.github.applecommander.acx.command.RmdirCommand; +import io.github.applecommander.acx.command.UnlockCommand; +import picocli.CommandLine; +import picocli.CommandLine.Command; +import picocli.CommandLine.HelpCommand; +import picocli.CommandLine.Option; + +/** + * Primary entry point into the 'acx' utility. + */ +@Command(name = "acx", mixinStandardHelpOptions = true, versionProvider = VersionProvider.class, + descriptionHeading = "%n", + commandListHeading = "%nCommands:%n", + optionListHeading = "%nOptions:%n", + description = "'ac' experimental utility", + subcommands = { + ConvertCommand.class, + CopyFileCommand.class, + CreateDiskCommand.class, + DeleteCommand.class, + DiskMapCommand.class, + ExportCommand.class, + HelpCommand.class, + ImportCommand.class, + InfoCommand.class, + ListCommand.class, + LockCommand.class, + MkdirCommand.class, + RenameFileCommand.class, + RenameDiskCommand.class, + RmdirCommand.class, + UnlockCommand.class + }) +public class Main { + private static Logger LOG = Logger.getLogger(Main.class.getName()); + private static final Level LOG_LEVELS[] = { Level.OFF, Level.SEVERE, Level.WARNING, Level.INFO, + Level.CONFIG, Level.FINE, Level.FINER, Level.FINEST }; + + static { + System.setProperty("java.util.logging.SimpleFormatter.format", "%4$s: %5$s%n"); + setAllLogLevels(Level.WARNING); + } + private static void setAllLogLevels(Level level) { + Logger rootLogger = LogManager.getLogManager().getLogger(""); + rootLogger.setLevel(level); + for (Handler handler : rootLogger.getHandlers()) { + handler.setLevel(level); + } + } + + // This flag is read in PrintExceptionMessageHandler. + @Option(names = { "--debug" }, description = "Show detailed stack traces.") + static boolean enableStackTrace; + + @Option(names = { "-v", "--verbose" }, description = "Be verbose. Multiple occurrences increase logging.") + public void setVerbosity(boolean[] flag) { + // The "+ 2" is due to the default of the levels + int loglevel = Math.min(flag.length + 2, LOG_LEVELS.length); + Level level = LOG_LEVELS[loglevel-1]; + setAllLogLevels(level); + } + + @Option(names = { "--quiet" }, description = "Turn off all logging.") + public void setQuiet(boolean flag) { + setAllLogLevels(Level.OFF); + } + + public static void main(String[] args) { + CommandLine cmd = new CommandLine(new Main()); + cmd.setExecutionExceptionHandler(new PrintExceptionMessageHandler()); + if (args.length == 0) { + cmd.usage(System.out); + System.exit(1); + } + + LOG.info(() -> String.format("Log level set to %s.", Logger.getGlobal().getLevel())); + int exitCode = cmd.execute(args); + LOG.fine("Exiting with code " + exitCode); + System.exit(exitCode); + } +} diff --git a/app/ac-acx/src/main/java/io/github/applecommander/acx/PrintExceptionMessageHandler.java b/app/ac-acx/src/main/java/io/github/applecommander/acx/PrintExceptionMessageHandler.java new file mode 100644 index 0000000..cbd824d --- /dev/null +++ b/app/ac-acx/src/main/java/io/github/applecommander/acx/PrintExceptionMessageHandler.java @@ -0,0 +1,25 @@ +package io.github.applecommander.acx; + +import picocli.CommandLine; +import picocli.CommandLine.IExecutionExceptionHandler; +import picocli.CommandLine.ParseResult; + +// Note: Taken from https://picocli.info/#_business_logic_exceptions +public class PrintExceptionMessageHandler implements IExecutionExceptionHandler { + public int handleExecutionException(Exception ex, + CommandLine cmd, + ParseResult parseResult) { + + if (Main.enableStackTrace) { + ex.printStackTrace(System.err); + } + else { + // bold red error message + cmd.getErr().println(cmd.getColorScheme().errorText(ex.getMessage())); + } + + return cmd.getExitCodeExceptionMapper() != null + ? cmd.getExitCodeExceptionMapper().getExitCode(ex) + : cmd.getCommandSpec().exitCodeOnExecutionException(); + } +} \ No newline at end of file diff --git a/app/ac-acx/src/main/java/io/github/applecommander/acx/SystemType.java b/app/ac-acx/src/main/java/io/github/applecommander/acx/SystemType.java new file mode 100644 index 0000000..d4a5948 --- /dev/null +++ b/app/ac-acx/src/main/java/io/github/applecommander/acx/SystemType.java @@ -0,0 +1,96 @@ +package io.github.applecommander.acx; + +import java.util.Arrays; +import java.util.function.BiConsumer; +import java.util.function.Function; +import java.util.logging.Logger; + +import com.webcodepro.applecommander.storage.DiskException; +import com.webcodepro.applecommander.storage.FileEntry; +import com.webcodepro.applecommander.storage.FormattedDisk; +import com.webcodepro.applecommander.storage.os.dos33.DosFormatDisk; +import com.webcodepro.applecommander.storage.physical.ByteArrayImageLayout; +import com.webcodepro.applecommander.storage.physical.DosOrder; +import com.webcodepro.applecommander.storage.physical.ImageOrder; +import com.webcodepro.applecommander.storage.physical.ProdosOrder; + +import io.github.applecommander.acx.converter.DataSizeConverter; +import io.github.applecommander.acx.fileutil.FileUtils; + +public enum SystemType { + DOS(SystemType::createDosImageOrder, SystemType::copyDosSystemTracks), + OZDOS(SystemType::create800kDosImageOrder, SystemType::copyDosSystemTracks), + UNIDOS(SystemType::create800kDosImageOrder, SystemType::copyDosSystemTracks), + PRODOS(SystemType::createProdosImageOrder, SystemType::copyProdosSystemFiles), + PASCAL(SystemType::createProdosImageOrder, SystemType::copyPascalSystemFiles); + + private static Logger LOG = Logger.getLogger(SystemType.class.getName()); + + private Function createImageOrderFn; + private BiConsumer copySystemFn; + + private SystemType(Function createImageOrderFn, + BiConsumer copySystemFn) { + this.createImageOrderFn = createImageOrderFn; + this.copySystemFn = copySystemFn; + } + + public ImageOrder createImageOrder(int size) { + return createImageOrderFn.apply(size); + } + public void copySystem(FormattedDisk target, FormattedDisk source) { + copySystemFn.accept(target, source); + } + + private static ImageOrder createDosImageOrder(int size) { + ByteArrayImageLayout layout = new ByteArrayImageLayout(new byte[size]); + return new DosOrder(layout); + } + private static ImageOrder create800kDosImageOrder(int size) { + if (size != 800 * DataSizeConverter.KB) { + LOG.warning("Setting image size to 800KB."); + } + ByteArrayImageLayout layout = new ByteArrayImageLayout(new byte[800 * DataSizeConverter.KB]); + return new DosOrder(layout); + } + private static ImageOrder createProdosImageOrder(int size) { + ByteArrayImageLayout layout = new ByteArrayImageLayout(size); + return new ProdosOrder(layout); + } + + private static void copyDosSystemTracks(FormattedDisk targetDisk, FormattedDisk source) { + DosFormatDisk target = (DosFormatDisk)targetDisk; + // FIXME messing with the VTOC should be handled elsewhere + byte[] vtoc = source.readSector(DosFormatDisk.CATALOG_TRACK, DosFormatDisk.VTOC_SECTOR); + int sectorsPerTrack = vtoc[0x35]; + // Note that this also patches T0 S0 for BOOT0 + for (int t=0; t<3; t++) { + for (int s=0; s globs = Arrays.asList("*"); + + @Override + public int handleCommand() throws Exception { + List files = FileStreamer.forDisk(disk) + .ignoreErrors(true) + .includeTypeOfFile(TypeOfFile.FILE) + .matchGlobs(globs) + .stream() + .collect(Collectors.toList()); + + if (files.isEmpty()) { + LOG.warning(() -> String.format("No matches found for %s.", String.join(",", globs))); + } else { + files.forEach(this::fileHandler); + } + + return 0; + } + + public abstract void fileHandler(FileTuple tuple); +} diff --git a/app/ac-acx/src/main/java/io/github/applecommander/acx/base/ReusableCommandOptions.java b/app/ac-acx/src/main/java/io/github/applecommander/acx/base/ReusableCommandOptions.java new file mode 100644 index 0000000..c00a333 --- /dev/null +++ b/app/ac-acx/src/main/java/io/github/applecommander/acx/base/ReusableCommandOptions.java @@ -0,0 +1,41 @@ +package io.github.applecommander.acx.base; + +import java.io.IOException; +import java.util.concurrent.Callable; +import java.util.logging.Logger; + +import com.webcodepro.applecommander.storage.Disk; + +import picocli.CommandLine.Command; +import picocli.CommandLine.Option; + +@Command(descriptionHeading = "%n", + optionListHeading = "%nOptions:%n", + parameterListHeading = "%nParameters:%n") +public abstract class ReusableCommandOptions implements Callable { + private static Logger LOG = Logger.getLogger(ReusableCommandOptions.class.getName()); + + @Option(names = { "-h", "--help" }, description = "Show help for subcommand.", usageHelp = true) + private boolean helpFlag; + + @Override + public Integer call() throws Exception { + return handleCommand(); + } + + public abstract int handleCommand() throws Exception; + + public void saveDisk(Disk disk) { + try { + // Only save if there are changes. + if (disk.getDiskImageManager().hasChanged()) { + LOG.fine(() -> String.format("Saving disk '%s'", disk.getFilename())); + disk.save(); + } else { + LOG.fine(() -> String.format("Disk '%s' has not changed; not saving.", disk.getFilename())); + } + } catch (IOException e) { + LOG.severe(e.getMessage()); + } + } +} diff --git a/app/ac-acx/src/main/java/io/github/applecommander/acx/command/ConvertCommand.java b/app/ac-acx/src/main/java/io/github/applecommander/acx/command/ConvertCommand.java new file mode 100644 index 0000000..eee77ba --- /dev/null +++ b/app/ac-acx/src/main/java/io/github/applecommander/acx/command/ConvertCommand.java @@ -0,0 +1,39 @@ +package io.github.applecommander.acx.command; + +import java.io.File; + +import com.webcodepro.applecommander.storage.Disk; + +import io.github.applecommander.acx.base.ReusableCommandOptions; +import picocli.CommandLine.Command; +import picocli.CommandLine.Option; +import picocli.CommandLine.Parameters; + +@Command(name = "convert", description = { + "Uncompress a ShrinkIt or Binary II file; ", + "or convert a DiskCopy 4.2 image into a ProDOS disk image." }) +public class ConvertCommand extends ReusableCommandOptions { + @Option(names = { "-d", "--disk" }, description = "Image to create [$ACX_DISK_NAME].", required = true, + defaultValue = "${ACX_DISK_NAME}") + private String diskName; + + @Option(names = { "-f", "--force" }, description = "Allow existing disk image to be replaced.") + private boolean overwriteFlag; + + @Parameters(description = "Archive to convert.", arity = "1") + private String archiveName; + + @Override + public int handleCommand() throws Exception { + File targetFile = new File(diskName); + if (targetFile.exists() && !overwriteFlag) { + throw new RuntimeException("File exists and overwriting not enabled."); + } + + Disk disk = new Disk(archiveName); + disk.setFilename(diskName); + saveDisk(disk); + + return 0; + } +} diff --git a/app/ac-acx/src/main/java/io/github/applecommander/acx/command/CopyFileCommand.java b/app/ac-acx/src/main/java/io/github/applecommander/acx/command/CopyFileCommand.java new file mode 100644 index 0000000..c23ea50 --- /dev/null +++ b/app/ac-acx/src/main/java/io/github/applecommander/acx/command/CopyFileCommand.java @@ -0,0 +1,75 @@ +package io.github.applecommander.acx.command; + +import java.util.List; +import java.util.logging.Logger; +import java.util.stream.Collectors; + +import com.webcodepro.applecommander.storage.Disk; +import com.webcodepro.applecommander.storage.DiskException; +import com.webcodepro.applecommander.storage.FormattedDisk; + +import io.github.applecommander.acx.base.ReadWriteDiskCommandOptions; +import io.github.applecommander.acx.converter.DiskConverter; +import io.github.applecommander.acx.fileutil.FileUtils; +import io.github.applecommander.filestreamer.FileStreamer; +import io.github.applecommander.filestreamer.FileTuple; +import io.github.applecommander.filestreamer.TypeOfFile; +import picocli.CommandLine.Command; +import picocli.CommandLine.Option; +import picocli.CommandLine.Parameters; + +@Command(name = "copy", description = "Copy files between disks.", + aliases = { "cp" }) +public class CopyFileCommand extends ReadWriteDiskCommandOptions { + private static Logger LOG = Logger.getLogger(CopyFileCommand.class.getName()); + + @Option(names = { "-r", "--recursive" }, description = "Copy files recursively.") + private boolean recursiveFlag; + + @Option(names = { "-f", "--force" }, description = "Overwrite existing files.") + private boolean overwriteFlag; + + @Option(names = { "--to", "--directory" }, description = "Specify which directory to place files.") + private String targetPath; + + @Option(names = { "-s", "--from", "--source" }, description = "Source disk for files.", + converter = DiskConverter.class, required = true) + private Disk sourceDisk; + + @Parameters(arity = "*", description = "File glob(s) to copy (default = '*')", + defaultValue = "*") + private List globs; + + @Override + public int handleCommand() throws Exception { + List files = FileStreamer.forDisk(sourceDisk) + .ignoreErrors(true) + .includeTypeOfFile(TypeOfFile.BOTH) + .recursive(recursiveFlag) + .matchGlobs(globs) + .stream() + .collect(Collectors.toList()); + + if (files.isEmpty()) { + LOG.warning(() -> String.format("No matches found for %s.", String.join(",", globs))); + } else { + files.forEach(this::fileHandler); + } + return 0; + } + + private void fileHandler(FileTuple tuple) { + try { + FormattedDisk formattedDisk = disk.getFormattedDisks()[0]; + if (!recursiveFlag && tuple.fileEntry.isDirectory()) { + formattedDisk.createDirectory(tuple.fileEntry.getFilename()); + } else { + FileUtils copier = new FileUtils(overwriteFlag); + copier.copy(formattedDisk, tuple.fileEntry); + } + } catch (DiskException ex) { + LOG.severe(ex.getMessage()); + throw new RuntimeException(ex); + } + } +} diff --git a/app/ac-acx/src/main/java/io/github/applecommander/acx/command/CreateDiskCommand.java b/app/ac-acx/src/main/java/io/github/applecommander/acx/command/CreateDiskCommand.java new file mode 100644 index 0000000..a5db4c9 --- /dev/null +++ b/app/ac-acx/src/main/java/io/github/applecommander/acx/command/CreateDiskCommand.java @@ -0,0 +1,79 @@ +package io.github.applecommander.acx.command; + +import java.util.logging.Logger; + +import com.webcodepro.applecommander.storage.Disk; +import com.webcodepro.applecommander.storage.FormattedDisk; +import com.webcodepro.applecommander.storage.os.dos33.DosFormatDisk; +import com.webcodepro.applecommander.storage.os.dos33.OzDosFormatDisk; +import com.webcodepro.applecommander.storage.os.dos33.UniDosFormatDisk; +import com.webcodepro.applecommander.storage.os.pascal.PascalFormatDisk; +import com.webcodepro.applecommander.storage.os.prodos.ProdosFormatDisk; +import com.webcodepro.applecommander.storage.physical.ImageOrder; + +import io.github.applecommander.acx.SystemType; +import io.github.applecommander.acx.base.ReusableCommandOptions; +import io.github.applecommander.acx.converter.DataSizeConverter; +import io.github.applecommander.acx.converter.SystemTypeConverter; +import picocli.CommandLine.Command; +import picocli.CommandLine.Option; + +@Command(name = "create", description = "Create a disk image.", + aliases = { "mkdisk" }) +public class CreateDiskCommand extends ReusableCommandOptions { + private static Logger LOG = Logger.getLogger(CreateDiskCommand.class.getName()); + + @Option(names = { "-d", "--disk" }, description = "Image to create [$ACX_DISK_NAME].", required = true, + defaultValue = "${ACX_DISK_NAME}") + private String imageName; + + @Option(names = { "-t", "--type" }, required = true, converter = SystemTypeConverter.class, + description = "Select system type (DOS, ProDOS, Pascal.") + private SystemType type; + + @Option(names = { "-s", "--size" }, defaultValue = "140kb", converter = DataSizeConverter.class, + description = "Select disk size (140K, 800K, 10M).") + private int size; + + @Option(names = { "-f", "--format" }, + description = "Disk to copy system files/tracks/boot sector from.") + private String formatSource; + + @Option(names = { "-n", "--name" }, defaultValue = "NEW.DISK", + description = "Disk Volume name (ProDOS/Pascal).") + private String diskName; + + @Override + public int handleCommand() throws Exception { + LOG.info(() -> String.format("Creating %s image of type %s.", DataSizeConverter.format(size), type)); + + ImageOrder order = type.createImageOrder(size); + FormattedDisk[] disks = null; + switch (type) { + case DOS: + disks = DosFormatDisk.create(imageName, order); + break; + case OZDOS: + disks = OzDosFormatDisk.create(imageName, order); + break; + case UNIDOS: + disks = UniDosFormatDisk.create(imageName, order); + break; + case PRODOS: + disks = ProdosFormatDisk.create(imageName, diskName, order); + break; + case PASCAL: + disks = PascalFormatDisk.create(imageName, diskName, order); + break; + } + + if (formatSource != null) { + Disk systemSource = new Disk(formatSource); + type.copySystem(disks[0], systemSource.getFormattedDisks()[0]); + } + + saveDisk(disks[0]); + + return 0; + } +} diff --git a/app/ac-acx/src/main/java/io/github/applecommander/acx/command/DeleteCommand.java b/app/ac-acx/src/main/java/io/github/applecommander/acx/command/DeleteCommand.java new file mode 100644 index 0000000..26ae2ac --- /dev/null +++ b/app/ac-acx/src/main/java/io/github/applecommander/acx/command/DeleteCommand.java @@ -0,0 +1,31 @@ +package io.github.applecommander.acx.command; + +import java.util.logging.Logger; + +import io.github.applecommander.acx.base.ReadWriteDiskCommandWithGlobOptions; +import io.github.applecommander.filestreamer.FileTuple; +import picocli.CommandLine.Command; +import picocli.CommandLine.Option; + +@Command(name = "delete", description = "Delete file(s) from a disk image.", + aliases = { "del", "rm" }) +public class DeleteCommand extends ReadWriteDiskCommandWithGlobOptions { + private static Logger LOG = Logger.getLogger(DeleteCommand.class.getName()); + + @Option(names = { "-f", "--force" }, description = "Force delete locked files.") + private boolean forceFlag; + + public void fileHandler(FileTuple tuple) { + if (tuple.fileEntry.isLocked()) { + if (forceFlag) { + LOG.info(() -> String.format("File '%s' is locked, but 'force' specified; ignoring lock.", + tuple.fileEntry.getFilename())); + } else { + LOG.warning(() -> String.format("File '%s' is locked.", tuple.fileEntry.getFilename())); + return; + } + } + tuple.fileEntry.delete(); + LOG.info(() -> String.format("File '%s' deleted.", tuple.fileEntry.getFilename())); + } +} diff --git a/app/ac-acx/src/main/java/io/github/applecommander/acx/command/DiskMapCommand.java b/app/ac-acx/src/main/java/io/github/applecommander/acx/command/DiskMapCommand.java new file mode 100644 index 0000000..ca81336 --- /dev/null +++ b/app/ac-acx/src/main/java/io/github/applecommander/acx/command/DiskMapCommand.java @@ -0,0 +1,96 @@ +package io.github.applecommander.acx.command; + +import java.util.Arrays; +import java.util.function.Function; + +import com.webcodepro.applecommander.storage.FormattedDisk; +import com.webcodepro.applecommander.storage.FormattedDisk.DiskUsage; + +import io.github.applecommander.acx.base.ReadOnlyDiskImageCommandOptions; +import picocli.CommandLine.Command; + +@Command(name = "diskmap", description = "Show disk usage map.", + aliases = { "map" }) +public class DiskMapCommand extends ReadOnlyDiskImageCommandOptions { + @Override + public int handleCommand() throws Exception { + Arrays.asList(disk.getFormattedDisks()).forEach(this::showDiskMap); + return 0; + } + + public void showDiskMap(FormattedDisk formattedDisk) { + final int[] dimensions = formattedDisk.getBitmapDimensions(); + final int length = formattedDisk.getBitmapLength(); + final int width,height; + final Function leftNumFn, rightNumFn; + if (dimensions != null && dimensions.length == 2) { + height = dimensions[0]; + width = dimensions[1]; + // This is expected to be Track, so same number on left and right. + leftNumFn = rightNumFn = i -> i; + } else { + width = 70; + height= (length + width - 1) / width; + // This is expected to be blocks, so show start of range of + // left and end of range on right. + leftNumFn = i -> i * width; + rightNumFn = i -> (i + 1) * width - 1; + } + + title(formattedDisk.getBitmapLabels()); + header1(width); // 10's position + header2(width); // 1's position + header3(width); // divider + + DiskUsage diskUsage = formattedDisk.getDiskUsage(); + for (int y=0; y globs = Arrays.asList("*"); + + public void validate() { + List errors = new ArrayList<>(); + // multiple files require --output + if (isMultipleFiles()) { + if (outputFile == null) { + errors.add("--output directory must be specified with multiple files"); + } else if (!outputFile.isDirectory()) { + errors.add("--output must be a directory"); + } + } + if (!errors.isEmpty()) { + throw new ParameterException(spec.commandLine(), String.join(", ", errors)); + } + } + + @Override + public int handleCommand() throws Exception { + validate(); + + Consumer fileHandler = + (outputFile == null) ? this::writeToStdout : this::writeToOutput; + + FileStreamer.forDisk(disk) + .ignoreErrors(true) + .includeDeleted(deletedFlag) + .includeTypeOfFile(TypeOfFile.FILE) + .matchGlobs(globs) + .stream() + .forEach(fileHandler); + + return 0; + } + + public boolean hasFiles() { + return globs != null && globs.size() > 1; + } + public boolean isAllFiles() { + return globs == null || globs.isEmpty(); + } + public boolean isMultipleFiles() { + return hasFiles() || isAllFiles(); + } + + public void writeToStdout(FileTuple tuple) { + try { + FileFilter ff = extraction.extractFunction.apply(tuple.fileEntry); + System.out.write(ff.filter(tuple.fileEntry)); + } catch (IOException e) { + throw new UncheckedIOException(e); + } + } + public void writeToOutput(FileTuple tuple) { + File file = outputFile; + FileFilter ff = extraction.extractFunction.apply(tuple.fileEntry); + if (file.isDirectory()) { + if (!tuple.paths.isEmpty()) { + file = new File(outputFile, String.join(File.pathSeparator, tuple.paths)); + boolean created = file.mkdirs(); + if (created) LOG.info(String.format("Directory created: %s", file.getPath())); + } + file = new File(file, ff.getSuggestedFileName(tuple.fileEntry)); + } + LOG.info(String.format("Writing to '%s'", file.getPath())); + try (OutputStream out = new FileOutputStream(file)) { + out.write(ff.filter(tuple.fileEntry)); + } catch (IOException e) { + throw new UncheckedIOException(e); + } + } + + private static class FileExtractMethods { + private Function extractFunction = this::asSuggestedFile; + + @Option(names = { "--raw", "--binary" }, description = "Extract file in native format.") + public void setBinaryExtraction(boolean flag) { + this.extractFunction = this::asRawFile; + } + @Option(names = { "--hex", "--dump" }, description = "Extract file in hex dump format.") + public void setHexDumpExtraction(boolean flag) { + this.extractFunction = this::asHexDumpFile; + } + @Option(names = { "--suggested" }, description = "Extract file as suggested by AppleCommander (default)") + public void setSuggestedExtraction(boolean flag) { + this.extractFunction = this::asSuggestedFile; + } + @Option(names = { "--as", "--applesingle" }, description = "Extract file to AppleSingle file.") + public void setAppleSingleExtraction(boolean flag) { + this.extractFunction = this::asAppleSingleFile; + } + + public FileFilter asRawFile(FileEntry entry) { + return new RawFileFilter(); + } + public FileFilter asSuggestedFile(FileEntry entry) { + FileFilter ff = entry.getSuggestedFilter(); + if (ff instanceof BinaryFileFilter) { + ff = new HexDumpFileFilter(); + } + return ff; + } + public FileFilter asHexDumpFile(FileEntry entry) { + return new HexDumpFileFilter(); + } + public FileFilter asAppleSingleFile(FileEntry entry) { + return new AppleSingleFileFilter(); + } + } +} diff --git a/app/ac-acx/src/main/java/io/github/applecommander/acx/command/ImportCommand.java b/app/ac-acx/src/main/java/io/github/applecommander/acx/command/ImportCommand.java new file mode 100644 index 0000000..555a751 --- /dev/null +++ b/app/ac-acx/src/main/java/io/github/applecommander/acx/command/ImportCommand.java @@ -0,0 +1,330 @@ +package io.github.applecommander.acx.command; + +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.io.UncheckedIOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; +import java.util.Optional; +import java.util.Queue; +import java.util.function.Function; +import java.util.logging.Logger; + +import com.webcodepro.applecommander.storage.DirectoryEntry; +import com.webcodepro.applecommander.storage.FileEntry; +import com.webcodepro.applecommander.storage.os.prodos.ProdosFormatDisk; +import com.webcodepro.applecommander.util.AppleUtil; +import com.webcodepro.applecommander.util.StreamUtil; +import com.webcodepro.applecommander.util.TranslatorStream; +import com.webcodepro.shrinkit.HeaderBlock; +import com.webcodepro.shrinkit.NuFileArchive; +import com.webcodepro.shrinkit.ThreadRecord; + +import io.github.applecommander.acx.base.ReadWriteDiskCommandOptions; +import io.github.applecommander.acx.converter.IntegerTypeConverter; +import io.github.applecommander.acx.fileutil.FileEntryReader; +import io.github.applecommander.acx.fileutil.FileUtils; +import io.github.applecommander.acx.fileutil.OverrideFileEntryReader; +import io.github.applecommander.applesingle.AppleSingle; +import io.github.applecommander.applesingle.FileDatesInfo; +import io.github.applecommander.applesingle.ProdosFileInfo; +import io.github.applecommander.bastools.api.Configuration; +import io.github.applecommander.bastools.api.Parser; +import io.github.applecommander.bastools.api.TokenReader; +import io.github.applecommander.bastools.api.Visitors; +import io.github.applecommander.bastools.api.model.Program; +import io.github.applecommander.bastools.api.model.Token; +import picocli.CommandLine.ArgGroup; +import picocli.CommandLine.Command; +import picocli.CommandLine.Option; +import picocli.CommandLine.Parameters; + +@Command(name = "import", description = "Import file onto disk.", + aliases = { "put" }) +public class ImportCommand extends ReadWriteDiskCommandOptions { + private static Logger LOG = Logger.getLogger(ImportCommand.class.getName()); + + @ArgGroup(heading = "%nInput source:%n", multiplicity = "1") + private InputData inputData; + + @ArgGroup(heading = "%nProcessing options:%n") + private Processor processor; + + @ArgGroup(heading = "%nGeneral overrides:%n", exclusive = false) + private Overrides overrides = new Overrides(); + + @Option(names = { "--dir" }, description = "Write file(s) to directory.") + private Optional directoryName; + + @Option(names = { "-f", "--force" }, description = "Over-write existing files.") + private boolean overwriteFlag; + + @Override + public int handleCommand() throws Exception { + DirectoryEntry directory = disk.getFormattedDisks()[0]; + if (directoryName.isPresent()) { + String[] dirs = directoryName.get().split("/"); + for (String dir : dirs) { + Optional fileEntry = directory.getFiles().stream() + .filter(f -> dir.equalsIgnoreCase(f.getFilename())) + .findFirst(); + Optional dirEntry = fileEntry + .filter(FileEntry::isDirectory) + .map(DirectoryEntry.class::cast); + directory = dirEntry.orElseThrow(() -> + new IOException(String.format("Directory '%s' not found.", dir))); + } + } + + FileUtils copier = new FileUtils(overwriteFlag); + FileEntryReader inputReader = inputData.get(); + for (FileEntryReader processorReader : processor.apply(inputReader)) { + FileEntryReader reader = OverrideFileEntryReader.builder() + .filename(overrides.fileName) + .prodosFiletype(overrides.fileType) + .binaryAddress(overrides.fileAddress) + .build(processorReader); + + copier.copyFile(directory, reader); + } + + return 0; + } + + public static class InputData { + private FileEntryReader fileEntryReader; + + public FileEntryReader get() { + return fileEntryReader; + } + + @Option(names = { "--stdin" }, description = "Import from standard input.") + public void stdinFlag(boolean flag) { + try { + byte[] data = System.in.readAllBytes(); + fileEntryReader = OverrideFileEntryReader.builder() + .fileData(data) + .filename("UNKNOWN") + .prodosFiletype("BIN") + .build(); + } catch (IOException e) { + throw new UncheckedIOException(e); + } + } + + @Parameters(description = "File to import.") + public void fromFile(final String filename) { + try { + Path path = Path.of(filename); + byte[] data = Files.readAllBytes(path); + fileEntryReader = OverrideFileEntryReader.builder() + .fileData(data) + .filename(filename) + .prodosFiletype("BIN") + .build(); + } catch (IOException e) { + throw new UncheckedIOException(e); + } + } + } + + public static class Processor { + private Function> fileEntryReaderFn; + + public List apply(FileEntryReader reader) { + return fileEntryReaderFn.apply(reader); + } + + @Option(names = { "--text", "--text-high" }, description = { + "Import as a text file, setting high bit and ", + "replacing newline characters with $8D." }) + public void setTextModeSetHighBit(boolean textFlag) { + fileEntryReaderFn = this::handleTextModeSetHighBit; + } + + @Option(names = { "--text-low" }, description = { + "Import as a text file, clearing high bit and ", + "replacing newline characters with $8D." }) + public void setTextModeClearHighBit(boolean textFlag) { + fileEntryReaderFn = this::handleTextModeClearHighBit; + } + + @Option(names = { "--dos" }, description = "Use standard 4-byte DOS header.") + public void setDosMode(boolean dosFlag) { + fileEntryReaderFn = this::handleDosMode; + } + + @Option(names = { "--geos" }, description = "Interpret as a GEOS conversion file.") + public void setGeosMode(boolean geosFlag) { + fileEntryReaderFn = this::handleGeosMode; + } + + @Option(names = { "--basic" }, description = "Tokenize an AppleSoft BASIC program.") + public void setApplesoftTokenizerMode(boolean tokenizeMode) { + fileEntryReaderFn = this::handleApplesoftTokenizeMode; + } + + @Option(names = { "--as", "--applesingle" }, description = "Import Apple Single file.") + public void setAppleSingleMode(boolean applesingleMode) { + fileEntryReaderFn = this::handleAppleSingleMode; + } + + @Option(names = { "--shk", "--nufx", "--shrinkit", "--bxy" }, + description = "Import files from SHK archive.") + public void setShrinkitMode(boolean shrinkitMode) { + fileEntryReaderFn = this::handleShrinkitMode; + } + + private List handleTextModeSetHighBit(FileEntryReader reader) { + InputStream inputStream = new ByteArrayInputStream(reader.getFileData().get()); + return handleTextMode(TranslatorStream.builder(inputStream) + .lfToCr().setHighBit().get(), reader); + } + private List handleTextModeClearHighBit(FileEntryReader reader) { + InputStream inputStream = new ByteArrayInputStream(reader.getFileData().get()); + return handleTextMode(TranslatorStream.builder(inputStream) + .lfToCr().clearHighBit().get(), reader); + } + private List handleTextMode(InputStream inputStream, FileEntryReader reader) { + try { + ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); + StreamUtil.copy(inputStream, outputStream); + final byte[] translatedData = outputStream.toByteArray(); + return OverrideFileEntryReader.builder() + .fileData(translatedData) + .prodosFiletype("TXT") + .buildList(reader); + } catch (IOException cause) { + throw new UncheckedIOException(cause); + } + } + + private List handleDosMode(FileEntryReader reader) { + try { + ByteArrayInputStream inputStream = new ByteArrayInputStream(reader.getFileData().get()); + byte[] header = new byte[4]; + if (inputStream.read(header) != 4) { + throw new IOException("Unable to read DOS header."); + } + int address = AppleUtil.getWordValue(header, 0); + ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); + inputStream.transferTo(outputStream); + return OverrideFileEntryReader.builder() + .fileData(outputStream.toByteArray()) + .binaryAddress(address) + .buildList(reader); + } catch (IOException cause) { + throw new UncheckedIOException(cause); + } + } + + private List handleGeosMode(FileEntryReader reader) { + return OverrideFileEntryReader.builder() + .prodosFiletype("GEO") + .binaryAddress(0) + .buildList(reader); + } + + private List handleApplesoftTokenizeMode(FileEntryReader reader) { + try { + File fakeTempSource = File.createTempFile("ac-", "bas"); + fakeTempSource.deleteOnExit(); + Configuration config = Configuration.builder().sourceFile(fakeTempSource).build(); + Queue tokens = TokenReader.tokenize(new ByteArrayInputStream(reader.getFileData().get())); + Parser parser = new Parser(tokens); + Program program = parser.parse(); + byte[] tokenData = Visitors.byteVisitor(config).dump(program); + return OverrideFileEntryReader.builder() + .fileData(tokenData) + .prodosFiletype("BAS") + .binaryAddress(config.startAddress) + .buildList(reader); + } catch (IOException cause) { + throw new UncheckedIOException(cause); + } + } + + private List handleAppleSingleMode(FileEntryReader reader) { + try { + AppleSingle as = AppleSingle.read(reader.getFileData().get()); + if (as.getProdosFileInfo() == null) { + throw new IOException("This AppleSingle does not contain a ProDOS file."); + } + if (as.getDataFork() == null || as.getDataFork().length == 0) { + throw new IOException("This AppleSingle does not contain a data fork."); + } + ProdosFileInfo info = as.getProdosFileInfo(); + String fileType = ProdosFormatDisk.getFiletype(info.getFileType()); + + OverrideFileEntryReader.Builder builder = OverrideFileEntryReader.builder(); + builder.filename(Optional.ofNullable(as.getRealName())); + builder.fileData(as.getDataFork()); + builder.resourceData(Optional.ofNullable(as.getResourceFork())); + builder.prodosFiletype(fileType); + builder.locked(info.getAccess() == 0xc3); + builder.auxiliaryType(info.getAuxType()); + + if (as.getFileDatesInfo() != null) { + FileDatesInfo dates = as.getFileDatesInfo(); + builder.creationDate(Date.from(dates.getCreationInstant())); + builder.lastModificationDate(Date.from(dates.getModificationInstant())); + } + + return builder.buildList(reader); + } catch (IOException cause) { + throw new UncheckedIOException(cause); + } + } + + private List handleShrinkitMode(FileEntryReader reader) { + try { + List files = new ArrayList<>(); + ByteArrayInputStream inputStream = new ByteArrayInputStream(reader.getFileData().get()); + NuFileArchive nufx = new NuFileArchive(inputStream); + for (HeaderBlock header : nufx.getHeaderBlocks()) { + OverrideFileEntryReader.Builder builder = OverrideFileEntryReader.builder() + .filename(header.getFilename()) + .prodosFiletype(ProdosFormatDisk.getFiletype((int)header.getFileType())) + .auxiliaryType((int)header.getExtraType()) + .creationDate(header.getCreateWhen()) + .lastModificationDate(header.getModWhen()); + + ThreadRecord dataFork = header.getDataForkThreadRecord(); + ThreadRecord resourceFork = header.getResourceForkThreadRecord(); + if (dataFork == null) { + LOG.info(() -> String.format("No data fork for '%s', skipping it.", + header.getFilename())); + continue; + } + + builder.fileData(dataFork.getBytes()); + if (resourceFork != null) { + builder.resourceData(resourceFork.getBytes()); + } + files.add(builder.build()); + } + return files; + } catch (IOException cause) { + throw new UncheckedIOException(cause); + } + } + } + + public static class Overrides { + @Option(names = { "-t", "--type" }, description = "File type.") + private Optional fileType; + + @Option(names = { "-a", "--addr" }, description = "File address.", + converter = IntegerTypeConverter.class) + private Optional fileAddress; + + @Option(names = { "-n", "--name" }, description = "File name.") + private Optional fileName; + } +} diff --git a/app/ac-acx/src/main/java/io/github/applecommander/acx/command/InfoCommand.java b/app/ac-acx/src/main/java/io/github/applecommander/acx/command/InfoCommand.java new file mode 100644 index 0000000..18b44a4 --- /dev/null +++ b/app/ac-acx/src/main/java/io/github/applecommander/acx/command/InfoCommand.java @@ -0,0 +1,30 @@ +package io.github.applecommander.acx.command; + +import java.util.logging.Logger; + +import com.webcodepro.applecommander.storage.FormattedDisk; +import com.webcodepro.applecommander.storage.FormattedDisk.DiskInformation; + +import io.github.applecommander.acx.base.ReadOnlyDiskImageCommandOptions; +import picocli.CommandLine.Command; + +@Command(name = "info", description = "Show information on a disk image(s).", + aliases = "i") +public class InfoCommand extends ReadOnlyDiskImageCommandOptions { + private static Logger LOG = Logger.getLogger(InfoCommand.class.getName()); + + @Override + public int handleCommand() throws Exception { + LOG.info(() -> "Path: " + disk.getFilename()); + FormattedDisk[] formattedDisks = disk.getFormattedDisks(); + for (int i = 0; i < formattedDisks.length; i++) { + FormattedDisk formattedDisk = formattedDisks[i]; + LOG.info(() -> String.format("Disk: %s (%s)", formattedDisk.getDiskName(), formattedDisk.getFormat())); + for (DiskInformation diskinfo : formattedDisk.getDiskInformation()) { + System.out.printf("%s: %s\n", diskinfo.getLabel(), diskinfo.getValue()); + } + System.out.println(); + } + return 0; + } +} diff --git a/app/ac-acx/src/main/java/io/github/applecommander/acx/command/ListCommand.java b/app/ac-acx/src/main/java/io/github/applecommander/acx/command/ListCommand.java new file mode 100644 index 0000000..300e519 --- /dev/null +++ b/app/ac-acx/src/main/java/io/github/applecommander/acx/command/ListCommand.java @@ -0,0 +1,143 @@ +package io.github.applecommander.acx.command; + +import java.util.ArrayList; +import java.util.List; + +import com.webcodepro.applecommander.storage.FormattedDisk; +import com.webcodepro.applecommander.storage.FormattedDisk.FileColumnHeader; + +import io.github.applecommander.acx.base.ReadOnlyDiskImageCommandOptions; +import io.github.applecommander.filestreamer.FileStreamer; +import io.github.applecommander.filestreamer.FileTuple; +import io.github.applecommander.filestreamer.TypeOfFile; +import picocli.CommandLine.ArgGroup; +import picocli.CommandLine.Command; +import picocli.CommandLine.Option; + +@Command(name = "list", description = "List directory of disk image(s).", + aliases = { "ls" }) +public class ListCommand extends ReadOnlyDiskImageCommandOptions { + @ArgGroup(exclusive = true, multiplicity = "0..1", heading = "%nFile display formatting:%n") + private FileDisplay fileDisplay = new FileDisplay(); + + @Option(names = { "-r", "--recursive"}, description = "Display directory recursively.", negatable = true, defaultValue = "false") + private boolean recursiveFlag; + + @Option(names = { "--deleted" }, description = "Show deleted files.") + private boolean deletedFlag; + + @ArgGroup(exclusive = true, multiplicity = "0..1") + private TypeOfFileSelection typeOfFile = new TypeOfFileSelection(); + + @Option(names = "--header", negatable = true, description = "Show header.") + private boolean headerFlag = true; + + @Option(names = "--column", negatable = true, description = "Show column headers.") + private boolean columnFlag = true; + + @Option(names = "--footer", negatable = true, description = "Show footer.") + private boolean footerFlag = true; + + @Option(names = "--globs", defaultValue = "*", split = ",", description = "File glob(s) to match.") + private List globs = new ArrayList(); + + private List fmtSpec; + + @Override + public int handleCommand() throws Exception { + FileStreamer.forDisk(disk) + .ignoreErrors(true) + .includeDeleted(deletedFlag) + .recursive(recursiveFlag) + .includeTypeOfFile(typeOfFile.typeOfFile()) + .matchGlobs(globs) + .beforeDisk(this::header) + .afterDisk(this::footer) + .stream() + .forEach(this::list); + return 0; + } + + protected void header(FormattedDisk disk) { + List headers = disk.getFileColumnHeaders(fileDisplay.format()); + fmtSpec = createFormatSpec(headers); + + System.out.println(); + System.out.printf("File: %s\n", disk.getFilename()); + System.out.printf("Name: %s\n", disk.getDiskName()); + } + + protected void list(FileTuple tuple) { + if (!deletedFlag && tuple.fileEntry.isDeleted()) { + return; + } + + List data = tuple.fileEntry.getFileColumnData(fileDisplay.format()); + for (int i=0; i createFormatSpec(List fileColumnHeaders) { + List fmtSpec = new ArrayList<>(); + for (FileColumnHeader h : fileColumnHeaders) { + String spec = String.format("%%%s%ds ", h.isRightAlign() ? "" : "-", + h.getMaximumWidth()); + fmtSpec.add(spec); + } + return fmtSpec; + } + + public static class FileDisplay { + public int format() { + if (standardFormat) { + return FormattedDisk.FILE_DISPLAY_STANDARD; + } + if (longFormat) { + return FormattedDisk.FILE_DISPLAY_DETAIL; + } + return FormattedDisk.FILE_DISPLAY_NATIVE; + } + + @Option(names = { "-n", "--native" }, description = "Use native directory format (default).") + private boolean nativeFormat; + + @Option(names = { "-s", "--short", "--standard" }, description = "Use brief directory format.") + private boolean standardFormat; + + @Option(names = { "-l", "--long", "--detail" }, description = "Use long/detailed directory format.") + private boolean longFormat; + } + + public static class TypeOfFileSelection { + public TypeOfFile typeOfFile() { + if (filesOnly) { + return TypeOfFile.FILE; + } + if (directoriesOnly) { + return TypeOfFile.DIRECTORY; + } + return TypeOfFile.BOTH; + } + + @Option(names = "--file", description = "Only include files.") + private boolean filesOnly; + + @Option(names = "--directory", description = "Only include directories.") + private boolean directoriesOnly; + } +} diff --git a/app/ac-acx/src/main/java/io/github/applecommander/acx/command/LockCommand.java b/app/ac-acx/src/main/java/io/github/applecommander/acx/command/LockCommand.java new file mode 100644 index 0000000..89577cb --- /dev/null +++ b/app/ac-acx/src/main/java/io/github/applecommander/acx/command/LockCommand.java @@ -0,0 +1,17 @@ +package io.github.applecommander.acx.command; + +import java.util.logging.Logger; + +import io.github.applecommander.acx.base.ReadWriteDiskCommandWithGlobOptions; +import io.github.applecommander.filestreamer.FileTuple; +import picocli.CommandLine.Command; + +@Command(name = "lock", description = "Lock file(s) on a disk image.") +public class LockCommand extends ReadWriteDiskCommandWithGlobOptions { + private static Logger LOG = Logger.getLogger(LockCommand.class.getName()); + + public void fileHandler(FileTuple tuple) { + tuple.fileEntry.setLocked(true); + LOG.info(() -> String.format("File '%s' locked.", tuple.fileEntry.getFilename())); + } +} diff --git a/app/ac-acx/src/main/java/io/github/applecommander/acx/command/MkdirCommand.java b/app/ac-acx/src/main/java/io/github/applecommander/acx/command/MkdirCommand.java new file mode 100644 index 0000000..3329bbd --- /dev/null +++ b/app/ac-acx/src/main/java/io/github/applecommander/acx/command/MkdirCommand.java @@ -0,0 +1,55 @@ +package io.github.applecommander.acx.command; + +import java.util.Optional; + +import com.webcodepro.applecommander.storage.DirectoryEntry; +import com.webcodepro.applecommander.storage.FileEntry; +import com.webcodepro.applecommander.storage.FormattedDisk; + +import io.github.applecommander.acx.base.ReadWriteDiskCommandOptions; +import picocli.CommandLine.Command; +import picocli.CommandLine.Option; +import picocli.CommandLine.Parameters; + +@Command(name = "mkdir", description = "Create a directory on disk.", + aliases = { "md" }) +public class MkdirCommand extends ReadWriteDiskCommandOptions { + @Option(names = { "-p" }, description = "Create intermediate subdirectories.") + private boolean prefixFlag; + + @Parameters(description = "Directory name to create (use '/' as divider).") + private String fullPath; + + @Override + public int handleCommand() throws Exception { + FormattedDisk formattedDisk = disk.getFormattedDisks()[0]; + DirectoryEntry directory = formattedDisk; + + String[] paths = fullPath.split("/"); + for (int i=0; i optEntry = directory.getFiles().stream() + .filter(entry -> entry.getFilename().equalsIgnoreCase(pathName)) + .findFirst(); + + if (optEntry.isPresent()) { + FileEntry fileEntry = optEntry.get(); + if (fileEntry instanceof DirectoryEntry) { + directory = (DirectoryEntry)fileEntry; + } + else { + throw new RuntimeException(String.format("Not a directory: '%s'", pathName)); + } + } + else { + if (prefixFlag || i == paths.length-1) { + directory = directory.createDirectory(pathName); + } + else { + throw new RuntimeException(String.format("Directory does not exist: '%s'", pathName)); + } + } + } + return 0; + } +} diff --git a/app/ac-acx/src/main/java/io/github/applecommander/acx/command/RenameDiskCommand.java b/app/ac-acx/src/main/java/io/github/applecommander/acx/command/RenameDiskCommand.java new file mode 100644 index 0000000..31ca39a --- /dev/null +++ b/app/ac-acx/src/main/java/io/github/applecommander/acx/command/RenameDiskCommand.java @@ -0,0 +1,32 @@ +package io.github.applecommander.acx.command; + +import java.util.logging.Logger; + +import com.webcodepro.applecommander.storage.FormattedDisk; +import com.webcodepro.applecommander.storage.os.pascal.PascalFormatDisk; +import com.webcodepro.applecommander.storage.os.prodos.ProdosFormatDisk; + +import io.github.applecommander.acx.base.ReadWriteDiskCommandOptions; +import picocli.CommandLine.Command; +import picocli.CommandLine.Parameters; + +@Command(name = "rename-disk", description = "Rename volume of a disk image.") +public class RenameDiskCommand extends ReadWriteDiskCommandOptions { + private static Logger LOG = Logger.getLogger(RenameDiskCommand.class.getName()); + + @Parameters(description = "Disk name.") + private String diskName; + + @Override + public int handleCommand() throws Exception { + FormattedDisk[] formattedDisks = disk.getFormattedDisks(); + FormattedDisk formattedDisk = formattedDisks[0]; + if (formattedDisk instanceof ProdosFormatDisk || formattedDisk instanceof PascalFormatDisk) { + formattedDisk.setDiskName(diskName); + return 0; + } else { + LOG.warning("Disk must be ProDOS or Pascal."); + return 1; + } + } +} diff --git a/app/ac-acx/src/main/java/io/github/applecommander/acx/command/RenameFileCommand.java b/app/ac-acx/src/main/java/io/github/applecommander/acx/command/RenameFileCommand.java new file mode 100644 index 0000000..be99144 --- /dev/null +++ b/app/ac-acx/src/main/java/io/github/applecommander/acx/command/RenameFileCommand.java @@ -0,0 +1,67 @@ +package io.github.applecommander.acx.command; + +import java.util.List; +import java.util.logging.Logger; +import java.util.stream.Collectors; + +import io.github.applecommander.acx.base.ReadWriteDiskCommandOptions; +import io.github.applecommander.filestreamer.FileStreamer; +import io.github.applecommander.filestreamer.FileTuple; +import io.github.applecommander.filestreamer.TypeOfFile; +import picocli.CommandLine.Command; +import picocli.CommandLine.Option; +import picocli.CommandLine.Parameters; + +@Command(name = "rename", description = "Rename file on a disk image.", + aliases = { "ren" }) +public class RenameFileCommand extends ReadWriteDiskCommandOptions { + private static Logger LOG = Logger.getLogger(RenameFileCommand.class.getName()); + + @Option(names = { "-m", "--multiple" }, description = "Force rename when multiple files found.") + private boolean multipleOverride; + + @Option(names = { "-f", "--force" }, description = "Rename locked files.") + private boolean lockOverride; + + @Parameters(index = "0", description = "Original file name (include path).") + private String originalFilename; + + @Parameters(index = "1", description = "New file name (just the new filename).") + private String newFilename; + + @Override + public int handleCommand() throws Exception { + List files = FileStreamer.forDisk(disk) + .ignoreErrors(true) + .includeTypeOfFile(TypeOfFile.FILE) + .matchGlobs(originalFilename) + .stream() + .collect(Collectors.toList()); + + if (files.isEmpty()) { + LOG.warning(() -> String.format("File not found for %s.", originalFilename)); + } + else if (!multipleOverride && files.size() > 1) { + LOG.severe(() -> String.format("Multile files with %s found (count = %d).", + originalFilename, files.size())); + } + else { + files.forEach(this::fileHandler); + } + return 0; + } + + public void fileHandler(FileTuple tuple) { + if (tuple.fileEntry.isLocked()) { + if (lockOverride) { + LOG.info(() -> String.format("File '%s' is locked, but 'force' specified; ignoring lock.", + tuple.fileEntry.getFilename())); + } else { + LOG.warning(() -> String.format("File '%s' is locked.", tuple.fileEntry.getFilename())); + return; + } + } + tuple.fileEntry.setFilename(newFilename); + LOG.info(() -> String.format("File '%s' renamed to '%s'.", originalFilename, newFilename)); + } +} diff --git a/app/ac-acx/src/main/java/io/github/applecommander/acx/command/RmdirCommand.java b/app/ac-acx/src/main/java/io/github/applecommander/acx/command/RmdirCommand.java new file mode 100644 index 0000000..ccb3327 --- /dev/null +++ b/app/ac-acx/src/main/java/io/github/applecommander/acx/command/RmdirCommand.java @@ -0,0 +1,79 @@ +package io.github.applecommander.acx.command; + +import java.util.Optional; + +import com.webcodepro.applecommander.storage.DirectoryEntry; +import com.webcodepro.applecommander.storage.DiskException; +import com.webcodepro.applecommander.storage.FileEntry; +import com.webcodepro.applecommander.storage.FormattedDisk; + +import io.github.applecommander.acx.base.ReadWriteDiskCommandOptions; +import picocli.CommandLine.Command; +import picocli.CommandLine.Option; +import picocli.CommandLine.Parameters; + +@Command(name = "rmdir", description = "Remove a directory on disk.", + aliases = { "rd" }) +public class RmdirCommand extends ReadWriteDiskCommandOptions { + @Option(names = { "-r", "--recursive" }, description = "Recursively delete subdirectories.") + private boolean recursiveFlag; + + @Option(names = { "-f", "--force" }, description = "Force files to be deleted as well.") + private boolean forceFlag; + + @Parameters(description = "Directory name to delete (use '/' as divider).") + private String fullPath; + + @Override + public int handleCommand() throws Exception { + FormattedDisk formattedDisk = disk.getFormattedDisks()[0]; + + // Locate directory + DirectoryEntry directory = formattedDisk; + String[] paths = fullPath.split("/"); + for (int i=0; i optEntry = directory.getFiles().stream() + .filter(entry -> entry.getFilename().equalsIgnoreCase(pathName)) + .findFirst(); + + if (optEntry.isPresent()) { + FileEntry fileEntry = optEntry.get(); + if (fileEntry instanceof DirectoryEntry) { + directory = (DirectoryEntry)fileEntry; + } + else { + throw new RuntimeException(String.format("Not a directory: '%s'", pathName)); + } + } + else { + throw new RuntimeException(String.format("Directory does not exist: '%s'", pathName)); + } + } + + deleteDirectory(directory); + return 0; + } + + public void deleteDirectory(DirectoryEntry directory) throws DiskException { + for (FileEntry file : directory.getFiles()) { + if (file.isDeleted()) { + // skip + } else if (recursiveFlag && file.isDirectory()) { + deleteDirectory((DirectoryEntry)file); + } + else if (forceFlag && !file.isDirectory()) { + file.delete(); + } + else { + String message = String.format("Encountered %s '%s'", + file.isDirectory() ? "directory" : "file", + file.getFilename()); + throw new RuntimeException(message); + } + } + + FileEntry file = (FileEntry)directory; + file.delete(); + } +} diff --git a/app/ac-acx/src/main/java/io/github/applecommander/acx/command/UnlockCommand.java b/app/ac-acx/src/main/java/io/github/applecommander/acx/command/UnlockCommand.java new file mode 100644 index 0000000..950e330 --- /dev/null +++ b/app/ac-acx/src/main/java/io/github/applecommander/acx/command/UnlockCommand.java @@ -0,0 +1,17 @@ +package io.github.applecommander.acx.command; + +import java.util.logging.Logger; + +import io.github.applecommander.acx.base.ReadWriteDiskCommandWithGlobOptions; +import io.github.applecommander.filestreamer.FileTuple; +import picocli.CommandLine.Command; + +@Command(name = "unlock", description = "Unlock file(s) on a disk image.") +public class UnlockCommand extends ReadWriteDiskCommandWithGlobOptions { + private static Logger LOG = Logger.getLogger(UnlockCommand.class.getName()); + + public void fileHandler(FileTuple tuple) { + tuple.fileEntry.setLocked(false); + LOG.info(() -> String.format("File '%s' unlocked.", tuple.fileEntry.getFilename())); + } +} diff --git a/app/ac-acx/src/main/java/io/github/applecommander/acx/converter/DataSizeConverter.java b/app/ac-acx/src/main/java/io/github/applecommander/acx/converter/DataSizeConverter.java new file mode 100644 index 0000000..345db90 --- /dev/null +++ b/app/ac-acx/src/main/java/io/github/applecommander/acx/converter/DataSizeConverter.java @@ -0,0 +1,48 @@ +package io.github.applecommander.acx.converter; + +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import picocli.CommandLine.ITypeConverter; +import picocli.CommandLine.TypeConversionException; + +public class DataSizeConverter implements ITypeConverter { + public static final int KB = 1024; + public static final int MB = KB * 1024; + + @Override + public Integer convert(String value) throws Exception { + Pattern pattern = Pattern.compile("([0-9]+)([km]b?)?", Pattern.CASE_INSENSITIVE); + Matcher matcher = pattern.matcher(value); + if (matcher.matches()) { + String number = matcher.group(1); + String kmb = matcher.group(2); + if (kmb != null) { + kmb = kmb.toLowerCase(); + } + int bytes = Integer.parseInt(number); + if (kmb.startsWith("k")) { + bytes *= KB; + } + else if (kmb.startsWith("m")) { + bytes *= MB; + } + else { + throw new TypeConversionException(String.format("Unexpected data size '%s'", kmb)); + } + return bytes; + } + throw new TypeConversionException("Expecting format like '140kb' or '5mb'"); + } + + public static String format(int value) { + if (value < KB) { + return String.format("%,dB", value); + } + if (value < MB) { + return String.format("%,dKB", value / KB); + } + return String.format("%,dMB", value / MB); + } + +} diff --git a/app/ac-acx/src/main/java/io/github/applecommander/acx/converter/DiskConverter.java b/app/ac-acx/src/main/java/io/github/applecommander/acx/converter/DiskConverter.java new file mode 100644 index 0000000..2002f12 --- /dev/null +++ b/app/ac-acx/src/main/java/io/github/applecommander/acx/converter/DiskConverter.java @@ -0,0 +1,19 @@ +package io.github.applecommander.acx.converter; + +import java.nio.file.Files; +import java.nio.file.Path; + +import com.webcodepro.applecommander.storage.Disk; + +import picocli.CommandLine.ITypeConverter; +import picocli.CommandLine.TypeConversionException; + +public class DiskConverter implements ITypeConverter { + @Override + public Disk convert(String filename) throws Exception { + if (Files.exists(Path.of(filename))) { + return new Disk(filename); + } + throw new TypeConversionException(String.format("Disk '%s' not found", filename)); + } +} diff --git a/app/ac-acx/src/main/java/io/github/applecommander/acx/converter/IntegerTypeConverter.java b/app/ac-acx/src/main/java/io/github/applecommander/acx/converter/IntegerTypeConverter.java new file mode 100644 index 0000000..b828911 --- /dev/null +++ b/app/ac-acx/src/main/java/io/github/applecommander/acx/converter/IntegerTypeConverter.java @@ -0,0 +1,19 @@ +package io.github.applecommander.acx.converter; + +import picocli.CommandLine.ITypeConverter; + +/** Add support for "$801" and "0x801" instead of just decimal like 2049. */ +public class IntegerTypeConverter implements ITypeConverter { + @Override + public Integer convert(String value) { + if (value == null) { + return null; + } else if (value.startsWith("$")) { + return Integer.valueOf(value.substring(1), 16); + } else if (value.startsWith("0x") || value.startsWith("0X")) { + return Integer.valueOf(value.substring(2), 16); + } else { + return Integer.valueOf(value); + } + } +} \ No newline at end of file diff --git a/app/ac-acx/src/main/java/io/github/applecommander/acx/converter/SystemTypeConverter.java b/app/ac-acx/src/main/java/io/github/applecommander/acx/converter/SystemTypeConverter.java new file mode 100644 index 0000000..306b41c --- /dev/null +++ b/app/ac-acx/src/main/java/io/github/applecommander/acx/converter/SystemTypeConverter.java @@ -0,0 +1,11 @@ +package io.github.applecommander.acx.converter; + +import io.github.applecommander.acx.SystemType; +import picocli.CommandLine.ITypeConverter; + +public class SystemTypeConverter implements ITypeConverter { + @Override + public SystemType convert(String value) throws Exception { + return SystemType.valueOf(value.replaceAll("[^a-zA-Z]", "").toUpperCase()); + } +} \ No newline at end of file diff --git a/app/ac-acx/src/main/java/io/github/applecommander/acx/fileutil/DosFileEntryReaderWriter.java b/app/ac-acx/src/main/java/io/github/applecommander/acx/fileutil/DosFileEntryReaderWriter.java new file mode 100644 index 0000000..bcaa160 --- /dev/null +++ b/app/ac-acx/src/main/java/io/github/applecommander/acx/fileutil/DosFileEntryReaderWriter.java @@ -0,0 +1,113 @@ +package io.github.applecommander.acx.fileutil; + +import java.util.Map; +import java.util.Optional; + +import com.webcodepro.applecommander.storage.DiskFullException; +import com.webcodepro.applecommander.storage.os.dos33.DosFileEntry; +import com.webcodepro.applecommander.storage.os.dos33.DosFormatDisk; +import com.webcodepro.applecommander.util.AppleUtil; + +public class DosFileEntryReaderWriter implements FileEntryReader, FileEntryWriter { + private static final Map FILE_TYPES; + static { + FILE_TYPES = Map.of( + "T", "TXT", + "I", "INT", + "A", "BAS", + "B", "BIN", + "S", "$F1", + "R", "REL", + "a", "$F2", + "b", "$F3" + ); + } + + private DosFileEntry fileEntry; + + public DosFileEntryReaderWriter(DosFileEntry fileEntry) { + if (fileEntry.isDeleted()) { + throw new RuntimeException("Unable to copy deleted files."); + } + this.fileEntry = fileEntry; + } + + @Override + public Optional getFilename() { + return Optional.of(fileEntry.getFilename()); + } + @Override + public void setFilename(String filename) { + fileEntry.setFilename(filename); + } + + @Override + public Optional getProdosFiletype() { + return Optional.ofNullable(FILE_TYPES.get(fileEntry.getFiletype())); + } + @Override + public void setProdosFiletype(String filetype) { + String dosFileType = FILE_TYPES.entrySet() + .stream() + .filter(e -> e.getValue().equals(filetype)) + .map(Map.Entry::getKey) + .findFirst() + .orElse("B"); + fileEntry.setFiletype(dosFileType); + } + + @Override + public Optional isLocked() { + return Optional.of(fileEntry.isLocked()); + } + @Override + public void setLocked(boolean flag) { + fileEntry.setLocked(flag); + } + + @Override + public Optional getFileData() { + return Optional.ofNullable(fileEntry.getFileData()); + } + @Override + public void setFileData(byte[] data) { + try { + fileEntry.setFileData(data); + } catch (DiskFullException e) { + throw new RuntimeException(e); + } + } + + @Override + public Optional getBinaryAddress() { + if (fileEntry.isBinaryFile()) { + byte[] rawdata = getRawFileData(); + return Optional.of(AppleUtil.getWordValue(rawdata, 0)); + } + return Optional.empty(); + } + @Override + public void setBinaryAddress(int address) { + if (fileEntry.needsAddress()) { + fileEntry.setAddress(address); + } + } + + @Override + public Optional getBinaryLength() { + if (fileEntry.isBinaryFile() || fileEntry.isApplesoftBasicFile() || fileEntry.isIntegerBasicFile()) { + // DosFileEntry pulls the address + return Optional.of(fileEntry.getSize()); + } + return Optional.empty(); + } + @Override + public void setBinaryLength(int length) { + // Nothing to do + } + + private byte[] getRawFileData() { + DosFormatDisk disk = (DosFormatDisk) fileEntry.getFormattedDisk(); + return disk.getFileData(fileEntry); + } +} diff --git a/app/ac-acx/src/main/java/io/github/applecommander/acx/fileutil/FileEntryReader.java b/app/ac-acx/src/main/java/io/github/applecommander/acx/fileutil/FileEntryReader.java new file mode 100644 index 0000000..ff584f8 --- /dev/null +++ b/app/ac-acx/src/main/java/io/github/applecommander/acx/fileutil/FileEntryReader.java @@ -0,0 +1,54 @@ +package io.github.applecommander.acx.fileutil; + +import java.util.Date; +import java.util.Optional; + +import com.webcodepro.applecommander.storage.FileEntry; +import com.webcodepro.applecommander.storage.os.dos33.DosFileEntry; +import com.webcodepro.applecommander.storage.os.nakedos.NakedosFileEntry; +import com.webcodepro.applecommander.storage.os.pascal.PascalFileEntry; +import com.webcodepro.applecommander.storage.os.prodos.ProdosFileEntry; +import com.webcodepro.applecommander.storage.os.rdos.RdosFileEntry; + +public interface FileEntryReader { + // FileEntry common + public default Optional getFilename() { return Optional.empty(); } + public default Optional getProdosFiletype() { return Optional.empty(); } + public default Optional isLocked() { return Optional.empty(); } + public default Optional getFileData() { return Optional.empty(); } + public default Optional getResourceData() { return Optional.empty(); } + /** + * The address embedded in binary objects. + * This varies by DOS's so is split apart. + */ + public default Optional getBinaryAddress() { return Optional.empty(); } + /** + * The length embedded in binary, Applesoft, Integer BASIC objects. + * This varies by DOS's so is split apart. + */ + public default Optional getBinaryLength() { return Optional.empty(); } + // ProdosFileEntry specific + public default Optional getAuxiliaryType() { return Optional.empty(); } + public default Optional getCreationDate() { return Optional.empty(); } + // ProdosFileEntry / PascalFileEntry specific + public default Optional getLastModificationDate() { return Optional.empty(); } + + public static FileEntryReader get(FileEntry fileEntry) { + if (fileEntry instanceof DosFileEntry) { + return new DosFileEntryReaderWriter((DosFileEntry)fileEntry); + } + else if (fileEntry instanceof NakedosFileEntry) { + return new NakedosFileEntryReader((NakedosFileEntry)fileEntry); + } + else if (fileEntry instanceof PascalFileEntry) { + return new PascalFileEntryReaderWriter((PascalFileEntry)fileEntry); + } + else if (fileEntry instanceof ProdosFileEntry) { + return new ProdosFileEntryReaderWriter((ProdosFileEntry)fileEntry); + } + else if (fileEntry instanceof RdosFileEntry) { + return new RdosFileEntryReader((RdosFileEntry)fileEntry); + } + throw new RuntimeException(String.format("No reader for %s", fileEntry.getClass().getName())); + } +} diff --git a/app/ac-acx/src/main/java/io/github/applecommander/acx/fileutil/FileEntryWriter.java b/app/ac-acx/src/main/java/io/github/applecommander/acx/fileutil/FileEntryWriter.java new file mode 100644 index 0000000..9590a03 --- /dev/null +++ b/app/ac-acx/src/main/java/io/github/applecommander/acx/fileutil/FileEntryWriter.java @@ -0,0 +1,46 @@ +package io.github.applecommander.acx.fileutil; + +import java.util.Date; + +import com.webcodepro.applecommander.storage.FileEntry; +import com.webcodepro.applecommander.storage.os.dos33.DosFileEntry; +import com.webcodepro.applecommander.storage.os.pascal.PascalFileEntry; +import com.webcodepro.applecommander.storage.os.prodos.ProdosFileEntry; + +public interface FileEntryWriter { + // FileEntry common + public default void setFilename(String filename) { } + public default void setProdosFiletype(String filetype) { } + public default void setLocked(boolean flag) { } + public default void setFileData(byte[] data) { } + // Special case for GS/OS files (uglifies API; sets 0x05) + public default void setFileData(byte[] data, byte[] resource) { } + /** + * The address embedded in binary objects. + * This varies by DOS's so is split apart. + */ + public default void setBinaryAddress(int address) { } + /** + * The length embedded in binary, Applesoft, Integer BASIC objects. + * This varies by DOS's so is split apart. + */ + public default void setBinaryLength(int length) { } + // ProdosFileEntry specific + public default void setAuxiliaryType(int auxType) { } + public default void setCreationDate(Date date) { } + // ProdosFileEntry / PascalFileEntry specific + public default void setLastModificationDate(Date date) { } + + public static FileEntryWriter get(FileEntry fileEntry) { + if (fileEntry instanceof DosFileEntry) { + return new DosFileEntryReaderWriter((DosFileEntry)fileEntry); + } + else if (fileEntry instanceof ProdosFileEntry) { + return new ProdosFileEntryReaderWriter((ProdosFileEntry)fileEntry); + } + else if (fileEntry instanceof PascalFileEntry) { + return new PascalFileEntryReaderWriter((PascalFileEntry)fileEntry); + } + throw new RuntimeException(String.format("No writer for %s", fileEntry.getClass().getName())); + } +} diff --git a/app/ac-acx/src/main/java/io/github/applecommander/acx/fileutil/FileUtils.java b/app/ac-acx/src/main/java/io/github/applecommander/acx/fileutil/FileUtils.java new file mode 100644 index 0000000..67af8c3 --- /dev/null +++ b/app/ac-acx/src/main/java/io/github/applecommander/acx/fileutil/FileUtils.java @@ -0,0 +1,101 @@ +package io.github.applecommander.acx.fileutil; + +import java.util.Optional; +import java.util.logging.Logger; + +import com.webcodepro.applecommander.storage.DirectoryEntry; +import com.webcodepro.applecommander.storage.DiskException; +import com.webcodepro.applecommander.storage.FileEntry; + +import io.github.applecommander.acx.command.CopyFileCommand; + +public class FileUtils { + private static Logger LOG = Logger.getLogger(CopyFileCommand.class.getName()); + + private boolean overwrite; + + public FileUtils(boolean overwrite) { + this.overwrite = overwrite; + } + + public void copy(DirectoryEntry directory, FileEntry file) throws DiskException { + LOG.fine(() -> String.format("Copying '%s'", file.getFilename())); + if (file.isDeleted()) { + // Skip deleted files + } + else if (file.isDirectory()) { + copyDirectory(directory, (DirectoryEntry)file, file.getFilename()); + } + else { + copyFile(directory, file); + } + } + + void copyDirectory(DirectoryEntry targetParent, DirectoryEntry sourceDir, String name) throws DiskException { + Optional targetFile = targetParent.getFiles() + .stream() + .filter(fileEntry -> name.equals(fileEntry.getFilename())) + .findFirst(); + Optional targetDir = targetFile + .filter(FileEntry::isDirectory) + .map(DirectoryEntry.class::cast); + + if (targetDir.isPresent()) { + // Fall through to general logic + } + else if (targetFile.isPresent()) { + // This is an abstract class, so faking it for now. + throw new DiskException("Unable to create directory", name) { + private static final long serialVersionUID = 4726414295404986677L; + }; + } + else { + targetDir = Optional.of(targetParent.createDirectory(name)); + } + + for (FileEntry fileEntry : sourceDir.getFiles()) { + copy(targetDir.get(), fileEntry); + } + } + + void copyFile(DirectoryEntry directory, FileEntry sourceFile) throws DiskException { + FileEntryReader source = FileEntryReader.get(sourceFile); + copyFile(directory, source); + } + + public void copyFile(DirectoryEntry directory, FileEntryReader source) throws DiskException { + String sourceName = source.getFilename().get(); + String sanitizedName = directory.getFormattedDisk().getSuggestedFilename(sourceName); + final Optional fileEntry = directory.getFiles().stream() + .filter(entry -> entry.getFilename().equals(sanitizedName)) + .findFirst(); + + final FileEntry targetFile; + if (fileEntry.isPresent()) { + targetFile = fileEntry + .filter(entry -> overwrite) + .orElseThrow(() -> new RuntimeException(String.format("File '%s' exists.", + source.getFilename().get()))); + } + else { + targetFile = directory.createFile(); + } + + FileEntryWriter target = FileEntryWriter.get(targetFile); + + source.getFilename().ifPresent(target::setFilename); + source.getProdosFiletype().ifPresent(target::setProdosFiletype); + source.isLocked().ifPresent(target::setLocked); + source.getBinaryAddress().ifPresent(target::setBinaryAddress); + source.getBinaryLength().ifPresent(target::setBinaryLength); + source.getAuxiliaryType().ifPresent(target::setAuxiliaryType); + source.getCreationDate().ifPresent(target::setCreationDate); + source.getLastModificationDate().ifPresent(target::setLastModificationDate); + + if (source.getFileData().isPresent() && source.getResourceData().isPresent()) { + target.setFileData(source.getFileData().get(), source.getResourceData().get()); + } else { + source.getFileData().ifPresent(target::setFileData); + } + } +} diff --git a/app/ac-acx/src/main/java/io/github/applecommander/acx/fileutil/NakedosFileEntryReader.java b/app/ac-acx/src/main/java/io/github/applecommander/acx/fileutil/NakedosFileEntryReader.java new file mode 100644 index 0000000..14ba1db --- /dev/null +++ b/app/ac-acx/src/main/java/io/github/applecommander/acx/fileutil/NakedosFileEntryReader.java @@ -0,0 +1,22 @@ +package io.github.applecommander.acx.fileutil; + +import java.util.Optional; + +import com.webcodepro.applecommander.storage.os.nakedos.NakedosFileEntry; + +public class NakedosFileEntryReader implements FileEntryReader { + private NakedosFileEntry fileEntry; + + public NakedosFileEntryReader(NakedosFileEntry fileEntry) { + this.fileEntry = fileEntry; + } + + @Override + public Optional getFilename() { + return Optional.of(fileEntry.getFilename()); + } + @Override + public Optional getFileData() { + return Optional.of(fileEntry.getFileData()); + } +} diff --git a/app/ac-acx/src/main/java/io/github/applecommander/acx/fileutil/OverrideFileEntryReader.java b/app/ac-acx/src/main/java/io/github/applecommander/acx/fileutil/OverrideFileEntryReader.java new file mode 100644 index 0000000..c383f47 --- /dev/null +++ b/app/ac-acx/src/main/java/io/github/applecommander/acx/fileutil/OverrideFileEntryReader.java @@ -0,0 +1,188 @@ +package io.github.applecommander.acx.fileutil; + +import java.util.Arrays; +import java.util.Date; +import java.util.List; +import java.util.Objects; +import java.util.Optional; + +/** + * Allow programmatic control of what is in the results of the file entry. + * Useful for translating from raw data. + * It can also be used to layer in results and overrides. + */ +public class OverrideFileEntryReader implements FileEntryReader { + private Optional parent = Optional.empty(); + private Optional filename = Optional.empty(); + private Optional prodosFiletype = Optional.empty(); + private Optional locked = Optional.empty(); + private Optional fileData = Optional.empty(); + private Optional resourceData = Optional.empty(); + private Optional binaryAddress = Optional.empty(); + private Optional binaryLength = Optional.empty(); + private Optional auxiliaryType = Optional.empty(); + private Optional creationDate = Optional.empty(); + private Optional lastModificationDate = Optional.empty(); + + @Override + public Optional getFilename() { + return filename.or(() -> parent.map(FileEntryReader::getFilename).filter(Optional::isPresent).map(Optional::get)); + } + @Override + public Optional getProdosFiletype() { + return prodosFiletype.or(() -> parent.map(FileEntryReader::getProdosFiletype).filter(Optional::isPresent).map(Optional::get)); + } + @Override + public Optional isLocked() { + return locked.or(() -> parent.map(FileEntryReader::isLocked).filter(Optional::isPresent).map(Optional::get)); + } + @Override + public Optional getFileData() { + return fileData.or(() -> parent.map(FileEntryReader::getFileData).filter(Optional::isPresent).map(Optional::get)); + } + @Override + public Optional getResourceData() { + // Special case, the AppleCommander API does not really handle resource forks. + return resourceData; + } + @Override + public Optional getBinaryAddress() { + return binaryAddress.or(() -> parent.map(FileEntryReader::getBinaryAddress).filter(Optional::isPresent).map(Optional::get)); + } + @Override + public Optional getBinaryLength() { + return binaryLength.or(() -> parent.map(FileEntryReader::getBinaryLength).filter(Optional::isPresent).map(Optional::get)); + } + @Override + public Optional getAuxiliaryType() { + return auxiliaryType.or(() -> parent.map(FileEntryReader::getBinaryLength).filter(Optional::isPresent).map(Optional::get)); + } + @Override + public Optional getCreationDate() { + return creationDate.or(() -> parent.map(FileEntryReader::getCreationDate).filter(Optional::isPresent).map(Optional::get)); + } + @Override + public Optional getLastModificationDate() { + return lastModificationDate.or(() -> parent.map(FileEntryReader::getLastModificationDate).filter(Optional::isPresent).map(Optional::get)); + } + + public static Builder builder() { + return new Builder(); + } + + public static class Builder { + private OverrideFileEntryReader fileEntryReader = new OverrideFileEntryReader(); + + public FileEntryReader build(FileEntryReader parent) { + Objects.requireNonNull(parent); + fileEntryReader.parent = Optional.of(parent); + return fileEntryReader; + } + public List buildList(FileEntryReader parent) { + return Arrays.asList(build(parent)); + } + public FileEntryReader build() { + return fileEntryReader; + } + public List buildList() { + return Arrays.asList(build()); + } + + public Builder filename(String filename) { + Objects.requireNonNull(filename); + fileEntryReader.filename = Optional.of(filename); + return this; + } + public Builder filename(Optional filename) { + Objects.requireNonNull(filename); + fileEntryReader.filename = filename; + return this; + } + public Builder prodosFiletype(String filetype) { + Objects.requireNonNull(filetype); + fileEntryReader.prodosFiletype = Optional.of(filetype); + return this; + } + public Builder prodosFiletype(Optional filetype) { + Objects.requireNonNull(filetype); + fileEntryReader.prodosFiletype = filetype; + return this; + } + public Builder locked(boolean locked) { + fileEntryReader.locked = Optional.of(locked); + return this; + } + public Builder locked(Optional locked) { + Objects.requireNonNull(locked); + fileEntryReader.locked = locked; + return this; + } + public Builder fileData(byte[] fileData) { + Objects.requireNonNull(fileData); + fileEntryReader.fileData = Optional.of(fileData); + return this; + } + public Builder fileData(Optional fileData) { + Objects.requireNonNull(fileData); + fileEntryReader.fileData = fileData; + return this; + } + public Builder resourceData(byte[] resourceData) { + Objects.requireNonNull(resourceData); + fileEntryReader.resourceData = Optional.of(resourceData); + return this; + } + public Builder resourceData(Optional resourceData) { + Objects.requireNonNull(resourceData); + fileEntryReader.resourceData = resourceData; + return this; + } + public Builder binaryAddress(int binaryAddress) { + fileEntryReader.binaryAddress = Optional.of(binaryAddress); + return this; + } + public Builder binaryAddress(Optional binaryAddress) { + Objects.requireNonNull(binaryAddress); + fileEntryReader.binaryAddress = binaryAddress; + return this; + } + public Builder binaryLength(int binaryLength) { + fileEntryReader.binaryLength = Optional.of(binaryLength); + return this; + } + public Builder binaryLength(Optional binaryLength) { + Objects.requireNonNull(binaryLength); + fileEntryReader.binaryLength = binaryLength; + return this; + } + public Builder auxiliaryType(int auxiliaryType) { + fileEntryReader.auxiliaryType = Optional.of(auxiliaryType); + return this; + } + public Builder auxiliaryType(Optional auxiliaryType) { + Objects.requireNonNull(auxiliaryType); + fileEntryReader.auxiliaryType = auxiliaryType; + return this; + } + public Builder creationDate(Date creationDate) { + Objects.requireNonNull(creationDate); + fileEntryReader.creationDate = Optional.of(creationDate); + return this; + } + public Builder creationDate(Optional creationDate) { + Objects.requireNonNull(creationDate); + fileEntryReader.creationDate = creationDate; + return this; + } + public Builder lastModificationDate(Date lastModificationDate) { + Objects.requireNonNull(lastModificationDate); + fileEntryReader.lastModificationDate = Optional.of(lastModificationDate); + return this; + } + public Builder lastModificationDate(Optional lastModificationDate) { + Objects.requireNonNull(lastModificationDate); + fileEntryReader.lastModificationDate = lastModificationDate; + return this; + } + } +} diff --git a/app/ac-acx/src/main/java/io/github/applecommander/acx/fileutil/PascalFileEntryReaderWriter.java b/app/ac-acx/src/main/java/io/github/applecommander/acx/fileutil/PascalFileEntryReaderWriter.java new file mode 100644 index 0000000..22e3b72 --- /dev/null +++ b/app/ac-acx/src/main/java/io/github/applecommander/acx/fileutil/PascalFileEntryReaderWriter.java @@ -0,0 +1,82 @@ +package io.github.applecommander.acx.fileutil; + +import java.util.Date; +import java.util.Map; +import java.util.Optional; + +import com.webcodepro.applecommander.storage.DiskFullException; +import com.webcodepro.applecommander.storage.filters.PascalTextFileFilter; +import com.webcodepro.applecommander.storage.os.pascal.PascalFileEntry; + +public class PascalFileEntryReaderWriter implements FileEntryReader, FileEntryWriter { + private static final PascalTextFileFilter TEXT_FILTER = new PascalTextFileFilter(); + private static final Map FILE_TYPES; + static { + FILE_TYPES = Map.of( + // Pascal => Prodos + "xdskfile", "BAD", // TODO we should skip bad block files + "CODE", "BIN", // TODO is there an address? + "TEXT", "TXT", + "INFO", "TXT", // TODO We should skip debugger info + "DATA", "BIN", + "GRAF", "BIN", // TODO compressed graphics image + "FOTO", "BIN", // TODO screen image + "securedir", "BIN", // TODO is this even implemented + + // Prodos => Pascal + "BIN", "DATA", + "TXT", "TEXT" + ); + } + + private PascalFileEntry fileEntry; + + public PascalFileEntryReaderWriter(PascalFileEntry fileEntry) { + this.fileEntry = fileEntry; + } + + @Override + public Optional getFilename() { + return Optional.ofNullable(fileEntry.getFilename()); + } + @Override + public void setFilename(String filename) { + fileEntry.setFilename(filename); + } + + @Override + public Optional getProdosFiletype() { + return Optional.ofNullable(FILE_TYPES.get(fileEntry.getFiletype())); + } + @Override + public void setProdosFiletype(String filetype) { + fileEntry.setFiletype(FILE_TYPES.getOrDefault(filetype, "DATA")); + } + + @Override + public Optional getLastModificationDate() { + return Optional.ofNullable(fileEntry.getModificationDate()); + } + @Override + public void setLastModificationDate(Date date) { + fileEntry.setModificationDate(date); + } + + @Override + public Optional getFileData() { + if ("TEXT".equals(fileEntry.getFiletype())) { + return Optional.ofNullable(TEXT_FILTER.filter(fileEntry)); + } + else { + return Optional.ofNullable(fileEntry.getFileData()); + } + } + @Override + public void setFileData(byte[] data) { + try { + fileEntry.setFileData(data); + } catch (DiskFullException e) { + throw new RuntimeException(e); + } + } +} diff --git a/app/ac-acx/src/main/java/io/github/applecommander/acx/fileutil/ProdosFileEntryReaderWriter.java b/app/ac-acx/src/main/java/io/github/applecommander/acx/fileutil/ProdosFileEntryReaderWriter.java new file mode 100644 index 0000000..f3257ce --- /dev/null +++ b/app/ac-acx/src/main/java/io/github/applecommander/acx/fileutil/ProdosFileEntryReaderWriter.java @@ -0,0 +1,116 @@ +package io.github.applecommander.acx.fileutil; + +import java.util.Date; +import java.util.Optional; + +import com.webcodepro.applecommander.storage.DiskFullException; +import com.webcodepro.applecommander.storage.os.prodos.ProdosFileEntry; + +public class ProdosFileEntryReaderWriter implements FileEntryReader, FileEntryWriter { + private ProdosFileEntry fileEntry; + + public ProdosFileEntryReaderWriter(ProdosFileEntry fileEntry) { + this.fileEntry = fileEntry; + } + + @Override + public Optional getFilename() { + return Optional.ofNullable(fileEntry.getFilename()); + } + @Override + public void setFilename(String filename) { + fileEntry.setFilename(filename); + } + + @Override + public Optional getProdosFiletype() { + return Optional.ofNullable(fileEntry.getFiletype()); + } + @Override + public void setProdosFiletype(String filetype) { + fileEntry.setFiletype(filetype); + } + + @Override + public Optional isLocked() { + return Optional.ofNullable(fileEntry.isLocked()); + } + @Override + public void setLocked(boolean flag) { + fileEntry.setLocked(flag); + } + + @Override + public Optional getFileData() { + return Optional.ofNullable(fileEntry.getFileData()); + } + @Override + public void setFileData(byte[] data) { + try { + fileEntry.setFileData(data); + } catch (DiskFullException e) { + throw new RuntimeException(e); + } + } + @Override + public void setFileData(byte[] data, byte[] resource) { + try { + // If we have a resource fork in addition to a data fork, + // then we've got a GSOS storage type $5. + fileEntry.setFileData(data, resource); + fileEntry.setStorageType(0x05); + } catch (DiskFullException e) { + throw new RuntimeException(e); + } + } + + @Override + public Optional getBinaryAddress() { + if (fileEntry.needsAddress()) { + return Optional.ofNullable(fileEntry.getAuxiliaryType()); + } + return Optional.empty(); + } + @Override + public void setBinaryAddress(int address) { + if (fileEntry.needsAddress()) { + fileEntry.setAddress(address); + } + } + + @Override + public Optional getBinaryLength() { + return Optional.ofNullable(fileEntry.getSize()); + } + @Override + public void setBinaryLength(int length) { + // Nothing to do + } + + @Override + public Optional getAuxiliaryType() { + return Optional.ofNullable(fileEntry.getAuxiliaryType()); + } + @Override + public void setAuxiliaryType(int auxType) { + fileEntry.setAuxiliaryType(auxType); + } + + @Override + public Optional getCreationDate() { + return Optional.ofNullable(fileEntry.getCreationDate()); + } + @Override + public void setCreationDate(Date date) { + fileEntry.setCreationDate(date); + } + + @Override + public Optional getLastModificationDate() { + return Optional.ofNullable(fileEntry.getLastModificationDate()); + } + @Override + public void setLastModificationDate(Date date) { + fileEntry.setLastModificationDate(date); + } +} diff --git a/app/ac-acx/src/main/java/io/github/applecommander/acx/fileutil/RdosFileEntryReader.java b/app/ac-acx/src/main/java/io/github/applecommander/acx/fileutil/RdosFileEntryReader.java new file mode 100644 index 0000000..13aff19 --- /dev/null +++ b/app/ac-acx/src/main/java/io/github/applecommander/acx/fileutil/RdosFileEntryReader.java @@ -0,0 +1,43 @@ +package io.github.applecommander.acx.fileutil; + +import java.util.Map; +import java.util.Optional; + +import com.webcodepro.applecommander.storage.os.rdos.RdosFileEntry; + +public class RdosFileEntryReader implements FileEntryReader { + private static final Map FILE_TYPES; + static { + FILE_TYPES = Map.of( + "T", "TXT", + "A", "BAS", + "B", "BIN" + ); + } + + private RdosFileEntry fileEntry; + + public RdosFileEntryReader(RdosFileEntry fileEntry) { + this.fileEntry = fileEntry; + } + + @Override + public Optional getFilename() { + return Optional.ofNullable(fileEntry.getFilename()); + } + + @Override + public Optional getBinaryAddress() { + return Optional.ofNullable(fileEntry.getAddress()); + } + + @Override + public Optional getProdosFiletype() { + return Optional.ofNullable(FILE_TYPES.get(fileEntry.getFiletype())); + } + + @Override + public Optional getFileData() { + return Optional.ofNullable(fileEntry.getFileData()); + } +} diff --git a/app/ac-acx/src/main/java/io/github/applecommander/filestreamer/FileStreamer.java b/app/ac-acx/src/main/java/io/github/applecommander/filestreamer/FileStreamer.java new file mode 100644 index 0000000..089a4a8 --- /dev/null +++ b/app/ac-acx/src/main/java/io/github/applecommander/filestreamer/FileStreamer.java @@ -0,0 +1,205 @@ +package io.github.applecommander.filestreamer; + +import java.io.File; +import java.io.IOException; +import java.nio.file.FileSystem; +import java.nio.file.FileSystems; +import java.nio.file.Path; +import java.nio.file.PathMatcher; +import java.nio.file.Paths; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Iterator; +import java.util.LinkedList; +import java.util.List; +import java.util.NoSuchElementException; +import java.util.Spliterators; +import java.util.function.Consumer; +import java.util.function.Predicate; +import java.util.stream.Stream; +import java.util.stream.StreamSupport; + +import com.webcodepro.applecommander.storage.Disk; +import com.webcodepro.applecommander.storage.DiskException; +import com.webcodepro.applecommander.storage.DiskUnrecognizedException; +import com.webcodepro.applecommander.storage.FileEntry; +import com.webcodepro.applecommander.storage.FormattedDisk; + +/** + * FileStreamer is utility class that will (optionally) recurse through all directories and + * feed a Java Stream of useful directory walking detail (disk, directory, file, and the + * textual path to get there). + *

+ * Sample usage: + *

+ * FileStreamer.forDisk(image)
+ *             .ignoreErrors(true)
+ *             .stream()
+ *             .filter(this::fileFilter)
+ *             .forEach(fileHandler);
+ * 
+ * + * @author rob + */ +public class FileStreamer { + private static final Consumer NOOP_CONSUMER = d -> {}; + + public static FileStreamer forDisk(File file) throws IOException, DiskUnrecognizedException { + return forDisk(file.getPath()); + } + public static FileStreamer forDisk(String fileName) throws IOException, DiskUnrecognizedException { + return new FileStreamer(new Disk(fileName)); + } + public static FileStreamer forDisk(Disk disk) throws DiskUnrecognizedException { + return new FileStreamer(disk); + } + + private FormattedDisk[] formattedDisks = null; + + // Processor flags (used in gathering) + private boolean ignoreErrorsFlag = false; + private boolean recursiveFlag = true; + + // Processor events + private Consumer beforeDisk = NOOP_CONSUMER; + private Consumer afterDisk = NOOP_CONSUMER; + + // Filters + private Predicate filters = this::deletedFileFilter; + private boolean includeDeletedFlag = false; + private List pathMatchers = new ArrayList<>(); + + private FileStreamer(Disk disk) throws DiskUnrecognizedException { + this.formattedDisks = disk.getFormattedDisks(); + } + + public FileStreamer ignoreErrors(boolean flag) { + this.ignoreErrorsFlag = flag; + return this; + } + public FileStreamer recursive(boolean flag) { + this.recursiveFlag = flag; + return this; + } + public FileStreamer matchGlobs(List globs) { + if (globs != null && !globs.isEmpty()) { + FileSystem fs = FileSystems.getDefault(); + for (String glob : globs) { + pathMatchers.add(fs.getPathMatcher("glob:" + glob)); + } + this.filters = filters.and(this::globFilter); + } + return this; + } + public FileStreamer matchGlobs(String... globs) { + return matchGlobs(Arrays.asList(globs)); + } + public FileStreamer includeTypeOfFile(TypeOfFile type) { + this.filters = filters.and(type.predicate); + return this; + } + public FileStreamer includeDeleted(boolean flag) { + this.includeDeletedFlag = flag; + return this; + } + public FileStreamer beforeDisk(Consumer consumer) { + this.beforeDisk = consumer; + return this; + } + public FileStreamer afterDisk(Consumer consumer) { + this.afterDisk = consumer; + return this; + } + + public Stream stream() { + return StreamSupport.stream(Spliterators.spliteratorUnknownSize(iterator(), 0), false) + .filter(filters); + } + public Iterator iterator() { + return new FileTupleIterator(); + } + + protected boolean deletedFileFilter(FileTuple tuple) { + return includeDeletedFlag || !tuple.fileEntry.isDeleted(); + } + protected boolean globFilter(FileTuple tuple) { + if (tuple.fileEntry.isDirectory()) { + // If we don't match directories, no files can be listed. + return true; + } + // This may cause issues, but Path is a "real" filesystem construct, so the delimiters + // vary by OS (likely just "/" and "\"). However, Java also erases them to some degree, + // so using "/" (as used in ProDOS) will likely work out. + // Also note that we check the single file "PARMS.S" and full path "SOURCE/PARMS.S" since + // the user might have entered "*.S" or something like "SOURCE/PARMS.S". + FileSystem fs = FileSystems.getDefault(); + Path filePath = Paths.get(tuple.fileEntry.getFilename()); + Path fullPath = Paths.get(String.join(fs.getSeparator(), tuple.paths), + tuple.fileEntry.getFilename()); + for (PathMatcher pathMatcher : pathMatchers) { + if (pathMatcher.matches(filePath) || pathMatcher.matches(fullPath)) return true; + } + return false; + } + + private class FileTupleIterator implements Iterator { + private LinkedList files = new LinkedList<>(); + private FormattedDisk currentDisk; + + private FileTupleIterator() { + for (FormattedDisk formattedDisk : formattedDisks) { + files.addAll(toTupleList(FileTuple.of(formattedDisk))); + } + } + + @Override + public boolean hasNext() { + boolean hasNext = !files.isEmpty(); + if (hasNext) { + FileTuple tuple = files.peek(); + // Was there a disk switch? + if (tuple.formattedDisk != currentDisk) { + if (currentDisk != null) { + afterDisk.accept(currentDisk); + } + currentDisk = tuple.formattedDisk; + beforeDisk.accept(currentDisk); + } + } else { + if (currentDisk != null) { + afterDisk.accept(currentDisk); + } + currentDisk = null; + } + return hasNext; + } + + @Override + public FileTuple next() { + if (hasNext()) { + FileTuple tuple = files.removeFirst(); + if (recursiveFlag && tuple.fileEntry.isDirectory()) { + FileTuple newTuple = tuple.pushd(tuple.fileEntry); + files.addAll(0, toTupleList(newTuple)); + } + return tuple; + } else { + throw new NoSuchElementException(); + } + } + + private List toTupleList(FileTuple tuple) { + List list = new ArrayList<>(); + try { + for (FileEntry fileEntry : tuple.directoryEntry.getFiles()) { + list.add(tuple.of(fileEntry)); + } + } catch (DiskException e) { + if (!ignoreErrorsFlag) { + throw new RuntimeException(e); + } + } + return list; + } + } +} diff --git a/app/ac-acx/src/main/java/io/github/applecommander/filestreamer/FileTuple.java b/app/ac-acx/src/main/java/io/github/applecommander/filestreamer/FileTuple.java new file mode 100644 index 0000000..73cfab9 --- /dev/null +++ b/app/ac-acx/src/main/java/io/github/applecommander/filestreamer/FileTuple.java @@ -0,0 +1,42 @@ +package io.github.applecommander.filestreamer; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.logging.Logger; + +import com.webcodepro.applecommander.storage.DirectoryEntry; +import com.webcodepro.applecommander.storage.FileEntry; +import com.webcodepro.applecommander.storage.FormattedDisk; + +public class FileTuple { + private static final Logger LOG = Logger.getLogger(FileTuple.class.getName()); + public final FormattedDisk formattedDisk; + public final List paths; + public final DirectoryEntry directoryEntry; + public final FileEntry fileEntry; + + private FileTuple(FormattedDisk formattedDisk, + List paths, + DirectoryEntry directoryEntry, + FileEntry fileEntry) { + this.formattedDisk = formattedDisk; + this.paths = Collections.unmodifiableList(paths); + this.directoryEntry = directoryEntry; + this.fileEntry = fileEntry; + } + + public FileTuple pushd(FileEntry directoryEntry) { + LOG.fine("Adding directory " + directoryEntry.getFilename()); + List newPaths = new ArrayList<>(paths); + newPaths.add(directoryEntry.getFilename()); + return new FileTuple(formattedDisk, newPaths, (DirectoryEntry)directoryEntry, null); + } + public FileTuple of(FileEntry fileEntry) { + return new FileTuple(formattedDisk, paths, directoryEntry, fileEntry); + } + + public static FileTuple of(FormattedDisk disk) { + return new FileTuple(disk, new ArrayList(), (DirectoryEntry)disk, null); + } +} diff --git a/app/ac-acx/src/main/java/io/github/applecommander/filestreamer/TypeOfFile.java b/app/ac-acx/src/main/java/io/github/applecommander/filestreamer/TypeOfFile.java new file mode 100644 index 0000000..ce85c99 --- /dev/null +++ b/app/ac-acx/src/main/java/io/github/applecommander/filestreamer/TypeOfFile.java @@ -0,0 +1,15 @@ +package io.github.applecommander.filestreamer; + +import java.util.function.Predicate; + +public enum TypeOfFile { + FILE(tuple -> !tuple.fileEntry.isDirectory()), + DIRECTORY(tuple -> tuple.fileEntry.isDirectory()), + BOTH(tuple -> true); + + public final Predicate predicate; + + private TypeOfFile(Predicate predicate) { + this.predicate = predicate; + } +} \ No newline at end of file diff --git a/app/ac-acx/src/main/java/io/github/applecommander/filters/AppleSingleFileFilter.java b/app/ac-acx/src/main/java/io/github/applecommander/filters/AppleSingleFileFilter.java new file mode 100644 index 0000000..c3cc63f --- /dev/null +++ b/app/ac-acx/src/main/java/io/github/applecommander/filters/AppleSingleFileFilter.java @@ -0,0 +1,84 @@ +package io.github.applecommander.filters; + +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.UncheckedIOException; + +import com.webcodepro.applecommander.storage.FileEntry; +import com.webcodepro.applecommander.storage.FileFilter; +import com.webcodepro.applecommander.storage.os.dos33.DosFileEntry; +import com.webcodepro.applecommander.storage.os.prodos.ProdosFileEntry; + +import io.github.applecommander.applesingle.AppleSingle; + +/** + * A FileFilter to write each file to an independent AppleSingle file. + */ +public class AppleSingleFileFilter implements FileFilter { + @Override + public byte[] filter(FileEntry fileEntry) { + try { + AppleSingle.Builder builder = AppleSingle.builder() + .dataFork(fileEntry.getFileData()) + .realName(fileEntry.getFilename()); + if (fileEntry instanceof ProdosFileEntry) { + handleProDOS(builder, (ProdosFileEntry)fileEntry); + } + else if (fileEntry instanceof DosFileEntry) { + handleDOS(builder, (DosFileEntry)fileEntry); + } + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + builder.build().save(baos); + return baos.toByteArray(); + } catch (IOException e) { + throw new UncheckedIOException(e); + } + } + protected void handleProDOS(AppleSingle.Builder builder, ProdosFileEntry prodos) { + // We can't get the "access" byte so reconstructing it... + int access = (prodos.canDestroy() ? 0x80 : 0x00) + | (prodos.canRename() ? 0x40 : 0x00) + | (prodos.canWrite() ? 0x02 : 0x00) + | (prodos.canRead() ? 0x01 : 0x00); + builder.access(access); + builder.auxType(prodos.getAuxiliaryType()); + builder.creationDate(prodos.getCreationDate().toInstant()); + builder.fileType(prodos.getFiletypeByte()); + builder.modificationDate(prodos.getLastModificationDate().toInstant()); + } + protected void handleDOS(AppleSingle.Builder builder, DosFileEntry dos) { + switch (dos.getFiletype()) { + // 0x00 T + case "T": + builder.fileType(0x04); // TXT + break; + // 0x01 I + case "I": + builder.fileType(0xfa); // INT + break; + // 0x02 A + case "A": + builder.fileType(0xfc); // BAS + break; + // 0x04 B + case "B": + builder.fileType(0x06); // BIN + //builder.auxType(???) // FIXME address is not exposed? + break; + // The rest we just default + default: + builder.fileType(0xf1); // $F1 (???) + break; + } + builder.access(dos.isLocked() ? 0x01 : 0xc3); + } + + @Override + public String getSuggestedFileName(FileEntry fileEntry) { + String fileName = fileEntry.getFilename().trim(); + if (!fileName.toLowerCase().endsWith(".as")) { + fileName = fileName + ".as"; + } + return fileName; + } +} diff --git a/app/ac-acx/src/main/java/io/github/applecommander/filters/RawFileFilter.java b/app/ac-acx/src/main/java/io/github/applecommander/filters/RawFileFilter.java new file mode 100644 index 0000000..ff4db0d --- /dev/null +++ b/app/ac-acx/src/main/java/io/github/applecommander/filters/RawFileFilter.java @@ -0,0 +1,25 @@ +package io.github.applecommander.filters; + +import com.webcodepro.applecommander.storage.FileEntry; +import com.webcodepro.applecommander.storage.FileFilter; + +/** + * A custom FileFilter to dump "raw" data from the disk. + * This filter uses the filename as given on the Disk with + * no additional extensions. + * + * @author rob + */ +public class RawFileFilter implements FileFilter { + + @Override + public byte[] filter(FileEntry fileEntry) { + return fileEntry.getFileData(); + } + + @Override + public String getSuggestedFileName(FileEntry fileEntry) { + return fileEntry.getFilename(); + } + +} diff --git a/app/ac-acx/src/test/java/io/github/applecommander/acx/converter/DataSizeConverterTest.java b/app/ac-acx/src/test/java/io/github/applecommander/acx/converter/DataSizeConverterTest.java new file mode 100644 index 0000000..345b5ce --- /dev/null +++ b/app/ac-acx/src/test/java/io/github/applecommander/acx/converter/DataSizeConverterTest.java @@ -0,0 +1,27 @@ +package io.github.applecommander.acx.converter; + +import static io.github.applecommander.acx.converter.DataSizeConverter.KB; +import static io.github.applecommander.acx.converter.DataSizeConverter.MB; +import static org.junit.Assert.assertEquals; + +import org.junit.Test; + +public class DataSizeConverterTest { + @Test + public void testFormat() { + assertEquals("1B", DataSizeConverter.format(1)); + assertEquals("100B", DataSizeConverter.format(100)); + assertEquals("2KB", DataSizeConverter.format(2*KB)); + assertEquals("140KB", DataSizeConverter.format(140*KB)); + assertEquals("800KB", DataSizeConverter.format(800*KB)); + assertEquals("5MB", DataSizeConverter.format(5*MB)); + } + + @Test + public void testConvert() throws Exception { + DataSizeConverter converter = new DataSizeConverter(); + assertEquals(140*KB, (int)converter.convert("140kb")); + assertEquals(800*KB, (int)converter.convert("800KB")); + assertEquals(5*MB, (int)converter.convert("5Mb")); + } +} diff --git a/app/ac-acx/src/test/java/io/github/applecommander/filestreamer/FileStreamerTest.java b/app/ac-acx/src/test/java/io/github/applecommander/filestreamer/FileStreamerTest.java new file mode 100644 index 0000000..36f6ebb --- /dev/null +++ b/app/ac-acx/src/test/java/io/github/applecommander/filestreamer/FileStreamerTest.java @@ -0,0 +1,85 @@ +package io.github.applecommander.filestreamer; + +import static org.junit.Assert.assertEquals; + +import java.io.IOException; +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; + +import com.webcodepro.applecommander.storage.DiskUnrecognizedException; + +import org.junit.Test; + +public class FileStreamerTest { + private static final List EXPECTED_MERLIN = Arrays.asList( + "PRODOS", "MERLIN.SYSTEM", "PARMS", "ED", "ED.16", + "SOURCEROR", "SOURCEROR/OBJ", "SOURCEROR/LABELS", "SOURCEROR/LABELS.S", + "LIBRARY", "LIBRARY/SENDMSG.S", "LIBRARY/PRDEC.S", "LIBRARY/FPMACROS.S", + "LIBRARY/MACROS.S", "LIBRARY/ROCKWELL.S", + "SOURCE", "SOURCE/PARMS.S", "SOURCE/EDMAC.S", "SOURCE/KEYMAC.S", + "SOURCE/PRINTFILER.S", "SOURCE/MAKE.DUMP.S", "SOURCE/CLOCK.S", + "SOURCE/PI.START.S", "SOURCE/PI.MAIN.S", "SOURCE/PI.LOOK.S", + "SOURCE/PI.DIV.S", "SOURCE/PI.ADD.S", "SOURCE/PI.MACS.S", + "SOURCE/PI.NAMES.S", + "UTILITIES", "UTILITIES/REMOVE.ED", "UTILITIES/EDMAC", "UTILITIES/CLOCK.12.ED", + "UTILITIES/XREF", "UTILITIES/XREFA", "UTILITIES/FORMATTER", + "UTILITIES/PRINTFILER", "UTILITIES/MON.65C02", "UTILITIES/MAKE.DUMP", + "UTILITIES/CONV.REL.LNK", "UTILITIES/CONV.LNK.REL", + "UTILITIES/CLR.HI.BIT", "UTILITIES/KEYMAC", + "PI", "PI/NAMES", "PI/START", "PI/MAIN", "PI/LOOK", "PI/DIV", "PI/ADD", "PI/OBJ" + ); + private static final List EXPECTED_UNIDOS = Arrays.asList( + "HELLO", "FORMATTER", "FORMATTER.OBJ", "MFID", "FUD", // Disk #1 + "HELLO", "MFID", "FUD" // Disk #2 + ); + + @Test + public void testRecursiveListMerlin() throws DiskUnrecognizedException, IOException { + List actual = + FileStreamer.forDisk("./src/test/resources/disks/MERLIN8PRO1.DSK") + .recursive(true) + .stream() + .map(this::makeFullPath) + .collect(Collectors.toList()); + + assertEquals(EXPECTED_MERLIN, actual); + } + + @Test + public void testNonRecursiveListMerlin() throws DiskUnrecognizedException, IOException { + List actual = + FileStreamer.forDisk("./src/test/resources/disks/MERLIN8PRO1.DSK") + .recursive(false) + .stream() + .map(this::makeFullPath) + .collect(Collectors.toList()); + + List expected = EXPECTED_MERLIN.stream() + .filter(s -> !s.contains("/")) + .collect(Collectors.toList()); + + assertEquals(expected, actual); + } + + @Test + public void testListUnidos() throws DiskUnrecognizedException, IOException { + List actual = + FileStreamer.forDisk("./src/test/resources/disks/UniDOS_3.3.dsk") + .recursive(true) + .stream() + .map(this::makeFullPath) + .collect(Collectors.toList()); + + assertEquals(EXPECTED_UNIDOS, actual); + } + + + private String makeFullPath(FileTuple tuple) { + if (tuple.paths == null || tuple.paths.isEmpty()) { + return tuple.fileEntry.getFilename(); + } else { + return String.join("/", String.join("/", tuple.paths), tuple.fileEntry.getFilename()); + } + } +} diff --git a/app/ac-acx/src/test/java/io/github/applecommander/filestreamer/FileTupleTest.java b/app/ac-acx/src/test/java/io/github/applecommander/filestreamer/FileTupleTest.java new file mode 100644 index 0000000..ff34ad0 --- /dev/null +++ b/app/ac-acx/src/test/java/io/github/applecommander/filestreamer/FileTupleTest.java @@ -0,0 +1,31 @@ +package io.github.applecommander.filestreamer; + +import static org.junit.Assert.assertEquals; + +import java.io.IOException; +import java.util.Arrays; + +import com.webcodepro.applecommander.storage.Disk; +import com.webcodepro.applecommander.storage.DiskException; +import com.webcodepro.applecommander.storage.FileEntry; +import com.webcodepro.applecommander.storage.FormattedDisk; + +import org.junit.Test; + +public class FileTupleTest { + @Test + public void test() throws IOException, DiskException { + Disk disk = new Disk("./src/test/resources/disks/MERLIN8PRO1.DSK"); + FormattedDisk formattedDisk = disk.getFormattedDisks()[0]; + FileTuple tuple = FileTuple.of(formattedDisk); + FileEntry sourcerorDir = tuple.formattedDisk.getFile("SOURCEROR"); + tuple = tuple.pushd(sourcerorDir); + FileEntry labelsSource = tuple.directoryEntry.getFiles().get(2); + tuple = tuple.of(labelsSource); + + assertEquals(Arrays.asList("SOURCEROR"), tuple.paths); + assertEquals(formattedDisk, tuple.formattedDisk); + assertEquals(sourcerorDir, tuple.directoryEntry); + assertEquals(labelsSource, tuple.fileEntry); + } +} diff --git a/app/ac-acx/src/test/resources/disks/MERLIN8PRO1.DSK b/app/ac-acx/src/test/resources/disks/MERLIN8PRO1.DSK new file mode 100644 index 0000000000000000000000000000000000000000..4131b05ccfab2cd33f01ce0f6269bbe16ab0152c GIT binary patch literal 143360 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 Jog4lPyaN5W_ecN$ literal 0 HcmV?d00001 diff --git a/app/ac-acx/src/test/resources/disks/UniDOS_3.3.dsk b/app/ac-acx/src/test/resources/disks/UniDOS_3.3.dsk new file mode 100644 index 0000000000000000000000000000000000000000..02e4acf14903220e74623f70b92dfd7af036c01f GIT binary patch literal 819200 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%0DC(Ges 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 z3ZMWApa2S>01BW03ZMWApa2S>01BW03ZMWApa2S>01BW03ZMWApa2S>01BW03ZMWA zpa2S>01BW03ZMWApa2S>01BW03ZMWApa2S>01BW03ZMWApa2S>01BW03ZMWApa2S> z01BW03ZMWApa2S>01BW03ZMWApa2S>01BW03ZMWApa2S>01BW03ZMWApa2S>01BW0 z3ZMWApa2S>01BW03ZMWApa2S>01BW03ZMWApa2S>01BW03ZMWApa2S>01BW03ZMWA zpa2S>01BW03ZMWApa2S>01BW03ZMWApa2S>01BW03ZMWApa2S>01BW03ZMWApa2S> z01BW03ZMWApa2S>01BW03ZMWApa2S>01BW03ZMWApa2S>01BW03ZMWApa2S>01BW0 z3ZMWApa2S>01BW03ZMWApa2S>01BW03ZMWApa2S>01BW03ZMWApa2S>01BW03ZMWA zpa2S>01BW03ZMWApa2S>01BW03ZMWApa2S>01BW03ZMWApa2S>01BW03ZMWApa2S> z01BW03ZMWApa2S>01BW03ZMWApa2S>01BW03ZMWApa2S>01BW03ZMWApa2S>01BW0 z3ZMWApa2S>01BW03ZMWApa2S>01BW03ZMWApa2S>01BW03ZMWApa2S>01BW03ZMWA zpa2S>01BW03ZMWApa2S>01BW03ZMWApa2S>01BW03ZMWApa2S>01BW03ZMWApa2S> z01BW03ZMWApa2S>01BW03ZMWApa2S>01BW03ZMWApa2S>01BW03ZMWApa2S>01BW0 z3ZMWApa2S>01BW03ZMWApa2S>01BW03ZMWApa2S>01BW03ZMWApa2S>01BW03ZMWA zpa2S>01BW03ZMWApa2S>01BW03ZMWApa2S>01BW03ZMWApa2S>01BW03ZMWApa2S> z01BW03ZMWApa2S>01BW03ZMWApa2S>01BW03ZMWApa2S>01BW03ZMWApa2S>01BW0 z3ZMWApa2S>01BW03ZMWApa2S>01BW03ZMWApa2S>01BW03ZMWApa2S>01BW03ZMWA zpa2S>01BW03ZMWApa2S>01BW03ZMWApa2S>01BW03ZMWApa2S>01BW03ZMWApa2S> z01BW03ZMWApa2S>01BW03ZMWApa2S>01BW03ZMWApa2S>01BW03ZMWApa2S>01BW0 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 z009U<00Izz00bZa0SG_<0uX=z1Rwwb2tWV=5P$##AOHafKmY;|fB*y_009U<00Izz z00bZa0SG_<0uX=z1Rwwb2tWV=5P$##AOHafKmY;|fB*y_009U<00Izz00bZa0SG_< z0uX=z1Rwwb2tWV=5P$##AOHafKmY;|fB*y_009U<00Izz00bZa0SG_<0uX=z1Rwwb z2tWV=5P$##AOHafKmY;|fB*y_009U<00Izz00bZa0SG_<0uX=z1Rwwb2tWV=5P$## zAOHafKmY;|fB*y_009U<00Izz00bZa0SG_<0uX=z1Rwwb2tWV=5P$##AOHafKmY;| zfB*y_009U<00Izz00bZa0SG_<0uX=z1Rwwb2tWV=5P$##AOHafKmY;|fB*y_009U< z00Izz00bZa0SG_<0uX=z1Rwwb2tWV=5P$##AOHafKmY;|fB*y_009U<00Izz00bZa z0SG_<0uX=z1Rwwb2tWV=5P$##AOHafKmY;|fB*y_009U<00Izz00bZa0SG_<0uX=z z1Rwwb2tWV=5P$##AOHafKmY;|fB*y_009U<00Izz00bZa0SG_<0uX=z1Rwwb2tWV= z5P$##AOHafKmY;|fB*y_009U<00Izz00bZa0SG_<0uX=z1Rwwb2tWV=5P$##AOHaf zKmY;|fB*y_009U<00Izz00bZa0SG_<0uX=z1Rwwb2tWV=5P$##AOHafKmY;|fB*y_ z009U<00Izz00bZa0SG_<0uX=z1Rwwb2tWV=5P$##AOHafKmY;|fB*y_009U<00Izz z00bZa0SG_<0uX=z1Rwwb2tWV=5P$##AOHafKmY;|fB*y_009U<00Izz00bZa0SG_< z0uX=z1Rwwb2tWV=5P$##AOHafKmY;|fB*y_009U<00Izz00bZa0SG_<0uX=z1Rwwb z2tWV=5P$##AOHafKmY;|fB*y_009U<00Izz00bZa0SG_<0uX=z1Rwwb2tWV=5P$## zAOHafKmY;|fB*y_009U<00Izz00bZa0SG_<0uX=z1Rwwb2tWV=5P$##AOHafKmY;| zfB*y_009U<00Izz00bZa0SG_<0uX=z1Rwwb2tWV=5P$##AOHafKmY;|fB*y_009U< z00Izz00bZa0SG_<0uX=z1Rwwb2tWV=5P$##AOHafKmY;|fB*y_009U<00Izz00bZa z0SG_<0uX=z1Rwwb2tWV=5P$##AOHafKmY;|fB*y_009U<00Izz00bZa0SG_<0uX=z U1Rwwb2tWV=5P$##{{9006Y< Date: Mon, 3 Jan 2022 18:52:58 -0600 Subject: [PATCH 2/2] Renaming app projects. --- .../src/test/resources/disks/MERLIN8PRO1.DSK | Bin 143360 -> 0 bytes .../src/test/resources/disks/UniDOS_3.3.dsk | Bin 819200 -> 0 bytes app/{ac-cli => cli-ac}/build.gradle | 0 .../webcodepro/applecommander/ui/AntTask.java | 0 .../com/webcodepro/applecommander/ui/ac.java | 0 .../applecommander/util/AppleSingleTest.java | 0 .../src/test/resources/hello.applesingle.bin | Bin app/{ac-acx => cli-acx}/README.md | 0 app/{ac-acx => cli-acx}/build.gradle | 0 .../gradle/wrapper/gradle-wrapper.jar | Bin .../gradle/wrapper/gradle-wrapper.properties | 0 .../io/github/applecommander/acx/Main.java | 0 .../acx/PrintExceptionMessageHandler.java | 0 .../github/applecommander/acx/SystemType.java | 0 .../applecommander/acx/VersionProvider.java | 0 .../base/ReadOnlyDiskImageCommandOptions.java | 0 .../acx/base/ReadWriteDiskCommandOptions.java | 0 .../ReadWriteDiskCommandWithGlobOptions.java | 0 .../acx/base/ReusableCommandOptions.java | 0 .../acx/command/ConvertCommand.java | 0 .../acx/command/CopyFileCommand.java | 0 .../acx/command/CreateDiskCommand.java | 0 .../acx/command/DeleteCommand.java | 0 .../acx/command/DiskMapCommand.java | 0 .../acx/command/ExportCommand.java | 0 .../acx/command/ImportCommand.java | 0 .../acx/command/InfoCommand.java | 0 .../acx/command/ListCommand.java | 0 .../acx/command/LockCommand.java | 0 .../acx/command/MkdirCommand.java | 0 .../acx/command/RenameDiskCommand.java | 0 .../acx/command/RenameFileCommand.java | 0 .../acx/command/RmdirCommand.java | 0 .../acx/command/UnlockCommand.java | 0 .../acx/converter/DataSizeConverter.java | 0 .../acx/converter/DiskConverter.java | 0 .../acx/converter/IntegerTypeConverter.java | 0 .../acx/converter/SystemTypeConverter.java | 0 .../acx/fileutil/DosFileEntryReaderWriter.java | 0 .../acx/fileutil/FileEntryReader.java | 0 .../acx/fileutil/FileEntryWriter.java | 0 .../applecommander/acx/fileutil/FileUtils.java | 0 .../acx/fileutil/NakedosFileEntryReader.java | 0 .../acx/fileutil/OverrideFileEntryReader.java | 0 .../fileutil/PascalFileEntryReaderWriter.java | 0 .../fileutil/ProdosFileEntryReaderWriter.java | 0 .../acx/fileutil/RdosFileEntryReader.java | 0 .../filestreamer/FileStreamer.java | 0 .../applecommander/filestreamer/FileTuple.java | 0 .../filestreamer/TypeOfFile.java | 0 .../filters/AppleSingleFileFilter.java | 0 .../applecommander/filters/RawFileFilter.java | 0 .../acx/converter/DataSizeConverterTest.java | 0 .../filestreamer/FileStreamerTest.java | 0 .../filestreamer/FileTupleTest.java | 0 app/{ac-swing => gui-swing}/build.gradle | 0 .../applecommander/ui/swing/DiskExplorer.java | 0 .../ui/swing/EmulatorFileFilter.java | 0 .../ui/swing/SwingAppleCommander.java | 0 .../build.gradle | 0 .../build.gradle | 0 .../build.gradle | 0 .../build.gradle | 0 .../build.gradle | 0 settings.gradle | 16 ++++++++-------- 65 files changed, 8 insertions(+), 8 deletions(-) delete mode 100644 app/ac-acx/src/test/resources/disks/MERLIN8PRO1.DSK delete mode 100644 app/ac-acx/src/test/resources/disks/UniDOS_3.3.dsk rename app/{ac-cli => cli-ac}/build.gradle (100%) rename app/{ac-cli => cli-ac}/src/main/java/com/webcodepro/applecommander/ui/AntTask.java (100%) rename app/{ac-cli => cli-ac}/src/main/java/com/webcodepro/applecommander/ui/ac.java (100%) rename app/{ac-cli => cli-ac}/src/test/java/com/webcodepro/applecommander/util/AppleSingleTest.java (100%) rename app/{ac-cli => cli-ac}/src/test/resources/hello.applesingle.bin (100%) rename app/{ac-acx => cli-acx}/README.md (100%) rename app/{ac-acx => cli-acx}/build.gradle (100%) rename app/{ac-acx => cli-acx}/gradle/wrapper/gradle-wrapper.jar (100%) rename app/{ac-acx => cli-acx}/gradle/wrapper/gradle-wrapper.properties (100%) rename app/{ac-acx => cli-acx}/src/main/java/io/github/applecommander/acx/Main.java (100%) rename app/{ac-acx => cli-acx}/src/main/java/io/github/applecommander/acx/PrintExceptionMessageHandler.java (100%) rename app/{ac-acx => cli-acx}/src/main/java/io/github/applecommander/acx/SystemType.java (100%) rename app/{ac-acx => cli-acx}/src/main/java/io/github/applecommander/acx/VersionProvider.java (100%) rename app/{ac-acx => cli-acx}/src/main/java/io/github/applecommander/acx/base/ReadOnlyDiskImageCommandOptions.java (100%) rename app/{ac-acx => cli-acx}/src/main/java/io/github/applecommander/acx/base/ReadWriteDiskCommandOptions.java (100%) rename app/{ac-acx => cli-acx}/src/main/java/io/github/applecommander/acx/base/ReadWriteDiskCommandWithGlobOptions.java (100%) rename app/{ac-acx => cli-acx}/src/main/java/io/github/applecommander/acx/base/ReusableCommandOptions.java (100%) rename app/{ac-acx => cli-acx}/src/main/java/io/github/applecommander/acx/command/ConvertCommand.java (100%) rename app/{ac-acx => cli-acx}/src/main/java/io/github/applecommander/acx/command/CopyFileCommand.java (100%) rename app/{ac-acx => cli-acx}/src/main/java/io/github/applecommander/acx/command/CreateDiskCommand.java (100%) rename app/{ac-acx => cli-acx}/src/main/java/io/github/applecommander/acx/command/DeleteCommand.java (100%) rename app/{ac-acx => cli-acx}/src/main/java/io/github/applecommander/acx/command/DiskMapCommand.java (100%) rename app/{ac-acx => cli-acx}/src/main/java/io/github/applecommander/acx/command/ExportCommand.java (100%) rename app/{ac-acx => cli-acx}/src/main/java/io/github/applecommander/acx/command/ImportCommand.java (100%) rename app/{ac-acx => cli-acx}/src/main/java/io/github/applecommander/acx/command/InfoCommand.java (100%) rename app/{ac-acx => cli-acx}/src/main/java/io/github/applecommander/acx/command/ListCommand.java (100%) rename app/{ac-acx => cli-acx}/src/main/java/io/github/applecommander/acx/command/LockCommand.java (100%) rename app/{ac-acx => cli-acx}/src/main/java/io/github/applecommander/acx/command/MkdirCommand.java (100%) rename app/{ac-acx => cli-acx}/src/main/java/io/github/applecommander/acx/command/RenameDiskCommand.java (100%) rename app/{ac-acx => cli-acx}/src/main/java/io/github/applecommander/acx/command/RenameFileCommand.java (100%) rename app/{ac-acx => cli-acx}/src/main/java/io/github/applecommander/acx/command/RmdirCommand.java (100%) rename app/{ac-acx => cli-acx}/src/main/java/io/github/applecommander/acx/command/UnlockCommand.java (100%) rename app/{ac-acx => cli-acx}/src/main/java/io/github/applecommander/acx/converter/DataSizeConverter.java (100%) rename app/{ac-acx => cli-acx}/src/main/java/io/github/applecommander/acx/converter/DiskConverter.java (100%) rename app/{ac-acx => cli-acx}/src/main/java/io/github/applecommander/acx/converter/IntegerTypeConverter.java (100%) rename app/{ac-acx => cli-acx}/src/main/java/io/github/applecommander/acx/converter/SystemTypeConverter.java (100%) rename app/{ac-acx => cli-acx}/src/main/java/io/github/applecommander/acx/fileutil/DosFileEntryReaderWriter.java (100%) rename app/{ac-acx => cli-acx}/src/main/java/io/github/applecommander/acx/fileutil/FileEntryReader.java (100%) rename app/{ac-acx => cli-acx}/src/main/java/io/github/applecommander/acx/fileutil/FileEntryWriter.java (100%) rename app/{ac-acx => cli-acx}/src/main/java/io/github/applecommander/acx/fileutil/FileUtils.java (100%) rename app/{ac-acx => cli-acx}/src/main/java/io/github/applecommander/acx/fileutil/NakedosFileEntryReader.java (100%) rename app/{ac-acx => cli-acx}/src/main/java/io/github/applecommander/acx/fileutil/OverrideFileEntryReader.java (100%) rename app/{ac-acx => cli-acx}/src/main/java/io/github/applecommander/acx/fileutil/PascalFileEntryReaderWriter.java (100%) rename app/{ac-acx => cli-acx}/src/main/java/io/github/applecommander/acx/fileutil/ProdosFileEntryReaderWriter.java (100%) rename app/{ac-acx => cli-acx}/src/main/java/io/github/applecommander/acx/fileutil/RdosFileEntryReader.java (100%) rename app/{ac-acx => cli-acx}/src/main/java/io/github/applecommander/filestreamer/FileStreamer.java (100%) rename app/{ac-acx => cli-acx}/src/main/java/io/github/applecommander/filestreamer/FileTuple.java (100%) rename app/{ac-acx => cli-acx}/src/main/java/io/github/applecommander/filestreamer/TypeOfFile.java (100%) rename app/{ac-acx => cli-acx}/src/main/java/io/github/applecommander/filters/AppleSingleFileFilter.java (100%) rename app/{ac-acx => cli-acx}/src/main/java/io/github/applecommander/filters/RawFileFilter.java (100%) rename app/{ac-acx => cli-acx}/src/test/java/io/github/applecommander/acx/converter/DataSizeConverterTest.java (100%) rename app/{ac-acx => cli-acx}/src/test/java/io/github/applecommander/filestreamer/FileStreamerTest.java (100%) rename app/{ac-acx => cli-acx}/src/test/java/io/github/applecommander/filestreamer/FileTupleTest.java (100%) rename app/{ac-swing => gui-swing}/build.gradle (100%) rename app/{ac-swing => gui-swing}/src/main/java/com/webcodepro/applecommander/ui/swing/DiskExplorer.java (100%) rename app/{ac-swing => gui-swing}/src/main/java/com/webcodepro/applecommander/ui/swing/EmulatorFileFilter.java (100%) rename app/{ac-swing => gui-swing}/src/main/java/com/webcodepro/applecommander/ui/swing/SwingAppleCommander.java (100%) rename app/{ac-swt-linux-aarch64 => gui-swt-linux-aarch64}/build.gradle (100%) rename app/{ac-swt-linux-x86_64 => gui-swt-linux-x86_64}/build.gradle (100%) rename app/{ac-swt-macosx-aarch64 => gui-swt-macosx-aarch64}/build.gradle (100%) rename app/{ac-swt-macosx-x86_64 => gui-swt-macosx-x86_64}/build.gradle (100%) rename app/{ac-swt-win32-x86_64 => gui-swt-win32-x86_64}/build.gradle (100%) diff --git a/app/ac-acx/src/test/resources/disks/MERLIN8PRO1.DSK b/app/ac-acx/src/test/resources/disks/MERLIN8PRO1.DSK deleted file mode 100644 index 4131b05ccfab2cd33f01ce0f6269bbe16ab0152c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 143360 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 Jog4lPyaN5W_ecN$ diff --git a/app/ac-acx/src/test/resources/disks/UniDOS_3.3.dsk b/app/ac-acx/src/test/resources/disks/UniDOS_3.3.dsk deleted file mode 100644 index 02e4acf14903220e74623f70b92dfd7af036c01f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 819200 zcmeF)30xFcz9|0cZkDFm8e6bY)FUwl6HQPv330NBf`O#nP_xWTlAfEG>12|b%uI4` z-n@5b978$8P)rkJgd}L$(nwV(Y{U+N>4Xx6R0qx2DYh1IeTabxu5!?lXe@|j-v8T+8~Hh-8L zF1=L?KSC$x)i-kYkXx^tUx#Oh=8H=K4MqcE( zZ7#jQlyXmfls`}Mx-G3G(o-KP`hJgF*7bkl78uxL`9&4?v73~Zkkby!zdLwS#e8|J zuXdb#k&myKUs&w+)lQTzSaz2ChKGd)>oidj27O47HX6?o)x)QMD91Dm0>K8 z?IJ(jmRluS$sfwg->-a+#BHs~d%sc$v#^zt$IW%SxzldC#q!6>5ud;NVcEIs?{5Eo zqyBZmcwD+9vo$HjDt+wczNv!5DOJ*Ccjhp6rpgNB`SX49w^nAn)-a)`iup*hRCA5d zd|Sm-F^rahHHb|!aEQt4t;)MtC1|)yRov++sk4eZUL|O`zA7P%J6lzDswyWJBG+)| zs@Bn3Qc6DDrG&zIUlmjWrtnfw;p;(UeU)SQy}UD3B(Vy7E!joFc!)+iRRsxahQqJN z2TSLwq~0pBZI=?P#sbHVRIsmTF7$95-L$4w@Z7L&rRNT-<#y~UANE?MuBx(=Rm5FY zcD5?V7|lnI#Hi&bH}_TLo~7q(K3*jsv^sowY1KfJUd=76zEqx8?HR0e==o5COVf~J zyu8l*GVDpOwnJ84UP!|>5AIK^woQ)?Y&Qr@*vK|3 z&p3kJ^WT|Yw6eOvctLtmgxpqEbDvdnQndkI+=^;x*vRdxmaZA6Co4M1CO-0_z`XeK zifVQNVT^ezsvW_emDL;OHyAIKuc)?uUt9jeB{-Ai!(D`_fmXkI3&iTz*)P~^P&PKv z;^)bc4`H8tE5}!ITPlSJuCiRn<=o{0;k4U@XwFk9+`J0HRW)YcWY9llQq3Q?qrSBRnyDB<_5VB7Ud|| zZVd7J>{>MrM-V?l&@|aZdyFewUD48&ASh9iS6QB`-45^8fZdTA>6&+XvRToj{D&0m ze6{&6WFHnjVbl4biVVP>_Avag3;E!Rj7Q9?7P1TN+U|!*({5f{k>QH&Wt6y5a&&i& ze5Js$Xg7d`mgeNZhJrweoZrnZuo%1$?|kT3(piXm^w=PQQNEb2fukg*lk0ZshD_1iJq}q-FJ@e8{mgwZ=hQvK}V%CyOl7bVa6M^ z@MDF(%_=>)o9o#9ea4*&%`Xskq4VJvbnL@c#=;cLESPY(DEIm`N{U~r-0u%k7N=OrPj=^>+bw7a zvzr^*?FxhSzH__fGjs=C_}XTZhIXg8#*=$J$|QIr?H(nLeo7ue3rE?*{C6mKqzJ2J zoxqs+$oveN3O*V>p_1`N_>9WWfF^x*x7wtwf>A!q>mi|^dwlTT=uvB@@CmeyJzR^2 zXQ~-bA+yIPU$m;h&a1&L{2HCenh(mb zk?KP^@+F~z>^dZf^i6`d0{$^sSIr!Ga`;QpGyRK_+lnBD+}a%ZjC0!QCmD5P`RgHp zt<}tzKKXPY9NB$HICed%GjwSf-r($TxYe9tgG1olwC8-RA^BT4^l9eE?esVQL0|ne zC<~tCC_jh5#&0t_}@Gsw<~j8p_#+|uLs$K zU%1x%dXRUTUF)3Yk8o*9Q%L{e>XLqCU3Yu%9inG- zZOI*0k>?#T4f56Qg)($-DZLt5v1*c&rjkh$6X@%e8PgIck1W5t@xAwpHf=81_FOR$b`b^*1{(-@vbLTHyynN-` z@2*}O=Gt3Z{B1JdSbvz`>i@K^sh;E8+V}DeO>#YK|8NHfyY}*>a(k;##%Kx(wYm?2 zfTdNB}~%$jreoa7(MXv;QU-Lxaqj zHG9_I?76-ncr;1>`JdYVlvAXPbQ4djJ;YJkLy)>7@B?iY)=uZh3Um`4N1&U4w|C*q znM&%9IMe9cL-Z{*JuUsAj7NeW40H^(Fp;z$f&O6hm@}|s9_b54f}T zAnp>(I3PM3{8~OfT6||CbR`KiQ~?CCHD3ynyOai-FfYlHaZI_-vi%sOI3vS(7ae?T zir#yd5+o4$I2~(Bt9O0nohffjvL}!uhxD$zBnPv08u|1Pq`*8ig$`k!oLVcn{g7P| zjIMqem!XFkCJuOmx8$0gPga+axh#(7|8%VyZuRG0|=D)?>X0`{@q^HodLyQmct7UC*I(h7f z>z9xf*Yn*EIUn*H?R|W7_Cso9g{5ER7_UH(KYtbYfzdAqB8Av*an4j?1*13Jnck~m z)BVA&7?>)+j$k;YJpob?2p8_0>5rDxjk$E=nG|dB%<9swl8*|*5dFS~j1A5-+2Blv z6L;-P-K_-!7xQ|4K!SnN?qLoDr z@$So6-buT?# z^wQ6Y4957t;r}*rxMQMcy;$^`*kHUURfyc<(8F$%Dn%tMgA|q6cqV@yR2%6TQ6`SN zJj*r}$vPTx`6g~im+9or>7=Yp+@MYfk%Ogw5tR_`84<1^t(HASa09?{RkXOPr0Alu zs3NQMsaUpGv|5&xo<41P@``2Eu;qzi`o3y-)iBw=Nm?c%vd%IMZUhw- zPZg~BNi;b+vZh4PL2gLRW>T|>`FLRPQgrA%%f$`%z$D&UUImd^Uf)~}r_=lQD6e_vD7QJZd0Ar94pEM8fQ5#w5UYWjC(gj#voU)7mg}_QhX0GTlP~C&Y5C;=^jSlEZ)s=_ZVW{(iG_k{^cun-M5@M=S3ZT1|2&@DeF8+biLtxPi5gQ4gc{zc1^JXya*i7b3g z^wr*PAA%M6+ax&}q7sbsmwLLpt@YW_$QLxEZB|v_Yx?c9qDzDss<@+)E<& zvPd4RlGOamlOcN-%byXYRpLa0@RUK2*OxylD*p=oBnZhz9EPLwAeRmDCFLW}BSP}S zkr2}=s1(nM^yCidIniJ!b*9T<&a}fT1$(YD{qPflJzRbR)*lz_TKT;6tSG-z@CXDd z{DtUDD|}wG^za$N>Of4k>3@ubl)Wm-y~+n9q{i~bX3!?(TcDMRp2<*&ClzH_p#nn5 zK_v@OD`6Sjf!v~80j-NLK=E;fHEs$+M?W?l?DhU)<^Ci~^A=c^LrT(|Fj}Pax{{~( z4X%mg+Ll#mqQI<5FNH<;S+^>UO)FTH&ZgU2Qmi3q)6%U;v;e*Ikbb|xuI~*^?)Dp9 zUps;zc!PW;7!I%mIh<*h4cFl9t!vWLBF)9qqIJfr;!+*)Z5Ccx^r{F|m2Lz7O2~Nz z-2JpcpJHj>CIl1F0e6CVrXYWwRS1Q8t%og^(+(j*z98v~IFDNjE8^gGa2ON?@zGsm ztApg0$lqFi^O3+;wxcOooVbm zvS1royp4?C1|`Dnc3VnI)T*Z3N^eQeCEuy%*uD*7qUlwW2I1lUq#BmI4SUFY+Y}?& zzD>D6#BItq^q9D3JEEDNnKF4ScbQfQit%z znV-60&Ze`-C2DZ;`(j!Fr)%Vpyx)qszY}3Y`ESLt--(vr6qBd6LhF9%w<7fG3UMAV z>MV^VaKE5qYl?Gw*Dp$)t}Yv#$!RP81w;?GALtHCS3{|DQP<~m$LGZju!H;5odM^z zS?agt?sezZxnToL26wxGO}*1Ded^}wC<@(I?}oOs_9M6f5AKjmC^?$&TOi?z0!Pxc zBtar7iXo}yRlg7mR@uC-x?W*j?2Bu+uYIB97sWOLX@`Vciy%#EI7rr6t0+1bo&C9J zPcN;1)ILvnF#Geh4S99$+f+kx}m3sWNJr}`EwDrmr7O< z_E_oTfyR<1NY!{~#CiWBJ_4$noG^^NCKj!y!(A7LAv zkFrfKJyt~GMmNLqssrpC_K>CZAXycqF11IKX->8CrcDzTH86nE#pkx!L!e4p?sh^g zp~V-Xm|$r6m009)!-)k0q#6LN!aS%QO0e`it)thV50WB_ATL5Vt?(PS3L)?*?Qz2n zt2$gOcS6=b68TAFBku_FREb5eiZIv5znrxlVWEfKk$qO?@x+#*zUsMK=Q^<&t&FDlyH!7Mp)1LNkLq zThKEqT~_GqUC+b70tNGZeSvC1w=Wh#=%5CTG8&qKplgC*tXT+#l=(aD+Ub9U@d*Ya zC9DBDudvlHgu)n|K}#d5L?8 zLqd$B1qr!Mj?NL`U?S@PMUCC!VMz}wQSt(l9rE=ql3VWuU$ zZK0gGxP3l7(R_Nw`Ea_&(z7xb9%iPz!oRWwe#yvxRwgloyqXx27<9|)iLWHTGVhgn ztLLrOGkPY7fn{dO{~*7C|6Vyz-`3dr>E1ej%RFM#2Wd66yq#g-SsR4YFrn}}{72^d z-{Htm&XT(L;gzWmr<27?R*=-kQZp^7^DW*i*qTn#v$B@7()^{9rCCc>q%T;JUZ1`= zjVxJ6(o$FKrI}CNzHoLOOulLnQNn8pR`_p+J zRKlR-2@}dcsC>i~370hfT3Kg#rqc4eN`Wcr*(qp>PVIzHBy9%-Df(UTr>r2#i&1yV>w zl0K9!xRdVy4tBouiJM&jsU-H=g?W)3Zmz=(2U^~#5LR=WD%DBfCYk|AF>u1Hd{bpWJ`hzP zcl4A4{U_b>h5jzLWrB1)Jj}}eXC*yUEtR6~op6_P-_DOe+nL+yhTNOU)7xFQLmBcB zxgS(k%uf!7OKM-m{8AfvQ!4wQ(&v*;Np0@3b~mi2xb~B8x5Eij$k81FJOnOMU_x=l zO6wafFj^9ETu~)FX@(z1xMzDMJVk~n$J%u1LKT}v=F{!)Lrcr`6by)Jx|HR~kMKO? z&8X$Y0ysj=COr5yxZpnJmFjIY7WEl7)FL(wDiI7(^8-)4dwP2KiI6u4(F0==jXrsY zeVc2O<=8HPgRRX)m9m~hToqy=VOCx%Fd1+GR9tBvbGf(@hPCuw81QT_Fd3GI%Wdit z?i}NnR-)eyBcj(0U+LHnBjijOMmu#|^?o;eS%Ge_lF2nNNq)i=_#(sJN~oP@Dxux= zRXS3j745F1um{=()Fi9a;ZBClkB)5q za)p)ecbB!gE$;1bV|2cv7ipD%HQMO}DO!4?a0jo=pP!KfeFA(y^M_7=50;Km9_cH1 zw~4k=0TL-_^4i?FP=B&qaA$Ttcf@Ue`3pC9%nea;N8K-f>E^z2gDxaoW65%reeRYT z-MI?=I!5^cciBOhGHDM>U6*td7U_Hnsx%6e8%JPpZWkdPLJ7q{4 zkmYTx%q@VzfRjSh>8|pPm1VH5g<~YINOQhVgcDfv)URN`_dNVsIV4gQ8~t92bkWWA zR!NuOi!fEv*KTgGN;=`@hUoW8daB?S5!@((Z*@SuhKU!{{xelBja52d#fSQdqUVGB zMn%i(3+UHrPP&^q-7p2}ayK1!E6+p!MHi2{?Fq0Eb{=ut$IvZbx$VZlmSb*v2sBLl zL6{z$be}!qHoOo~3IzjSHj4hf2=1=1kP7aA3VF~?j%rTcljB2-Y4$zK6lw!citX%ZmqjV*7zEG z-EvG{k6Vs_2e3^4Y5H|22-xS&J?pmicSF`_$D@Oe$68kBF0XfI&tJQszm9IIhfRAS zKsn6%LYqHzH^Ze7?XWIxhu#o+;(DmL09pjY4tL0H?my(FJ;So=J;UVWM4o{*UNQgZ zzMZncS35}_g3b)e6k7S0t`^9byqCTWj0A(ejRraofl{ny>4VA_ZV@}r!>pDD+GzQ= zN~o{OlxD@9JkIP0dhi=J+%&K&{rxnt18zxy+Qx9-&}%&Cb1!Z;OJ^!y?yFS7ng%NE zV})V3qK7W|UP$t$N@(cj7igP@@TG9C#Svt#zED{N@rOYBFT7Bh(;)ZTJ59e<%R5Z90uMz6pZ zvtR_{psdf(bauIUqbPN|A93l{*`v%*`Y-pmVe7h=d)+Vos>}VWlkQ)2!(Es!&GcHX z&;2rdwX0hlThF>*hDc7j?P}36479UEXt9&v@@BjcB*zKC@))>d8f95gby_gUA#g=w zwrf)KFvi1GLI!+uEQx+~%o+pVYU|I9fQci#G=}He{d+%cYu)=P?``U6Y&pPx-sZ0l zikS@0F0YN;$o_{PzaQNb1M{!hWONo5i2ARdD*V%{G|qoI@PAUk(R|&kpW#IsMxzO4 zUK2r}fZ52rJ1U_aUHFHeOEsDp*m?DTTYLUt47dXYPyhu`00mG01yBG5Pyhu`00mG0 z1yBG5Pyhu`00mG01yBG5Pyhu`00mG01yBG5Pyhu`00mG01yBG5Pyhu`00mG01yBG5 zPyhu`00mG01yBG5Pyhu`00mG01yBG5Pyhu`00mG01yBG5Pyhu`00mG01yBG5Pyhu` z00mG01yBG5Pyhu`00mG01yBG5Pyhu`00mG01yBG5Pyhu`00mG01yBG5Pyhu`00mG0 z1yBG5Pyhu`00mG01yBG5Pyhu`00mG01yBG5Pyhu`00mG01yBG5Pyhu`00mG01yBG5 zPyhu`00mG01yBG5Pyhu`00mG01yBG5Pyhu`00mG01yBG5Pyhu`00mG01yBG5Pyhu` z00mG01yBG5Pyhu`00mG01yBG5Pyhu`00mG01yBG5Pyhu`00mG01yBG5Pyhu`00mG0 z1yBG5Pyhu`00mG01yBG5Pyhu`00mG01yBG5Pyhu`00mG01yBG5Pyhu`00mG01yBG5 zPyhu`00mG01yBG5Pyhu`00mG01yBG5Pyhu`00mG01yBG5Pyhu`00mG01yBG5Pyhu` z00mG01yBG5Pyhu`00mG01yBG5Pyhu`00mG01yBG5Pyhu`00mG01yBG5Pyhu`00mG0 z1yBG5Pyhu`00mG01yBG5Pyhu`00mG01yBG5Pyhu`00mG01yBG5Pyhu`00mG01yBG5 zPyhu`00mG01yBG5Pyhu`00mG01yBG5Pyhu`00mG01yBG5Pyhu`00mG01yBG5Pyhu` z00mG01yBG5Pyhu`00mG01yBG5Pyhu`00mG01yBG5Pyhu`00mG01yBG5Pyhu`00mG0 z1yBG5Pyhu`00mG01yBG5Pyhu`00mG01yBG5Pyhu`00mG01yBG5Pyhu`00mG01yBG5 zPyhu`00mG01yBG5Pyhu`00mG01yBG5Pyhu`00mG01yBG5Pyhu`00mG01yJCo5D1Ey ztYesK|GT{Yel$RwhGAwC2Hpd&;r|~m8pA_yybgZpC&NU;FEbey|Bt-_xwwhnW3CtF z&501By*cwen(G*7{x|b0Cg^6)J;THV-{koZxykb%dXwj0f0O4w>?Y5@;U>?2_)VVw zh?_kBkvDn%qi*v2N8jZ6H{Rs=kGaY7KjtRSzv(8=|Ja*6|FJiD{^M@){ExfI^KZV% z^B;ec=YRZ7p8p9qdHxe_^88P{$@4#HH2-5Jukm>s8(a8)^wKh>$!qqtv^MQ+Z}+zT z-B2OS*vZ+~gOs;?+VD5Qv`p;e?52JG`oGz8eZyEL4r1x}4?^%ad8-{QGyFsW6hHwK zKmim$0Te(16hHwKKmim$0Te(16hHwKKmim$0Te(16hHwK7!g>&+@&`#Z_eE~w@%q%gJN2?o3XcTSNa#OjeRLhcw z6CtAH{~nxUu74Hazej#B7bt)ND1ZVefC4Ch0w{n2D1ZVefC4Ch0w{n2D1ZVefC4Ch z0ym$);w39G(z8ff=JH2L(vx>Bo<5h5#2?T7Bz5XsDRrux_+(=JtYqe{h#(DpM!1Lh zQN$_TYUa_19^JdMXZcSgrB0px`Ruth5WE8LQvb^VLKYV;$y$`UVnycShwr@e&cwN{ zS;@)CbBmai@K&b!o_l7@nOl9&y))9%8)n_(OG?Y~&zjyaYjz5=DEtUhoigWc*yEdZ z-|V@$DRX8sb>ZEN^mWp`_oPhU-;!KklNcHrnmD%_Ld}{3e4FM{(!lvhdREqwtm~(n z>zH*fJZ~jrsUoN}4ridOc0s ztVCw6foIaPJ7y)%t*M)nJRKeke>m&zWTwO*GLBjIKzyO0 zkEdoW2Ee)S+!*o@c&*6DTuzoOP0vbQk-20sc|6l%flSlP{qO}9Fi`(87n9|dB`Zi` zT6*G)k-R6SWhKI6=Ptue#xWZbK-0c7YsrH2^t9{sb+LX_Bv5Pjw?MURN}URyi=q0a zBs1p>pD=25rt8T}e7Fx{n@!6@N=r(eE+^NgrOT;Ide~A%%33KWH;rsnRliQU``+Y~ zS<^p<3P4L*47b45Vtb9MWkyq_^B#PouB98;apWsHn{Tur&Z5sf#DdP zRT!r4#8B({;fBcCpeJ-z-SAVo|4M&dc`W|>e+FMDfC4Ch0w{n2D1ZVefCB%01-8|R z-V%PFli$b}@b$x$8!NhaUf_it8~yv8?W=j#)#2J->vdN0u8vK-!t-99h5x**b?fR& zd0#;V{i9_N!LIU+ybB`Ox$*y{6@N>0?f61jn`68vq;WxdLC*#2Eou6HHk#@;UHtltoZ7;;K>N zoAPcQ&+)B%&t}M_*w#@97(IM0&E-I4o9wM~z-o0(uZv&D=W6&$Wq-Xg!If`60J*TBI&u*f%5uzVxWZ|1!_*7>|FpWjxtkEcn1 z2=?&~QJ@j9O;D1n;kZBXP8SrelSZ(b|1*tX`wo_`;r(p$pW3{2?Jccsd`FwNp5vJM z7XENc2Y=At=HuI2_*SpnxVO&B``h`w&4&-}J-ml!{`}{T=DHU7@ZL`wz5G6ZqnBf7 z-s$UO<`Z~l4*L9cKK@`!M`OJjTciJTFC6G^KCrhD{_I^_V@vz>mHJly0WU-2Q{!rb zBzPOW?SYtKt!{7o-o}>CIHs|s?(@+gt==|oyBZH5t1)m)n@khh(#+TU+dk)*j^-N= zIN)vd@4J46{T=>xNHhcRE?yMXq>sMQzsm=q+x!qy)96O}DKb9{c;mhwEYk>Sep>yX z`P%u4>Z)pfuPlRAT}zYPLH}@|zqzg)BK&7xT%E6_rH$qde)sY1KEP>#zf*Y7-~1Wh zBDX_Q+o0%VP-&yZ#DDHRObf5BrMcbT+~MT`vAGWZvLTc(!;cpDzE&?Sxq66|W13q6 zw6M1kDulQG&rlBF$nWcDY#doU*y@L3ky~5Z)esy*%busoG+zJq7U&dOTUudpq@3yg z=Dkf`s4@QLwvK)K{B?eBb35PUZE9&%Q`p+kOe6fPb#D{L{IeX_iy@$T^h-7Ae7*O8 zx3NXO{&yMws$73iL^rG)3>;0<397BCu38%*Cm*+Z+dEpDKe@3bcn|s8K=rf0VKh)( zduyXq_sNZc1Kw&a;A$8~b%7Fx4fS3R!~L*j(Ab;ye(r^$Yk{(DRS$#a!U3AM6{>kl zM=R89wK(=R*8`YZ&a{-ThpG3{MD3+j;qM0IuQ%+yPyj&Q1l6YbGdN4EC-zkAaBOf~ zeB9Kyxp5E2WyL)k_h#Jf#-1EEFz(v8DDy0Hnt8E#x%ox&znR(V|7|w=%m>Y- z=6v%`bC-F@Jd#k_y!S8xVzq7VfhPTZ@^0L%1{w)7T3hx&{ZaExGu#Ghf&6~#ZL1q8 z2wEl-4b=S5NWIM+JQN(Q_yNC>>i?XKgdEd;ScWdGncvGd zd%w79Y127Oq{&d8V0zEN-yj8OntO7b<)n1XGXJ7 z!}CRrV%zpZJm3B%9XouqBj@=pQT?N#oeW>?&F0raXU}iv%V=NSNXG@ak#ByRx4U|L z#V(%T>xCo48rlhQHMJ*rp`73DXkjaMRPJR+4v>%pHawX@bcg zCQou0p}c0?YBJK)ChTo`uPKDdmL5?wUf?u!1`By7r z{PUD3haO^p*a$<6W2CGJT%k!?K7o7R#4`d@8?1!ZhA6tiWfOezAXj8E3%`H)u?gH` z6YRSF$0u0JicGcVE zsYTYF9(~EdFeg$@fqTyc`H+?;a37c;FOg=GtXFFZ z&scelLj#$EXg8Tkt!0}6oSDWM<4wjNayo{A65{dEk9dhvhowF?=Tg+7@#uCK<`vO0XiJn(Y5Nm_+qGfJ0KSN*&qvLao zS0rfB*UZvn6E|#@Hkim4R~-}JBvJugls2jx5@3V1AOq@-gUJyz<`?Zy%QB#XT~gxA zg68E7CT@etK1pC+e%HjkYqI<_if-L#;x?M>de~ZE;tEWMY(0HzK0rXp{CXAellA_~j zn^gPThX2IJ)I%;i%`qxAyDboo2(=@T2kw}gSlR`Gzz~*i8;J% zyliO5bC_~+OH6W?*_vXdonV>MRKC^J=P=1(o|PsDm?&#q(Tyc01wNqemYU4=*ubh@ zSPiQw@D!|;e$qbADwUfIrM~J0Q$`Mbv%=}8uU10TQng<1uhjfNSC*_7LPxr=(M{j? zZh>42A>TLBGSkSmh#L>G+28?QB6;FF7}FquP)JZZP$&f^wZ*Y9U^pSl*T}}p7o~UA z;^wA8EAXrs4|TN1S35~Q2Yszt#U;_C+yb?mR=j5AA*g(2|9&NGr1F_Yt2%8MQkltL z2c02g&?+0tH=7zf%f=^%0{n-j6suzr6q(vE%vOmvaa&E&783_Ut}g<30ht_%us<}T z)RcTrxx-XeVj>qK?03=iX|TU1uh^8Q2Fu+>L(=V0uI{pJ&=)}Y6r1d)mTFV1W~;!% zp}rg_OXW^4r-q$@s9Zh->sfoSM4fdU@g-5_7hkuPOW6?n&Ohp6$@x*p6;D$%9s#^?EJ-O?cU6Q!OKhkagj9=rC%+?fvA* zNJ%g$;WW^3;xbo@&t;95mdA6;$3t0dHd&>t@sZ2N%a9vbQv1&F&__vM zt9{oA+INlgn|yfgW|P@kAevv$aZb|<6S)!-ENwOcyMI{LS$-KYF>Ac~34`v-5jN39 zw|SP2=WaE5Ante?63*cH?f8|@JzQ}F(LDb8YD4lD&;e;36MGtxWr05m-PMI2Xcwbh z7o<}#aiWR#S{_9Y-Ixg7SV^E8D^rS!Xfu(6q2L9mO^ptdy}KcAiwR~`yoowYaYP1A z6sS~Vpi+%isFw|JlxT7U2ekd~%fU7qOv9YFW(XSgRSrs;~$7ciHuhMCgSr zKMtE7$`KQcQhyW14PkDfVVhJkmpZ(+^EB`A|DAI4yJ-<7n)8S7C^r z3`^D9O;Csq0*eLa7m`Hy^woyRC#c*M8dB}3pgA)5B?j#Bx3K}!}V$l-iY zzU*67A6&l0)zDkrlF48xyT# z=q>91`1SkI-NW!y;}#>MSv9)hZ$JMg>=uS0@kBUAl87MEw=?i&_T<%ia%-&_j|97l zxZ0z+wYFeahV68QEwE;F#K5GvyGGV_?@sB}$ck0!A#4@Dx_qe?M)1lR#conPnPg4w zu5?!Vjdq2P&aNz+2M>6zNWFy1(mLI}!KI{wzz;-wI!7KNd6QgsJF6ArKDX1|)J0l%|l>$@mHri4*#nj!%;bn)i~28bp(X)2jCF@e5bnK3PK z^2jn|m?t?(I@B2Bx0xOCxzp;BUz7*=#{-L!dgTOT3wJT;U*;H3mC8E< z!H&rvUO#q=*~%@~HZ9XCKZA+i3M~{IxAOGs8Pi|kmTI#r#8R74v^+QILPi6 zZec%xQ|u9za?7;DKGC@wE+l3X%k+tY$hyi;k)EElZV0dg(oEi-7$}I+K;aZ5|CTHu z#ctQLjorllQsXJ&dJgI;DVk{CFOchps11$QVY=fC#N)}S6&OPlobT+U#mlr-sM}DX zm3UggFF0$`cLZ0<{j^c^cJFZR@P1;o+4y04iZCG>?(fVH%rk_946<%wV1{q=o9&?) z0wMhqZSZT!yINX(b)r6OHN7B8N*=Nv9OU6{4Rlb#E%~yQXR_NN*Bu2`Xe7>8Q+jU^ z3-a52^0(a`4e|xH)#uEm(|8E(CGb%T6)?bfv=($<8g!wIrkawIezN`SjDTM`rlBtr>q+L9n^ zde&|+JO9FRR<(qJoF%jXx8=)g`4Hy^?56y+K4%fT89oG=z9r_b6?EiSgngnvSkYN@ zku;e3o3-pF2nQdVgEyrp8nabR%iaiHBWUw!RGX+F#I?DX`9WMkmTM8@4`ax1G*>sE zT;?wf^qoITdltAO<(%O9IgKYfhkdj7Ixe{w<$6>KN@R=6f)lfyIoaDFGjfP@UB|H*UpkV&zRgdpSd*Wh1GiYOnbpHXqFh?VOQsp+L`&tk z>}-~WgkJ3FJ<-FTq=UvD9!i!QLk^B1W8hLeGRhUFjHP*L9^kus`?`ks?t%0DC(Ges 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 z3ZMWApa2S>01BW03ZMWApa2S>01BW03ZMWApa2S>01BW03ZMWApa2S>01BW03ZMWA zpa2S>01BW03ZMWApa2S>01BW03ZMWApa2S>01BW03ZMWApa2S>01BW03ZMWApa2S> z01BW03ZMWApa2S>01BW03ZMWApa2S>01BW03ZMWApa2S>01BW03ZMWApa2S>01BW0 z3ZMWApa2S>01BW03ZMWApa2S>01BW03ZMWApa2S>01BW03ZMWApa2S>01BW03ZMWA zpa2S>01BW03ZMWApa2S>01BW03ZMWApa2S>01BW03ZMWApa2S>01BW03ZMWApa2S> z01BW03ZMWApa2S>01BW03ZMWApa2S>01BW03ZMWApa2S>01BW03ZMWApa2S>01BW0 z3ZMWApa2S>01BW03ZMWApa2S>01BW03ZMWApa2S>01BW03ZMWApa2S>01BW03ZMWA zpa2S>01BW03ZMWApa2S>01BW03ZMWApa2S>01BW03ZMWApa2S>01BW03ZMWApa2S> z01BW03ZMWApa2S>01BW03ZMWApa2S>01BW03ZMWApa2S>01BW03ZMWApa2S>01BW0 z3ZMWApa2S>01BW03ZMWApa2S>01BW03ZMWApa2S>01BW03ZMWApa2S>01BW03ZMWA zpa2S>01BW03ZMWApa2S>01BW03ZMWApa2S>01BW03ZMWApa2S>01BW03ZMWApa2S> z01BW03ZMWApa2S>01BW03ZMWApa2S>01BW03ZMWApa2S>01BW03ZMWApa2S>01BW0 z3ZMWApa2S>01BW03ZMWApa2S>01BW03ZMWApa2S>01BW03ZMWApa2S>01BW03ZMWA zpa2S>01BW03ZMWApa2S>01BW03ZMWApa2S>01BW03ZMWApa2S>01BW03ZMWApa2S> z01BW03ZMWApa2S>01BW03ZMWApa2S>01BW03ZMWApa2S>01BW03ZMWApa2S>01BW0 z3ZMWApa2S>01BW03ZMWApa2S>01BW03ZMWApa2S>01BW03ZMWApa2S>01BW03ZMWA zpa2S>01BW03ZMWApa2S>01BW03ZMWApa2S>01BW03ZMWApa2S>01BW03ZMWApa2S> z01BW03ZMWApa2S>01BW03ZMWApa2S>01BW03ZMWApa2S>01BW03ZMWApa2S>01BW0 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 z009U<00Izz00bZa0SG_<0uX=z1Rwwb2tWV=5P$##AOHafKmY;|fB*y_009U<00Izz z00bZa0SG_<0uX=z1Rwwb2tWV=5P$##AOHafKmY;|fB*y_009U<00Izz00bZa0SG_< z0uX=z1Rwwb2tWV=5P$##AOHafKmY;|fB*y_009U<00Izz00bZa0SG_<0uX=z1Rwwb z2tWV=5P$##AOHafKmY;|fB*y_009U<00Izz00bZa0SG_<0uX=z1Rwwb2tWV=5P$## zAOHafKmY;|fB*y_009U<00Izz00bZa0SG_<0uX=z1Rwwb2tWV=5P$##AOHafKmY;| zfB*y_009U<00Izz00bZa0SG_<0uX=z1Rwwb2tWV=5P$##AOHafKmY;|fB*y_009U< z00Izz00bZa0SG_<0uX=z1Rwwb2tWV=5P$##AOHafKmY;|fB*y_009U<00Izz00bZa z0SG_<0uX=z1Rwwb2tWV=5P$##AOHafKmY;|fB*y_009U<00Izz00bZa0SG_<0uX=z z1Rwwb2tWV=5P$##AOHafKmY;|fB*y_009U<00Izz00bZa0SG_<0uX=z1Rwwb2tWV= z5P$##AOHafKmY;|fB*y_009U<00Izz00bZa0SG_<0uX=z1Rwwb2tWV=5P$##AOHaf zKmY;|fB*y_009U<00Izz00bZa0SG_<0uX=z1Rwwb2tWV=5P$##AOHafKmY;|fB*y_ z009U<00Izz00bZa0SG_<0uX=z1Rwwb2tWV=5P$##AOHafKmY;|fB*y_009U<00Izz z00bZa0SG_<0uX=z1Rwwb2tWV=5P$##AOHafKmY;|fB*y_009U<00Izz00bZa0SG_< z0uX=z1Rwwb2tWV=5P$##AOHafKmY;|fB*y_009U<00Izz00bZa0SG_<0uX=z1Rwwb z2tWV=5P$##AOHafKmY;|fB*y_009U<00Izz00bZa0SG_<0uX=z1Rwwb2tWV=5P$## zAOHafKmY;|fB*y_009U<00Izz00bZa0SG_<0uX=z1Rwwb2tWV=5P$##AOHafKmY;| zfB*y_009U<00Izz00bZa0SG_<0uX=z1Rwwb2tWV=5P$##AOHafKmY;|fB*y_009U< z00Izz00bZa0SG_<0uX=z1Rwwb2tWV=5P$##AOHafKmY;|fB*y_009U<00Izz00bZa z0SG_<0uX=z1Rwwb2tWV=5P$##AOHafKmY;|fB*y_009U<00Izz00bZa0SG_<0uX=z U1Rwwb2tWV=5P$##{{9006Y<