@echo off
rem ===========================================================================
rem  XCOTA TAG v1 (preview) -- 2v2 tag teams for X-Men: Children of the Atom
rem  Generated from the release spec by tools/make_release.py -- do not hand-edit.
rem  Drag a clean xmcota.zip, xmcotau.zip, xmcotaj.zip or xmcotar1d.zip onto
rem  this file, or run:   xcota-tag-v1-preview.cmd "C:\path\to\xmcota.zip"
rem  This installer holds patch deltas and hashes, not ROM data. It makes no
rem  network requests, never overwrites its input, and refuses anything that is
rem  not a clean, supported set.
rem ===========================================================================
setlocal
set "ROMPATH=%~f1"
set "SELFPATH=%~f0"
where powershell.exe >nul 2>&1
if errorlevel 1 (
  echo.
  echo   ERROR: Windows PowerShell was not found.
  echo.
  exit /b 1
)
powershell.exe -NoProfile -ExecutionPolicy Bypass -Command "$t=[IO.File]::ReadAllText($env:SELFPATH);$m='#=PS'+'BEGIN=#';$i=$t.IndexOf($m);if($i -lt 0){Write-Host 'ERROR: installer marker missing.' -ForegroundColor Red;exit 9};& ([ScriptBlock]::Create($t.Substring($i+$m.Length)))"
set "RC=%errorlevel%"
endlocal & exit /b %RC%

#=PSBEGIN=#
$ErrorActionPreference = 'Stop'

function Pause-IfConsole {
    if ($Host.Name -eq 'ConsoleHost' -and -not $env:XCOTA_TAG_NOPAUSE) {
        try { Read-Host '  Press Enter to close' | Out-Null } catch {}
    }
}

function Fail([string]$Message, [int]$Code = 1) {
    Write-Host ''
    Write-Host "  ERROR: $Message" -ForegroundColor Red
    Write-Host '  Nothing was written.'
    Write-Host ''
    Pause-IfConsole
    exit $Code
}

function ConvertFrom-Hex([string]$Hex) {
    if (($Hex.Length % 2) -ne 0) { Fail 'internal hex string has an odd length.' 8 }
    $Bytes = New-Object byte[] ($Hex.Length / 2)
    for ($i = 0; $i -lt $Bytes.Length; $i++) {
        $Bytes[$i] = [Convert]::ToByte($Hex.Substring($i * 2, 2), 16)
    }
    return ,$Bytes
}

function Get-Sha256([byte[]]$Bytes) {
    $Hasher = [System.Security.Cryptography.SHA256]::Create()
    try {
        return ([BitConverter]::ToString($Hasher.ComputeHash($Bytes))).Replace('-', '').ToLowerInvariant()
    } finally {
        $Hasher.Dispose()
    }
}

function Read-ZipMembers([string]$Path) {
    $Entries = New-Object 'System.Collections.Generic.Dictionary[string,byte[]]'
    $Metadata = New-Object 'System.Collections.Generic.Dictionary[string,object]'
    $Order = New-Object 'System.Collections.Generic.List[string]'
    try { $Zip = [System.IO.Compression.ZipFile]::OpenRead($Path) }
    catch { throw "not a readable ZIP archive: $Path" }
    try {
        foreach ($Entry in $Zip.Entries) {
            if ($Entry.FullName.EndsWith('/')) {
                throw "the archive contains a folder entry '$($Entry.FullName)'; use a flat ROM ZIP."
            }
            if ($Entries.ContainsKey($Entry.FullName)) {
                throw "the archive has a duplicate member named $($Entry.FullName)."
            }
            $Memory = New-Object System.IO.MemoryStream
            $Stream = $Entry.Open()
            try { $Stream.CopyTo($Memory) } finally { $Stream.Dispose() }
            $Entries.Add($Entry.FullName, $Memory.ToArray())
            $Metadata.Add($Entry.FullName, [pscustomobject]@{
                LastWriteTime = $Entry.LastWriteTime
                ExternalAttributes = $Entry.ExternalAttributes
            })
            [void]$Order.Add($Entry.FullName)
            $Memory.Dispose()
        }
    } finally {
        $Zip.Dispose()
    }
    return [pscustomobject]@{ Entries = $Entries; Metadata = $Metadata; Order = $Order }
}

Write-Host ''
Write-Host '  XCOTA TAG v1'
Write-Host '  ================================================================'
Write-Host '  *** PREVIEW: see the included README for scope and evidence. ***' -ForegroundColor Yellow
Write-Host '  The clean input is only read. A new patched ZIP is written.'

$Source = $env:ROMPATH
if ([string]::IsNullOrWhiteSpace($Source)) {
    $Here = Split-Path -Parent $env:SELFPATH
    foreach ($Candidate in @('xmcota.zip', 'xmcotau.zip', 'xmcotaj.zip', 'xmcotar1d.zip')) {
        $Path = Join-Path $Here $Candidate
        if (Test-Path -LiteralPath $Path -PathType Leaf) { $Source = $Path; break }
    }
}
if ([string]::IsNullOrWhiteSpace($Source)) {
    Fail 'drag a clean xmcota.zip, xmcotau.zip, xmcotaj.zip or xmcotar1d.zip onto this CMD, or put it beside this file.'
}
try { $Source = (Resolve-Path -LiteralPath $Source -ErrorAction Stop).ProviderPath }
catch { Fail "file not found: $Source" }
if (-not (Test-Path -LiteralPath $Source -PathType Leaf)) {
    Fail "not a file: $Source"
}

Add-Type -AssemblyName System.IO.Compression -ErrorAction SilentlyContinue
Add-Type -AssemblyName System.IO.Compression.FileSystem -ErrorAction SilentlyContinue

