Import package vendor original sources for necessary manipulations.

Wed, 29 Jul 2009 11:23:17 +0200

author
Michael Schloh von Bennewitz <michael@schloh.com>
date
Wed, 29 Jul 2009 11:23:17 +0200
changeset 1
1a5334dfb21d
parent 0
e253b4383132
child 2
da073b397539

Import package vendor original sources for necessary manipulations.

tunblick/MenuController.m file | annotate | diff | comparison | revisions
tunblick/Sparkle.xcodeproj/default.pbxuser file | annotate | diff | comparison | revisions
tunblick/Sparkle.xcodeproj/project.pbxproj file | annotate | diff | comparison | revisions
tunblick/Tunnelblick.xcodeproj/project.pbxproj file | annotate | diff | comparison | revisions
tunblick/installer.m file | annotate | diff | comparison | revisions
tunblick/openvpnstart.m file | annotate | diff | comparison | revisions
tunblick/third_party/Makefile file | annotate | diff | comparison | revisions
     1.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     1.2 +++ b/tunblick/MenuController.m	Wed Jul 29 11:23:17 2009 +0200
     1.3 @@ -0,0 +1,1077 @@
     1.4 +/*
     1.5 + * Copyright (c) 2004 Angelo Laub
     1.6 + * Contributions by Dirk Theisen <dirk@objectpark.org>, 
     1.7 + *                  Jens Ohlig, 
     1.8 + *                  Waldemar Brodkorb
     1.9 + *
    1.10 + *  This program is free software; you can redistribute it and/or modify
    1.11 + *  it under the terms of the GNU General Public License version 2
    1.12 + *  as published by the Free Software Foundation.
    1.13 + *
    1.14 + *  This program is distributed in the hope that it will be useful,
    1.15 + *  but WITHOUT ANY WARRANTY; without even the implied warranty of
    1.16 + *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    1.17 + *  GNU General Public License for more details.
    1.18 + *
    1.19 + *  You should have received a copy of the GNU General Public License
    1.20 + *  along with this program (see the file COPYING included with this
    1.21 + *  distribution); if not, write to the Free Software Foundation, Inc.,
    1.22 + *  59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
    1.23 + */
    1.24 +
    1.25 +
    1.26 +#import "MenuController.h"
    1.27 +#import "NSApplication+NetworkNotifications.h"
    1.28 +#import "helper.h"
    1.29 +
    1.30 +
    1.31 +#define NSAppKitVersionNumber10_0 577
    1.32 +#define NSAppKitVersionNumber10_1 620
    1.33 +#define NSAppKitVersionNumber10_2 663
    1.34 +#define NSAppKitVersionNumber10_3 743
    1.35 +
    1.36 +
    1.37 +
    1.38 +BOOL systemIsTigerOrNewer()
    1.39 +{
    1.40 +    return (floor(NSAppKitVersionNumber) > NSAppKitVersionNumber10_3) ;
    1.41 +}
    1.42 +
    1.43 +@interface NSStatusBar (NSStatusBar_Private)
    1.44 +- (id)_statusItemWithLength:(float)l withPriority:(int)p;
    1.45 +@end
    1.46 +
    1.47 +
    1.48 +@implementation MenuController
    1.49 +
    1.50 +- (void) createStatusItem
    1.51 +{
    1.52 +	NSStatusBar *bar = [NSStatusBar systemStatusBar];
    1.53 +	int priority = INT32_MAX;
    1.54 +	if (systemIsTigerOrNewer()) {
    1.55 +		priority = MIN(priority, 2147483646); // found by experimenting - dirk
    1.56 +	}
    1.57 +	
    1.58 +	if (!theItem) {
    1.59 +		theItem = [[bar _statusItemWithLength: NSVariableStatusItemLength withPriority: priority] retain];
    1.60 +		//theItem = [[bar _statusItemWithLength: NSVariableStatusItemLength withPriority: 0] retain];
    1.61 +	}
    1.62 +	// Dirk: For Tiger and up, re-insert item to place it correctly.
    1.63 +	if ([bar respondsToSelector: @selector(_insertStatusItem:withPriority:)]) {
    1.64 +		[bar removeStatusItem: theItem];
    1.65 +		[bar _insertStatusItem: theItem withPriority: priority];
    1.66 +	}	
    1.67 +}
    1.68 +
    1.69 +-(id) init
    1.70 +{	
    1.71 +    if (self = [super init]) {
    1.72 +        [self dmgCheck];
    1.73 +		
    1.74 +        errorImage = [[NSImage imageNamed: @"error.tif"] retain];
    1.75 +        mainImage = [[NSImage imageNamed: @"00_closed.tif"] retain];
    1.76 +        connectedImage = [[NSImage imageNamed: @"connected.png"] retain];
    1.77 +        
    1.78 +		
    1.79 +		transitionalImage1 = [[NSImage imageNamed: @"01.tif"] retain];
    1.80 +		transitionalImage2 = [[NSImage imageNamed: @"02.tif"] retain];
    1.81 +		transitionalImage3 = [[NSImage imageNamed: @"03.tif"] retain];
    1.82 +		[NSApp setDelegate:self];
    1.83 +		
    1.84 +        myVPNConnectionDictionary = [[NSMutableDictionary alloc] init];
    1.85 +        myVPNConnectionArray = [[[NSMutableArray alloc] init] retain];
    1.86 +        userDefaults = [[NSMutableDictionary alloc] init];
    1.87 +        
    1.88 +        connectionArray = [[[NSMutableArray alloc] init] retain];
    1.89 +        appDefaults = [NSUserDefaults standardUserDefaults];
    1.90 +        [appDefaults registerDefaults:userDefaults];
    1.91 +		
    1.92 +		
    1.93 +		detailsItem = [[NSMenuItem alloc] init];
    1.94 +		[detailsItem setTitle: @"Details..."];
    1.95 +		[detailsItem setTarget: self];
    1.96 +		[detailsItem setAction: @selector(openLogWindow:)];
    1.97 +		
    1.98 +		quitItem = [[NSMenuItem alloc] init];
    1.99 +		[quitItem setTitle: @"Quit"]; 
   1.100 +		[quitItem setTarget: self];
   1.101 +		[quitItem setAction: @selector(quit:)];
   1.102 +        
   1.103 +		[self createStatusItem];
   1.104 +		
   1.105 +		[self updateMenu];
   1.106 +        [self setState: @"EXITING"]; // synonym for "Disconnected"
   1.107 +        
   1.108 +        [[NSNotificationCenter defaultCenter] addObserver: self 
   1.109 +                                                 selector: @selector(logNeedsScrolling:) 
   1.110 +                                                     name: @"LogDidChange" 
   1.111 +                                                   object: nil];
   1.112 +		
   1.113 +		// In case the systemUIServer restarts, we observed this notification.
   1.114 +		// We use it to prevent to end up with a statusItem right of Spotlight:
   1.115 +		[[NSDistributedNotificationCenter defaultCenter] addObserver: self 
   1.116 +															selector: @selector(menuExtrasWereAdded:) 
   1.117 +																name: @"com.apple.menuextra.added" 
   1.118 +															  object: nil];
   1.119 +		[[[NSWorkspace sharedWorkspace] notificationCenter] addObserver: self
   1.120 +															   selector: @selector(willGoToSleep)
   1.121 +																   name: @"NSWorkspaceWillSleepNotification"
   1.122 +																 object:nil];
   1.123 +		
   1.124 +		[[[NSWorkspace sharedWorkspace] notificationCenter] addObserver: self
   1.125 +															   selector: @selector(wokeUpFromSleep)
   1.126 +																   name: @"NSWorkspaceDidWakeNotification"
   1.127 +																 object:nil];
   1.128 +		
   1.129 +		NSString* vpnDirectory = [NSHomeDirectory() stringByAppendingPathComponent:@"Library/openvpn/"];
   1.130 +		
   1.131 +		UKKQueue* myQueue = [UKKQueue sharedQueue];
   1.132 +		[myQueue addPathToQueue: vpnDirectory];
   1.133 +		[myQueue setDelegate: self];
   1.134 +		[myQueue setAlwaysNotify: YES];
   1.135 +		
   1.136 +		[NSThread detachNewThreadSelector:@selector(moveAllWindowsToForegroundThread) toTarget:self withObject:nil];
   1.137 +		
   1.138 +		updater = [[SUUpdater alloc] init];
   1.139 +
   1.140 +	}
   1.141 +    return self;
   1.142 +}
   1.143 +
   1.144 +-(void)moveAllWindowsToForegroundThread {
   1.145 +	NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
   1.146 +	sleep(3);
   1.147 +	[self moveAllWindowsToForeground];
   1.148 +//	[NSTimer scheduledTimerWithTimeInterval: 1.0 target: self selector: @selector(moveAllWindowsToForeground) userInfo: nil repeats: YES];
   1.149 +	[pool release];
   1.150 +	
   1.151 +}
   1.152 +
   1.153 +- (void) menuExtrasWereAdded: (NSNotification*) n
   1.154 +{
   1.155 +	[self createStatusItem];
   1.156 +}
   1.157 +
   1.158 +
   1.159 +
   1.160 +- (IBAction) quit: (id) sender
   1.161 +{
   1.162 +    // Remove us from the login items if terminates manually...
   1.163 +    [NSApp setAutoLaunchOnLogin: NO];
   1.164 +    [NSApp terminate: sender];
   1.165 +}
   1.166 +
   1.167 +
   1.168 +
   1.169 +- (void) awakeFromNib
   1.170 +{
   1.171 +	[self createDefaultConfig];
   1.172 +	[self initialiseAnim];
   1.173 +}
   1.174 +
   1.175 +- (void) initialiseAnim
   1.176 +{
   1.177 +	NSAnimationProgress progMarks[] = {
   1.178 +		1.0/8.0, 2.0/8.0, 3.0/8.0, 4.0/8.0, 5.0/8.0, 6.0/8.0, 7.0/8.0, 8.0/8.0
   1.179 +	};
   1.180 +	
   1.181 +	int i, count = 8;
   1.182 +	// theAnim is an NSAnimation instance variable
   1.183 +	theAnim = [[NSAnimation alloc] initWithDuration:2.0
   1.184 +									 animationCurve:NSAnimationLinear];
   1.185 +	[theAnim setFrameRate:8.0];
   1.186 +	[theAnim setDelegate:self];
   1.187 +	
   1.188 +	for (i=0; i<count; i++)
   1.189 +		[theAnim addProgressMark:progMarks[i]];
   1.190 +	
   1.191 +	[theAnim setAnimationBlockingMode:  NSAnimationNonblocking];
   1.192 +}
   1.193 +
   1.194 +-(void) updateMenu 
   1.195 +{	
   1.196 +    [theItem setHighlightMode:YES];
   1.197 +    [theItem setMenu:nil];
   1.198 +	[myVPNMenu dealloc]; myVPNMenu = nil;
   1.199 +	[[myVPNConnectionDictionary allValues] makeObjectsPerformSelector:@selector(disconnect:) withObject:self];
   1.200 +	[myVPNConnectionDictionary removeAllObjects];
   1.201 +	
   1.202 +	myVPNMenu = [[NSMenu alloc] init];
   1.203 +    [myVPNMenu setDelegate:self];
   1.204 +    
   1.205 +	[theItem setMenu: myVPNMenu];
   1.206 +	
   1.207 +	statusMenuItem = [[NSMenuItem alloc] init];
   1.208 +	[myVPNMenu addItem:statusMenuItem];
   1.209 +	[myVPNMenu addItem:[NSMenuItem separatorItem]];
   1.210 +
   1.211 +	[myConfigArray release];
   1.212 +    myConfigArray = [[[self getConfigs] sortedArrayUsingSelector:@selector(compare:)] retain];
   1.213 +    [myConfigModDatesArray release];
   1.214 +    myConfigModDatesArray = [[self getModDates:myConfigArray] retain];
   1.215 +    
   1.216 +	NSEnumerator *m = [myConfigArray objectEnumerator];
   1.217 +	NSString *configString;
   1.218 +    int i = 2; // we start at MenuItem #2
   1.219 +	
   1.220 +    while (configString = [m nextObject]) 
   1.221 +    {
   1.222 +		NSMenuItem *connectionItem = [[[NSMenuItem alloc] init] autorelease];
   1.223 +		
   1.224 +        // configure connection object:
   1.225 +		VPNConnection* myConnection = [[VPNConnection alloc] initWithConfig: configString]; // initialize VPN Connection with config	
   1.226 +		[myConnection setState:@"EXITING"];
   1.227 +		[myConnection setDelegate:self];
   1.228 +        
   1.229 +        // handle autoconnection:
   1.230 +		NSString *autoConnectKey = [[myConnection configName] stringByAppendingString: @"autoConnect"];
   1.231 +		if([[NSUserDefaults standardUserDefaults] boolForKey:autoConnectKey]) 
   1.232 +        {
   1.233 +			if(![myConnection isConnected]) [myConnection connect:self];
   1.234 +        }
   1.235 +        
   1.236 +		[myVPNConnectionDictionary setObject: myConnection forKey:configString];
   1.237 +		
   1.238 +        // Note: The item's title will be set on demand in -validateMenuItem
   1.239 +		[connectionItem setTarget:myConnection]; 
   1.240 +		[connectionItem setAction:@selector(toggle:)];
   1.241 +		
   1.242 +		[myVPNMenu insertItem:connectionItem atIndex:i];
   1.243 +		i++;
   1.244 +	}
   1.245 +	
   1.246 +	[myVPNMenu addItem: [NSMenuItem separatorItem]];
   1.247 +	[myVPNMenu addItem: detailsItem];
   1.248 +	[myVPNMenu addItem: quitItem];
   1.249 +    
   1.250 +    // Localize all menu items:
   1.251 +    NSMenuItem *item;
   1.252 +    NSEnumerator *e = [[myVPNMenu itemArray] objectEnumerator];
   1.253 +    
   1.254 +    while (item = [e nextObject]) 
   1.255 +    {
   1.256 +        [item setTitle:local([item title])];
   1.257 +    }
   1.258 +}
   1.259 +
   1.260 +- (void)activateStatusMenu
   1.261 +{
   1.262 +	//[theItem retain];
   1.263 +    [self updateUI];
   1.264 +    
   1.265 +	// If any config files were changed/added/deleted, update the menu
   1.266 +    // We don't do it UNLESS files were changed/added/deleted because all connections are reset when the menu is updated.
   1.267 +    // activateStatusMenu is called whenever anything changes in the config directory, even the file-accessed date,
   1.268 +    // so a backup of the directory, for example, would cause disconnects if we always updated the menu.
   1.269 +    NSArray * curConfigsArray = [[self getConfigs] sortedArrayUsingSelector:@selector(compare:)];
   1.270 +    NSArray * curModDatesArray = [self getModDates:curConfigsArray];
   1.271 +    
   1.272 +    if ( ! (   [myConfigArray isEqualToArray:curConfigsArray]
   1.273 +            && [myConfigModDatesArray isEqualToArray:curModDatesArray]  )  ) {
   1.274 +        NSLog(@"One or more configuration files were changed, added, or deleted. All connections will be closed.\n");
   1.275 +        [self updateMenu];
   1.276 +    }
   1.277 +}
   1.278 +
   1.279 +- (void)connectionStateDidChange:(id)connection
   1.280 +{
   1.281 +	[self updateTabLabels];
   1.282 +    if (connection == [self selectedConnection]) 
   1.283 +	{
   1.284 +		[self validateLogButtons];
   1.285 +	}	
   1.286 +}
   1.287 +
   1.288 +-(NSArray *)getConfigs {
   1.289 +    int i = 0;  	
   1.290 +    NSMutableArray *array = [[[NSMutableArray alloc] init] autorelease];
   1.291 +    NSString *file;
   1.292 +    NSString *confDir = [NSHomeDirectory() stringByAppendingPathComponent: @"/Library/openvpn"];
   1.293 +    NSDirectoryEnumerator *dirEnum = [[NSFileManager defaultManager] enumeratorAtPath: confDir];
   1.294 +    while (file = [dirEnum nextObject]) {
   1.295 +        if ([[file pathExtension] isEqualToString: @"conf"] || [[file pathExtension] isEqualToString: @"ovpn"]) {
   1.296 +			[array insertObject:file atIndex:i];
   1.297 +			//if(NSDebugEnabled) NSLog(@"Object: %@ atIndex: %d\n",file,i);
   1.298 +			i++;
   1.299 +        }
   1.300 +    }
   1.301 +    return array;
   1.302 +}
   1.303 +
   1.304 +// Returns an array of modification date strings
   1.305 +// Each entry in the array is the modification date of the file in the corresponding entry in fileArray
   1.306 +-(NSArray *)getModDates:(NSArray *)fileArray {
   1.307 +    int i;
   1.308 +    NSMutableArray *array = [[[NSMutableArray alloc] init] autorelease];
   1.309 +    NSString *file;
   1.310 +    NSString *cfgDirSlash = [NSHomeDirectory() stringByAppendingString: @"/Library/openvpn/"];
   1.311 +    NSString *filePath;
   1.312 +    NSDate *modDate;
   1.313 +    NSString *modDateS;
   1.314 +	NSFileManager *fileManager = [NSFileManager defaultManager];
   1.315 +    for (i=0; i<[fileArray count]; i++) {
   1.316 +		file = [fileArray objectAtIndex:i];
   1.317 +        filePath = [cfgDirSlash stringByAppendingString:file];
   1.318 +        modDate = [[fileManager fileAttributesAtPath:filePath traverseLink:YES] fileModificationDate];
   1.319 +        if (modDate == nil) {
   1.320 +            modDateS = @"";
   1.321 +        } else if (   (modDateS = [modDate description]) == nil  )  {
   1.322 +            modDateS = @"";
   1.323 +        }
   1.324 +        [array insertObject:modDateS atIndex:i];
   1.325 +    }
   1.326 +    return array;
   1.327 +}
   1.328 +
   1.329 +- (IBAction)validateLogButtons
   1.330 +{
   1.331 +    //NSLog(@"validating log buttons");
   1.332 +    VPNConnection* connection = [self selectedConnection];
   1.333 +    [connectButton setEnabled:[connection isDisconnected]];
   1.334 +    [disconnectButton setEnabled:(![connection isDisconnected])];
   1.335 +	[[NSUserDefaults standardUserDefaults] synchronize];
   1.336 +	NSString *autoConnectKey = [[connection configName] stringByAppendingString:@"autoConnect"];
   1.337 +	if([[NSUserDefaults standardUserDefaults] boolForKey:autoConnectKey]) {
   1.338 +		[autoLaunchCheckbox setState:NSOnState];
   1.339 +	} else {
   1.340 +		[autoLaunchCheckbox setState:NSOffState];
   1.341 +	}
   1.342 +	
   1.343 +	BOOL lol = useDNSStatus(connection);
   1.344 +	if(lol) {
   1.345 +		[useNameserverCheckbox setState:NSOnState];
   1.346 +	} else {
   1.347 +		[useNameserverCheckbox setState:NSOffState];
   1.348 +	}
   1.349 +}
   1.350 +
   1.351 +-(void)updateTabLabels
   1.352 +{
   1.353 +	NSArray *keyArray = [[myVPNConnectionDictionary allKeys] sortedArrayUsingSelector: @selector(compare:)];
   1.354 +	NSArray *myConnectionArray = [myVPNConnectionDictionary objectsForKeys:keyArray notFoundMarker:[NSNull null]];
   1.355 +	NSEnumerator *connectionEnumerator = [myConnectionArray objectEnumerator];
   1.356 +	VPNConnection *myConnection;
   1.357 +
   1.358 +    // Get preferences for showing duration times
   1.359 +    BOOL showAllDurations = FALSE;
   1.360 +    BOOL showConnectedDurations = TRUE;
   1.361 +    id tmp = [[NSUserDefaults standardUserDefaults] objectForKey:@"showAllDurations"];
   1.362 +    if(tmp != nil) {
   1.363 +        showAllDurations = [[NSUserDefaults standardUserDefaults] boolForKey:@"showAllDurations"];
   1.364 +    }
   1.365 +    tmp = [[NSUserDefaults standardUserDefaults] objectForKey:@"showConnectedDurations"];
   1.366 +    if(tmp != nil) {
   1.367 +        showConnectedDurations = [[NSUserDefaults standardUserDefaults] boolForKey:@"showConnectedDurations"];
   1.368 +    }
   1.369 +        
   1.370 +	int i = 0;
   1.371 +	while(myConnection = [connectionEnumerator nextObject]) {
   1.372 +		//NSLog(@"configName: %@\nconnectionState: %@\n",[myConnection configName],[myConnection state]);
   1.373 +        NSString * cState = [myConnection state];
   1.374 +        NSString * cTimeS = @"";
   1.375 +
   1.376 +        // Get connection duration if preferences say to 
   1.377 +        if (    showAllDurations ||  (  showConnectedDurations && [cState isEqualToString: @"CONNECTED"]  )    ) {
   1.378 +            NSDate * csd = [myConnection connectedSinceDate];
   1.379 +            NSTimeInterval ti = [csd timeIntervalSinceNow];
   1.380 +            long cTimeL = (long) round(-ti);
   1.381 +            if ( cTimeL >= 0 ) {
   1.382 +                if ( cTimeL < 3600 ) {
   1.383 +                    cTimeS = [NSString stringWithFormat:@" %li:%02li", cTimeL/60, cTimeL%60];
   1.384 +                } else {
   1.385 +                    cTimeS = [NSString stringWithFormat:@" %li:%02li:%02li", cTimeL/3600, (cTimeL/60) % 60, cTimeL%60];
   1.386 +                }
   1.387 +            }
   1.388 +        }
   1.389 +		NSString *label = [NSString stringWithFormat:@"%@ (%@%@)",[myConnection configName],local(cState), cTimeS];
   1.390 +		[[tabView tabViewItemAtIndex:i] setLabel:label];
   1.391 +		i++;
   1.392 +	}
   1.393 +}
   1.394 +
   1.395 +
   1.396 +- (void) updateUI
   1.397 +{
   1.398 +	unsigned connectionNumber = [connectionArray count];
   1.399 +	NSString *myState;
   1.400 +	if(connectionNumber == 1) {
   1.401 +		myState = local(@"OpenVPN: 1 connection active.");
   1.402 +	} else {
   1.403 +		myState = [NSString stringWithFormat:local(@"OpenVPN: %d connections active."),connectionNumber];
   1.404 +	}
   1.405 +	
   1.406 +    [statusMenuItem setTitle: myState];
   1.407 +    [theItem setToolTip: myState];
   1.408 +	
   1.409 +	if( (![lastState isEqualToString:@"EXITING"]) && (![lastState isEqualToString:@"CONNECTED"]) ) { 
   1.410 +		// override while in transitional state
   1.411 +		// Any other state shows "transitional" image:
   1.412 +		//[theItem setImage: transitionalImage];
   1.413 +		if (![theAnim isAnimating])
   1.414 +		{
   1.415 +			//NSLog(@"Starting Animation");
   1.416 +			[theAnim startAnimation];
   1.417 +		}
   1.418 +	} else
   1.419 +	{
   1.420 +		if ([theAnim isAnimating])
   1.421 +		{
   1.422 +			[theAnim stopAnimation];
   1.423 +		}
   1.424 +	}
   1.425 +	if (connectionNumber > 0 ) {
   1.426 +		[theItem setImage: connectedImage];
   1.427 +	} else {
   1.428 +		[theItem setImage: mainImage];
   1.429 +	} 
   1.430 +}
   1.431 +
   1.432 +- (void)animationDidEnd:(NSAnimation*)animation
   1.433 +{
   1.434 +	if ((![lastState isEqualToString:@"EXITING"]) && (![lastState isEqualToString:@"CONNECTED"]))
   1.435 +	{
   1.436 +		// NSLog(@"Starting Animation (2)");
   1.437 +		[theAnim startAnimation];
   1.438 +	}
   1.439 +	if ([connectionArray count] > 0 ) {
   1.440 +        [theItem setImage: connectedImage];
   1.441 +    } else {
   1.442 +        [theItem setImage: mainImage];
   1.443 +    }
   1.444 +}
   1.445 +
   1.446 +- (void)animation:(NSAnimation *)animation
   1.447 +            didReachProgressMark:(NSAnimationProgress)progress
   1.448 +{
   1.449 +	if (animation == theAnim)
   1.450 +	{
   1.451 +		// NSLog(@"progress is %f %i", progress, lround(progress * 8));
   1.452 +		// Do an effect appropriate to progress mark.
   1.453 +		switch(lround(progress * 8))
   1.454 +		{
   1.455 +			case 1:
   1.456 +				[theItem performSelectorOnMainThread:@selector(setImage:) withObject:mainImage waitUntilDone:YES];
   1.457 +				break;
   1.458 +				
   1.459 +			case 2:
   1.460 +				[theItem performSelectorOnMainThread:@selector(setImage:) withObject:transitionalImage1 waitUntilDone:YES];
   1.461 +				break;
   1.462 +				
   1.463 +			case 3:
   1.464 +				[theItem performSelectorOnMainThread:@selector(setImage:) withObject:transitionalImage2 waitUntilDone:YES];
   1.465 +				break;
   1.466 +				
   1.467 +			case 4:
   1.468 +				[theItem performSelectorOnMainThread:@selector(setImage:) withObject:transitionalImage3 waitUntilDone:YES];
   1.469 +				break;
   1.470 +				
   1.471 +			case 5:
   1.472 +				[theItem performSelectorOnMainThread:@selector(setImage:) withObject:connectedImage waitUntilDone:YES];
   1.473 +				break;
   1.474 +				
   1.475 +			case 6:
   1.476 +				[theItem performSelectorOnMainThread:@selector(setImage:) withObject:transitionalImage3 waitUntilDone:YES];
   1.477 +				break;
   1.478 +				
   1.479 +			case 7:
   1.480 +				[theItem performSelectorOnMainThread:@selector(setImage:) withObject:transitionalImage2 waitUntilDone:YES];
   1.481 +				break;
   1.482 +				
   1.483 +			case 8:
   1.484 +				[theItem performSelectorOnMainThread:@selector(setImage:) withObject:transitionalImage1 waitUntilDone:YES];
   1.485 +				break;
   1.486 +				
   1.487 +			default:
   1.488 +				NSLog(@"Unknown progress mark %f selected by Tunnelblick animation", progress);
   1.489 +		}
   1.490 +	}
   1.491 +}
   1.492 +
   1.493 +- (void) tabView: (NSTabView*) inTabView willSelectTabViewItem: (NSTabViewItem*) tabViewItem
   1.494 +{
   1.495 +    NSView* view = [[inTabView selectedTabViewItem] view];
   1.496 +    [tabViewItem setView: view];
   1.497 +    [[[self selectedLogView] textStorage] setDelegate: nil];
   1.498 +}
   1.499 +
   1.500 +- (void) tabView: (NSTabView*) inTabView didSelectTabViewItem: (NSTabViewItem*) tabViewItem
   1.501 +{
   1.502 +    VPNConnection* newConnection = [self selectedConnection];
   1.503 +    NSTextView* logView = [self selectedLogView];
   1.504 +    [[logView layoutManager] replaceTextStorage: [newConnection logStorage]];
   1.505 +    //[logView setSelectedRange: NSMakeRange([[logView textStorage] length],[[logView textStorage] length])];
   1.506 +	[logView scrollRangeToVisible: NSMakeRange([[logView string] length]-1, 0)];
   1.507 +	
   1.508 +    [[logView textStorage] setDelegate: self];
   1.509 +	
   1.510 +    [self validateLogButtons];
   1.511 +}
   1.512 +- (void) textStorageDidProcessEditing: (NSNotification*) aNotification
   1.513 +{
   1.514 +    NSNotification *notification = [NSNotification notificationWithName: @"LogDidChange" 
   1.515 +                                                                 object: [self selectedLogView]];
   1.516 +    [[NSNotificationQueue defaultQueue] enqueueNotification: notification 
   1.517 +                                               postingStyle: NSPostWhenIdle
   1.518 +                                               coalesceMask: NSNotificationCoalescingOnName | NSNotificationCoalescingOnSender 
   1.519 +                                                   forModes: nil];
   1.520 +}
   1.521 +
   1.522 +- (void) logNeedsScrolling: (NSNotification*) aNotification
   1.523 +{
   1.524 +    NSTextView* textView = [aNotification object];
   1.525 +    [textView scrollRangeToVisible: NSMakeRange([[textView string] length]-1, 0)];
   1.526 +}
   1.527 +
   1.528 +- (NSTextView*) selectedLogView
   1.529 +{
   1.530 +    NSTextView* result = [[[[[tabView selectedTabViewItem] view] subviews] lastObject] documentView];
   1.531 +    return result;
   1.532 +}
   1.533 +
   1.534 +- (IBAction) clearLog: (id) sender
   1.535 +{
   1.536 +	NSString * versionInfo = [NSString stringWithFormat:local(@"Tunnelblick version %@"),[[NSBundle mainBundle] objectForInfoDictionaryKey:@"CFBundleVersion"]];
   1.537 +	NSCalendarDate* date = [NSCalendarDate date];
   1.538 +	NSString *dateText = [NSString stringWithFormat:@"%@ %@\n",[date descriptionWithCalendarFormat:@"%Y-%m-%d %H:%M:%S"],versionInfo];
   1.539 +	[[self selectedLogView] setString: [[[NSString alloc] initWithString: dateText] autorelease]];
   1.540 +}
   1.541 +
   1.542 +- (VPNConnection*) selectedConnection
   1.543 +	/*" Returns the connection associated with the currently selected log tab or nil on error. "*/
   1.544 +{
   1.545 +	if (![tabView selectedTabViewItem]) {
   1.546 +		[tabView selectFirstTabViewItem: nil];
   1.547 +	}
   1.548 +	
   1.549 +    NSString* configPath = [[tabView selectedTabViewItem] identifier];
   1.550 +	VPNConnection* connection = [myVPNConnectionDictionary objectForKey:configPath];
   1.551 +	NSArray *allConnections = [myVPNConnectionDictionary allValues];
   1.552 +	if(connection) return connection;
   1.553 +	else if([allConnections count]) return [allConnections objectAtIndex:0] ; 
   1.554 +	else return nil;
   1.555 +}
   1.556 +
   1.557 +
   1.558 +
   1.559 +
   1.560 +- (IBAction)connect:(id)sender
   1.561 +{
   1.562 +	[[self selectedConnection] connect: sender]; 
   1.563 +}
   1.564 +
   1.565 +- (IBAction)disconnect:(id)sender
   1.566 +{
   1.567 +    [[self selectedConnection] disconnect: sender];      
   1.568 +}
   1.569 +
   1.570 +
   1.571 +- (IBAction) openLogWindow: (id) sender
   1.572 +{
   1.573 +    if (logWindow != nil) {
   1.574 +        [logWindow makeKeyAndOrderFront: self];
   1.575 +        [NSApp activateIgnoringOtherApps:YES];
   1.576 +        return;
   1.577 +    }
   1.578 +    
   1.579 +    [NSBundle loadNibNamed: @"LogWindow" owner: self]; // also sets tabView etc.
   1.580 +
   1.581 +    // Set the window's size and position from preferences (saved when window is closed)
   1.582 +    // But only if the preference's version matches the TB version (since window size could be different in different versions of TB)
   1.583 +    NSString * tbVersion = [[NSBundle mainBundle] objectForInfoDictionaryKey:@"CFBundleVersion"];
   1.584 +    id tmp = [[NSUserDefaults standardUserDefaults] objectForKey:@"detailsWindowFrameVersion"];
   1.585 +    if (tmp != nil) {
   1.586 +        if (  [tbVersion isEqualToString: [[NSUserDefaults standardUserDefaults] stringForKey:@"detailsWindowFrameVersion"]]    ) {
   1.587 +            tmp = [[NSUserDefaults standardUserDefaults] objectForKey:@"detailsWindowFrame"];
   1.588 +            if(tmp != nil) {
   1.589 +                NSString * frame = [[NSUserDefaults standardUserDefaults] stringForKey:@"detailsWindowFrame"];
   1.590 +                [logWindow setFrameFromString:frame];
   1.591 +            }
   1.592 +        }
   1.593 +    }
   1.594 +
   1.595 +	[logWindow setDelegate:self];
   1.596 +	VPNConnection *myConnection = [self selectedConnection];
   1.597 +	NSTextStorage* store = [myConnection logStorage];
   1.598 +	[[[self selectedLogView] layoutManager] replaceTextStorage: store];
   1.599 +	
   1.600 +	NSEnumerator* e = [[[myVPNConnectionDictionary allKeys] sortedArrayUsingSelector: @selector(compare:)] objectEnumerator];
   1.601 +	//id test = [[myVPNConnectionDictionary allKeys] sortedArrayUsingSelector: @selector(compare:)];
   1.602 +	NSTabViewItem* initialItem;
   1.603 +	VPNConnection* connection = [myVPNConnectionDictionary objectForKey: [e nextObject]];
   1.604 +	if (connection) {
   1.605 +		initialItem = [tabView tabViewItemAtIndex: 0];
   1.606 +		[initialItem setIdentifier: [connection configPath]];
   1.607 +		[initialItem setLabel: [connection configName]];
   1.608 +		
   1.609 +		int curTabIndex = 0;
   1.610 +		[tabView selectTabViewItemAtIndex:0];
   1.611 +		BOOL haveOpenConnection = ! [connection isDisconnected];
   1.612 +		while (connection = [myVPNConnectionDictionary objectForKey: [e nextObject]]) {
   1.613 +			NSTabViewItem* newItem = [[NSTabViewItem alloc] init];
   1.614 +			[newItem setIdentifier: [connection configPath]];
   1.615 +			[newItem setLabel: [connection configName]];
   1.616 +			[tabView addTabViewItem: newItem];
   1.617 +			++curTabIndex;
   1.618 +			if (  ( ! haveOpenConnection ) && ( ! [connection isDisconnected] )  ) {
   1.619 +				[tabView selectTabViewItemAtIndex:curTabIndex];
   1.620 +				haveOpenConnection = YES;
   1.621 +			}
   1.622 +		}
   1.623 +	}
   1.624 +	[self tabView:tabView didSelectTabViewItem:initialItem];
   1.625 +	[self validateLogButtons];
   1.626 +	[self updateTabLabels];
   1.627 +    
   1.628 +    // Set up a timer to update the tab labels with connections' duration times
   1.629 +    BOOL showAllDurations = FALSE;
   1.630 +    BOOL showConnectedDurations = TRUE;
   1.631 +    tmp = [[NSUserDefaults standardUserDefaults] objectForKey:@"showAllDurations"];
   1.632 +    if(tmp != nil) {
   1.633 +        showAllDurations = [[NSUserDefaults standardUserDefaults] boolForKey:@"showAllDurations"];
   1.634 +    }
   1.635 +    tmp = [[NSUserDefaults standardUserDefaults] objectForKey:@"showConnectedDurations"];
   1.636 +    if(tmp != nil) {
   1.637 +        showConnectedDurations = [[NSUserDefaults standardUserDefaults] boolForKey:@"showConnectedDurations"];
   1.638 +    }
   1.639 +    
   1.640 +    if (    (showDurationsTimer == nil)  && (showAllDurations || showConnectedDurations)    ) {
   1.641 +        showDurationsTimer = [[NSTimer scheduledTimerWithTimeInterval:1.0
   1.642 +                                                               target:self
   1.643 +                                                             selector:@selector(updateTabLabels)
   1.644 +                                                             userInfo:nil
   1.645 +                                                              repeats:YES] retain];
   1.646 +    }
   1.647 +	
   1.648 +	// Localize Buttons
   1.649 +	[clearButton setTitle:local([clearButton title])];
   1.650 +	[editButton setTitle:local([editButton title])];
   1.651 +	[connectButton setTitle:local([connectButton title])];
   1.652 +	[disconnectButton setTitle:local([disconnectButton title])];
   1.653 +	[useNameserverCheckbox setTitle:local([useNameserverCheckbox title])];
   1.654 +	[autoLaunchCheckbox setTitle:local([autoLaunchCheckbox title])];
   1.655 +
   1.656 +    [logWindow makeKeyAndOrderFront: self];
   1.657 +    [NSApp activateIgnoringOtherApps:YES];
   1.658 +}
   1.659 +
   1.660 +// Invoked when the Details... window (logWindow) will close
   1.661 +- (void)windowWillClose:(NSNotification *)n
   1.662 +{
   1.663 +    if ( [n object] == logWindow ) {
   1.664 +        // Stop and release the timer used to update the duration displays
   1.665 +        if (showDurationsTimer != nil) {
   1.666 +            [showDurationsTimer invalidate];
   1.667 +            [showDurationsTimer release];
   1.668 +            showDurationsTimer = nil;
   1.669 +        }
   1.670 +
   1.671 +        // Save the window's size and position in the preferences and save the TB version that saved them, BUT ONLY IF anything has changed
   1.672 +        NSString * frame = [logWindow stringWithSavedFrame];
   1.673 +        NSString * tbVersion = [[NSBundle mainBundle] objectForInfoDictionaryKey:@"CFBundleVersion"];
   1.674 +        BOOL saveIt = TRUE;
   1.675 +        id tmp = [[NSUserDefaults standardUserDefaults] objectForKey:@"detailsWindowFrame"];
   1.676 +        if(tmp != nil) {
   1.677 +            tmp = [[NSUserDefaults standardUserDefaults] objectForKey:@"detailsWindowFrameVersion"];
   1.678 +            if (tmp != nil) {
   1.679 +                if (  [tbVersion isEqualToString: [[NSUserDefaults standardUserDefaults] stringForKey:@"detailsWindowFrameVersion"]]    ) {
   1.680 +                    if (   [frame isEqualToString: [[NSUserDefaults standardUserDefaults] stringForKey:@"detailsWindowFrame"]]    ) {
   1.681 +                        saveIt = FALSE;
   1.682 +                    }
   1.683 +                }
   1.684 +            }
   1.685 +        }
   1.686 +
   1.687 +        if (saveIt) {
   1.688 +            [[NSUserDefaults standardUserDefaults] setObject: frame forKey: @"detailsWindowFrame"];
   1.689 +            [[NSUserDefaults standardUserDefaults] setObject: [[NSBundle mainBundle] objectForInfoDictionaryKey:@"CFBundleVersion"]
   1.690 +                                                      forKey: @"detailsWindowFrameVersion"];
   1.691 +            [[NSUserDefaults standardUserDefaults] synchronize];
   1.692 +        }
   1.693 +    }
   1.694 +}
   1.695 +
   1.696 +- (void) dealloc
   1.697 +{
   1.698 +    [lastState release];
   1.699 +    [theItem release];
   1.700 +    [myConfigArray release];
   1.701 +    
   1.702 +#warning todo: release non-IB ivars here!
   1.703 +    [statusMenuItem release];
   1.704 +    [myVPNMenu release];
   1.705 +    [userDefaults release];
   1.706 +    [appDefaults release];
   1.707 +    [theItem release]; 
   1.708 +    
   1.709 +    [mainImage release];
   1.710 +    [connectedImage release];
   1.711 +    [errorImage release];
   1.712 +    [transitionalImage release];
   1.713 +    [connectionArray release];
   1.714 +    
   1.715 +    
   1.716 +    [super dealloc];
   1.717 +}
   1.718 +
   1.719 +
   1.720 +-(void)killAllConnections
   1.721 +{
   1.722 +	id connection;
   1.723 +    NSEnumerator* e = [connectionArray objectEnumerator];
   1.724 +    
   1.725 +    while (connection = [e nextObject]) {
   1.726 +        [connection disconnect:self];
   1.727 +		if(NSDebugEnabled) NSLog(@"Killing connection.\n");
   1.728 +    }
   1.729 +}
   1.730 +
   1.731 +-(void)killAllOpenVPN 
   1.732 +{
   1.733 +	NSString* path = [[NSBundle mainBundle] pathForResource: @"openvpnstart" 
   1.734 +													 ofType: nil];
   1.735 +	NSTask* task = [[[NSTask alloc] init] autorelease];
   1.736 +	[task setLaunchPath: path]; 
   1.737 +	
   1.738 +	NSArray *arguments = [NSArray arrayWithObjects:@"killall", nil];
   1.739 +	[task setArguments:arguments];
   1.740 +	[task launch];
   1.741 +	[task waitUntilExit];
   1.742 +}
   1.743 +
   1.744 +-(void)resetActiveConnections {
   1.745 +	VPNConnection *connection;
   1.746 +	NSEnumerator* e = [connectionArray objectEnumerator];
   1.747 +	
   1.748 +	while (connection = [e nextObject]) {
   1.749 +		if (NSDebugEnabled) NSLog(@"Connection %@ is connected for %f seconds\n",[connection configName],[[connection connectedSinceDate] timeIntervalSinceNow]);
   1.750 +		if ([[connection connectedSinceDate] timeIntervalSinceNow] < -5) {
   1.751 +			if (NSDebugEnabled) NSLog(@"Resetting connection: %@\n",[connection configName]);
   1.752 +			[connection disconnect:self];
   1.753 +			[connection connect:self];
   1.754 +		}
   1.755 +		else {
   1.756 +			if (NSDebugEnabled) NSLog(@"Not Resetting connection: %@\n, waiting...",[connection configName]);
   1.757 +		}
   1.758 +	}
   1.759 +}
   1.760 +
   1.761 +-(void)createDefaultConfig 
   1.762 +{
   1.763 +	NSFileManager *fileManager = [NSFileManager defaultManager];
   1.764 +    NSString *directoryPath = [NSHomeDirectory() stringByAppendingPathComponent:@"Library/openvpn"];
   1.765 +	NSString *confResource = [[NSBundle mainBundle] pathForResource: @"openvpn" 
   1.766 +															 ofType: @"conf"];
   1.767 +	
   1.768 +	if([[self getConfigs] count] == 0) { // if there are no config files, create a default one
   1.769 +		[NSApp activateIgnoringOtherApps:YES];
   1.770 +        if(NSRunCriticalAlertPanel(local(@"Welcome to OpenVPN on Mac OS X: Please put your config file (e.g. openvpn.conf) to '~/Library/openvpn/'."), local(@"You can also continue and Tunnelblick will create an example config at the right place that you can customize or replace."),local(@"Quit"),local(@"Continue"),nil) == NSAlertDefaultReturn) {
   1.771 +            exit (1);
   1.772 +        }
   1.773 +        else {
   1.774 +			[fileManager createDirectoryAtPath:directoryPath attributes:nil];
   1.775 +			[fileManager copyPath:confResource toPath:[directoryPath stringByAppendingPathComponent:@"/openvpn.conf"] handler:nil];
   1.776 +            [self editConfig:self];
   1.777 +        }
   1.778 +		
   1.779 +		
   1.780 +	}
   1.781 +}
   1.782 +
   1.783 +-(IBAction)editConfig:(id)sender
   1.784 +{
   1.785 +	VPNConnection *connection = [self selectedConnection];
   1.786 +    NSString *directoryPath = [NSHomeDirectory() stringByAppendingPathComponent:@"Library/openvpn"];
   1.787 +	NSString *configPath = [connection configPath];
   1.788 +    if(configPath == nil) configPath = @"/openvpn.conf";
   1.789 +	
   1.790 +	//	NSString *helper = @"/usr/sbin/chown";
   1.791 +	//	NSString *userString = [NSString stringWithFormat:@"%d",getuid()];
   1.792 +	//	NSArray *arguments = [NSArray arrayWithObjects:userString,configPath,nil];
   1.793 +	//	AuthorizationRef authRef = [NSApplication getAuthorizationRef];
   1.794 +	//	[NSApplication executeAuthorized:helper withArguments:arguments withAuthorizationRef:authRef];
   1.795 +	//	AuthorizationFree(authRef,kAuthorizationFlagDefaults);
   1.796 +	
   1.797 +    [[NSWorkspace sharedWorkspace] openFile:[directoryPath stringByAppendingPathComponent:configPath] withApplication:@"TextEdit"];
   1.798 +}
   1.799 +
   1.800 +
   1.801 +- (void) networkConfigurationDidChange
   1.802 +{
   1.803 +	if (NSDebugEnabled) NSLog(@"Got networkConfigurationDidChange notification!!");
   1.804 +	[self resetActiveConnections];
   1.805 +}
   1.806 +
   1.807 +- (void) applicationWillTerminate: (NSNotification*) notification 
   1.808 +{	
   1.809 +    if (NSDebugEnabled) NSLog(@"App will terminate...\n");
   1.810 +	[self cleanup];
   1.811 +}
   1.812 +
   1.813 +-(void)cleanup 
   1.814 +{
   1.815 +	[NSApp callDelegateOnNetworkChange: NO];
   1.816 +	[self killAllConnections];
   1.817 +	[self killAllOpenVPN];
   1.818 +	[[NSStatusBar systemStatusBar] removeStatusItem:theItem];
   1.819 +}
   1.820 +
   1.821 +-(void)saveUseNameserverCheckboxState:(BOOL)inBool
   1.822 +{
   1.823 +	VPNConnection* connection = [self selectedConnection];
   1.824 +	if(connection != nil) {
   1.825 +		NSString* key = [[connection configName] stringByAppendingString: @"useDNS"];
   1.826 +		[[NSUserDefaults standardUserDefaults] setObject: [NSNumber numberWithBool: inBool] forKey: key];
   1.827 +		[[NSUserDefaults standardUserDefaults] synchronize];
   1.828 +	}
   1.829 +	
   1.830 +}
   1.831 +-(void)saveAutoLaunchCheckboxState:(BOOL)inBool
   1.832 +{
   1.833 +	VPNConnection* connection = [self selectedConnection];
   1.834 +	if(connection != nil) {
   1.835 +		NSString* autoConnectKey = [[connection configName] stringByAppendingString: @"autoConnect"];
   1.836 +		[[NSUserDefaults standardUserDefaults] setObject: [NSNumber numberWithBool: inBool] forKey: autoConnectKey];
   1.837 +		[[NSUserDefaults standardUserDefaults] synchronize];
   1.838 +	}
   1.839 +	
   1.840 +}
   1.841 +
   1.842 +-(BOOL)getCurrentAutoLaunchSetting
   1.843 +{
   1.844 +	VPNConnection *connection = [self selectedConnection];
   1.845 +	NSString *autoConnectKey = [[connection configName] stringByAppendingString:@"autoConnect"];
   1.846 +	return [[NSUserDefaults standardUserDefaults] boolForKey:autoConnectKey];
   1.847 +}
   1.848 +
   1.849 +- (void) setState: (NSString*) newState
   1.850 +	// Be sure to call this in main thread only
   1.851 +{
   1.852 +    [newState retain];
   1.853 +    [lastState release];
   1.854 +    lastState = newState;
   1.855 +    //[self updateUI];
   1.856 +	[self performSelectorOnMainThread:@selector(updateUI) withObject:nil waitUntilDone:NO];
   1.857 +}
   1.858 +
   1.859 +-(void)addConnection:(id)sender 
   1.860 +{
   1.861 +	if(sender != nil) {
   1.862 +		[connectionArray removeObject:sender];
   1.863 +		[connectionArray addObject:sender];
   1.864 +	}
   1.865 +}
   1.866 +
   1.867 +-(void)removeConnection:(id)sender
   1.868 +{
   1.869 +	if(sender != nil) [connectionArray removeObject:sender];	
   1.870 +}
   1.871 +
   1.872 +static void signal_handler(int signalNumber)
   1.873 +{
   1.874 +    printf("signal %d caught!\n",signalNumber);
   1.875 +    
   1.876 +    if (signalNumber == SIGHUP) {
   1.877 +        printf("SIGHUP received. Restarting active connections...\n");
   1.878 +        [[NSApp delegate] resetActiveConnections];
   1.879 +    } else  {
   1.880 +        printf("Received fatal signal. Cleaning up...\n");
   1.881 +        [[NSApp delegate] cleanup];
   1.882 +        exit(0);	
   1.883 +    }
   1.884 +}
   1.885 +
   1.886 +
   1.887 +- (void) installSignalHandler
   1.888 +{
   1.889 +    struct sigaction action;
   1.890 +    
   1.891 +    action.sa_handler = signal_handler;
   1.892 +    sigemptyset(&action.sa_mask);
   1.893 +    action.sa_flags = 0;
   1.894 +    
   1.895 +    if (sigaction(SIGHUP, &action, NULL) || 
   1.896 +        sigaction(SIGQUIT, &action, NULL) || 
   1.897 +        sigaction(SIGTERM, &action, NULL) ||
   1.898 +        sigaction(SIGBUS, &action, NULL) ||
   1.899 +        sigaction(SIGSEGV, &action, NULL) ||
   1.900 +        sigaction(SIGPIPE, &action, NULL)) {
   1.901 +        NSLog(@"Warning: setting signal handler failed: %s", strerror(errno));
   1.902 +    }	
   1.903 +}
   1.904 +- (void) applicationDidFinishLaunching: (NSNotification *)notification
   1.905 +{
   1.906 +	[NSApp callDelegateOnNetworkChange: NO];
   1.907 +    [self installSignalHandler];    
   1.908 +    [NSApp setAutoLaunchOnLogin: YES];
   1.909 +    [self activateStatusMenu];
   1.910 +	if(needsRepair()){
   1.911 +		if ([self repairPermissions] != TRUE) {
   1.912 +			[NSApp terminate:self];
   1.913 +		}
   1.914 +	} 
   1.915 +
   1.916 +	[updater checkForUpdatesInBackground];
   1.917 +}
   1.918 +
   1.919 +-(void) dmgCheck
   1.920 +{
   1.921 +	NSString *path = [[NSBundle mainBundle] bundlePath];
   1.922 +	if([path hasPrefix:@"/Volumes/Tunnelblick"]) {
   1.923 +		NSPanel *panel = NSGetAlertPanel(local(@"You're trying to launch Tunnelblick from the disk image"),local(@"Please copy Tunnelblick.app to your Harddisk before launching it."),local(@"Cancel"),nil,nil);
   1.924 +		[panel setLevel:NSStatusWindowLevel];
   1.925 +		[panel makeKeyAndOrderFront:nil];
   1.926 +		[NSApp runModalForWindow:panel];
   1.927 +		exit(2);
   1.928 +	}
   1.929 +}
   1.930 +
   1.931 +-(void)moveAllWindowsToForeground
   1.932 +{
   1.933 +	NSArray *windows = [NSApp windows];
   1.934 +	NSEnumerator *e = [windows objectEnumerator];
   1.935 +	NSWindow *window = nil;
   1.936 +	while(window = [e nextObject]) {
   1.937 +		[window setLevel:NSStatusWindowLevel];
   1.938 +	}
   1.939 +}
   1.940 +
   1.941 +-(void) fileSystemHasChanged: (NSNotification*) n
   1.942 +{
   1.943 +	if(NSDebugEnabled) NSLog(@"FileSystem has changed.");
   1.944 +	[self performSelectorOnMainThread: @selector(activateStatusMenu) withObject: nil waitUntilDone: YES];
   1.945 +}
   1.946 +-(void) kqueue: (UKKQueue*) kq receivedNotification: (NSString*) nm forFile: (NSString*) fpath {
   1.947 +	
   1.948 +	[self fileSystemHasChanged: nil];
   1.949 +}
   1.950 +
   1.951 +-(BOOL)repairPermissions
   1.952 +{
   1.953 +	NSBundle *thisBundle = [NSBundle mainBundle];
   1.954 +	NSString *installer = [thisBundle pathForResource:@"installer" ofType:nil];
   1.955 +	
   1.956 +	AuthorizationRef authRef= [NSApplication getAuthorizationRef];
   1.957 +	
   1.958 +	if(authRef == nil)
   1.959 +		return FALSE;
   1.960 +	
   1.961 +	while(needsRepair()) {
   1.962 +		NSLog(@"Repairing Application...\n");
   1.963 +		[NSApplication executeAuthorized:installer withArguments:nil withAuthorizationRef:authRef];
   1.964 +		sleep(1);
   1.965 +	}
   1.966 +	AuthorizationFree(authRef, kAuthorizationFlagDefaults);
   1.967 +	return TRUE;
   1.968 +}
   1.969 +
   1.970 +
   1.971 +
   1.972 +
   1.973 +BOOL needsRepair() 
   1.974 +{
   1.975 +	NSBundle *thisBundle = [NSBundle mainBundle];
   1.976 +	NSString *helperPath = [thisBundle pathForResource:@"openvpnstart" ofType:nil];
   1.977 +	NSString *tunPath = [thisBundle pathForResource:@"tun.kext" ofType:nil];
   1.978 +	NSString *tapPath = [thisBundle pathForResource:@"tap.kext" ofType:nil];
   1.979 +	
   1.980 +	NSString *tunExecutable = [tunPath stringByAppendingPathComponent:@"/Contents/MacOS/tun"];
   1.981 +	NSString *tapExecutable = [tapPath stringByAppendingPathComponent:@"/Contents/MacOS/tap"];
   1.982 +	NSString *openvpnPath = [thisBundle pathForResource:@"openvpn" ofType:nil];
   1.983 +	
   1.984 +	
   1.985 +	// check setuid helper
   1.986 +	const char *path = [helperPath UTF8String];
   1.987 +    struct stat sb;
   1.988 +	if(stat(path,&sb)) runUnrecoverableErrorPanel();
   1.989 +	
   1.990 +	if (!(			  (sb.st_mode & S_ISUID) // set uid bit is set
   1.991 +					  && (sb.st_mode & S_IXUSR) // owner may execute it
   1.992 +					  && (sb.st_uid == 0) // is owned by root
   1.993 +					  )) {
   1.994 +		NSLog(@"openvpnstart helper has missing set uid bit");
   1.995 +		return YES;		
   1.996 +	}
   1.997 +	
   1.998 +	// check files which should be only accessible by root
   1.999 +	NSArray *inaccessibleObjects = [NSArray arrayWithObjects:tunExecutable,tapExecutable,openvpnPath,nil];
  1.1000 +	NSEnumerator *e = [inaccessibleObjects objectEnumerator];
  1.1001 +	NSString *currentPath;
  1.1002 +	NSFileManager *fileManager = [NSFileManager defaultManager];
  1.1003 +	while(currentPath = [e nextObject]) {
  1.1004 +		NSDictionary *fileAttributes = [fileManager fileAttributesAtPath:currentPath traverseLink:YES];
  1.1005 +		unsigned long perms = [fileAttributes filePosixPermissions];
  1.1006 +		NSString *octalString = [NSString stringWithFormat:@"%o",perms];
  1.1007 +		NSNumber *fileOwner = [fileAttributes fileOwnerAccountID];
  1.1008 +		
  1.1009 +		if ( (![octalString isEqualToString:@"744"])  || (![fileOwner isEqualToNumber:[NSNumber numberWithInt:0]])) {
  1.1010 +			NSLog(@"File %@ has permissions: %@, is owned by %@ and needs repair...\n",currentPath,octalString,fileOwner);
  1.1011 +			return YES;
  1.1012 +		}
  1.1013 +	}
  1.1014 +	
  1.1015 +	// check tun and tap driver packages
  1.1016 +	NSArray *filesToCheck = [NSArray arrayWithObjects:tunPath,tapPath,nil];
  1.1017 +	NSEnumerator *enumerator = [filesToCheck objectEnumerator];
  1.1018 +	NSString *file;
  1.1019 +	while(file = [enumerator nextObject]) {
  1.1020 +		NSDictionary *fileAttributes = [fileManager fileAttributesAtPath:file traverseLink:YES];
  1.1021 +		unsigned long perms = [fileAttributes filePosixPermissions];
  1.1022 +		NSString *octalString = [NSString stringWithFormat:@"%o",perms];
  1.1023 +		if ( (![octalString isEqualToString:@"755"])  ) {
  1.1024 +			NSLog(@"File %@ has permissions: %@ and needs repair...\n",currentPath,octalString);
  1.1025 +			return YES;
  1.1026 +		}
  1.1027 +	}
  1.1028 +	return NO;
  1.1029 +}
  1.1030 +
  1.1031 +-(void)willGoToSleep
  1.1032 +{
  1.1033 +	if(NSDebugEnabled) NSLog(@"Computer will go to sleep...\n");
  1.1034 +	connectionsToRestore = [connectionArray mutableCopy];
  1.1035 +	[self killAllConnections];
  1.1036 +}
  1.1037 +-(void)wokeUpFromSleep 
  1.1038 +{
  1.1039 +	if(NSDebugEnabled) NSLog(@"Computer just woke up from sleep...\n");
  1.1040 +	
  1.1041 +	NSEnumerator *e = [connectionsToRestore objectEnumerator];
  1.1042 +	VPNConnection *connection;
  1.1043 +	while(connection = [e nextObject]) {
  1.1044 +		if(NSDebugEnabled) NSLog(@"Restoring Connection %@",[connection configName]);
  1.1045 +		[connection connect:self];
  1.1046 +	}
  1.1047 +}
  1.1048 +int runUnrecoverableErrorPanel(void) 
  1.1049 +{
  1.1050 +	NSPanel *panel = NSGetAlertPanel(local(@"Tunnelblick Error"),local(@"It seems like you need to reinstall Tunnelblick. Please move Tunnelblick to the Trash and download a fresh copy."),local(@"Download"),local(@"Quit"),nil);
  1.1051 +	[panel setLevel:NSStatusWindowLevel];
  1.1052 +	[panel makeKeyAndOrderFront:nil];
  1.1053 +	if( [NSApp runModalForWindow:panel] != NSAlertDefaultReturn ) {
  1.1054 +		exit(2);
  1.1055 +	} else {
  1.1056 +		[[NSWorkspace sharedWorkspace] openURL:[NSURL URLWithString:@"http://tunnelblick.net/"]];
  1.1057 +		exit(2);
  1.1058 +	}
  1.1059 +}
  1.1060 +
  1.1061 +-(IBAction) autoLaunchPrefButtonWasClicked: (id) sender
  1.1062 +{
  1.1063 +	if([sender state]) {
  1.1064 +		[self saveAutoLaunchCheckboxState:TRUE];
  1.1065 +	} else {
  1.1066 +		[self saveAutoLaunchCheckboxState:FALSE];
  1.1067 +	}
  1.1068 +}
  1.1069 +
  1.1070 +-(IBAction) nameserverPrefButtonWasClicked: (id) sender
  1.1071 +{
  1.1072 +	if([sender state]) {
  1.1073 +		[self saveUseNameserverCheckboxState:TRUE];
  1.1074 +	} else {
  1.1075 +		[self saveUseNameserverCheckboxState:FALSE];
  1.1076 +	}
  1.1077 +}
  1.1078 +
  1.1079 +
  1.1080 +@end
     2.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     2.2 +++ b/tunblick/Sparkle.xcodeproj/default.pbxuser	Wed Jul 29 11:23:17 2009 +0200
     2.3 @@ -0,0 +1,245 @@
     2.4 +// !$*UTF8*$!
     2.5 +{
     2.6 +	0867D690FE84028FC02AAC07 /* Project object */ = {
     2.7 +		activeArchitecture = i386;
     2.8 +		activeBuildConfigurationName = Debug;
     2.9 +		activeExecutable = FAEC981A0D94C8750008EDA9 /* Sparkle Test App */;
    2.10 +		activeTarget = 61B5F90109C4CEE200B25A18 /* Sparkle Test App */;
    2.11 +		codeSenseManager = FAEC98240D94C8760008EDA9 /* Code sense */;
    2.12 +		executables = (
    2.13 +			FAEC981A0D94C8750008EDA9 /* Sparkle Test App */,
    2.14 +			FAEC981B0D94C8750008EDA9 /* Relaunch Tool */,
    2.15 +		);
    2.16 +		perUserDictionary = {
    2.17 +			PBXPerProjectTemplateStateSaveDate = 227854453;
    2.18 +			PBXWorkspaceStateSaveDate = 227854453;
    2.19 +		};
    2.20 +		sourceControlManager = FAEC98230D94C8760008EDA9 /* Source Control */;
    2.21 +		userBuildSettings = {
    2.22 +		};
    2.23 +	};
    2.24 +	61B5F90109C4CEE200B25A18 /* Sparkle Test App */ = {
    2.25 +		activeExec = 0;
    2.26 +		executables = (
    2.27 +			FAEC981A0D94C8750008EDA9 /* Sparkle Test App */,
    2.28 +		);
    2.29 +	};
    2.30 +	8DC2EF4F0486A6940098B216 /* Sparkle */ = {
    2.31 +		activeExec = 0;
    2.32 +	};
    2.33 +	D1E42C2E0CE754AE00F50EB9 /* Relaunch Tool */ = {
    2.34 +		activeExec = 0;
    2.35 +		executables = (
    2.36 +			FAEC981B0D94C8750008EDA9 /* Relaunch Tool */,
    2.37 +		);
    2.38 +	};
    2.39 +	FAEC981A0D94C8750008EDA9 /* Sparkle Test App */ = {
    2.40 +		isa = PBXExecutable;
    2.41 +		activeArgIndices = (
    2.42 +		);
    2.43 +		argumentStrings = (
    2.44 +		);
    2.45 +		autoAttachOnCrash = 1;
    2.46 +		breakpointsEnabled = 1;
    2.47 +		configStateDict = {
    2.48 +		};
    2.49 +		customDataFormattersEnabled = 1;
    2.50 +		debuggerPlugin = GDBDebugging;
    2.51 +		disassemblyDisplayState = 0;
    2.52 +		dylibVariantSuffix = "";
    2.53 +		enableDebugStr = 1;
    2.54 +		environmentEntries = (
    2.55 +			{
    2.56 +				active = YES;
    2.57 +				name = MallocPreScribble;
    2.58 +				value = 1;
    2.59 +			},
    2.60 +			{
    2.61 +				active = YES;
    2.62 +				name = MallocScribble;
    2.63 +				value = 1;
    2.64 +			},
    2.65 +			{
    2.66 +				active = YES;
    2.67 +				name = MallocGuardEdges;
    2.68 +				value = 1;
    2.69 +			},
    2.70 +			{
    2.71 +				active = YES;
    2.72 +				name = MallocCheckHeapStart;
    2.73 +				value = 1;
    2.74 +			},
    2.75 +			{
    2.76 +				active = YES;
    2.77 +				name = MallocCheckHeapEach;
    2.78 +				value = 100000;
    2.79 +			},
    2.80 +			{
    2.81 +				active = YES;
    2.82 +				name = MallocStackLogging;
    2.83 +				value = 1;
    2.84 +			},
    2.85 +			{
    2.86 +				active = NO;
    2.87 +				name = MallocStackLoggingNoCompact;
    2.88 +				value = 1;
    2.89 +			},
    2.90 +			{
    2.91 +				active = YES;
    2.92 +				name = NSDebugEnabled;
    2.93 +				value = YES;
    2.94 +			},
    2.95 +			{
    2.96 +				active = YES;
    2.97 +				name = NSZombieEnabled;
    2.98 +				value = YES;
    2.99 +			},
   2.100 +			{
   2.101 +				active = NO;
   2.102 +				name = NSDeallocateZombies;
   2.103 +				value = NO;
   2.104 +			},
   2.105 +			{
   2.106 +				active = YES;
   2.107 +				name = NSAutoreleaseFreedObjectCheckEnabled;
   2.108 +				value = YES;
   2.109 +			},
   2.110 +			{
   2.111 +				active = NO;
   2.112 +				name = MALLOC_PROTECT_BEFORE;
   2.113 +				value = 1;
   2.114 +			},
   2.115 +			{
   2.116 +				active = YES;
   2.117 +				name = MALLOC_ALTIVEC_SIZE;
   2.118 +				value = 1;
   2.119 +			},
   2.120 +			{
   2.121 +				active = YES;
   2.122 +				name = MALLOC_FILL_SPACE;
   2.123 +				value = 1;
   2.124 +			},
   2.125 +			{
   2.126 +				active = NO;
   2.127 +				name = CFZombieLevel;
   2.128 +				value = 65553;
   2.129 +			},
   2.130 +		);
   2.131 +		executableSystemSymbolLevel = 0;
   2.132 +		executableUserSymbolLevel = 0;
   2.133 +		libgmallocEnabled = 0;
   2.134 +		name = "Sparkle Test App";
   2.135 +		sourceDirectories = (
   2.136 +		);
   2.137 +	};
   2.138 +	FAEC981B0D94C8750008EDA9 /* Relaunch Tool */ = {
   2.139 +		isa = PBXExecutable;
   2.140 +		activeArgIndices = (
   2.141 +		);
   2.142 +		argumentStrings = (
   2.143 +		);
   2.144 +		autoAttachOnCrash = 1;
   2.145 +		breakpointsEnabled = 1;
   2.146 +		configStateDict = {
   2.147 +		};
   2.148 +		customDataFormattersEnabled = 1;
   2.149 +		debuggerPlugin = GDBDebugging;
   2.150 +		disassemblyDisplayState = 0;
   2.151 +		dylibVariantSuffix = "";
   2.152 +		enableDebugStr = 1;
   2.153 +		environmentEntries = (
   2.154 +			{
   2.155 +				active = YES;
   2.156 +				name = MallocPreScribble;
   2.157 +				value = 1;
   2.158 +			},
   2.159 +			{
   2.160 +				active = YES;
   2.161 +				name = MallocScribble;
   2.162 +				value = 1;
   2.163 +			},
   2.164 +			{
   2.165 +				active = YES;
   2.166 +				name = MallocGuardEdges;
   2.167 +				value = 1;
   2.168 +			},
   2.169 +			{
   2.170 +				active = YES;
   2.171 +				name = MallocCheckHeapStart;
   2.172 +				value = 1;
   2.173 +			},
   2.174 +			{
   2.175 +				active = YES;
   2.176 +				name = MallocCheckHeapEach;
   2.177 +				value = 100000;
   2.178 +			},
   2.179 +			{
   2.180 +				active = YES;
   2.181 +				name = MallocStackLogging;
   2.182 +				value = 1;
   2.183 +			},
   2.184 +			{
   2.185 +				active = NO;
   2.186 +				name = MallocStackLoggingNoCompact;
   2.187 +				value = 1;
   2.188 +			},
   2.189 +			{
   2.190 +				active = YES;
   2.191 +				name = NSDebugEnabled;
   2.192 +				value = YES;
   2.193 +			},
   2.194 +			{
   2.195 +				active = YES;
   2.196 +				name = NSZombieEnabled;
   2.197 +				value = YES;
   2.198 +			},
   2.199 +			{
   2.200 +				active = NO;
   2.201 +				name = NSDeallocateZombies;
   2.202 +				value = NO;
   2.203 +			},
   2.204 +			{
   2.205 +				active = YES;
   2.206 +				name = NSAutoreleaseFreedObjectCheckEnabled;
   2.207 +				value = YES;
   2.208 +			},
   2.209 +			{
   2.210 +				active = NO;
   2.211 +				name = MALLOC_PROTECT_BEFORE;
   2.212 +				value = 1;
   2.213 +			},
   2.214 +			{
   2.215 +				active = YES;
   2.216 +				name = MALLOC_ALTIVEC_SIZE;
   2.217 +				value = 1;
   2.218 +			},
   2.219 +			{
   2.220 +				active = YES;
   2.221 +				name = MALLOC_FILL_SPACE;
   2.222 +				value = 1;
   2.223 +			},
   2.224 +			{
   2.225 +				active = NO;
   2.226 +				name = CFZombieLevel;
   2.227 +				value = 65553;
   2.228 +			},
   2.229 +		);
   2.230 +		executableSystemSymbolLevel = 0;
   2.231 +		executableUserSymbolLevel = 0;
   2.232 +		libgmallocEnabled = 0;
   2.233 +		name = "Relaunch Tool";
   2.234 +		sourceDirectories = (
   2.235 +		);
   2.236 +	};
   2.237 +	FAEC98230D94C8760008EDA9 /* Source Control */ = {
   2.238 +		isa = PBXSourceControlManager;
   2.239 +		fallbackIsa = XCSourceControlManager;
   2.240 +		isSCMEnabled = 0;
   2.241 +		scmConfiguration = {
   2.242 +		};
   2.243 +	};
   2.244 +	FAEC98240D94C8760008EDA9 /* Code sense */ = {
   2.245 +		isa = PBXCodeSenseManager;
   2.246 +		indexTemplatePath = "";
   2.247 +	};
   2.248 +}
     3.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     3.2 +++ b/tunblick/Sparkle.xcodeproj/project.pbxproj	Wed Jul 29 11:23:17 2009 +0200
     3.3 @@ -0,0 +1,1203 @@
     3.4 +// !$*UTF8*$!
     3.5 +{
     3.6 +	archiveVersion = 1;
     3.7 +	classes = {
     3.8 +	};
     3.9 +	objectVersion = 44;
    3.10 +	objects = {
    3.11 +
    3.12 +/* Begin PBXBuildFile section */
    3.13 +		610134730DD250470049ACDF /* SUUpdateDriver.h in Headers */ = {isa = PBXBuildFile; fileRef = 610134710DD250470049ACDF /* SUUpdateDriver.h */; settings = {ATTRIBUTES = (); }; };
    3.14 +		610134740DD250470049ACDF /* SUUpdateDriver.m in Sources */ = {isa = PBXBuildFile; fileRef = 610134720DD250470049ACDF /* SUUpdateDriver.m */; };
    3.15 +		6101347B0DD2541A0049ACDF /* SUProbingUpdateDriver.h in Headers */ = {isa = PBXBuildFile; fileRef = 610134790DD2541A0049ACDF /* SUProbingUpdateDriver.h */; settings = {ATTRIBUTES = (); }; };
    3.16 +		6101347C0DD2541A0049ACDF /* SUProbingUpdateDriver.m in Sources */ = {isa = PBXBuildFile; fileRef = 6101347A0DD2541A0049ACDF /* SUProbingUpdateDriver.m */; };
    3.17 +		6102FE460E077FCE00F85D09 /* SUPipedUnarchiver.h in Headers */ = {isa = PBXBuildFile; fileRef = 6102FE440E077FCE00F85D09 /* SUPipedUnarchiver.h */; settings = {ATTRIBUTES = (); }; };
    3.18 +		6102FE4A0E07803800F85D09 /* SUDiskImageUnarchiver.h in Headers */ = {isa = PBXBuildFile; fileRef = 6102FE480E07803800F85D09 /* SUDiskImageUnarchiver.h */; settings = {ATTRIBUTES = (); }; };
    3.19 +		6102FE4B0E07803800F85D09 /* SUDiskImageUnarchiver.m in Sources */ = {isa = PBXBuildFile; fileRef = 6102FE490E07803800F85D09 /* SUDiskImageUnarchiver.m */; };
    3.20 +		6102FE5B0E08C7EC00F85D09 /* SUUnarchiver_Private.h in Headers */ = {isa = PBXBuildFile; fileRef = 6102FE590E08C7EC00F85D09 /* SUUnarchiver_Private.h */; settings = {ATTRIBUTES = (); }; };
    3.21 +		6102FE5C0E08C7EC00F85D09 /* SUUnarchiver_Private.m in Sources */ = {isa = PBXBuildFile; fileRef = 6102FE5A0E08C7EC00F85D09 /* SUUnarchiver_Private.m */; };
    3.22 +		610D5A1A0A1661B8004AAD9C /* Sparkle.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8DC2EF5B0486A6940098B216 /* Sparkle.framework */; };
    3.23 +		610D5A750A1670A4004AAD9C /* SUStatus.nib in Resources */ = {isa = PBXBuildFile; fileRef = 610D5A740A1670A4004AAD9C /* SUStatus.nib */; };
    3.24 +		610EC1E00CF3A5FE00AE239E /* NTSynchronousTask.m in Sources */ = {isa = PBXBuildFile; fileRef = 610EC1BF0CF3914D00AE239E /* NTSynchronousTask.m */; };
    3.25 +		61177A1F0D1112E900749C97 /* IOKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6117796E0D1112E000749C97 /* IOKit.framework */; };
    3.26 +		61180BCA0D64138900B4E0D1 /* SUWindowController.h in Headers */ = {isa = PBXBuildFile; fileRef = 61180BC80D64138900B4E0D1 /* SUWindowController.h */; settings = {ATTRIBUTES = (); }; };
    3.27 +		61180BCB0D64138900B4E0D1 /* SUWindowController.m in Sources */ = {isa = PBXBuildFile; fileRef = 61180BC90D64138900B4E0D1 /* SUWindowController.m */; };
    3.28 +		6120721209CC5C4B007FE0F6 /* SUAutomaticUpdateAlert.h in Headers */ = {isa = PBXBuildFile; fileRef = 6120721009CC5C4B007FE0F6 /* SUAutomaticUpdateAlert.h */; settings = {ATTRIBUTES = (); }; };
    3.29 +		6120721309CC5C4B007FE0F6 /* SUAutomaticUpdateAlert.m in Sources */ = {isa = PBXBuildFile; fileRef = 6120721109CC5C4B007FE0F6 /* SUAutomaticUpdateAlert.m */; };
    3.30 +		61227A160DB548B800AB99EA /* SUVersionComparisonTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 61227A150DB548B800AB99EA /* SUVersionComparisonTest.m */; };
    3.31 +		61299A2F09CA2DAB00B7442F /* SUDSAVerifier.h in Headers */ = {isa = PBXBuildFile; fileRef = 61299A2D09CA2DAB00B7442F /* SUDSAVerifier.h */; settings = {ATTRIBUTES = (); }; };
    3.32 +		61299A3009CA2DAB00B7442F /* SUDSAVerifier.m in Sources */ = {isa = PBXBuildFile; fileRef = 61299A2E09CA2DAB00B7442F /* SUDSAVerifier.m */; };
    3.33 +		61299A4A09CA2DD000B7442F /* SUPlainInstallerInternals.h in Headers */ = {isa = PBXBuildFile; fileRef = 6129984309C9E2DA00B7442F /* SUPlainInstallerInternals.h */; settings = {ATTRIBUTES = (); }; };
    3.34 +		61299A5C09CA6D4500B7442F /* SUConstants.h in Headers */ = {isa = PBXBuildFile; fileRef = 61299A5B09CA6D4500B7442F /* SUConstants.h */; settings = {ATTRIBUTES = (); }; };
    3.35 +		61299A6009CA6EB100B7442F /* SUConstants.m in Sources */ = {isa = PBXBuildFile; fileRef = 61299A5F09CA6EB100B7442F /* SUConstants.m */; };
    3.36 +		61299A8D09CA790200B7442F /* SUUnarchiver.h in Headers */ = {isa = PBXBuildFile; fileRef = 61299A8B09CA790200B7442F /* SUUnarchiver.h */; settings = {ATTRIBUTES = (); }; };
    3.37 +		61299A8E09CA790200B7442F /* SUUnarchiver.m in Sources */ = {isa = PBXBuildFile; fileRef = 61299A8C09CA790200B7442F /* SUUnarchiver.m */; };
    3.38 +		61299B3609CB04E000B7442F /* Sparkle.h in Headers */ = {isa = PBXBuildFile; fileRef = 61299B3509CB04E000B7442F /* Sparkle.h */; settings = {ATTRIBUTES = (Public, ); }; };
    3.39 +		612DCBAF0D488BC60015DBEA /* SUUpdatePermissionPrompt.h in Headers */ = {isa = PBXBuildFile; fileRef = 612DCBAD0D488BC60015DBEA /* SUUpdatePermissionPrompt.h */; settings = {ATTRIBUTES = (); }; };
    3.40 +		612DCBB00D488BC60015DBEA /* SUUpdatePermissionPrompt.m in Sources */ = {isa = PBXBuildFile; fileRef = 612DCBAE0D488BC60015DBEA /* SUUpdatePermissionPrompt.m */; };
    3.41 +		61407C390A4099050009F71F /* Sparkle.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = 8DC2EF5B0486A6940098B216 /* Sparkle.framework */; };
    3.42 +		615AE3D00D64DC40001CA7BD /* SUModelTranslation.plist in Resources */ = {isa = PBXBuildFile; fileRef = 615AE3CF0D64DC40001CA7BD /* SUModelTranslation.plist */; };
    3.43 +		6160E7E10D3B4A8800E9CD71 /* NTSynchronousTask.h in Headers */ = {isa = PBXBuildFile; fileRef = 610EC1C00CF3914D00AE239E /* NTSynchronousTask.h */; settings = {ATTRIBUTES = (); }; };
    3.44 +		61699BCC0DDB92BD005878A4 /* SUVersionComparisonTest.h in Headers */ = {isa = PBXBuildFile; fileRef = 61227A140DB548B800AB99EA /* SUVersionComparisonTest.h */; settings = {ATTRIBUTES = (); }; };
    3.45 +		618E9CFD0E7328F1004646D8 /* dsa_pub.pem in Resources */ = {isa = PBXBuildFile; fileRef = 618E9CFC0E7328F1004646D8 /* dsa_pub.pem */; };
    3.46 +		618FA5010DAE88B40026945C /* SUInstaller.h in Headers */ = {isa = PBXBuildFile; fileRef = 618FA4FF0DAE88B40026945C /* SUInstaller.h */; settings = {ATTRIBUTES = (); }; };
    3.47 +		618FA5020DAE88B40026945C /* SUInstaller.m in Sources */ = {isa = PBXBuildFile; fileRef = 618FA5000DAE88B40026945C /* SUInstaller.m */; };
    3.48 +		618FA5050DAE8AB80026945C /* SUPlainInstaller.h in Headers */ = {isa = PBXBuildFile; fileRef = 618FA5030DAE8AB80026945C /* SUPlainInstaller.h */; settings = {ATTRIBUTES = (); }; };
    3.49 +		618FA5060DAE8AB80026945C /* SUPlainInstaller.m in Sources */ = {isa = PBXBuildFile; fileRef = 618FA5040DAE8AB80026945C /* SUPlainInstaller.m */; };
    3.50 +		618FA5220DAE8E8A0026945C /* SUPackageInstaller.h in Headers */ = {isa = PBXBuildFile; fileRef = 618FA5200DAE8E8A0026945C /* SUPackageInstaller.h */; settings = {ATTRIBUTES = (); }; };
    3.51 +		618FA5230DAE8E8A0026945C /* SUPackageInstaller.m in Sources */ = {isa = PBXBuildFile; fileRef = 618FA5210DAE8E8A0026945C /* SUPackageInstaller.m */; };
    3.52 +		6196CFF909C72148000DC222 /* SUStatusController.h in Headers */ = {isa = PBXBuildFile; fileRef = 6196CFE309C71ADE000DC222 /* SUStatusController.h */; settings = {ATTRIBUTES = (); }; };
    3.53 +		6196CFFA09C72149000DC222 /* SUStatusController.m in Sources */ = {isa = PBXBuildFile; fileRef = 6196CFE409C71ADE000DC222 /* SUStatusController.m */; };
    3.54 +		61A2259E0D1C495D00430CCD /* SUVersionComparisonProtocol.h in Headers */ = {isa = PBXBuildFile; fileRef = 61A2259C0D1C495D00430CCD /* SUVersionComparisonProtocol.h */; settings = {ATTRIBUTES = (Public, ); }; };
    3.55 +		61A225A40D1C4AC000430CCD /* SUStandardVersionComparator.h in Headers */ = {isa = PBXBuildFile; fileRef = 61A225A20D1C4AC000430CCD /* SUStandardVersionComparator.h */; settings = {ATTRIBUTES = (); }; };
    3.56 +		61A225A50D1C4AC000430CCD /* SUStandardVersionComparator.m in Sources */ = {isa = PBXBuildFile; fileRef = 61A225A30D1C4AC000430CCD /* SUStandardVersionComparator.m */; };
    3.57 +		61A2279C0D1CEE7600430CCD /* SUSystemProfiler.h in Headers */ = {isa = PBXBuildFile; fileRef = 61A2279A0D1CEE7600430CCD /* SUSystemProfiler.h */; settings = {ATTRIBUTES = (); }; };
    3.58 +		61A2279D0D1CEE7600430CCD /* SUSystemProfiler.m in Sources */ = {isa = PBXBuildFile; fileRef = 61A2279B0D1CEE7600430CCD /* SUSystemProfiler.m */; };
    3.59 +		61A354550DF113C70076ECB1 /* SUUserInitiatedUpdateDriver.h in Headers */ = {isa = PBXBuildFile; fileRef = 61A354530DF113C70076ECB1 /* SUUserInitiatedUpdateDriver.h */; settings = {ATTRIBUTES = (); }; };
    3.60 +		61A354560DF113C70076ECB1 /* SUUserInitiatedUpdateDriver.m in Sources */ = {isa = PBXBuildFile; fileRef = 61A354540DF113C70076ECB1 /* SUUserInitiatedUpdateDriver.m */; };
    3.61 +		61AAE8280A321A7F00D8810D /* Sparkle.strings in Resources */ = {isa = PBXBuildFile; fileRef = 61AAE8220A321A7F00D8810D /* Sparkle.strings */; };
    3.62 +		61AAE8290A321A8000D8810D /* SUAutomaticUpdateAlert.nib in Resources */ = {isa = PBXBuildFile; fileRef = 61AAE8240A321A7F00D8810D /* SUAutomaticUpdateAlert.nib */; };
    3.63 +		61AAE82A0A321A8000D8810D /* SUUpdateAlert.nib in Resources */ = {isa = PBXBuildFile; fileRef = 61AAE8260A321A7F00D8810D /* SUUpdateAlert.nib */; };
    3.64 +		61B5F8ED09C4CE3C00B25A18 /* SUUpdater.h in Headers */ = {isa = PBXBuildFile; fileRef = 61B5F8E309C4CE3C00B25A18 /* SUUpdater.h */; settings = {ATTRIBUTES = (Public, ); }; };
    3.65 +		61B5F8EE09C4CE3C00B25A18 /* SUUpdater.m in Sources */ = {isa = PBXBuildFile; fileRef = 61B5F8E409C4CE3C00B25A18 /* SUUpdater.m */; };
    3.66 +		61B5F8EF09C4CE3C00B25A18 /* SUPlainInstallerInternals.m in Sources */ = {isa = PBXBuildFile; fileRef = 61B5F8E509C4CE3C00B25A18 /* SUPlainInstallerInternals.m */; };
    3.67 +		61B5F8F709C4CEB300B25A18 /* Security.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 61B5F8F609C4CEB300B25A18 /* Security.framework */; };
    3.68 +		61B5F90F09C4CF3A00B25A18 /* Sparkle.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8DC2EF5B0486A6940098B216 /* Sparkle.framework */; };
    3.69 +		61B5F92E09C4CFD800B25A18 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 61B5F92A09C4CFD800B25A18 /* InfoPlist.strings */; };
    3.70 +		61B5F92F09C4CFD800B25A18 /* MainMenu.nib in Resources */ = {isa = PBXBuildFile; fileRef = 61B5F92C09C4CFD800B25A18 /* MainMenu.nib */; };
    3.71 +		61B5F93009C4CFDC00B25A18 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 61B5F92409C4CFC900B25A18 /* main.m */; };
    3.72 +		61B5FBB709C4FAFF00B25A18 /* SUAppcast.m in Sources */ = {isa = PBXBuildFile; fileRef = 61B5FB9509C4F04600B25A18 /* SUAppcast.m */; };
    3.73 +		61B5FC0D09C4FC8200B25A18 /* SUAppcast.h in Headers */ = {isa = PBXBuildFile; fileRef = 61B5FB9409C4F04600B25A18 /* SUAppcast.h */; settings = {ATTRIBUTES = (Public, ); }; };
    3.74 +		61B5FC4C09C4FD5E00B25A18 /* WebKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 61B5FC3F09C4FD4000B25A18 /* WebKit.framework */; };
    3.75 +		61B5FC6F09C51F4900B25A18 /* SUAppcastItem.m in Sources */ = {isa = PBXBuildFile; fileRef = 61B5FC5409C5182000B25A18 /* SUAppcastItem.m */; };
    3.76 +		61B5FC7009C51F4A00B25A18 /* SUAppcastItem.h in Headers */ = {isa = PBXBuildFile; fileRef = 61B5FC5309C5182000B25A18 /* SUAppcastItem.h */; settings = {ATTRIBUTES = (Public, ); }; };
    3.77 +		61B5FCDE09C52A9F00B25A18 /* SUUpdateAlert.m in Sources */ = {isa = PBXBuildFile; fileRef = 61B5FCA109C5228F00B25A18 /* SUUpdateAlert.m */; };
    3.78 +		61B5FCDF09C52A9F00B25A18 /* SUUpdateAlert.h in Headers */ = {isa = PBXBuildFile; fileRef = 61B5FCA009C5228F00B25A18 /* SUUpdateAlert.h */; settings = {ATTRIBUTES = (); }; };
    3.79 +		61B93A3C0DD02D7000DCD2F8 /* SUUIBasedUpdateDriver.h in Headers */ = {isa = PBXBuildFile; fileRef = 61B93A390DD02D6400DCD2F8 /* SUUIBasedUpdateDriver.h */; settings = {ATTRIBUTES = (); }; };
    3.80 +		61B93A3D0DD02D7000DCD2F8 /* SUUIBasedUpdateDriver.m in Sources */ = {isa = PBXBuildFile; fileRef = 61B93A3A0DD02D6400DCD2F8 /* SUUIBasedUpdateDriver.m */; };
    3.81 +		61B93B270DD0FDD300DCD2F8 /* SUAutomaticUpdateDriver.h in Headers */ = {isa = PBXBuildFile; fileRef = 61B93B250DD0FDD300DCD2F8 /* SUAutomaticUpdateDriver.h */; settings = {ATTRIBUTES = (); }; };
    3.82 +		61B93B280DD0FDD300DCD2F8 /* SUAutomaticUpdateDriver.m in Sources */ = {isa = PBXBuildFile; fileRef = 61B93B260DD0FDD300DCD2F8 /* SUAutomaticUpdateDriver.m */; };
    3.83 +		61B93C090DD112FF00DCD2F8 /* SUScheduledUpdateDriver.h in Headers */ = {isa = PBXBuildFile; fileRef = 61B93C070DD112FF00DCD2F8 /* SUScheduledUpdateDriver.h */; settings = {ATTRIBUTES = (); }; };
    3.84 +		61B93C0A0DD112FF00DCD2F8 /* SUScheduledUpdateDriver.m in Sources */ = {isa = PBXBuildFile; fileRef = 61B93C080DD112FF00DCD2F8 /* SUScheduledUpdateDriver.m */; };
    3.85 +		61BBDF820A49220C00378739 /* Sparkle.icns in Resources */ = {isa = PBXBuildFile; fileRef = 61BBDF810A49220C00378739 /* Sparkle.icns */; };
    3.86 +		61C2680A0E2DB5D000175E6C /* License.txt in Resources */ = {isa = PBXBuildFile; fileRef = 61C268090E2DB5D000175E6C /* License.txt */; };
    3.87 +		61C46F340D9C54F300B06326 /* SUUpdatePermissionPrompt.nib in Resources */ = {isa = PBXBuildFile; fileRef = 61C46F330D9C54F300B06326 /* SUUpdatePermissionPrompt.nib */; };
    3.88 +		61CFB3290E385186007A1735 /* Sparkle.pch in Headers */ = {isa = PBXBuildFile; fileRef = 61CFB3280E385186007A1735 /* Sparkle.pch */; };
    3.89 +		61D85D6D0E10B2ED00F9B4A9 /* SUPipedUnarchiver.m in Sources */ = {isa = PBXBuildFile; fileRef = 6129C0B90E0B79810062CE76 /* SUPipedUnarchiver.m */; };
    3.90 +		61EF67560E25B58D00F754E0 /* SUHost.m in Sources */ = {isa = PBXBuildFile; fileRef = 61EF67550E25B58D00F754E0 /* SUHost.m */; };
    3.91 +		61EF67590E25C5B400F754E0 /* SUHost.h in Headers */ = {isa = PBXBuildFile; fileRef = 61EF67580E25C5B400F754E0 /* SUHost.h */; };
    3.92 +		61F83F720DBFE140006FDD30 /* SUBasicUpdateDriver.m in Sources */ = {isa = PBXBuildFile; fileRef = 61F83F700DBFE137006FDD30 /* SUBasicUpdateDriver.m */; };
    3.93 +		61F83F740DBFE141006FDD30 /* SUBasicUpdateDriver.h in Headers */ = {isa = PBXBuildFile; fileRef = 61F83F6F0DBFE137006FDD30 /* SUBasicUpdateDriver.h */; settings = {ATTRIBUTES = (); }; };
    3.94 +		61FA52880E2D9EA400EF58AD /* Sparkle.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8DC2EF5B0486A6940098B216 /* Sparkle.framework */; settings = {ATTRIBUTES = (Required, ); }; };
    3.95 +		DAAEFC9B0DA5722F0051E0D0 /* AppKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 0867D6A5FE840307C02AAC07 /* AppKit.framework */; };
    3.96 +		DAAEFD4E0DA572330051E0D0 /* relaunch.m in Sources */ = {isa = PBXBuildFile; fileRef = 613242130CD06CEF00106AA4 /* relaunch.m */; };
    3.97 +		DAAEFD510DA572550051E0D0 /* relaunch in Resources */ = {isa = PBXBuildFile; fileRef = DAAEFC960DA571DF0051E0D0 /* relaunch */; };
    3.98 +		FAEFA2F70D94AA7500472538 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 0867D69BFE84028FC02AAC07 /* Foundation.framework */; };
    3.99 +		FAEFA2F80D94AA7900472538 /* AppKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 0867D6A5FE840307C02AAC07 /* AppKit.framework */; };
   3.100 +		FAEFA3040D94AB3400472538 /* AppKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 0867D6A5FE840307C02AAC07 /* AppKit.framework */; };
   3.101 +		FAEFA3050D94AB3400472538 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 0867D69BFE84028FC02AAC07 /* Foundation.framework */; };
   3.102 +/* End PBXBuildFile section */
   3.103 +
   3.104 +/* Begin PBXContainerItemProxy section */
   3.105 +		61227AB90DB5C4BB00AB99EA /* PBXContainerItemProxy */ = {
   3.106 +			isa = PBXContainerItemProxy;
   3.107 +			containerPortal = 0867D690FE84028FC02AAC07 /* Project object */;
   3.108 +			proxyType = 1;
   3.109 +			remoteGlobalIDString = 612279D80DB5470200AB99EA;
   3.110 +			remoteInfo = "Sparkle Unit Tests";
   3.111 +		};
   3.112 +		61B5F91B09C4CF7200B25A18 /* PBXContainerItemProxy */ = {
   3.113 +			isa = PBXContainerItemProxy;
   3.114 +			containerPortal = 0867D690FE84028FC02AAC07 /* Project object */;
   3.115 +			proxyType = 1;
   3.116 +			remoteGlobalIDString = 8DC2EF4F0486A6940098B216;
   3.117 +			remoteInfo = Sparkle;
   3.118 +		};
   3.119 +		61FA528C0E2D9EB200EF58AD /* PBXContainerItemProxy */ = {
   3.120 +			isa = PBXContainerItemProxy;
   3.121 +			containerPortal = 0867D690FE84028FC02AAC07 /* Project object */;
   3.122 +			proxyType = 1;
   3.123 +			remoteGlobalIDString = 8DC2EF4F0486A6940098B216;
   3.124 +			remoteInfo = Sparkle;
   3.125 +		};
   3.126 +		DAAEFD4F0DA572460051E0D0 /* PBXContainerItemProxy */ = {
   3.127 +			isa = PBXContainerItemProxy;
   3.128 +			containerPortal = 0867D690FE84028FC02AAC07 /* Project object */;
   3.129 +			proxyType = 1;
   3.130 +			remoteGlobalIDString = DAAEFC950DA571DF0051E0D0;
   3.131 +			remoteInfo = relaunch;
   3.132 +		};
   3.133 +/* End PBXContainerItemProxy section */
   3.134 +
   3.135 +/* Begin PBXCopyFilesBuildPhase section */
   3.136 +		61B5FB4D09C4E9FA00B25A18 /* CopyFiles */ = {
   3.137 +			isa = PBXCopyFilesBuildPhase;
   3.138 +			buildActionMask = 2147483647;
   3.139 +			dstPath = "";
   3.140 +			dstSubfolderSpec = 10;
   3.141 +			files = (
   3.142 +				61407C390A4099050009F71F /* Sparkle.framework in CopyFiles */,
   3.143 +			);
   3.144 +			runOnlyForDeploymentPostprocessing = 0;
   3.145 +		};
   3.146 +/* End PBXCopyFilesBuildPhase section */
   3.147 +
   3.148 +/* Begin PBXFileReference section */
   3.149 +		0867D69BFE84028FC02AAC07 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = /System/Library/Frameworks/Foundation.framework; sourceTree = "<absolute>"; };
   3.150 +		0867D6A5FE840307C02AAC07 /* AppKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AppKit.framework; path = /System/Library/Frameworks/AppKit.framework; sourceTree = "<absolute>"; };
   3.151 +		610134710DD250470049ACDF /* SUUpdateDriver.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SUUpdateDriver.h; sourceTree = "<group>"; };
   3.152 +		610134720DD250470049ACDF /* SUUpdateDriver.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SUUpdateDriver.m; sourceTree = "<group>"; };
   3.153 +		610134790DD2541A0049ACDF /* SUProbingUpdateDriver.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SUProbingUpdateDriver.h; sourceTree = "<group>"; };
   3.154 +		6101347A0DD2541A0049ACDF /* SUProbingUpdateDriver.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SUProbingUpdateDriver.m; sourceTree = "<group>"; };
   3.155 +		6102FE440E077FCE00F85D09 /* SUPipedUnarchiver.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SUPipedUnarchiver.h; sourceTree = "<group>"; };
   3.156 +		6102FE480E07803800F85D09 /* SUDiskImageUnarchiver.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SUDiskImageUnarchiver.h; sourceTree = "<group>"; };
   3.157 +		6102FE490E07803800F85D09 /* SUDiskImageUnarchiver.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SUDiskImageUnarchiver.m; sourceTree = "<group>"; };
   3.158 +		6102FE590E08C7EC00F85D09 /* SUUnarchiver_Private.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SUUnarchiver_Private.h; sourceTree = "<group>"; };
   3.159 +		6102FE5A0E08C7EC00F85D09 /* SUUnarchiver_Private.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SUUnarchiver_Private.m; sourceTree = "<group>"; };
   3.160 +		61072EB20DF2640C008FE88B /* ConfigFrameworkReleaseGCSupport.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = ConfigFrameworkReleaseGCSupport.xcconfig; sourceTree = "<group>"; };
   3.161 +		610D5A740A1670A4004AAD9C /* SUStatus.nib */ = {isa = PBXFileReference; lastKnownFileType = wrapper.nib; path = SUStatus.nib; sourceTree = "<group>"; };
   3.162 +		610EC1BF0CF3914D00AE239E /* NTSynchronousTask.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = NTSynchronousTask.m; sourceTree = "<group>"; };
   3.163 +		610EC1C00CF3914D00AE239E /* NTSynchronousTask.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NTSynchronousTask.h; sourceTree = "<group>"; };
   3.164 +		6117796E0D1112E000749C97 /* IOKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = IOKit.framework; path = /System/Library/Frameworks/IOKit.framework; sourceTree = "<absolute>"; };
   3.165 +		61180BC80D64138900B4E0D1 /* SUWindowController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SUWindowController.h; sourceTree = "<group>"; };
   3.166 +		61180BC90D64138900B4E0D1 /* SUWindowController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SUWindowController.m; sourceTree = "<group>"; };
   3.167 +		6120721009CC5C4B007FE0F6 /* SUAutomaticUpdateAlert.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SUAutomaticUpdateAlert.h; sourceTree = "<group>"; };
   3.168 +		6120721109CC5C4B007FE0F6 /* SUAutomaticUpdateAlert.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SUAutomaticUpdateAlert.m; sourceTree = "<group>"; };
   3.169 +		612279D90DB5470200AB99EA /* Sparkle Unit Tests.octest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "Sparkle Unit Tests.octest"; sourceTree = BUILT_PRODUCTS_DIR; };
   3.170 +		612279DA0DB5470200AB99EA /* Sparkle Unit Tests-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; name = "Sparkle Unit Tests-Info.plist"; path = "Tests/Sparkle Unit Tests-Info.plist"; sourceTree = "<group>"; };
   3.171 +		61227A140DB548B800AB99EA /* SUVersionComparisonTest.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SUVersionComparisonTest.h; path = Tests/SUVersionComparisonTest.h; sourceTree = "<group>"; };
   3.172 +		61227A150DB548B800AB99EA /* SUVersionComparisonTest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = SUVersionComparisonTest.m; path = Tests/SUVersionComparisonTest.m; sourceTree = "<group>"; };
   3.173 +		6129984309C9E2DA00B7442F /* SUPlainInstallerInternals.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SUPlainInstallerInternals.h; sourceTree = "<group>"; };
   3.174 +		61299A2D09CA2DAB00B7442F /* SUDSAVerifier.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SUDSAVerifier.h; sourceTree = "<group>"; };
   3.175 +		61299A2E09CA2DAB00B7442F /* SUDSAVerifier.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SUDSAVerifier.m; sourceTree = "<group>"; };
   3.176 +		61299A5B09CA6D4500B7442F /* SUConstants.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SUConstants.h; sourceTree = "<group>"; };
   3.177 +		61299A5F09CA6EB100B7442F /* SUConstants.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SUConstants.m; sourceTree = "<group>"; };
   3.178 +		61299A8B09CA790200B7442F /* SUUnarchiver.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SUUnarchiver.h; sourceTree = "<group>"; };
   3.179 +		61299A8C09CA790200B7442F /* SUUnarchiver.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SUUnarchiver.m; sourceTree = "<group>"; };
   3.180 +		61299B3509CB04E000B7442F /* Sparkle.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Sparkle.h; sourceTree = "<group>"; };
   3.181 +		6129C0B90E0B79810062CE76 /* SUPipedUnarchiver.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SUPipedUnarchiver.m; sourceTree = "<group>"; };
   3.182 +		612DCBAD0D488BC60015DBEA /* SUUpdatePermissionPrompt.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SUUpdatePermissionPrompt.h; sourceTree = "<group>"; };
   3.183 +		612DCBAE0D488BC60015DBEA /* SUUpdatePermissionPrompt.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SUUpdatePermissionPrompt.m; sourceTree = "<group>"; };
   3.184 +		613242130CD06CEF00106AA4 /* relaunch.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = relaunch.m; sourceTree = "<group>"; };
   3.185 +		615AE3CF0D64DC40001CA7BD /* SUModelTranslation.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = SUModelTranslation.plist; sourceTree = "<group>"; };
   3.186 +		618915700E35937600B5E981 /* sv */ = {isa = PBXFileReference; lastKnownFileType = wrapper.nib; name = sv; path = sv.lproj/SUUpdatePermissionPrompt.nib; sourceTree = "<group>"; };
   3.187 +		618915710E35937600B5E981 /* sv */ = {isa = PBXFileReference; lastKnownFileType = wrapper.nib; name = sv; path = sv.lproj/SUUpdateAlert.nib; sourceTree = "<group>"; };
   3.188 +		618915720E35937600B5E981 /* sv */ = {isa = PBXFileReference; lastKnownFileType = wrapper.nib; name = sv; path = sv.lproj/SUAutomaticUpdateAlert.nib; sourceTree = "<group>"; };
   3.189 +		618915730E35937600B5E981 /* sv */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = sv; path = sv.lproj/Sparkle.strings; sourceTree = "<group>"; };
   3.190 +		618E9CFC0E7328F1004646D8 /* dsa_pub.pem */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = dsa_pub.pem; path = "Test Application/dsa_pub.pem"; sourceTree = "<group>"; };
   3.191 +		618FA4FF0DAE88B40026945C /* SUInstaller.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SUInstaller.h; sourceTree = "<group>"; };
   3.192 +		618FA5000DAE88B40026945C /* SUInstaller.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SUInstaller.m; sourceTree = "<group>"; };
   3.193 +		618FA5030DAE8AB80026945C /* SUPlainInstaller.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SUPlainInstaller.h; sourceTree = "<group>"; };
   3.194 +		618FA5040DAE8AB80026945C /* SUPlainInstaller.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SUPlainInstaller.m; sourceTree = "<group>"; };
   3.195 +		618FA5200DAE8E8A0026945C /* SUPackageInstaller.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SUPackageInstaller.h; sourceTree = "<group>"; };
   3.196 +		618FA5210DAE8E8A0026945C /* SUPackageInstaller.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SUPackageInstaller.m; sourceTree = "<group>"; };
   3.197 +		6195D48F0E404AD600D41A50 /* ru */ = {isa = PBXFileReference; lastKnownFileType = wrapper.nib; name = ru; path = ru.lproj/SUUpdatePermissionPrompt.nib; sourceTree = "<group>"; };
   3.198 +		6195D4900E404AD600D41A50 /* ru */ = {isa = PBXFileReference; lastKnownFileType = wrapper.nib; name = ru; path = ru.lproj/SUUpdateAlert.nib; sourceTree = "<group>"; };
   3.199 +		6195D4910E404AD600D41A50 /* ru */ = {isa = PBXFileReference; lastKnownFileType = wrapper.nib; name = ru; path = ru.lproj/SUAutomaticUpdateAlert.nib; sourceTree = "<group>"; };
   3.200 +		6195D4920E404AD700D41A50 /* ru */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ru; path = ru.lproj/Sparkle.strings; sourceTree = "<group>"; };
   3.201 +		6196CFE309C71ADE000DC222 /* SUStatusController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SUStatusController.h; sourceTree = "<group>"; };
   3.202 +		6196CFE409C71ADE000DC222 /* SUStatusController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SUStatusController.m; sourceTree = "<group>"; };
   3.203 +		619B17200E1E9D0800E72754 /* de */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = de; path = de.lproj/Sparkle.strings; sourceTree = "<group>"; };
   3.204 +		619B17210E1E9D0800E72754 /* de */ = {isa = PBXFileReference; lastKnownFileType = wrapper.nib; name = de; path = de.lproj/SUAutomaticUpdateAlert.nib; sourceTree = "<group>"; };
   3.205 +		619B17220E1E9D0800E72754 /* de */ = {isa = PBXFileReference; lastKnownFileType = wrapper.nib; name = de; path = de.lproj/SUUpdateAlert.nib; sourceTree = "<group>"; };
   3.206 +		619B17230E1E9D0800E72754 /* de */ = {isa = PBXFileReference; lastKnownFileType = wrapper.nib; name = de; path = de.lproj/SUUpdatePermissionPrompt.nib; sourceTree = "<group>"; };
   3.207 +		61A2259C0D1C495D00430CCD /* SUVersionComparisonProtocol.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SUVersionComparisonProtocol.h; sourceTree = "<group>"; };
   3.208 +		61A225A20D1C4AC000430CCD /* SUStandardVersionComparator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SUStandardVersionComparator.h; sourceTree = "<group>"; };
   3.209 +		61A225A30D1C4AC000430CCD /* SUStandardVersionComparator.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SUStandardVersionComparator.m; sourceTree = "<group>"; };
   3.210 +		61A2279A0D1CEE7600430CCD /* SUSystemProfiler.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SUSystemProfiler.h; sourceTree = "<group>"; };
   3.211 +		61A2279B0D1CEE7600430CCD /* SUSystemProfiler.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SUSystemProfiler.m; sourceTree = "<group>"; };
   3.212 +		61A354530DF113C70076ECB1 /* SUUserInitiatedUpdateDriver.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SUUserInitiatedUpdateDriver.h; sourceTree = "<group>"; };
   3.213 +		61A354540DF113C70076ECB1 /* SUUserInitiatedUpdateDriver.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SUUserInitiatedUpdateDriver.m; sourceTree = "<group>"; };
   3.214 +		61AAE8230A321A7F00D8810D /* en */ = {isa = PBXFileReference; fileEncoding = 10; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/Sparkle.strings; sourceTree = "<group>"; };
   3.215 +		61AAE8250A321A7F00D8810D /* en */ = {isa = PBXFileReference; lastKnownFileType = wrapper.nib; name = en; path = en.lproj/SUAutomaticUpdateAlert.nib; sourceTree = "<group>"; };
   3.216 +		61AAE8270A321A7F00D8810D /* en */ = {isa = PBXFileReference; lastKnownFileType = wrapper.nib; name = en; path = en.lproj/SUUpdateAlert.nib; sourceTree = "<group>"; };
   3.217 +		61AAE84F0A321AF700D8810D /* es */ = {isa = PBXFileReference; fileEncoding = 10; lastKnownFileType = text.plist.strings; name = es; path = es.lproj/Sparkle.strings; sourceTree = "<group>"; };
   3.218 +		61AAE8590A321B0400D8810D /* fr */ = {isa = PBXFileReference; fileEncoding = 10; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/Sparkle.strings; sourceTree = "<group>"; };
   3.219 +		61AAE8710A321F7700D8810D /* nl */ = {isa = PBXFileReference; fileEncoding = 10; lastKnownFileType = text.plist.strings; name = nl; path = nl.lproj/Sparkle.strings; sourceTree = "<group>"; };
   3.220 +		61B5F8E309C4CE3C00B25A18 /* SUUpdater.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = SUUpdater.h; sourceTree = "<group>"; };
   3.221 +		61B5F8E409C4CE3C00B25A18 /* SUUpdater.m */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.objc; path = SUUpdater.m; sourceTree = "<group>"; };
   3.222 +		61B5F8E509C4CE3C00B25A18 /* SUPlainInstallerInternals.m */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.objc; path = SUPlainInstallerInternals.m; sourceTree = "<group>"; };
   3.223 +		61B5F8F609C4CEB300B25A18 /* Security.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Security.framework; path = /System/Library/Frameworks/Security.framework; sourceTree = "<absolute>"; };
   3.224 +		61B5F90209C4CEE200B25A18 /* Sparkle Test App.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "Sparkle Test App.app"; sourceTree = BUILT_PRODUCTS_DIR; };
   3.225 +		61B5F90409C4CEE200B25A18 /* Test Application-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; name = "Test Application-Info.plist"; path = "Test Application/Test Application-Info.plist"; sourceTree = "<group>"; };
   3.226 +		61B5F92409C4CFC900B25A18 /* main.m */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.objc; name = main.m; path = "Test Application/main.m"; sourceTree = "<group>"; };
   3.227 +		61B5F92B09C4CFD800B25A18 /* English */ = {isa = PBXFileReference; fileEncoding = 10; lastKnownFileType = text.plist.strings; name = English; path = "Test Application/English.lproj/InfoPlist.strings"; sourceTree = "<group>"; };
   3.228 +		61B5F92D09C4CFD800B25A18 /* English */ = {isa = PBXFileReference; lastKnownFileType = wrapper.nib; name = English; path = "Test Application/English.lproj/MainMenu.nib"; sourceTree = "<group>"; };
   3.229 +		61B5FB9409C4F04600B25A18 /* SUAppcast.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SUAppcast.h; sourceTree = "<group>"; };
   3.230 +		61B5FB9509C4F04600B25A18 /* SUAppcast.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SUAppcast.m; sourceTree = "<group>"; };
   3.231 +		61B5FC3F09C4FD4000B25A18 /* WebKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = WebKit.framework; path = /System/Library/Frameworks/WebKit.framework; sourceTree = "<absolute>"; };
   3.232 +		61B5FC5309C5182000B25A18 /* SUAppcastItem.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SUAppcastItem.h; sourceTree = "<group>"; };
   3.233 +		61B5FC5409C5182000B25A18 /* SUAppcastItem.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SUAppcastItem.m; sourceTree = "<group>"; };
   3.234 +		61B5FCA009C5228F00B25A18 /* SUUpdateAlert.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SUUpdateAlert.h; sourceTree = "<group>"; };
   3.235 +		61B5FCA109C5228F00B25A18 /* SUUpdateAlert.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SUUpdateAlert.m; sourceTree = "<group>"; };
   3.236 +		61B93A390DD02D6400DCD2F8 /* SUUIBasedUpdateDriver.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SUUIBasedUpdateDriver.h; sourceTree = "<group>"; };
   3.237 +		61B93A3A0DD02D6400DCD2F8 /* SUUIBasedUpdateDriver.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SUUIBasedUpdateDriver.m; sourceTree = "<group>"; };
   3.238 +		61B93B250DD0FDD300DCD2F8 /* SUAutomaticUpdateDriver.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SUAutomaticUpdateDriver.h; sourceTree = "<group>"; };
   3.239 +		61B93B260DD0FDD300DCD2F8 /* SUAutomaticUpdateDriver.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SUAutomaticUpdateDriver.m; sourceTree = "<group>"; };
   3.240 +		61B93C070DD112FF00DCD2F8 /* SUScheduledUpdateDriver.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SUScheduledUpdateDriver.h; sourceTree = "<group>"; };
   3.241 +		61B93C080DD112FF00DCD2F8 /* SUScheduledUpdateDriver.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SUScheduledUpdateDriver.m; sourceTree = "<group>"; };
   3.242 +		61BBDF810A49220C00378739 /* Sparkle.icns */ = {isa = PBXFileReference; lastKnownFileType = image.icns; path = Sparkle.icns; sourceTree = "<group>"; };
   3.243 +		61C268090E2DB5D000175E6C /* License.txt */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = License.txt; sourceTree = "<group>"; };
   3.244 +		61C46F350D9C54F300B06326 /* en */ = {isa = PBXFileReference; lastKnownFileType = wrapper.nib; name = en; path = en.lproj/SUUpdatePermissionPrompt.nib; sourceTree = "<group>"; };
   3.245 +		61CFB3280E385186007A1735 /* Sparkle.pch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Sparkle.pch; sourceTree = "<group>"; };
   3.246 +		61EF67550E25B58D00F754E0 /* SUHost.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SUHost.m; sourceTree = "<group>"; };
   3.247 +		61EF67580E25C5B400F754E0 /* SUHost.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SUHost.h; sourceTree = "<group>"; };
   3.248 +		61F3651A0E18987B007ECA02 /* es */ = {isa = PBXFileReference; lastKnownFileType = wrapper.nib; name = es; path = es.lproj/SUUpdatePermissionPrompt.nib; sourceTree = "<group>"; };
   3.249 +		61F3652A0E189883007ECA02 /* es */ = {isa = PBXFileReference; lastKnownFileType = wrapper.nib; name = es; path = es.lproj/SUUpdateAlert.nib; sourceTree = "<group>"; };
   3.250 +		61F3652B0E189883007ECA02 /* es */ = {isa = PBXFileReference; lastKnownFileType = wrapper.nib; name = es; path = es.lproj/SUAutomaticUpdateAlert.nib; sourceTree = "<group>"; };
   3.251 +		61F3652E0E18988F007ECA02 /* fr */ = {isa = PBXFileReference; lastKnownFileType = wrapper.nib; name = fr; path = fr.lproj/SUUpdatePermissionPrompt.nib; sourceTree = "<group>"; };
   3.252 +		61F3652F0E18988F007ECA02 /* fr */ = {isa = PBXFileReference; lastKnownFileType = wrapper.nib; name = fr; path = fr.lproj/SUUpdateAlert.nib; sourceTree = "<group>"; };
   3.253 +		61F365300E18988F007ECA02 /* fr */ = {isa = PBXFileReference; lastKnownFileType = wrapper.nib; name = fr; path = fr.lproj/SUAutomaticUpdateAlert.nib; sourceTree = "<group>"; };
   3.254 +		61F365330E1898A3007ECA02 /* nl */ = {isa = PBXFileReference; lastKnownFileType = wrapper.nib; name = nl; path = nl.lproj/SUUpdatePermissionPrompt.nib; sourceTree = "<group>"; };
   3.255 +		61F365340E1898A3007ECA02 /* nl */ = {isa = PBXFileReference; lastKnownFileType = wrapper.nib; name = nl; path = nl.lproj/SUUpdateAlert.nib; sourceTree = "<group>"; };
   3.256 +		61F365350E1898A3007ECA02 /* nl */ = {isa = PBXFileReference; lastKnownFileType = wrapper.nib; name = nl; path = nl.lproj/SUAutomaticUpdateAlert.nib; sourceTree = "<group>"; };
   3.257 +		61F614540E24A12D009F47E7 /* it */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = it; path = it.lproj/Sparkle.strings; sourceTree = "<group>"; };
   3.258 +		61F614550E24A12D009F47E7 /* it */ = {isa = PBXFileReference; lastKnownFileType = wrapper.nib; name = it; path = it.lproj/SUAutomaticUpdateAlert.nib; sourceTree = "<group>"; };
   3.259 +		61F614560E24A12D009F47E7 /* it */ = {isa = PBXFileReference; lastKnownFileType = wrapper.nib; name = it; path = it.lproj/SUUpdateAlert.nib; sourceTree = "<group>"; };
   3.260 +		61F614570E24A12D009F47E7 /* it */ = {isa = PBXFileReference; lastKnownFileType = wrapper.nib; name = it; path = it.lproj/SUUpdatePermissionPrompt.nib; sourceTree = "<group>"; };
   3.261 +		61F83F6F0DBFE137006FDD30 /* SUBasicUpdateDriver.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SUBasicUpdateDriver.h; sourceTree = "<group>"; };
   3.262 +		61F83F700DBFE137006FDD30 /* SUBasicUpdateDriver.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SUBasicUpdateDriver.m; sourceTree = "<group>"; };
   3.263 +		8DC2EF5A0486A6940098B216 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist; path = Info.plist; sourceTree = "<group>"; };
   3.264 +		8DC2EF5B0486A6940098B216 /* Sparkle.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Sparkle.framework; sourceTree = BUILT_PRODUCTS_DIR; };
   3.265 +		DAAEFC960DA571DF0051E0D0 /* relaunch */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = relaunch; sourceTree = BUILT_PRODUCTS_DIR; };
   3.266 +		FA1941CA0D94A70100DD942E /* ConfigFrameworkDebug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = ConfigFrameworkDebug.xcconfig; sourceTree = "<group>"; };
   3.267 +		FA1941CB0D94A70100DD942E /* ConfigTestAppDebug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = ConfigTestAppDebug.xcconfig; sourceTree = "<group>"; };
   3.268 +		FA1941CC0D94A70100DD942E /* ConfigCommonRelease.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = ConfigCommonRelease.xcconfig; sourceTree = "<group>"; };
   3.269 +		FA1941CD0D94A70100DD942E /* ConfigTestApp.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = ConfigTestApp.xcconfig; sourceTree = "<group>"; };
   3.270 +		FA1941CE0D94A70100DD942E /* ConfigRelaunch.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = ConfigRelaunch.xcconfig; sourceTree = "<group>"; };
   3.271 +		FA1941CF0D94A70100DD942E /* ConfigCommonDebug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = ConfigCommonDebug.xcconfig; sourceTree = "<group>"; };
   3.272 +		FA1941D00D94A70100DD942E /* ConfigCommon.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = ConfigCommon.xcconfig; sourceTree = "<group>"; };
   3.273 +		FA1941D10D94A70100DD942E /* ConfigFramework.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = ConfigFramework.xcconfig; sourceTree = "<group>"; };
   3.274 +		FA1941D20D94A70100DD942E /* ConfigTestAppRelease.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = ConfigTestAppRelease.xcconfig; sourceTree = "<group>"; };
   3.275 +		FA1941D30D94A70100DD942E /* ConfigRelaunchDebug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = ConfigRelaunchDebug.xcconfig; sourceTree = "<group>"; };
   3.276 +		FA1941D40D94A70100DD942E /* ConfigRelaunchRelease.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = ConfigRelaunchRelease.xcconfig; sourceTree = "<group>"; };
   3.277 +		FA1941D50D94A70100DD942E /* ConfigFrameworkRelease.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = ConfigFrameworkRelease.xcconfig; sourceTree = "<group>"; };
   3.278 +/* End PBXFileReference section */
   3.279 +
   3.280 +/* Begin PBXFrameworksBuildPhase section */
   3.281 +		612279D60DB5470200AB99EA /* Frameworks */ = {
   3.282 +			isa = PBXFrameworksBuildPhase;
   3.283 +			buildActionMask = 2147483647;
   3.284 +			files = (
   3.285 +				61FA52880E2D9EA400EF58AD /* Sparkle.framework in Frameworks */,
   3.286 +			);
   3.287 +			runOnlyForDeploymentPostprocessing = 0;
   3.288 +		};
   3.289 +		61B5F90009C4CEE200B25A18 /* Frameworks */ = {
   3.290 +			isa = PBXFrameworksBuildPhase;
   3.291 +			buildActionMask = 2147483647;
   3.292 +			files = (
   3.293 +				61B5F90F09C4CF3A00B25A18 /* Sparkle.framework in Frameworks */,
   3.294 +				610D5A1A0A1661B8004AAD9C /* Sparkle.framework in Frameworks */,
   3.295 +				FAEFA3040D94AB3400472538 /* AppKit.framework in Frameworks */,
   3.296 +				FAEFA3050D94AB3400472538 /* Foundation.framework in Frameworks */,
   3.297 +			);
   3.298 +			runOnlyForDeploymentPostprocessing = 0;
   3.299 +		};
   3.300 +		8DC2EF560486A6940098B216 /* Frameworks */ = {
   3.301 +			isa = PBXFrameworksBuildPhase;
   3.302 +			buildActionMask = 2147483647;
   3.303 +			files = (
   3.304 +				61B5F8F709C4CEB300B25A18 /* Security.framework in Frameworks */,
   3.305 +				61B5FC4C09C4FD5E00B25A18 /* WebKit.framework in Frameworks */,
   3.306 +				61177A1F0D1112E900749C97 /* IOKit.framework in Frameworks */,
   3.307 +				FAEFA2F70D94AA7500472538 /* Foundation.framework in Frameworks */,
   3.308 +				FAEFA2F80D94AA7900472538 /* AppKit.framework in Frameworks */,
   3.309 +			);
   3.310 +			runOnlyForDeploymentPostprocessing = 0;
   3.311 +		};
   3.312 +		DAAEFC940DA571DF0051E0D0 /* Frameworks */ = {
   3.313 +			isa = PBXFrameworksBuildPhase;
   3.314 +			buildActionMask = 2147483647;
   3.315 +			files = (
   3.316 +				DAAEFC9B0DA5722F0051E0D0 /* AppKit.framework in Frameworks */,
   3.317 +			);
   3.318 +			runOnlyForDeploymentPostprocessing = 0;
   3.319 +		};
   3.320 +/* End PBXFrameworksBuildPhase section */
   3.321 +
   3.322 +/* Begin PBXGroup section */
   3.323 +		034768DFFF38A50411DB9C8B /* Products */ = {
   3.324 +			isa = PBXGroup;
   3.325 +			children = (
   3.326 +				8DC2EF5B0486A6940098B216 /* Sparkle.framework */,
   3.327 +				61B5F90209C4CEE200B25A18 /* Sparkle Test App.app */,
   3.328 +				DAAEFC960DA571DF0051E0D0 /* relaunch */,
   3.329 +				612279D90DB5470200AB99EA /* Sparkle Unit Tests.octest */,
   3.330 +			);
   3.331 +			name = Products;
   3.332 +			sourceTree = "<group>";
   3.333 +		};
   3.334 +		0867D691FE84028FC02AAC07 /* Sparkle */ = {
   3.335 +			isa = PBXGroup;
   3.336 +			children = (
   3.337 +				61F83F6E0DBFE07A006FDD30 /* Update Control */,
   3.338 +				61299B3909CB055000B7442F /* Appcast Support */,
   3.339 +				618FA6DB0DB485440026945C /* Installation */,
   3.340 +				6101354A0DD25B7F0049ACDF /* Unarchiving */,
   3.341 +				61299B3A09CB056100B7442F /* User Interface */,
   3.342 +				61B5F8F309C4CE5900B25A18 /* Other Sources */,
   3.343 +				089C1665FE841158C02AAC07 /* Framework Resources */,
   3.344 +				61227A100DB5484000AB99EA /* Tests */,
   3.345 +				61B5F91D09C4CF7F00B25A18 /* Test Application Sources */,
   3.346 +				0867D69AFE84028FC02AAC07 /* Apple Frameworks and Libraries */,
   3.347 +				FA1941C40D94A6EA00DD942E /* Configurations */,
   3.348 +				034768DFFF38A50411DB9C8B /* Products */,
   3.349 +			);
   3.350 +			name = Sparkle;
   3.351 +			sourceTree = "<group>";
   3.352 +		};
   3.353 +		0867D69AFE84028FC02AAC07 /* Apple Frameworks and Libraries */ = {
   3.354 +			isa = PBXGroup;
   3.355 +			children = (
   3.356 +				6117796E0D1112E000749C97 /* IOKit.framework */,
   3.357 +				61B5FC3F09C4FD4000B25A18 /* WebKit.framework */,
   3.358 +				61B5F8F609C4CEB300B25A18 /* Security.framework */,
   3.359 +				0867D6A5FE840307C02AAC07 /* AppKit.framework */,
   3.360 +				0867D69BFE84028FC02AAC07 /* Foundation.framework */,
   3.361 +			);
   3.362 +			name = "Apple Frameworks and Libraries";
   3.363 +			sourceTree = "<group>";
   3.364 +		};
   3.365 +		089C1665FE841158C02AAC07 /* Framework Resources */ = {
   3.366 +			isa = PBXGroup;
   3.367 +			children = (
   3.368 +				8DC2EF5A0486A6940098B216 /* Info.plist */,
   3.369 +				615AE3CF0D64DC40001CA7BD /* SUModelTranslation.plist */,
   3.370 +				61C268090E2DB5D000175E6C /* License.txt */,
   3.371 +				61AAE8220A321A7F00D8810D /* Sparkle.strings */,
   3.372 +				61C46F330D9C54F300B06326 /* SUUpdatePermissionPrompt.nib */,
   3.373 +				61AAE8240A321A7F00D8810D /* SUAutomaticUpdateAlert.nib */,
   3.374 +				61AAE8260A321A7F00D8810D /* SUUpdateAlert.nib */,
   3.375 +				610D5A740A1670A4004AAD9C /* SUStatus.nib */,
   3.376 +			);
   3.377 +			name = "Framework Resources";
   3.378 +			sourceTree = "<group>";
   3.379 +		};
   3.380 +		6101354A0DD25B7F0049ACDF /* Unarchiving */ = {
   3.381 +			isa = PBXGroup;
   3.382 +			children = (
   3.383 +				61299A8B09CA790200B7442F /* SUUnarchiver.h */,
   3.384 +				61299A8C09CA790200B7442F /* SUUnarchiver.m */,
   3.385 +				6102FE590E08C7EC00F85D09 /* SUUnarchiver_Private.h */,
   3.386 +				6102FE5A0E08C7EC00F85D09 /* SUUnarchiver_Private.m */,
   3.387 +				6102FE440E077FCE00F85D09 /* SUPipedUnarchiver.h */,
   3.388 +				6129C0B90E0B79810062CE76 /* SUPipedUnarchiver.m */,
   3.389 +				6102FE480E07803800F85D09 /* SUDiskImageUnarchiver.h */,
   3.390 +				6102FE490E07803800F85D09 /* SUDiskImageUnarchiver.m */,
   3.391 +				610EC1C00CF3914D00AE239E /* NTSynchronousTask.h */,
   3.392 +				610EC1BF0CF3914D00AE239E /* NTSynchronousTask.m */,
   3.393 +			);
   3.394 +			name = Unarchiving;
   3.395 +			sourceTree = "<group>";
   3.396 +		};
   3.397 +		6101355D0DD25BB70049ACDF /* Support */ = {
   3.398 +			isa = PBXGroup;
   3.399 +			children = (
   3.400 +				613242130CD06CEF00106AA4 /* relaunch.m */,
   3.401 +			);
   3.402 +			name = Support;
   3.403 +			sourceTree = "<group>";
   3.404 +		};
   3.405 +		61227A100DB5484000AB99EA /* Tests */ = {
   3.406 +			isa = PBXGroup;
   3.407 +			children = (
   3.408 +				61227A140DB548B800AB99EA /* SUVersionComparisonTest.h */,
   3.409 +				61227A150DB548B800AB99EA /* SUVersionComparisonTest.m */,
   3.410 +				612279DA0DB5470200AB99EA /* Sparkle Unit Tests-Info.plist */,
   3.411 +			);
   3.412 +			name = Tests;
   3.413 +			sourceTree = "<group>";
   3.414 +		};
   3.415 +		61299B3909CB055000B7442F /* Appcast Support */ = {
   3.416 +			isa = PBXGroup;
   3.417 +			children = (
   3.418 +				61B5FB9409C4F04600B25A18 /* SUAppcast.h */,
   3.419 +				61B5FB9509C4F04600B25A18 /* SUAppcast.m */,
   3.420 +				61B5FC5309C5182000B25A18 /* SUAppcastItem.h */,
   3.421 +				61B5FC5409C5182000B25A18 /* SUAppcastItem.m */,
   3.422 +				61A2279A0D1CEE7600430CCD /* SUSystemProfiler.h */,
   3.423 +				61A2279B0D1CEE7600430CCD /* SUSystemProfiler.m */,
   3.424 +				61A2259C0D1C495D00430CCD /* SUVersionComparisonProtocol.h */,
   3.425 +				61A225A20D1C4AC000430CCD /* SUStandardVersionComparator.h */,
   3.426 +				61A225A30D1C4AC000430CCD /* SUStandardVersionComparator.m */,
   3.427 +			);
   3.428 +			name = "Appcast Support";
   3.429 +			sourceTree = "<group>";
   3.430 +		};
   3.431 +		61299B3A09CB056100B7442F /* User Interface */ = {
   3.432 +			isa = PBXGroup;
   3.433 +			children = (
   3.434 +				61B5FCA009C5228F00B25A18 /* SUUpdateAlert.h */,
   3.435 +				61B5FCA109C5228F00B25A18 /* SUUpdateAlert.m */,
   3.436 +				6120721009CC5C4B007FE0F6 /* SUAutomaticUpdateAlert.h */,
   3.437 +				6120721109CC5C4B007FE0F6 /* SUAutomaticUpdateAlert.m */,
   3.438 +				6196CFE309C71ADE000DC222 /* SUStatusController.h */,
   3.439 +				6196CFE409C71ADE000DC222 /* SUStatusController.m */,
   3.440 +				612DCBAD0D488BC60015DBEA /* SUUpdatePermissionPrompt.h */,
   3.441 +				612DCBAE0D488BC60015DBEA /* SUUpdatePermissionPrompt.m */,
   3.442 +				61180BC80D64138900B4E0D1 /* SUWindowController.h */,
   3.443 +				61180BC90D64138900B4E0D1 /* SUWindowController.m */,
   3.444 +			);
   3.445 +			name = "User Interface";
   3.446 +			sourceTree = "<group>";
   3.447 +		};
   3.448 +		618FA6DB0DB485440026945C /* Installation */ = {
   3.449 +			isa = PBXGroup;
   3.450 +			children = (
   3.451 +				618FA4FF0DAE88B40026945C /* SUInstaller.h */,
   3.452 +				618FA5000DAE88B40026945C /* SUInstaller.m */,
   3.453 +				618FA5030DAE8AB80026945C /* SUPlainInstaller.h */,
   3.454 +				618FA5040DAE8AB80026945C /* SUPlainInstaller.m */,
   3.455 +				6129984309C9E2DA00B7442F /* SUPlainInstallerInternals.h */,
   3.456 +				61B5F8E509C4CE3C00B25A18 /* SUPlainInstallerInternals.m */,
   3.457 +				618FA5200DAE8E8A0026945C /* SUPackageInstaller.h */,
   3.458 +				618FA5210DAE8E8A0026945C /* SUPackageInstaller.m */,
   3.459 +				6101355D0DD25BB70049ACDF /* Support */,
   3.460 +			);
   3.461 +			name = Installation;
   3.462 +			sourceTree = "<group>";
   3.463 +		};
   3.464 +		61B5F8F309C4CE5900B25A18 /* Other Sources */ = {
   3.465 +			isa = PBXGroup;
   3.466 +			children = (
   3.467 +				61EF67580E25C5B400F754E0 /* SUHost.h */,
   3.468 +				61EF67550E25B58D00F754E0 /* SUHost.m */,
   3.469 +				61299B3509CB04E000B7442F /* Sparkle.h */,
   3.470 +				61CFB3280E385186007A1735 /* Sparkle.pch */,
   3.471 +				61299A5B09CA6D4500B7442F /* SUConstants.h */,
   3.472 +				61299A5F09CA6EB100B7442F /* SUConstants.m */,
   3.473 +			);
   3.474 +			includeInIndex = 1;
   3.475 +			name = "Other Sources";
   3.476 +			sourceTree = "<group>";
   3.477 +		};
   3.478 +		61B5F91D09C4CF7F00B25A18 /* Test Application Sources */ = {
   3.479 +			isa = PBXGroup;
   3.480 +			children = (
   3.481 +				61BBDF810A49220C00378739 /* Sparkle.icns */,
   3.482 +				61B5F92A09C4CFD800B25A18 /* InfoPlist.strings */,
   3.483 +				61B5F92C09C4CFD800B25A18 /* MainMenu.nib */,
   3.484 +				61B5F92409C4CFC900B25A18 /* main.m */,
   3.485 +				61B5F90409C4CEE200B25A18 /* Test Application-Info.plist */,
   3.486 +				618E9CFC0E7328F1004646D8 /* dsa_pub.pem */,
   3.487 +			);
   3.488 +			name = "Test Application Sources";
   3.489 +			sourceTree = "<group>";
   3.490 +		};
   3.491 +		61CFB2C10E384958007A1735 /* Support */ = {
   3.492 +			isa = PBXGroup;
   3.493 +			children = (
   3.494 +				61299A2D09CA2DAB00B7442F /* SUDSAVerifier.h */,
   3.495 +				61299A2E09CA2DAB00B7442F /* SUDSAVerifier.m */,
   3.496 +			);
   3.497 +			name = Support;
   3.498 +			sourceTree = "<group>";
   3.499 +		};
   3.500 +		61CFB2C20E38496B007A1735 /* Drivers */ = {
   3.501 +			isa = PBXGroup;
   3.502 +			children = (
   3.503 +				610134710DD250470049ACDF /* SUUpdateDriver.h */,
   3.504 +				610134720DD250470049ACDF /* SUUpdateDriver.m */,
   3.505 +				61F83F6F0DBFE137006FDD30 /* SUBasicUpdateDriver.h */,
   3.506 +				61F83F700DBFE137006FDD30 /* SUBasicUpdateDriver.m */,
   3.507 +				61B93A390DD02D6400DCD2F8 /* SUUIBasedUpdateDriver.h */,
   3.508 +				61B93A3A0DD02D6400DCD2F8 /* SUUIBasedUpdateDriver.m */,
   3.509 +				61B93B250DD0FDD300DCD2F8 /* SUAutomaticUpdateDriver.h */,
   3.510 +				61B93B260DD0FDD300DCD2F8 /* SUAutomaticUpdateDriver.m */,
   3.511 +				61B93C070DD112FF00DCD2F8 /* SUScheduledUpdateDriver.h */,
   3.512 +				61B93C080DD112FF00DCD2F8 /* SUScheduledUpdateDriver.m */,
   3.513 +				610134790DD2541A0049ACDF /* SUProbingUpdateDriver.h */,
   3.514 +				6101347A0DD2541A0049ACDF /* SUProbingUpdateDriver.m */,
   3.515 +				61A354530DF113C70076ECB1 /* SUUserInitiatedUpdateDriver.h */,
   3.516 +				61A354540DF113C70076ECB1 /* SUUserInitiatedUpdateDriver.m */,
   3.517 +			);
   3.518 +			name = Drivers;
   3.519 +			sourceTree = "<group>";
   3.520 +		};
   3.521 +		61F83F6E0DBFE07A006FDD30 /* Update Control */ = {
   3.522 +			isa = PBXGroup;
   3.523 +			children = (
   3.524 +				61B5F8E309C4CE3C00B25A18 /* SUUpdater.h */,
   3.525 +				61B5F8E409C4CE3C00B25A18 /* SUUpdater.m */,
   3.526 +				61CFB2C20E38496B007A1735 /* Drivers */,
   3.527 +				61CFB2C10E384958007A1735 /* Support */,
   3.528 +			);
   3.529 +			name = "Update Control";
   3.530 +			sourceTree = "<group>";
   3.531 +		};
   3.532 +		FA1941C40D94A6EA00DD942E /* Configurations */ = {
   3.533 +			isa = PBXGroup;
   3.534 +			children = (
   3.535 +				FA1941D00D94A70100DD942E /* ConfigCommon.xcconfig */,
   3.536 +				FA1941CF0D94A70100DD942E /* ConfigCommonDebug.xcconfig */,
   3.537 +				FA1941CC0D94A70100DD942E /* ConfigCommonRelease.xcconfig */,
   3.538 +				FA1941D10D94A70100DD942E /* ConfigFramework.xcconfig */,
   3.539 +				FA1941CA0D94A70100DD942E /* ConfigFrameworkDebug.xcconfig */,
   3.540 +				FA1941D50D94A70100DD942E /* ConfigFrameworkRelease.xcconfig */,
   3.541 +				61072EB20DF2640C008FE88B /* ConfigFrameworkReleaseGCSupport.xcconfig */,
   3.542 +				FA1941CD0D94A70100DD942E /* ConfigTestApp.xcconfig */,
   3.543 +				FA1941CB0D94A70100DD942E /* ConfigTestAppDebug.xcconfig */,
   3.544 +				FA1941D20D94A70100DD942E /* ConfigTestAppRelease.xcconfig */,
   3.545 +				FA1941CE0D94A70100DD942E /* ConfigRelaunch.xcconfig */,
   3.546 +				FA1941D30D94A70100DD942E /* ConfigRelaunchDebug.xcconfig */,
   3.547 +				FA1941D40D94A70100DD942E /* ConfigRelaunchRelease.xcconfig */,
   3.548 +			);
   3.549 +			path = Configurations;
   3.550 +			sourceTree = "<group>";
   3.551 +		};
   3.552 +/* End PBXGroup section */
   3.553 +
   3.554 +/* Begin PBXHeadersBuildPhase section */
   3.555 +		8DC2EF500486A6940098B216 /* Headers */ = {
   3.556 +			isa = PBXHeadersBuildPhase;
   3.557 +			buildActionMask = 2147483647;
   3.558 +			files = (
   3.559 +				61B5F8ED09C4CE3C00B25A18 /* SUUpdater.h in Headers */,
   3.560 +				61B5FC0D09C4FC8200B25A18 /* SUAppcast.h in Headers */,
   3.561 +				61B5FC7009C51F4A00B25A18 /* SUAppcastItem.h in Headers */,
   3.562 +				61B5FCDF09C52A9F00B25A18 /* SUUpdateAlert.h in Headers */,
   3.563 +				6196CFF909C72148000DC222 /* SUStatusController.h in Headers */,
   3.564 +				61299A2F09CA2DAB00B7442F /* SUDSAVerifier.h in Headers */,
   3.565 +				61299A4A09CA2DD000B7442F /* SUPlainInstallerInternals.h in Headers */,
   3.566 +				61299A5C09CA6D4500B7442F /* SUConstants.h in Headers */,
   3.567 +				61299A8D09CA790200B7442F /* SUUnarchiver.h in Headers */,
   3.568 +				61299B3609CB04E000B7442F /* Sparkle.h in Headers */,
   3.569 +				6120721209CC5C4B007FE0F6 /* SUAutomaticUpdateAlert.h in Headers */,
   3.570 +				61A2259E0D1C495D00430CCD /* SUVersionComparisonProtocol.h in Headers */,
   3.571 +				61A225A40D1C4AC000430CCD /* SUStandardVersionComparator.h in Headers */,
   3.572 +				61A2279C0D1CEE7600430CCD /* SUSystemProfiler.h in Headers */,
   3.573 +				6160E7E10D3B4A8800E9CD71 /* NTSynchronousTask.h in Headers */,
   3.574 +				612DCBAF0D488BC60015DBEA /* SUUpdatePermissionPrompt.h in Headers */,
   3.575 +				61180BCA0D64138900B4E0D1 /* SUWindowController.h in Headers */,
   3.576 +				618FA5010DAE88B40026945C /* SUInstaller.h in Headers */,
   3.577 +				618FA5050DAE8AB80026945C /* SUPlainInstaller.h in Headers */,
   3.578 +				618FA5220DAE8E8A0026945C /* SUPackageInstaller.h in Headers */,
   3.579 +				61F83F740DBFE141006FDD30 /* SUBasicUpdateDriver.h in Headers */,
   3.580 +				61B93A3C0DD02D7000DCD2F8 /* SUUIBasedUpdateDriver.h in Headers */,
   3.581 +				61B93B270DD0FDD300DCD2F8 /* SUAutomaticUpdateDriver.h in Headers */,
   3.582 +				61B93C090DD112FF00DCD2F8 /* SUScheduledUpdateDriver.h in Headers */,
   3.583 +				610134730DD250470049ACDF /* SUUpdateDriver.h in Headers */,
   3.584 +				6101347B0DD2541A0049ACDF /* SUProbingUpdateDriver.h in Headers */,
   3.585 +				61699BCC0DDB92BD005878A4 /* SUVersionComparisonTest.h in Headers */,
   3.586 +				61A354550DF113C70076ECB1 /* SUUserInitiatedUpdateDriver.h in Headers */,
   3.587 +				6102FE460E077FCE00F85D09 /* SUPipedUnarchiver.h in Headers */,
   3.588 +				6102FE4A0E07803800F85D09 /* SUDiskImageUnarchiver.h in Headers */,
   3.589 +				6102FE5B0E08C7EC00F85D09 /* SUUnarchiver_Private.h in Headers */,
   3.590 +				61EF67590E25C5B400F754E0 /* SUHost.h in Headers */,
   3.591 +				61CFB3290E385186007A1735 /* Sparkle.pch in Headers */,
   3.592 +			);
   3.593 +			runOnlyForDeploymentPostprocessing = 0;
   3.594 +		};
   3.595 +/* End PBXHeadersBuildPhase section */
   3.596 +
   3.597 +/* Begin PBXNativeTarget section */
   3.598 +		612279D80DB5470200AB99EA /* Sparkle Unit Tests */ = {
   3.599 +			isa = PBXNativeTarget;
   3.600 +			buildConfigurationList = 612279DD0DB5470300AB99EA /* Build configuration list for PBXNativeTarget "Sparkle Unit Tests" */;
   3.601 +			buildPhases = (
   3.602 +				612279D40DB5470200AB99EA /* Resources */,
   3.603 +				612279D50DB5470200AB99EA /* Sources */,
   3.604 +				612279D60DB5470200AB99EA /* Frameworks */,
   3.605 +				612279D70DB5470200AB99EA /* ShellScript */,
   3.606 +			);
   3.607 +			buildRules = (
   3.608 +			);
   3.609 +			dependencies = (
   3.610 +				61FA528D0E2D9EB200EF58AD /* PBXTargetDependency */,
   3.611 +			);
   3.612 +			name = "Sparkle Unit Tests";
   3.613 +			productName = "Sparkle Unit Tests";
   3.614 +			productReference = 612279D90DB5470200AB99EA /* Sparkle Unit Tests.octest */;
   3.615 +			productType = "com.apple.product-type.bundle";
   3.616 +		};
   3.617 +		61B5F90109C4CEE200B25A18 /* Sparkle Test App */ = {
   3.618 +			isa = PBXNativeTarget;
   3.619 +			buildConfigurationList = 61B5F90509C4CEE300B25A18 /* Build configuration list for PBXNativeTarget "Sparkle Test App" */;
   3.620 +			buildPhases = (
   3.621 +				61B5F8FE09C4CEE200B25A18 /* Resources */,
   3.622 +				61B5F8FF09C4CEE200B25A18 /* Sources */,
   3.623 +				61B5F90009C4CEE200B25A18 /* Frameworks */,
   3.624 +				61B5FB4D09C4E9FA00B25A18 /* CopyFiles */,
   3.625 +			);
   3.626 +			buildRules = (
   3.627 +			);
   3.628 +			dependencies = (
   3.629 +				61B5F91C09C4CF7200B25A18 /* PBXTargetDependency */,
   3.630 +				61227ABA0DB5C4BB00AB99EA /* PBXTargetDependency */,
   3.631 +			);
   3.632 +			name = "Sparkle Test App";
   3.633 +			productName = "Test Application";
   3.634 +			productReference = 61B5F90209C4CEE200B25A18 /* Sparkle Test App.app */;
   3.635 +			productType = "com.apple.product-type.application";
   3.636 +		};
   3.637 +		8DC2EF4F0486A6940098B216 /* Sparkle */ = {
   3.638 +			isa = PBXNativeTarget;
   3.639 +			buildConfigurationList = 1DEB91AD08733DA50010E9CD /* Build configuration list for PBXNativeTarget "Sparkle" */;
   3.640 +			buildPhases = (
   3.641 +				8DC2EF500486A6940098B216 /* Headers */,
   3.642 +				8DC2EF520486A6940098B216 /* Resources */,
   3.643 +				8DC2EF540486A6940098B216 /* Sources */,
   3.644 +				8DC2EF560486A6940098B216 /* Frameworks */,
   3.645 +				6131B1910DDCDE32005215F0 /* Run Script: Set Bzr Version Info */,
   3.646 +				6195D4B40E40505A00D41A50 /* Run Script: Link fr_CA to fr */,
   3.647 +			);
   3.648 +			buildRules = (
   3.649 +			);
   3.650 +			dependencies = (
   3.651 +				DAAEFD500DA572460051E0D0 /* PBXTargetDependency */,
   3.652 +			);
   3.653 +			name = Sparkle;
   3.654 +			productInstallPath = "$(HOME)/Library/Frameworks";
   3.655 +			productName = Sparkle;
   3.656 +			productReference = 8DC2EF5B0486A6940098B216 /* Sparkle.framework */;
   3.657 +			productType = "com.apple.product-type.framework";
   3.658 +		};
   3.659 +		DAAEFC950DA571DF0051E0D0 /* relaunch tool */ = {
   3.660 +			isa = PBXNativeTarget;
   3.661 +			buildConfigurationList = DAAEFC9A0DA571FD0051E0D0 /* Build configuration list for PBXNativeTarget "relaunch tool" */;
   3.662 +			buildPhases = (
   3.663 +				DAAEFC930DA571DF0051E0D0 /* Sources */,
   3.664 +				DAAEFC940DA571DF0051E0D0 /* Frameworks */,
   3.665 +			);
   3.666 +			buildRules = (
   3.667 +			);
   3.668 +			dependencies = (
   3.669 +			);
   3.670 +			name = "relaunch tool";
   3.671 +			productName = relaunch;
   3.672 +			productReference = DAAEFC960DA571DF0051E0D0 /* relaunch */;
   3.673 +			productType = "com.apple.product-type.tool";
   3.674 +		};
   3.675 +/* End PBXNativeTarget section */
   3.676 +
   3.677 +/* Begin PBXProject section */
   3.678 +		0867D690FE84028FC02AAC07 /* Project object */ = {
   3.679 +			isa = PBXProject;
   3.680 +			buildConfigurationList = 1DEB91B108733DA50010E9CD /* Build configuration list for PBXProject "Sparkle" */;
   3.681 +			compatibilityVersion = "Xcode 3.0";
   3.682 +			hasScannedForEncodings = 1;
   3.683 +			knownRegions = (
   3.684 +				English,
   3.685 +				Japanese,
   3.686 +				French,
   3.687 +				German,
   3.688 +				Italian,
   3.689 +				zh_TW,
   3.690 +				en,
   3.691 +				ca,
   3.692 +				cs,
   3.693 +				cy,
   3.694 +				da,
   3.695 +				de,
   3.696 +				es,
   3.697 +				fi,
   3.698 +				fr,
   3.699 +				he,
   3.700 +				hu,
   3.701 +				id,
   3.702 +				is,
   3.703 +				it,
   3.704 +				ja,
   3.705 +				ko,
   3.706 +				nl,
   3.707 +				no,
   3.708 +				pl,
   3.709 +				ru,
   3.710 +				sk,
   3.711 +				sv,
   3.712 +				th,
   3.713 +				tr,
   3.714 +				zh_CN,
   3.715 +				fr_ca,
   3.716 +			);
   3.717 +			mainGroup = 0867D691FE84028FC02AAC07 /* Sparkle */;
   3.718 +			productRefGroup = 034768DFFF38A50411DB9C8B /* Products */;
   3.719 +			projectDirPath = "";
   3.720 +			projectRoot = "";
   3.721 +			targets = (
   3.722 +				8DC2EF4F0486A6940098B216 /* Sparkle */,
   3.723 +				61B5F90109C4CEE200B25A18 /* Sparkle Test App */,
   3.724 +				DAAEFC950DA571DF0051E0D0 /* relaunch tool */,
   3.725 +				612279D80DB5470200AB99EA /* Sparkle Unit Tests */,
   3.726 +			);
   3.727 +		};
   3.728 +/* End PBXProject section */
   3.729 +
   3.730 +/* Begin PBXResourcesBuildPhase section */
   3.731 +		612279D40DB5470200AB99EA /* Resources */ = {
   3.732 +			isa = PBXResourcesBuildPhase;
   3.733 +			buildActionMask = 2147483647;
   3.734 +			files = (
   3.735 +			);
   3.736 +			runOnlyForDeploymentPostprocessing = 0;
   3.737 +		};
   3.738 +		61B5F8FE09C4CEE200B25A18 /* Resources */ = {
   3.739 +			isa = PBXResourcesBuildPhase;
   3.740 +			buildActionMask = 2147483647;
   3.741 +			files = (
   3.742 +				61B5F92E09C4CFD800B25A18 /* InfoPlist.strings in Resources */,
   3.743 +				61B5F92F09C4CFD800B25A18 /* MainMenu.nib in Resources */,
   3.744 +				61BBDF820A49220C00378739 /* Sparkle.icns in Resources */,
   3.745 +				618E9CFD0E7328F1004646D8 /* dsa_pub.pem in Resources */,
   3.746 +			);
   3.747 +			runOnlyForDeploymentPostprocessing = 0;
   3.748 +		};
   3.749 +		8DC2EF520486A6940098B216 /* Resources */ = {
   3.750 +			isa = PBXResourcesBuildPhase;
   3.751 +			buildActionMask = 2147483647;
   3.752 +			files = (
   3.753 +				61C2680A0E2DB5D000175E6C /* License.txt in Resources */,
   3.754 +				DAAEFD510DA572550051E0D0 /* relaunch in Resources */,
   3.755 +				610D5A750A1670A4004AAD9C /* SUStatus.nib in Resources */,
   3.756 +				61AAE8280A321A7F00D8810D /* Sparkle.strings in Resources */,
   3.757 +				61AAE8290A321A8000D8810D /* SUAutomaticUpdateAlert.nib in Resources */,
   3.758 +				61AAE82A0A321A8000D8810D /* SUUpdateAlert.nib in Resources */,
   3.759 +				615AE3D00D64DC40001CA7BD /* SUModelTranslation.plist in Resources */,
   3.760 +				61C46F340D9C54F300B06326 /* SUUpdatePermissionPrompt.nib in Resources */,
   3.761 +			);
   3.762 +			runOnlyForDeploymentPostprocessing = 0;
   3.763 +		};
   3.764 +/* End PBXResourcesBuildPhase section */
   3.765 +
   3.766 +/* Begin PBXShellScriptBuildPhase section */
   3.767 +		612279D70DB5470200AB99EA /* ShellScript */ = {
   3.768 +			isa = PBXShellScriptBuildPhase;
   3.769 +			buildActionMask = 2147483647;
   3.770 +			files = (
   3.771 +			);
   3.772 +			inputPaths = (
   3.773 +			);
   3.774 +			outputPaths = (
   3.775 +			);
   3.776 +			runOnlyForDeploymentPostprocessing = 0;
   3.777 +			shellPath = /bin/sh;
   3.778 +			shellScript = "# Run the unit tests in this test bundle.\n\"${SYSTEM_DEVELOPER_DIR}/Tools/RunUnitTests\"\n";
   3.779 +			showEnvVarsInLog = 0;
   3.780 +		};
   3.781 +		6131B1910DDCDE32005215F0 /* Run Script: Set Bzr Version Info */ = {
   3.782 +			isa = PBXShellScriptBuildPhase;
   3.783 +			buildActionMask = 12;
   3.784 +			files = (
   3.785 +			);
   3.786 +			inputPaths = (
   3.787 +			);
   3.788 +			name = "Run Script: Set Bzr Version Info";
   3.789 +			outputPaths = (
   3.790 +			);
   3.791 +			runOnlyForDeploymentPostprocessing = 0;
   3.792 +			shellPath = "/usr/bin/env ruby";
   3.793 +			shellScript = "# Xcode auto-versioning script for Subversion\n# by Axel Andersson, modified by Daniel Jalkut to add\n# \"--revision HEAD\" to the svn info line, which allows\n# the latest revision to always be used.\n\nif ENV[\"BUILT_PRODUCTS_DIR\"].nil?\n\tSTDERR.print \"#{$0}: Must be run from Xcode!\"\n\texit(1)\nend\n\n# Get the current Bzr revision number and use it to set the CFBundleVersion value\nENV[\"PATH\"] = \"/bin:/sw/bin:/usr/bin:/usr/local/bin:/sbin:/usr/sbin:/opt/local/bin\"\nexit(0) if `type bzr` == \"\"\nrev = `/usr/bin/env bzr revno`\ninfo = \"#{ENV[\"BUILT_PRODUCTS_DIR\"]}/#{ENV[\"WRAPPER_NAME\"]}/Resources/Info.plist\"\nversion = rev[/[\\d.]+/]\n\nif version.nil?\n\tSTDERR.print \"#{$0}: Can't find a Bazaar revision!\"\n\texit(0)\nend\n\ninfo_contents = File.read(info)\nif info_contents.nil?\n\tSTDERR.print \"#{$0}: Can't read in the Info.plist file!\"\n\texit(1)\nend\n\ninfo_contents.sub!(/([\\t ]+<key>CFBundleVersion<\\/key>\\n[\\t ]+<string>).*?(<\\/string>)/, '\\1' + version + '\\2')\nSTDERR.print info_contents\nf = File.open(info, \"w\")\nf.write(info_contents)\nf.close";
   3.794 +			showEnvVarsInLog = 0;
   3.795 +		};
   3.796 +		6195D4B40E40505A00D41A50 /* Run Script: Link fr_CA to fr */ = {
   3.797 +			isa = PBXShellScriptBuildPhase;
   3.798 +			buildActionMask = 2147483647;
   3.799 +			files = (
   3.800 +			);
   3.801 +			inputPaths = (
   3.802 +			);
   3.803 +			name = "Run Script: Link fr_CA to fr";
   3.804 +			outputPaths = (
   3.805 +			);
   3.806 +			runOnlyForDeploymentPostprocessing = 0;
   3.807 +			shellPath = "/usr/bin/env ruby";
   3.808 +			shellScript = "resources = \"#{ENV[\"BUILT_PRODUCTS_DIR\"]}/#{ENV[\"WRAPPER_NAME\"]}/Resources\"\n`ln -s \"#{resources}/fr.lproj\" \"#{resources}/fr_CA.lproj\"`";
   3.809 +		};
   3.810 +/* End PBXShellScriptBuildPhase section */
   3.811 +
   3.812 +/* Begin PBXSourcesBuildPhase section */
   3.813 +		612279D50DB5470200AB99EA /* Sources */ = {
   3.814 +			isa = PBXSourcesBuildPhase;
   3.815 +			buildActionMask = 2147483647;
   3.816 +			files = (
   3.817 +				61227A160DB548B800AB99EA /* SUVersionComparisonTest.m in Sources */,
   3.818 +			);
   3.819 +			runOnlyForDeploymentPostprocessing = 0;
   3.820 +		};
   3.821 +		61B5F8FF09C4CEE200B25A18 /* Sources */ = {
   3.822 +			isa = PBXSourcesBuildPhase;
   3.823 +			buildActionMask = 2147483647;
   3.824 +			files = (
   3.825 +				61B5F93009C4CFDC00B25A18 /* main.m in Sources */,
   3.826 +			);
   3.827 +			runOnlyForDeploymentPostprocessing = 0;
   3.828 +		};
   3.829 +		8DC2EF540486A6940098B216 /* Sources */ = {
   3.830 +			isa = PBXSourcesBuildPhase;
   3.831 +			buildActionMask = 2147483647;
   3.832 +			files = (
   3.833 +				61B5F8EE09C4CE3C00B25A18 /* SUUpdater.m in Sources */,
   3.834 +				61B5F8EF09C4CE3C00B25A18 /* SUPlainInstallerInternals.m in Sources */,
   3.835 +				61B5FBB709C4FAFF00B25A18 /* SUAppcast.m in Sources */,
   3.836 +				61B5FC6F09C51F4900B25A18 /* SUAppcastItem.m in Sources */,
   3.837 +				61B5FCDE09C52A9F00B25A18 /* SUUpdateAlert.m in Sources */,
   3.838 +				6196CFFA09C72149000DC222 /* SUStatusController.m in Sources */,
   3.839 +				61299A3009CA2DAB00B7442F /* SUDSAVerifier.m in Sources */,
   3.840 +				61299A6009CA6EB100B7442F /* SUConstants.m in Sources */,
   3.841 +				61299A8E09CA790200B7442F /* SUUnarchiver.m in Sources */,
   3.842 +				6120721309CC5C4B007FE0F6 /* SUAutomaticUpdateAlert.m in Sources */,
   3.843 +				610EC1E00CF3A5FE00AE239E /* NTSynchronousTask.m in Sources */,
   3.844 +				61A225A50D1C4AC000430CCD /* SUStandardVersionComparator.m in Sources */,
   3.845 +				61A2279D0D1CEE7600430CCD /* SUSystemProfiler.m in Sources */,
   3.846 +				612DCBB00D488BC60015DBEA /* SUUpdatePermissionPrompt.m in Sources */,
   3.847 +				61180BCB0D64138900B4E0D1 /* SUWindowController.m in Sources */,
   3.848 +				618FA5020DAE88B40026945C /* SUInstaller.m in Sources */,
   3.849 +				618FA5060DAE8AB80026945C /* SUPlainInstaller.m in Sources */,
   3.850 +				618FA5230DAE8E8A0026945C /* SUPackageInstaller.m in Sources */,
   3.851 +				61F83F720DBFE140006FDD30 /* SUBasicUpdateDriver.m in Sources */,
   3.852 +				61B93A3D0DD02D7000DCD2F8 /* SUUIBasedUpdateDriver.m in Sources */,
   3.853 +				61B93B280DD0FDD300DCD2F8 /* SUAutomaticUpdateDriver.m in Sources */,
   3.854 +				61B93C0A0DD112FF00DCD2F8 /* SUScheduledUpdateDriver.m in Sources */,
   3.855 +				610134740DD250470049ACDF /* SUUpdateDriver.m in Sources */,
   3.856 +				6101347C0DD2541A0049ACDF /* SUProbingUpdateDriver.m in Sources */,
   3.857 +				61A354560DF113C70076ECB1 /* SUUserInitiatedUpdateDriver.m in Sources */,
   3.858 +				6102FE4B0E07803800F85D09 /* SUDiskImageUnarchiver.m in Sources */,
   3.859 +				6102FE5C0E08C7EC00F85D09 /* SUUnarchiver_Private.m in Sources */,
   3.860 +				61D85D6D0E10B2ED00F9B4A9 /* SUPipedUnarchiver.m in Sources */,
   3.861 +				61EF67560E25B58D00F754E0 /* SUHost.m in Sources */,
   3.862 +			);
   3.863 +			runOnlyForDeploymentPostprocessing = 0;
   3.864 +		};
   3.865 +		DAAEFC930DA571DF0051E0D0 /* Sources */ = {
   3.866 +			isa = PBXSourcesBuildPhase;
   3.867 +			buildActionMask = 2147483647;
   3.868 +			files = (
   3.869 +				DAAEFD4E0DA572330051E0D0 /* relaunch.m in Sources */,
   3.870 +			);
   3.871 +			runOnlyForDeploymentPostprocessing = 0;
   3.872 +		};
   3.873 +/* End PBXSourcesBuildPhase section */
   3.874 +
   3.875 +/* Begin PBXTargetDependency section */
   3.876 +		61227ABA0DB5C4BB00AB99EA /* PBXTargetDependency */ = {
   3.877 +			isa = PBXTargetDependency;
   3.878 +			target = 612279D80DB5470200AB99EA /* Sparkle Unit Tests */;
   3.879 +			targetProxy = 61227AB90DB5C4BB00AB99EA /* PBXContainerItemProxy */;
   3.880 +		};
   3.881 +		61B5F91C09C4CF7200B25A18 /* PBXTargetDependency */ = {
   3.882 +			isa = PBXTargetDependency;
   3.883 +			target = 8DC2EF4F0486A6940098B216 /* Sparkle */;
   3.884 +			targetProxy = 61B5F91B09C4CF7200B25A18 /* PBXContainerItemProxy */;
   3.885 +		};
   3.886 +		61FA528D0E2D9EB200EF58AD /* PBXTargetDependency */ = {
   3.887 +			isa = PBXTargetDependency;
   3.888 +			target = 8DC2EF4F0486A6940098B216 /* Sparkle */;
   3.889 +			targetProxy = 61FA528C0E2D9EB200EF58AD /* PBXContainerItemProxy */;
   3.890 +		};
   3.891 +		DAAEFD500DA572460051E0D0 /* PBXTargetDependency */ = {
   3.892 +			isa = PBXTargetDependency;
   3.893 +			target = DAAEFC950DA571DF0051E0D0 /* relaunch tool */;
   3.894 +			targetProxy = DAAEFD4F0DA572460051E0D0 /* PBXContainerItemProxy */;
   3.895 +		};
   3.896 +/* End PBXTargetDependency section */
   3.897 +
   3.898 +/* Begin PBXVariantGroup section */
   3.899 +		61AAE8220A321A7F00D8810D /* Sparkle.strings */ = {
   3.900 +			isa = PBXVariantGroup;
   3.901 +			children = (
   3.902 +				61AAE8230A321A7F00D8810D /* en */,
   3.903 +				61AAE84F0A321AF700D8810D /* es */,
   3.904 +				61AAE8590A321B0400D8810D /* fr */,
   3.905 +				61AAE8710A321F7700D8810D /* nl */,
   3.906 +				619B17200E1E9D0800E72754 /* de */,
   3.907 +				61F614540E24A12D009F47E7 /* it */,
   3.908 +				618915730E35937600B5E981 /* sv */,
   3.909 +				6195D4920E404AD700D41A50 /* ru */,
   3.910 +			);
   3.911 +			name = Sparkle.strings;
   3.912 +			sourceTree = "<group>";
   3.913 +		};
   3.914 +		61AAE8240A321A7F00D8810D /* SUAutomaticUpdateAlert.nib */ = {
   3.915 +			isa = PBXVariantGroup;
   3.916 +			children = (
   3.917 +				61AAE8250A321A7F00D8810D /* en */,
   3.918 +				61F3652B0E189883007ECA02 /* es */,
   3.919 +				61F365300E18988F007ECA02 /* fr */,
   3.920 +				61F365350E1898A3007ECA02 /* nl */,
   3.921 +				619B17210E1E9D0800E72754 /* de */,
   3.922 +				61F614550E24A12D009F47E7 /* it */,
   3.923 +				618915720E35937600B5E981 /* sv */,
   3.924 +				6195D4910E404AD600D41A50 /* ru */,
   3.925 +			);
   3.926 +			name = SUAutomaticUpdateAlert.nib;
   3.927 +			sourceTree = "<group>";
   3.928 +		};
   3.929 +		61AAE8260A321A7F00D8810D /* SUUpdateAlert.nib */ = {
   3.930 +			isa = PBXVariantGroup;
   3.931 +			children = (
   3.932 +				61AAE8270A321A7F00D8810D /* en */,
   3.933 +				61F3652A0E189883007ECA02 /* es */,
   3.934 +				61F3652F0E18988F007ECA02 /* fr */,
   3.935 +				61F365340E1898A3007ECA02 /* nl */,
   3.936 +				619B17220E1E9D0800E72754 /* de */,
   3.937 +				61F614560E24A12D009F47E7 /* it */,
   3.938 +				618915710E35937600B5E981 /* sv */,
   3.939 +				6195D4900E404AD600D41A50 /* ru */,
   3.940 +			);
   3.941 +			name = SUUpdateAlert.nib;
   3.942 +			sourceTree = "<group>";
   3.943 +		};
   3.944 +		61B5F92A09C4CFD800B25A18 /* InfoPlist.strings */ = {
   3.945 +			isa = PBXVariantGroup;
   3.946 +			children = (
   3.947 +				61B5F92B09C4CFD800B25A18 /* English */,
   3.948 +			);
   3.949 +			name = InfoPlist.strings;
   3.950 +			sourceTree = "<group>";
   3.951 +		};
   3.952 +		61B5F92C09C4CFD800B25A18 /* MainMenu.nib */ = {
   3.953 +			isa = PBXVariantGroup;
   3.954 +			children = (
   3.955 +				61B5F92D09C4CFD800B25A18 /* English */,
   3.956 +			);
   3.957 +			name = MainMenu.nib;
   3.958 +			sourceTree = "<group>";
   3.959 +		};
   3.960 +		61C46F330D9C54F300B06326 /* SUUpdatePermissionPrompt.nib */ = {
   3.961 +			isa = PBXVariantGroup;
   3.962 +			children = (
   3.963 +				61C46F350D9C54F300B06326 /* en */,
   3.964 +				61F3651A0E18987B007ECA02 /* es */,
   3.965 +				61F3652E0E18988F007ECA02 /* fr */,
   3.966 +				61F365330E1898A3007ECA02 /* nl */,
   3.967 +				619B17230E1E9D0800E72754 /* de */,
   3.968 +				61F614570E24A12D009F47E7 /* it */,
   3.969 +				618915700E35937600B5E981 /* sv */,
   3.970 +				6195D48F0E404AD600D41A50 /* ru */,
   3.971 +			);
   3.972 +			name = SUUpdatePermissionPrompt.nib;
   3.973 +			sourceTree = "<group>";
   3.974 +		};
   3.975 +/* End PBXVariantGroup section */
   3.976 +
   3.977 +/* Begin XCBuildConfiguration section */
   3.978 +		1DEB91AE08733DA50010E9CD /* Debug */ = {
   3.979 +			isa = XCBuildConfiguration;
   3.980 +			baseConfigurationReference = FA1941CA0D94A70100DD942E /* ConfigFrameworkDebug.xcconfig */;
   3.981 +			buildSettings = {
   3.982 +			};
   3.983 +			name = Debug;
   3.984 +		};
   3.985 +		1DEB91AF08733DA50010E9CD /* Release */ = {
   3.986 +			isa = XCBuildConfiguration;
   3.987 +			baseConfigurationReference = FA1941D50D94A70100DD942E /* ConfigFrameworkRelease.xcconfig */;
   3.988 +			buildSettings = {
   3.989 +				GCC_DEBUGGING_SYMBOLS = full;
   3.990 +			};
   3.991 +			name = Release;
   3.992 +		};
   3.993 +		1DEB91B208733DA50010E9CD /* Debug */ = {
   3.994 +			isa = XCBuildConfiguration;
   3.995 +			buildSettings = {
   3.996 +				WARNING_CFLAGS = "-Wundeclared-selector";
   3.997 +			};
   3.998 +			name = Debug;
   3.999 +		};
  3.1000 +		1DEB91B308733DA50010E9CD /* Release */ = {
  3.1001 +			isa = XCBuildConfiguration;
  3.1002 +			buildSettings = {
  3.1003 +				WARNING_CFLAGS = "-Wundeclared-selector";
  3.1004 +			};
  3.1005 +			name = Release;
  3.1006 +		};
  3.1007 +		61072EAD0DF263BD008FE88B /* Release (GC dual-mode; 10.5-only) */ = {
  3.1008 +			isa = XCBuildConfiguration;
  3.1009 +			buildSettings = {
  3.1010 +				GCC_VERSION = "";
  3.1011 +				WARNING_CFLAGS = "-Wundeclared-selector";
  3.1012 +			};
  3.1013 +			name = "Release (GC dual-mode; 10.5-only)";
  3.1014 +		};
  3.1015 +		61072EAE0DF263BD008FE88B /* Release (GC dual-mode; 10.5-only) */ = {
  3.1016 +			isa = XCBuildConfiguration;
  3.1017 +			baseConfigurationReference = 61072EB20DF2640C008FE88B /* ConfigFrameworkReleaseGCSupport.xcconfig */;
  3.1018 +			buildSettings = {
  3.1019 +				INSTALL_PATH = "@loader_path/../Frameworks";
  3.1020 +			};
  3.1021 +			name = "Release (GC dual-mode; 10.5-only)";
  3.1022 +		};
  3.1023 +		61072EAF0DF263BD008FE88B /* Release (GC dual-mode; 10.5-only) */ = {
  3.1024 +			isa = XCBuildConfiguration;
  3.1025 +			baseConfigurationReference = FA1941D20D94A70100DD942E /* ConfigTestAppRelease.xcconfig */;
  3.1026 +			buildSettings = {
  3.1027 +			};
  3.1028 +			name = "Release (GC dual-mode; 10.5-only)";
  3.1029 +		};
  3.1030 +		61072EB00DF263BD008FE88B /* Release (GC dual-mode; 10.5-only) */ = {
  3.1031 +			isa = XCBuildConfiguration;
  3.1032 +			baseConfigurationReference = FA1941D40D94A70100DD942E /* ConfigRelaunchRelease.xcconfig */;
  3.1033 +			buildSettings = {
  3.1034 +			};
  3.1035 +			name = "Release (GC dual-mode; 10.5-only)";
  3.1036 +		};
  3.1037 +		61072EB10DF263BD008FE88B /* Release (GC dual-mode; 10.5-only) */ = {
  3.1038 +			isa = XCBuildConfiguration;
  3.1039 +			buildSettings = {
  3.1040 +				ALWAYS_SEARCH_USER_PATHS = NO;
  3.1041 +				ARCHS = "$(NATIVE_ARCH)";
  3.1042 +				COPY_PHASE_STRIP = YES;
  3.1043 +				DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
  3.1044 +				FRAMEWORK_SEARCH_PATHS = "$(DEVELOPER_LIBRARY_DIR)/Frameworks";
  3.1045 +				GCC_ENABLE_FIX_AND_CONTINUE = NO;
  3.1046 +				GCC_ENABLE_OBJC_EXCEPTIONS = YES;
  3.1047 +				GCC_MODEL_TUNING = G5;
  3.1048 +				GCC_PRECOMPILE_PREFIX_HEADER = YES;
  3.1049 +				GCC_PREFIX_HEADER = "$(SYSTEM_LIBRARY_DIR)/Frameworks/Cocoa.framework/Headers/Cocoa.h";
  3.1050 +				INFOPLIST_FILE = "Tests/Sparkle Unit Tests-Info.plist";
  3.1051 +				INSTALL_PATH = "$(USER_LIBRARY_DIR)/Bundles";
  3.1052 +				OTHER_LDFLAGS = (
  3.1053 +					"-framework",
  3.1054 +					Cocoa,
  3.1055 +					"-framework",
  3.1056 +					SenTestingKit,
  3.1057 +				);
  3.1058 +				PREBINDING = NO;
  3.1059 +				PRODUCT_NAME = "Sparkle Unit Tests";
  3.1060 +				WRAPPER_EXTENSION = octest;
  3.1061 +				ZERO_LINK = NO;
  3.1062 +			};
  3.1063 +			name = "Release (GC dual-mode; 10.5-only)";
  3.1064 +		};
  3.1065 +		612279DB0DB5470300AB99EA /* Debug */ = {
  3.1066 +			isa = XCBuildConfiguration;
  3.1067 +			buildSettings = {
  3.1068 +				ALWAYS_SEARCH_USER_PATHS = NO;
  3.1069 +				ARCHS = "$(NATIVE_ARCH_ACTUAL)";
  3.1070 +				COPY_PHASE_STRIP = NO;
  3.1071 +				FRAMEWORK_SEARCH_PATHS = "$(DEVELOPER_LIBRARY_DIR)/Frameworks";
  3.1072 +				GCC_DYNAMIC_NO_PIC = NO;
  3.1073 +				GCC_ENABLE_FIX_AND_CONTINUE = NO;
  3.1074 +				GCC_ENABLE_OBJC_EXCEPTIONS = YES;
  3.1075 +				GCC_MODEL_TUNING = G5;
  3.1076 +				GCC_OPTIMIZATION_LEVEL = 0;
  3.1077 +				GCC_PRECOMPILE_PREFIX_HEADER = YES;
  3.1078 +				GCC_PREFIX_HEADER = "$(SYSTEM_LIBRARY_DIR)/Frameworks/Cocoa.framework/Headers/Cocoa.h";
  3.1079 +				INFOPLIST_FILE = "Tests/Sparkle Unit Tests-Info.plist";
  3.1080 +				INSTALL_PATH = "$(USER_LIBRARY_DIR)/Bundles";
  3.1081 +				OTHER_LDFLAGS = (
  3.1082 +					"-framework",
  3.1083 +					Cocoa,
  3.1084 +					"-framework",
  3.1085 +					SenTestingKit,
  3.1086 +				);
  3.1087 +				PREBINDING = NO;
  3.1088 +				PRODUCT_NAME = "Sparkle Unit Tests";
  3.1089 +				WRAPPER_EXTENSION = octest;
  3.1090 +				ZERO_LINK = NO;
  3.1091 +			};
  3.1092 +			name = Debug;
  3.1093 +		};
  3.1094 +		612279DC0DB5470300AB99EA /* Release */ = {
  3.1095 +			isa = XCBuildConfiguration;
  3.1096 +			buildSettings = {
  3.1097 +				ALWAYS_SEARCH_USER_PATHS = NO;
  3.1098 +				ARCHS = "$(NATIVE_ARCH)";
  3.1099 +				COPY_PHASE_STRIP = YES;
  3.1100 +				DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
  3.1101 +				FRAMEWORK_SEARCH_PATHS = "$(DEVELOPER_LIBRARY_DIR)/Frameworks";
  3.1102 +				GCC_ENABLE_FIX_AND_CONTINUE = NO;
  3.1103 +				GCC_ENABLE_OBJC_EXCEPTIONS = YES;
  3.1104 +				GCC_MODEL_TUNING = G5;
  3.1105 +				GCC_PRECOMPILE_PREFIX_HEADER = YES;
  3.1106 +				GCC_PREFIX_HEADER = "$(SYSTEM_LIBRARY_DIR)/Frameworks/Cocoa.framework/Headers/Cocoa.h";
  3.1107 +				INFOPLIST_FILE = "Tests/Sparkle Unit Tests-Info.plist";
  3.1108 +				INSTALL_PATH = "$(USER_LIBRARY_DIR)/Bundles";
  3.1109 +				OTHER_LDFLAGS = (
  3.1110 +					"-framework",
  3.1111 +					Cocoa,
  3.1112 +					"-framework",
  3.1113 +					SenTestingKit,
  3.1114 +				);
  3.1115 +				PREBINDING = NO;
  3.1116 +				PRODUCT_NAME = "Sparkle Unit Tests";
  3.1117 +				WRAPPER_EXTENSION = octest;
  3.1118 +				ZERO_LINK = NO;
  3.1119 +			};
  3.1120 +			name = Release;
  3.1121 +		};
  3.1122 +		61B5F90609C4CEE300B25A18 /* Debug */ = {
  3.1123 +			isa = XCBuildConfiguration;
  3.1124 +			baseConfigurationReference = FA1941CB0D94A70100DD942E /* ConfigTestAppDebug.xcconfig */;
  3.1125 +			buildSettings = {
  3.1126 +			};
  3.1127 +			name = Debug;
  3.1128 +		};
  3.1129 +		61B5F90709C4CEE300B25A18 /* Release */ = {
  3.1130 +			isa = XCBuildConfiguration;
  3.1131 +			baseConfigurationReference = FA1941D20D94A70100DD942E /* ConfigTestAppRelease.xcconfig */;
  3.1132 +			buildSettings = {
  3.1133 +			};
  3.1134 +			name = Release;
  3.1135 +		};
  3.1136 +		DAAEFC980DA571DF0051E0D0 /* Debug */ = {
  3.1137 +			isa = XCBuildConfiguration;
  3.1138 +			baseConfigurationReference = FA1941D30D94A70100DD942E /* ConfigRelaunchDebug.xcconfig */;
  3.1139 +			buildSettings = {
  3.1140 +			};
  3.1141 +			name = Debug;
  3.1142 +		};
  3.1143 +		DAAEFC990DA571DF0051E0D0 /* Release */ = {
  3.1144 +			isa = XCBuildConfiguration;
  3.1145 +			baseConfigurationReference = FA1941D40D94A70100DD942E /* ConfigRelaunchRelease.xcconfig */;
  3.1146 +			buildSettings = {
  3.1147 +			};
  3.1148 +			name = Release;
  3.1149 +		};
  3.1150 +/* End XCBuildConfiguration section */
  3.1151 +
  3.1152 +/* Begin XCConfigurationList section */
  3.1153 +		1DEB91AD08733DA50010E9CD /* Build configuration list for PBXNativeTarget "Sparkle" */ = {
  3.1154 +			isa = XCConfigurationList;
  3.1155 +			buildConfigurations = (
  3.1156 +				1DEB91AE08733DA50010E9CD /* Debug */,
  3.1157 +				1DEB91AF08733DA50010E9CD /* Release */,
  3.1158 +				61072EAE0DF263BD008FE88B /* Release (GC dual-mode; 10.5-only) */,
  3.1159 +			);
  3.1160 +			defaultConfigurationIsVisible = 0;
  3.1161 +			defaultConfigurationName = Release;
  3.1162 +		};
  3.1163 +		1DEB91B108733DA50010E9CD /* Build configuration list for PBXProject "Sparkle" */ = {
  3.1164 +			isa = XCConfigurationList;
  3.1165 +			buildConfigurations = (
  3.1166 +				1DEB91B208733DA50010E9CD /* Debug */,
  3.1167 +				1DEB91B308733DA50010E9CD /* Release */,
  3.1168 +				61072EAD0DF263BD008FE88B /* Release (GC dual-mode; 10.5-only) */,
  3.1169 +			);
  3.1170 +			defaultConfigurationIsVisible = 0;
  3.1171 +			defaultConfigurationName = Release;
  3.1172 +		};
  3.1173 +		612279DD0DB5470300AB99EA /* Build configuration list for PBXNativeTarget "Sparkle Unit Tests" */ = {
  3.1174 +			isa = XCConfigurationList;
  3.1175 +			buildConfigurations = (
  3.1176 +				612279DB0DB5470300AB99EA /* Debug */,
  3.1177 +				612279DC0DB5470300AB99EA /* Release */,
  3.1178 +				61072EB10DF263BD008FE88B /* Release (GC dual-mode; 10.5-only) */,
  3.1179 +			);
  3.1180 +			defaultConfigurationIsVisible = 0;
  3.1181 +			defaultConfigurationName = Release;
  3.1182 +		};
  3.1183 +		61B5F90509C4CEE300B25A18 /* Build configuration list for PBXNativeTarget "Sparkle Test App" */ = {
  3.1184 +			isa = XCConfigurationList;
  3.1185 +			buildConfigurations = (
  3.1186 +				61B5F90609C4CEE300B25A18 /* Debug */,
  3.1187 +				61B5F90709C4CEE300B25A18 /* Release */,
  3.1188 +				61072EAF0DF263BD008FE88B /* Release (GC dual-mode; 10.5-only) */,
  3.1189 +			);
  3.1190 +			defaultConfigurationIsVisible = 0;
  3.1191 +			defaultConfigurationName = Release;
  3.1192 +		};
  3.1193 +		DAAEFC9A0DA571FD0051E0D0 /* Build configuration list for PBXNativeTarget "relaunch tool" */ = {
  3.1194 +			isa = XCConfigurationList;
  3.1195 +			buildConfigurations = (
  3.1196 +				DAAEFC980DA571DF0051E0D0 /* Debug */,
  3.1197 +				DAAEFC990DA571DF0051E0D0 /* Release */,
  3.1198 +				61072EB00DF263BD008FE88B /* Release (GC dual-mode; 10.5-only) */,
  3.1199 +			);
  3.1200 +			defaultConfigurationIsVisible = 0;
  3.1201 +			defaultConfigurationName = Release;
  3.1202 +		};
  3.1203 +/* End XCConfigurationList section */
  3.1204 +	};
  3.1205 +	rootObject = 0867D690FE84028FC02AAC07 /* Project object */;
  3.1206 +}
     4.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     4.2 +++ b/tunblick/Tunnelblick.xcodeproj/project.pbxproj	Wed Jul 29 11:23:17 2009 +0200
     4.3 @@ -0,0 +1,735 @@
     4.4 +// !$*UTF8*$!
     4.5 +{
     4.6 +	archiveVersion = 1;
     4.7 +	classes = {
     4.8 +	};
     4.9 +	objectVersion = 44;
    4.10 +	objects = {
    4.11 +
    4.12 +/* Begin PBXBuildFile section */
    4.13 +		6140EF9A0E3C334E00C5B93A /* openvpn in CopyFiles */ = {isa = PBXBuildFile; fileRef = 6140EF990E3C334800C5B93A /* openvpn */; };
    4.14 +		61492D380E38ED3400BC9C3F /* Sparkle.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 61492D370E38ED3400BC9C3F /* Sparkle.framework */; };
    4.15 +		61492D3B0E38ED3900BC9C3F /* Sparkle.framework in Copy Files */ = {isa = PBXBuildFile; fileRef = 61492D370E38ED3400BC9C3F /* Sparkle.framework */; };
    4.16 +		615F748A0ED3A4C2007F6F0A /* English.lproj in Resources */ = {isa = PBXBuildFile; fileRef = 615F74860ED3A4C2007F6F0A /* English.lproj */; };
    4.17 +		615F748F0ED3A4E5007F6F0A /* French.lproj in Resources */ = {isa = PBXBuildFile; fileRef = 615F748C0ED3A4E5007F6F0A /* French.lproj */; };
    4.18 +		615F74990ED3A4FA007F6F0A /* German.lproj in Resources */ = {isa = PBXBuildFile; fileRef = 615F74900ED3A4FA007F6F0A /* German.lproj */; };
    4.19 +		615F749A0ED3A4FA007F6F0A /* Japanese.lproj in Resources */ = {isa = PBXBuildFile; fileRef = 615F74930ED3A4FA007F6F0A /* Japanese.lproj */; };
    4.20 +		615F749B0ED3A4FA007F6F0A /* Korean.lproj in Resources */ = {isa = PBXBuildFile; fileRef = 615F74960ED3A4FA007F6F0A /* Korean.lproj */; };
    4.21 +		6165CC8C0E9072A5007312DC /* RouteManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 6165CC8B0E9072A5007312DC /* RouteManager.m */; };
    4.22 +		616A49190E38D0DE00477476 /* tap.kext in CopyFiles */ = {isa = PBXBuildFile; fileRef = 616A49090E38D0D400477476 /* tap.kext */; };
    4.23 +		616A491A0E38D0DE00477476 /* tun.kext in CopyFiles */ = {isa = PBXBuildFile; fileRef = 616A490A0E38D0D400477476 /* tun.kext */; };
    4.24 +		6185E7400E76045D0009C2FD /* helper.m in Sources */ = {isa = PBXBuildFile; fileRef = 6185E73F0E76045D0009C2FD /* helper.m */; };
    4.25 +		61BC4B780E2F9EBC00F24255 /* VPNConnection.m in Sources */ = {isa = PBXBuildFile; fileRef = 61BC4B660E2F9EBC00F24255 /* VPNConnection.m */; };
    4.26 +		61BC4B7A0E2F9EBC00F24255 /* NSArray+cArray.m in Sources */ = {isa = PBXBuildFile; fileRef = 61BC4B680E2F9EBC00F24255 /* NSArray+cArray.m */; };
    4.27 +		61BC4B7B0E2F9EBC00F24255 /* MenuController.m in Sources */ = {isa = PBXBuildFile; fileRef = 61BC4B6A0E2F9EBC00F24255 /* MenuController.m */; };
    4.28 +		61BC4B7C0E2F9EBC00F24255 /* NetSocket.m in Sources */ = {isa = PBXBuildFile; fileRef = 61BC4B6C0E2F9EBC00F24255 /* NetSocket.m */; };
    4.29 +		61BC4B7D0E2F9EBC00F24255 /* NetSocket+Text.m in Sources */ = {isa = PBXBuildFile; fileRef = 61BC4B6E0E2F9EBC00F24255 /* NetSocket+Text.m */; };
    4.30 +		61BC4B7E0E2F9EBC00F24255 /* NSApplication+LoginItem.m in Sources */ = {isa = PBXBuildFile; fileRef = 61BC4B700E2F9EBC00F24255 /* NSApplication+LoginItem.m */; };
    4.31 +		61BC4B7F0E2F9EBC00F24255 /* NSApplication+NetworkNotifications.m in Sources */ = {isa = PBXBuildFile; fileRef = 61BC4B720E2F9EBC00F24255 /* NSApplication+NetworkNotifications.m */; };
    4.32 +		61BC4B800E2F9EBC00F24255 /* KeyChain.m in Sources */ = {isa = PBXBuildFile; fileRef = 61BC4B740E2F9EBC00F24255 /* KeyChain.m */; };
    4.33 +		61BC4B810E2F9EBC00F24255 /* AuthAgent.m in Sources */ = {isa = PBXBuildFile; fileRef = 61BC4B770E2F9EBC00F24255 /* AuthAgent.m */; };
    4.34 +		61BC4B910E2F9EDA00F24255 /* UKFNSubscribeFileWatcher.m in Sources */ = {isa = PBXBuildFile; fileRef = 61BC4B8B0E2F9EDA00F24255 /* UKFNSubscribeFileWatcher.m */; };
    4.35 +		61BC4B930E2F9EDA00F24255 /* UKKQueue.m in Sources */ = {isa = PBXBuildFile; fileRef = 61BC4B8E0E2F9EDA00F24255 /* UKKQueue.m */; };
    4.36 +		61BC4B940E2F9EDA00F24255 /* UKMainThreadProxy.m in Sources */ = {isa = PBXBuildFile; fileRef = 61BC4B900E2F9EDA00F24255 /* UKMainThreadProxy.m */; };
    4.37 +		61BC4CDF0E2F9FFA00F24255 /* openvpnstart.m in Sources */ = {isa = PBXBuildFile; fileRef = 61BC4B670E2F9EBC00F24255 /* openvpnstart.m */; };
    4.38 +		61BC4CE10E2FA02800F24255 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 29B97325FDCFA39411CA2CEA /* Foundation.framework */; };
    4.39 +		61BC4D8A0E2FA20800F24255 /* CoreFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 61BC4D880E2FA20800F24255 /* CoreFoundation.framework */; };
    4.40 +		61BC4D8B0E2FA20800F24255 /* Security.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 61BC4D890E2FA20800F24255 /* Security.framework */; };
    4.41 +		61BC4D9E0E2FA2F300F24255 /* installer.m in Sources */ = {isa = PBXBuildFile; fileRef = 61BC4D9D0E2FA2F300F24255 /* installer.m */; };
    4.42 +		61BC4DA00E2FA31F00F24255 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 29B97325FDCFA39411CA2CEA /* Foundation.framework */; };
    4.43 +		61BC4DAB0E2FA33C00F24255 /* installer in CopyFiles */ = {isa = PBXBuildFile; fileRef = 61BC4D6B0E2FA06900F24255 /* installer */; };
    4.44 +		61BC4DAD0E2FA34100F24255 /* openvpnstart in CopyFiles */ = {isa = PBXBuildFile; fileRef = 61BC4BC10E2F9FE900F24255 /* openvpnstart */; };
    4.45 +		61BC4DB30E2FA3C300F24255 /* LogWindow.nib in Resources */ = {isa = PBXBuildFile; fileRef = 61BC4DB10E2FA3C300F24255 /* LogWindow.nib */; };
    4.46 +		61BC4DB40E2FA3C300F24255 /* MainMenu.nib in Resources */ = {isa = PBXBuildFile; fileRef = 61BC4DB20E2FA3C300F24255 /* MainMenu.nib */; };
    4.47 +		61BC4E6F0E2FA8A900F24255 /* 00_closed.tif in Resources */ = {isa = PBXBuildFile; fileRef = 61BC4E690E2FA8A200F24255 /* 00_closed.tif */; };
    4.48 +		61BC4E700E2FA8A900F24255 /* 01.tif in Resources */ = {isa = PBXBuildFile; fileRef = 61BC4E6A0E2FA8A200F24255 /* 01.tif */; };
    4.49 +		61BC4E710E2FA8A900F24255 /* 02.tif in Resources */ = {isa = PBXBuildFile; fileRef = 61BC4E6B0E2FA8A200F24255 /* 02.tif */; };
    4.50 +		61BC4E720E2FA8A900F24255 /* 03.tif in Resources */ = {isa = PBXBuildFile; fileRef = 61BC4E6C0E2FA8A200F24255 /* 03.tif */; };
    4.51 +		61BC4E730E2FA8A900F24255 /* connected.png in Resources */ = {isa = PBXBuildFile; fileRef = 61BC4E6D0E2FA8A200F24255 /* connected.png */; };
    4.52 +		61BC4E740E2FA8A900F24255 /* tunnelblick.icns in Resources */ = {isa = PBXBuildFile; fileRef = 61BC4E6E0E2FA8A200F24255 /* tunnelblick.icns */; };
    4.53 +		61BC4E790E2FA8D600F24255 /* client.down.osx.sh in Resources */ = {isa = PBXBuildFile; fileRef = 61BC4E770E2FA8D000F24255 /* client.down.osx.sh */; };
    4.54 +		61BC4E7A0E2FA8D600F24255 /* client.up.osx.sh in Resources */ = {isa = PBXBuildFile; fileRef = 61BC4E780E2FA8D000F24255 /* client.up.osx.sh */; };
    4.55 +		61C03B990ED4E42A00175F22 /* Norwegian.lproj in Resources */ = {isa = PBXBuildFile; fileRef = 61C03B960ED4E42A00175F22 /* Norwegian.lproj */; };
    4.56 +		61F294A60ED389520097DE94 /* openvpn.conf in Resources */ = {isa = PBXBuildFile; fileRef = 61F294A50ED389520097DE94 /* openvpn.conf */; };
    4.57 +		6337527D101A1EBD00775AA2 /* TBTextView.m in Sources */ = {isa = PBXBuildFile; fileRef = 6337527C101A1EBD00775AA2 /* TBTextView.m */; };
    4.58 +		63E372680FEB3FF00012DDE7 /* leasewatch in Resources */ = {isa = PBXBuildFile; fileRef = 63E372660FEB3FF00012DDE7 /* leasewatch */; };
    4.59 +		63E372690FEB3FF00012DDE7 /* LeaseWatch.plist.template in Resources */ = {isa = PBXBuildFile; fileRef = 63E372670FEB3FF00012DDE7 /* LeaseWatch.plist.template */; };
    4.60 +		8D11072B0486CEB800E47090 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 089C165CFE840E0CC02AAC07 /* InfoPlist.strings */; };
    4.61 +		8D11072D0486CEB800E47090 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 29B97316FDCFA39411CA2CEA /* main.m */; settings = {ATTRIBUTES = (); }; };
    4.62 +		8D11072F0486CEB800E47090 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; };
    4.63 +/* End PBXBuildFile section */
    4.64 +
    4.65 +/* Begin PBXContainerItemProxy section */
    4.66 +		61BC4D950E2FA28700F24255 /* PBXContainerItemProxy */ = {
    4.67 +			isa = PBXContainerItemProxy;
    4.68 +			containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
    4.69 +			proxyType = 1;
    4.70 +			remoteGlobalIDString = 61BC4BC00E2F9FE900F24255;
    4.71 +			remoteInfo = openvpnstart;
    4.72 +		};
    4.73 +		61BC4D970E2FA28700F24255 /* PBXContainerItemProxy */ = {
    4.74 +			isa = PBXContainerItemProxy;
    4.75 +			containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
    4.76 +			proxyType = 1;
    4.77 +			remoteGlobalIDString = 61BC4D6A0E2FA06900F24255;
    4.78 +			remoteInfo = installer;
    4.79 +		};
    4.80 +/* End PBXContainerItemProxy section */
    4.81 +
    4.82 +/* Begin PBXCopyFilesBuildPhase section */
    4.83 +		61BC4D930E2FA26E00F24255 /* CopyFiles */ = {
    4.84 +			isa = PBXCopyFilesBuildPhase;
    4.85 +			buildActionMask = 2147483647;
    4.86 +			dstPath = "";
    4.87 +			dstSubfolderSpec = 7;
    4.88 +			files = (
    4.89 +				6140EF9A0E3C334E00C5B93A /* openvpn in CopyFiles */,
    4.90 +				616A49190E38D0DE00477476 /* tap.kext in CopyFiles */,
    4.91 +				616A491A0E38D0DE00477476 /* tun.kext in CopyFiles */,
    4.92 +				61BC4DAD0E2FA34100F24255 /* openvpnstart in CopyFiles */,
    4.93 +				61BC4DAB0E2FA33C00F24255 /* installer in CopyFiles */,
    4.94 +			);
    4.95 +			runOnlyForDeploymentPostprocessing = 0;
    4.96 +		};
    4.97 +		61C8B0AB0E38E3C100696EE9 /* Copy Files */ = {
    4.98 +			isa = PBXCopyFilesBuildPhase;
    4.99 +			buildActionMask = 2147483647;
   4.100 +			dstPath = "";
   4.101 +			dstSubfolderSpec = 10;
   4.102 +			files = (
   4.103 +				61492D3B0E38ED3900BC9C3F /* Sparkle.framework in Copy Files */,
   4.104 +			);
   4.105 +			name = "Copy Files";
   4.106 +			runOnlyForDeploymentPostprocessing = 0;
   4.107 +		};
   4.108 +/* End PBXCopyFilesBuildPhase section */
   4.109 +
   4.110 +/* Begin PBXFileReference section */
   4.111 +		089C165DFE840E0CC02AAC07 /* English */ = {isa = PBXFileReference; fileEncoding = 10; lastKnownFileType = text.plist.strings; name = English; path = English.lproj/InfoPlist.strings; sourceTree = "<group>"; };
   4.112 +		1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = /System/Library/Frameworks/Cocoa.framework; sourceTree = "<absolute>"; };
   4.113 +		13E42FB307B3F0F600E4EEF1 /* CoreData.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreData.framework; path = /System/Library/Frameworks/CoreData.framework; sourceTree = "<absolute>"; };
   4.114 +		29B97316FDCFA39411CA2CEA /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = "<group>"; };
   4.115 +		29B97324FDCFA39411CA2CEA /* AppKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AppKit.framework; path = /System/Library/Frameworks/AppKit.framework; sourceTree = "<absolute>"; };
   4.116 +		29B97325FDCFA39411CA2CEA /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = /System/Library/Frameworks/Foundation.framework; sourceTree = "<absolute>"; };
   4.117 +		32CA4F630368D1EE00C91783 /* Tunnelblick_Prefix.pch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Tunnelblick_Prefix.pch; sourceTree = "<group>"; };
   4.118 +		6140EF990E3C334800C5B93A /* openvpn */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.executable"; name = openvpn; path = ../third_party/openvpn/openvpn; sourceTree = SOURCE_ROOT; };
   4.119 +		61492D370E38ED3400BC9C3F /* Sparkle.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Sparkle.framework; path = ../third_party/Sparkle.framework; sourceTree = SOURCE_ROOT; };
   4.120 +		615F74860ED3A4C2007F6F0A /* English.lproj */ = {isa = PBXFileReference; lastKnownFileType = folder; path = English.lproj; sourceTree = "<group>"; };
   4.121 +		615F748C0ED3A4E5007F6F0A /* French.lproj */ = {isa = PBXFileReference; lastKnownFileType = folder; path = French.lproj; sourceTree = "<group>"; };
   4.122 +		615F74900ED3A4FA007F6F0A /* German.lproj */ = {isa = PBXFileReference; lastKnownFileType = folder; path = German.lproj; sourceTree = "<group>"; };
   4.123 +		615F74930ED3A4FA007F6F0A /* Japanese.lproj */ = {isa = PBXFileReference; lastKnownFileType = folder; path = Japanese.lproj; sourceTree = "<group>"; };
   4.124 +		615F74960ED3A4FA007F6F0A /* Korean.lproj */ = {isa = PBXFileReference; lastKnownFileType = folder; path = Korean.lproj; sourceTree = "<group>"; };
   4.125 +		6165CC8A0E9072A5007312DC /* RouteManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RouteManager.h; sourceTree = "<group>"; };
   4.126 +		6165CC8B0E9072A5007312DC /* RouteManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = RouteManager.m; sourceTree = "<group>"; };
   4.127 +		616A44E10E38CAA700477476 /* Kernel.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Kernel.framework; path = /System/Library/Frameworks/Kernel.framework; sourceTree = "<absolute>"; };
   4.128 +		616A49090E38D0D400477476 /* tap.kext */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.kernel-extension"; name = tap.kext; path = ../third_party/tuntap/tap.kext; sourceTree = SOURCE_ROOT; };
   4.129 +		616A490A0E38D0D400477476 /* tun.kext */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.kernel-extension"; name = tun.kext; path = ../third_party/tuntap/tun.kext; sourceTree = SOURCE_ROOT; };
   4.130 +		6185E73E0E76045D0009C2FD /* helper.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = helper.h; sourceTree = "<group>"; };
   4.131 +		6185E73F0E76045D0009C2FD /* helper.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = helper.m; sourceTree = "<group>"; };
   4.132 +		61BC4B650E2F9EBC00F24255 /* VPNConnection.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = VPNConnection.h; sourceTree = "<group>"; };
   4.133 +		61BC4B660E2F9EBC00F24255 /* VPNConnection.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = VPNConnection.m; sourceTree = "<group>"; };
   4.134 +		61BC4B670E2F9EBC00F24255 /* openvpnstart.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = openvpnstart.m; sourceTree = "<group>"; };
   4.135 +		61BC4B680E2F9EBC00F24255 /* NSArray+cArray.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSArray+cArray.m"; sourceTree = "<group>"; };
   4.136 +		61BC4B690E2F9EBC00F24255 /* MenuController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MenuController.h; sourceTree = "<group>"; };
   4.137 +		61BC4B6A0E2F9EBC00F24255 /* MenuController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MenuController.m; sourceTree = "<group>"; };
   4.138 +		61BC4B6B0E2F9EBC00F24255 /* NetSocket.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NetSocket.h; sourceTree = "<group>"; };
   4.139 +		61BC4B6C0E2F9EBC00F24255 /* NetSocket.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = NetSocket.m; sourceTree = "<group>"; };
   4.140 +		61BC4B6D0E2F9EBC00F24255 /* NetSocket+Text.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NetSocket+Text.h"; sourceTree = "<group>"; };
   4.141 +		61BC4B6E0E2F9EBC00F24255 /* NetSocket+Text.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NetSocket+Text.m"; sourceTree = "<group>"; };
   4.142 +		61BC4B6F0E2F9EBC00F24255 /* NSApplication+LoginItem.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSApplication+LoginItem.h"; sourceTree = "<group>"; };
   4.143 +		61BC4B700E2F9EBC00F24255 /* NSApplication+LoginItem.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSApplication+LoginItem.m"; sourceTree = "<group>"; };
   4.144 +		61BC4B710E2F9EBC00F24255 /* NSApplication+NetworkNotifications.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSApplication+NetworkNotifications.h"; sourceTree = "<group>"; };
   4.145 +		61BC4B720E2F9EBC00F24255 /* NSApplication+NetworkNotifications.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSApplication+NetworkNotifications.m"; sourceTree = "<group>"; };
   4.146 +		61BC4B730E2F9EBC00F24255 /* NSArray+cArray.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSArray+cArray.h"; sourceTree = "<group>"; };
   4.147 +		61BC4B740E2F9EBC00F24255 /* KeyChain.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = KeyChain.m; sourceTree = "<group>"; };
   4.148 +		61BC4B750E2F9EBC00F24255 /* KeyChain.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = KeyChain.h; sourceTree = "<group>"; };
   4.149 +		61BC4B760E2F9EBC00F24255 /* AuthAgent.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AuthAgent.h; sourceTree = "<group>"; };
   4.150 +		61BC4B770E2F9EBC00F24255 /* AuthAgent.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AuthAgent.m; sourceTree = "<group>"; };
   4.151 +		61BC4B890E2F9EDA00F24255 /* UKFileWatcher.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UKFileWatcher.h; sourceTree = "<group>"; };
   4.152 +		61BC4B8A0E2F9EDA00F24255 /* UKFNSubscribeFileWatcher.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UKFNSubscribeFileWatcher.h; sourceTree = "<group>"; };
   4.153 +		61BC4B8B0E2F9EDA00F24255 /* UKFNSubscribeFileWatcher.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = UKFNSubscribeFileWatcher.m; sourceTree = "<group>"; };
   4.154 +		61BC4B8C0E2F9EDA00F24255 /* UKKQueue Readme.txt */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = "UKKQueue Readme.txt"; sourceTree = "<group>"; };
   4.155 +		61BC4B8D0E2F9EDA00F24255 /* UKKQueue.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UKKQueue.h; sourceTree = "<group>"; };
   4.156 +		61BC4B8E0E2F9EDA00F24255 /* UKKQueue.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = UKKQueue.m; sourceTree = "<group>"; };
   4.157 +		61BC4B8F0E2F9EDA00F24255 /* UKMainThreadProxy.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UKMainThreadProxy.h; sourceTree = "<group>"; };
   4.158 +		61BC4B900E2F9EDA00F24255 /* UKMainThreadProxy.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = UKMainThreadProxy.m; sourceTree = "<group>"; };
   4.159 +		61BC4BC10E2F9FE900F24255 /* openvpnstart */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = openvpnstart; sourceTree = BUILT_PRODUCTS_DIR; };
   4.160 +		61BC4D6B0E2FA06900F24255 /* installer */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = installer; sourceTree = BUILT_PRODUCTS_DIR; };
   4.161 +		61BC4D880E2FA20800F24255 /* CoreFoundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreFoundation.framework; path = /System/Library/Frameworks/CoreFoundation.framework; sourceTree = "<absolute>"; };
   4.162 +		61BC4D890E2FA20800F24255 /* Security.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Security.framework; path = /System/Library/Frameworks/Security.framework; sourceTree = "<absolute>"; };
   4.163 +		61BC4D9C0E2FA2F300F24255 /* installer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = installer.h; sourceTree = "<group>"; };
   4.164 +		61BC4D9D0E2FA2F300F24255 /* installer.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = installer.m; sourceTree = "<group>"; };
   4.165 +		61BC4DB10E2FA3C300F24255 /* LogWindow.nib */ = {isa = PBXFileReference; lastKnownFileType = wrapper.nib; path = LogWindow.nib; sourceTree = "<group>"; };
   4.166 +		61BC4DB20E2FA3C300F24255 /* MainMenu.nib */ = {isa = PBXFileReference; lastKnownFileType = wrapper.nib; path = MainMenu.nib; sourceTree = "<group>"; };
   4.167 +		61BC4DCA0E2FA51E00F24255 /* tun-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "tun-Info.plist"; sourceTree = "<group>"; };
   4.168 +		61BC4DD30E2FA52900F24255 /* tap-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "tap-Info.plist"; sourceTree = "<group>"; };
   4.169 +		61BC4E690E2FA8A200F24255 /* 00_closed.tif */ = {isa = PBXFileReference; lastKnownFileType = image.tiff; path = 00_closed.tif; sourceTree = "<group>"; };
   4.170 +		61BC4E6A0E2FA8A200F24255 /* 01.tif */ = {isa = PBXFileReference; lastKnownFileType = image.tiff; path = 01.tif; sourceTree = "<group>"; };
   4.171 +		61BC4E6B0E2FA8A200F24255 /* 02.tif */ = {isa = PBXFileReference; lastKnownFileType = image.tiff; path = 02.tif; sourceTree = "<group>"; };
   4.172 +		61BC4E6C0E2FA8A200F24255 /* 03.tif */ = {isa = PBXFileReference; lastKnownFileType = image.tiff; path = 03.tif; sourceTree = "<group>"; };
   4.173 +		61BC4E6D0E2FA8A200F24255 /* connected.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = connected.png; sourceTree = "<group>"; };
   4.174 +		61BC4E6E0E2FA8A200F24255 /* tunnelblick.icns */ = {isa = PBXFileReference; lastKnownFileType = image.icns; path = tunnelblick.icns; sourceTree = "<group>"; };
   4.175 +		61BC4E770E2FA8D000F24255 /* client.down.osx.sh */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.sh; path = client.down.osx.sh; sourceTree = "<group>"; };
   4.176 +		61BC4E780E2FA8D000F24255 /* client.up.osx.sh */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.sh; path = client.up.osx.sh; sourceTree = "<group>"; };
   4.177 +		61C03B960ED4E42A00175F22 /* Norwegian.lproj */ = {isa = PBXFileReference; lastKnownFileType = folder; path = Norwegian.lproj; sourceTree = "<group>"; };
   4.178 +		61F294A50ED389520097DE94 /* openvpn.conf */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = openvpn.conf; sourceTree = "<group>"; };
   4.179 +		6337527B101A1EBD00775AA2 /* TBTextView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TBTextView.h; sourceTree = "<group>"; };
   4.180 +		6337527C101A1EBD00775AA2 /* TBTextView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TBTextView.m; sourceTree = "<group>"; };
   4.181 +		63E372660FEB3FF00012DDE7 /* leasewatch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.sh; path = leasewatch; sourceTree = "<group>"; };
   4.182 +		63E372670FEB3FF00012DDE7 /* LeaseWatch.plist.template */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = LeaseWatch.plist.template; sourceTree = "<group>"; };
   4.183 +		8D1107310486CEB800E47090 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
   4.184 +		8D1107320486CEB800E47090 /* Tunnelblick.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Tunnelblick.app; sourceTree = BUILT_PRODUCTS_DIR; };
   4.185 +/* End PBXFileReference section */
   4.186 +
   4.187 +/* Begin PBXFrameworksBuildPhase section */
   4.188 +		61BC4BBF0E2F9FE900F24255 /* Frameworks */ = {
   4.189 +			isa = PBXFrameworksBuildPhase;
   4.190 +			buildActionMask = 2147483647;
   4.191 +			files = (
   4.192 +				61BC4CE10E2FA02800F24255 /* Foundation.framework in Frameworks */,
   4.193 +			);
   4.194 +			runOnlyForDeploymentPostprocessing = 0;
   4.195 +		};
   4.196 +		61BC4D690E2FA06900F24255 /* Frameworks */ = {
   4.197 +			isa = PBXFrameworksBuildPhase;
   4.198 +			buildActionMask = 2147483647;
   4.199 +			files = (
   4.200 +				61BC4DA00E2FA31F00F24255 /* Foundation.framework in Frameworks */,
   4.201 +			);
   4.202 +			runOnlyForDeploymentPostprocessing = 0;
   4.203 +		};
   4.204 +		8D11072E0486CEB800E47090 /* Frameworks */ = {
   4.205 +			isa = PBXFrameworksBuildPhase;
   4.206 +			buildActionMask = 2147483647;
   4.207 +			files = (
   4.208 +				8D11072F0486CEB800E47090 /* Cocoa.framework in Frameworks */,
   4.209 +				61BC4D8A0E2FA20800F24255 /* CoreFoundation.framework in Frameworks */,
   4.210 +				61BC4D8B0E2FA20800F24255 /* Security.framework in Frameworks */,
   4.211 +				61492D380E38ED3400BC9C3F /* Sparkle.framework in Frameworks */,
   4.212 +			);
   4.213 +			runOnlyForDeploymentPostprocessing = 0;
   4.214 +		};
   4.215 +/* End PBXFrameworksBuildPhase section */
   4.216 +
   4.217 +/* Begin PBXGroup section */
   4.218 +		080E96DDFE201D6D7F000001 /* Classes */ = {
   4.219 +			isa = PBXGroup;
   4.220 +			children = (
   4.221 +				61BC4B670E2F9EBC00F24255 /* openvpnstart.m */,
   4.222 +				6337527B101A1EBD00775AA2 /* TBTextView.h */,
   4.223 +				6337527C101A1EBD00775AA2 /* TBTextView.m */,
   4.224 +				61BC4D9C0E2FA2F300F24255 /* installer.h */,
   4.225 +				61BC4D9D0E2FA2F300F24255 /* installer.m */,
   4.226 +				61BC4B880E2F9EDA00F24255 /* UKKQueue */,
   4.227 +				61BC4B650E2F9EBC00F24255 /* VPNConnection.h */,
   4.228 +				61BC4B660E2F9EBC00F24255 /* VPNConnection.m */,
   4.229 +				61BC4B680E2F9EBC00F24255 /* NSArray+cArray.m */,
   4.230 +				61BC4B690E2F9EBC00F24255 /* MenuController.h */,
   4.231 +				61BC4B6A0E2F9EBC00F24255 /* MenuController.m */,
   4.232 +				61BC4B6B0E2F9EBC00F24255 /* NetSocket.h */,
   4.233 +				61BC4B6C0E2F9EBC00F24255 /* NetSocket.m */,
   4.234 +				61BC4B6D0E2F9EBC00F24255 /* NetSocket+Text.h */,
   4.235 +				61BC4B6E0E2F9EBC00F24255 /* NetSocket+Text.m */,
   4.236 +				61BC4B6F0E2F9EBC00F24255 /* NSApplication+LoginItem.h */,
   4.237 +				61BC4B700E2F9EBC00F24255 /* NSApplication+LoginItem.m */,
   4.238 +				61BC4B710E2F9EBC00F24255 /* NSApplication+NetworkNotifications.h */,
   4.239 +				61BC4B720E2F9EBC00F24255 /* NSApplication+NetworkNotifications.m */,
   4.240 +				61BC4B730E2F9EBC00F24255 /* NSArray+cArray.h */,
   4.241 +				61BC4B740E2F9EBC00F24255 /* KeyChain.m */,
   4.242 +				61BC4B750E2F9EBC00F24255 /* KeyChain.h */,
   4.243 +				61BC4B760E2F9EBC00F24255 /* AuthAgent.h */,
   4.244 +				61BC4B770E2F9EBC00F24255 /* AuthAgent.m */,
   4.245 +				6185E73E0E76045D0009C2FD /* helper.h */,
   4.246 +				6185E73F0E76045D0009C2FD /* helper.m */,
   4.247 +			);
   4.248 +			name = Classes;
   4.249 +			sourceTree = "<group>";
   4.250 +		};
   4.251 +		1058C7A0FEA54F0111CA2CBB /* Linked Frameworks */ = {
   4.252 +			isa = PBXGroup;
   4.253 +			children = (
   4.254 +				61492D370E38ED3400BC9C3F /* Sparkle.framework */,
   4.255 +				616A44E10E38CAA700477476 /* Kernel.framework */,
   4.256 +				61BC4D880E2FA20800F24255 /* CoreFoundation.framework */,
   4.257 +				61BC4D890E2FA20800F24255 /* Security.framework */,
   4.258 +				1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */,
   4.259 +			);
   4.260 +			name = "Linked Frameworks";
   4.261 +			sourceTree = "<group>";
   4.262 +		};
   4.263 +		1058C7A2FEA54F0111CA2CBB /* Other Frameworks */ = {
   4.264 +			isa = PBXGroup;
   4.265 +			children = (
   4.266 +				29B97324FDCFA39411CA2CEA /* AppKit.framework */,
   4.267 +				13E42FB307B3F0F600E4EEF1 /* CoreData.framework */,
   4.268 +				29B97325FDCFA39411CA2CEA /* Foundation.framework */,
   4.269 +			);
   4.270 +			name = "Other Frameworks";
   4.271 +			sourceTree = "<group>";
   4.272 +		};
   4.273 +		19C28FACFE9D520D11CA2CBB /* Products */ = {
   4.274 +			isa = PBXGroup;
   4.275 +			children = (
   4.276 +				8D1107320486CEB800E47090 /* Tunnelblick.app */,
   4.277 +				61BC4BC10E2F9FE900F24255 /* openvpnstart */,
   4.278 +				61BC4D6B0E2FA06900F24255 /* installer */,
   4.279 +			);
   4.280 +			name = Products;
   4.281 +			sourceTree = "<group>";
   4.282 +		};
   4.283 +		29B97314FDCFA39411CA2CEA /* Tunnelblick */ = {
   4.284 +			isa = PBXGroup;
   4.285 +			children = (
   4.286 +				080E96DDFE201D6D7F000001 /* Classes */,
   4.287 +				29B97315FDCFA39411CA2CEA /* Other Sources */,
   4.288 +				29B97317FDCFA39411CA2CEA /* Resources */,
   4.289 +				29B97323FDCFA39411CA2CEA /* Frameworks */,
   4.290 +				19C28FACFE9D520D11CA2CBB /* Products */,
   4.291 +				61BC4DCA0E2FA51E00F24255 /* tun-Info.plist */,
   4.292 +				61BC4DD30E2FA52900F24255 /* tap-Info.plist */,
   4.293 +				6165CC8A0E9072A5007312DC /* RouteManager.h */,
   4.294 +				6165CC8B0E9072A5007312DC /* RouteManager.m */,
   4.295 +			);
   4.296 +			name = Tunnelblick;
   4.297 +			sourceTree = "<group>";
   4.298 +		};
   4.299 +		29B97315FDCFA39411CA2CEA /* Other Sources */ = {
   4.300 +			isa = PBXGroup;
   4.301 +			children = (
   4.302 +				61F294A50ED389520097DE94 /* openvpn.conf */,
   4.303 +				6140EF990E3C334800C5B93A /* openvpn */,
   4.304 +				61BC4E770E2FA8D000F24255 /* client.down.osx.sh */,
   4.305 +				61BC4E780E2FA8D000F24255 /* client.up.osx.sh */,
   4.306 +				32CA4F630368D1EE00C91783 /* Tunnelblick_Prefix.pch */,
   4.307 +				29B97316FDCFA39411CA2CEA /* main.m */,
   4.308 +			);
   4.309 +			name = "Other Sources";
   4.310 +			sourceTree = "<group>";
   4.311 +		};
   4.312 +		29B97317FDCFA39411CA2CEA /* Resources */ = {
   4.313 +			isa = PBXGroup;
   4.314 +			children = (
   4.315 +				63E372660FEB3FF00012DDE7 /* leasewatch */,
   4.316 +				63E372670FEB3FF00012DDE7 /* LeaseWatch.plist.template */,
   4.317 +				616A49090E38D0D400477476 /* tap.kext */,
   4.318 +				616A490A0E38D0D400477476 /* tun.kext */,
   4.319 +				61C03B960ED4E42A00175F22 /* Norwegian.lproj */,
   4.320 +				615F74900ED3A4FA007F6F0A /* German.lproj */,
   4.321 +				615F74930ED3A4FA007F6F0A /* Japanese.lproj */,
   4.322 +				615F74960ED3A4FA007F6F0A /* Korean.lproj */,
   4.323 +				615F748C0ED3A4E5007F6F0A /* French.lproj */,
   4.324 +				615F74860ED3A4C2007F6F0A /* English.lproj */,
   4.325 +				61BC4E690E2FA8A200F24255 /* 00_closed.tif */,
   4.326 +				61BC4E6A0E2FA8A200F24255 /* 01.tif */,
   4.327 +				61BC4E6B0E2FA8A200F24255 /* 02.tif */,
   4.328 +				61BC4E6C0E2FA8A200F24255 /* 03.tif */,
   4.329 +				61BC4E6D0E2FA8A200F24255 /* connected.png */,
   4.330 +				61BC4E6E0E2FA8A200F24255 /* tunnelblick.icns */,
   4.331 +				61BC4DB10E2FA3C300F24255 /* LogWindow.nib */,
   4.332 +				61BC4DB20E2FA3C300F24255 /* MainMenu.nib */,
   4.333 +				8D1107310486CEB800E47090 /* Info.plist */,
   4.334 +				089C165CFE840E0CC02AAC07 /* InfoPlist.strings */,
   4.335 +			);
   4.336 +			name = Resources;
   4.337 +			sourceTree = "<group>";
   4.338 +		};
   4.339 +		29B97323FDCFA39411CA2CEA /* Frameworks */ = {
   4.340 +			isa = PBXGroup;
   4.341 +			children = (
   4.342 +				1058C7A0FEA54F0111CA2CBB /* Linked Frameworks */,
   4.343 +				1058C7A2FEA54F0111CA2CBB /* Other Frameworks */,
   4.344 +			);
   4.345 +			name = Frameworks;
   4.346 +			sourceTree = "<group>";
   4.347 +		};
   4.348 +		61BC4B880E2F9EDA00F24255 /* UKKQueue */ = {
   4.349 +			isa = PBXGroup;
   4.350 +			children = (
   4.351 +				61BC4B890E2F9EDA00F24255 /* UKFileWatcher.h */,
   4.352 +				61BC4B8A0E2F9EDA00F24255 /* UKFNSubscribeFileWatcher.h */,
   4.353 +				61BC4B8B0E2F9EDA00F24255 /* UKFNSubscribeFileWatcher.m */,
   4.354 +				61BC4B8C0E2F9EDA00F24255 /* UKKQueue Readme.txt */,
   4.355 +				61BC4B8D0E2F9EDA00F24255 /* UKKQueue.h */,
   4.356 +				61BC4B8E0E2F9EDA00F24255 /* UKKQueue.m */,
   4.357 +				61BC4B8F0E2F9EDA00F24255 /* UKMainThreadProxy.h */,
   4.358 +				61BC4B900E2F9EDA00F24255 /* UKMainThreadProxy.m */,
   4.359 +			);
   4.360 +			path = UKKQueue;
   4.361 +			sourceTree = "<group>";
   4.362 +		};
   4.363 +/* End PBXGroup section */
   4.364 +
   4.365 +/* Begin PBXNativeTarget section */
   4.366 +		61BC4BC00E2F9FE900F24255 /* openvpnstart */ = {
   4.367 +			isa = PBXNativeTarget;
   4.368 +			buildConfigurationList = 61BC4CDE0E2F9FF400F24255 /* Build configuration list for PBXNativeTarget "openvpnstart" */;
   4.369 +			buildPhases = (
   4.370 +				61BC4BBE0E2F9FE900F24255 /* Sources */,
   4.371 +				61BC4BBF0E2F9FE900F24255 /* Frameworks */,
   4.372 +			);
   4.373 +			buildRules = (
   4.374 +			);
   4.375 +			dependencies = (
   4.376 +			);
   4.377 +			name = openvpnstart;
   4.378 +			productName = openvpnstart;
   4.379 +			productReference = 61BC4BC10E2F9FE900F24255 /* openvpnstart */;
   4.380 +			productType = "com.apple.product-type.tool";
   4.381 +		};
   4.382 +		61BC4D6A0E2FA06900F24255 /* installer */ = {
   4.383 +			isa = PBXNativeTarget;
   4.384 +			buildConfigurationList = 61BC4D6F0E2FA08700F24255 /* Build configuration list for PBXNativeTarget "installer" */;
   4.385 +			buildPhases = (
   4.386 +				61BC4D680E2FA06900F24255 /* Sources */,
   4.387 +				61BC4D690E2FA06900F24255 /* Frameworks */,
   4.388 +			);
   4.389 +			buildRules = (
   4.390 +			);
   4.391 +			dependencies = (
   4.392 +			);
   4.393 +			name = installer;
   4.394 +			productName = installer;
   4.395 +			productReference = 61BC4D6B0E2FA06900F24255 /* installer */;
   4.396 +			productType = "com.apple.product-type.tool";
   4.397 +		};
   4.398 +		8D1107260486CEB800E47090 /* Tunnelblick */ = {
   4.399 +			isa = PBXNativeTarget;
   4.400 +			buildConfigurationList = C01FCF4A08A954540054247B /* Build configuration list for PBXNativeTarget "Tunnelblick" */;
   4.401 +			buildPhases = (
   4.402 +				616A49200E38D17500477476 /* ShellScript */,
   4.403 +				8D1107290486CEB800E47090 /* Resources */,
   4.404 +				8D11072C0486CEB800E47090 /* Sources */,
   4.405 +				8D11072E0486CEB800E47090 /* Frameworks */,
   4.406 +				61BC4D930E2FA26E00F24255 /* CopyFiles */,
   4.407 +				61C8B0AB0E38E3C100696EE9 /* Copy Files */,
   4.408 +				610AEAE70E2FE63900EA3C79 /* ShellScript */,
   4.409 +			);
   4.410 +			buildRules = (
   4.411 +			);
   4.412 +			dependencies = (
   4.413 +				61BC4D960E2FA28700F24255 /* PBXTargetDependency */,
   4.414 +				61BC4D980E2FA28700F24255 /* PBXTargetDependency */,
   4.415 +			);
   4.416 +			name = Tunnelblick;
   4.417 +			productInstallPath = "$(HOME)/Applications";
   4.418 +			productName = Tunnelblick;
   4.419 +			productReference = 8D1107320486CEB800E47090 /* Tunnelblick.app */;
   4.420 +			productType = "com.apple.product-type.application";
   4.421 +		};
   4.422 +/* End PBXNativeTarget section */
   4.423 +
   4.424 +/* Begin PBXProject section */
   4.425 +		29B97313FDCFA39411CA2CEA /* Project object */ = {
   4.426 +			isa = PBXProject;
   4.427 +			buildConfigurationList = C01FCF4E08A954540054247B /* Build configuration list for PBXProject "Tunnelblick" */;
   4.428 +			compatibilityVersion = "Xcode 3.0";
   4.429 +			hasScannedForEncodings = 1;
   4.430 +			knownRegions = (
   4.431 +				English,
   4.432 +				Japanese,
   4.433 +				French,
   4.434 +				German,
   4.435 +				Korean,
   4.436 +			);
   4.437 +			mainGroup = 29B97314FDCFA39411CA2CEA /* Tunnelblick */;
   4.438 +			projectDirPath = "";
   4.439 +			projectRoot = "";
   4.440 +			targets = (
   4.441 +				8D1107260486CEB800E47090 /* Tunnelblick */,
   4.442 +				61BC4BC00E2F9FE900F24255 /* openvpnstart */,
   4.443 +				61BC4D6A0E2FA06900F24255 /* installer */,
   4.444 +			);
   4.445 +		};
   4.446 +/* End PBXProject section */
   4.447 +
   4.448 +/* Begin PBXResourcesBuildPhase section */
   4.449 +		8D1107290486CEB800E47090 /* Resources */ = {
   4.450 +			isa = PBXResourcesBuildPhase;
   4.451 +			buildActionMask = 2147483647;
   4.452 +			files = (
   4.453 +				61BC4E790E2FA8D600F24255 /* client.down.osx.sh in Resources */,
   4.454 +				61BC4E7A0E2FA8D600F24255 /* client.up.osx.sh in Resources */,
   4.455 +				61BC4E6F0E2FA8A900F24255 /* 00_closed.tif in Resources */,
   4.456 +				61BC4E700E2FA8A900F24255 /* 01.tif in Resources */,
   4.457 +				61BC4E710E2FA8A900F24255 /* 02.tif in Resources */,
   4.458 +				61BC4E720E2FA8A900F24255 /* 03.tif in Resources */,
   4.459 +				61BC4E730E2FA8A900F24255 /* connected.png in Resources */,
   4.460 +				61BC4E740E2FA8A900F24255 /* tunnelblick.icns in Resources */,
   4.461 +				8D11072B0486CEB800E47090 /* InfoPlist.strings in Resources */,
   4.462 +				61BC4DB30E2FA3C300F24255 /* LogWindow.nib in Resources */,
   4.463 +				61BC4DB40E2FA3C300F24255 /* MainMenu.nib in Resources */,
   4.464 +				61F294A60ED389520097DE94 /* openvpn.conf in Resources */,
   4.465 +				615F748A0ED3A4C2007F6F0A /* English.lproj in Resources */,
   4.466 +				615F748F0ED3A4E5007F6F0A /* French.lproj in Resources */,
   4.467 +				615F74990ED3A4FA007F6F0A /* German.lproj in Resources */,
   4.468 +				615F749A0ED3A4FA007F6F0A /* Japanese.lproj in Resources */,
   4.469 +				615F749B0ED3A4FA007F6F0A /* Korean.lproj in Resources */,
   4.470 +				61C03B990ED4E42A00175F22 /* Norwegian.lproj in Resources */,
   4.471 +				63E372680FEB3FF00012DDE7 /* leasewatch in Resources */,
   4.472 +				63E372690FEB3FF00012DDE7 /* LeaseWatch.plist.template in Resources */,
   4.473 +			);
   4.474 +			runOnlyForDeploymentPostprocessing = 0;
   4.475 +		};
   4.476 +/* End PBXResourcesBuildPhase section */
   4.477 +
   4.478 +/* Begin PBXShellScriptBuildPhase section */
   4.479 +		610AEAE70E2FE63900EA3C79 /* ShellScript */ = {
   4.480 +			isa = PBXShellScriptBuildPhase;
   4.481 +			buildActionMask = 2147483647;
   4.482 +			files = (
   4.483 +			);
   4.484 +			inputPaths = (
   4.485 +			);
   4.486 +			outputPaths = (
   4.487 +			);
   4.488 +			runOnlyForDeploymentPostprocessing = 0;
   4.489 +			shellPath = /bin/sh;
   4.490 +			shellScript = "TMPDMG=build/Release/Tunnelblick\nrm -rf $TMPDMG\nmkdir -p $TMPDMG\nmv build/Release/Tunnelblick.app $TMPDMG\nln -s /Applications/ $TMPDMG/Applications\ncp using-tunnelblick.html \"$TMPDMG/Using Tunnelblick.html\"\nmkdir $TMPDMG/using-tunnelblick-files\ncp using-tunnelblick-files/* $TMPDMG/using-tunnelblick-files\n# Here's where we'll make the dmg\nrm -rf build/Release/Tunnelblick.dmg\nhdiutil create -scrub -srcfolder $TMPDMG build/Release/Tunnelblick.dmg";
   4.491 +		};
   4.492 +		616A49200E38D17500477476 /* ShellScript */ = {
   4.493 +			isa = PBXShellScriptBuildPhase;
   4.494 +			buildActionMask = 2147483647;
   4.495 +			files = (
   4.496 +			);
   4.497 +			inputPaths = (
   4.498 +			);
   4.499 +			outputPaths = (
   4.500 +			);
   4.501 +			runOnlyForDeploymentPostprocessing = 0;
   4.502 +			shellPath = /bin/sh;
   4.503 +			shellScript = "BUILDDIR=../third_party/\ncd $BUILDDIR\n\nif [ -e built ]; then\n\texit 0\nfi\n\nmake clean\nmake\n\ntouch built";
   4.504 +		};
   4.505 +/* End PBXShellScriptBuildPhase section */
   4.506 +
   4.507 +/* Begin PBXSourcesBuildPhase section */
   4.508 +		61BC4BBE0E2F9FE900F24255 /* Sources */ = {
   4.509 +			isa = PBXSourcesBuildPhase;
   4.510 +			buildActionMask = 2147483647;
   4.511 +			files = (
   4.512 +				61BC4CDF0E2F9FFA00F24255 /* openvpnstart.m in Sources */,
   4.513 +			);
   4.514 +			runOnlyForDeploymentPostprocessing = 0;
   4.515 +		};
   4.516 +		61BC4D680E2FA06900F24255 /* Sources */ = {
   4.517 +			isa = PBXSourcesBuildPhase;
   4.518 +			buildActionMask = 2147483647;
   4.519 +			files = (
   4.520 +				61BC4D9E0E2FA2F300F24255 /* installer.m in Sources */,
   4.521 +			);
   4.522 +			runOnlyForDeploymentPostprocessing = 0;
   4.523 +		};
   4.524 +		8D11072C0486CEB800E47090 /* Sources */ = {
   4.525 +			isa = PBXSourcesBuildPhase;
   4.526 +			buildActionMask = 2147483647;
   4.527 +			files = (
   4.528 +				8D11072D0486CEB800E47090 /* main.m in Sources */,
   4.529 +				61BC4B780E2F9EBC00F24255 /* VPNConnection.m in Sources */,
   4.530 +				61BC4B7A0E2F9EBC00F24255 /* NSArray+cArray.m in Sources */,
   4.531 +				61BC4B7B0E2F9EBC00F24255 /* MenuController.m in Sources */,
   4.532 +				61BC4B7C0E2F9EBC00F24255 /* NetSocket.m in Sources */,
   4.533 +				61BC4B7D0E2F9EBC00F24255 /* NetSocket+Text.m in Sources */,
   4.534 +				61BC4B7E0E2F9EBC00F24255 /* NSApplication+LoginItem.m in Sources */,
   4.535 +				61BC4B7F0E2F9EBC00F24255 /* NSApplication+NetworkNotifications.m in Sources */,
   4.536 +				61BC4B800E2F9EBC00F24255 /* KeyChain.m in Sources */,
   4.537 +				61BC4B810E2F9EBC00F24255 /* AuthAgent.m in Sources */,
   4.538 +				61BC4B910E2F9EDA00F24255 /* UKFNSubscribeFileWatcher.m in Sources */,
   4.539 +				61BC4B930E2F9EDA00F24255 /* UKKQueue.m in Sources */,
   4.540 +				61BC4B940E2F9EDA00F24255 /* UKMainThreadProxy.m in Sources */,
   4.541 +				6185E7400E76045D0009C2FD /* helper.m in Sources */,
   4.542 +				6165CC8C0E9072A5007312DC /* RouteManager.m in Sources */,
   4.543 +				6337527D101A1EBD00775AA2 /* TBTextView.m in Sources */,
   4.544 +			);
   4.545 +			runOnlyForDeploymentPostprocessing = 0;
   4.546 +		};
   4.547 +/* End PBXSourcesBuildPhase section */
   4.548 +
   4.549 +/* Begin PBXTargetDependency section */
   4.550 +		61BC4D960E2FA28700F24255 /* PBXTargetDependency */ = {
   4.551 +			isa = PBXTargetDependency;
   4.552 +			target = 61BC4BC00E2F9FE900F24255 /* openvpnstart */;
   4.553 +			targetProxy = 61BC4D950E2FA28700F24255 /* PBXContainerItemProxy */;
   4.554 +		};
   4.555 +		61BC4D980E2FA28700F24255 /* PBXTargetDependency */ = {
   4.556 +			isa = PBXTargetDependency;
   4.557 +			target = 61BC4D6A0E2FA06900F24255 /* installer */;
   4.558 +			targetProxy = 61BC4D970E2FA28700F24255 /* PBXContainerItemProxy */;
   4.559 +		};
   4.560 +/* End PBXTargetDependency section */
   4.561 +
   4.562 +/* Begin PBXVariantGroup section */
   4.563 +		089C165CFE840E0CC02AAC07 /* InfoPlist.strings */ = {
   4.564 +			isa = PBXVariantGroup;
   4.565 +			children = (
   4.566 +				089C165DFE840E0CC02AAC07 /* English */,
   4.567 +			);
   4.568 +			name = InfoPlist.strings;
   4.569 +			sourceTree = "<group>";
   4.570 +		};
   4.571 +/* End PBXVariantGroup section */
   4.572 +
   4.573 +/* Begin XCBuildConfiguration section */
   4.574 +		61BC4BC30E2F9FE900F24255 /* Debug */ = {
   4.575 +			isa = XCBuildConfiguration;
   4.576 +			buildSettings = {
   4.577 +				COPY_PHASE_STRIP = NO;
   4.578 +				GCC_DYNAMIC_NO_PIC = NO;
   4.579 +				GCC_ENABLE_FIX_AND_CONTINUE = YES;
   4.580 +				GCC_MODEL_TUNING = G5;
   4.581 +				GCC_OPTIMIZATION_LEVEL = 0;
   4.582 +				INSTALL_PATH = /usr/local/bin;
   4.583 +				PREBINDING = NO;
   4.584 +				PRODUCT_NAME = openvpnstart;
   4.585 +				ZERO_LINK = YES;
   4.586 +			};
   4.587 +			name = Debug;
   4.588 +		};
   4.589 +		61BC4BC40E2F9FE900F24255 /* Release */ = {
   4.590 +			isa = XCBuildConfiguration;
   4.591 +			buildSettings = {
   4.592 +				COPY_PHASE_STRIP = YES;
   4.593 +				DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
   4.594 +				GCC_ENABLE_FIX_AND_CONTINUE = NO;
   4.595 +				GCC_MODEL_TUNING = G5;
   4.596 +				INSTALL_PATH = /usr/local/bin;
   4.597 +				PREBINDING = NO;
   4.598 +				PRODUCT_NAME = openvpnstart;
   4.599 +				ZERO_LINK = NO;
   4.600 +			};
   4.601 +			name = Release;
   4.602 +		};
   4.603 +		61BC4D6D0E2FA06900F24255 /* Debug */ = {
   4.604 +			isa = XCBuildConfiguration;
   4.605 +			buildSettings = {
   4.606 +				COPY_PHASE_STRIP = NO;
   4.607 +				GCC_DYNAMIC_NO_PIC = NO;
   4.608 +				GCC_ENABLE_FIX_AND_CONTINUE = YES;
   4.609 +				GCC_MODEL_TUNING = G5;
   4.610 +				GCC_OPTIMIZATION_LEVEL = 0;
   4.611 +				INSTALL_PATH = /usr/local/bin;
   4.612 +				PREBINDING = NO;
   4.613 +				PRODUCT_NAME = installer;
   4.614 +				ZERO_LINK = YES;
   4.615 +			};
   4.616 +			name = Debug;
   4.617 +		};
   4.618 +		61BC4D6E0E2FA06900F24255 /* Release */ = {
   4.619 +			isa = XCBuildConfiguration;
   4.620 +			buildSettings = {
   4.621 +				COPY_PHASE_STRIP = YES;
   4.622 +				DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
   4.623 +				GCC_ENABLE_FIX_AND_CONTINUE = NO;
   4.624 +				GCC_MODEL_TUNING = G5;
   4.625 +				INSTALL_PATH = /usr/local/bin;
   4.626 +				PREBINDING = NO;
   4.627 +				PRODUCT_NAME = installer;
   4.628 +				ZERO_LINK = NO;
   4.629 +			};
   4.630 +			name = Release;
   4.631 +		};
   4.632 +		C01FCF4B08A954540054247B /* Debug */ = {
   4.633 +			isa = XCBuildConfiguration;
   4.634 +			buildSettings = {
   4.635 +				COPY_PHASE_STRIP = NO;
   4.636 +				FRAMEWORK_SEARCH_PATHS = (
   4.637 +					"$(inherited)",
   4.638 +					"\"$(SRCROOT)/../third_party\"",
   4.639 +				);
   4.640 +				GCC_DYNAMIC_NO_PIC = NO;
   4.641 +				GCC_ENABLE_FIX_AND_CONTINUE = YES;
   4.642 +				GCC_MODEL_TUNING = G5;
   4.643 +				GCC_OPTIMIZATION_LEVEL = 0;
   4.644 +				GCC_PRECOMPILE_PREFIX_HEADER = YES;
   4.645 +				GCC_PREFIX_HEADER = Tunnelblick_Prefix.pch;
   4.646 +				INFOPLIST_FILE = Info.plist;
   4.647 +				INSTALL_PATH = "$(HOME)/Applications";
   4.648 +				PRODUCT_NAME = Tunnelblick;
   4.649 +				WRAPPER_EXTENSION = app;
   4.650 +				ZERO_LINK = YES;
   4.651 +			};
   4.652 +			name = Debug;
   4.653 +		};
   4.654 +		C01FCF4C08A954540054247B /* Release */ = {
   4.655 +			isa = XCBuildConfiguration;
   4.656 +			buildSettings = {
   4.657 +				DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
   4.658 +				FRAMEWORK_SEARCH_PATHS = (
   4.659 +					"$(inherited)",
   4.660 +					"\"$(SRCROOT)/../third_party\"",
   4.661 +				);
   4.662 +				GCC_MODEL_TUNING = G5;
   4.663 +				GCC_PRECOMPILE_PREFIX_HEADER = YES;
   4.664 +				GCC_PREFIX_HEADER = Tunnelblick_Prefix.pch;
   4.665 +				INFOPLIST_FILE = Info.plist;
   4.666 +				INSTALL_PATH = "$(HOME)/Applications";
   4.667 +				PRODUCT_NAME = Tunnelblick;
   4.668 +				WRAPPER_EXTENSION = app;
   4.669 +			};
   4.670 +			name = Release;
   4.671 +		};
   4.672 +		C01FCF4F08A954540054247B /* Debug */ = {
   4.673 +			isa = XCBuildConfiguration;
   4.674 +			buildSettings = {
   4.675 +				GCC_WARN_ABOUT_RETURN_TYPE = YES;
   4.676 +				GCC_WARN_UNUSED_VARIABLE = YES;
   4.677 +				PREBINDING = NO;
   4.678 +				SDKROOT = "$(DEVELOPER_SDK_DIR)/MacOSX10.4u.sdk";
   4.679 +			};
   4.680 +			name = Debug;
   4.681 +		};
   4.682 +		C01FCF5008A954540054247B /* Release */ = {
   4.683 +			isa = XCBuildConfiguration;
   4.684 +			buildSettings = {
   4.685 +				ARCHS = (
   4.686 +					ppc,
   4.687 +					i386,
   4.688 +				);
   4.689 +				GCC_WARN_ABOUT_RETURN_TYPE = YES;
   4.690 +				GCC_WARN_UNUSED_VARIABLE = YES;
   4.691 +				PREBINDING = NO;
   4.692 +				SDKROOT = "$(DEVELOPER_SDK_DIR)/MacOSX10.4u.sdk";
   4.693 +			};
   4.694 +			name = Release;
   4.695 +		};
   4.696 +/* End XCBuildConfiguration section */
   4.697 +
   4.698 +/* Begin XCConfigurationList section */
   4.699 +		61BC4CDE0E2F9FF400F24255 /* Build configuration list for PBXNativeTarget "openvpnstart" */ = {
   4.700 +			isa = XCConfigurationList;
   4.701 +			buildConfigurations = (
   4.702 +				61BC4BC30E2F9FE900F24255 /* Debug */,
   4.703 +				61BC4BC40E2F9FE900F24255 /* Release */,
   4.704 +			);
   4.705 +			defaultConfigurationIsVisible = 0;
   4.706 +			defaultConfigurationName = Release;
   4.707 +		};
   4.708 +		61BC4D6F0E2FA08700F24255 /* Build configuration list for PBXNativeTarget "installer" */ = {
   4.709 +			isa = XCConfigurationList;
   4.710 +			buildConfigurations = (
   4.711 +				61BC4D6D0E2FA06900F24255 /* Debug */,
   4.712 +				61BC4D6E0E2FA06900F24255 /* Release */,
   4.713 +			);
   4.714 +			defaultConfigurationIsVisible = 0;
   4.715 +			defaultConfigurationName = Release;
   4.716 +		};
   4.717 +		C01FCF4A08A954540054247B /* Build configuration list for PBXNativeTarget "Tunnelblick" */ = {
   4.718 +			isa = XCConfigurationList;
   4.719 +			buildConfigurations = (
   4.720 +				C01FCF4B08A954540054247B /* Debug */,
   4.721 +				C01FCF4C08A954540054247B /* Release */,
   4.722 +			);
   4.723 +			defaultConfigurationIsVisible = 0;
   4.724 +			defaultConfigurationName = Release;
   4.725 +		};
   4.726 +		C01FCF4E08A954540054247B /* Build configuration list for PBXProject "Tunnelblick" */ = {
   4.727 +			isa = XCConfigurationList;
   4.728 +			buildConfigurations = (
   4.729 +				C01FCF4F08A954540054247B /* Debug */,
   4.730 +				C01FCF5008A954540054247B /* Release */,
   4.731 +			);
   4.732 +			defaultConfigurationIsVisible = 0;
   4.733 +			defaultConfigurationName = Release;
   4.734 +		};
   4.735 +/* End XCConfigurationList section */
   4.736 +	};
   4.737 +	rootObject = 29B97313FDCFA39411CA2CEA /* Project object */;
   4.738 +}
     5.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     5.2 +++ b/tunblick/installer.m	Wed Jul 29 11:23:17 2009 +0200
     5.3 @@ -0,0 +1,77 @@
     5.4 +/*
     5.5 + *  Copyright (c) 2004 Angelo Laub
     5.6 + *
     5.7 + *  This program is free software; you can redistribute it and/or modify
     5.8 + *  it under the terms of the GNU General Public License version 2
     5.9 + *  as published by the Free Software Foundation.
    5.10 + *
    5.11 + *  This program is distributed in the hope that it will be useful,
    5.12 + *  but WITHOUT ANY WARRANTY; without even the implied warranty of
    5.13 + *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    5.14 + *  GNU General Public License for more details.
    5.15 + *
    5.16 + *  You should have received a copy of the GNU General Public License
    5.17 + *  along with this program (see the file COPYING included with this
    5.18 + *  distribution); if not, write to the Free Software Foundation, Inc.,
    5.19 + *  59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
    5.20 + */
    5.21 +
    5.22 +#include "installer.h"
    5.23 +
    5.24 +int main(int argc, char *argv[]) 
    5.25 +{
    5.26 +	NSAutoreleasePool *pool = [NSAutoreleasePool new];
    5.27 +	NSString *thisBundle = [[NSString stringWithUTF8String:argv[0]] stringByDeletingLastPathComponent];
    5.28 +	
    5.29 +	NSString *tunPath = [thisBundle stringByAppendingPathComponent:@"/tun.kext"];
    5.30 +	NSString *tapPath = [thisBundle stringByAppendingPathComponent:@"/tap.kext"];
    5.31 +
    5.32 +	NSString *tunExecutable = [tunPath stringByAppendingPathComponent:@"/Contents/MacOS/tun"];
    5.33 +	NSString *tapExecutable = [tapPath stringByAppendingPathComponent:@"/Contents/MacOS/tap"];
    5.34 +
    5.35 +	NSString *helperPath = [thisBundle stringByAppendingPathComponent:@"/openvpnstart"];
    5.36 +	NSString *openvpnPath = [thisBundle stringByAppendingPathComponent:@"/openvpn"];
    5.37 +	
    5.38 +	runTask(
    5.39 +			@"/usr/sbin/chown",
    5.40 +			[NSArray arrayWithObjects:@"-R",@"root:wheel",thisBundle,nil]
    5.41 +			);
    5.42 +
    5.43 +	
    5.44 +	runTask(
    5.45 +			@"/bin/chmod",
    5.46 +			[NSArray arrayWithObjects:@"-R",@"755",tunPath,tapPath,nil]
    5.47 +			);
    5.48 +	
    5.49 +	runTask(
    5.50 +			@"/bin/chmod",
    5.51 +			[NSArray arrayWithObjects:@"744",
    5.52 +				tunExecutable,
    5.53 +				tapExecutable,
    5.54 +				helperPath,
    5.55 +				openvpnPath,
    5.56 +				nil]
    5.57 +			);
    5.58 +	runTask(
    5.59 +			@"/bin/chmod",
    5.60 +			[NSArray arrayWithObjects:@"4111",helperPath,nil]
    5.61 +			);
    5.62 +	[pool release];
    5.63 +	return 0;
    5.64 +}
    5.65 +
    5.66 +void runTask(NSString *launchPath,NSArray *arguments) 
    5.67 +{
    5.68 +	NSTask* task = [[[NSTask alloc] init] autorelease];	
    5.69 +	[task setArguments:arguments];
    5.70 +	[task setLaunchPath:launchPath];
    5.71 +	
    5.72 +	NS_DURING {
    5.73 +		[task launch];
    5.74 +	} NS_HANDLER {
    5.75 +		NSLog(@"Exception raised while executing helper %@: %@",launchPath, localException);
    5.76 +		exit(EXIT_FAILURE);
    5.77 +	}
    5.78 +    NS_ENDHANDLER
    5.79 +	[task waitUntilExit];
    5.80 +}
     6.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     6.2 +++ b/tunblick/openvpnstart.m	Wed Jul 29 11:23:17 2009 +0200
     6.3 @@ -0,0 +1,330 @@
     6.4 +/*
     6.5 + * Copyright (c) 2004-2006 Angelo Laub
     6.6 + * Contributions by Dirk Theisen
     6.7 + *
     6.8 + * This program is free software; you can redistribute it and/or modify
     6.9 + * it under the terms of the GNU General Public License version 2
    6.10 + * as published by the Free Software Foundation.
    6.11 + *
    6.12 + * This program is distributed in the hope that it will be useful,
    6.13 + * but WITHOUT ANY WARRANTY; without even the implied warranty of
    6.14 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    6.15 + * GNU General Public License for more details.
    6.16 + *
    6.17 + * You should have received a copy of the GNU General Public License
    6.18 + * along with this program (see the file COPYING included with this
    6.19 + * distribution); if not, write to the Free Software Foundation, Inc.,
    6.20 + * 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
    6.21 + */
    6.22 +
    6.23 +#import <Foundation/Foundation.h>
    6.24 +#import <Foundation/NSDebug.h>
    6.25 +#import <sys/types.h>
    6.26 +#import <sys/stat.h>
    6.27 +#import <unistd.h>
    6.28 +#import <sys/sysctl.h>
    6.29 +#import <signal.h>
    6.30 +
    6.31 +void	startVPN			(NSString* configFile, int port, BOOL useScripts, BOOL skipCheck);	//Tries to start an openvpn connection. May complain and exit if can't become root
    6.32 +void	killOneOpenvpn		(pid_t pid);	//Returns having killed an openvpn process, or complains and exits
    6.33 +int		killAllOpenvpn		(void);			//Kills all openvpn processes and returns the number of processes that were killed. May complain and exit
    6.34 +
    6.35 +void	loadKexts			(void);			//Tries to load kexts -- no indication of failure. May complain and exit if can't become root
    6.36 +void	becomeRoot			(void);			//Returns as root, having setuid(0) if necessary; complains and exits if can't become root
    6.37 +
    6.38 +void	getProcesses		(struct kinfo_proc** procs, int* number);	//Fills in process information
    6.39 +BOOL	isOpenvpn			(pid_t pid);	//Returns TRUE if process is an openvpn process (i.e., process name = "openvpn")
    6.40 +BOOL	configNeedsRepair	(void);			//Returns NO if configuration file is secure, otherwise complains and exits
    6.41 +
    6.42 +NSString*					execPath;		//Path to folder containing this executable, openvpn, tap.kext, tun.kext, client.up.osx.sh, and client.down.osx.sh
    6.43 +NSString*					configPath;		//Path to configuration file (in ~/Library/openvpn)
    6.44 +NSAutoreleasePool*			pool;
    6.45 +
    6.46 +int main(int argc, char* argv[])
    6.47 +{
    6.48 +    pool = [[NSAutoreleasePool alloc] init];
    6.49 +	
    6.50 +	BOOL	syntaxError	= TRUE;
    6.51 +	
    6.52 +	if (argc > 1) {
    6.53 +		char* command = argv[1];
    6.54 +		if( strcmp(command, "killall") == 0 ) {
    6.55 +			if (argc == 2) {
    6.56 +				int nKilled;
    6.57 +				nKilled = killAllOpenvpn();
    6.58 +				if (nKilled) {
    6.59 +					printf("%d openvpn processes killed\n", nKilled);
    6.60 +				} else {
    6.61 +					fprintf(stderr, "%d openvpn processes killed\n", nKilled);
    6.62 +				}
    6.63 +				syntaxError = FALSE;
    6.64 +			}
    6.65 +		} else if( strcmp(command, "kill") == 0 ) {
    6.66 +			if (argc == 3) {
    6.67 +				pid_t pid = (pid_t) atoi(argv[2]);
    6.68 +				killOneOpenvpn(pid);
    6.69 +				syntaxError = FALSE;
    6.70 +			}
    6.71 +		} else if( strcmp(command, "start") == 0 ) {
    6.72 +			if (  (argc > 3) && (argc < 7)  ) {
    6.73 +				NSString* configFile = [NSString stringWithUTF8String:argv[2]];
    6.74 +				execPath = [[NSString stringWithUTF8String:argv[0]] stringByDeletingLastPathComponent];
    6.75 +				if(strlen(argv[3]) < 6 ) {
    6.76 +					unsigned int port = atoi(argv[3]);
    6.77 +					if (port<=65535) {
    6.78 +						BOOL useScripts = FALSE; if( (argc > 4) && (atoi(argv[4]) == 1) ) useScripts = TRUE;
    6.79 +						BOOL skipCheck  = FALSE; if( (argc > 5) && (atoi(argv[5]) == 1) ) skipCheck  = TRUE;
    6.80 +						startVPN(configFile, port, useScripts, skipCheck);
    6.81 +						syntaxError = FALSE;
    6.82 +					}
    6.83 +				}
    6.84 +			}
    6.85 +		}
    6.86 +	}
    6.87 +	
    6.88 +	if (syntaxError) {
    6.89 +		fprintf(stderr, "Error: Syntax error. Usage:\n\n"
    6.90 +				
    6.91 +				"\t./openvpnstart killall\n"
    6.92 +				"\t./openvpnstart kill   processId\n"
    6.93 +				"\t./openvpnstart start  configName  mgtPort  [useScripts  [skipCheck]  ]\n\n"
    6.94 +				
    6.95 +				"Where:\n"
    6.96 +				"\tprocessId  is the process ID of the openvpn process to kill\n"
    6.97 +				"\tconfigName is the name of the configuration file (which must be in ~/Library/openvpn)\n"
    6.98 +				"\tmgtPort    is the port number (0-65535) to use for managing the connection\n"
    6.99 +				"\tuseScripts is 1 to run the client.up.osx.sh script before connecting, and client.down.osx.sh after disconnecting\n"
   6.100 +				"\t           (The scripts are in Tunnelblick.app/Contents/Resources/)\n"
   6.101 +				"\tskipCheck  is 1 to skip checking ownership and permissions of the configuration file\n\n"
   6.102 +				
   6.103 +				"useScripts and skipCheck each default to 0.\n\n"
   6.104 +				
   6.105 +				"The normal return code is 0. If an error occurs a message is sent to stderr and a code of 2 is returned.\n"
   6.106 +				
   6.107 +				"This executable must be in the same folder as openvpn, tap.kext, and tun.kext (and client.up.osx.sh and client.down.osx.sh if they are used).\n\n"
   6.108 +				
   6.109 +				"Tunnelblick must have been run and an administrator password entered at least once before openvpnstart can be used."
   6.110 +				);
   6.111 +		[pool drain];
   6.112 +		exit(2);
   6.113 +	}
   6.114 +	
   6.115 +	[pool drain];
   6.116 +	exit(0);
   6.117 +}
   6.118 +
   6.119 +//Tries to start an openvpn connection -- no indication of failure. May complain and exit if can't become root
   6.120 +void startVPN(NSString* configFile, int port, BOOL useScripts, BOOL skipCheck)
   6.121 +{
   6.122 +	NSString*			directoryPath	= [NSHomeDirectory() stringByAppendingPathComponent:@"/Library/openvpn"];
   6.123 +						configPath		= [directoryPath stringByAppendingPathComponent:configFile];
   6.124 +	NSString*			openvpnPath		= [execPath stringByAppendingPathComponent: @"openvpn"];
   6.125 +	NSMutableString*	upscriptPath	= [[execPath stringByAppendingPathComponent: @"client.up.osx.sh"] mutableCopy];
   6.126 +	NSMutableString*	downscriptPath	= [[execPath stringByAppendingPathComponent: @"client.down.osx.sh"] mutableCopy];
   6.127 +	[upscriptPath replaceOccurrencesOfString:@" " withString:@"\\ " options:NSLiteralSearch range:NSMakeRange(0, [upscriptPath length])];
   6.128 +	[downscriptPath replaceOccurrencesOfString:@" " withString:@"\\ " options:NSLiteralSearch range:NSMakeRange(0, [downscriptPath length])];
   6.129 +	
   6.130 +	if ( ! skipCheck ) {
   6.131 +		if(configNeedsRepair()) {
   6.132 +			[pool drain];
   6.133 +			exit(2);
   6.134 +		}
   6.135 +	}
   6.136 +	
   6.137 +	// default arguments to openvpn command line
   6.138 +	NSMutableArray* arguments = [NSMutableArray arrayWithObjects:
   6.139 +								 @"--management-query-passwords",  
   6.140 +								 @"--cd", directoryPath, 
   6.141 +								 @"--daemon", 
   6.142 +								 @"--management-hold", 
   6.143 +								 @"--management", @"127.0.0.1", [NSString stringWithFormat:@"%d", port],  
   6.144 +								 @"--config", configPath,
   6.145 +								 @"--script-security", @"2", // allow us to call the up and down scripts or scripts defined in config
   6.146 +								 nil
   6.147 +								 ];
   6.148 +	
   6.149 +	// conditionally push additional arguments to array
   6.150 +	if(useScripts) {
   6.151 +		[arguments addObjectsFromArray:
   6.152 +		 [NSArray arrayWithObjects:
   6.153 +		  @"--up", upscriptPath,
   6.154 +		  @"--down", downscriptPath,
   6.155 +          @"--up-restart",
   6.156 +		  nil
   6.157 +		 ]
   6.158 +		];
   6.159 +	}
   6.160 +	
   6.161 +	loadKexts();
   6.162 +	
   6.163 +	NSTask* task = [[[NSTask alloc] init] autorelease];
   6.164 +	[task setLaunchPath:openvpnPath];
   6.165 +	[task setArguments:arguments];
   6.166 +	
   6.167 +	becomeRoot();
   6.168 +	[task launch];
   6.169 +	[task waitUntilExit];
   6.170 +
   6.171 +	[upscriptPath release];
   6.172 +	[downscriptPath release];
   6.173 +}
   6.174 +
   6.175 +//Returns having killed an openvpn process, or complains and exits
   6.176 +void killOneOpenvpn(pid_t pid)
   6.177 +{
   6.178 +	int didnotKill;
   6.179 +	
   6.180 +	if(isOpenvpn(pid)) {
   6.181 +		becomeRoot();
   6.182 +		didnotKill = kill(pid, SIGTERM);
   6.183 +		if (didnotKill) {
   6.184 +			fprintf(stderr, "Error: Unable to kill openvpn process %d\n", pid);
   6.185 +			[pool drain];
   6.186 +			exit(2);
   6.187 +		}
   6.188 +	} else {
   6.189 +		fprintf(stderr, "Error: Process %d is not an openvpn process\n", pid);
   6.190 +		[pool drain];
   6.191 +		exit(2);
   6.192 +	}
   6.193 +}
   6.194 +
   6.195 +//Kills all openvpn processes and returns the number of processes that were killed. May complain and exit if can't become root or some openvpn processes can't be killed
   6.196 +int killAllOpenvpn(void)
   6.197 +{
   6.198 +	int	count		= 0,
   6.199 +		i			= 0,
   6.200 +		nKilled		= 0,		//# of openvpn processes succesfully killed
   6.201 +		nNotKilled	= 0,		//# of openvpn processes not killed
   6.202 +		didnotKill;				//return value from kill() -- zero indicates killed successfully
   6.203 +	
   6.204 +	struct kinfo_proc*	info	= NULL;
   6.205 +	
   6.206 +	getProcesses(&info, &count);
   6.207 +	
   6.208 +	for (i = 0; i < count; i++) {
   6.209 +		char* process_name = info[i].kp_proc.p_comm;
   6.210 +		pid_t pid = info[i].kp_proc.p_pid;
   6.211 +		if(strcmp(process_name, "openvpn") == 0) {
   6.212 +			becomeRoot();
   6.213 +			didnotKill = kill(pid, SIGTERM);
   6.214 +			if (didnotKill) {
   6.215 +				fprintf(stderr, "Error: Unable to kill openvpn process %d\n", pid);
   6.216 +				nNotKilled++;
   6.217 +			} else {
   6.218 +				nKilled++;
   6.219 +			}
   6.220 +		}
   6.221 +	}
   6.222 +	
   6.223 +	free(info);
   6.224 +	
   6.225 +	if (nNotKilled) {
   6.226 +		// An error message for each openvpn process that wasn't killed has already been output
   6.227 +		[pool drain];
   6.228 +		exit(2);
   6.229 +	}
   6.230 +	
   6.231 +	return(nKilled);
   6.232 +}
   6.233 +
   6.234 +//Tries to load kexts -- no indication of failure. May complain and exit if can't become root
   6.235 +void loadKexts(void)
   6.236 +{
   6.237 +	NSString*	tapPath		= [execPath stringByAppendingPathComponent: @"tap.kext"];
   6.238 +	NSString*	tunPath		= [execPath stringByAppendingPathComponent: @"tun.kext"];
   6.239 +	NSTask*		task		= [[[NSTask alloc] init] autorelease];
   6.240 +	NSArray*	arguments	= [NSArray arrayWithObjects:tapPath, tunPath, nil];
   6.241 +	
   6.242 +	[task setLaunchPath:@"/sbin/kextload"];
   6.243 +	
   6.244 +	[task setArguments:arguments];
   6.245 +	
   6.246 +	becomeRoot();
   6.247 +	[task launch];
   6.248 +	[task waitUntilExit];
   6.249 +}
   6.250 +
   6.251 +//Returns as root, having setuid(0) if necessary; complains and exits if can't become root
   6.252 +void becomeRoot(void)
   6.253 +{
   6.254 +	if (getuid()  != 0) {
   6.255 +		if (  setuid(0)  ) {
   6.256 +			fprintf(stderr, "Error: Unable to become root\n"
   6.257 +							"You must have run Tunnelblick and entered an administrator password at least once to use openvpnstart\n");
   6.258 +			[pool drain];
   6.259 +			exit(2);
   6.260 +		}
   6.261 +	}
   6.262 +}
   6.263 +
   6.264 +//Fills in process information
   6.265 +void getProcesses(struct kinfo_proc** procs, int* number)
   6.266 +{
   6.267 +	int					mib[4]	= { CTL_KERN, KERN_PROC, KERN_PROC_ALL, 0 };
   6.268 +    struct	kinfo_proc* info;
   6.269 +	size_t				length;
   6.270 +    int					level	= 3;
   6.271 +    
   6.272 +    if (sysctl(mib, level, NULL, &length, NULL, 0) < 0) return;
   6.273 +    if (!(info = malloc(length))) return;
   6.274 +    if (sysctl(mib, level, info, &length, NULL, 0) < 0) {
   6.275 +        free(info);
   6.276 +        return;
   6.277 +    }
   6.278 +	*procs = info;
   6.279 +	*number = length / sizeof(struct kinfo_proc);
   6.280 +}
   6.281 +
   6.282 +//Returns TRUE if process is an openvpn process (i.e., process name = "openvpn"), otherwise returns FALSE
   6.283 +BOOL isOpenvpn(pid_t pid)
   6.284 +{
   6.285 +	BOOL				is_openvpn	= FALSE;
   6.286 +	int					count		= 0,
   6.287 +	i			= 0;
   6.288 +	struct kinfo_proc*	info		= NULL;
   6.289 +	
   6.290 +	getProcesses(&info, &count);
   6.291 +    for (i = 0; i < count; i++) {
   6.292 +        char* process_name = info[i].kp_proc.p_comm;
   6.293 +        pid_t thisPid = info[i].kp_proc.p_pid;
   6.294 +        if (pid == thisPid) {
   6.295 +			if (strcmp(process_name, "openvpn")==0) {
   6.296 +				is_openvpn = TRUE;
   6.297 +			} else {
   6.298 +				is_openvpn = FALSE;
   6.299 +			}
   6.300 +			break;
   6.301 +		}
   6.302 +    }    
   6.303 +    free(info);
   6.304 +	return is_openvpn;
   6.305 +}
   6.306 +
   6.307 +//Returns NO if configuration file is secure, otherwise complains and exits
   6.308 +BOOL configNeedsRepair(void)
   6.309 +{
   6.310 +	NSFileManager*	fileManager		= [NSFileManager defaultManager];
   6.311 +	NSDictionary*	fileAttributes	= [fileManager fileAttributesAtPath:configPath traverseLink:YES];
   6.312 +
   6.313 +	if (fileAttributes == nil) {
   6.314 +		fprintf(stderr, "Error: %s does not exist\n", [configPath UTF8String]);
   6.315 +		[pool drain];
   6.316 +		exit(2);
   6.317 +	}
   6.318 +	
   6.319 +	unsigned long	perms			= [fileAttributes filePosixPermissions];
   6.320 +	NSString*		octalString		= [NSString stringWithFormat:@"%o", perms];
   6.321 +	NSNumber*		fileOwner		= [fileAttributes fileOwnerAccountID];
   6.322 +	
   6.323 +	if ( (![octalString isEqualToString:@"644"])  || (![fileOwner isEqualToNumber:[NSNumber numberWithInt:0]])) {
   6.324 +		NSString* errMsg = [NSString stringWithFormat:@"Error: File %@ is owned by %@ and has permissions %@\n"
   6.325 +							"Configuration files must be owned by root:wheel with permissions 0644\n"
   6.326 +							"To skip this check, use 'skipCheck' -- type './openvpnstart' (with no arguments) for details)\n",
   6.327 +							configPath, fileOwner, octalString];
   6.328 +		fprintf(stderr, [errMsg UTF8String]);
   6.329 +		[pool drain];
   6.330 +		exit(2);
   6.331 +	}
   6.332 +	return NO;
   6.333 +}
     7.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     7.2 +++ b/tunblick/third_party/Makefile	Wed Jul 29 11:23:17 2009 +0200
     7.3 @@ -0,0 +1,86 @@
     7.4 +# This Makefile builds all the third_party code
     7.5 +# It shouldn't be called by anything other than automated scripts
     7.6 +
     7.7 +# Both lzo and openvpn should be built universally
     7.8 +
     7.9 +LZO_DIR=lzo-2.02
    7.10 +PKCS11_DIR=pkcs11-helper-1.07
    7.11 +
    7.12 +all: tuntap lzo openvpn
    7.13 +
    7.14 +pkcs11-helper::
    7.15 +	@for a in ppc i686; do \
    7.16 +		echo Configure PKCS11-Helper for $$a; \
    7.17 +		cd $(PKCS11_DIR); \
    7.18 +		echo Forcefully be clean; \
    7.19 +		$(MAKE) clean; \
    7.20 +		OPENSSL_LIBS="-lcrypto" CFLAGS="-isysroot /Developer/SDKs/MacOSX10.4u.sdk -Os -mmacosx-version-min=10.4 -arch $$a" ./configure --enable-static --disable-dependency-tracking --prefix=$$(pwd)/staging_$$a/ --includedir=$$(pwd)/staging/include/; \
    7.21 +		echo Build PKCS11-Helper; \
    7.22 +		$(MAKE); \
    7.23 +		echo Install to third_party/$(PKCS11_DIR)/staging_$$a; \
    7.24 +		$(MAKE) install; \
    7.25 +		cd ../; \
    7.26 +	done
    7.27 +	mkdir -p $(PKCS11_DIR)/staging/lib
    7.28 +	lipo $(PKCS11_DIR)/staging_*/lib/libpkcs11-helper.a -create -output $(PKCS11_DIR)/staging/lib/libpkcs11-helper.a
    7.29 +	cp  $(PKCS11_DIR)/staging_i686/lib/libpkcs11-helper.la  $(PKCS11_DIR)/staging/lib/ 
    7.30 +
    7.31 +lzo::
    7.32 +	@for a in ppc i686; do \
    7.33 +		echo Configure LZO for $$a; \
    7.34 +		cd $(LZO_DIR); \
    7.35 +		echo Forcefully be clean; \
    7.36 +		$(MAKE) clean; \
    7.37 +		CFLAGS="-isysroot /Developer/SDKs/MacOSX10.4u.sdk -Os -mmacosx-version-min=10.4 -arch $$a" ./configure --disable-dependency-tracking --disable-asm --prefix=$$(pwd)/staging_$$a/ --includedir=$$(pwd)/staging/include/; \
    7.38 +		echo Build LZO; \
    7.39 +		$(MAKE); \
    7.40 +		echo Install to third_party/$(LZO_DIR)/staging_$$a; \
    7.41 +		$(MAKE) install; \
    7.42 +		cd ../; \
    7.43 +	done
    7.44 +	
    7.45 +	# Use lipo to create a universal library
    7.46 +	mkdir -p $(LZO_DIR)/staging/lib
    7.47 +	lipo $(LZO_DIR)/staging_*/lib/liblzo2.a -create -output $(LZO_DIR)/staging/lib/liblzo2.a
    7.48 +	cp  $(LZO_DIR)/staging_i686/lib/liblzo2.la  $(LZO_DIR)/staging/lib/ 
    7.49 +
    7.50 +	# wtf? library was renamed??? move it back so openvpn will build correctly
    7.51 +	cd $(LZO_DIR)/staging/lib/; mv liblzo2.a liblzo.a; mv liblzo2.la liblzo.la
    7.52 +	
    7.53 +lzo-clean:
    7.54 +	$(MAKE) -C $(LZO_DIR) clean
    7.55 +	rm -rf $(LZO_DIR)/staging*
    7.56 +
    7.57 +openvpn: lzo pkcs11-helper
    7.58 +	@for a in ppc i686; do \
    7.59 +		echo Configure OpenVPN for $$a; \
    7.60 +		cd openvpn/; \
    7.61 +		echo Forcefully be clean; \
    7.62 +		$(MAKE) clean; \
    7.63 +		autoreconf -i -v; \
    7.64 +		LDFLAGS="-L../$(PKCS11_DIR)/staging/lib/" CFLAGS="-isysroot /Developer/SDKs/MacOSX10.4u.sdk -Os -mmacosx-version-min=10.4 -arch $$a" ./configure --with-lzo-headers=../$(LZO_DIR)/staging/include/ --with-lzo-lib=../$(LZO_DIR)/staging/lib/ --with-pkcs11-helper-headers=../$(PKCS11_DIR)/staging/include/ --with-pkcs11-helper-libs=../$(PKCS11_DIR)/staging/lib/ --disable-dependency-tracking; \
    7.65 +		echo Build OpenVPN; \
    7.66 +		$(MAKE); \
    7.67 +		mv openvpn openvpn_tblk_$$a; \
    7.68 +		cd ../; \
    7.69 +	done
    7.70 +		
    7.71 +		# Use lipo to create a universal library
    7.72 +		lipo openvpn/openvpn_tblk_* -create -output openvpn/openvpn
    7.73 +
    7.74 +openvpn-clean:
    7.75 +	$(MAKE) -C openvpn/ clean
    7.76 +	rm -f openvpn/openvpn_tblk_*
    7.77 +
    7.78 +.PHONY : tuntap
    7.79 +
    7.80 +tuntap: 
    7.81 +	# Now we'll build the tun/tap driver
    7.82 +	$(MAKE) -C tuntap/
    7.83 +
    7.84 +tuntap-clean:
    7.85 +	$(MAKE) -C tuntap/ clean
    7.86 +
    7.87 +
    7.88 +
    7.89 +clean: lzo-clean tuntap-clean openvpn-clean

mercurial