Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Veni, Vidi, Running on PowerPC! #30

Open
wants to merge 14 commits into
base: master
Choose a base branch
from
Open
4 changes: 2 additions & 2 deletions HoRNDIS-Info.plist
Original file line number Diff line number Diff line change
Expand Up @@ -19,11 +19,11 @@
<key>CFBundlePackageType</key>
<string>KEXT</string>
<key>CFBundleShortVersionString</key>
<string>7.1</string>
<string>GIT_VERSION</string>
<key>CFBundleSignature</key>
<string>????</string>
<key>CFBundleVersion</key>
<string>6</string>
<string>APP_VERSION</string>
<key>IOKitPersonalities</key>
<dict>
<key>HoRNDISComposite_SGS2</key>
Expand Down
12 changes: 4 additions & 8 deletions HoRNDIS.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -76,13 +76,12 @@ bool HoRNDIS::init(OSDictionary *properties) {
outbufs[i].inuse = false;
}


inbuf.mdp = NULL;
inbuf.buf = NULL;
fpDevice = NULL;

xid_lock = IOLockAlloc();
xid = 1;


return true;
}

Expand Down Expand Up @@ -158,11 +157,6 @@ void HoRNDIS::stop(IOService *provider) {
fMediumDict->release();
fMediumDict = NULL;
}

if (xid_lock) {
IOLockFree(xid_lock);
xid_lock = NULL;
}