$Sets = @(
    @{
        Set = 'xmcota'
        Title = 'Euro 950331'
        Detect = 'xmne.03f'
        Output = 'xmcota_tag_v1.zip'
        KeyName = 'xmcota.key'
        SharedRequired = $true
        Own = @(
            @{ Name = 'xmne.03f'; Size = 524288; Sha256 = 'fbf9d43649e0d696c81525f2dd6b8a629ead2939ffd91a96630dc4e49fe218fe' }
            @{ Name = 'xmne.04f'; Size = 524288; Sha256 = 'e8294f4bc36041e8be469cc375d57c07873e8c0fe524e81ee1e53ea1d05f5f1b' }
            @{ Name = 'xmne.05b'; Size = 524288; Sha256 = 'c77e8637001aa2741fdde51437c751ff23661eb12679217a41f95a0533807ac3' }
            @{ Name = 'xmne.10b'; Size = 524288; Sha256 = '064efdc37bcffe63de12e79dbde427d46842af1add192e29672c98a8762370cc' }
        )
        Shared = @(
            @{ Name = 'xmn.01a'; Size = 131072; Sha256 = 'e4f316a6e4ec6d9e83506723c0a0d1c9c393cf595ca209f7e673c655f947c845' }
            @{ Name = 'xmn.02a'; Size = 131072; Sha256 = '0e4f00671c9c3f0059956511d65ab8d8a9755c74556d8b263c6f283d141fc58b' }
            @{ Name = 'xmn.06a'; Size = 524288; Sha256 = '76f7440177c5ecf0bc9dadf06b41f29feb6da521c0b56a1fe68620faf6d6cd3b' }
            @{ Name = 'xmn.07a'; Size = 524288; Sha256 = '84a56c4f42e2859e22bbe0e1543decc8070393d6cbc61d8d89520367665fa9cf' }
            @{ Name = 'xmn.08a'; Size = 524288; Sha256 = 'a6c80b179f3c414711a7bc5e88d4cd1b157709fea3accae5587394b9bc52d003' }
            @{ Name = 'xmn.09a'; Size = 524288; Sha256 = '77f67f5d9e61ebd68213b69ed5ae1c53c296110b506041bf84b6e3ad58ea5732' }
            @{ Name = 'xmn.11m'; Size = 2097152; Sha256 = '55010b3a25c14fafa50f2270e4d458f24ccd605710d153ec1696d1b34dfe2a07' }
            @{ Name = 'xmn.12m'; Size = 2097152; Sha256 = '01aa15b9a9e395102957595a7406743fc6ddc5d5337184f1af5302791b4cc7ab' }
            @{ Name = 'xmn.13m'; Size = 4194304; Sha256 = '4f3cffe5d49c577179d0fcee5136d2313c0741a3ec6f9e8fa6c389f89670f2ba' }
            @{ Name = 'xmn.14m'; Size = 4194304; Sha256 = '60c268ee73a54fbdf1ab0b53750e5de76f1ee2aee86ae3ed6ae96096007240ac' }
            @{ Name = 'xmn.15m'; Size = 4194304; Sha256 = '628147eaf4994c4cfee36bdaeda4674a5f1760b9ef71a7f85717b52ead381b08' }
            @{ Name = 'xmn.16m'; Size = 4194304; Sha256 = 'e42184c725f82bab2e1e76c14035b1c00f1178619789290f25eb762a820e35fe' }
            @{ Name = 'xmn.17m'; Size = 4194304; Sha256 = 'e0d244716f44ea4e2bab385f24bb5cffa89432abb106250caa5ffb41f19ffbae' }
            @{ Name = 'xmn.18m'; Size = 4194304; Sha256 = '0c90d9379ae6c24ff21341719b0377e83b5dd14436afedb9ea6773f874c3e487' }
            @{ Name = 'xmn.19m'; Size = 4194304; Sha256 = 'd5ef11ad523f2f3e39c4f1906a6a299608cdef00129d791ba95e431229433202' }
            @{ Name = 'xmn.20m'; Size = 4194304; Sha256 = 'f0f288a4d443beca9e1ba7303a95f07b87479795e3b87c5f954b70e61f08cd8b' }
        )
        Optional = @(
            @{ Name = 'xmcota.key'; Size = 20 }
        )
        Extras = @()
        Patches = @(
            @{ File = 'xmne.03f'; Offset = 0x0035C2; After = '61dff984' }
            @{ File = 'xmne.03f'; Offset = 0x003B06; After = 'dd93836bd60e' }
            @{ File = 'xmne.03f'; Offset = 0x003D0C; After = '266379ad9778da91100a17e5c0ad' }
            @{ File = 'xmne.03f'; Offset = 0x003D4E; After = '66bd114b4e89df6146d91750ef803bc8' }
            @{ File = 'xmne.03f'; Offset = 0x0051C2; After = '908f8c46fb05' }
            @{ File = 'xmne.03f'; Offset = 0x0051FE; After = '6a5a987b5244' }
            @{ File = 'xmne.03f'; Offset = 0x0071AE; After = '59f18618' }
            @{ File = 'xmne.03f'; Offset = 0x009304; After = '833f7b57ce1146da' }
            @{ File = 'xmne.03f'; Offset = 0x009408; After = '6abb6db151de4e2a' }
            @{ File = 'xmne.03f'; Offset = 0x00945A; After = '94aca9f1e3a33e1a' }
            @{ File = 'xmne.03f'; Offset = 0x009808; After = 'f11c00ad2146' }
            @{ File = 'xmne.03f'; Offset = 0x009F74; After = 'c2cef3ebaa4ad797' }
            @{ File = 'xmne.03f'; Offset = 0x05064E; After = '49f0eca43e43ff57f9ad' }
            @{ File = 'xmne.03f'; Offset = 0x06EB74; After = '769b3074ebfa' }
            @{ File = 'xmne.05b'; Offset = 0x03F800; After = '4d584f434154542d474176200030f943' }
            @{ File = 'xmne.05b'; Offset = 0x03F811; After = '0020f02e4a020000670800f943' }
            @{ File = 'xmne.05b'; Offset = 0x03F81F; After = '0060f0754e082f00702e103000006712007c200100a4437020000010305f20754e2d300cca5f20754ee748fa' }
            @{ File = 'xmne.05b'; Offset = 0x03F84C; After = 'fc33617a' }
            @{ File = 'xmne.05b'; Offset = 0x03F851; After = '0000f07952' }
            @{ File = 'xmne.05b'; Offset = 0x03F857; After = '0002f02d4a80c800661a00f943' }
            @{ File = 'xmne.05b'; Offset = 0x03F865; After = '0020f000617200f943' }
            @{ File = 'xmne.05b'; Offset = 0x03F86F; After = '0060f000616800006056006d0c080084c800664c000061f00a2d0c040000c800672200ed4d00c0f943' }
            @{ File = 'xmne.05b'; Offset = 0x03F899; After = '0020f000615000ed4d00c4f943' }
            @{ File = 'xmne.05b'; Offset = 0x03F8A7; After = '0060f00061420000601e00ed4d00c0f943' }
            @{ File = 'xmne.05b'; Offset = 0x03F8B9; After = '0020f000616e00ed4d00c4f943' }
            @{ File = 'xmne.05b'; Offset = 0x03F8C7; After = '0060f000616000df4c' }
            @{ File = 'xmne.05b'; Offset = 0x03F8D1; After = '5fed4d00c82d4a80c8754e29420100294221002942250029422700754e294a210000673600294221006942120029422700294a25000067220029422500006114' }
            @{ File = 'xmne.05b'; Offset = 0x03F912; After = '40068000294a24000067060040060001403d0c00ae421400754e294a01000067e6002910210000673c0069521200000c01000066280000619a010067ca00007e291e0200070a01007c1301002600006192027952' }
            @{ File = 'xmne.05b'; Offset = 0x03F967; After = '0004f00060ac000061d8010060a400294a03000067200029420300007e291e0200070a0100314a0c7000660a000061c00000607e006e4a900100667200007e291e0200f1500c70070a0100314a0c700066600069521200690cf000120000643400690c1e001200006548002e3010006eb0be0000663c006e4a0600006716006e0c0c00060000662a006e0c06000800006620006942120000612a00294226000061ec017952' }
            @{ File = 'xmne.05b'; Offset = 0x03FA0D; After = '0006f00060060069421200754eed4100c0c8bd00660600ed4100c4754e082f0061ec' }
            @{ File = 'xmne.05b'; Offset = 0x03FA30; After = '294224002e300c0068b00c00006d1400006e0a002e4a0200006708007c13010024005f20754ee748c0e00061ce' }
            @{ File = 'xmne.05b'; Offset = 0x03FA5E; After = '7c130100210069421200e9502500294227007c33fb' }
            @{ File = 'xmne.05b'; Offset = 0x03FA74; After = '2200294a2400006708007c33050022007c3d3c00f6002e4284007c2d0200000004007c3d020008006e420a007c1d0400a0007c1d' }
            @{ File = 'xmne.05b'; Offset = 0x03FAA9; After = '00a1007c1d0100bc007c1d0400a2002e42aa007c2df7' }
            @{ File = 'xmne.05b'; Offset = 0x03FAC0; After = '00001c007c2d000000602000ae421400ae42180002701272b94e0000d89edf4c0703754e293022006ed10c00294a240000661200400cf2' }
            @{ File = 'xmne.05b'; Offset = 0x03FAF8; After = '006f16006953220000600e00400c0e00006c060069522200006112fd40446ed00c00294a240000660e00400c0800006d1c0000600a00400cf801006e1000690c28001200006406000070754e0170754e690c0c00120000620a00293022006ed10c00294a260000671000690c0400120000660600e9502700294a2500006720000061aafc40446ed00c00400c8000006d0e00400c8001006e060029422500690c03001200006554006e4a060000661c002e4abc0000660a000061d60100600c00690c9600120000653200294221006942120029422700294a250000671e0029422500006148fc40068000294a24000067060040060001403d0c00754ee748fa' }
            @{ File = 'xmne.05b'; Offset = 0x03FBF8; After = '007c291c020046dcae339001086047130200073c46dc713d046050002e42af006e134a0014006e134c0015006e134d0016006e13a30017006e33c00018006e33c2001a00092fb94e0000a09c5f22691d14004a00691d15004c00293018004002bffb403dc000403dc200403dc600403dc800403df8006e42c4006e42ca00291c0200864846dc31300860403d9001403d9201e9502000006194fb294a24000066160040062c003c3206003c24040000000176006012004006d4013c32fa' }
            @{ File = 'xmne.05b'; Offset = 0x03FCB6; After = '3c24fc' }
            @{ File = 'xmne.05b'; Offset = 0x03FCBA; After = '00000076403d0c006e420e0041332200422d1400ae421800431da300431d4d002e30be0040045000403d10006e4212007c2dfe' }
            @{ File = 'xmne.05b'; Offset = 0x03FCEE; After = '00801c007c2d0000006020007c2d0200000004007c3d020008006e420a007c1d0400a0007c1d0100a1007c1d0100bc007c1d0400a2002e42aa007c1d110007017c3d1000f6002e428400e9502500294227007c130200210069421200092f02701672b94e0000d89eb84e3c3100618a005f222e4a030000660c00092fb94e0100dc125f220e2fb94e060096c9b94e060038c35f2cdf4c' }
            @{ File = 'xmne.05b'; Offset = 0x03FD85; After = '5f754ee74880f02e305000400c18000062160040d0fa4116003022000000670800b94e0700cca8df4c0f01754e950295019d029d01a802a801b002b001b702b701be02be01c802c801d102d101d802d801e002e001e802e801f102f10100000000e748dae000742d3050c06db050c4006604000174ed4d00c02e4aaf0000670a002e42af00b84e3c31ed4d00c42eb4af0000670a00421daf00b84e3c31df4c075b754e403dc400403dca00e74840400061d8f9294a010000673801294a210000673c006e42c0006e42c2006e42c6006e42c8006e42f8000070294a270000671200294227003c300004403dc000403dc600403dc400403dca000060f6002e4a03000067ee00294a200000672e002e32c0004102400400660a002942200000601a006e02bffbc0006e02bffbc6004002bffb403dc400403dca006d0c080084c80066b0002d0c040000c80066a60000613af9294a010000679a00294a030000669200003241024004006788002e32c00041024004410c400400667800007229120200010a0100314a0c10006666006e0c0200040000665c006e4a0600006654006e4a900100674c002e12a00000671600010c020000670e00010c06000067060000603000e95003004002bffb403dc400403dca006e02bffbc0006e02bffbc2006e02bffbc6006e02bffbc8006e02bffbf800df4c0202754ee74840800e208002' }
            @{ File = 'xmne.05b'; Offset = 0x03FF85; After = '00' }
            @{ File = 'xmne.05b'; Offset = 0x03FF88; After = 'f943' }
            @{ File = 'xmne.05b'; Offset = 0x03FF8B; After = '0020f0800c' }
            @{ File = 'xmne.05b'; Offset = 0x03FF91; After = '00004000671200f943' }
            @{ File = 'xmne.05b'; Offset = 0x03FF9B; After = '0060f0800c' }
            @{ File = 'xmne.05b'; Offset = 0x03FFA1; After = '00004400662000294a010000671800294a210000671000294a250000670800df4c0102754edf4c0102f94e0000a0a26e3d0c0036006d0c080084c800663e00394a' }
            @{ File = 'xmne.05b'; Offset = 0x03FFE3; After = '0021f000671600394a' }
            @{ File = 'xmne.05b'; Offset = 0x03FFED; After = '0041f000670c00394a' }
            @{ File = 'xmne.05b'; Offset = 0x03FFF7; After = '0045f000662600394a' }
            @{ File = 'xmne.05b'; Offset = 0x040001; After = '0061f000671600394a' }
            @{ File = 'xmne.05b'; Offset = 0x04000B; After = '0081f000670c00394a' }
            @{ File = 'xmne.05b'; Offset = 0x040015; After = '0085f000660800f94e06007aeb754e2d3090c12d3290c5092f023ff943' }
            @{ File = 'xmne.05b'; Offset = 0x040033; After = '0020f0404a00660c0000612400006704000170f943' }
            @{ File = 'xmne.05b'; Offset = 0x040049; After = '0060f0414a00660c0000610e000067040001721f345f22754e294a010000671600007429140200020a0100314a0c20c257024a754e0074754e2d3090c12d3290c5e7484020f943' }
            @{ File = 'xmne.05b'; Offset = 0x040091; After = '0020f00061160042d0f943' }
            @{ File = 'xmne.05b'; Offset = 0x04009D; After = '0060f000610a0042d2df4c0402754e0074294a010000671c0029140200020a0100314a0c2000660a0042d431340820754e0074754e28305000092ff943' }
            @{ File = 'xmne.05b'; Offset = 0x0400DB; After = '0020f0284a020000670800f943' }
            @{ File = 'xmne.05b'; Offset = 0x0400E9; After = '0060f0294a010000670600293004005f2248e2754ee748fa' }
            @{ File = 'xmne.05b'; Offset = 0x040102; After = '7952' }
            @{ File = 'xmne.05b'; Offset = 0x040105; After = '0008f0ed4d00c0f943' }
            @{ File = 'xmne.05b'; Offset = 0x04010F; After = '0020f000613400ed4d00c4f943' }
            @{ File = 'xmne.05b'; Offset = 0x04011D; After = '0060f0006126003910' }
            @{ File = 'xmne.05b'; Offset = 0x040127; After = '0021f03980' }
            @{ File = 'xmne.05b'; Offset = 0x04012D; After = '0061f000670c007c1b010053c82d4252c8df4c' }
            @{ File = 'xmne.05b'; Offset = 0x040141; After = '5ff94e0000ec9b2942210029422500294227002942200029420100294202002942030069420c00694212007c338f0008007c338f000a006e13af000e0029420f0000702e1002002d0181c800671600110c020000665200693d04005000e9500100754e2e305000400c140000643a0040330400fa417000303200000138097640b200670a0000612200006714004154410c1400006504000072cb51e4' }
            @{ File = 'xmne.05b'; Offset = 0x0401DE; After = '043241330600e9500100754ee74880a4ed4140c8007a0c7418daca51fc' }
            @{ File = 'xmne.05b'; Offset = 0x0401FC; After = '07744594006f1600ed411dc9c5d04253181001b000670c00ca51f6' }
            @{ File = 'xmne.05b'; Offset = 0x040218; After = '0070006004000170df4c2501754e060008000a000000020004000e000c0012001000ee08000012003942' }
            @{ File = 'xmne.05b'; Offset = 0x040243; After = '0020f0754eee08010012003942' }
            @{ File = 'xmne.05b'; Offset = 0x040251; After = '0060f0754ef943' }
            @{ File = 'xmne.05b'; Offset = 0x040259; After = '0020f02e4a260000670800f943' }
            @{ File = 'xmne.05b'; Offset = 0x040267; After = '0060f00072131241d2fa41b20430340010114a006626004233040053131000bc1201008234e7487a00b94e0500e806df4c005ebc1810008f58754e69b40400006606008f58754e4233060053131100bc1202008234e7487a00b94e0500e806df4c005ea9340400a916100000722e122600ad0312c98f58f94e05006806f943' }
            @{ File = 'xmne.05b'; Offset = 0x0402E7; After = '0020f00070161000612c00403b50c0b91c' }
            @{ File = 'xmne.05b'; Offset = 0x0402F9; After = '0030f0754ef943' }
            @{ File = 'xmne.05b'; Offset = 0x040301; After = '0060f000702e10020000611000403b50c4791d' }
            @{ File = 'xmne.05b'; Offset = 0x040315; After = '0070f00200754ee7488060fa410204003241d230340010114a00660e004233040040131000bc120100003241d23034001049e269b40400006612004152410c0a000065e8' }
            @{ File = 'xmne.05b'; Offset = 0x04035A; After = '00720060e2' }
            @{ File = 'xmne.05b'; Offset = 0x040360; After = '4233060041131100bc12020029300400df4c0601754e3910' }
            @{ File = 'xmne.05b'; Offset = 0x040379; After = '0021f03980' }
            @{ File = 'xmne.05b'; Offset = 0x04037F; After = '0061f0006746007c3b8f00dc6af94192000043b94a9200804000673200f943' }
            @{ File = 'xmne.05b'; Offset = 0x04039F; After = '0020f0007e00613200f9419200a043f943' }
            @{ File = 'xmne.05b'; Offset = 0x0403B1; After = '0060f0017e00612000f94192004044077098429842c851fa' }
            @{ File = 'xmne.05b'; Offset = 0x0403CA; After = '754e2f7098429842c851fa' }
            @{ File = 'xmne.05b'; Offset = 0x0403D6; After = '754e294a010000660e00137098429842c851fa' }
            @{ File = 'xmne.05b'; Offset = 0x0403EA; After = '754e007c291c0200060a0100007a314a0c6000661800063040d0313a0800fcca5000fc8a8f0085020000' }
            @{ File = 'xmne.05b'; Offset = 0x040416; After = '0078043048e9074a006610003c32600040923c36010000600c003c32100140d23c362200410640e03c34106c444a006606003c34216c440c0400006606003c34006cc130fc303e20c230c330053004344ae94290006f5200400c1000006520003c34516c444a006606003c34616c440c0400006626003c34406c00601e003c34416c444a006606003c34516c440c0400006606003c34316c40d4c130fc303e20c230c33000600600984298424452440c050000654e' }
            @{ File = 'xmne.05b'; Offset = 0x0404CC; After = '063040d031300400fa45cc01fcc00500c0d40074420c0a0000641000324a00200067080042520060ec' }
            @{ File = 'xmne.05b'; Offset = 0x0404F6; After = '074a00660a003c32b40000600c003c324c01023048e74092410000e00076314a0c60006704000376007042b000641e0000783218000044060060c130fc304120c430c330415040520060e0' }
            @{ File = 'xmne.05b'; Offset = 0x040542; After = '0a7042900060060098429842c851fa' }
            @{ File = 'xmne.05b'; Offset = 0x040552; After = '754ee748fa' }
            @{ File = 'xmne.05b'; Offset = 0x040558; After = 'f941920000432d4a80c8006742002d3004c9400c020000671400400c040000662e006d0c040006c9006424007c3b8f00dc6af943' }
            @{ File = 'xmne.05b'; Offset = 0x04058D; After = '0020f0007e00613200f943' }
            @{ File = 'xmne.05b'; Offset = 0x040599; After = '0060f0017e0061260000601c006d0c8f00dc6a006612002f7098429842c851fa' }
            @{ File = 'xmne.05b'; Offset = 0x0405BA; After = '7c3b5f00dc6adf4c' }
            @{ File = 'xmne.05b'; Offset = 0x0405C3; After = '5f754ee847c0002d0f81c800673000007c111c006728003c3a1f2031702932040000612a003c3a28203270' }
            @{ File = 'xmne.05b'; Offset = 0x0405EF; After = '72060c0200006506002932060000611200cbb100640a00984298420060f4' }
            @{ File = 'xmne.05b'; Offset = 0x04060E; After = '754ee74820f8fa458a000174414a006b2600fa4580000138fcc80500c4d40074420c0a0000641000324a00200067080042520060ec' }
            @{ File = 'xmne.05b'; Offset = 0x040644; After = '074a00660a003c32440000600e003c32bc01023844544ce74492410000e04006006000612c003c303a6000612400007642b6006416000070321000304006006000610e0043520060e8' }
            @{ File = 'xmne.05b'; Offset = 0x04068E; After = 'df4c1f04754ec130c530c03058424150754e003f4f57564c52454e49004553504c59434f454b00004f434f4c53535355000059434c43504f005300005453524f004d0000000043494d454e4100000000505352494c41000000004153554d4152004900004d4f47452041455200444553544e4e494c450000554a47475245414e5455414d4e475445004f00004b414d55004100000000080006000000100012000a00040002000e000c0014001600' }
        )
        Patched = @{
            'xmne.03f' = 'd31c5facf74aa7568423956f6661050e6a00d243b277225118d44e632bb2e6f0'
            'xmne.05b' = 'f8e005c0ec6e0093e311735dca45243dd4a33fe26c3fd42af1544b972bd3e9c2'
        }
        Fingerprint = '412454707db529ec976d298f38d3fa54f81b8a3005e6e6cb8a7fd107013316b5'
    }
    @{
        Set = 'xmcotau'
        Title = 'USA 950105'
        Detect = 'xmnu.03e'
        Output = 'xmcotau_tag_v1.zip'
        KeyName = 'xmcotau.key'
        SharedRequired = $false
        Own = @(
            @{ Name = 'xmnu.03e'; Size = 524288; Sha256 = 'd70e8ed5407fc044702ba972e8c231ce99669e6f3db0d91170e7f5843f9aab29' }
            @{ Name = 'xmnu.04e'; Size = 524288; Sha256 = '434280a5ba6af86fe8d7c73aa6e18f2e629c9a229784f828d6f4c1ad00763027' }
            @{ Name = 'xmn.05a'; Size = 524288; Sha256 = '98e926a680f44d381d4ee659d05546a5bcc62e1f9d5d47b7a04a6c3dd46dbf4e' }
            @{ Name = 'xmn.10a'; Size = 524288; Sha256 = '61431c68a62dcf8f8bdd66288c095e9e46b8c2c3bc7ac49080010fd033c95398' }
        )
        Shared = @(
            @{ Name = 'xmn.01a'; Size = 131072; Sha256 = 'e4f316a6e4ec6d9e83506723c0a0d1c9c393cf595ca209f7e673c655f947c845' }
            @{ Name = 'xmn.02a'; Size = 131072; Sha256 = '0e4f00671c9c3f0059956511d65ab8d8a9755c74556d8b263c6f283d141fc58b' }
            @{ Name = 'xmn.06a'; Size = 524288; Sha256 = '76f7440177c5ecf0bc9dadf06b41f29feb6da521c0b56a1fe68620faf6d6cd3b' }
            @{ Name = 'xmn.07a'; Size = 524288; Sha256 = '84a56c4f42e2859e22bbe0e1543decc8070393d6cbc61d8d89520367665fa9cf' }
            @{ Name = 'xmn.08a'; Size = 524288; Sha256 = 'a6c80b179f3c414711a7bc5e88d4cd1b157709fea3accae5587394b9bc52d003' }
            @{ Name = 'xmn.09a'; Size = 524288; Sha256 = '77f67f5d9e61ebd68213b69ed5ae1c53c296110b506041bf84b6e3ad58ea5732' }
            @{ Name = 'xmn.11m'; Size = 2097152; Sha256 = '55010b3a25c14fafa50f2270e4d458f24ccd605710d153ec1696d1b34dfe2a07' }
            @{ Name = 'xmn.12m'; Size = 2097152; Sha256 = '01aa15b9a9e395102957595a7406743fc6ddc5d5337184f1af5302791b4cc7ab' }
            @{ Name = 'xmn.13m'; Size = 4194304; Sha256 = '4f3cffe5d49c577179d0fcee5136d2313c0741a3ec6f9e8fa6c389f89670f2ba' }
            @{ Name = 'xmn.14m'; Size = 4194304; Sha256 = '60c268ee73a54fbdf1ab0b53750e5de76f1ee2aee86ae3ed6ae96096007240ac' }
            @{ Name = 'xmn.15m'; Size = 4194304; Sha256 = '628147eaf4994c4cfee36bdaeda4674a5f1760b9ef71a7f85717b52ead381b08' }
            @{ Name = 'xmn.16m'; Size = 4194304; Sha256 = 'e42184c725f82bab2e1e76c14035b1c00f1178619789290f25eb762a820e35fe' }
            @{ Name = 'xmn.17m'; Size = 4194304; Sha256 = 'e0d244716f44ea4e2bab385f24bb5cffa89432abb106250caa5ffb41f19ffbae' }
            @{ Name = 'xmn.18m'; Size = 4194304; Sha256 = '0c90d9379ae6c24ff21341719b0377e83b5dd14436afedb9ea6773f874c3e487' }
            @{ Name = 'xmn.19m'; Size = 4194304; Sha256 = 'd5ef11ad523f2f3e39c4f1906a6a299608cdef00129d791ba95e431229433202' }
            @{ Name = 'xmn.20m'; Size = 4194304; Sha256 = 'f0f288a4d443beca9e1ba7303a95f07b87479795e3b87c5f954b70e61f08cd8b' }
        )
        Optional = @(
            @{ Name = 'xmcotau.key'; Size = 20 }
        )
        Extras = @()
        Patches = @(
            @{ File = 'xmn.05a'; Offset = 0x03F800; After = '4d584f434154542d474176200030f943' }
            @{ File = 'xmn.05a'; Offset = 0x03F811; After = '0020f02e4a020000670800f943' }
            @{ File = 'xmn.05a'; Offset = 0x03F81F; After = '0060f0754e082f00702e103000006712007c200100a4437020000010305f20754e2d300cca5f20754ee748fa' }
            @{ File = 'xmn.05a'; Offset = 0x03F84C; After = 'fc33617a' }
            @{ File = 'xmn.05a'; Offset = 0x03F851; After = '0000f07952' }
            @{ File = 'xmn.05a'; Offset = 0x03F857; After = '0002f02d4a80c800661a00f943' }
            @{ File = 'xmn.05a'; Offset = 0x03F865; After = '0020f000617200f943' }
            @{ File = 'xmn.05a'; Offset = 0x03F86F; After = '0060f000616800006056006d0c080084c800664c000061f00a2d0c040000c800672200ed4d00c0f943' }
            @{ File = 'xmn.05a'; Offset = 0x03F899; After = '0020f000615000ed4d00c4f943' }
            @{ File = 'xmn.05a'; Offset = 0x03F8A7; After = '0060f00061420000601e00ed4d00c0f943' }
            @{ File = 'xmn.05a'; Offset = 0x03F8B9; After = '0020f000616e00ed4d00c4f943' }
            @{ File = 'xmn.05a'; Offset = 0x03F8C7; After = '0060f000616000df4c' }
            @{ File = 'xmn.05a'; Offset = 0x03F8D1; After = '5fed4d00c82d4a80c8754e29420100294221002942250029422700754e294a210000673600294221006942120029422700294a25000067220029422500006114' }
            @{ File = 'xmn.05a'; Offset = 0x03F912; After = '40068000294a24000067060040060001403d0c00ae421400754e294a01000067e6002910210000673c0069521200000c01000066280000619a010067ca00007e291e0200070a01007c1301002600006192027952' }
            @{ File = 'xmn.05a'; Offset = 0x03F967; After = '0004f00060ac000061d8010060a400294a03000067200029420300007e291e0200070a0100314a0c7000660a000061c00000607e006e4a900100667200007e291e0200f1500c70070a0100314a0c700066600069521200690cf000120000643400690c1e001200006548002e3010006eb0be0000663c006e4a0600006716006e0c0c00060000662a006e0c06000800006620006942120000612a00294226000061ec017952' }
            @{ File = 'xmn.05a'; Offset = 0x03FA0D; After = '0006f00060060069421200754eed4100c0c8bd00660600ed4100c4754e082f0061ec' }
            @{ File = 'xmn.05a'; Offset = 0x03FA30; After = '294224002e300c0068b00c00006d1400006e0a002e4a0200006708007c13010024005f20754ee748c0e00061ce' }
            @{ File = 'xmn.05a'; Offset = 0x03FA5E; After = '7c130100210069421200e9502500294227007c33fb' }
            @{ File = 'xmn.05a'; Offset = 0x03FA74; After = '2200294a2400006708007c33050022007c3d3c00f6002e4284007c2d0200000004007c3d020008006e420a007c1d0400a0007c1d' }
            @{ File = 'xmn.05a'; Offset = 0x03FAA9; After = '00a1007c1d0100bc007c1d0400a2002e42aa007c2df7' }
            @{ File = 'xmn.05a'; Offset = 0x03FAC0; After = '00001c007c2d000000602000ae421400ae42180002701272b94e0000d89edf4c0703754e293022006ed10c00294a240000661200400cf2' }
            @{ File = 'xmn.05a'; Offset = 0x03FAF8; After = '006f16006953220000600e00400c0e00006c060069522200006112fd40446ed00c00294a240000660e00400c0800006d1c0000600a00400cf801006e1000690c28001200006406000070754e0170754e690c0c00120000620a00293022006ed10c00294a260000671000690c0400120000660600e9502700294a2500006720000061aafc40446ed00c00400c8000006d0e00400c8001006e060029422500690c03001200006554006e4a060000661c002e4abc0000660a000061d60100600c00690c9600120000653200294221006942120029422700294a250000671e0029422500006148fc40068000294a24000067060040060001403d0c00754ee748fa' }
            @{ File = 'xmn.05a'; Offset = 0x03FBF8; After = '007c291c020046dcae339001086047130200073c46dc713d046050002e42af006e134a0014006e134c0015006e134d0016006e13a30017006e33c00018006e33c2001a00092fb94e0000a09c5f22691d14004a00691d15004c00293018004002bffb403dc000403dc200403dc600403dc800403df8006e42c4006e42ca00291c0200864846dc31300860403d9001403d9201e9502000006194fb294a24000066160040062c003c3206003c24040000000176006012004006d4013c32fa' }
            @{ File = 'xmn.05a'; Offset = 0x03FCB6; After = '3c24fc' }
            @{ File = 'xmn.05a'; Offset = 0x03FCBA; After = '00000076403d0c006e420e0041332200422d1400ae421800431da300431d4d002e30be0040045000403d10006e4212007c2dfe' }
            @{ File = 'xmn.05a'; Offset = 0x03FCEE; After = '00801c007c2d0000006020007c2d0200000004007c3d020008006e420a007c1d0400a0007c1d0100a1007c1d0100bc007c1d0400a2002e42aa007c1d110007017c3d1000f6002e428400e9502500294227007c130200210069421200092f02701672b94e0000d89eb84e3c3100618a005f222e4a030000660c00092fb94e0100dc125f220e2fb94e060096c9b94e060038c35f2cdf4c' }
            @{ File = 'xmn.05a'; Offset = 0x03FD85; After = '5f754ee74880f02e305000400c18000062160040d0fa4116003022000000670800b94e0700cca8df4c0f01754e950295019d029d01a802a801b002b001b702b701be02be01c802c801d102d101d802d801e002e001e802e801f102f10100000000e748dae000742d3050c06db050c4006604000174ed4d00c02e4aaf0000670a002e42af00b84e3c31ed4d00c42eb4af0000670a00421daf00b84e3c31df4c075b754e403dc400403dca00e74840400061d8f9294a010000673801294a210000673c006e42c0006e42c2006e42c6006e42c8006e42f8000070294a270000671200294227003c300004403dc000403dc600403dc400403dca000060f6002e4a03000067ee00294a200000672e002e32c0004102400400660a002942200000601a006e02bffbc0006e02bffbc6004002bffb403dc400403dca006d0c080084c80066b0002d0c040000c80066a60000613af9294a010000679a00294a030000669200003241024004006788002e32c00041024004410c400400667800007229120200010a0100314a0c10006666006e0c0200040000665c006e4a0600006654006e4a900100674c002e12a00000671600010c020000670e00010c06000067060000603000e95003004002bffb403dc400403dca006e02bffbc0006e02bffbc2006e02bffbc6006e02bffbc8006e02bffbf800df4c0202754ee74840800e208002' }
            @{ File = 'xmn.05a'; Offset = 0x03FF85; After = '00' }
            @{ File = 'xmn.05a'; Offset = 0x03FF88; After = 'f943' }
            @{ File = 'xmn.05a'; Offset = 0x03FF8B; After = '0020f0800c' }
            @{ File = 'xmn.05a'; Offset = 0x03FF91; After = '00004000671200f943' }
            @{ File = 'xmn.05a'; Offset = 0x03FF9B; After = '0060f0800c' }
            @{ File = 'xmn.05a'; Offset = 0x03FFA1; After = '00004400662000294a010000671800294a210000671000294a250000670800df4c0102754edf4c0102f94e0000a0a26e3d0c0036006d0c080084c800663e00394a' }
            @{ File = 'xmn.05a'; Offset = 0x03FFE3; After = '0021f000671600394a' }
            @{ File = 'xmn.05a'; Offset = 0x03FFED; After = '0041f000670c00394a' }
            @{ File = 'xmn.05a'; Offset = 0x03FFF7; After = '0045f000662600394a' }
            @{ File = 'xmn.05a'; Offset = 0x040001; After = '0061f000671600394a' }
            @{ File = 'xmn.05a'; Offset = 0x04000B; After = '0081f000670c00394a' }
            @{ File = 'xmn.05a'; Offset = 0x040015; After = '0085f000660800f94e06007aeb754e2d3090c12d3290c5092f023ff943' }
            @{ File = 'xmn.05a'; Offset = 0x040033; After = '0020f0404a00660c0000612400006704000170f943' }
            @{ File = 'xmn.05a'; Offset = 0x040049; After = '0060f0414a00660c0000610e000067040001721f345f22754e294a010000671600007429140200020a0100314a0c20c257024a754e0074754e2d3090c12d3290c5e7484020f943' }
            @{ File = 'xmn.05a'; Offset = 0x040091; After = '0020f00061160042d0f943' }
            @{ File = 'xmn.05a'; Offset = 0x04009D; After = '0060f000610a0042d2df4c0402754e0074294a010000671c0029140200020a0100314a0c2000660a0042d431340820754e0074754e28305000092ff943' }
            @{ File = 'xmn.05a'; Offset = 0x0400DB; After = '0020f0284a020000670800f943' }
            @{ File = 'xmn.05a'; Offset = 0x0400E9; After = '0060f0294a010000670600293004005f2248e2754ee748fa' }
            @{ File = 'xmn.05a'; Offset = 0x040102; After = '7952' }
            @{ File = 'xmn.05a'; Offset = 0x040105; After = '0008f0ed4d00c0f943' }
            @{ File = 'xmn.05a'; Offset = 0x04010F; After = '0020f000613400ed4d00c4f943' }
            @{ File = 'xmn.05a'; Offset = 0x04011D; After = '0060f0006126003910' }
            @{ File = 'xmn.05a'; Offset = 0x040127; After = '0021f03980' }
            @{ File = 'xmn.05a'; Offset = 0x04012D; After = '0061f000670c007c1b010053c82d4252c8df4c' }
            @{ File = 'xmn.05a'; Offset = 0x040141; After = '5ff94e0000ec9b2942210029422500294227002942200029420100294202002942030069420c00694212007c338f0008007c338f000a006e13af000e0029420f0000702e1002002d0181c800671600110c020000665200693d04005000e9500100754e2e305000400c140000643a0040330400fa417000303200000138097640b200670a0000612200006714004154410c1400006504000072cb51e4' }
            @{ File = 'xmn.05a'; Offset = 0x0401DE; After = '043241330600e9500100754ee74880a4ed4140c8007a0c7418daca51fc' }
            @{ File = 'xmn.05a'; Offset = 0x0401FC; After = '07744594006f1600ed411dc9c5d04253181001b000670c00ca51f6' }
            @{ File = 'xmn.05a'; Offset = 0x040218; After = '0070006004000170df4c2501754e060008000a000000020004000e000c0012001000ee08000012003942' }
            @{ File = 'xmn.05a'; Offset = 0x040243; After = '0020f0754eee08010012003942' }
            @{ File = 'xmn.05a'; Offset = 0x040251; After = '0060f0754ef943' }
            @{ File = 'xmn.05a'; Offset = 0x040259; After = '0020f02e4a260000670800f943' }
            @{ File = 'xmn.05a'; Offset = 0x040267; After = '0060f00072131241d2fa41b20430340010114a006626004233040053131000bc1201008234e7487a00b94e0500e806df4c005ebc1810008f58754e69b40400006606008f58754e4233060053131100bc1202008234e7487a00b94e0500e806df4c005ea9340400a916100000722e122600ad0312c98f58f94e05006806f943' }
            @{ File = 'xmn.05a'; Offset = 0x0402E7; After = '0020f00070161000612c00403b50c0b91c' }
            @{ File = 'xmn.05a'; Offset = 0x0402F9; After = '0030f0754ef943' }
            @{ File = 'xmn.05a'; Offset = 0x040301; After = '0060f000702e10020000611000403b50c4791d' }
            @{ File = 'xmn.05a'; Offset = 0x040315; After = '0070f00200754ee7488060fa410204003241d230340010114a00660e004233040040131000bc120100003241d23034001049e269b40400006612004152410c0a000065e8' }
            @{ File = 'xmn.05a'; Offset = 0x04035A; After = '00720060e2' }
            @{ File = 'xmn.05a'; Offset = 0x040360; After = '4233060041131100bc12020029300400df4c0601754e3910' }
            @{ File = 'xmn.05a'; Offset = 0x040379; After = '0021f03980' }
            @{ File = 'xmn.05a'; Offset = 0x04037F; After = '0061f0006746007c3b8f00dc6af94192000043b94a9200804000673200f943' }
            @{ File = 'xmn.05a'; Offset = 0x04039F; After = '0020f0007e00613200f9419200a043f943' }
            @{ File = 'xmn.05a'; Offset = 0x0403B1; After = '0060f0017e00612000f94192004044077098429842c851fa' }
            @{ File = 'xmn.05a'; Offset = 0x0403CA; After = '754e2f7098429842c851fa' }
            @{ File = 'xmn.05a'; Offset = 0x0403D6; After = '754e294a010000660e00137098429842c851fa' }
            @{ File = 'xmn.05a'; Offset = 0x0403EA; After = '754e007c291c0200060a0100007a314a0c6000661800063040d0313a0800fcca5000fc8a8f0085020000' }
            @{ File = 'xmn.05a'; Offset = 0x040416; After = '0078043048e9074a006610003c32600040923c36010000600c003c32100140d23c362200410640e03c34106c444a006606003c34216c440c0400006606003c34006cc130fc303e20c230c330053004344ae94290006f5200400c1000006520003c34516c444a006606003c34616c440c0400006626003c34406c00601e003c34416c444a006606003c34516c440c0400006606003c34316c40d4c130fc303e20c230c33000600600984298424452440c050000654e' }
            @{ File = 'xmn.05a'; Offset = 0x0404CC; After = '063040d031300400fa45cc01fcc00500c0d40074420c0a0000641000324a00200067080042520060ec' }
            @{ File = 'xmn.05a'; Offset = 0x0404F6; After = '074a00660a003c32b40000600c003c324c01023048e74092410000e00076314a0c60006704000376007042b000641e0000783218000044060060c130fc304120c430c330415040520060e0' }
            @{ File = 'xmn.05a'; Offset = 0x040542; After = '0a7042900060060098429842c851fa' }
            @{ File = 'xmn.05a'; Offset = 0x040552; After = '754ee748fa' }
            @{ File = 'xmn.05a'; Offset = 0x040558; After = 'f941920000432d4a80c8006742002d3004c9400c020000671400400c040000662e006d0c040006c9006424007c3b8f00dc6af943' }
            @{ File = 'xmn.05a'; Offset = 0x04058D; After = '0020f0007e00613200f943' }
            @{ File = 'xmn.05a'; Offset = 0x040599; After = '0060f0017e0061260000601c006d0c8f00dc6a006612002f7098429842c851fa' }
            @{ File = 'xmn.05a'; Offset = 0x0405BA; After = '7c3b5f00dc6adf4c' }
            @{ File = 'xmn.05a'; Offset = 0x0405C3; After = '5f754ee847c0002d0f81c800673000007c111c006728003c3a1f2031702932040000612a003c3a28203270' }
            @{ File = 'xmn.05a'; Offset = 0x0405EF; After = '72060c0200006506002932060000611200cbb100640a00984298420060f4' }
            @{ File = 'xmn.05a'; Offset = 0x04060E; After = '754ee74820f8fa458a000174414a006b2600fa4580000138fcc80500c4d40074420c0a0000641000324a00200067080042520060ec' }
            @{ File = 'xmn.05a'; Offset = 0x040644; After = '074a00660a003c32440000600e003c32bc01023844544ce74492410000e04006006000612c003c303a6000612400007642b6006416000070321000304006006000610e0043520060e8' }
            @{ File = 'xmn.05a'; Offset = 0x04068E; After = 'df4c1f04754ec130c530c03058424150754e003f4f57564c52454e49004553504c59434f454b00004f434f4c53535355000059434c43504f005300005453524f004d0000000043494d454e4100000000505352494c41000000004153554d4152004900004d4f47452041455200444553544e4e494c450000554a47475245414e5455414d4e475445004f00004b414d55004100000000080006000000100012000a00040002000e000c0014001600' }
            @{ File = 'xmnu.03e'; Offset = 0x0035C2; After = 'd3eec21f' }
            @{ File = 'xmnu.03e'; Offset = 0x003B06; After = '9a7c191ff2' }
            @{ File = 'xmnu.03e'; Offset = 0x003D0C; After = '441c591d5514c54c118dcd6baa06' }
            @{ File = 'xmnu.03e'; Offset = 0x003D4E; After = 'fdadacf0dcb8d5fbe6b4b9d6af29fcd7' }
            @{ File = 'xmnu.03e'; Offset = 0x0051C2; After = 'b8431fceb6fd' }
            @{ File = 'xmnu.03e'; Offset = 0x0051FE; After = '52135a460997' }
            @{ File = 'xmnu.03e'; Offset = 0x0071AE; After = 'aa998366' }
            @{ File = 'xmnu.03e'; Offset = 0x009304; After = 'ae45b539ee790a38' }
            @{ File = 'xmnu.03e'; Offset = 0x009408; After = '217825f54cc26cb6' }
            @{ File = 'xmnu.03e'; Offset = 0x00945A; After = 'e1377636bc09175e' }
            @{ File = 'xmnu.03e'; Offset = 0x009808; After = 'f87633a317c6' }
            @{ File = 'xmnu.03e'; Offset = 0x009F74; After = 'd5efa1a01678830e' }
            @{ File = 'xmnu.03e'; Offset = 0x05064E; After = '84c5f9e25215a7e1d733' }
            @{ File = 'xmnu.03e'; Offset = 0x06EB74; After = '4c99501f1c5f' }
        )
        Patched = @{
            'xmn.05a' = '53dd28f4a18661dfc273548a696488500d93893342d9ee1f79941e7d347bd614'
            'xmnu.03e' = '06459a639426d305737bf61d47739b0dd1cbb27f60acbb84befe1317ae789be8'
        }
        Fingerprint = 'ee921be6633ed7904383022f040405d3c0469d98df715bd59f8c9210148c6941'
    }
    @{
        Set = 'xmcotaj'
        Title = 'Japan 950105'
        Detect = 'xmnj.03e'
        Output = 'xmcotaj_tag_v1.zip'
        KeyName = 'xmcotaj.key'
        SharedRequired = $false
        Own = @(
            @{ Name = 'xmnj.03e'; Size = 524288; Sha256 = '0307c3c6f93d723ef197e7645c26b11ea2bbbdac24eaaff8aa0fd119ca5433ed' }
            @{ Name = 'xmnj.04e'; Size = 524288; Sha256 = 'cf9bc76f31130b1cab520a3d11321f3dbf48d248643e54e3964c0f10fab17b7e' }
            @{ Name = 'xmn.05a'; Size = 524288; Sha256 = '98e926a680f44d381d4ee659d05546a5bcc62e1f9d5d47b7a04a6c3dd46dbf4e' }
            @{ Name = 'xmn.10a'; Size = 524288; Sha256 = '61431c68a62dcf8f8bdd66288c095e9e46b8c2c3bc7ac49080010fd033c95398' }
        )
        Shared = @(
            @{ Name = 'xmn.01a'; Size = 131072; Sha256 = 'e4f316a6e4ec6d9e83506723c0a0d1c9c393cf595ca209f7e673c655f947c845' }
            @{ Name = 'xmn.02a'; Size = 131072; Sha256 = '0e4f00671c9c3f0059956511d65ab8d8a9755c74556d8b263c6f283d141fc58b' }
            @{ Name = 'xmn.06a'; Size = 524288; Sha256 = '76f7440177c5ecf0bc9dadf06b41f29feb6da521c0b56a1fe68620faf6d6cd3b' }
            @{ Name = 'xmn.07a'; Size = 524288; Sha256 = '84a56c4f42e2859e22bbe0e1543decc8070393d6cbc61d8d89520367665fa9cf' }
            @{ Name = 'xmn.08a'; Size = 524288; Sha256 = 'a6c80b179f3c414711a7bc5e88d4cd1b157709fea3accae5587394b9bc52d003' }
            @{ Name = 'xmn.09a'; Size = 524288; Sha256 = '77f67f5d9e61ebd68213b69ed5ae1c53c296110b506041bf84b6e3ad58ea5732' }
            @{ Name = 'xmn.11m'; Size = 2097152; Sha256 = '55010b3a25c14fafa50f2270e4d458f24ccd605710d153ec1696d1b34dfe2a07' }
            @{ Name = 'xmn.12m'; Size = 2097152; Sha256 = '01aa15b9a9e395102957595a7406743fc6ddc5d5337184f1af5302791b4cc7ab' }
            @{ Name = 'xmn.13m'; Size = 4194304; Sha256 = '4f3cffe5d49c577179d0fcee5136d2313c0741a3ec6f9e8fa6c389f89670f2ba' }
            @{ Name = 'xmn.14m'; Size = 4194304; Sha256 = '60c268ee73a54fbdf1ab0b53750e5de76f1ee2aee86ae3ed6ae96096007240ac' }
            @{ Name = 'xmn.15m'; Size = 4194304; Sha256 = '628147eaf4994c4cfee36bdaeda4674a5f1760b9ef71a7f85717b52ead381b08' }
            @{ Name = 'xmn.16m'; Size = 4194304; Sha256 = 'e42184c725f82bab2e1e76c14035b1c00f1178619789290f25eb762a820e35fe' }
            @{ Name = 'xmn.17m'; Size = 4194304; Sha256 = 'e0d244716f44ea4e2bab385f24bb5cffa89432abb106250caa5ffb41f19ffbae' }
            @{ Name = 'xmn.18m'; Size = 4194304; Sha256 = '0c90d9379ae6c24ff21341719b0377e83b5dd14436afedb9ea6773f874c3e487' }
            @{ Name = 'xmn.19m'; Size = 4194304; Sha256 = 'd5ef11ad523f2f3e39c4f1906a6a299608cdef00129d791ba95e431229433202' }
            @{ Name = 'xmn.20m'; Size = 4194304; Sha256 = 'f0f288a4d443beca9e1ba7303a95f07b87479795e3b87c5f954b70e61f08cd8b' }
        )
        Optional = @(
            @{ Name = 'xmcotaj.key'; Size = 20 }
        )
        Extras = @()
        Patches = @(
            @{ File = 'xmn.05a'; Offset = 0x03F800; After = '4d584f434154542d474176200030f943' }
            @{ File = 'xmn.05a'; Offset = 0x03F811; After = '0020f02e4a020000670800f943' }
            @{ File = 'xmn.05a'; Offset = 0x03F81F; After = '0060f0754e082f00702e103000006712007c200100a4437020000010305f20754e2d300cca5f20754ee748fa' }
            @{ File = 'xmn.05a'; Offset = 0x03F84C; After = 'fc33617a' }
            @{ File = 'xmn.05a'; Offset = 0x03F851; After = '0000f07952' }
            @{ File = 'xmn.05a'; Offset = 0x03F857; After = '0002f02d4a80c800661a00f943' }
            @{ File = 'xmn.05a'; Offset = 0x03F865; After = '0020f000617200f943' }
            @{ File = 'xmn.05a'; Offset = 0x03F86F; After = '0060f000616800006056006d0c080084c800664c000061f00a2d0c040000c800672200ed4d00c0f943' }
            @{ File = 'xmn.05a'; Offset = 0x03F899; After = '0020f000615000ed4d00c4f943' }
            @{ File = 'xmn.05a'; Offset = 0x03F8A7; After = '0060f00061420000601e00ed4d00c0f943' }
            @{ File = 'xmn.05a'; Offset = 0x03F8B9; After = '0020f000616e00ed4d00c4f943' }
            @{ File = 'xmn.05a'; Offset = 0x03F8C7; After = '0060f000616000df4c' }
            @{ File = 'xmn.05a'; Offset = 0x03F8D1; After = '5fed4d00c82d4a80c8754e29420100294221002942250029422700754e294a210000673600294221006942120029422700294a25000067220029422500006114' }
            @{ File = 'xmn.05a'; Offset = 0x03F912; After = '40068000294a24000067060040060001403d0c00ae421400754e294a01000067e6002910210000673c0069521200000c01000066280000619a010067ca00007e291e0200070a01007c1301002600006192027952' }
            @{ File = 'xmn.05a'; Offset = 0x03F967; After = '0004f00060ac000061d8010060a400294a03000067200029420300007e291e0200070a0100314a0c7000660a000061c00000607e006e4a900100667200007e291e0200f1500c70070a0100314a0c700066600069521200690cf000120000643400690c1e001200006548002e3010006eb0be0000663c006e4a0600006716006e0c0c00060000662a006e0c06000800006620006942120000612a00294226000061ec017952' }
            @{ File = 'xmn.05a'; Offset = 0x03FA0D; After = '0006f00060060069421200754eed4100c0c8bd00660600ed4100c4754e082f0061ec' }
            @{ File = 'xmn.05a'; Offset = 0x03FA30; After = '294224002e300c0068b00c00006d1400006e0a002e4a0200006708007c13010024005f20754ee748c0e00061ce' }
            @{ File = 'xmn.05a'; Offset = 0x03FA5E; After = '7c130100210069421200e9502500294227007c33fb' }
            @{ File = 'xmn.05a'; Offset = 0x03FA74; After = '2200294a2400006708007c33050022007c3d3c00f6002e4284007c2d0200000004007c3d020008006e420a007c1d0400a0007c1d' }
            @{ File = 'xmn.05a'; Offset = 0x03FAA9; After = '00a1007c1d0100bc007c1d0400a2002e42aa007c2df7' }
            @{ File = 'xmn.05a'; Offset = 0x03FAC0; After = '00001c007c2d000000602000ae421400ae42180002701272b94e0000d89edf4c0703754e293022006ed10c00294a240000661200400cf2' }
            @{ File = 'xmn.05a'; Offset = 0x03FAF8; After = '006f16006953220000600e00400c0e00006c060069522200006112fd40446ed00c00294a240000660e00400c0800006d1c0000600a00400cf801006e1000690c28001200006406000070754e0170754e690c0c00120000620a00293022006ed10c00294a260000671000690c0400120000660600e9502700294a2500006720000061aafc40446ed00c00400c8000006d0e00400c8001006e060029422500690c03001200006554006e4a060000661c002e4abc0000660a000061d60100600c00690c9600120000653200294221006942120029422700294a250000671e0029422500006148fc40068000294a24000067060040060001403d0c00754ee748fa' }
            @{ File = 'xmn.05a'; Offset = 0x03FBF8; After = '007c291c020046dcae339001086047130200073c46dc713d046050002e42af006e134a0014006e134c0015006e134d0016006e13a30017006e33c00018006e33c2001a00092fb94e0000a09c5f22691d14004a00691d15004c00293018004002bffb403dc000403dc200403dc600403dc800403df8006e42c4006e42ca00291c0200864846dc31300860403d9001403d9201e9502000006194fb294a24000066160040062c003c3206003c24040000000176006012004006d4013c32fa' }
            @{ File = 'xmn.05a'; Offset = 0x03FCB6; After = '3c24fc' }
            @{ File = 'xmn.05a'; Offset = 0x03FCBA; After = '00000076403d0c006e420e0041332200422d1400ae421800431da300431d4d002e30be0040045000403d10006e4212007c2dfe' }
            @{ File = 'xmn.05a'; Offset = 0x03FCEE; After = '00801c007c2d0000006020007c2d0200000004007c3d020008006e420a007c1d0400a0007c1d0100a1007c1d0100bc007c1d0400a2002e42aa007c1d110007017c3d1000f6002e428400e9502500294227007c130200210069421200092f02701672b94e0000d89eb84e3c3100618a005f222e4a030000660c00092fb94e0100dc125f220e2fb94e060096c9b94e060038c35f2cdf4c' }
            @{ File = 'xmn.05a'; Offset = 0x03FD85; After = '5f754ee74880f02e305000400c18000062160040d0fa4116003022000000670800b94e0700cca8df4c0f01754e950295019d029d01a802a801b002b001b702b701be02be01c802c801d102d101d802d801e002e001e802e801f102f10100000000e748dae000742d3050c06db050c4006604000174ed4d00c02e4aaf0000670a002e42af00b84e3c31ed4d00c42eb4af0000670a00421daf00b84e3c31df4c075b754e403dc400403dca00e74840400061d8f9294a010000673801294a210000673c006e42c0006e42c2006e42c6006e42c8006e42f8000070294a270000671200294227003c300004403dc000403dc600403dc400403dca000060f6002e4a03000067ee00294a200000672e002e32c0004102400400660a002942200000601a006e02bffbc0006e02bffbc6004002bffb403dc400403dca006d0c080084c80066b0002d0c040000c80066a60000613af9294a010000679a00294a030000669200003241024004006788002e32c00041024004410c400400667800007229120200010a0100314a0c10006666006e0c0200040000665c006e4a0600006654006e4a900100674c002e12a00000671600010c020000670e00010c06000067060000603000e95003004002bffb403dc400403dca006e02bffbc0006e02bffbc2006e02bffbc6006e02bffbc8006e02bffbf800df4c0202754ee74840800e208002' }
            @{ File = 'xmn.05a'; Offset = 0x03FF85; After = '00' }
            @{ File = 'xmn.05a'; Offset = 0x03FF88; After = 'f943' }
            @{ File = 'xmn.05a'; Offset = 0x03FF8B; After = '0020f0800c' }
            @{ File = 'xmn.05a'; Offset = 0x03FF91; After = '00004000671200f943' }
            @{ File = 'xmn.05a'; Offset = 0x03FF9B; After = '0060f0800c' }
            @{ File = 'xmn.05a'; Offset = 0x03FFA1; After = '00004400662000294a010000671800294a210000671000294a250000670800df4c0102754edf4c0102f94e0000a0a26e3d0c0036006d0c080084c800663e00394a' }
            @{ File = 'xmn.05a'; Offset = 0x03FFE3; After = '0021f000671600394a' }
            @{ File = 'xmn.05a'; Offset = 0x03FFED; After = '0041f000670c00394a' }
            @{ File = 'xmn.05a'; Offset = 0x03FFF7; After = '0045f000662600394a' }
            @{ File = 'xmn.05a'; Offset = 0x040001; After = '0061f000671600394a' }
            @{ File = 'xmn.05a'; Offset = 0x04000B; After = '0081f000670c00394a' }
            @{ File = 'xmn.05a'; Offset = 0x040015; After = '0085f000660800f94e06007aeb754e2d3090c12d3290c5092f023ff943' }
            @{ File = 'xmn.05a'; Offset = 0x040033; After = '0020f0404a00660c0000612400006704000170f943' }
            @{ File = 'xmn.05a'; Offset = 0x040049; After = '0060f0414a00660c0000610e000067040001721f345f22754e294a010000671600007429140200020a0100314a0c20c257024a754e0074754e2d3090c12d3290c5e7484020f943' }
            @{ File = 'xmn.05a'; Offset = 0x040091; After = '0020f00061160042d0f943' }
            @{ File = 'xmn.05a'; Offset = 0x04009D; After = '0060f000610a0042d2df4c0402754e0074294a010000671c0029140200020a0100314a0c2000660a0042d431340820754e0074754e28305000092ff943' }
            @{ File = 'xmn.05a'; Offset = 0x0400DB; After = '0020f0284a020000670800f943' }
            @{ File = 'xmn.05a'; Offset = 0x0400E9; After = '0060f0294a010000670600293004005f2248e2754ee748fa' }
            @{ File = 'xmn.05a'; Offset = 0x040102; After = '7952' }
            @{ File = 'xmn.05a'; Offset = 0x040105; After = '0008f0ed4d00c0f943' }
            @{ File = 'xmn.05a'; Offset = 0x04010F; After = '0020f000613400ed4d00c4f943' }
            @{ File = 'xmn.05a'; Offset = 0x04011D; After = '0060f0006126003910' }
            @{ File = 'xmn.05a'; Offset = 0x040127; After = '0021f03980' }
            @{ File = 'xmn.05a'; Offset = 0x04012D; After = '0061f000670c007c1b010053c82d4252c8df4c' }
            @{ File = 'xmn.05a'; Offset = 0x040141; After = '5ff94e0000ec9b2942210029422500294227002942200029420100294202002942030069420c00694212007c338f0008007c338f000a006e13af000e0029420f0000702e1002002d0181c800671600110c020000665200693d04005000e9500100754e2e305000400c140000643a0040330400fa417000303200000138097640b200670a0000612200006714004154410c1400006504000072cb51e4' }
            @{ File = 'xmn.05a'; Offset = 0x0401DE; After = '043241330600e9500100754ee74880a4ed4140c8007a0c7418daca51fc' }
            @{ File = 'xmn.05a'; Offset = 0x0401FC; After = '07744594006f1600ed411dc9c5d04253181001b000670c00ca51f6' }
            @{ File = 'xmn.05a'; Offset = 0x040218; After = '0070006004000170df4c2501754e060008000a000000020004000e000c0012001000ee08000012003942' }
            @{ File = 'xmn.05a'; Offset = 0x040243; After = '0020f0754eee08010012003942' }
            @{ File = 'xmn.05a'; Offset = 0x040251; After = '0060f0754ef943' }
            @{ File = 'xmn.05a'; Offset = 0x040259; After = '0020f02e4a260000670800f943' }
            @{ File = 'xmn.05a'; Offset = 0x040267; After = '0060f00072131241d2fa41b20430340010114a006626004233040053131000bc1201008234e7487a00b94e0500e806df4c005ebc1810008f58754e69b40400006606008f58754e4233060053131100bc1202008234e7487a00b94e0500e806df4c005ea9340400a916100000722e122600ad0312c98f58f94e05006806f943' }
            @{ File = 'xmn.05a'; Offset = 0x0402E7; After = '0020f00070161000612c00403b50c0b91c' }
            @{ File = 'xmn.05a'; Offset = 0x0402F9; After = '0030f0754ef943' }
            @{ File = 'xmn.05a'; Offset = 0x040301; After = '0060f000702e10020000611000403b50c4791d' }
            @{ File = 'xmn.05a'; Offset = 0x040315; After = '0070f00200754ee7488060fa410204003241d230340010114a00660e004233040040131000bc120100003241d23034001049e269b40400006612004152410c0a000065e8' }
            @{ File = 'xmn.05a'; Offset = 0x04035A; After = '00720060e2' }
            @{ File = 'xmn.05a'; Offset = 0x040360; After = '4233060041131100bc12020029300400df4c0601754e3910' }
            @{ File = 'xmn.05a'; Offset = 0x040379; After = '0021f03980' }
            @{ File = 'xmn.05a'; Offset = 0x04037F; After = '0061f0006746007c3b8f00dc6af94192000043b94a9200804000673200f943' }
            @{ File = 'xmn.05a'; Offset = 0x04039F; After = '0020f0007e00613200f9419200a043f943' }
            @{ File = 'xmn.05a'; Offset = 0x0403B1; After = '0060f0017e00612000f94192004044077098429842c851fa' }
            @{ File = 'xmn.05a'; Offset = 0x0403CA; After = '754e2f7098429842c851fa' }
            @{ File = 'xmn.05a'; Offset = 0x0403D6; After = '754e294a010000660e00137098429842c851fa' }
            @{ File = 'xmn.05a'; Offset = 0x0403EA; After = '754e007c291c0200060a0100007a314a0c6000661800063040d0313a0800fcca5000fc8a8f0085020000' }
            @{ File = 'xmn.05a'; Offset = 0x040416; After = '0078043048e9074a006610003c32600040923c36010000600c003c32100140d23c362200410640e03c34106c444a006606003c34216c440c0400006606003c34006cc130fc303e20c230c330053004344ae94290006f5200400c1000006520003c34516c444a006606003c34616c440c0400006626003c34406c00601e003c34416c444a006606003c34516c440c0400006606003c34316c40d4c130fc303e20c230c33000600600984298424452440c050000654e' }
            @{ File = 'xmn.05a'; Offset = 0x0404CC; After = '063040d031300400fa45cc01fcc00500c0d40074420c0a0000641000324a00200067080042520060ec' }
            @{ File = 'xmn.05a'; Offset = 0x0404F6; After = '074a00660a003c32b40000600c003c324c01023048e74092410000e00076314a0c60006704000376007042b000641e0000783218000044060060c130fc304120c430c330415040520060e0' }
            @{ File = 'xmn.05a'; Offset = 0x040542; After = '0a7042900060060098429842c851fa' }
            @{ File = 'xmn.05a'; Offset = 0x040552; After = '754ee748fa' }
            @{ File = 'xmn.05a'; Offset = 0x040558; After = 'f941920000432d4a80c8006742002d3004c9400c020000671400400c040000662e006d0c040006c9006424007c3b8f00dc6af943' }
            @{ File = 'xmn.05a'; Offset = 0x04058D; After = '0020f0007e00613200f943' }
            @{ File = 'xmn.05a'; Offset = 0x040599; After = '0060f0017e0061260000601c006d0c8f00dc6a006612002f7098429842c851fa' }
            @{ File = 'xmn.05a'; Offset = 0x0405BA; After = '7c3b5f00dc6adf4c' }
            @{ File = 'xmn.05a'; Offset = 0x0405C3; After = '5f754ee847c0002d0f81c800673000007c111c006728003c3a1f2031702932040000612a003c3a28203270' }
            @{ File = 'xmn.05a'; Offset = 0x0405EF; After = '72060c0200006506002932060000611200cbb100640a00984298420060f4' }
            @{ File = 'xmn.05a'; Offset = 0x04060E; After = '754ee74820f8fa458a000174414a006b2600fa4580000138fcc80500c4d40074420c0a0000641000324a00200067080042520060ec' }
            @{ File = 'xmn.05a'; Offset = 0x040644; After = '074a00660a003c32440000600e003c32bc01023844544ce74492410000e04006006000612c003c303a6000612400007642b6006416000070321000304006006000610e0043520060e8' }
            @{ File = 'xmn.05a'; Offset = 0x04068E; After = 'df4c1f04754ec130c530c03058424150754e003f4f57564c52454e49004553504c59434f454b00004f434f4c53535355000059434c43504f005300005453524f004d0000000043494d454e4100000000505352494c41000000004153554d4152004900004d4f47452041455200444553544e4e494c450000554a47475245414e5455414d4e475445004f00004b414d55004100000000080006000000100012000a00040002000e000c0014001600' }
            @{ File = 'xmnj.03e'; Offset = 0x0035C2; After = '9d8e4c64' }
            @{ File = 'xmnj.03e'; Offset = 0x003B06; After = 'e13602893aca' }
            @{ File = 'xmnj.03e'; Offset = 0x003D0C; After = 'b8716d7542784afb55a829ebfba5' }
            @{ File = 'xmnj.03e'; Offset = 0x003D4E; After = '7dff19583b247a08440da410da260e8c' }
            @{ File = 'xmnj.03e'; Offset = 0x0051C2; After = '1be70fc55d97' }
            @{ File = 'xmnj.03e'; Offset = 0x0051FE; After = '2749438adbcb' }
            @{ File = 'xmnj.03e'; Offset = 0x0071AE; After = '3ce774e2' }
            @{ File = 'xmnj.03e'; Offset = 0x009304; After = '015c5de5cdc858da' }
            @{ File = 'xmnj.03e'; Offset = 0x009408; After = '9f65f0b97e46d21b' }
            @{ File = 'xmnj.03e'; Offset = 0x00945A; After = 'e27a096f83d876a1' }
            @{ File = 'xmnj.03e'; Offset = 0x009808; After = '83770dc78bfc' }
            @{ File = 'xmnj.03e'; Offset = 0x009F74; After = '58abcc324b6dae1d' }
            @{ File = 'xmnj.03e'; Offset = 0x05064E; After = 'a238d96b9bc7335c2968' }
            @{ File = 'xmnj.03e'; Offset = 0x06EB74; After = 'fb96a374d60f' }
        )
        Patched = @{
            'xmn.05a' = '53dd28f4a18661dfc273548a696488500d93893342d9ee1f79941e7d347bd614'
            'xmnj.03e' = '0f531b461e018df81fc04716118d80a50bf0eaf0853590f3c8ea91a57efc1eef'
        }
        Fingerprint = '64582ad36fab1249c188a5770c277fe7cc57f5c29c04ac1a1eec8bda1ca46790'
    }
    @{
        Set = 'xmcotar1d'
        Title = 'Euro 950105, Phoenix Edition'
        Detect = 'xmned.03e'
        Output = 'xmcotar1d_tag_v1.zip'
        KeyName = 'phoenix.key'
        SharedRequired = $false
        Own = @(
            @{ Name = 'xmned.03e'; Size = 524288; Sha256 = '5eff6ae4401650d955b061e4aeec79e7a6b2c6796ce04eaa97cf3055e6f3bb7e' }
            @{ Name = 'xmned.04e'; Size = 524288; Sha256 = '55748ba19795e549ea263f6c934be173eb10970ee53921376e3662e3d9780610' }
            @{ Name = 'xmn.05a'; Size = 524288; Sha256 = '98e926a680f44d381d4ee659d05546a5bcc62e1f9d5d47b7a04a6c3dd46dbf4e' }
            @{ Name = 'xmn.10a'; Size = 524288; Sha256 = '61431c68a62dcf8f8bdd66288c095e9e46b8c2c3bc7ac49080010fd033c95398' }
        )
        Shared = @(
            @{ Name = 'xmn.01a'; Size = 131072; Sha256 = 'e4f316a6e4ec6d9e83506723c0a0d1c9c393cf595ca209f7e673c655f947c845' }
            @{ Name = 'xmn.02a'; Size = 131072; Sha256 = '0e4f00671c9c3f0059956511d65ab8d8a9755c74556d8b263c6f283d141fc58b' }
            @{ Name = 'xmn.06a'; Size = 524288; Sha256 = '76f7440177c5ecf0bc9dadf06b41f29feb6da521c0b56a1fe68620faf6d6cd3b' }
            @{ Name = 'xmn.07a'; Size = 524288; Sha256 = '84a56c4f42e2859e22bbe0e1543decc8070393d6cbc61d8d89520367665fa9cf' }
            @{ Name = 'xmn.08a'; Size = 524288; Sha256 = 'a6c80b179f3c414711a7bc5e88d4cd1b157709fea3accae5587394b9bc52d003' }
            @{ Name = 'xmn.09a'; Size = 524288; Sha256 = '77f67f5d9e61ebd68213b69ed5ae1c53c296110b506041bf84b6e3ad58ea5732' }
            @{ Name = 'xmn.11m'; Size = 2097152; Sha256 = '55010b3a25c14fafa50f2270e4d458f24ccd605710d153ec1696d1b34dfe2a07' }
            @{ Name = 'xmn.12m'; Size = 2097152; Sha256 = '01aa15b9a9e395102957595a7406743fc6ddc5d5337184f1af5302791b4cc7ab' }
            @{ Name = 'xmn.13m'; Size = 4194304; Sha256 = '4f3cffe5d49c577179d0fcee5136d2313c0741a3ec6f9e8fa6c389f89670f2ba' }
            @{ Name = 'xmn.14m'; Size = 4194304; Sha256 = '60c268ee73a54fbdf1ab0b53750e5de76f1ee2aee86ae3ed6ae96096007240ac' }
            @{ Name = 'xmn.15m'; Size = 4194304; Sha256 = '628147eaf4994c4cfee36bdaeda4674a5f1760b9ef71a7f85717b52ead381b08' }
            @{ Name = 'xmn.16m'; Size = 4194304; Sha256 = 'e42184c725f82bab2e1e76c14035b1c00f1178619789290f25eb762a820e35fe' }
            @{ Name = 'xmn.17m'; Size = 4194304; Sha256 = 'e0d244716f44ea4e2bab385f24bb5cffa89432abb106250caa5ffb41f19ffbae' }
            @{ Name = 'xmn.18m'; Size = 4194304; Sha256 = '0c90d9379ae6c24ff21341719b0377e83b5dd14436afedb9ea6773f874c3e487' }
            @{ Name = 'xmn.19m'; Size = 4194304; Sha256 = 'd5ef11ad523f2f3e39c4f1906a6a299608cdef00129d791ba95e431229433202' }
            @{ Name = 'xmn.20m'; Size = 4194304; Sha256 = 'f0f288a4d443beca9e1ba7303a95f07b87479795e3b87c5f954b70e61f08cd8b' }
        )
        Optional = @(
            @{ Name = 'phoenix.key'; Size = 20 }
        )
        Extras = @('readme.html')
        Patches = @(
            @{ File = 'xmn.05a'; Offset = 0x03F800; After = '4d584f434154542d474176200030f943' }
            @{ File = 'xmn.05a'; Offset = 0x03F811; After = '0020f02e4a020000670800f943' }
            @{ File = 'xmn.05a'; Offset = 0x03F81F; After = '0060f0754e082f00702e103000006712007c200100a4437020000010305f20754e2d300cca5f20754ee748fa' }
            @{ File = 'xmn.05a'; Offset = 0x03F84C; After = 'fc33617a' }
            @{ File = 'xmn.05a'; Offset = 0x03F851; After = '0000f07952' }
            @{ File = 'xmn.05a'; Offset = 0x03F857; After = '0002f02d4a80c800661a00f943' }
            @{ File = 'xmn.05a'; Offset = 0x03F865; After = '0020f000617200f943' }
            @{ File = 'xmn.05a'; Offset = 0x03F86F; After = '0060f000616800006056006d0c080084c800664c000061f00a2d0c040000c800672200ed4d00c0f943' }
            @{ File = 'xmn.05a'; Offset = 0x03F899; After = '0020f000615000ed4d00c4f943' }
            @{ File = 'xmn.05a'; Offset = 0x03F8A7; After = '0060f00061420000601e00ed4d00c0f943' }
            @{ File = 'xmn.05a'; Offset = 0x03F8B9; After = '0020f000616e00ed4d00c4f943' }
            @{ File = 'xmn.05a'; Offset = 0x03F8C7; After = '0060f000616000df4c' }
            @{ File = 'xmn.05a'; Offset = 0x03F8D1; After = '5fed4d00c82d4a80c8754e29420100294221002942250029422700754e294a210000673600294221006942120029422700294a25000067220029422500006114' }
            @{ File = 'xmn.05a'; Offset = 0x03F912; After = '40068000294a24000067060040060001403d0c00ae421400754e294a01000067e6002910210000673c0069521200000c01000066280000619a010067ca00007e291e0200070a01007c1301002600006192027952' }
            @{ File = 'xmn.05a'; Offset = 0x03F967; After = '0004f00060ac000061d8010060a400294a03000067200029420300007e291e0200070a0100314a0c7000660a000061c00000607e006e4a900100667200007e291e0200f1500c70070a0100314a0c700066600069521200690cf000120000643400690c1e001200006548002e3010006eb0be0000663c006e4a0600006716006e0c0c00060000662a006e0c06000800006620006942120000612a00294226000061ec017952' }
            @{ File = 'xmn.05a'; Offset = 0x03FA0D; After = '0006f00060060069421200754eed4100c0c8bd00660600ed4100c4754e082f0061ec' }
            @{ File = 'xmn.05a'; Offset = 0x03FA30; After = '294224002e300c0068b00c00006d1400006e0a002e4a0200006708007c13010024005f20754ee748c0e00061ce' }
            @{ File = 'xmn.05a'; Offset = 0x03FA5E; After = '7c130100210069421200e9502500294227007c33fb' }
            @{ File = 'xmn.05a'; Offset = 0x03FA74; After = '2200294a2400006708007c33050022007c3d3c00f6002e4284007c2d0200000004007c3d020008006e420a007c1d0400a0007c1d' }
            @{ File = 'xmn.05a'; Offset = 0x03FAA9; After = '00a1007c1d0100bc007c1d0400a2002e42aa007c2df7' }
            @{ File = 'xmn.05a'; Offset = 0x03FAC0; After = '00001c007c2d000000602000ae421400ae42180002701272b94e0000d89edf4c0703754e293022006ed10c00294a240000661200400cf2' }
            @{ File = 'xmn.05a'; Offset = 0x03FAF8; After = '006f16006953220000600e00400c0e00006c060069522200006112fd40446ed00c00294a240000660e00400c0800006d1c0000600a00400cf801006e1000690c28001200006406000070754e0170754e690c0c00120000620a00293022006ed10c00294a260000671000690c0400120000660600e9502700294a2500006720000061aafc40446ed00c00400c8000006d0e00400c8001006e060029422500690c03001200006554006e4a060000661c002e4abc0000660a000061d60100600c00690c9600120000653200294221006942120029422700294a250000671e0029422500006148fc40068000294a24000067060040060001403d0c00754ee748fa' }
            @{ File = 'xmn.05a'; Offset = 0x03FBF8; After = '007c291c020046dcae339001086047130200073c46dc713d046050002e42af006e134a0014006e134c0015006e134d0016006e13a30017006e33c00018006e33c2001a00092fb94e0000a09c5f22691d14004a00691d15004c00293018004002bffb403dc000403dc200403dc600403dc800403df8006e42c4006e42ca00291c0200864846dc31300860403d9001403d9201e9502000006194fb294a24000066160040062c003c3206003c24040000000176006012004006d4013c32fa' }
            @{ File = 'xmn.05a'; Offset = 0x03FCB6; After = '3c24fc' }
            @{ File = 'xmn.05a'; Offset = 0x03FCBA; After = '00000076403d0c006e420e0041332200422d1400ae421800431da300431d4d002e30be0040045000403d10006e4212007c2dfe' }
            @{ File = 'xmn.05a'; Offset = 0x03FCEE; After = '00801c007c2d0000006020007c2d0200000004007c3d020008006e420a007c1d0400a0007c1d0100a1007c1d0100bc007c1d0400a2002e42aa007c1d110007017c3d1000f6002e428400e9502500294227007c130200210069421200092f02701672b94e0000d89eb84e3c3100618a005f222e4a030000660c00092fb94e0100dc125f220e2fb94e060096c9b94e060038c35f2cdf4c' }
            @{ File = 'xmn.05a'; Offset = 0x03FD85; After = '5f754ee74880f02e305000400c18000062160040d0fa4116003022000000670800b94e0700cca8df4c0f01754e950295019d029d01a802a801b002b001b702b701be02be01c802c801d102d101d802d801e002e001e802e801f102f10100000000e748dae000742d3050c06db050c4006604000174ed4d00c02e4aaf0000670a002e42af00b84e3c31ed4d00c42eb4af0000670a00421daf00b84e3c31df4c075b754e403dc400403dca00e74840400061d8f9294a010000673801294a210000673c006e42c0006e42c2006e42c6006e42c8006e42f8000070294a270000671200294227003c300004403dc000403dc600403dc400403dca000060f6002e4a03000067ee00294a200000672e002e32c0004102400400660a002942200000601a006e02bffbc0006e02bffbc6004002bffb403dc400403dca006d0c080084c80066b0002d0c040000c80066a60000613af9294a010000679a00294a030000669200003241024004006788002e32c00041024004410c400400667800007229120200010a0100314a0c10006666006e0c0200040000665c006e4a0600006654006e4a900100674c002e12a00000671600010c020000670e00010c06000067060000603000e95003004002bffb403dc400403dca006e02bffbc0006e02bffbc2006e02bffbc6006e02bffbc8006e02bffbf800df4c0202754ee74840800e208002' }
            @{ File = 'xmn.05a'; Offset = 0x03FF85; After = '00' }
            @{ File = 'xmn.05a'; Offset = 0x03FF88; After = 'f943' }
            @{ File = 'xmn.05a'; Offset = 0x03FF8B; After = '0020f0800c' }
            @{ File = 'xmn.05a'; Offset = 0x03FF91; After = '00004000671200f943' }
            @{ File = 'xmn.05a'; Offset = 0x03FF9B; After = '0060f0800c' }
            @{ File = 'xmn.05a'; Offset = 0x03FFA1; After = '00004400662000294a010000671800294a210000671000294a250000670800df4c0102754edf4c0102f94e0000a0a26e3d0c0036006d0c080084c800663e00394a' }
            @{ File = 'xmn.05a'; Offset = 0x03FFE3; After = '0021f000671600394a' }
            @{ File = 'xmn.05a'; Offset = 0x03FFED; After = '0041f000670c00394a' }
            @{ File = 'xmn.05a'; Offset = 0x03FFF7; After = '0045f000662600394a' }
            @{ File = 'xmn.05a'; Offset = 0x040001; After = '0061f000671600394a' }
            @{ File = 'xmn.05a'; Offset = 0x04000B; After = '0081f000670c00394a' }
            @{ File = 'xmn.05a'; Offset = 0x040015; After = '0085f000660800f94e06007aeb754e2d3090c12d3290c5092f023ff943' }
            @{ File = 'xmn.05a'; Offset = 0x040033; After = '0020f0404a00660c0000612400006704000170f943' }
            @{ File = 'xmn.05a'; Offset = 0x040049; After = '0060f0414a00660c0000610e000067040001721f345f22754e294a010000671600007429140200020a0100314a0c20c257024a754e0074754e2d3090c12d3290c5e7484020f943' }
            @{ File = 'xmn.05a'; Offset = 0x040091; After = '0020f00061160042d0f943' }
            @{ File = 'xmn.05a'; Offset = 0x04009D; After = '0060f000610a0042d2df4c0402754e0074294a010000671c0029140200020a0100314a0c2000660a0042d431340820754e0074754e28305000092ff943' }
            @{ File = 'xmn.05a'; Offset = 0x0400DB; After = '0020f0284a020000670800f943' }
            @{ File = 'xmn.05a'; Offset = 0x0400E9; After = '0060f0294a010000670600293004005f2248e2754ee748fa' }
            @{ File = 'xmn.05a'; Offset = 0x040102; After = '7952' }
            @{ File = 'xmn.05a'; Offset = 0x040105; After = '0008f0ed4d00c0f943' }
            @{ File = 'xmn.05a'; Offset = 0x04010F; After = '0020f000613400ed4d00c4f943' }
            @{ File = 'xmn.05a'; Offset = 0x04011D; After = '0060f0006126003910' }
            @{ File = 'xmn.05a'; Offset = 0x040127; After = '0021f03980' }
            @{ File = 'xmn.05a'; Offset = 0x04012D; After = '0061f000670c007c1b010053c82d4252c8df4c' }
            @{ File = 'xmn.05a'; Offset = 0x040141; After = '5ff94e0000ec9b2942210029422500294227002942200029420100294202002942030069420c00694212007c338f0008007c338f000a006e13af000e0029420f0000702e1002002d0181c800671600110c020000665200693d04005000e9500100754e2e305000400c140000643a0040330400fa417000303200000138097640b200670a0000612200006714004154410c1400006504000072cb51e4' }
            @{ File = 'xmn.05a'; Offset = 0x0401DE; After = '043241330600e9500100754ee74880a4ed4140c8007a0c7418daca51fc' }
            @{ File = 'xmn.05a'; Offset = 0x0401FC; After = '07744594006f1600ed411dc9c5d04253181001b000670c00ca51f6' }
            @{ File = 'xmn.05a'; Offset = 0x040218; After = '0070006004000170df4c2501754e060008000a000000020004000e000c0012001000ee08000012003942' }
            @{ File = 'xmn.05a'; Offset = 0x040243; After = '0020f0754eee08010012003942' }
            @{ File = 'xmn.05a'; Offset = 0x040251; After = '0060f0754ef943' }
            @{ File = 'xmn.05a'; Offset = 0x040259; After = '0020f02e4a260000670800f943' }
            @{ File = 'xmn.05a'; Offset = 0x040267; After = '0060f00072131241d2fa41b20430340010114a006626004233040053131000bc1201008234e7487a00b94e0500e806df4c005ebc1810008f58754e69b40400006606008f58754e4233060053131100bc1202008234e7487a00b94e0500e806df4c005ea9340400a916100000722e122600ad0312c98f58f94e05006806f943' }
            @{ File = 'xmn.05a'; Offset = 0x0402E7; After = '0020f00070161000612c00403b50c0b91c' }
            @{ File = 'xmn.05a'; Offset = 0x0402F9; After = '0030f0754ef943' }
            @{ File = 'xmn.05a'; Offset = 0x040301; After = '0060f000702e10020000611000403b50c4791d' }
            @{ File = 'xmn.05a'; Offset = 0x040315; After = '0070f00200754ee7488060fa410204003241d230340010114a00660e004233040040131000bc120100003241d23034001049e269b40400006612004152410c0a000065e8' }
            @{ File = 'xmn.05a'; Offset = 0x04035A; After = '00720060e2' }
            @{ File = 'xmn.05a'; Offset = 0x040360; After = '4233060041131100bc12020029300400df4c0601754e3910' }
            @{ File = 'xmn.05a'; Offset = 0x040379; After = '0021f03980' }
            @{ File = 'xmn.05a'; Offset = 0x04037F; After = '0061f0006746007c3b8f00dc6af94192000043b94a9200804000673200f943' }
            @{ File = 'xmn.05a'; Offset = 0x04039F; After = '0020f0007e00613200f9419200a043f943' }
            @{ File = 'xmn.05a'; Offset = 0x0403B1; After = '0060f0017e00612000f94192004044077098429842c851fa' }
            @{ File = 'xmn.05a'; Offset = 0x0403CA; After = '754e2f7098429842c851fa' }
            @{ File = 'xmn.05a'; Offset = 0x0403D6; After = '754e294a010000660e00137098429842c851fa' }
            @{ File = 'xmn.05a'; Offset = 0x0403EA; After = '754e007c291c0200060a0100007a314a0c6000661800063040d0313a0800fcca5000fc8a8f0085020000' }
            @{ File = 'xmn.05a'; Offset = 0x040416; After = '0078043048e9074a006610003c32600040923c36010000600c003c32100140d23c362200410640e03c34106c444a006606003c34216c440c0400006606003c34006cc130fc303e20c230c330053004344ae94290006f5200400c1000006520003c34516c444a006606003c34616c440c0400006626003c34406c00601e003c34416c444a006606003c34516c440c0400006606003c34316c40d4c130fc303e20c230c33000600600984298424452440c050000654e' }
            @{ File = 'xmn.05a'; Offset = 0x0404CC; After = '063040d031300400fa45cc01fcc00500c0d40074420c0a0000641000324a00200067080042520060ec' }
            @{ File = 'xmn.05a'; Offset = 0x0404F6; After = '074a00660a003c32b40000600c003c324c01023048e74092410000e00076314a0c60006704000376007042b000641e0000783218000044060060c130fc304120c430c330415040520060e0' }
            @{ File = 'xmn.05a'; Offset = 0x040542; After = '0a7042900060060098429842c851fa' }
            @{ File = 'xmn.05a'; Offset = 0x040552; After = '754ee748fa' }
            @{ File = 'xmn.05a'; Offset = 0x040558; After = 'f941920000432d4a80c8006742002d3004c9400c020000671400400c040000662e006d0c040006c9006424007c3b8f00dc6af943' }
            @{ File = 'xmn.05a'; Offset = 0x04058D; After = '0020f0007e00613200f943' }
            @{ File = 'xmn.05a'; Offset = 0x040599; After = '0060f0017e0061260000601c006d0c8f00dc6a006612002f7098429842c851fa' }
            @{ File = 'xmn.05a'; Offset = 0x0405BA; After = '7c3b5f00dc6adf4c' }
            @{ File = 'xmn.05a'; Offset = 0x0405C3; After = '5f754ee847c0002d0f81c800673000007c111c006728003c3a1f2031702932040000612a003c3a28203270' }
            @{ File = 'xmn.05a'; Offset = 0x0405EF; After = '72060c0200006506002932060000611200cbb100640a00984298420060f4' }
            @{ File = 'xmn.05a'; Offset = 0x04060E; After = '754ee74820f8fa458a000174414a006b2600fa4580000138fcc80500c4d40074420c0a0000641000324a00200067080042520060ec' }
            @{ File = 'xmn.05a'; Offset = 0x040644; After = '074a00660a003c32440000600e003c32bc01023844544ce74492410000e04006006000612c003c303a6000612400007642b6006416000070321000304006006000610e0043520060e8' }
            @{ File = 'xmn.05a'; Offset = 0x04068E; After = 'df4c1f04754ec130c530c03058424150754e003f4f57564c52454e49004553504c59434f454b00004f434f4c53535355000059434c43504f005300005453524f004d0000000043494d454e4100000000505352494c41000000004153554d4152004900004d4f47452041455200444553544e4e494c450000554a47475245414e5455414d4e475445004f00004b414d55004100000000080006000000100012000a00040002000e000c0014001600' }
            @{ File = 'xmned.03e'; Offset = 0x0035C2; After = '14' }
            @{ File = 'xmned.03e'; Offset = 0x0035C4; After = 'fe00' }
            @{ File = 'xmned.03e'; Offset = 0x003B06; After = 'b94e14005405' }
            @{ File = 'xmned.03e'; Offset = 0x003D0C; After = 'b94e1400e402714e714e714e714e' }
            @{ File = 'xmned.03e'; Offset = 0x003D4E; After = 'b94e1400fe02714e714e714e714e714e' }
            @{ File = 'xmned.03e'; Offset = 0x0051C2; After = 'b94e14' }
            @{ File = 'xmned.03e'; Offset = 0x0051C6; After = '3a02' }
            @{ File = 'xmned.03e'; Offset = 0x0051FE; After = 'b94e14' }
            @{ File = 'xmned.03e'; Offset = 0x005202; After = '4802' }
            @{ File = 'xmned.03e'; Offset = 0x0071AE; After = '13' }
            @{ File = 'xmned.03e'; Offset = 0x0071B0; After = '7cff' }
            @{ File = 'xmned.03e'; Offset = 0x009304; After = 'b94e130048f8714e' }
            @{ File = 'xmned.03e'; Offset = 0x009408; After = 'b94e14002400714e' }
            @{ File = 'xmned.03e'; Offset = 0x00945A; After = 'b94e14008200714e' }
            @{ File = 'xmned.03e'; Offset = 0x009808; After = 'b94e14' }
            @{ File = 'xmned.03e'; Offset = 0x00980C; After = 'd200' }
            @{ File = 'xmned.03e'; Offset = 0x009F74; After = 'b94e13' }
            @{ File = 'xmned.03e'; Offset = 0x009F78; After = '28fe714e' }
            @{ File = 'xmned.03e'; Offset = 0x05064E; After = 'b94e14005602714e714e' }
            @{ File = 'xmned.03e'; Offset = 0x06EB74; After = 'f94e13' }
            @{ File = 'xmned.03e'; Offset = 0x06EB78; After = 'd0ff' }
        )
        Patched = @{
            'xmn.05a' = '53dd28f4a18661dfc273548a696488500d93893342d9ee1f79941e7d347bd614'
            'xmned.03e' = '7c7c05146a2b3dca49fc6156f04d9aa7f552efe75175c6d6a13fb2f34411a201'
        }
        Fingerprint = 'ec078bca30025a30aedc3a0fcc3315cc58e26a8d713ad7d034643198db504407'
    }
)

try { $Read = Read-ZipMembers $Source }
catch { Fail $_.Exception.Message }
$Entries = $Read.Entries
$Metadata = $Read.Metadata
$Order = $Read.Order

# Which set is this? Exactly one supported program ROM must be present.
$Hits = @($Sets | Where-Object { $Entries.ContainsKey([string]$_.Detect) })
if ($Hits.Count -eq 0) {
    Fail 'no supported X-Men: Children of the Atom program ROM in this ZIP. Supported sets: xmcota, xmcotau, xmcotaj, xmcotar1d.'
}
if ($Hits.Count -gt 1) {
    Fail "this ZIP holds several revisions at once ($(@($Hits | ForEach-Object { $_.Set }) -join ', ')): a merged set. Use the non-merged or split ZIP of one set."
}
$S = $Hits[0]

$Known = New-Object 'System.Collections.Generic.Dictionary[string,object]'
foreach ($Record in @($S.Own) + @($S.Shared)) { $Known.Add([string]$Record.Name, $Record) }
$OptionalSize = New-Object 'System.Collections.Generic.Dictionary[string,int]'
foreach ($Record in @($S.Optional)) { $OptionalSize.Add([string]$Record.Name, [int]$Record.Size) }

foreach ($Name in $Order) {
    if ($Known.ContainsKey($Name)) { continue }
    if ($OptionalSize.ContainsKey($Name)) { continue }
    if (@($S.Extras) -contains $Name) { continue }
    Fail "unexpected member '$Name' in a $($S.Set) ZIP. Start from the clean set."
}
foreach ($Record in @($S.Own)) {
    if (-not $Entries.ContainsKey([string]$Record.Name)) { Fail "required member '$($Record.Name)' is missing." }
}
$SharedPresent = @(@($S.Shared) | Where-Object { $Entries.ContainsKey([string]$_.Name) })
$SharedMissing = @(@($S.Shared) | Where-Object { -not $Entries.ContainsKey([string]$_.Name) } | ForEach-Object { [string]$_.Name })
if ($S.SharedRequired -and $SharedMissing.Count -gt 0) {
    Fail "required members are missing: $($SharedMissing -join ', ')"
}
if ($SharedPresent.Count -gt 0 -and $SharedMissing.Count -gt 0) {
    Fail "a partial set: it has some shared members but not $($SharedMissing -join ', '). Use a complete non-merged ZIP or a split ZIP."
}
foreach ($Name in $Known.Keys) {
    if (-not $Entries.ContainsKey($Name)) { continue }
    $Record = $Known[$Name]
    $Bytes = [byte[]]$Entries[$Name]
    if ($Bytes.Length -ne [int]$Record.Size) { Fail "$Name is $($Bytes.Length) bytes, expected $($Record.Size)." }
    $Got = Get-Sha256 $Bytes
    if ($Got -ne [string]$Record.Sha256) {
        if ($S.Patched.ContainsKey($Name) -and $Got -eq [string]$S.Patched[$Name]) {
            Fail "$Name is already patched. Start from the clean set."
        }
        Fail "$Name does not match the clean $($S.Set) ($($S.Title)). Patched and wrong-revision sets are refused."
    }
}
foreach ($Name in $OptionalSize.Keys) {
    if ($Entries.ContainsKey($Name) -and ([byte[]]$Entries[$Name]).Length -ne $OptionalSize[$Name]) {
        Fail "$Name is $(([byte[]]$Entries[$Name]).Length) bytes, expected $($OptionalSize[$Name])."
    }
}
if ($SharedPresent.Count -gt 0) { $Layout = 'non-merged' } else { $Layout = 'split' }

Write-Host ''
Write-Host "  Input : $Source"
Write-Host "  Set   : $($S.Set) -- $($S.Title), $Layout ZIP, $($Entries.Count) members"

$FingerprintText = New-Object System.Text.StringBuilder
foreach ($Patch in @($S.Patches)) {
    [void]$FingerprintText.Append(('{0}|{1:x6}|{2}' -f [string]$Patch.File, [int]$Patch.Offset, [string]$Patch.After))
    [void]$FingerprintText.Append([char]10)
}
$Fingerprint = Get-Sha256 ([System.Text.Encoding]::ASCII.GetBytes($FingerprintText.ToString()))
if ($Fingerprint -ne [string]$S.Fingerprint) {
    Fail 'internal patch fingerprint mismatch; download the installer again.' 8
}

$Touched = New-Object 'System.Collections.Generic.Dictionary[string,int]'
foreach ($Patch in @($S.Patches)) {
    $Name = [string]$Patch.File
    if (-not $Entries.ContainsKey($Name)) { Fail "internal patch references a missing member '$Name'." 8 }
    $Buffer = [byte[]]$Entries[$Name]
    $After = ConvertFrom-Hex ([string]$Patch.After)
    if ([int]$Patch.Offset -lt 0 -or [int]$Patch.Offset + $After.Length -gt $Buffer.Length) {
        Fail 'internal patch range is outside its member.' 8
    }
    [Array]::Copy($After, 0, $Buffer, [int]$Patch.Offset, $After.Length)
    if ($Touched.ContainsKey($Name)) { $Touched[$Name] = $Touched[$Name] + $After.Length } else { $Touched.Add($Name, $After.Length) }
}
foreach ($Name in $S.Patched.Keys) {
    if (-not $Touched.ContainsKey([string]$Name)) { Fail 'internal patched-member list mismatch.' 8 }
    if ((Get-Sha256 ([byte[]]$Entries[[string]$Name])) -ne [string]$S.Patched[$Name]) {
        Fail "patched $Name failed its SHA-256 check." 8
    }
    Write-Host ("  patch : {0,-10} {1,6} bytes" -f [string]$Name, $Touched[[string]$Name])
}

$Destination = [IO.Path]::GetFullPath((Join-Path (Split-Path -Parent $Source) ([string]$S.Output)))
if ($Destination -eq [IO.Path]::GetFullPath($Source)) { Fail 'refusing to overwrite the input archive.' }
$ReceiptPath = "$Destination.receipt.json"
$Temporary = "$Destination.part"
$ReceiptTemporary = "$ReceiptPath.part"
foreach ($Path in @($Destination, $ReceiptPath, $Temporary, $ReceiptTemporary)) {
    if (Test-Path -LiteralPath $Path) { Fail "refusing to overwrite an existing file: $Path" }
}

$File = [IO.File]::Open($Temporary, [IO.FileMode]::CreateNew, [IO.FileAccess]::ReadWrite, [IO.FileShare]::None)
try {
    $Output = New-Object System.IO.Compression.ZipArchive($File, [IO.Compression.ZipArchiveMode]::Create, $true)
    try {
        foreach ($Name in $Order) {
            $NewEntry = $Output.CreateEntry($Name, [IO.Compression.CompressionLevel]::Optimal)
            try {
                $NewEntry.LastWriteTime = $Metadata[$Name].LastWriteTime
                $NewEntry.ExternalAttributes = $Metadata[$Name].ExternalAttributes
            } catch {
                # member names, order and bytes are what matter; timestamps are best effort
            }
            $Stream = $NewEntry.Open()
            try {
                $Bytes = [byte[]]$Entries[$Name]
                $Stream.Write($Bytes, 0, $Bytes.Length)
            } finally { $Stream.Dispose() }
        }
    } finally { $Output.Dispose() }
} catch {
    $WriteError = $_.Exception.Message
    $File.Dispose()
    if (Test-Path -LiteralPath $Temporary) { Remove-Item -LiteralPath $Temporary -Force }
    Fail "could not write the output ZIP: $WriteError" 8
} finally {
    $File.Dispose()
}

