Skip to content

Instantly share code, notes, and snippets.

@Wowfunhappy
Last active May 9, 2026 22:56
Show Gist options
  • Select an option

  • Save Wowfunhappy/9bf6c0faf90febe498d1389cbb9468ed to your computer and use it in GitHub Desktop.

Select an option

Save Wowfunhappy/9bf6c0faf90febe498d1389cbb9468ed to your computer and use it in GitHub Desktop.
I asked Claude how difficult it would be to get NVME SSDs working on Mavericks. After inspecting a Yosemite installer, Claude enthusiastically announced that this woud be trivial; the Yosemite kext could be easily patched to work on Mavericks. This is currently 100% untested, as I need to acquire an NVME SSD.

Everything below was written by Claude Opus 4.7

NVMe boot driver for OS X 10.9.5 Mavericks (Hackintosh)

Status as of 2026-05-09: patched binary verified loadable via kextutil -tn. Untested on hardware — author intends to revisit once an NVMe SSD is available.

Update (later same day): an additional one-line fix to the kext's Info.plist was identified — Apple's matching dictionary uses a non-standard PCI subclass (0x80) that no third-party NVMe controller reports. Without this fix, the kext loads cleanly but ignores every actual NVMe drive. See "The actual lockout" below.

Goal

Enable booting from NVMe SSDs on a 10.9.5 Mavericks Hackintosh by porting Apple's closed-source IONVMeFamily.kext (first shipped in 10.10.3) backwards to the 10.9 kernel ABI. The EFI side (firmware-level NVMe enumeration before boot.efi runs) is solved by OpenCore injecting NvmExpressDxe.efi — configuration, not development. This document covers the kext side only.

Why this is feasible at all

Running kextlibs -unsupported -undef-symbols on the unmodified Yosemite IONVMeFamily.kext binary against the 10.9.5 kernel reveals only 5 unresolved symbols. Disassembly shows none of them lie on critical I/O paths in a way that prevents safe redirection. See call-sites.md for the evidence.

The actual lockout (matching dictionary, not binary)

The kext binary itself has no vendor-ID lockout — no 0x106B literal, no vendor-comparison strings, no probe()/start() overrides on AppleNVMeController that could host a runtime check. The lockout instead hides in the kext's Info.plist:

<key>IOPCIClassMatch</key>
<string>0x01800200&amp;0xffffff00</string>

Decoding the PCI class-code register:

Byte Apple's match Standard NVMe
Base class 0x01 (Mass Storage) 0x01
Subclass 0x80 (Other Mass Storage) 0x08 (Non-Volatile Memory)
Programming Interface 0x02 0x02
Revision masked masked

Apple's NVMe SSDs report subclass 0x80 (a non-standard / Apple-customized value); every third-party NVMe controller reports subclass 0x08 per the PCI SIG spec. The kext's matching dictionary therefore silently ignores every standard-spec NVMe drive in existence — even though the binary code path that runs after a successful match is fully generic.

Fix: change the matching value's third hex byte from 80 to 08:

-<string>0x01800200&amp;0xffffff00</string>
+<string>0x01080200&amp;0xffffff00</string>

This is what makes the kext attach to off-the-shelf NVMe SSDs.

For historical context: Pike Alpha's well-known IONVMeFamily patches (pikeralpha.wordpress.com, June 2016 onward) target a different lockout mechanism — vendor/device-ID matching introduced in El Capitan and Sierra via IONameMatch keys like pci144d,a804. He never published a Yosemite patch because by mid-2016 Yosemite was already a year out of date, and the Yosemite lockout is a one-line plist edit not interesting enough for a blog post. This document is essentially that missing post.

Files in this gist

File Purpose
README.md This file.
patch_nvme_kext.py Mach-O symbol-table patcher. Reads the original Yosemite binary, rewrites 5 undefined-symbol references, strips the code signature, writes patched binary. Does not touch Info.plist — the AMFI dependency removal and the IOPCIClassMatch fix are documented as separate manual steps below.
call-sites.md Disassembly excerpts and annotated reasoning for every redirect, plus the matching-dictionary analysis. Do not skip this. It is the safety argument.
IONVMeFamily.kext.tar.gz.base64.txt The original, unmodified Yosemite kext bundle (build 14F17 = 10.10.5 final), base64-wrapped at 76 cols. SHA-256 of the decoded tar.gz: bf44bf1ac78f563eda97bb85a53111af77514c853226fc9ebc0067acb8d22d65.

Reproducing the patched kext

# 1. Decode the original kext
base64 -D -i IONVMeFamily.kext.tar.gz.base64.txt | tar -xzf -
# Produces ./IONVMeFamily.kext/

# 2. Apply the symbol patch (binary level)
python patch_nvme_kext.py IONVMeFamily.kext/Contents/MacOS/IONVMeFamily IONVMeFamily.patched

# 3. Build the patched bundle
cp -R IONVMeFamily.kext IONVMeFamily.patched.kext
cp IONVMeFamily.patched IONVMeFamily.patched.kext/Contents/MacOS/IONVMeFamily
rm -rf IONVMeFamily.patched.kext/Contents/_CodeSignature

# 4. Drop the AppleMobileFileIntegrity dependency from Info.plist
#    (delete the two lines for com.apple.driver.AppleMobileFileIntegrity / 1.0.1)

# 5. Fix the IOPCIClassMatch subclass byte (0x80 -> 0x08)
#    Without this, the kext loads but ignores every third-party NVMe drive.
sed -i.bak 's|0x01800200&amp;0xffffff00|0x01080200\&amp;0xffffff00|' \
    IONVMeFamily.patched.kext/Contents/Info.plist
rm IONVMeFamily.patched.kext/Contents/Info.plist.bak

Info.plist AMFI lines to remove (under OSBundleLibraries):

<key>com.apple.driver.AppleMobileFileIntegrity</key>
<string>1.0.1</string>

Verifying

# Should show no unresolved symbols and a valid OSBundleLibraries dict:
kextlibs -unsupported -undef-symbols IONVMeFamily.patched.kext

# Should report "appears to be loadable (including linkage for on-disk libraries)":
kextutil -z -tn IONVMeFamily.patched.kext

# After installing on a real machine, confirm match against your actual drive:
kextstat | grep -i nvme
system_profiler SPNVMeDataType

The "Code Signing Failure" warning from kextutil is expected and harmless on 10.9 — kext signing isn't enforced. The "Memory allocation failure" line is a known kextutil simulated-load artifact, also harmless.

Note that kextutil -tn does not validate IOPCIClassMatch against actual hardware — it only checks symbol linkage and dependency resolution. The matching-dictionary fix has to be verified by booting a system with an NVMe drive present.

Symbol redirects (the binary patch)

Original (undefined in 10.9.5) Replacement (exists in 10.9.5) Why safe
_bufattr_passive _bufattr_throttled bufattr_passive was added in 10.10 to flag low-priority I/O. 10.9's bufattr_throttled is the semantic predecessor (set by throttle_io_will_be_throttled). Return value is fed into NVMe Dataset Management hint byte (CDW13) — wrong-but-similar hint costs at most marginal background-I/O perf. See call-sites.md § doAsyncReadWrite.
__ZN24AppleMobileFileIntegrity9metaClassE __ZN9IOService9metaClassE Used in a safeMetaCast inside ValidateEntitlement. The cast target object is obtained via waitForMatchingService("AppleMobileFileIntegrity"), which returns NULL on a system without AMFI — code path early-exits before metaClass is consulted. Redirect target only needs to resolve.
__ZN24AppleMobileFileIntegrity16copyEntitlementsEP4proc _get_bsdtask_info Same dead-code argument: only reached if waitForMatchingService returns non-NULL. Redirect target need only have a compatible-enough call-frame; never executed.
__ZN9IOService4initEP12OSDictionary __ZN15IORegistryEntry4initEP12OSDictionary Vtable slot only (no direct call sites in this kext). On 10.10 the symbol mangles to IOService::init because Apple's headers explicitly listed an override; on 10.9 the override doesn't exist and the slot is filled by IORegistryEntry::init. Redirect makes the vtable point at the same code 10.9 would have used natively.
__ZN9IOService4initEP15IORegistryEntryPK15IORegistryPlane __ZN15IORegistryEntry4initEPS_PK15IORegistryPlane Same as above for the second init overload.

The single feature lost by these redirects is SSD thermal throttling overrides via IORegistryEntrySetCFProperties (the setProperties path gated by ValidateEntitlement("com.apple.ssdthrottle.allow")). Nothing on a Hackintosh ever invokes this path.

Mach-O patch details

For anyone reading the patcher script:

  • Source: Contents/MacOS/IONVMeFamily from the Yosemite kext (build 14F17, CFBundleVersion 1.0.0, x86_64-only Mach-O).
  • LC_SYMTAB before patch: symoff=79400 nsyms=1141 stroff=114480 strsize=51032
  • LC_SYMTAB after patch: strsize=51192 (160 bytes appended for new strings, padded to 8-byte alignment)
  • Existing __LINKEDIT (file 77824–171599, filesize 93776) had a 6080-byte code-signature blob immediately following the string table at offset 165520. The new strings overwrite a portion of that blob. Total file size unchanged.
  • LC_CODE_SIGNATURE preserved as a load command but with dataoff=0 datasize=0 so the loader sees an empty signature region.
  • The patcher checks every redirect was applied (errors if any has 0 hits).

Installing on a real system (untested as of this writing)

For a Hackintosh, the cleanest install is via Clover/OpenCore kext injection rather than /S/L/E:

  • Clover: drop IONVMeFamily.patched.kext into EFI/CLOVER/kexts/10.9/. Ensure NvmExpressDxe.efi is in EFI/CLOVER/drivers64UEFI/ so the firmware enumerates the drive in EFI phase.
  • OpenCore: drop into EFI/OC/Kexts/ and add the corresponding Kernel > Add entry in config.plist. NVMe EFI driver goes in EFI/OC/Drivers/ with the matching UEFI > Drivers entry.

Pick one install location — don't also put the kext in /S/L/E. Single source of truth makes the next iteration easier to debug.

If you do want the kext in /S/L/E (e.g. testing without modifying the EFI partition):

sudo cp -R IONVMeFamily.patched.kext /System/Library/Extensions/IONVMeFamily.kext
sudo chown -R root:wheel /System/Library/Extensions/IONVMeFamily.kext
sudo chmod -R 755 /System/Library/Extensions/IONVMeFamily.kext
sudo touch /System/Library/Extensions
sudo kextcache -system-prelinked-kernel
sudo kextcache -system-caches

Open runtime risks

Static analysis cannot detect these — they show up as panics or hangs on first boot:

  1. Vtable layout drift in IOKit base classes between 10.9 and 10.10. Apple reserves _RESERVEDIOService0..7 slots specifically to allow ABI-preserving extensions; nothing in this kext's symbol table suggests they were used between 10.9 and 10.10. But if any did shift, the panic will name the misdispatched method.
  2. IOPCIFamily MSI-X interface changes. The kext sets up MSI-X interrupts for NVMe queues. If helper signatures changed, manifests as either an init-time panic or no interrupt delivery (driver hangs at first command).
  3. IOStorageFamily protocol drift. The kext's Info.plist requires IOStorageFamily 1.7; 10.9 ships 1.9 (forward-compatible at the declared version). Risk only if the kext indirectly invokes a method added between 1.7 and 1.9 — unlikely but possible.
  4. Sleep/wake on non-Apple NVMe controllers. The kext's EnterSelfRefresh/ExitSelfRefresh and setPowerState machinery were designed for Apple's specific SSD power-state model. Generic NVMe drives implement standard NVMe power states (PS0–PS4) but don't necessarily honor Apple's "self-refresh" sequencing. Most likely failure mode if anything bites: system suspends fine, resume hangs or drive returns unhealthy.
  5. Initialization timeouts. Some modern NVMe drives take longer to come ready than the Yosemite driver's PollCSTS polls expect. Manifests as a one-shot attach failure on certain cold boots; patchable if it happens.

If a panic occurs, the kernel log will name the offending function. A targeted follow-up patch (similar in pattern to the existing five) usually suffices.

Resumption checklist for a future agent

  1. Read call-sites.md first. The redirect-safety argument and the matching-dictionary analysis are non-obvious without the disassembly evidence.
  2. Decode the kext bundle (see "Reproducing" above) and run the patcher, then apply the AMFI plist removal and the IOPCIClassMatch fix.
  3. Verify with kextlibs and kextutil -z -tn.
  4. If the patcher errors with "symbol X not found", the upstream binary may have changed. Re-extract from a fresh Yosemite installer and re-derive the symbol mangling list (the script prints which symbols it found and how many times).
  5. If the kext loads but doesn't attach to your drive, the IOPCIClassMatch fix is missing or the drive reports a non-standard class code. Confirm with system_profiler SPPCIDataType — look for the NVMe controller and check its class code.
  6. If the kext loads, attaches, but panics under I/O, capture the panic log (boot-args="keepsyms=1 debug=0x144 -v"), find the panicking function name, add a redirect for it, and re-patch.
  7. Full regenerable disassembly (only ~170KB binary, ~15k lines) is one command: otool -tV IONVMeFamily > disasm.txt. The two functions of interest are IONVMeBlockStorageDevice::doAsyncReadWrite (bufattr_passive call site) and IONVMeBlockStorageDevice::ValidateEntitlement (AMFI call sites). The matching dictionary is in Contents/Info.plist, IOKitPersonalitiesAppleNVMeControllerIOPCIClassMatch.

References

Disassembly evidence for symbol redirects

This file backs up the safety argument in the README. Each redirect is shown with the actual call site from the original Yosemite binary and an annotated explanation of why patching to the chosen 10.9 replacement is safe.

To regenerate: otool -tV IONVMeFamily > disasm.txt (binary at Contents/MacOS/IONVMeFamily from the decoded original kext).


1. bufattr_passive — in IONVMeBlockStorageDevice::doAsyncReadWrite

Call site (offsets are file-relative within the binary):

000000000000787a    movq   (%rdi), %rax
000000000000787d    callq  *__ZN11NVMeGlobalsD0Ev(%rax)   ; ::doAsyncReadWrite preamble
0000000000007883    xorl   %ebx, %ebx
0000000000007885    testb  %al, %al
0000000000007887    je     0x78ae
0000000000007889    testq  %r14, %r14                     ; r14 = IOStorageAttributes*
000000000000788c    movl   $0x0, %r15d                    ; r15 (passive flag) = 0
0000000000007892    je     0x78b1                         ; null attrs   -> r15 stays 0
0000000000007894    movb   0x2(%r14), %bl                 ; priority class byte
0000000000007898    shrb   $0x6, %bl
000000000000789b    movq   0x18(%r14), %rdi               ; rdi = bufattr_t
000000000000789f    testq  %rdi, %rdi
00000000000078a2    je     0x78ae                         ; null bufattr -> r15 = 0
00000000000078a4    callq  _bufattr_passive               ; <-- THE CALL
00000000000078a9    movl   %eax, %r15d                    ; r15 = passive bit
00000000000078ac    jmp    0x78b1
00000000000078ae    xorl   %r15d, %r15d                   ; (fallback) r15 = 0
00000000000078b1    leaq   _gNVMeDebugFlags(%rip), %rax
...
0000000000007904    movl   %r15d, -0x58(%rbp)             ; spill passive flag to stack

Later in the same function r15 is reloaded into %r9b (5th integer argument) of AppleNVMeRequest::BuildCommandRead / BuildCommandWrite:

000000000000798e    movzbl  %al, %r8d
0000000000007992    movl    -0x58(%rbp), %eax
0000000000007995    movzbl  %al, %r9d                     ; r9b = passive flag
0000000000007999    movq    %rbx, %rdi
000000000000799c    movq    -0x40(%rbp), %rdx
00000000000079a0    callq   __ZN16AppleNVMeRequest17BuildCommandWriteEjyyhh

Why redirect to _bufattr_throttled is safe

Two existing fallback paths in the source already zero r15 (null IOStorageAttributes* at 0x788c/0x7892, null bufattr_t at 0x78a2), meaning "no passive flag" is a code-supported normal state. The function proceeds correctly with r15 = 0.

The 5th argument to BuildCommandRead/Write is the NVMe Dataset Management hint byte (see NVMe 1.x spec, command CDW13). It contains:

  • Access Frequency (4 bits)
  • Access Latency (2 bits)
  • Sequential Request (1 bit)
  • Incompressible (1 bit)