super::stop(provider);
}
Expand Down Expand Up @@ -895,6 +889,8 @@ void HoRNDIS::receivePacket(void *packet, UInt32 size) {
/***** RNDIS command logic *****/

int HoRNDIS::rndisCommand(struct rndis_msg_hdr *buf, int buflen) {
static IOLock *xid_lock = IOLockAlloc(); // TODO: memory leak? should NULL check on first call.

int count;
int rc = kIOReturnSuccess;
IOUSBDevRequestDesc rq;
Expand Down
1 change: 0 additions & 1 deletion HoRNDIS.h
Original file line number Diff line number Diff line change
Expand Up @@ -252,7 +252,6 @@ class HoRNDIS : public IOEthernetController {
IOUSBPipe *fInPipe;
IOUSBPipe *fOutPipe;

IOLock *xid_lock;
uint32_t xid;
uint32_t mtu;

Expand Down
85 changes: 77 additions & 8 deletions HoRNDIS_PPC.xcodeproj/project.pbxproj
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,20 @@
objectVersion = 45;
objects = {

/* Begin PBXAggregateTarget section */
82F186B91A18D183003042FD /* GenGitVersion */ = {
isa = PBXAggregateTarget;
buildConfigurationList = 82F186BE1A18D1A1003042FD /* Build configuration list for PBXAggregateTarget "GenGitVersion" */;
buildPhases = (
82F186B81A18D183003042FD /* ShellScript */,
);
dependencies = (
);
name = GenGitVersion;
productName = GenGitVersion;
};
/* End PBXAggregateTarget section */

/* Begin PBXBuildFile section */
32D94FC80562CBF700B6AF17 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 089C167DFE841241C02AAC07 /* InfoPlist.strings */; };
828A6EDC1A0FC5F100DB9BA7 /* HoRNDIS-Prefix.pch in Headers */ = {isa = PBXBuildFile; fileRef = 828A6EDB1A0FC5F100DB9BA7 /* HoRNDIS-Prefix.pch */; };
Expand Down Expand Up @@ -143,6 +157,7 @@
projectRoot = "";
targets = (
32D94FC30562CBF700B6AF17 /* HoRNDIS_PPC */,
82F186B91A18D183003042FD /* GenGitVersion */,
);
};
/* End PBXProject section */
Expand All @@ -168,6 +183,22 @@
};
/* End PBXRezBuildPhase section */

/* Begin PBXShellScriptBuildPhase section */
82F186B81A18D183003042FD /* ShellScript */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
files = (
);
inputPaths = (
);
outputPaths = (
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "PATH=$PATH:/opt/local/bin # Use /opt/local (MacPorts) as fallback\n\n# Look for git\ngit=$(which git)\nif [ -z $git ]; then echo \"Cannot find git on this system\"; exit 1; fi\n\n# Touch Info.plist\nif [ -e HoRNDIS-Info.plist ]; then touch HoRNDIS-Info.plist; fi\nif [ -e Info.plist ]; then touch Info.plist; fi\n\n# Find latest git version\nversion=`$git describe --dirty`\nversion=`echo $version | sed 's/[a-zA-Z]*//'`\nversionNum=`echo $version | sed 's/\\-[0-9]*\\-[a-zA-Z0-9]*//' | sed 's/-dirty//'`\n\n# Write macros\necho \"#define GIT_VERSION $version\" > InfoPlist.h\necho \"#define APP_VERSION $versionNum\" >> InfoPlist.h";
};
/* End PBXShellScriptBuildPhase section */

/* Begin PBXSourcesBuildPhase section */
32D94FC90562CBF700B6AF17 /* Sources */ = {
isa = PBXSourcesBuildPhase;
Expand Down Expand Up @@ -256,16 +287,19 @@
GCC_WARN_UNINITIALIZED_AUTOS = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
INFOPLIST_FILE = "HoRNDIS-Info.plist";
INFOPLIST_PREFIX_HEADER = InfoPlist.h;
INFOPLIST_PREPROCESS = YES;
INSTALL_MODE_FLAG = "u+rwx,g-rwx,a-rwx";
MODULE_NAME = com.joshuawise.HoRNDIS;
MODULE_VERSION = 6;
MACH_O_TYPE = mh_execute;
MODULE_NAME = com.joshuawise.kexts.HoRNDIS;
MODULE_VERSION = 1.0.0d1;
ONLY_ACTIVE_ARCH = YES;
OTHER_CFLAGS = "-O";
PREBINDING = NO;
PRODUCT_NAME = "$(TARGET_NAME)";
SDKROOT = macosx10.5;
SDKROOT = macosx10.4;
STRIP_INSTALLED_PRODUCT = NO;
WRAPPER_EXTENSION = kext;
ZERO_LINK = NO;
};
name = Debug;
};
Expand All @@ -277,6 +311,7 @@
COMBINE_HIDPI_IMAGES = YES;
CURRENT_PROJECT_VERSION = 1.0.0d1;
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
GCC_AUTO_VECTORIZATION = YES;
GCC_C_LANGUAGE_STANDARD = gnu99;
GCC_ENABLE_KERNEL_DEVELOPMENT = YES;
GCC_MODEL_TUNING = G4;
Expand All @@ -289,14 +324,39 @@
GCC_WARN_UNINITIALIZED_AUTOS = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
INFOPLIST_FILE = "HoRNDIS-Info.plist";
INFOPLIST_PREFIX_HEADER = InfoPlist.h;
INFOPLIST_PREPROCESS = YES;
INSTALL_MODE_FLAG = "u+rwx,g-rwx,a-rwx";
MODULE_NAME = com.joshuawise.HoRNDIS;
MODULE_VERSION = 6;
MACH_O_TYPE = mh_execute;
MODULE_NAME = com.joshuawise.kexts.HoRNDIS;
MODULE_VERSION = 1.0.0d1;
OTHER_CFLAGS = "-O";
PREBINDING = NO;
PRODUCT_NAME = "$(TARGET_NAME)";
SDKROOT = macosx10.5;
SDKROOT = macosx10.4;
WRAPPER_EXTENSION = kext;
ZERO_LINK = NO;
};
name = Release;
};
82F186BA1A18D184003042FD /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
COPY_PHASE_STRIP = NO;
GCC_DYNAMIC_NO_PIC = NO;
GCC_OPTIMIZATION_LEVEL = 0;
PRODUCT_NAME = GenGitVersion;
ZERO_LINK = NO;
};
name = Debug;
};
82F186BB1A18D184003042FD /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
COPY_PHASE_STRIP = YES;
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
GCC_ENABLE_FIX_AND_CONTINUE = NO;
PRODUCT_NAME = GenGitVersion;
ZERO_LINK = NO;
};
name = Release;
};
Expand All @@ -321,6 +381,15 @@
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
82F186BE1A18D1A1003042FD /* Build configuration list for PBXAggregateTarget "GenGitVersion" */ = {
isa = XCConfigurationList;
buildConfigurations = (
82F186BA1A18D184003042FD /* Debug */,
82F186BB1A18D184003042FD /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
/* End XCConfigurationList section */
};
rootObject = 089C1669FE841209C02AAC07 /* Project object */;
Expand Down
40 changes: 39 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,41 @@
![HoRNDIS](docs/images/readme-header.png)

**HoRNDIS** (pronounce: *"horrendous"*) is a driver for Mac OS X that allows you to use your Android phone's native [USB tethering](http://en.wikipedia.org/wiki/Tethering) mode to get Internet access.

For more information, [visit the home page for HoRNDIS on my site](http://www.joshuawise.com/horndis).
For more information, [visit the home page for HoRNDIS](http://www.joshuawise.com/horndis).

## Building the source
* `git clone` the repository
* Simply running xcodebuild in the checkout directory should be sufficient to build the kext. (see below for which project to use).


*Please don't publish versions you built as if they were official!*


**For Mac OS X 10.6 or higher**
If you wish to package it up, you can run make to assemble the package in the `build/` directory.
For development use the `HoRNDIS.xcodeproj` on Xcode 4.0 or higher.

**For Mac OS X 10.5 or lower**
Don't use `make` if you want to build for 10.4 or 10.5.
Use the `HoRNDIS_PPC.xcodeproj` on Xcode 3.1.4 preferably.
To package your kext, use the PackageMaker files in the `package/` directory according to what you want to include.


[^download_footer]: To download the installation package, please [visit](http://www.joshuawise.com/horndis).
For binaries for Leopard and earlier, check the releases of this repo.

## Installation

* Get the installation package (Download[^download_footer] or [Build](#building-the-source) the installation package from source yourself)
* Run the installation package
* Assuming that the installation proceeds without errors, after it completes, connect your phone to your Mac by USB.
* Enter the settings menu on your phone.
* In the connections section, below Wi-Fi and Bluetooth, select “More...”.
Select “Tethering & portable hotspot”.
* Check the “USB tethering” box. It should flash once, and then become solidly checked.

## Uninstallation

* Delete the `HoRNDIS.kext` under `/System/Library/Extensions` and `/Library/Extensions` folder
* Restart your computer
File renamed without changes.
58 changes: 58 additions & 0 deletions build/Release/test_kext.command
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
#!/bin/bash

# Variables
SOURCE="${BASH_SOURCE[0]}"
while [ -h "$SOURCE" ]; do DIR="$( cd -P "$( dirname "$SOURCE" )" && pwd )";SOURCE="$(readlink "$SOURCE")";[[ $SOURCE != /* ]] && SOURCE="$DIR/$SOURCE"; done
CURDIR="$( cd -P "$( dirname "$SOURCE" )" && pwd )"

DESTDIR="/tmp/HoRNDIS";


# Get sudo
if [ -z $(sudo echo "gotsudo") ]; then echo "Could not get super-user permissions"; exit -1; fi


# Copy KEXT to tmp
echo "Copying...";

if [ -d $DESTDIR ]; then sudo rm -r $DESTDIR; fi
sudo mkdir $DESTDIR;
sudo cp -r $CURDIR/HoRNDIS* $DESTDIR/; #Copies all files beginning with HoRNDIS…
sudo chmod -R 0700 $DESTDIR;
sudo chown -R root:wheel $DESTDIR;

# Load KEXT

KEXTFILES=();
while read -r -d $'\0'; do KEXTFILES+=("$REPLY"); done < <(sudo find $DESTDIR -iname "*.kext" -maxdepth 1 -print0);
if [ ${#KEXTFILES[@]} -gt 1 ]; then
# Ask user which kext to take
NUM_KEXTS=${#KEXTFILES[@]};

for (( i=0; i < $NUM_KEXTS; i++ )); do
echo "$i: ${KEXTFILES[$i]}";
done

KEXTNUM=-1;
while [ $KEXTNUM -lt 0 ] || [ $KEXTNUM -ge $NUM_KEXTS ]; do read -p "Which file?: " KEXTNUM; done

# Got file
KEXTFILE=${KEXTFILES[$KEXTNUM]};
else
KEXTFILE=${KEXTFILES[0]};
fi

if [ -n "$KEXTFILE" ]; then
# Load KEXT if found
echo "Loading \"$KEXTFILE\"...";
sudo kextload -t "$KEXTFILE";

echo "Loaded:";
echo $(kextstat | grep HoRNDIS);

exit 0;
else
# No KEXT found
echo 'No KEXTFILE found.';
exit 1;
fi
Binary file added docs/images/readme-header.png
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
1 change: 1 addition & 0 deletions package/HoRNDIS (Tiger).pmdoc/01horndis-contents.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
<pkg-contents spec="1.12"/>
1 change: 1 addition & 0 deletions package/HoRNDIS (Tiger).pmdoc/01horndis.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
<pkgref spec="1.12" uuid="D10B1AB3-1424-4EE9-B8E5-935CF6CDC228"><config><identifier>com.joshuawise.kexts.HoRNDIS_PPC.pkg</identifier><version>1.0</version><description></description><post-install type="none"/><requireAuthorization/><installFrom relative="true" mod="true" includeRoot="true">../build/Release/HoRNDIS_PPC.kext</installFrom><installTo>/System/Library/Extensions</installTo><flags><followSymbolicLinks/></flags><packageStore type="internal"></packageStore><mod>parent</mod><mod>scripts.postinstall.path</mod><mod>scripts.postinstall.isRelativeType</mod><mod>version</mod><mod>includeRoot</mod><mod>installFrom.path</mod><mod>identifier</mod><mod>installTo</mod></config><contents><component id="com.joshuawise.kexts.HoRNDIS" path="../build/Release/HoRNDIS_PPC.kext" version="6"/><filter>/CVS$</filter><filter>/\.svn$</filter><filter>/\.cvsignore$</filter><filter>/\.cvspass$</filter><filter>/\.DS_Store$</filter></contents></pkgref>
1 change: 1 addition & 0 deletions package/HoRNDIS (Tiger).pmdoc/index.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
<pkmkdoc spec="1.12"><properties><title>HoRNDIS</title><build>HoRNDIS.mpkg</build><organization>com.joshuawise</organization><userSees ui="both"/><min-target os="2"/><domain anywhere="true"/></properties><distribution><versions min-spec="1.000000"/><scripts></scripts></distribution><description>HoRNDIS is a kernel extension ("kext") that allows you to use your Android phone's built-in USB tethering support.</description><contents><choice title="HoRNDIS Kernel Extension (10.4.11-10.5.8)" id="tiger" description="Installs the HoRNDIS Kernel Extension for Mac OS X 10.4.11 - 10.5.8 into /System/Library/Extensions" starts_selected="true" starts_enabled="true" starts_hidden="false"><pkgref id="com.joshuawise.kexts.HoRNDIS_PPC.pkg"/><choice-reqs><requirement id="tosv" operator="le" value="'10.5.8'" selected="no" enabled="no" hidden="unchanged" startSelected="unchanged" startEnabled="unchanged" startHidden="unchanged"/><requirement id="tosv" operator="ge" value="'10.4.11'" selected="no" enabled="no" hidden="unchanged" startSelected="unchanged" startEnabled="unchanged" startHidden="unchanged"/></choice-reqs></choice></contents><resources bg-scale="none" bg-align="bottomleft"><locale lang="en"><resource relative="true" mod="true" type="background">resources/background.png</resource><resource relative="true" mod="true" type="license">../COPYING.rtf</resource><resource relative="true" mod="true" type="welcome">resources/intro-text.rtf</resource><resource relative="true" mod="true" type="conclusion">resources/post-readme.rtf</resource></locale></resources><requirements><requirement id="tosv" operator="ge" value="'10.4.11'"><message-title>Failure</message-title><message>HoRNDIS supports only Mac OS X 10.4.11 Tiger or greater.</message></requirement></requirements><flags/><postinstall><action id="com.apple.packagemaker.actions.unloadkext"><value>com.joshuawise.kexts.HoRNDIS</value><type>component</type></action><action id="com.apple.packagemaker.actions.loadkext"><value>com.joshuawise.kexts.HoRNDIS</value><type>component</type></action></postinstall><extra-files/><item type="file">01horndis.xml</item><mod>properties.userDomain</mod><mod>properties.anywhereDomain</mod><mod>properties.systemDomain</mod><mod>properties.customizeOption</mod><mod>extraFiles</mod><mod>properties.title</mod><mod>description</mod><mod>postinstallActions.actions</mod></pkmkdoc>
1 change: 1 addition & 0 deletions package/HoRNDIS (Universal).pmdoc/01horndis-contents.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
<pkg-contents spec="1.12"/>
1 change: 1 addition & 0 deletions package/HoRNDIS (Universal).pmdoc/01horndis.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
<pkgref spec="1.12" uuid="8F3C3636-403C-4CE3-B8C0-9DA8D05891EA"><config><identifier>com.joshuawise.kexts.HoRNDIS.pkg</identifier><version>1.0</version><description></description><post-install type="none"/><requireAuthorization/><installFrom relative="true" mod="true" includeRoot="true">../build/Release/HoRNDIS.kext</installFrom><installTo>/System/Library/Extensions</installTo><flags><followSymbolicLinks/></flags><packageStore type="internal"></packageStore><mod>locationType</mod><mod>parent</mod><mod>scripts.postinstall.isRelativeType</mod><mod>installFrom.isRelativeType</mod><mod>installFrom.path</mod><mod>identifier</mod></config></pkgref>
1 change: 1 addition & 0 deletions package/HoRNDIS (Universal).pmdoc/02horndis-contents.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
<pkg-contents spec="1.12"/>
1 change: 1 addition & 0 deletions package/HoRNDIS (Universal).pmdoc/02horndis.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
<pkgref spec="1.12" uuid="D10B1AB3-1424-4EE9-B8E5-935CF6CDC228"><config><identifier>com.joshuawise.kexts.HoRNDIS_PPC.pkg</identifier><version>1.0</version><description></description><post-install type="none"/><requireAuthorization/><installFrom relative="true" mod="true" includeRoot="true">../build/Release/HoRNDIS_PPC.kext</installFrom><installTo>/System/Library/Extensions</installTo><flags><followSymbolicLinks/></flags><packageStore type="internal"></packageStore><mod>parent</mod><mod>scripts.postinstall.path</mod><mod>scripts.postinstall.isRelativeType</mod><mod>version</mod><mod>includeRoot</mod><mod>installFrom.path</mod><mod>identifier</mod><mod>installTo</mod></config><contents><component id="com.joshuawise.kexts.HoRNDIS" path="../build/Release/HoRNDIS_PPC.kext" version="6"/><filter>/CVS$</filter><filter>/\.svn$</filter><filter>/\.cvsignore$</filter><filter>/\.cvspass$</filter><filter>/\.DS_Store$</filter></contents></pkgref>
1 change: 1 addition & 0 deletions package/HoRNDIS (Universal).pmdoc/index.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
<pkmkdoc spec="1.12"><properties><title>HoRNDIS</title><build>HoRNDIS.mpkg</build><organization>com.joshuawise</organization><userSees ui="both"/><min-target os="2"/><domain anywhere="true"/></properties><distribution><versions min-spec="1.000000"/><scripts></scripts></distribution><description>HoRNDIS is a kernel extension ("kext") that allows you to use your Android phone's built-in USB tethering support.</description><contents><choice title="HoRNDIS Kernel Extension (10.6 or higher)" id="snowleopard" description="Installs the HoRNDIS Kernel Extension for Mac OS X 10.6 or higher into /System/Library/Extensions" starts_selected="true" starts_enabled="true" starts_hidden="false"><pkgref id="com.joshuawise.kexts.HoRNDIS.pkg"/><choice-reqs><requirement id="tosv" operator="ge" value="'10.6'" selected="no" enabled="no" hidden="unchanged" startSelected="unchanged" startEnabled="unchanged" startHidden="unchanged"/></choice-reqs></choice><choice title="HoRNDIS Kernel Extension (10.5.8 or lower)" id="tiger" description="Installs the HoRNDIS Kernel Extension for Mac OS X 10.5.8 or lower into /System/Library/Extensions" starts_selected="true" starts_enabled="true" starts_hidden="false"><pkgref id="com.joshuawise.kexts.HoRNDIS_PPC.pkg"/><choice-reqs><requirement id="tosv" operator="le" value="'10.5.8'" selected="no" enabled="no" hidden="unchanged" startSelected="unchanged" startEnabled="unchanged" startHidden="unchanged"/><requirement id="tosv" operator="ge" value="'10.4.11'" selected="no" enabled="no" hidden="unchanged" startSelected="unchanged" startEnabled="unchanged" startHidden="unchanged"/></choice-reqs></choice></contents><resources bg-scale="none" bg-align="bottomleft"><locale lang="en"><resource relative="true" mod="true" type="background">resources/background.png</resource><resource relative="true" mod="true" type="license">../COPYING.rtf</resource><resource relative="true" mod="true" type="welcome">resources/intro-text.rtf</resource><resource relative="true" mod="true" type="conclusion">resources/post-readme.rtf</resource></locale></resources><requirements><requirement id="tosv" operator="ge" value="'10.4.11'"><message-title>Failure</message-title><message>HoRNDIS supports only Mac OS X 10.4.11 Tiger or greater.</message></requirement></requirements><flags/><postinstall><action id="com.apple.packagemaker.actions.unloadkext"><value>com.joshuawise.kexts.HoRNDIS</value><type>component</type></action><action id="com.apple.packagemaker.actions.loadkext"><value>com.joshuawise.kexts.HoRNDIS</value><type>component</type></action></postinstall><extra-files/><item type="file">01horndis.xml</item><item type="file">02horndis.xml</item><mod>properties.userDomain</mod><mod>properties.anywhereDomain</mod><mod>properties.systemDomain</mod><mod>properties.customizeOption</mod><mod>extraFiles</mod><mod>properties.title</mod><mod>description</mod><mod>postinstallActions.actions</mod></pkmkdoc>
2 changes: 1 addition & 1 deletion package/HoRNDIS.pmdoc/01horndis-contents.xml
Original file line number Diff line number Diff line change
@@ -1 +1 @@
<pkg-contents spec="1.12"><f n="HoRNDIS.kext" o="root" g="wheel" p="16877" pt="/Users/joshua/projects/horndis/HoRNDIS/build/Release/HoRNDIS.kext" m="true" t="file"><f n="Contents" o="root" g="wheel" p="16877"><f n=".#Info.plist" o="root" g="wheel" p="41396" x="true"><mod>mode</mod></f><f n="Info.plist" o="root" g="wheel" p="33188"/><f n="MacOS" o="root" g="wheel" p="16877"><f n="HoRNDIS" o="root" g="wheel" p="33261"/></f><f n="Resources" o="root" g="wheel" p="16877"><f n="en.lproj" o="root" g="wheel" p="16877"><f n="InfoPlist.strings" o="root" g="wheel" p="33188"/></f></f></f></f></pkg-contents>
<pkg-contents spec="1.12"/>