try {
    $Written = Read-ZipMembers $Temporary
    if ($Written.Order.Count -ne $Order.Count) { throw 'output member count changed during the write.' }
    for ($i = 0; $i -lt $Order.Count; $i++) {
        if ($Written.Order[$i] -cne $Order[$i]) { throw "output member order changed at index $i." }
    }
    foreach ($Name in $Order) {
        if ((Get-Sha256 ([byte[]]$Written.Entries[$Name])) -ne (Get-Sha256 ([byte[]]$Entries[$Name]))) {
            throw "output check failed for $Name."
        }
    }
} catch {
    $VerifyError = $_.Exception.Message
    if (Test-Path -LiteralPath $Temporary) { Remove-Item -LiteralPath $Temporary -Force }
    Fail "output verification failed: $VerifyError" 8
}

$ChangedMembers = @(
    foreach ($Name in @($S.Patched.Keys | Sort-Object)) {
        [pscustomobject][ordered]@{
            name = [string]$Name
            cleanSha256 = [string]$Known[[string]$Name].Sha256
            patchedSha256 = [string]$S.Patched[$Name]
        }
    }
)
$Receipt = [pscustomobject][ordered]@{
    format = 1
    status = 'installed'
    release = 'XCOTA TAG'
    version = 'v1'
    preview = $true
    set = [string]$S.Set
    title = [string]$S.Title
    layout = $Layout
    tool = [pscustomobject][ordered]@{ name = [IO.Path]::GetFileName($env:SELFPATH); sha256 = (Get-Sha256 ([IO.File]::ReadAllBytes($env:SELFPATH))) }
    cleanBaseOnly = $true
    downloadsRom = $false
    networkAccess = $false
    embedsStockBytes = $false
    inputArchive = [IO.Path]::GetFileName($Source)
    inputArchiveSha256 = Get-Sha256 ([IO.File]::ReadAllBytes($Source))
    outputArchive = [IO.Path]::GetFileName($Destination)
    outputArchiveSha256 = Get-Sha256 ([IO.File]::ReadAllBytes($Temporary))
    changedMembers = $ChangedMembers
    patchFingerprint = $Fingerprint
}
try {
    $ReceiptJson = ($Receipt | ConvertTo-Json -Depth 6) + [Environment]::NewLine
    $Utf8NoBom = New-Object System.Text.UTF8Encoding -ArgumentList $false
    [IO.File]::WriteAllText($ReceiptTemporary, $ReceiptJson, $Utf8NoBom)
    $ReceiptCheck = Get-Content -LiteralPath $ReceiptTemporary -Raw | ConvertFrom-Json
    if ([string]$ReceiptCheck.patchFingerprint -ne [string]$S.Fingerprint) { throw 'receipt fingerprint mismatch.' }
} catch {
    $ReceiptError = $_.Exception.Message
    foreach ($Path in @($Temporary, $ReceiptTemporary)) {
        if (Test-Path -LiteralPath $Path) { Remove-Item -LiteralPath $Path -Force }
    }
    Fail "could not write or verify the receipt: $ReceiptError" 8
}

try {
    Move-Item -LiteralPath $Temporary -Destination $Destination
    try {
        Move-Item -LiteralPath $ReceiptTemporary -Destination $ReceiptPath
    } catch {
        if (Test-Path -LiteralPath $Destination) { Remove-Item -LiteralPath $Destination -Force }
        throw
    }
} catch {
    $PromoteError = $_.Exception.Message
    foreach ($Path in @($Temporary, $ReceiptTemporary)) {
        if (Test-Path -LiteralPath $Path) { Remove-Item -LiteralPath $Path -Force }
    }
    Fail "could not move the verified output into place: $PromoteError" 8
}

Write-Host ''
Write-Host '  DONE. Wrote and re-verified:' -ForegroundColor Green
Write-Host "    $Destination"
Write-Host "    $ReceiptPath"
Write-Host ''
Write-Host "  Keep your clean $($S.Set).zip. Copy $($S.Output) into a separate emulator ROM folder"
Write-Host "  and rename the copy to $($S.Set).zip."
if ($Layout -eq 'split') {
    Write-Host '  This is a split set: that folder also needs the parent xmcota.zip for the shared files.'
}
if (-not [string]::IsNullOrEmpty([string]$S.KeyName) -and -not $Entries.ContainsKey([string]$S.KeyName)) {
    Write-Host "  NOTE: this ZIP has no $($S.KeyName). MAME needs it inside the ZIP to boot the set;" -ForegroundColor Yellow
    Write-Host '  add the one from your MAME set to the renamed copy.' -ForegroundColor Yellow
}
Write-Host '  Pick two characters on the select screen (the first one starts). Press HP+HK to tag.'
Write-Host ''
Write-Host ('  patch fingerprint  ' + $Fingerprint)
Write-Host ''
Pause-IfConsole
exit 0