With the passive bit always 0, the SSD treats the request as default-priority. With the throttled bit (the 10.9 bufattr_throttled semantic) standing in for it, background I/O from throttled processes will set the hint correctly in the same cases 10.10 would have. Worst case: marginal foreground/background contention difference. Functional behavior is preserved.


2. AMFI symbols — in IONVMeBlockStorageDevice::ValidateEntitlement(const char*)

The two AMFI symbols (metaClass, copyEntitlements) are referenced from exactly one function:

__ZN24IONVMeBlockStorageDevice19ValidateEntitlementEPKc:
000000000000874e    pushq  %rbp
...
000000000000875f    callq  _current_task
0000000000008764    movq   %rax, %rdi
0000000000008767    callq  _get_bsdtask_info               ; r15 = caller proc*
000000000000876c    movq   %rax, %r15
000000000000876f    leaq   "AppleMobileFileIntegrity"(%rip), %rdi
0000000000008776    xorl   %r13d, %r13d
0000000000008779    xorl   %esi, %esi
000000000000877b    callq  __ZN9IOService15serviceMatchingEPKcP12OSDictionary
0000000000008780    movq   %rax, %rbx
0000000000008783    testq  %rbx, %rbx
0000000000008786    je     0x8840                          ; if dict NULL, return false
000000000000878c    movabsq $0x2540be400, %rsi            ; 10s timeout
0000000000008796    movq   %rbx, %rdi
0000000000008799    callq  __ZN9IOService22waitForMatchingServiceEP12OSDictionaryy
000000000000879e    movq   %rax, %r13                      ; r13 = AMFI service (NULL on 10.9)
00000000000087a1    movq   (%rbx), %rax
00000000000087a4    movq   %rbx, %rdi
00000000000087a7    callq  *0x28(%rax)                     ; release matching dict
00000000000087aa    testq  %r13, %r13
00000000000087ad    je     0x883d                          ; <-- TAKEN ON 10.9 (no AMFI service)
                                                            ;     -> returns false
00000000000087b3    movq   0x6896(%rip), %rax              ; load AMFI metaClass ptr (DEAD)
00000000000087ba    movq   (%rax), %rsi
00000000000087bd    movq   %r13, %rdi
00000000000087c0    callq  __ZN15OSMetaClassBase12safeMetaCastEPKS_PK11OSMetaClass  ; DEAD
00000000000087c5    xorl   %r12d, %r12d
00000000000087c8    testq  %rax, %rax
00000000000087cb    je     0x8801
00000000000087cd    movq   %rax, %rdi
00000000000087d0    movq   %r15, %rsi
00000000000087d3    callq  __ZN24AppleMobileFileIntegrity16copyEntitlementsEP4proc  ; DEAD
00000000000087d8    movq   %rax, %r12                      ; entitlements dict
...
0000000000008820    movq   0x68b9(%rip), %rcx              ; kOSBooleanTrue
0000000000008827    movq   (%rcx), %rcx
000000000000882a    cmpq   (%rcx), %rax
000000000000882d    sete   %r13b                           ; return value
...
000000000000883d    xorl   %r13d, %r13d                    ; <-- 10.9 LANDS HERE
                                                            ;     return false

Why redirects to IOService::metaClass and _get_bsdtask_info are safe

waitForMatchingService("AppleMobileFileIntegrity", 10s) returns NULL on a system without AMFI (which 10.9 is). The testq %r13, %r13 / je 0x883d branch is taken, jumping past every AMFI symbol reference. The redirect targets are never executed at runtime — they only need to make the kxld linker happy at load time.

IOService::metaClass is the right shape (it's a const OSMetaClass *). _get_bsdtask_info happens to take a pointer argument and return one; if it ever were called (it can't be — see above), it would simply return the caller's bsd_info, which would then fail downstream type checks harmlessly.

Where ValidateEntitlement is called from

Single caller: IONVMeBlockStorageDevice::setProperties(OSObject*), only when the input dictionary contains key "SSDThermalThrottlingInfo", checking entitlement "com.apple.ssdthrottle.allow":

0000000000008543    je     0x861f                          ; if no SSDThermalThrottlingInfo key, skip
0000000000008549    leaq   "com.apple.ssdthrottle.allow"(%rip), %rsi
0000000000008550    callq  __ZN24IONVMeBlockStorageDevice19ValidateEntitlementEPKc
0000000000008555    movl   $0xe00002c1, %r15d              ; kIOReturnNotPrivileged
000000000000855b    testb  %al, %al
000000000000855d    je     0x873b                          ; if not entitled, return error

setProperties is the IOKit path triggered by userspace IORegistryEntrySetCFProperties(). It is not invoked during boot, by the storage stack, by Disk Utility, by fsck, or by any normal application. Only an Apple-internal thermal-management tool would push this key, and even then only on an Apple-shipped NVMe drive. Always returning false from ValidateEntitlement (the 10.9 outcome) makes setProperties return kIOReturnNotPrivileged for the thermal-throttle path, which a Hackintosh will never exercise.


3. IOService::init overloads (vtable-only references)

Searching the disassembly for these symbols returns zero matches in callq instructions. They appear only in the relocation table for __DATA,__const:

0000f438  __ZN9IOService4initEP12OSDictionary                       (vtable slot)
0000fe78  __ZN9IOService4initEP12OSDictionary                       (vtable slot)
0000f5e0  __ZN9IOService4initEP15IORegistryEntryPK15IORegistryPlane (vtable slot)
00010020  __ZN9IOService4initEP15IORegistryEntryPK15IORegistryPlane (vtable slot)
00010a50  __ZN9IOService4initEP15IORegistryEntryPK15IORegistryPlane (vtable slot)
00012480  __ZN9IOService4initEP15IORegistryEntryPK15IORegistryPlane (vtable slot)

Two of the kext's four classes have init(OSDictionary*) slots; all four have the registry-entry init slot.

Why redirect to IORegistryEntry::init is safe

10.9's IOService does not override init(OSDictionary*) or init(IORegistryEntry*, IORegistryPlane*). Both slots are inherited from IORegistryEntry. On 10.10 Apple apparently added explicit overrides (or SDK declarations that caused the compiler to emit IOService:: mangling), which is why the binary references the IOService-mangled names.

Pointing these vtable slots at the IORegistryEntry::init symbols (which do exist in 10.9) makes the kext dispatch through exactly the code that 10.9-native code dispatches through. C++ vtable indices are not affected by the redirect: kxld resolves symbol names to addresses without typechecking, and IORegistryEntry::init operates correctly on IOService* pointers (because IOService is-a IORegistryEntry).

The remaining risk — if Apple silently added new virtual methods to IOService between 10.9 and 10.10 outside the reserved slots, the vtable indices for everything after the addition would shift, and dispatch would go to the wrong methods. The original Yosemite kext's symbol table contains no such extra IOService virtual symbols beyond the two init overloads already accounted for, suggesting the layout is unchanged. This is verifiable empirically only by booting; if a panic names a misdispatched method, the fix is the same pattern (redirect that vtable slot to its 10.9 equivalent).


4. The actual lockout — Info.plist matching dictionary, not binary

The binary search above intentionally went hunting for a vendor-ID lockout in code: PCI vendor-ID literals (0x106B), comparison patterns, getProperty("vendor-id") calls, probe()/start() overrides on AppleNVMeController that could host a runtime check. None exist.

Specifically:

  • No 0x106B or other Apple-assigned vendor-ID literal anywhere in the binary (grep -E "movabsq|cmpl|movl.*\\$0x" disasm.txt | grep 0x106[bB] → empty)
  • No PCI-config-read symbols (IOPCIDevice::configRead*) imported at all
  • Zero direct callsites to getProperty / copyProperty anywhere in __text. The imports exist only because IOKit-derived classes inherit these methods into their vtables — they're not actually invoked from this kext's code.
  • No probe() or start() override on AppleNVMeController — of the 166 methods the class defines, none are lifecycle hooks where a vendor check could be inserted. Only terminate/willTerminate/didTerminate exist on the shutdown side. The kext relies on IOService's default start, which contains no driver-specific gates.
  • InitializePCI checks two properties: "built-in" and "IOPCITunnelled". Both via virtual dispatch (callq *0x2b8(%rax) on the IOPCIDevice). Neither is a vendor check; the first sets a flag if the device is a built-in PCI device, the second sets a flag if it's on a Thunderbolt tunnel.
  • No vendor/manufacturer strings: no "Samsung", "Toshiba", "SK hynix", "Apple SSD", "AP04", "MZ-V…", or similar literals in the binary's string sections. Only the kext's own class names (AppleNVMeController, AppleNVMeRequest, etc.) and diagnostic format strings.

So the binary is genuinely vendor-agnostic. The lockout is implemented one level higher — in the matching dictionary itself.

The Info.plist evidence

Contents/Info.plist, IOKitPersonalitiesAppleNVMeController:

<key>IOPCIClassMatch</key>
<string>0x01800200&amp;0xffffff00</string>
<key>IOProviderClass</key>
<string>IOPCIDevice</string>

(no IONameMatch, no IOPCIPrimaryMatch, no IOPCIMatch — just this one class-code match.)

Decoding IOPCIClassMatch = 0x01800200&0xffffff00:

The PCI Class Code register at config space offset 0x08 is a 32-bit register with layout (MSB→LSB): base class, subclass, programming interface, revision. The mask 0xffffff00 zeroes out the revision byte, matching only the upper 24 bits.

Apple's value, parsed as bytes:

Byte Apple's match What it means Standard NVMe value
[31:24] base class 0x01 Mass Storage Controller 0x01
[23:16] subclass 0x80 "Other Mass Storage" — non-standard, Apple-customized 0x08 (Non-Volatile Memory)
[15:8] programming interface 0x02 NVMe 0x02
[7:0] revision masked masked

Apple's NVMe SSDs report subclass 0x80, a value that the PCI SIG designates as "Other Mass Storage Controller" (i.e. catchall / vendor discretion). Every third-party NVMe controller in existence — Samsung, WD/SanDisk, Phison, SK hynix, Marvell, Intel, Micron, etc. — reports subclass 0x08 (Non-Volatile Memory) per the standard.

The kext's IOPCIClassMatch therefore silently fails to match any standard-spec NVMe controller. The binary's generic NVMe-protocol code path never runs against third-party hardware because IOKit never selects this driver to start with. There's no error, no warning, no log entry — the device just never gets a driver.

The fix

-<string>0x01800200&amp;0xffffff00</string>
+<string>0x01080200&amp;0xffffff00</string>

Flips subclass byte 0x800x08. After this edit:

  • The kext matches every standard-spec NVMe controller.
  • It will no longer match Apple's own NVMe SSDs (subclass 0x80), which is fine — Hackintoshes don't have those.
  • If you wanted both, you'd need to switch to IOPCIPrimaryMatch with multiple values, but there's no reason to bother on a Hackintosh.

Why this wasn't in any pre-existing patch set

Pike Alpha's well-known IONVMeFamily patches (June 2016 onward) target a different lockout mechanism: by El Capitan, the kext had switched to IONameMatch keys like pci144d,a804 (Samsung VID 144d + Apple-blessed device ID a804). His patches change those device-ID strings to enable specific drives. Yosemite's matching scheme — class-code only, with the non-standard subclass — is conceptually simpler and predates that change.

He never published a Yosemite patch because:

  1. By June 2016, Yosemite was a year out of date — the active community target was El Capitan/Sierra.
  2. The Yosemite lockout is a one-line plist edit, too trivial to write a blog post about.

The lockout has been hiding in plain sight for the entire lifetime of the IONVMeFamily kext. This is essentially the missing Yosemite chapter of his work.

Why static-analysis tools missed it

Neither kextlibs nor kextutil -tn validates IOPCIClassMatch against real hardware — they only check symbol linkage and dependency resolution. A patched kext can pass both with flying colors and still fail to attach to anything. The matching dictionary is data interpreted at I/O Kit matching time by IOPCIFamily, not at link time by the kext loader.

The only way to catch this kind of gate without booting is to manually read the Info.plist and decode the IOPCIClassMatch value against the PCI SIG class-code definitions. Which I should have done first.

H4sIALAf/2kAA+y9CXhURdYw3J09bDcoYFSUgEGDC6RFlojRXOiG29KBKIs4CoIkSEY2k27ABU2m
E8P12hIHHZj3dWHGccTRGXFwCGvSTSAJymhABkEUAzrYsVXAJezp/5xTdZfeAjrzzf98zzd5xO6+
VXWq6tSpOkudc659/LjJ+UWjZ8wtnvPwwAeLFjsHmf7tf9nZ2cOGDMmgz6HsE/7UT/bDMsQybNhQ
y41Db7JkZMOPmyymjCH//qFE/rlKnTNKYCi3z583wzl7xrxY9RbNLiqa0wGc0Ell/PsH+n/mzx6x
/qPmz3MWzXOW/vsI4aev/9Bhg4f+d/3/E38drP99o+YXFk0ofgDw4iop+hfI4Sev/42WoYP/u///
I38drL993qz5AxfMKS51/ot9AD6G3nRTzPUfctPQYWHrnz3sxhtNGdn/lhme5+//8fW/5bbFc+dk
LCwqKS2ePy+3n2Vgdr+Monkz5xcWz3sgt9+kiaNvGN7vtls73dLXOn7UxLsLbBlEEBkFk0Y67KMy
+t0waJC4YMGcokGDrBOtGQUO+4SJGQBj0CDbuH4Z/WY7nQtuHjRo0aJFA2dgrYEz58/FiqWDCkrm
LygqcT7sAGA3QIOBhc7CftANgx4yHHhaWDzTeWun1FseLHr41pGu4jmF+TNmzi6eVzR+Av26ZRAW
QHmpswSGfavlptGWYbcM4r94u1GjR7rmFc4pshYtLJozf8FcIPE7ix6AXsJb2+Y9AIOYHau9bXHR
TJdzxv1zisIbGrdSrNZjipy4rSZQYcS4AQ/Z12eMmr/g4ZLiB2Y7M7a+nnFjtuXGG+B/gzMIzxn2
eTMHZohz5mRQjdKMkqLSopKFRYUDY/VoL4SZFs8qLioJ7w4Wgy9L8fwHi50DL2T8OHgrrAbgbUbJ
w5PZOoUDHjowO1b7cTPm/iy8FcyY+eCMB4omPrwgovlY25SJsZpNmD2/xMlH2QHOYzZXmV94q9vg
L1ajGEiJ2pF14qj5cxcUz+locWbyGqUD58xZOHfgzDkz5j0w0HJfFFgFc2Y4Z80vmRt1Uwy1Drlp
8KzYjWIMe0x+ZJMJ1rEx9p3tpijDgurRln3ujJnzSxdbsgdasouB45TMmzEnsu0UOIkiWmYPHRyl
G6r6E6ZuHz+22FkAswZSnlPsLC4q1drx84bVo32HFIqMsWT+HMNi6TXPt+dSf+quUyHOLl5QWuTM
MCJQhzVhgjXDOKrw1vbxo+bMKC2NbBh1TpGtC0bZCUD+DOfM2ZFQshdnW4ZnA7fOvnrG3AUjshfP
or/s7BiwCma4SouQ4Gc4iw3nJ1RxlriKBoXVnuiaN69ozgVWL5m/sLiwqCTGdAkeHPzFM4uiDW3S
vGJndAQXFpc+GNmiYPbDpcUzZ8yBwxjoduZ8GOdMZ2Rj6PMG2+IFcEKXXiCMDMf8mTOchl1omELk
FuGQJhfNK5xfEoNCaKGNbW4ZpDLTQUauipwUKVdH9085xtTWjuL7S2aUxNxJOukXlhQDjx9Io8uf
fz8cb6OLkbk4ix4oKXY+rO8vQ6+WkGmEwlO3EqBc3UlRIGRfAIQ7ixYAy4gN5AJATHDOLwFeFRPG
sA6hPLigeOD9pYUR7XLOMwFsRyP4WS3nFN//INDXz2oLB/nsn9VwAVDBDGfRz2rrmlfqWoBLVXR+
VEUn9TuLHnIVlxRFcAvcg3NuuHP+fKcOQoVwyyASUG/t9P+32P5v++tA/wMhe/yEf4cV6Kfbf4YN
y87+r/7/n/jrYP25FvavmwDOo/+Dsh9h/7lp2LD/6v//ib//O/X/GMLJkMH/hxTBnyIMwdR+CbLc
T9V0J8x3lcyM2RGjqsFD2ee/kTGd9/w3VviZNNbh+Q/73hKx/2/MHjz4v/v/P/H3welv2pNNJnM8
fO8M/1Lg38oEk6mSl18K/4abTab77ptomzIxCoBj0X8DTFMi/Ivnj++7zwnEpVcLh3csmX2eaNJ/
JxjhJpjKjD/vu28m2wMx4H3ZzD6nXRH6W/2LCxs2wJs/z8DmwuEVfMs+15j13yHjC/tDvC2OQzhW
caJoKFDxlRf9N6Ihnn+ycTww38h8Y8E7afgdb4r9d999c+cX3lcMGu99s1zzZkbAO8nhFRh+G+Gl
RoUHuunc6PCk46Hw8LcRXviBFbkOofBWcXhSjv67o3W4777CGc4Zxt+h8I5dyxZ0ZZz+u2N4wMPm
zp+n/w6Ft/QGBm+pWX9mnK/hMW9/f2lpyO9QeGmDWIsuhjodwUO6kwiOwz5urM1qV2k4m9dcYA75
XTCPfSaHwUJ0pMO/rKFmkwsQkl1nNk1pZGeEupY5/N9n0DAdGkwN31RR/hYvMZuGpbD+t8PH5byf
Tz8+dHsv//DA/w74+tzhUSvyrsW5U4u8OFOhyXQF/139ZJzJe8n5+/nv33///vsX+TdJkv85tfUx
/k3yJL7RCgeGnCx5cg/1M5umtqqVJkjur9Ml+T3J4/JvxNNHkj8LTpAqva6bLd7yJf6i/MnjXIOU
/K/dp8yuzkr+Mbnr8P5mU6B35Q5XupJ4PXyXbcdCW2dJ7m3p90ytr6a+3V+nQf/Xsf4bbWexZxhG
SRN+uM5uxGPYjw8rvc5UxXZWTvwo04w1hsNAqQDApanQPImH/OpMLtFmQmUTCiT5DFTwUoV4qNDW
V4UgfwZAUu7R5y3eJU4WJ07Il9/Plxvt8k5J/lCSj0vyaWj2CRyAFq8k75Xkd1nzygPO7lCwnxcc
pKf5lV/Q03p66pCP8KdBevo2f9pOT5WpafmVbVTwe17QxiaNkGd+D8+fp+d+jp7l+q86PLDvEe8V
p4n3hU1gEkxBKv96JU3xlKQk7jkC3xT4YWuubBMq2qHA4Skqc3i23BsMBiXZUwAf8t+mwP/d7Wmb
8KgVRh6UX3TAg1o88HFkX0qenj0b1VU54JA/d5ZalVexkXhij+g+e3T9UfhuFUa3wG+H8jcE6vD8
eTpWENZ1q03ggIIA6KMGDmhjAVsIFSXiU0lLfWW+ZmHdDvep8SVxawaKS20me3C7PdggBne6/maX
P1FoYKJ8cGRDxRAEj+j35MoAE/AteZ7HZwxlCk3NYT6u0OwGHBQqu+KUlUTvPxlORtiaXRdJ5dtW
cnROJYTW+1WMAuB/XoUUZTsXDLI7joFCnwqTXp5YhOiVE2uvIgJd0Sca/Q05tR1XsKcI1LlhtZnP
HhqvPsrokgixnu1QbRtiW38/B1W87Yixog7bH8fK+0SWT21Ncqi7/uxYI8xv4VctDiN0D6i7qRS2
iLEPGH8OG39537Dx+78NH784eUKdXkOud3iGXAWtaJHb/BPHUrOH/knNHPIJXm3fPeI0rT10Ca2+
yTCbsElf1uRWrQlW1cer1d/C6x+/nep3i1WfbXK73GaXzzo8uY9DM7Et2ey8AlZv1jZsO6QcPjY+
xwn2OA3R7m6Pc020K5szV+HZ1KUaiLVsc+Zs3Ieua2F/+ItABJJ9lTuccLTlvrgNG8vvM6purMhE
CQtlJA3CvmUmU+svzXg4tLkkDZZQORk+aECXAZwxbEDH6mFAL5q07Y/9iWYdMv61XmHGgmOSu+Wc
5D5pFirrsG+F1YCDtL/7ZJxQeRShtCEAKY4ed4NuCrdpoLWu/866dmHXe/SucaTFNNKKCmP1S4lC
hozG6gf16jaYbx5Ut8EReI3lgF1JyLQrT2eiXikpN+2HcQSrp6TgQFwpUrDemnOm5IDYUMG6CNgI
/BgAv5eN5sutAD4QsjKBLDadRiP+rzDi3ya/QzjAWq8kYIF6ctZrNO7eRCvkGlxrZkeSf4DZAC95
hwFe2aZyrOQcSHUDA9Tfw+i3ZTe2rknkrW+H1k3QOnCjpQ0LWpJ4gQUKhmLBpZY21sattukFRZ3f
ZT0a9mfoLmNUXwerLipJq+OcWZLStfshUKPNJ+CMc15a19vUMwlBW3bYLF6bZQdbPqjLFmxdPWE0
B2n9DrO2YIY5fJ9A63KFpGxaTxwv6BQkJdnSFqxew5YsDlE5jZ8VfGeJuLPg6O+fSUNLyISxDYCx
uVq0sV1WlxF9bFCZUxMb3OVITQn64OxKnTqSvnwk62Ekcn3lAaFyI1FnGxD+GlyWzpYDtgrgd69Q
uyo0LjTm9WD91KDEYTmwkeaKQwC+5L8alCtRbrABT+4ttiVkmp2zYSQ7t9JInkXCAxnEFHDowMzD
R6vAOChxvZm2Z9C/L06Dlsmg4bxeZdBGIbSh+rys8vd4BHKijMSmf1wvGnaemQFv7RVjTqEzmkhj
2Gar/EKonMCbfhfStKMZ9DK07mmmVjhYt5Rlhq/H+FfAsbM7JxpsdRLgB1Lw2/B0vf0/VMrayKFj
s2T/21AlkOifdale8w21plYp7TKqtOsyvdKTEZXGj6RK/a5RK7mKoMA1xMaQhsswAI+fZLuyTD98
guzw4S0G0wH0fcl+qEZlLVBms3xR4XWmwyPA00qzPoNg9bEUXLmWyHWbUMCWDUgb+r0mZr+wgzpB
nxYv9nqAtrcBkiSflJT1aE1Aeu+ilOEJBSd7/MK4qfVSbcmiggyUxCVP19txT8xMKJfMTcEWaSOx
g9Gjx/NTA3/bJkwSCwy/TXdOKHDov22T7RNHiZxL1sEW/QD+fQb/UKajsTCKkY/LPVL4CaTJmqAs
WGXbHjm/WZ60U5RP2OVzgLRAV5JR2cYOfmBXKhGAMqW3+0zQeWVbfZxrkLzvKttOJb/5Q7/N0jbC
tsdZClzC1RS4VQxuE4WabWLtR3Gmllw/7EvXXwOTlaVpSCe1rfAw6HOfiisZZdmhPGfucSmixZcg
uU91cR0NDATm/3o6HD21e6Fim8ns7A0b738aaeO9Ch8b/9iFjtb9fOsdI9VEF/74+QpLCEcsUVnF
bme6/6M8WrAcjUGMRLrs5d/Vn5731Z4XXkoP0kDsxROfxI+vTChfaielCr3NjcY74MprEUvl7QUw
YmdX+JIWb2oRKpHjw2wOXGI24TxQQtlUS/N4Dz42LqEDxMr5oKTEo6ZVvTIZ0OxGWnE3xQHLdw3X
Rjb5dDDIOf7fa7XDh/EltBwR87kOSgfWGflSoB30A5UTvl1n4IQwuL0kZ31mldtwfsFVWQkhyhTs
AvXcmJ7Vrp4b8BUQADzCdAlKX3g6Xgnoeh/gD/DRBEfAx8ZLEw0nfxWjnx5IPy7c9EP0Y/V21igJ
Gw3UG5W/Z/JC02DVKsBA7dKLYVLdyz8P3hYMQgksZ+30rzTI8pQepK1uQClNXB/HNrmmYqWC/L9+
ByxP2G6fDDNs1ykdBF5UDIeLSu0+PKMy1AK73IDKXh9cJc+Q9lqu9nwXrG6mozUJBNVgQZZREia5
pExBCsnzb0Ey9AoVb/Kl/IxJ7/6r4tlnZTwR3Wz83j+Rvt+rrM3jte5KoicjG914ghXCH1v05aeQ
IFy9VdpJS6V6XbAsNRlN3oE8HcqnyezzthSktk1ezom7AyfGoTe6vSb2B1/X86+gm+lSC9MmlE3V
RK6grg9JBkQAD49DSF5nMpttmlYlcfpH+JHNcetmzB/QsJd+N9LzCq/rWlVEUZKJ2IPVTWyMoQ/3
6Q95S2cqn0igr6F2GnGzYHVKKvUiydpcZ+Bcq9MJIe4mNhrnTXpTmFLuFm1Ksg+m4KIppK0xSyM6
ua5iM0wJXKYiMBx3GsIM3IREvdw9F5OmkiJUgqppYkdHmlDRi7hKvEMZcmYvUhIIj0PSYAwb4hmp
AIXhWJSuc/bih0VFG+FxPw0hBZ4Fn5XwyEC9YRs9VFeJQWzezCFq4PpHAfdUGDhNxFNr8W1QBBCX
bsYddkJt7LwVNgE8fpI91kTMazQN46HNtMl/Cx8bL4/XNnmDuwx6MrMtpPPQ4PQsA0PVqI+jzXkH
krzStekfOODuAHbB5igoy/lH+Byd6WHociU3uFH8Nxulc3b2AWfMwKVT+t/xD1yZhExJtu2TGm1N
bJPYvOzcXk4nW5xye4IE8r7vSIZYiyeNhPqbKYP6PSFUoNVe8tySJLmDQaGiH/6qYyQjmKS+7UKl
AI+UXycA93GfhhrIAWqfgKP7qrU4ZffheN/h5NTv5OX4S6hpDm4tP23GOvg/YeR38tpPcHnfl9ei
tuc+JMhKC3zx+dOLvT+gLuRGKbHRPQe+r7wZv+VxzVNSaCsoeSmyG+/a3Ceh+3LiJ77WNGHdDmHd
Wauwrkny9ByEwgboa54lXrbLvKJ8EoVFlYN5hvTYyM/G08HqBXEaoYN05slN26gdp41oVOPHaZyh
yew4RDXJbwVZhPMRtn2uNMbmM7TTW7PwsB0Gh7hdqV2F538Znv9XPYOd+lqTdaHVP+117PdJXIdN
tbg+SPFH+UHk+jOKkU/ioS8qzyAGYa3+zohmh/MiZKQnpRPHQXyD/ftrnSs8mRUCbim1X0ftfUfi
VcLDfVKcyBQd12D8lZPEf12Bv/YnYe+NoPEAUu7DJ1Ukm57Br94UxEgtdmQAzfpvpP7xL5Bm+EED
gjZEc3RCQaF6jSTvC5dUNVkQ8BhEG+MLOA35h9s9Xf5JZxrMvsl+4gc2+2cIZR9wBFShVLxBQwCS
jcNzw5x0ohM7P7pJYm6ieZAUfbuccBz4Nn1Veh9DptRvOVbbtIpoFM15QTT9yZtOUvM3cDfYgw22
nB9cfwp0tjdSWxrbDpy59pNGIjexGWoioW4LayTJCs8J/5Qf0JRo5CZC5V9NUdiOlMp49/NEFYld
ujFxri8Q9AvsTNtMH10DeLS90Vm3+eqQ2NFbkKrLedXJxgqSfDBYvYozaG0z9Vz5PkwpgZ1qVGV1
sirwYSXGjczhHEfVO8+itWo4V0BGoS5ztU0+waw4oMh8RtabZmSqwXq1qpjzmQulQQONVWSq2I20
u8AMsngHlylrQ4gTmKJKj5J7E11OO1Nw5EcT6Ylff/JbfKKslQhSm/MSFUc0tka3pB1Um7LN4UKL
Sta6LRThVxtH6DVdgKQTLucwucm/uh1t7J/5O5Hh+SeBqg7RvNwNCUqXFCUhW/K1ZEipTeHlSgLX
zJ6qQoYYyonk7+GEEzc30jY7IFQIug13SNnfdFlKVbCPMlKd0dmMCjBQq1DxCSEw8du/k0SmkRlu
Wp+JsX3PkBwGK/hsShwvexXK6uJMIee2ULGMzrnaFLNRRubCcx87yVHt79C+l+SPmYzM17QgC9ol
dNBud6x2TL5YQcUnInlFVE2enWpIBfLU5rrpeo9upEexTju3VphQnTDpmLRZvrEJNbA8S5qt8hH/
ADJxNKKCe7HNMyfTbLMEQcfdDhLEwo8C91oOzLJVfuO8CVphC4dSg/Dtnpuu9J/oQXJQqr3RemUG
o476bDG4HVtbc1pcH0jK1GagrGPqCNTNo7qXWIHzhB5nIfpZe12ZWWdHfuO0nItqy8z6lCwHrELN
5xuZanQCZ3W8hzari0TPvTQroaYeJ7UncPMsWJRLLQeEmgNQXT7oH9sTzrB6KMdhtwJ7Qai1eu+N
1DsfcjSrCppUgirfqMbDpnaLugBVONANrLnZXIuDpGtEVbiAFmhK2aQ1GIEcwWBF6dmdlLJG9RaO
GRXPmcjquFSHPnr0eLR0GSvtC6tE1hZuJzLWWxMODK0wHJ/GektD6zHrzMb4sHquQrtSs5S0x7pq
Eg57pr1BbJPbU6nSbWR7YhWUlUjx6r4fvIVvlK3BD9nWyd5iNG+hD1NgsDoOLgVUqd4tGkz+vJo/
F+WDTNYKlRBITzbQwm0Xc1pAC0WHtKDfDKmSmuVAvlLL90cflHD2dNe2SB9ti0juM9Nde+2spr4x
ALK6MaLpB7CRlkawCHXOqBRFFKoTD7XOM/sONFiFHX/qApo2r53DLJGPC/B8NZF5mz/9BYK7is+0
1eticqlQ8+Qa6nIZ8cfGBB8bQR02nNo66AX1vs5w/ge9gM3SBIs3cCW0w8fANCy7PQm9lARg8lsT
QAl1n+7i+jZsV7UjSye0zGq0pvdmH1eCRO9Iz3IfOuveESfDN0l5LD3FAf/LICW4yczJp8EfgvK/
ETB/BLCywvSs9guEURthC2XCHp5JNwKDHxh8H+S2TlLQpxYoCU3CujKGsRUcY1sRZs77rn1sVRwM
U4AZP6uGE1YeSg++r4xM97WkJaLMmHpMlPMyFTFNsfeQlBpC7egsFcnS9crINOV2KFlBv0dmayU3
hWvssKgod+QJ69r8Z2TSkkg+kVeuItyUvUNkU4e+TQYtg51VDWLdZjio8lGYPky7LQlvuUAtPmZW
j1x2wccvVjddrT/+H0aqTAHfiPD9Oyu1g7qID6Rs6Tqol9Dg/iVpr1x6QrbeS63r7BQYhk/+koWX
XljP5DrKIfttZZrdqroljkuYDf5VZE9v5LVUIXgjl4TNxqmcNFq+NC4VwqGIOqOhCHi+yqYOOKcB
jyeh1oge121oe0CbABw3R4Zojy9ThUMcNBU3+APJfNAqmJNGwSF0aCFW/r0iAlDXWvSMCYqeccAC
jwk1u/yfPh1z1WMi303cHhB/O/4ack0k4pVlaAP0iGbQ4dcjBqw5p0t6g6Id9Ak1O6w5x0sEfbSt
Lz8ecc7pcg2N/we7fM6ubKFzashDuCI29W7lKFe65EbRY800TA2ZalAxmfLlt1aZWBOo7ZDbg9XT
+X2caxAIKDtFpYpGWwCj3U1aZc67JT19/rSgV6jxWmC4x+ipMGq/EUgzqXpsTG8t0FXOcBs9oV45
Rvysx0LJdzhBeax7lsWb19ZoZvvA4XF2z4ITqDs7iLrDQeT+IE6Ub1UJVH6ZLUwVWxiH4uietj4Y
BB3P2j0dUCzUvE+3ae/7v6vQljPm8m27iC9fX/y1sH+UfdN1CV5TdjOH8DV1PYxMY/V8HM4bOLvx
nsyFdt8XCYzkR7VZ+2fB/EhXll0g/MWrJn51wcjKVjhWcfZnkxkVb+2Ps5EUG8yoiWZ0wp9Roe2K
AXb5pVUmlejhRGEryUs7j/VAl2UpKN8ZajSnaLzLnzI/lqRJY5va+uerOcfivxd11jgYsSrljh5k
YHefBu5afpis9O+i57d8Rw+Ll+873nZqF6M3B8fdCQPu5syjtWK4u/4Ju++fCWIt4m5kmzUry+y8
JwrOtqHz1kig2hPoKDDbjc9eyGRIIUgj3YVZyMLY/I+oGGowPDFipG2uersUAyOVV+s+LNrS0zki
1LT5v/zVTz89bGl4+YrfzvSLQnq/fgRHdFxSlrMt08Uu+Q4luAs7ZbWHUiNqjGdgrcs2oURmEirG
s/MwgswYQRKbuh51soJ4ZqxqUbA4BkU5PP1Tzpn4vc/1oCU9iXqgTXmGLjc8uWtfJ/m005/gwE9N
Yndcp5hShewNcSAqT7KbEPcqM+vxncXQ/R28+xkddR+z3xGs31+/jldP4f268kRe0XcoQ+qsrCKU
0weqcgQTL+ieY0DyX6fnG69MMlhzQjZOhI4DosQqUtxD5QiQ51Wj9b1M33FvQoUjriQ/YkUAH5wU
kKttmasZSvsxQ+kVr5uiG0qhkyhSO7NjkI1oPYojbdvjXLdzI4qyHI015Ydgg6KdlMSc3z/PTPZl
yikcIK/pv3slWo/3mYw2lkvRHBJmMad9nC9vk98j76ygKH8qyR/BvnLIXxEGRzUkXA9ag7zP7W1f
3EtaKQrrEhKC77lPZjgD0sx6sSEhAackKWULiLcHAdkO+XDoDgy2GO1ckvvrPDvtPYfS/09bdDO9
xdvmplkIlcuR4IR1o/MrvMLzPvfJlPTdFbtccWtSrMK6k3T32e7/ezvdpD3If6KXrd0zOQFwvuk1
5EJLVm3owRCQL5/0p8LsoTgdiv8ExRuy9KJvAZDd3ZAHRS9gUYoq432Hpc3cmnTnWaildMmURuTv
c3WFCebFsmyrBwsu/1QASPLghjwSx8riuJ1wyIyQEqInXijS5aZ16XHxwy/zZ56AuhNxWBnasIxg
JnRcRAq5Ws4K+QnjHG60ETXQgfI8k3slpeuNaB5VUtlFzQ2v8QsiNO4ELtLvXjnXmyH6vuxinxk0
3r2yywJmADr7R90AxO5e+R5g4zz6R330bIuc715Js6ScoFsE5jqCms2mrSif5iJahV8dZLPhktUJ
jelsYgfoF0IFTNLE7BZPmJiz2rgy1SLwrIlRJloeviQRCXUckrMezpc3Z3rV8jbL7g3YherG82Ww
Ok+tOd44OHKaA93f//bDvPjSfPmdTCbOJRGCjqjSHEI2eu98qUnyaj080KJ5MF2Y/D43qvw+jsvu
K9vR3Zce3WCU3eE8xpOpzZTiTCnfgaE7gaTyQ8EzWJtKLkicJ/9YXZ5EO6mblHOTq9Ms96YUos5E
Yo+cFNCMnp7KabMM/XjYU/J/aAk9zWxyg9wkT9pjl3+0y2dF4a0GKTEooImNaGOD6RicBAIqtj6h
gpiy0nXiBvzI6Y9ltRfjs0YffsfFCkedULEpZKJG7XCtxnMYvuyk4DBeEaZ3G2qphl2orfmqXlmE
DrBLUkzO67Vn6UUxESzWoRwXyLTLU1O0+v5C4Bm2PbNE2QZqw5I0m+xKBwYZKTJqYAKfG/ng9/oV
nf+ZQuzt0RTWEZpjYPMmAzR0CGRDeTRFNdCMSqEpNo6imCIVxN2FBnHV6HPVLPn8GQ7VqCLKPVJ0
U4qcYAmh7fW4iO725EWzgROcFt3B+EXThJq9DqWGLAye3ndKvs8T0IprVarQfk6nq3//OfSnId2t
cocLUPrYlTRavkrWKzNExXplls0cFN1fJrlbTllTT4rwOIv7BoTa1bD/LKGmQe81T+3Vv4lxJd12
HOatqfpvIXY1JTB7Jihso0DT84q1NMGTSULVThQDa+rzlVdZJ13yMEAE+hHbrL1RGUG/Pbv7sd4p
IC2+TFSa34QhB1HVSTyOl9g9E3tnSZ7EbWtxWZy90zagpiLGO3qnS/KHVqWzuKsVdE1JyW+yCjUJ
kug+FI9Eq+Q3++MWq96Vrv4xlFBenFTW2Uw3idG1yzvuj+YC1qFukXY/0/SNCFrkBHHySxDXETug
cRSixsF1jbujCM6EgTyYDVrRX1+Ej15m0ipBCNU02iM0jfZQTePpGbE0De027wdyxKqj6uNn4ARA
oUcV/ACOfmHkRavcwDlTm3MK6CM/SJ6EhZKn6yV/hZ3QbhaeqxfWTRTjhHXvMV1SlHf4Bz/GOUl6
vlzLliSZCWE6I9EesEVgA9o5PQr3mDxBPsbvQYw0re4k3M1wIHpOG/dSzyh7ibsoc5g6xIXaLnn+
TMxd0lbFnA96qEpqecalIDmRnbULYcz/RF+U2S27lYpOmeSJqJlZvwl8GbHTJBRu95KscLbRtoef
vnjt45m0hx+mKcnMW8shLwHUuppAetyDWoBtr9nVTww26O2Y4x2JMqyR8+NAvE3+0aFAKwVbo7AA
sowk77fJfu22jJ/3BaQr7Ivi/6iaNRd0Cfudxu8Yl7XAz/Uoz33YAlzNU0ExmhxL5CRK+PNYh5pZ
XQoA+vCI8Nax8gZWlUHskRSuATBxHGjuSdL06tgWSxaqJjHVmOziI0ifENyiWd8Gi6ap3iJxrodF
zYCukDnYfYvP5JoJu7QWoTqUN9hOzXwC7SrMouK0ujdRjKxzxiy0ft7DAYOCjZAsu/0WvQfnQLXb
btNwlOhs2spYLnt8Yio+RrWpldwhQscDW88h3+Sze2o7wa9RQo2z/5WS70jS2Hhn/4yNeaqYBAXW
/leSsQwWEjjcqBHW/umzRMHaOGuUDEVQ8BT56ZBs/eFh4a29nqcvYggmvyI5oTu/bVCWzzGzG6SV
5fowC6Z2eEPIV+SslSPO7g4ms1NPqPIST6BZiSMqMtmCEB9Qns7UkC5UojdGvvJmJnEOmLRU3oCT
Huvp/QRxEJjjFTD5liR7vPUKNnmJ2WVNDHFQTCiATSCOsF5B828ASQKeM1nF805mGtFyo6GJ+NTT
mQbMgPD1EUeNXXkuk+Mm8tisZrcvo3tLyrgMGFUCADN3U8Zl7Wq1+Np8cPR5w2IwRnyNxoykOOcw
9XJ4sZk/6S8piY+9ZTKdMFHgQ6+6hGiBD9y+JNRIDkkpKECjjFDj6NRNKZiy6yvLu21bzc7eUAgj
KsjQC/OydvktTavNrl7cAasxrwtnM/6TV7Awl2mhXgJKXm90znre1+zPaDLOQnNEbmAUjPTif/AJ
/fsk+B504727HdkQd/jqvTrO2Qsg8ggA1dsZ3fMZxDxnJ7HtSbJWOfPCt6R2p0VdIGHeXY4xTU/i
T9xPzFxCID/rjf3j7hTLnkF46CTKgCXXrhLIL9FMJ2Cypa21FJAdaV+F81dS1eHE2j+b1KhIdTrk
Xy7nv2BVVqFPuVVZnQ4fSllvfGxbKSdkSp6ef/0tU+drMUUJhVnY5Bab3KoJ0p4hv/utbmUxeLA5
F2F0iushVqluBRcI1jNXw71vmsJdDa83uhraZZ/kyb3rt8wsddgqtyouGKltJVUPXA6FH1EhPqZy
rZB5+SSp5sCetRy3/us5tfyJhp74xpsmLSgS7xCkaBGRIXEpnIHblRo6IA/AEXnj3aiZVeFhAFOw
ywfs7AbToWTuRwOrBaOxcIFh+ffT5mVXmhgr+4snuNXmiP/oZRqYYH1OfUlN1OgYdHxSusYz1AWr
M+JVO65QQfGvntyrXgq1DpSgLksaLJEg8xyZCJOf9QaOcTiqNLtVM92qePIRTjNEqGIU9CVRYLga
At1guZCDw4KZkgw3W7y2OoHg9KwIu1/E3hTWHZvaehvoCZod7ntcqNZCwire8AqaV39TITpqR0SG
lv0Rt8lRhTYNNOoebJLpuzOZ19V3ECi0cRpL0NgdN9VNv4uvvKofN7pxwTAMw/dV91ny8hSyBTwZ
9UhQ4y9LzwaD5YeDyeic+sQTPd2nQaf4FYoQk/Hge6W5ZERgYflpvNB8olP56TJkwgMCheWng/wJ
8hrn7YE7y7eiYx9IV4vGrL/mYmpaOhCtBHtA1YG1ssBxww6eawzqOg+26UFngvt0Z1cnNgeTyai8
tz6SHh5H7f46C1R3hzzXK8lL1s8SlUm9gRN+x8RCOC6vi0PWtiQD4y6BVYjKvcld5H0+f5q7xSwq
+Vny+7u+dR8x5xwTKjF9DAhrwQZxhCvdlWb2ug+dS/W5j8eJcn6WpQ2UqxFVjIXeQfLBe0AXfOM0
EUXfTMSW3yy7doLW1PBPNH3EEe1e9rrGYWwggi1mctJzmTfTl3XvZCK7DW61X/d0Jjp125SKTKxD
7maSMLqpLh24ks6Mlqxn2qC6LesfJe2Njwf1L9i7TbSpfEcSRikJw0S5IhNt46MU67AEuSoDqq02
OweW1T1INKDM9bqub6h6kN1WoKaR3IIs0I6KTF4yrUGgM6tAtcW2ikw65J3d7Ci/HvH3P4fenCfK
QVQ3mxb1wcBXdQGRCUONLb1oOyiunYGLWSP5Y7+VNYOHcGB1uFDv7vrKfdic0yxU/ALtTULNpN6B
eFgvoWa3xZuz1znEfcjszAahw9UbCm0mj9XEJVtN8moG4jRItjfF0a7MMpyisG+/CbXua4z39zh1
z5Cjnxskh5GvGSSH1OiSw9pj/BgYdQ7D79edVB+5G8hJ7/pzuC/IGohSI/BeGpyYRr0Mgl4++aPW
S0Zdp7BeDFfJ1F+Y/WFWIwnpWrw43xiuS2SKlavY7eyqomNNyqWqV6JStdKseSiqd180nwqva5Bq
Er5aFVFfvpOpt+yyx+gss/zOCP8gkbQrLXImrtYL55R/5KlgEDbNgLc5Z263gk6k23RXpSVo8fyJ
UAeepCdopx4bXwi8704SvP1rTCHBT2lJkTd68SwkC/NthNVOTwr1M4Wa6D0BNcvXGO5KgqtWmQzR
++Eux79hIhT3A1ZDYkGmYZtVkeg0kdcwltvEJS66Dyybqn2P4qihMZi52yls7GoYWMEhE/kuYzxG
91/TTdc98LFxe5p2zaV7SEe730EZLF/+IF9uEMkkugldUkWPLeg+mShUrcOReHoeRGY0M+FXkrk5
2IIB5yS4OHtiWPRyJgB9K79Hvcn70cKIw+WefUGhApmc4spCW/kx6UQbM8NX7hYq7zKzKNWT8JQe
jDZTcg6hIhdt5Pmb1SbA07V6sm0NBvIEd9iEdT8STvjOkD+2y5+K7vYEobI/YvOlB4ApZqgjsbvZ
sExCRYvJEPe/ezxsxIYKivY3a0/fHY/ikwhtWBi6xGLaX92qBexd9awhYA/LPqoPBtHaQlF5j1Ip
T0KiZgXANcCuCHuBqWpYvTlQoD1VR2IKx6JzoP/+e/THUcjDmHvAcoCsCEaBEW8XQp60voBIOoem
ZOA/CIHfZ5tNZavwsD+jduaQX0OkKFM3ywdBiPYLM2BxPibL0kqHJ3fnQZ524GZEPhDlIiLErgvx
Q7A2yT1ATs/9w7NEnYeexSwj3RE7+bLfoeSvYSjiCDBLHlsaxWmJaUwVAAZlT+HGSy+6S0iyNROU
DfyBDx2ZUEoCnX+8iYxyGHXRJlScRrahxiodZb3PxN7v6m6M827dDfWqP4VT2QlfMD7nunPs3+F2
Fmur6pUuzJHz2af6hkuoIKDDccP9SQdqV0bD2N3T2Y2MXRkHA1SmkLDgJguP6h/wEl2KeBKL6deT
FE7MNbYux1jfRs81Zt7KIFt7FDcEc2w3hNqjRLaCKmfCowfjIv0RuHx59u6wiFF2j/YSEdnmzepF
x9Ns8O9/YtKiJ96oJoR8DB8bK4wIeYnRrCrK8+syHuY92sHi+UKu6rhbsHOIXalljfvYLF9Y2gyX
aegou1y7TOti9BfXGqkhH9nU3SeBj6tDJGfMS/KJvqCDf0XjfxPH36CPH/H15RQ8qkBmBQVneTMT
U+UGLZVJ6A12tl11RHN4+v/5gOpakQFd/IahCIP5Nh7szn0a8uVj1BFbOY0dKFOYhwVFIVUCaynT
CxkxTJ2iNjLrwbcvsC6mYBcBwywUIkkKeVM4IXKyBAFStjXBntqnbq4mkirVzYUI+O4s0dAA6J+1
dU9htDyd5OjTDvk40E+2plW1GH9F2K+CUqOtmdFGFR09CtHwLEDwiHzlNXLmF2ocmb3tijUzQ5Lf
RV8yq+JMg2Vu832bJioTM7Pkj3YdtZxgvmV0+WwXarwUMbkV+YgBjAPBFEQHM8UIRsZNCwMHpaKV
Vdn1leW7tq1QNIT49g6At1ccsYJpBr9gkv1eULgZd++9l/bGSAQz4mVi9dRQbKhiS9uYsJcWw3co
QUlIkd1vmrQL2EbJ42rmS2Vrtl9XRSa0DeYvOmPeCJOU01TSz67pppjFA9W6TPWewL/q22AwMFYs
byeRPF3XqAL92Hc0MwQ66dqi6Pu2+yyrvBb1xTY3nR2uznQNedAf7IRpArYTnm0j5mSmuzq7vwPV
CH9avrHKrXxhMD4SMZrdJRRdFXuY1A5LKNT4xJztTsssmzwnE4X1hEwU1sXo0jqfoVW+Pi6mj6Fn
dFCoabJ43adAa30XV6LmfYeiIO4cngS7Q96K6yy2WbvjTdjrJroJ6443YRjBn48uiCJzQcQGPT9c
qYtdYe6HdsXJ3Q9F9D+0Kd3oEqx5DMxiJF6A+VOmaudxzPP31q9o73AvxGOwkyJcwaomhnshRvNB
E/TOLtgHzdcKZEE+aIuiddxtouqDxi8So/igSTzmAMSQJHbekfuRZi/pqFQ/H5UqvCbRIOKRjF5K
U1s/LNU8D+np1NauTv7kqSr0+ck0q5FU9CvB64/Tcs3lTtpLx901j5CoOh9+hWTE2vsKoiFx0F7s
Okq+sNyeWMIybYT+6fwXzmsFEd9zB1DKBk3ax3xhaLXsMF8Yrzj+D8aKYZiJ1qZ2vcmgc4TkA1P+
YQrPB3Y5G9+A8PGlRIzP4tVukFaZIr3bJBSd+hLprEXbhEMZ0nslDUQM/qY5kQVOmkktyJ25l3ck
u5cyzsRD1IMFGfoP1F3J6KO2fpWeE3SkSgzKrfA6l2j5MlLodxEFhPMx5K5egXvxEqowhVkBh6sN
VrMGF+neD2sSKVXCL3UQatvp8SbNu4J0OxjAk2bj2FFEgcHuSwydUJY+YkAElTa6q/kBG8UPQJMF
CjRvtk9+o3uzOTxLqmvzTHo4lKIQCj0975dh7fNM3JbN1tFNGrbJdakEzfyTR5IoiY8ocGqric1J
qV5AiuaaxSlcqz4erC5jXogrWWWMxOQ2RUGSG4LPovgEPFciX2lK2LXGXLnD1TvEl60g1JcNMMHA
taEbIweXzJQQ+M3K4CzQInJWcjSplUMKV2k4DDyl74Cr40P6yYrVTwdddI/oIjQiiK2LwSjZQvTp
7I4BEbvVh4wOVDKSlK5XPo8f3Q3UlHjmOY5vbkfYlxhpdfhZU1HzchhG1zMGpSYuZIMIMX1EscL8
B0by9XJTbKMOP+cTG5eHWHVCMpGEhnOpgwAK/eQcJYtUlhtORt0aE+I7psYnkvvpGsxd4T94P0Ud
ovSjBvg7p/EbE+N+YB5+lXRqYOP1KSFRi3S9WqsCGBMFgKqDurqGhOZDzTWh5G9vJGgEWLu5WW1c
ElBQ+X1MaDNNtHvRiD21Xo7/9/eH7IU0uphZi+XaUqv9EJY1263iXsOPisGG9her02NtWR12GXYH
NldnEWZhIk8dpmbd9xq2GE4To5OObmmECtnEybbdP+4GoquHDH7ZC5Lo0TTKp5L7yrPqQU6FnA/c
aKjvZaTZVfNZAy5wPfwwtNI5AP1cnKQxhIIo/lySwtRylN4kpRYVdlBtNBmGbxcgQtSJqiOeTon6
dHgcf8quhNolTkLsGp5MOlNbH8kNzYfBlPA6dcMWZIhly7B1Yr5cw+0Ir6MXs1xlMuuuoO3sroU0
5LGqr91nt6BGWoWtzfyZs5/d83InM0sNcdC//xbNM0+t6Pqn/2/YTnl5tU6ujH5CqDyaFdroufW+
Xf6Hnbs/8Vu7CN9cTFLhkOc251d+4+oXxRVqO3eF+kaooGRqcJh1QiPcUThwAp205HdH/RffyfzQ
6Bc5xmYxhpecL7/qNfFCFpMX4qZ71OCma+UVEGCPcbpL1Ra2YZkH1be6S5UtJLPeUb7h3EuaTS7B
UJ256EbRcZiwN0uVb198j+TbnHKS8MY8EybhXc3k20XvxZJvp753AfLt02UE3ecB6EsN0rP/QuXb
l1+JkG9Dyp+ILD+P/LvUHEv+XftuhPy7k1wjeprDx58VMX7Mh6vXoHy4M99V+bfabNfvqVmH+XBv
eFcP/4YmL2lNYuTDPbcjpP68GPV5VhPcP2gvLlPwbDXTZQTPMGLkxZEZRtoaomQYMUiylHQLzshk
cm0PJNbyHEvcANWXtMeIVNwMz422Y3z0+5p0q9m5eUSgcbAEG281GxJkD+kSbxidzC5A0AlBEzRC
hNAbJc+kY3X4Fopa07v/M4LPiaUjQfblOhasTotj21e1ZHpy33tc6zHQGiVPBOvKHxiGWfhw47hP
xruKGAtbnSZUXEW6TNdknJCZ2ej6PE6jDyzBuCN9QqyNu+WozPifZ+07Jk1osuz2Nw1js+0NTVrR
P9e9CTN3mZwzHJ61+M3huWFVI37kvjsXP/rLGHrYZgM8XrTxaxMX+dUk5UHKRKKBR9IZCT0EFa8O
2uVT52RGl0hV/2lJVicLuLo89HnIepdtwvU2OfvCCPuaw3rbM1Sr4DrCwMlEl2Wv4Pw/U1H70lAj
DYaoTPEqJenRPtOzQvRNQMbTDXR/kObspqxF04/N0tZaFQqrGl92Ypcb7OXt03+sNpV0ayQPIfyz
tAWmlm3KoGl0Z48FJCH8X2AUNKj74JemRbwE504ICAyAkmD3R7QSfEFOLf4vILAHKfggxaRJB4Q8
uk8YaGX+SRhctoQopQEpBdOzUhbk2Fe0hhMr8Tfb9R206UECU/EYgJlp3EG0KGxTGgjtviEhG4OL
wemqVLEeJxim16OxG1Ddd7shQ7SN9ToSe5XNBmt9LS3rhpsorI9oPGef63JqlwfturJ2nbDds2h2
zYRqtJ3inCM06F/+kmp98SjUeikSevFN2i2Vih1RfglpbHUGqmCs1iio1Yr5qdxNGaJMnbjPxKNT
STK7cfj4UerlcezlHb0XPiB3UxpvpQL8brABAe+wxiI2rjcOkTkKZUAj3aABPxarbGOT6dCPiQhG
qLgZ4+Y8uaeKCVTbIwBqpw6q9fKgdofENEE1qWgqTyrq6mLMEwrKzR+fDNXjjPk7Y0bv2OVGLhIF
hYp/0BySUSAKsggUptG8w/BQTfh5ZhXf5+3+X7Sxi0uhssKk38Kgv/ZT0mV0H9zmS3M9WHZIoNRx
Ty9FPyHM7TpFbHzyD9g9OVlIKXb5GaaB7HDmSkrBYhbftf8RHmdBUVZlLIRLVH6zivGIpkd4CJpW
TOl5+ehZSgIeEBYhZ2paPOBtXiX5HHIb01w61RM34FWIkq3zcTdTMKHGWLOuwnRkrepsDj2JvMy4
Ijf408zsVmaP4ZBYmsTB19Dsui59Fct0L0JuiYHTMotCQXj2NU/uKHSI4PfF3GEVWWWpMZUpJVbE
p6MRwNuMa/bD7/UnWBhid2atCDWDzYLhl5kNyh65c7ATRSNpeLxYfQyAyIR0fpuY0QQWPX4ek5Z5
KjJREbLL+ideGuV73qTr5XxZ/ywwM2u0/IHk+zIRBXtjqr4MoXKFTvIsjZkh55PHxHQBG15cIyTL
AbRAyA2SvF/yHUqUzD57zjlnoiQPCyTYZRfM9PEUhzzQLr9D1aVgveRuyAi+C9273kO/SJRM6pAV
aF2ifRqD7mEV+taaiBbY0gYuMiZWY6OK7cet2SY8Q25xaflJla4FvwqlF+gGhtsYiNPzLOGnnjXp
xTj+8hG1uDmk+PE4lKbK1GTgvM4+dRPch7uxNiMjI7ukqHii3bNuWD+kxp71j+kTY0fDENq3dZRZ
iaqZ0ff2MdUATHW6h9eJgzp/CK3zjTmsDsqsvwmts4Pq1PAsTuxaouf2GbShykOrvsTANZu0FmyT
okaJlxC4gx8xR8NBC8MBoUqomEznRc8bcN61RXOLJ2Y4508MxcBg1lULG06vx8KTRF2sl8PMTOTL
0DM+dLhHTWF1EEPfPxpS5z1DnXJ0/0YMff5oeHd/YFNuCUHSqumEpB1GiK4lOoJajAiq8BKKnFNZ
RioCEZqR6ncl4RmpXioJz0jF8OlhUTxaesygf/MluP8CTr7YBqOevZEI0KTPM7SwRS9sjihs1gv9
EYV+XhgjIybLrqbFNXNnYwfLPDsNfZ2VvnYFvVWGDHKZmDd4Mx1UtewOQRMHKBO9pHSWFLmZMOkU
sGGgF68aGA4cKYF0UvgvDeUgJwO4izHFg07u6Poxi2o2JMW7TevArnSDDrCYJUZO3AiKSQA0ocTX
HzeA/gODFdxVp72mSU3rd7NmCoLFMhxWoRn6HnfGztDHuHLMpuPP13RpzKZ9YzUFbtjbGTWVYPdY
TZDBC51i9bTjgQ4zEDaWxshAGJkm8U0Tw6fSv88S/Ea08lIpz1RME2a5qEPQWxq7ew5i1/0dg3j7
/g5ncGPMGZhDiV2oIO9ET+6lpdrMtsHPQaXGiX7hHIfhkHYtjwoBbmK0BN31LA0lXvZUKNWOhhPs
aNBGiSA7qeY+/BlEET/ZkM/d6IRvtGiryU4zedZz35FEVVxRWa0x77GWTrRnrca1jSlFw/Oqcm8U
fjeC+e/XG511hi+gY3AKfGxMimfqneaso6q86PO5wxQqJDIbi1DxtokitJKEytfoW3ucq4/4N+6r
8wD08AjroW0+9NAfeghcBZXMrqtZjZH4ShpWY898SmG58TI90XaA1xoPtSayWn9BOIMMVQZTAkum
p/uvxrwRb6Cq7N5E9iUXuQXMOUaZUKnO7qtJCen7iIlf4TjUKxxNgV/VnMxti0oVC+qoQWAopjX6
V11t8CMGlDKbCWj0q+NYmuXVZmcvNf52o5bee32ypt/6RQAR6BF0b+Y4fhYTByv4q42Apbk+11Ft
yC7PA0o+5rWM91NagGtgc9DNs6lTX5/3p1c0hUZhqxGPaqU1/dHqgs3I+ykcpmrM0rV+ICOTVU0n
H6u+/wGoJbqDJrpEJQjl9ds4Ig8aoD3U3xQzY5jk/nq4Q85fn48yLnpDTvJKsmsNCN0S7Ench8jo
ZdsedI9EghC37GdSUeXiOOZNGsLSLAeA0/QHNIqUytx5hfjUtDhvAI6px9NxW3ViQEAgjUch2JPY
/A6LehgDRJO5WPNbHy6sq/e1pCiuPb4j+N6ND1IbUt9HtzJR9pLrpuyTfK0Z8lZpZltdQp4e7GCV
l6yWp76p2PZYhZqTlL9tC4s3NQtV280sDceLeA0o14tbtKQLb5jpvV3OrmJbkhlfW8BkKyV/PXMk
dbNUDtyXlByF4CEKGqLCcmxghK7dMy4IKxLn6q3Y3rQK67yKbTXlSZc/k5RJXn/+CKCgy6KX/e1m
hLFkTYSTI1oruYMjZm9RnsskyU14a2+YM+Nn7MpBlLfbKr8RKv9OgzPWxs3w3BC9BsvHoq2gkr8H
9HMJXXQxVQpdWr7Cb4ZeZBNmN0P8GM6gw3oDO7G/lHg+WAbcdaMBsBaxgxH8lm9Qw7p1o6HZ173w
lV4/6ue7tr+1iTEvYqr9m7PBoFX2A0UPjx4bz7L0k3cmC8PkHostNBq+dsxj0cpuMW2WLzAZSbJD
eaWZoTlK9yprwjHc3Ev7mnwW7TdLmqx41B0Osf9khSSoJ8tao+7XZPxu8eJ9+mWVu529lCpcMEl4
i65oJTmJVjdcCsXXcT3/NmM1cRhYkfilU9s8l9Slwo7QQz7UUDdVeRFr1T1cyZ8+fZo2BAoMLlGp
WcVPzh+HaSnYMTusievy9EYVWlQkEpaUkWwPYy/WsjRcpTegmjzfAWlQWPVkDy6QHPRvPx0M6vPo
Y5xHp6jzsOKBa8Aq0OeaYg1HLITQW2oysfRCl00Lf9HFLaUROnJXZsmZGvydxAw/04t1TzOEt0CD
t3lqOLyvS84PLy0MXoYGryoC3gsXAM87W4PnSdw0W5s9Jx85Scuw15BkMnw3N8SZDR5cRGPBplj1
WZyitpLBaj8s49L4kHfAaDY0GuxS33oirh2uKxW6eVrP7H8Jzm7e1viyQ2ZxaTeqEZ6fjr8XDWFs
YuTpWiIq5N5AJsTVCc65Pn+8u8VsE9a1WQ5Yc44570XabT6Bl9bb4HTA7Ls/DEc7EAvC0EnQkPqI
X5AUnAwGQbW9jHch+o4A6BNWzBZbxUJfo76/Tc364JDr5fw9dvkfwC0xkrCpcgcXjd31KXb39hTg
buuDZNrt+c2f0Ze4yMSi7O0524QqClNRXCfb4hIwwG/ItQ8B0ScR0Q/Nl1vsmLFGPiT19aH05PsK
frRJfRvq0gyMDgA/B4CpEzi5G0edZFt8sFWeeVYMNsJA0mAgaWLOByXlyDmVNYiTch8GYArrdknK
VC/u8SF0FxAfeYdtYCi4o1nKKl4NG94+SC0CttXkmq5jm/GFkEPCyCpo02cI2lFxdfSjYqOh9rtp
sU7lGG/7Mq6VKO+UPyQBfUlz2PnHrbxj32RCyDVw/rw8Xzt/0q3yIfnjuq6EdeMBxCzocaZQC/o2
5tRDoZ09OKOkyB41ixNDIzPhcM8FlqAJveVhbEk/IiVvV8F8I1Qwi3sH7gcOuchLzt5yJa4unN+5
5WeQS4ub8f9WYeTnlH5e/hZUMJiOAwjBP/AcZtQi3I+2yi0YPmk3N1oHfO6qB0Eb8DHiDYYPYMSJ
y+Zp+LgUSuu65UWNWqQ+/Kd/CAYdSpHXMPWTRpEh63yZeTA+V5Q/kCfttMs/qmeKvl4bw2zpLVxN
+j1bR/ef2LiRj3w018BH+obwEd1M/pn/198DLmo1C/DdpDmvZAzQ5rXLn7DO3Ut2moSKMyYKv230
+ZMoExLb57iR7cpUthUlcz0M5PTrbCBoxRmnD2SAJO9ntcJ3dgbb2bA8nES5VClRzpfv5P3kAQqF
2ywhMls4M44QydZ31vaZK1wkMyRVutsoj93bFVVNODqCjZhGcsSSncKvLqGzLLEvnxgGs7rmGIJZ
+0Uni6leDrPlO5TajoWFz4bftmPWKjb/uka+5PeTmrElYslvp/dRgOg+gphm4jV4qWh4jQU3V1yh
5Susv58fGymMyw58MITLqkkK6UVkoAhDbf8puh7wcTPwPoMtjBzq5W3yVt9XKfRSJNBLRJ8/XVh3
zN1eKFT90YyH7Hf0/X/o+3H6/gx8zwWMFbIsOEKVm1Hujtd0yr3iQZ1y6cJsN9DcD3WZhsMfEEIq
4ORLjMiRlDJ8g6Xo3kLKuVDZqp5QrYdMKhqOzzCiAWkeD4rwpItCxVd0zplD7FfO6Xi1VsleInTL
PvIyVg8/Zo5B5eEwUxoN4nywXmKnksvHTD3lM2KkbMTDDsodVH40LGcjlW/RLlCCTrtupAnkWnZb
4YBsRiercjM7NgHS36eHQ2KYu7YXQQkksYWIvGiJsPFwxxuNXBolT+726WRUsbSF0BzdeNea1LAb
Lf/edoM96xv13WqJv5ltYleMR6ka6CLsFXT44op23cSW+MdX9fv+WdOJSBfBx8ZFKYaLZ8qJxg1m
N/AVIMMBJ/oN1FmqNMIsCs9t15cowDJWJYq8k0G2Cvw5h/rpOg8/BOBSnlwb6/ncfdBztd6zdam/
Q/whH8YcBPpVkWFLn6RzqBEeqYb+B63yGV8gxSafFX1fp8HiwNZCNgkb4SN+yaTuA4qjWvchv1My
PoXKe/g1kvGxemukTGpij91bWvBTqPgWe+dhZVzGcjVrUrgyqdl+3fNMn/zQft2LJ2llnj/JILfQ
mqsXP9QCGE1t/Y9Z9y7b+iOmqPzQL6xrXl8IBQOaQb2rl3z+OOnEEWACcXbzc13Zu2B9KZL7VIar
mUO0K8+z91y3qTPgTylDB7skCitJ00riwkrQKswvhDQ3sii8mMfQ4DJ0pv3FvFDC8+SrMfkoLMf9
JAdv2A8ZjPTPFKlWwhjR+8b91666YMy4iG5U6CZYeYk+cj5zjgeN2P17tKHc8EmRqhj3FU/YVBkg
PaoMwIEyr9UxF+GwLgdwrjpeEErVrd931z3Qc4ui5xVgJkvZh2/ZIPSsznDeYLwqh+19he4CFe7u
RF9+Gjp3tZNb+5uFpuge/LqXgyEO4TcUB9xdC0KYV2iKCEKIIkuTnVu5oaCQH7EgB82iFyDqrz9M
vKoQNYVg9RRM6rq0Ad/tWmCVeaxAvFU+jeFW94ZnDgaN5tJ70a2tyFuLTnxoLP9STditm8UwOW08
7xwTG11kXRouU1KLGFkblMTKmaFoCs3a4K/9kqzZi/keSFPvADTvBu4MERJkYPCI6CACQX81Wq4x
R48a8MKd7LGO5mTPfbQYoCy1F1jzSxiq1zOpxhjKEPKms+aI0TTro9kXUbhPL2yJKGzRC/0RherV
aRQPflyAit0gM3pYyO8I+kB6poBia86CHq6UYF5aK3u/A09fQUGK9pxGFwb/x/+C2M7/5hOZLIdf
G46nGvge4C3FnvOBE8SEh1MCaC9lqRApWYbUyEbWmJeCn415eEaC5rigR9n09HbJw4KYleUU3Zyz
Cx0m4gKwFc2SXJAiySk8Fj/Mhh4cl+a6B63kGJ/vWUEwcrY6QTOQYASSvIwFS5ulxiTW++gUxlOq
2PyW0QhzmrA7C3YHsitG+gOAGiwKl47l90QyNzTz1/jRWTipK5pOj44KVmzGrA+iUpGJyTI8klmU
n6avFQecwqgRT1Oxq2vr13T+CBVfmIht0g771j+OspDXOzw35L1IIXu/nQ5ywKh0M3vFFbqYxjmv
ErmJ4rK6HppKjFcNwBkdfJuqA2Pn6Ydd1LaD1LZXY64igrnLL7pbzHW9mVgbBgfzBRFnESpc9NpH
UiIqMSQ4yOY1KsjmpKFiCnRGlqXAZF59MlZXns50IkbuAIw8R18xWwXjcF5n7/LTyGAX9RBqdkhK
jyYJX1aRLAW3SnKPJg30uc56iF54Vk0VUpayDIGXnyJ4l5X7MOY3GtQwq9dHoXdFFZ3xrggnaJOD
I4NPb8I5Km4nU/uvga3w+V20Fapvp62wFH5tKO9k8DHGqpgZDD/ZVVac61Fou4hvP4fyCn3ktDgL
xTJHZrpZ7btXZ7wE+cI5AyS/4f+rmwCenqabAIiNqtaQIyBWO7QDWvP8PaK9ZLutk1agPVvTyfDa
yDApO1/+wIGKtbwTJAymDjKtxXkXZxS0zTxdfwtHhZLqPmQGvjiqcofzSkDM/Qwxf4SPjZ3YimFm
YS4EadJmSmqUxQQQKFcfZiBmIogextd2JmJWTRAo92LaLFRy0JLSnC+fCr/bbEqKwjUd8ns4LYpd
+YhlDie49G5SVHJJFZCngoCd+Bq9Yyg8zsk5S71LZ4ac49i9qgw78wwvLOERTzcYHvGgps6UlkFO
t+wIXGEoDQlg0t+WGmmjUaWIE1sxMseZbWCEt9BwsxmRDtLdBVlMlZm8CC8GLHa6V5UxQOpP5Kme
LN7ACZ1ncehXG3wOq/eZdbar+yszNTRx3T0hHNCUZIyb4EnG2TgPADXDYHtocpUZ7dVrzBU7XMMA
0Nx71EudQD+Nt9GkeFDrRVBJuoel6zkBhJQUlquKbmZYFsUkyjWivd8L/TSTzeyuJeOQetfC3gQW
kqBQv/Bb6+VlHRlm2bs9wwyzb1+qZUYp1F8/gCUf9NFKbuf3OhGG2apTaBykOtENs9uMhlnLGRSW
ot/WUQV/C77XwviCMGOalXBvT5ZWP4iyHb71sI2inxgCXTZE3uefaRdV6g0TbAlJ/tgqH/Lv3kF2
Td7zPOrZZuJQTpqjpdSO1FJpEG2GBCONtp2Mby9pBn1wZ8hNmnbbIVT+ilmHLAfClv2XfNkHfEbG
XdL8RxOrpms2VPuf6Y13FjwaLOyajSK9DNdsaGX94oTqb/1dSBNDEBkWNnHwD3YPMSK3GY3If/Oa
WKGorMCLI1F4a0/ItXJoJNvikGoI3HoJLxotlm9DlmeFgwlfFFabrJIEsYqj/uszec3eEXM9f/Qb
3Rvi3L0nURqgr56D4aQVNfN1RD660VGCmW5UeWBCApIJhZGQqqLHvWh8bNrU1q/jjTnFWcKRyPfe
NNjlDxhNI4N3kyxuct6p+/3QUKhbDw90avxWd6WpIr2MWsF0rfJh5jsUppEiJEqX0bH9KtZobjSM
5up/sTcedxgeP2hbTkz1lxJOp+fLk8Ii7BrIUzKxz/JY8YeJyy8g/jDnDoJ+aiJALzDp0BcvNl1Y
/OFtC40VI+MP+0SWnyf+sMBkYEwh8YeYYS8s/vDhAhp/Tvj41y8KHz/GH+o1KP6w869Vtqo2e4iQ
2nH84T+eDYknvFVrEiP+8NXQ+t1i1yfXi0QXpUzLnfcsqrMGUUbgQ72UqA7f980Gp0dRHwgEtJ6P
SfTGLMrDy+cySkKBu4/hAWjOiY9P4NwHN4+4tMG69Jg2Z64NPyohX+/KNfpREn0qidYJ0XVoFmyN
soP+a7H+S1LK8FWx6vun2JM1EU9Wkvl/N3+TDN8jQh+rRt/51bQ/Fo0jChh2ZxgFrGP745rqWPuj
a/UF7I/rGPTuCH24AfrwC90fg86zP4SfvD+Gx9wfM5dF7I8H82n8d9wRNv7FUfeHXoP2x8XLwvfH
jAvYH58+E0LvA8+3P/4cWr/dGaO+6iGIMoaSuOgZ2iULnjHsEnQHAmHVIT8KqkNpRsOobCTTLQUG
Al/qs3grdkiCrR7ket0wYchEEPATNuVF6ZJ8V0bDGIKBxwxQ8Uq+GvhU9QbBeZR/XUYj+BB3cKON
bxRbC/8k61DwfXd7/MIbYIY9PDzsnl4n34NMeLn1DqLms2OBhWNsfeuP7IYrnlKAdlkjmX3BQ/D7
o6f164y3xlKbprFcVlXNOvK0LHIcVGx+lssR/bjyW86fzLHRmplONIZChOFScuQbwWDrLWxAkw0D
+BMbwBgcgKwPQGwYnW02jGC9YQRr4Pdq+L1eHQH8wIfnGYH3T6rshhYYhG1XFmb5//4XGNiLjHC2
KIaEgmxgfwFlf+MLUQbmX/c6CkEcStVfVOBVHDgf+CrDwFfC72r4vUodOPzAh+cZeDIfuGsQHM/X
wTB7Kfrq01hXk0ViSByO9S/6WEEoK9+GZEU7LKk9GKyCfxnBYLCRxzai3D3bGB4eRnnu9gTneCA6
oUIh+oPOf/sUe2tNFXo5qgOYwgbwGA7gC5NBe380HdQjuuE8/hDg2ccfwtyPcTpqARwAovLXU3ZY
cjBlyFlDPqARyKEQ4FEGIPsMQM6TDFEDEheK4VdXB4OBLC0o3k6TeQs+Np7SJ4NnAblUwaafzU88
TBKVL/vscpMo75Y8+WmNY25CZRC9xSVJGQNjvCtLUh5Kk2RXC155s4So+yR61SwShQOHCUNUXPDQ
icPswoaZpgY1F1Cn6Fp+RxjEkzpEQITLD4BOqhD9GHQfCZFlF2i0yrv8a16j10YWsJnIi27SbqGe
IIfhRH8cELV6RrFjNIz/DZEJU/YxxCEGjQ3jEJMfIv4pyLH4549LL4B/VjHp9XWgrQ1lBun1ZOkF
8s8PHuqYf74VWX4e/klGjaj8c+zSCP7ZyLDTag8b//CI8SP/1GsQ/zxTFc4/zQ+dn39urwrhh+8v
OA//fD60/kux6hvexbfNLn8Eyp0on4MtVPmNU0R/myriQ2NozO+pPPVjja1eYRNqGmzCup3qzWOr
/yoTSqIwCZ7hNsq764CffhHe+/tW2bZHlD+wa1qVkmiyIx9faWJOKviOyKcoMaZ16XHvofjMEylN
S+k32gGe96Kv2PO+Ch/LzGqraHM9WsvuJoL+L2jcLM8qWux/TacWe38IcxtjtxIgCsN2pPsOvhbs
lgUU/Fsc7Lkd36XXFi0iWmqkDvAv0M8hvzGdrBVkILbKzPZs2zOL5asQ15nZVZsRQQCXZ82QPE/S
iw99/i5CjVB+CH/Mcp8yu/cFOS3mLc3dX6lR5lOJOytVrXlCgQzHSNfraJPlCG81xHhNIlvBdLQ4
aaEf3DzUSeJBe6GL9nVIPnb9dYLxusA/Pcugt9iVlwq4sbBfjLch2hufVHEGCy6M0d6JEZbXvcH9
V8bF9Cs3PeuEnhxtFsvVgo/26fW8+tdV/GvZK0g4fqhP77A0hWTdijfkKZY8mzATk+6eA+QxXb2y
VNbOVu+yDOkltLclslRQ8gqTdgMlrKvCeWjvUSL3WP1NJ836L5lSj6lvBNC/yxRXqz7Xv+POJ1/9
M422T8h4yPNikKw3xGbDqUxqBo7W4vDYPmGSD/eixB8byJWO+O4kP0Zplx8hCjTvlcrb8duiW+Dk
m/cr9CAE8C1tSQlCxVvUz5D1NtXjVqhAwcoue9HrVurrq8siV7aArSz3WjeUOEdLylq6Rs35rnQs
nCxX6ACTE5z3S0rugwgsmS5IJhgAZRs8tgI3Sx5gvvJn/pHxNIvAAJYxN8XZXS3JMFGkU0BQH9zN
HjCzZYYhm2qSJFf1Yzchy8ox70yC8zrYP5+DUnnCTOPozceBmdAnp9SV0ZzUwWj+3WHvaFvS7FDe
okjf8u2IP7vvmy52pZsdjrjyL/EBHFnCun1Wc8B9Jk6orDXhde3vWGqrFqk/26zLaGBy1bVo5KzF
wvwB7ZLniiNwxCnxqxPQKbJnDo40jjlFgtyCI1UdI0Et0ofrkL9TDa7YVqj4jhn9T41Sr6SEis/o
0QocN/edZoRR7jPDgBx9DzkGfEcQea5/hoNWzPHqPmN2TVSH7EkcVYbCJPTyNOtluaGXh/HYDBlp
kz0Es5LsY4Dp1eocplI1RccGSwI24LTD03P/E3jHGZfgHAndXK914xwchgxcE70LYDQcG4cBxvMU
HrykGSYhVHyMj5XXEAnrCefKULu5wT5gj738CK6L3R00i+5Pg5vItKvEuVsS7OVnaZMMBw6yGIbx
6khtGMX58jHmhH5cHQmNgl3U5uM7vA8HsF0e3pvo7Swx2kELmrzB8SZfPo2DBwwxnuPcd9LOXiRo
L99GlBSsF3M+FSrHB1H+i2Xd5J5l/NYFw8IY59lEtyED3rOzFxhK5v0gn7bYtW0z5XG2ba6FbfOm
qG2by7VtY1zYj/kl4rJm2jxSznulVuzNXG+XX8a7WqA1xvtau8x6PSjQNvF6rOagbPuEguNX0PmL
29qT/wmx4SnsFE4PzUaCbIpbn2XKEu//kN6HafFigAElvvUkvrCEyNQ5RFJjBHlAPsylJU+bSy+5
oe76EKcn1ZOGt3MoawrMhuZdTSx1l9wgBvcCS80BDtNP5XSN7ms1pqdxk86Mm3D2zN480O80f1Ub
57zAMRBFiBdnAuiOKbNONACKnqsXMenUZUAA19IWMYdulkA3G77CEzgS/Uq2yl561aAn4UaosYBt
2F8/xjAxEMjwyG0aGfaBynZGifJxKejVaZe9gXDpPoO8yzmaryUt9ZiwjlIiug+l+A51SvXJyzqZ
wzlf7Hpazu8LhCuv6BYNelhd946UMPC+w2mp38krbjRH9hTRtkvE0FjsGertsyp3OydahZplLADm
ELSmTI3ulhRfSydrapO7KVGuCmkOq4EEIdT4cBBb2SBE6Fh0N8Vb5aqhZpNmT+pgVAlho5JrbtQx
IbpPxdP4Fs3EEU4DUX0HjHIFG+Xh8FE2u5vMFzJKm3kHDtSW2gRjNV/oWGMM9DzzSwprllfR5uzS
WIVtcQ8FktSl7xBO+Y4y7DL2CAhLUvkpvHZbdLuVAxIJUgiOvNpKyjXdaIsRSp6iSplxcFb5Wq5I
bZKrbr5wnDBIqhzIBsGWbTasmBc2d/KiaR2vW9wFjwnmlCIK63y+li4wG7nqVsM4f17f5n9L3x3Q
QKoRTQx+I9FcgnZCdLT3upbjYoeOEUcjLxtJuhmFkKnv5B2JbzMgBJSfaie5t4OBxYUTp7CuwbBP
NNmwAxCdOtq/58dJ9Hbau9fvsQrr3hdq6A2UviOhmEk95m5KDdvu+sYS1m2FxQLswZEBOE31ibSU
6biUQ41z4331WSTi7Pky0CqsoL4Op/gOd0p91/1uqrwiSl9xtDZDLxBb4bNmMBJo/kN/Ft4YhMR/
GUISX342l58LJVnnSUNDz6ZZlW3OmeUNmAqg490YvqRsUAgclpQWM0VdzNRUjALYwU+iyFXFs/bO
it3OcfBlsb1i92IbgvipK9xIGEhJPXbBPC06bpr/5TVKIeymhGL3J0NJhW+eJ3GXVOwWrNqC/yxY
nf4tVNP5X8ZMWTgEODwYF4AD5F2QIhbdwnY3ER7RXQ3BPZLiO9Ipda/7/TS5JlSyOhSPRHXjha14
96inmbpM1erNRrrhZqPRhv636Et0DJSBr0kYFWrcWg9KKP/3IlSFdcKNROy6wX2zqj0YdhsS/M0d
nmfl7/oQYijBXyDXL9+Br4mIWIibuVIg19x6IRJNTBhmDYa8YmT4KbJj8d0dnR9dt5tUXqlBFWoa
PGtUej/mO9Q99bi87GbGOhkHXTY64uzAngqtyqQ06O1l1tvn4b3t69r403q7lfXGOl0x2oBrjePd
rG+nDnBXH4m7nwlpW2xIUfwTzs2n+5XKQXSD8Jol7Aah7Rd0v/LR/Fj3K1vmX8D9ynAG/WGEvtik
Q0+fdoH3K/Pv6fh+ZXxk+XnuV3AY0e9XLp8fcb+yeCCNf0N22PinTI12v6LXoPuV9+aF36/87hfn
v195fl5oPnCtSYz7laLQ+rfGqh/qnzCIknPnZs0L8+K5WvKMmi7J9G82xt9m8zm0U6wlz2rXTQpJ
pWd08fknx+YYgED/EMqhQeSfgK2ZpTPxA/Zkuv5kC3sy22zMLO5JfHKOHkL78SA9hFYpXVDXxRTF
DJLoHGRY4OCqLC3/MR5GUs7eRXGXapkynsSpa1by3xh/FW/NGymYJDOvwuqPmR7+NhHmX5pGqQgo
mXL/PQ+qcWpjRGX0gqBXlKu0IDG7XIVOiqwcExMk6XNKF5WFC+rSIidF5wAlmjuHbZVleMlQuUOw
7feMNbtPxalvRuBU5Zm0rxbHruXedu2zyzU4Dbtn9HS7Mm46xqf0lJQNtPA5JxZe7ZA3lMH3QEK+
/Phsuzx+MYwTH8DP6QgXb6kCLrsyebY04q/YamFqwABgUZak2BcDVFdAymnGcJ1HFgeABofb5RVl
NOsxixFy4EaELeWk4GVPOZZI7tYy3pdDXrw40E37MRyLHHKOGBy9QJ0aGQzTQv2MmXXNkzj1lzqh
vH1DKKH0iEIoKnY8Y6dLCtB7jg8H1VlS1rDt8FnwWcwqL64zBwQ1jS9GdtlYxiVsa/RFC/VHpV2k
jCVE98MoyOLdjJqeJeAcWccQ0LAg5eiNsrsp1xHsydsk96OLTU5AyCZEjck5UMWH3TMO1nM0DX6i
pExYLClrCas5u3CP/pXWNJXGaJcXzpZyjmMg0+TFGJfUXWoctZjG2ugmsNRunysFgf+eQnLGLTAe
IwY+Eo0ffMpSXY8eQCdm1XVhJ+bVU4if1BTH4icvFl8AP2nPIuiXXhfmTTf7FxfIT16e0jE/eSKy
/Gf7g34/O4Kf3MrGf/e1YeNffXc0fhLmD/rK7HB+suuu8/OTubND79+1JjH4SW5o/Xmx6hv8+z8Q
8b2mP1BYT+K5B4iztD0Q4flmccgPSlrAC8tnCcxkAOZBwGRwFL35nT8TDze8tnd1eG0fMYqdNIoT
OApP7ldXY/CEijzsfYRVdu2xyUf0wP1tGBXVg+VIGHwoGAzJVMY6ssk/WBXXHn+/Q/h2dmd3W8UX
zi72Rht6omD0S3pdCp0Dpz6kNEXJCEW2Dbd4YT4nhHVN7N0z/u9N6ARv8VYeiJiTXVkynLmvXouN
OWh5X+AjA4fRUIxUBxzZ5H40z+S6PBRxWijW57B5179LyZiM8VjG23IMFQhcpr+qSbsSpyjVsXno
ZnBIUh7lQ1vWAmdU4ygamoFG2S5YRde1id9cE8J2V5kiI6YkUW6SJ22maOMlXkl5YrjlAHQgbkG4
Yi2dbbdY6Zo4mSXRwbw59GphCrCgd3KQU+Di4XwNWVYLlHkpQoHqupdsNgkVbVBOLB9Xp0VaKfla
4tGDi+7R1GeybQ3aH2TbessBoeZ7SVkCS/aVQz4O0Nb7Cz/F5WwUN2s59H9H9DS12d8d4z6UPhXe
DXT7p+SvsQu2HVKjNTONnanWTKQMU2NCJpqENuaZ6H3kGMTiGbLxCKBseQaRPxvyemIngq0Fb3+m
etVN0s6CNOD8H27CF03Zmuzm7XZzA9RpDtaPmLpZ+NVoABXoqnt+QAmiSJ6Sh+QmCtZtYS/81na7
++sMlFra/LaDwWC+0ouu8pbu//CwY+a7fF4dzgmzjvwzGLQc0Cd3Qgz+mk2LogkEW33IDbcyJi+k
/zQexa06BiqPSv5f7KbQIwzKA13aT0RJ2V6xcCwV2vxMCtBPOv4uRTgGJx3EGlD1IgZHjcDK4yDo
EEvYzTwU9fMc4xlm0pRe6EcndE1m2AmdNJH4V5+ZMeMZZl4A/7qXQbcjdL8BetaF6kNPTOyYf90X
WX4e/uWPyb/uuT+Cf73Ql8YvXxU2/tlR9SG9BotnuD+cf7094fz86x8zQvjR41qTWPEMofXHxa6v
vSPi2quQV2GSHXwBkkNe22IyxgCyyAdP4trhOHmAdkK9ceSsJRfvKfupYYbqOyKcfYH+NqL5AK8o
GRnykmS7/NI+kyFQkutAv+tHOlBZUsjbD9eygP42Z4ohQ8DCfiHHLZoCQ+cV+QbLHvCIxhP+Ekvj
O+90dyX+6gaCWt4OzVqcaeXtcBTgy0nkvf5ngsyDEwbT2pfGnadlAE78iD0xcgHK9sFNGnFCVZIZ
k7TUUm9CBfknVe4WKjCPGpQ7p6EfMOUydSiPZNPhiy/UwDzo+L2Jvj+DC0XOKJQzWF2T9VoC2N9R
NepEVO5KQS+F+xrhwFwiKSMzJGW4BmJVDBDO+3nzjZ2o4KD/d9g+t7INfXBDYcQahvNKDgOb/3E7
RTNqEoYWvKhHn8vNusODM1VKZD4PTZKyDPvh2ZGRBiPkcqN958VpdJ59dQXt2I/6hO3YdSRxJi6a
FvP9cNPU84wfB85pjPwrvc74qcEW7aLOk3gZxv+6vWnag1T2oEB7cPIefDl5F+13diSscZPzi0z4
v4zCkuKFRSUZhUX3ux7IKJ7nLCqZNWNmkWnewrlFpv6lGWJpaVGJM2PWjOI5RYU3Z8ATfGqaBT/Z
rznF8/4/9s4ELq7y6v+D1YhkkewkMckAgUxiEodhG1JTIQECmoSRyYJbYWAuzCTDzDgzEHClahXX
Um0Vd+pW6la01uJSxZ3WpbQu5e1KrdV0scWlSjXL/5x7zmVmHu69M0PM6/9938zH9pvfPefZl/vc
7QH/5XEaDVIg4Avwv1MMWeacAo+nZq0RQpgtNfD/qwvNQaPxPCOESzGU+P0eCXOwwecNBXwejxSA
mNeuzXKudXttvt1SwB5yhKSqgNPtdXiM6zDaFEOrOxBqAVlZVS2FWgJeo0o0a9cGpVA4BlOLN+hu
8kpOo8fnbVoFQe1SoNXdIBlXrlBSDHokyZ9iyLBLnsbVAakxIAVdRgkibOeSG9PTjSZzW5bZWrPi
TG9G8Ql2X0ugQdrgaHBJJ1RWYQbKHc1uT3uUWJ1jNq8xr8ktOEElm2sa/P61OdYcQ0ZZmztkDEYm
rSRqNDX53N4mY8hndDSEoKG+0MQtZqtSAbsduyQof6XXHXI7PO5zZHej3KBQ9VTwLzTpnPGkSzwB
yeFsh76npA3tzLb12zauNVZCqCZocz82qTGIbWoMSGe3SMGQ5FxjNEHHWDEeIsWg3zWwrrGVq6mm
TfU+n2e8G5S6g456D1Z4w3iQcAcYT6PMq+sVIwM4xCJzsCLc7av8IbfPG8TOHtHXW31up0Y/b4cq
aN7h9njsrpaQ07fba6qsokjWu0PBFYaMiR6rjNrd7Yts4dyiPPXk7ZLXqagtvpC70d3gwBybVkB9
NkNk0KrG3e6QS27qlqDS/9q+2NxZNXKn5AzC/LfmKM9cAD1ng6+52eF12qBX2mEkGOpb3J7QarcX
TLYNlVtbvF4JQjgNWS1rslqyWmgKr5Za3UGoQaO9xe/3BSC3hrI26GUwbxpsrvYgVDDMmNjvoMN6
pYaQcZOP6lye5ldH9gWDo8HvXu13hFyQZMkGW6XN4wg1+gLNpRLOmYZamz13fOSq9clyX4sXuiuE
hHMKBoGOrNmB5ZEkRY8GJ0zFq91Oj2QI+HwhKmGpfHYqdYQcBhhbMCtvgFRCBq4t41Z3s+RrCfHR
8eEUEe86HFD6A1OzX0ZNEfLwxbEfWWkpcc7h8mlmxSGZUHPy8nPx/KVehkM4k+fkFeZ9GSfOPCuM
4Nhn/y9xROfkm3PGzyxyBw7ywqOB++14XtYY7XI+1kEu2owYV6Tmbm73Sw3YojgMZEOsHo1DxS21
Spts9mp5aEgBE8wAwZCxweUIRCx/FEenEV0hW7IvpuHxyKnYMEZn5fjqEFZQcKo2bmlprodl22af
UxoX5e5A825HIDwrQfDNjjZ3c0uzXWpqhr6xvj0kydmphvO+tnVHwB2SJpi1A0YHgtVE2FTigQVg
VOSGTb7dRrmXGDH3Bhv0XRgjUAOVVUZ55g1XpHED1BYsv6DMwZC7IajUGqx+XY6gEeZlY2kur06g
nRxNEialN+2Fl1lyFjaPB4LpbzyAkswG+1Z7XM2NjYTOphZYxudaakOrjHr/gtZ3GuX+Nf5/hnLo
Wh5jmTxZbMB6yaAjNH34GhpasI7WGCtLqWeWVG/MGf+XZfxfufK/1hjLd4z3gnVZwS/0/F2Qa/3i
Mmf0+kJGRytMWHg6WvPFZjQvT+98aYSetzXggEsUnKfL3W0t/rXGcpo64YwR7inGcCC9rjUxOuhT
GTx+q/67Fn95uXkFkan+t11X5OXmmzVOC+HcwNmJT8hOH4xbPIzDXj4fsFRmaLfX2AiThwvGDV6V
UgxwsoNFVLgEX+w6MLdo/KxBCcI8s2l9CSUG8/EqY73H17BLnsbky2KPEw61NML8VdXYCCc/vnyI
PVlgWUzbYFa34lXxZqnZF2gvlYINAbcfS7dylRGNuRZiQV6YyhlhA53AoKtFzis0CcuTtNLzg+3e
BgpS1iY1tMAVHHW7FN21JHRmP5xKKCAaq+myL2bhNMKZ1Eq5IkZkE/Numlj8FXpDUvHFHhUOYhp3
5txFnJBhYLZ4qCGhbeGkFZQHNZ+i4PDZTr1JgBORxhtZKaHSglFnfnkwKMPghCql72MlY8TrsbfZ
oargHMUXAfIgprOnvMgKylWIlx6bpCZYggrS1gKXyw0cXcTtHjmaiPNslpPKpJXu2rVbXXivoAzX
l+Hr5hYvTGTSOVgKqMcW5YJDO5YNEElIghWAXAS8eAiUtcLZl0YwzpcwuDxO+azQIPsaPbBcoDN8
CN2NEvobg3KASZ0vtHJHJ408S6wyTMw95HvC3THt8AnfIhPrmA/bobzOFrob4vB48CosJDfSuMcG
PC1DZYWXlutgzmpZZcSpSj4Y4ss3mJCznMGYzWeXQhiML/qg2FsczVLQD+vSbdsqS8MK/j1+Kbi1
3S/J69k2nMi3SLs3QQt66IjKXUXdeitpaoLxGXRDpQPEuouS4XEGV+5YR7DWkO+xepX7WSkqHlKb
qkeltxVOoU6lH0KJUgyGbd5dXri4MZyBGT4LZLPDD6tZtw/m4HYYcpz9cujFLZBrw1aXFGh2eGAg
+UIhbLbwPYPtMFRhQsT6gxh8zpaGULQYXy7JlWew+zA3cgcybJac7pZmI1azgapqwqpZ9U4Exh3y
Nfg8E9xLSszlJQXlRas3WEoLVuflF5avXp9jXr86v6gkJ9eSn2spspTLM4h9c0n11k3u+jV+T0uT
fKdkQ7kN/lkpN3qQZhnZybjB4ccFnsFuL51QD5XeRp8Bpr41DpxR1wSDzhDZpDXYr3cbTsV+byyV
/LBK4KupIB2UjwVp5b7ZVw/ntXL4HxazSW4Fbr+NMJ3AQHBDlHSBgDcWdLradmxtqNyycBj1y7cN
HjcOMHdQvrHOSTgN3nB6OCNvgzWYAdb4GRDK6Ii+rZ9hzJCHda3U7A+1G03G7Matvl2StxwG/SZo
EOMK47p14O0JSuAKyazNavnCZz1Lfl6+4YuMUauojVUtIbju9zpxvH3NaD6ERSqwFhnKYIaG02BD
ewVMizZHYJfSbhhwrTxtKjfZylu8DbSa2jUhlD2E951WGeFa29EuLw2agwlNXWoJcYeqstvbm+uh
N8KaD3vlKrrpvFKLK+IpQlXIhbPXVrcUMBvX7zDawU2CaxtcOstHc1SPWlSP5k44CnqTu9kdgjnN
h5eBeBYxQt34g9DdKVEe3ZJ8g5CTnHjMonIsd8IxiHy3hFcCeGGm2PDukTJfKQuxHb7Ark0+n1/t
CRctyEqcDn8o/Lhrl7KcxJsQ8sWGPKfG97ArKsa1a31+KfoZgPrKfsWEtNdL0HiSHW9QcuqiR0kj
PrjQcbD5gqGo/LODU2p0wGo2vGRwtYRCOPTwrlzEM5Q1RhOtQldMqugNHl9QEp5/TCjlSs6auPae
cEBeV004ivfl6eD2raVhq3x22QbTDM3Ehgm/JIMzyZA08bia56H9jcefqsEvKn7hyBFfTPTh+DsM
UfF+UfH/X/0ZpxLNO4ip9cSum4h9txJH7yLaniL2PE+se5nD8z49xRyfn+OzcXxDHN8ox2e+m9Ph
+EY4vh6Oz6/s+6Px++xoDpesbu9aTT2mf7X6yHqX8zk6VT8d8TdrWmL+8f4uPeXQxHv4d/in9htJ
/7Jz8OX+XjmZmCqMu9a50fr67cRHth/6PB3+xf9rqyG6zphc+Axu95oved7dWfPlpv+//ffhITpf
i7/i+cQrvkacVcfHeZ45sYTYVkl0riPeX0t8lnkLx7Od52cj+x2xnnhJGfF3PB/tYe5nvsHhUnn9
tURZh3E+WplX5XB8a4hnFhCnFOoWc/x3La+bfvUlz4vVh6h9tdaNyu8TrldDguM34xCN97EzD028
h3+Hf4d/E3/VPN7ePTzu/kf+Dnb9+Nokw33Rv8Prx/+dP2X9+GKdvp+4ftT6nXgWcf1ZB5Oryf+e
5fXSkfVfTvrKr/4QjZeRWOtFpdwNicWbkaB/vL8Trz408R7+Hf6p/R6+5MvOwZf7q7uC6Loy+viw
O1rP4OckHTce+jwd/sX/W7OLOOcqfb/Tv0N8kpnyXeI53O4z/ofNu49c+2XnYHK/zuu+2Ph2tsTn
Z3NF61KXut/B/m47l3gv89Fzo+1/YP3xecQjzifewfyQabiAMOuC6PCrWC8Rjq9nvYUZYD7MzG5T
z++Ub3A+L1K3/1//3cHrw/Nu+nLzUX+I1pvJa/TXx603EztuTizeOxL0j/c379ZDE+/hX3y/DG7X
ni+5Hd4+RP3LHGM8XH8bsee2xOJ9NkH//2m/NT3EtcxH7iB+fCdx8K7/7hxN7ree2+kPX3J+j7j9
0MRbE6N/v8Xvf43cnVi8R9wzyQzF+K39waGJ9/BP/XcRt3vxU19uPtYfov7UGaP/FzxNLH46sXjr
E/Q//Dv8U/u9zeOu8/kvNx93HKL+3Bdj/F36ArHrhcTifThB/3h/1w/G9vm/9LNwPW9/+cvNx4eH
qL2HY/TP8leItlcSizeQoH+8vwdfOzTxHv4d/h3+Hf79b/ud9+qXnYPEfu/8D8uv+Os4fH7S/Q38
f1Y/1UJ/++T/s/73Ia87jTG+QzzUv4cP0XpO/OFfHDcYigfE4+9x+ecmR+t/MJVV7P+W75eLJ5To
iynZePwDxEP1/TKmg20Z3tHE7dvlDq2J3MQinnhy1pjXmA8iH9Sf9H/f4D70KtM//yASPPw7/DuI
39ioPHamGD4gJjNTmWlMI9PENDOtzGJmBdPGrGHWMV1MP7ON2cHsZHYx+5l9zKEP5D9MO2WYmfw5
55859hlxlLmHOcIcZg4xB5kDzH5mH7OX2cPsZnYxO5kdzDamn+li1jFrmDZmBbNYyd9/OJ4xLs+n
XB5mP7OPafyE24mZzBz7N4dT+DHn80NuR+YY1+uoUt9cj1ammZm6l+p7z5FJVJ/MAWY/s5vZpRw/
gmhmjiURR5lWA9uZA3u53phWppm55yjyczHrmMVTkuT8uY7l48wKZjHTyjQzTcw0ZirTwBybwfll
7mGOMIeZQ8wBZj+zj1nDrGAalXDTOX2maxrnn1nDtDErmCamkdmVQuxktjFdzDqFx3B5pnB7MV3M
OmbyTI4vldjBrJtJ9Zw6i8up+DE7mGlzOP7ZnD+mfw6FH5zL9cXsZ/Yxe5mDSjzMLubYPC4n08+0
zaf4DWkcz3z2Y/qZYwv4ONPPtC2k8L0L2c70K3oxhz+O65E5tJjCdSzh9mGOsf8oM83I5VnK5WH6
jRx+BWvmiInraTn3S6Ytm9s/netJiZfZpeiVnC4zlWk+PgnXYFNMTOPx7Mf6vNWkQ8y8ZwwG6LLj
6+F61so+Kn7Wyj4oF7BWvpe9h7Xy3exrrJXveT9nrXzXm/ksaeX73jrWyve9V7FWvvN9nLWyn8sg
a2U/lrdYK99jfM5a+S7D+BzHz3oNa2UflxNZK++ruVkr761dz1rZP+Yu1sr+Lw+zVt7vGWatvOez
n7Wy78y050kr+8YsZK28P1HFWnmP4hLFn/W1rJX9ZnpYK8+fX2CtPIf+G2tln5sx1so+NVNeIK08
PzOzVp6jnc5a2R/HxVrZ36aVtfJ843bWynOOQdbKvjpvKfGxfoe1cn0680Xuf7yG/hprZT+eTayV
/XROBw1DcnztXc/6ZtYXsL6f9a2sf8r6UdbKmv2nGP9XoL7+Sfo3rDtYv48axkoxjCf59xKEx78B
xt/LpKKGAW84gfQi1smss0HPSAE/1kWs01jj38iDU5Rh+jEU/XzWr7FeyXqU9wsqZt3K43c7a2Uf
IQ9rZX+hi1g/z3b8o8DHHhN+v+VJ1OBbM5/0CPvX3Uv+RyeR7mF9AuuuPtK7WX+H7bcnUfwdHP+L
bL+3l+yjrG9hvfAILg/9KXJDJet5/D7LNawfZf8nWPc/RHoP65M5/JyvkP6QdSnrNfeTvoL1Px4k
PcTawvHtY30pp7/ySPb/EenTWWc/TPoq1s+yfpr1Faz/ybqAwy8+ivRO1ptZX8Hpn8/6yR+SfoD1
17h+P2X9MIdfPoX0NU+Q3sHa+2PSl7P+mPUTrN+5j/SUo0mfzulbWX/yU9I7WZ/8KOlbWN/P9tdY
v/Yk6aOS2c7pfZX1+n7SPtbVXJ47WO9l+69ZWzn+1GNIP87pV7Au5vQuZL33cdI/Ufx/wvXPuo11
Vgrnj9M/k/XHXP7vsL6E43+V9UWc/lFTub9weutYezm+FtafcHs8yDqb03+PdRuHT5/G+WV9Bmsb
h+9mvZfDv8G65zHSs6aT/jrrU1m/y/rbrDu5ft9gXfd90p+yVt4fmzuD9Nv8XtFa1ufw+NvNupPL
exNrG5+PnmadyuHfYX2eMp8cS/ONjeebFcdye3D4atYXcfhm1lex/XrWD7P9IdbKe3ivsFbez3uP
9Susj0il+UnZHyM7lfKTtpfsJ6eSfwV/Z3o2a+U7+btZF3yd9Kusle/pDTNJK9+rrmM9eBppP+sj
+PvrG1kr38E+x1r5zjVpFulhth/PWvledjvrLtbXs/4n67dYv1VHevVs0sp3uWezVr7XfYT1z7l8
77FW9uc4ag5p5bvz1ayV79G3s+7i9dm5rM1s75lD9Z3K9f0s25Xv0f/C+hUOP2MuaWWfkhWslf1L
Sln/g3Ut66t4vXXZXGpv5f39++dS+q6ZpH/J/q/cQv5HziO9icNnslbep1/P+iL2l1ifzvZLWY/y
evF+1n28XvwVaxf7j7E+h/XS+ZS/Os7f+vmcHw7vYZ3B6XeyXsX2h1lXs/011sp3CX9jrXyvMCWN
tId1But7eJ+eM9Oo/pT9CC9Oo/zhfRv83cv+zy4n/TrrVBvpvaxvYrt1AenSfNKtrC/ifX16WH98
POmXWafxvmafsFb2PVu9kLSyv1mA9Tu839CtrL1ppAdZb19E+iPWyj5LKxbxfJJO+izWyn5r17FW
9jN6nfVNM0kfYP0shz/+ONJ3sN7Bej/Xx8WsN/FzgD7Wyj5JH7BW9jtaspj7u4n0KayVfZbaWC/h
9O5mbZrD+WWdWkQ6aQlpZZ+4StaWUtK7WT95Kul7WPcuI/0G62lcniOWku4/lrSZ9U2c/6+zPs9I
+irWt8wm/TjrNN6Hag/rIxaTnm8krezzVMMa+w3+LmP9nSrSP2dt4vg+Yz2Nw5+YzumvJO1hbeX+
dyvrB7m/vcpa2Sfr2Ayubwvpk1hXc3l8rOvYv4e1lfUvWSv7WCVl8vjk/p7Dejvnt4X1Z5ze86xn
8cOOT1mnlZBev4y0sj9WiLWyT9c9rLdz+w2zVvb9WprF7Xci6WrWyv5fv2dt5f40M5vPP+xfynqA
7btZX7Ka9L2s/7GQ42P9GfunLiddvoT0BtadXP4LWP8ul/RDrO+wkv6Y9XGZpE0mjp/1mazvzybd
xdrF+nnWA9w+Y6yP+yrpVStIh9hex1rZL+1h1qvKSf+HtbKPWvlK0sq+Z+ewnreR9CBrZT+1vax7
efznHM/nF06/kXUjj9cHWB/J4/HPrN/i+eX4VdxfV5CuZ30Vz9/3sz6umOuT9Swj6ZWr+fw3j8vP
etVS0jewVvaX+wVrZR+35DU8v6wiXcLauI3rg7Wy/9sjrPt5fnqf9aUnkF5+AukUns8crJ1cPzez
HuH2e5N1K4dPNXN8PN5zWO/h9tzOei3Ppxewdm0iPcRa2Zfx36zr+P7Z4hwuH59vylj/rpr0rhw6
vw7x+bWL7cp+j4+yfpLje5v1tco+chYe32xfxfpZtp/MWtk32MVa2U/4Uta/Y30X66Gfk34V9THh
95P/baH8Di8mvTiX+wvf3zmD9Ysc/nLWpfy+8BOsH2c9yjrtJdLZedz+HN7LWnnfuIv1tS+S/jnr
MQ7/AWsD369amM/jmfWGfK5vzr+b7Wey/XrWFo7/x6xPZPvbrOvZnlRAWnkv28haeV/7JNbnsf46
6+ufIX1zAdWv8v3F8wWUv5qFpN9n/+3sv7KQ+zdrF+su1t9h/eEA6WdYjz5H2mAlHWD/EtZ3sN3H
upTtPawvZT3Eej3Hf3wRz0esg6wXcnw3sH6N7U+yHmH9thKe709OW0vaz+/ZF6yl+rBxfZzF9mls
v5L126zvY/0Pju+/WM/i9P7DWvmOZcFXSSvftxSxXsX6tK9S+yjvP3/zq5SfNiPph9hfeR/oj6yV
94WyTuT+x+8z3ch6Jes3Wf/jF1z+daSV95ctrJX38xpYK++/fZe18j7Zy6wHeDyOKXZ+Lyfra5R/
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
L35znp8A+AIA
#!/usr/bin/env python
# Patches Yosemite IONVMeFamily.kext binary so its undefined symbols
# resolve against the Mavericks (10.9.5) kernel.
#
# - _bufattr_passive -> _bufattr_throttled
# - AppleMobileFileIntegrity::metaClass -> IOService::metaClass
# - AppleMobileFileIntegrity::copyEntitlements(proc*) -> _get_bsdtask_info
# - IOService::init(OSDictionary*) -> IORegistryEntry::init(OSDictionary*)
# - IOService::init(IORegistryEntry*, IORegistryPlane*) -> IORegistryEntry::init(IORegistryEntry*, IORegistryPlane*)
#
# The new strings are appended past the original string table (overwriting the
# code-signature blob, which we also strip via LC_CODE_SIGNATURE -> LC_NOTE).
import struct, sys, os, shutil
if len(sys.argv) != 3:
sys.stderr.write("usage: %s <input-binary> <output-binary>\n" % sys.argv[0])
sys.exit(1)
src, dst = sys.argv[1], sys.argv[2]
shutil.copyfile(src, dst)
REDIRECTS = {
"_bufattr_passive": "_bufattr_throttled",
"__ZN24AppleMobileFileIntegrity9metaClassE": "__ZN9IOService9metaClassE",
"__ZN24AppleMobileFileIntegrity16copyEntitlementsEP4proc": "_get_bsdtask_info",
"__ZN9IOService4initEP12OSDictionary": "__ZN15IORegistryEntry4initEP12OSDictionary",
"__ZN9IOService4initEP15IORegistryEntryPK15IORegistryPlane": "__ZN15IORegistryEntry4initEPS_PK15IORegistryPlane",
}
LC_SEGMENT_64 = 0x19
LC_SYMTAB = 0x02
LC_CODE_SIGNATURE= 0x1d
with open(dst, "r+b") as f:
data = bytearray(f.read())
# --- Mach-O header ---
magic = struct.unpack_from("<I", data, 0)[0]
if magic != 0xfeedfacf:
sys.exit("not a 64-bit Mach-O: 0x%x" % magic)
ncmds, sizeofcmds = struct.unpack_from("<II", data, 16)
cmd_off = 32
# --- Walk load commands ---
symtab = None # (cmd_off, symoff, nsyms, stroff, strsize)
linkedit = None # (cmd_off, fileoff, filesize, vmaddr, vmsize)
codesig = None # (cmd_off, dataoff, datasize)
off = cmd_off
for _ in range(ncmds):
cmd, cmdsize = struct.unpack_from("<II", data, off)
if cmd == LC_SEGMENT_64:
segname = bytes(data[off+8:off+24]).rstrip(b"\x00")
if segname == b"__LINKEDIT":
vmaddr, vmsize, fileoff, filesize = struct.unpack_from("<QQQQ", data, off+24)
linkedit = (off, fileoff, filesize, vmaddr, vmsize)
elif cmd == LC_SYMTAB:
symoff, nsyms, stroff, strsize = struct.unpack_from("<IIII", data, off+8)
symtab = (off, symoff, nsyms, stroff, strsize)
elif cmd == LC_CODE_SIGNATURE:
dataoff, datasize = struct.unpack_from("<II", data, off+8)
codesig = (off, dataoff, datasize)
off += cmdsize
if not symtab or not linkedit:
sys.exit("missing LC_SYMTAB or __LINKEDIT")
sym_cmd_off, symoff, nsyms, stroff, strsize = symtab
le_cmd_off, le_fileoff, le_filesize, le_vmaddr, le_vmsize = linkedit
print("LC_SYMTAB: symoff=%d nsyms=%d stroff=%d strsize=%d" % (symoff, nsyms, stroff, strsize))
print("__LINKEDIT: fileoff=%d filesize=%d vmsize=0x%x" % (le_fileoff, le_filesize, le_vmsize))
if codesig:
print("LC_CODE_SIGNATURE: dataoff=%d datasize=%d" % (codesig[1], codesig[2]))
# --- Append new strings to the string table ---
# Build new string blob, recording (old_name -> new_strx).
strtab_end = stroff + strsize
new_blob = bytearray()
new_offsets = {}
for old, new in REDIRECTS.items():
new_offsets[old] = strsize + len(new_blob)
new_blob += new.encode("ascii") + b"\x00"
# pad to 8 bytes
while len(new_blob) % 8:
new_blob += b"\x00"
new_strsize = strsize + len(new_blob)
# --- Update symbol table: scan all symbols, look up by current name; rewrite n_strx ---
# nlist_64 layout: uint32 n_strx; uint8 n_type; uint8 n_sect; uint16 n_desc; uint64 n_value
hits = {k: 0 for k in REDIRECTS}
for i in range(nsyms):
e = symoff + i * 16
n_strx = struct.unpack_from("<I", data, e)[0]
# read C string at stroff + n_strx
s_off = stroff + n_strx
end = data.index(b"\x00", s_off)
name = bytes(data[s_off:end]).decode("ascii", "replace")
if name in REDIRECTS:
struct.pack_into("<I", data, e, new_offsets[name])
hits[name] += 1
print("symbol rewrites:")
for k, v in hits.items():
print(" %d x %s -> %s" % (v, k, REDIRECTS[k]))
if v == 0:
sys.exit("symbol %r not found in symbol table" % k)
# --- Splice new strings into the file at strtab_end ---
# Strategy: we need to keep file layout monotonic. The code signature lives
# AFTER the string table. We overwrite that area (kext signing not enforced
# on 10.9). If we overflow past current __LINKEDIT filesize, we extend it.
needed_end = strtab_end + len(new_blob)
le_end = le_fileoff + le_filesize
# Write new strings starting at strtab_end
for i, b in enumerate(new_blob):
pos = strtab_end + i
if pos < len(data):
data[pos] = b
else:
data.append(b)
# If needed, pad data out to needed_end (shouldn't happen since codesig was 6080 bytes)
if needed_end > le_end:
# extend __LINKEDIT
new_filesize = needed_end - le_fileoff
new_vmsize = (new_filesize + 0xfff) & ~0xfff
struct.pack_into("<QQ", data, le_cmd_off + 24 + 16, le_fileoff, new_filesize) # fileoff,filesize -- wrong layout, fix below
# Actually proper layout: vmaddr, vmsize, fileoff, filesize at offset+24
struct.pack_into("<QQQQ", data, le_cmd_off + 24, le_vmaddr, new_vmsize, le_fileoff, new_filesize)
print("__LINKEDIT extended: filesize=%d vmsize=0x%x" % (new_filesize, new_vmsize))
# --- Update LC_SYMTAB strsize ---
struct.pack_into("<I", data, sym_cmd_off + 8 + 12, new_strsize)
print("new strsize=%d" % new_strsize)
# --- Neutralize the code signature ---
# We've overwritten part of the codesig blob with new strtab bytes, so the
# signature is no longer valid. We can't drop the LC_CODE_SIGNATURE load
# command (would require shifting all later commands down), so instead we
# point it at an empty region: dataoff=0, datasize=0. The 10.9 loader still
# recognizes the load command but sees there's nothing to verify. Kext
# signing isn't enforced on 10.9 anyway.
if codesig:
cs_off = codesig[0]
struct.pack_into("<II", data, cs_off + 8, 0, 0)
print("LC_CODE_SIGNATURE neutralized (dataoff=0, datasize=0)")
# Truncate trailing codesig area? No -- leaving it as junk is harmless and
# avoids changing __LINKEDIT filesize unnecessarily.
f = open(dst, "wb")
f.write(bytes(data))
f.close()
print("wrote %s (%d bytes)" % (dst, len(data)))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment