First go at #2560 "inactive seeding time limit". libtransmission and Mac support are currently implemented.

This commit is contained in:
Mitchell Livingston 2010-07-16 03:12:57 +00:00
parent 69a9df0270
commit fd0dd10419
20 changed files with 1315 additions and 177 deletions

View File

@ -107,7 +107,7 @@ static inline double tr_cpPercentDone( const tr_completion * cp )
{
const double ratio = tr_getRatio( cp->sizeNow, tr_cpSizeWhenDone( cp ) );
const int iratio = (int)ratio;
return ((iratio == TR_RATIO_NA) || (iratio == TR_RATIO_INF)) ? 0.0f : ratio;
return ((iratio == TR_RATIO_NA) || (iratio == TR_RATIO_INF)) ? 0.0 : ratio;
}
/**

View File

@ -3165,7 +3165,7 @@ bandwidthPulse( int foo UNUSED, short bar UNUSED, void * vmgr )
/* possibly stop torrents that have seeded enough */
tor = NULL;
while(( tor = tr_torrentNext( mgr->session, tor )))
tr_torrentCheckSeedRatio( tor );
tr_torrentCheckSeedLimit( tor );
/* run the completeness check for any torrents that need it */
tor = NULL;

View File

@ -44,6 +44,7 @@
#define KEY_SPEEDLIMIT_UP "speed-limit-up"
#define KEY_SPEEDLIMIT_DOWN "speed-limit-down"
#define KEY_RATIOLIMIT "ratio-limit"
#define KEY_INACTIVELIMIT "inactivity-limit"
#define KEY_UPLOADED "uploaded"
#define KEY_SPEED_KiBps "speed"
@ -56,6 +57,8 @@
#define KEY_SPEEDLIMIT_UP_MODE "up-mode"
#define KEY_RATIOLIMIT_RATIO "ratio-limit"
#define KEY_RATIOLIMIT_MODE "ratio-mode"
#define KEY_INACTIVELIMIT_MINS "inactivity-limit"
#define KEY_INACTIVELIMIT_MODE "inactivity-mode"
#define KEY_PROGRESS_MTIMES "mtimes"
#define KEY_PROGRESS_BITFIELD "bitfield"
@ -290,6 +293,14 @@ saveRatioLimits( tr_benc * dict, const tr_torrent * tor )
tr_bencDictAddInt( d, KEY_RATIOLIMIT_MODE, tr_torrentGetRatioMode( tor ) );
}
static void
saveInactivityLimits( tr_benc * dict, const tr_torrent * tor )
{
tr_benc * d = tr_bencDictAddDict( dict, KEY_INACTIVELIMIT, 2 );
tr_bencDictAddInt( d, KEY_INACTIVELIMIT_MINS, tr_torrentGetInactiveLimit( tor ) );
tr_bencDictAddInt( d, KEY_INACTIVELIMIT_MODE, tr_torrentGetInactiveMode( tor ) );
}
static void
loadSingleSpeedLimit( tr_benc * d, tr_direction dir, tr_torrent * tor )
{
@ -374,6 +385,27 @@ loadRatioLimits( tr_benc * dict,
return ret;
}
static uint64_t
loadInactivityLimits( tr_benc * dict,
tr_torrent * tor )
{
uint64_t ret = 0;
tr_benc * d;
if( tr_bencDictFindDict( dict, KEY_INACTIVELIMIT, &d ) )
{
int64_t i;
int64_t imin;
if( tr_bencDictFindInt( d, KEY_INACTIVELIMIT_MINS, &imin ) )
tr_torrentSetInactiveLimit( tor, imin );
if( tr_bencDictFindInt( d, KEY_INACTIVELIMIT_MODE, &i ) )
tr_torrentSetInactiveMode( tor, i );
ret = TR_FR_INACTIVELIMIT;
}
return ret;
}
/***
****
***/
@ -538,6 +570,7 @@ tr_torrentSaveResume( tr_torrent * tor )
}
saveSpeedLimits( &top, tor );
saveRatioLimits( &top, tor );
saveInactivityLimits( &top, tor );
filename = getResumeFilename( tor );
if(( err = tr_bencToFile( &top, TR_FMT_BENC, filename )))
@ -673,6 +706,9 @@ loadFromFile( tr_torrent * tor,
if( fieldsToLoad & TR_FR_RATIOLIMIT )
fieldsLoaded |= loadRatioLimits( &top, tor );
if( fieldsToLoad & TR_FR_INACTIVELIMIT )
fieldsLoaded |= loadInactivityLimits( &top, tor );
/* loading the resume file triggers of a lot of changes,
* but none of them needs to trigger a re-saving of the
* same resume information... */

View File

@ -35,7 +35,8 @@ enum
TR_FR_ADDED_DATE = ( 1 << 13 ),
TR_FR_DONE_DATE = ( 1 << 14 ),
TR_FR_ACTIVITY_DATE = ( 1 << 15 ),
TR_FR_RATIOLIMIT = ( 1 << 16 )
TR_FR_RATIOLIMIT = ( 1 << 16 ),
TR_FR_INACTIVELIMIT = ( 1 << 17 )
};
/**

View File

@ -574,6 +574,10 @@ addField( const tr_torrent * tor, tr_benc * d, const char * key )
tr_bencDictAddReal( d, key, st->pieceUploadSpeed_KBps );
else if( tr_streq( key, keylen, "recheckProgress" ) )
tr_bencDictAddReal( d, key, st->recheckProgress );
else if( tr_streq( key, keylen, "seedInactiveLimit" ) )
tr_bencDictAddInt( d, key, tr_torrentGetInactiveLimit( tor ) );
else if( tr_streq( key, keylen, "seedInactiveMode" ) )
tr_bencDictAddInt( d, key, tr_torrentGetInactiveMode( tor ) );
else if( tr_streq( key, keylen, "seedRatioLimit" ) )
tr_bencDictAddReal( d, key, tr_torrentGetRatioLimit( tor ) );
else if( tr_streq( key, keylen, "seedRatioMode" ) )
@ -1013,6 +1017,10 @@ torrentSet( tr_session * session,
tr_torrentSetSpeedLimit_KBps( tor, TR_UP, tmp );
if( tr_bencDictFindBool( args_in, "uploadLimited", &boolVal ) )
tr_torrentUseSpeedLimit( tor, TR_UP, boolVal );
if( tr_bencDictFindInt( args_in, "seedInactiveLimit", &tmp ) )
tr_torrentSetInactiveLimit( tor, tmp );
if( tr_bencDictFindInt( args_in, "seedInactiveMode", &tmp ) )
tr_torrentSetInactiveMode( tor, tmp );
if( tr_bencDictFindReal( args_in, "seedRatioLimit", &d ) )
tr_torrentSetRatioLimit( tor, d );
if( tr_bencDictFindInt( args_in, "seedRatioMode", &tmp ) )
@ -1453,6 +1461,10 @@ sessionSet( tr_session * session,
tr_sessionSetRatioLimit( session, d );
if( tr_bencDictFindBool( args_in, "seedRatioLimited", &boolVal ) )
tr_sessionSetRatioLimited( session, boolVal );
if( tr_bencDictFindInt( args_in, TR_PREFS_KEY_INACTIVE_LIMIT, &i ) )
tr_sessionSetInactiveLimit( session, i );
if( tr_bencDictFindBool( args_in, TR_PREFS_KEY_INACTIVE_LIMIT_ENABLED, &boolVal ) )
tr_sessionSetInactivityLimited( session, boolVal );
if( tr_bencDictFindBool( args_in, TR_PREFS_KEY_START, &boolVal ) )
tr_sessionSetPaused( session, !boolVal );
if( tr_bencDictFindStr( args_in, TR_PREFS_KEY_SCRIPT_TORRENT_DONE_FILENAME, &str ) )
@ -1567,6 +1579,8 @@ sessionGet( tr_session * s,
tr_bencDictAddInt ( d, "rpc-version-minimum", RPC_VERSION_MIN );
tr_bencDictAddReal( d, "seedRatioLimit", tr_sessionGetRatioLimit( s ) );
tr_bencDictAddBool( d, "seedRatioLimited", tr_sessionIsRatioLimited( s ) );
tr_bencDictAddInt ( d, TR_PREFS_KEY_INACTIVE_LIMIT, tr_sessionGetInactiveLimit( s ) );
tr_bencDictAddBool( d, TR_PREFS_KEY_INACTIVE_LIMIT_ENABLED, tr_sessionIsInactivityLimited( s ) );
tr_bencDictAddBool( d, TR_PREFS_KEY_START, !tr_sessionGetPaused( s ) );
tr_bencDictAddBool( d, TR_PREFS_KEY_TRASH_ORIGINAL, tr_sessionGetDeleteSource( s ) );
tr_bencDictAddInt ( d, TR_PREFS_KEY_USPEED_KBps, tr_sessionGetSpeedLimit_KBps( s, TR_UP ) );

View File

@ -255,6 +255,8 @@ tr_sessionGetDefaultSettings( const char * configDir UNUSED, tr_benc * d )
tr_bencDictAddInt ( d, TR_PREFS_KEY_DSPEED_KBps, 100 );
tr_bencDictAddBool( d, TR_PREFS_KEY_DSPEED_ENABLED, FALSE );
tr_bencDictAddInt ( d, TR_PREFS_KEY_ENCRYPTION, TR_DEFAULT_ENCRYPTION );
tr_bencDictAddReal( d, TR_PREFS_KEY_INACTIVE_LIMIT, 30 );
tr_bencDictAddBool( d, TR_PREFS_KEY_INACTIVE_LIMIT_ENABLED, FALSE );
tr_bencDictAddStr ( d, TR_PREFS_KEY_INCOMPLETE_DIR, tr_getDefaultDownloadDir( ) );
tr_bencDictAddBool( d, TR_PREFS_KEY_INCOMPLETE_DIR_ENABLED, FALSE );
tr_bencDictAddBool( d, TR_PREFS_KEY_LAZY_BITFIELD, TRUE );
@ -321,6 +323,8 @@ tr_sessionGetSettings( tr_session * s, struct tr_benc * d )
tr_bencDictAddInt ( d, TR_PREFS_KEY_DSPEED_KBps, tr_sessionGetSpeedLimit_KBps( s, TR_DOWN ) );
tr_bencDictAddBool( d, TR_PREFS_KEY_DSPEED_ENABLED, tr_sessionIsSpeedLimited( s, TR_DOWN ) );
tr_bencDictAddInt ( d, TR_PREFS_KEY_ENCRYPTION, s->encryptionMode );
tr_bencDictAddInt( d, TR_PREFS_KEY_INACTIVE_LIMIT, s->inactiveLimitMinutes );
tr_bencDictAddBool( d, TR_PREFS_KEY_INACTIVE_LIMIT_ENABLED, s->isInactivityLimited );
tr_bencDictAddStr ( d, TR_PREFS_KEY_INCOMPLETE_DIR, tr_sessionGetIncompleteDir( s ) );
tr_bencDictAddBool( d, TR_PREFS_KEY_INCOMPLETE_DIR_ENABLED, tr_sessionIsIncompleteDirEnabled( s ) );
tr_bencDictAddBool( d, TR_PREFS_KEY_LAZY_BITFIELD, s->useLazyBitfield );
@ -797,6 +801,11 @@ sessionSetImpl( void * vdata )
if( tr_bencDictFindBool( settings, TR_PREFS_KEY_RATIO_ENABLED, &boolVal ) )
tr_sessionSetRatioLimited( session, boolVal );
if( tr_bencDictFindInt( settings, TR_PREFS_KEY_INACTIVE_LIMIT, &i ) )
tr_sessionSetInactiveLimit( session, i );
if( tr_bencDictFindBool( settings, TR_PREFS_KEY_INACTIVE_LIMIT_ENABLED, &boolVal ) )
tr_sessionSetInactivityLimited( session, boolVal );
/**
*** Turtle Mode
**/
@ -1094,6 +1103,42 @@ tr_sessionGetRatioLimit( const tr_session * session )
return session->desiredRatio;
}
/***
****
***/
void
tr_sessionSetInactivityLimited( tr_session * session, tr_bool isLimited )
{
assert( tr_isSession( session ) );
session->isInactivityLimited = isLimited;
}
void
tr_sessionSetInactiveLimit( tr_session * session, uint64_t inactivityMinutes )
{
assert( tr_isSession( session ) );
session->inactiveLimitMinutes = inactivityMinutes;
}
tr_bool
tr_sessionIsInactivityLimited( const tr_session * session )
{
assert( tr_isSession( session ) );
return session->isInactivityLimited;
}
uint64_t
tr_sessionGetInactiveLimit( const tr_session * session )
{
assert( tr_isSession( session ) );
return session->inactiveLimitMinutes;
}
/***
****
**** SPEED LIMITS

View File

@ -95,6 +95,7 @@ struct tr_session
tr_bool useLazyBitfield;
tr_bool isIncompleteFileNamingEnabled;
tr_bool isRatioLimited;
tr_bool isInactivityLimited;
tr_bool isIncompleteDirEnabled;
tr_bool pauseAddedTorrent;
tr_bool deleteSourceTorrent;
@ -184,6 +185,8 @@ struct tr_session
struct tr_bandwidth * bandwidth;
double desiredRatio;
uint64_t inactiveLimitMinutes;
struct tr_bindinfo * public_ipv4;
struct tr_bindinfo * public_ipv6;

View File

@ -124,6 +124,25 @@ tr_torrentFindFromObfuscatedHash( tr_session * session,
return NULL;
}
tr_bool
tr_torrentIsPieceTransferAllowed( const tr_torrent * tor,
tr_direction direction )
{
int limit;
tr_bool allowed = TRUE;
if( tr_torrentUsesSpeedLimit( tor, direction ) )
if( tr_torrentGetSpeedLimit_Bps( tor, direction ) <= 0 )
allowed = FALSE;
if( tr_torrentUsesSessionLimits( tor ) )
if( tr_sessionGetActiveSpeedLimit_Bps( tor->session, direction, &limit ) )
if( limit <= 0 )
allowed = FALSE;
return allowed;
}
/***
**** PER-TORRENT UL / DL SPEEDS
***/
@ -246,25 +265,6 @@ tr_torrentGetRatioLimit( const tr_torrent * tor )
return tor->desiredRatio;
}
tr_bool
tr_torrentIsPieceTransferAllowed( const tr_torrent * tor,
tr_direction direction )
{
int limit;
tr_bool allowed = TRUE;
if( tr_torrentUsesSpeedLimit( tor, direction ) )
if( tr_torrentGetSpeedLimit_Bps( tor, direction ) <= 0 )
allowed = FALSE;
if( tr_torrentUsesSessionLimits( tor ) )
if( tr_sessionGetActiveSpeedLimit_Bps( tor->session, direction, &limit ) )
if( limit <= 0 )
allowed = FALSE;
return allowed;
}
tr_bool
tr_torrentGetSeedRatio( const tr_torrent * tor, double * ratio )
{
@ -323,13 +323,103 @@ tr_torrentIsSeedRatioDone( tr_torrent * tor )
return tr_torrentGetSeedRatioBytes( tor, &bytesLeft, NULL ) && !bytesLeft;
}
/***
****
***/
void
tr_torrentCheckSeedRatio( tr_torrent * tor )
tr_torrentSetInactiveMode( tr_torrent * tor, tr_inactvelimit mode )
{
assert( tr_isTorrent( tor ) );
assert( mode==TR_INACTIVELIMIT_GLOBAL || mode==TR_INACTIVELIMIT_SINGLE || mode==TR_INACTIVELIMIT_UNLIMITED );
if( mode != tor->inactiveLimitMode )
{
tor->inactiveLimitMode = mode;
tr_torrentSetDirty( tor );
}
}
tr_ratiolimit
tr_torrentGetInactiveMode( const tr_torrent * tor )
{
assert( tr_isTorrent( tor ) );
return tor->inactiveLimitMode;
}
void
tr_torrentSetInactiveLimit( tr_torrent * tor, uint64_t inactiveMinutes)
{
assert( tr_isTorrent( tor ) );
if( inactiveMinutes > 0 )
{
tor->inactiveLimitMinutes = inactiveMinutes;
tr_torrentSetDirty( tor );
}
}
uint64_t
tr_torrentGetInactiveLimit( const tr_torrent * tor )
{
assert( tr_isTorrent( tor ) );
return tor->inactiveLimitMinutes;
}
tr_bool
tr_torrentGetSeedInactive( const tr_torrent * tor, uint64_t * inactiveMinutes )
{
tr_bool isLimited;
switch( tr_torrentGetInactiveMode( tor ) )
{
case TR_INACTIVELIMIT_SINGLE:
isLimited = TRUE;
if( inactiveMinutes )
*inactiveMinutes = tr_torrentGetInactiveLimit( tor );
break;
case TR_INACTIVELIMIT_GLOBAL:
isLimited = tr_sessionIsInactivityLimited( tor->session );
if( isLimited && inactiveMinutes )
*inactiveMinutes = tr_sessionGetInactiveLimit( tor->session );
break;
default: /* TR_INACTIVELIMIT_UNLIMITED */
isLimited = FALSE;
break;
}
return isLimited;
}
static tr_bool
tr_torrentIsSeedInactiveLimitDone( tr_torrent * tor )
{
uint64_t inactiveMinutes;
#warning can this use the idleSecs from tr_stat?
return tr_torrentGetSeedInactive( tor, &inactiveMinutes )
&& difftime(tr_time(), MAX(tor->startDate, tor->activityDate)) >= inactiveMinutes * 60;
}
/***
****
***/
void
tr_torrentCheckSeedLimit( tr_torrent * tor )
{
assert( tr_isTorrent( tor ) );
if( !tor->isRunning )
return;
/* if we're seeding and reach our seed ratio limit, stop the torrent */
if( tor->isRunning && tr_torrentIsSeedRatioDone( tor ) )
if( tr_torrentIsSeedRatioDone( tor ) )
{
tr_torinf( tor, "Seed ratio reached; pausing torrent" );
@ -339,8 +429,18 @@ tr_torrentCheckSeedRatio( tr_torrent * tor )
if( tor->ratio_limit_hit_func != NULL )
tor->ratio_limit_hit_func( tor, tor->ratio_limit_hit_func_user_data );
}
}
/* if we're seeding and reach our inactiviy limit, stop the torrent */
else if( tr_torrentIsSeedInactiveLimitDone( tor ) )
{
tr_torinf( tor, "Seeding inactivity limit reached; pausing torrent" );
tor->isStopping = TRUE;
/* maybe notify the client */
if( tor->inactive_limit_hit_func != NULL )
tor->inactive_limit_hit_func( tor, tor->inactive_limit_hit_func_user_data );
}
}
/***
****
@ -708,6 +808,12 @@ torrentInit( tr_torrent * tor, const tr_ctor * ctor )
tr_torrentSetRatioLimit( tor, tr_sessionGetRatioLimit( tor->session ) );
}
if( !( loaded & TR_FR_INACTIVELIMIT ) )
{
tr_torrentSetInactiveMode( tor, TR_INACTIVELIMIT_GLOBAL );
tr_torrentSetInactiveLimit( tor, tr_sessionGetInactiveLimit( tor->session ) );
}
{
tr_torrent * it = NULL;
tr_torrent * last = NULL;
@ -1002,7 +1108,7 @@ tr_torrentStat( tr_torrent * tor )
s->startDate = tor->startDate;
if (s->activity == TR_STATUS_DOWNLOAD || s->activity == TR_STATUS_SEED)
s->idleSecs = difftime(tr_time(), tor->anyDate);
s->idleSecs = difftime(tr_time(), MAX(s->startDate, s->activityDate));
else
s->idleSecs = -1;
@ -1035,6 +1141,7 @@ tr_torrentStat( tr_torrent * tor )
s->ratio = tr_getRatio( s->uploadedEver,
s->downloadedEver ? s->downloadedEver : s->haveValid );
#warning account for inactivity limit?
seedRatioApplies = tr_torrentGetSeedRatioBytes( tor, &seedRatioBytesLeft,
&seedRatioBytesGoal );
@ -1062,6 +1169,7 @@ tr_torrentStat( tr_torrent * tor )
break;
case TR_STATUS_SEED: {
#warning do something for inactivity?
if( !seedRatioApplies )
s->eta = TR_ETA_NOT_AVAIL;
else {
@ -1084,6 +1192,7 @@ tr_torrentStat( tr_torrent * tor )
break;
}
#warning (maybe) do something for inactivity?
/* s->haveValid is here to make sure a torrent isn't marked 'finished'
* when the user hits "uncheck all" prior to starting the torrent... */
s->finished = seedRatioApplies && !seedRatioBytesLeft && s->haveValid;
@ -1673,6 +1782,23 @@ tr_torrentClearRatioLimitHitCallback( tr_torrent * torrent )
tr_torrentSetRatioLimitHitCallback( torrent, NULL, NULL );
}
void
tr_torrentSetInactiveLimitHitCallback( tr_torrent * tor,
tr_torrent_inactive_limit_hit_func func,
void * user_data )
{
assert( tr_isTorrent( tor ) );
tor->inactive_limit_hit_func = func;
tor->inactive_limit_hit_func_user_data = user_data;
}
void
tr_torrentClearInactivityLimitHitCallback( tr_torrent * torrent )
{
tr_torrentSetInactiveLimitHitCallback( torrent, NULL, NULL );
}
static void
tr_setenv( const char * name, const char * value, tr_bool override )
{

View File

@ -107,7 +107,7 @@ time_t* tr_torrentGetMTimes( const tr_torrent * tor,
tr_torrent* tr_torrentNext( tr_session * session,
tr_torrent * current );
void tr_torrentCheckSeedRatio( tr_torrent * tor );
void tr_torrentCheckSeedLimit( tr_torrent * tor );
/** save a torrent's .resume file if it's changed since the last time it was saved */
void tr_torrentSave( tr_torrent * tor );
@ -229,6 +229,9 @@ struct tr_torrent
tr_torrent_ratio_limit_hit_func * ratio_limit_hit_func;
void * ratio_limit_hit_func_user_data;
tr_torrent_inactive_limit_hit_func * inactive_limit_hit_func;
void * inactive_limit_hit_func_user_data;
tr_bool isRunning;
tr_bool isStopping;
tr_bool isDeleting;
@ -255,6 +258,9 @@ struct tr_torrent
double desiredRatio;
tr_ratiolimit ratioLimitMode;
uint64_t inactiveLimitMinutes;
tr_inactvelimit inactiveLimitMode;
uint64_t preVerifyTotal;
};

View File

@ -170,6 +170,8 @@ const char* tr_getDefaultDownloadDir( void );
#define TR_PREFS_KEY_LPD_ENABLED "lpd-enabled"
#define TR_PREFS_KEY_DOWNLOAD_DIR "download-dir"
#define TR_PREFS_KEY_ENCRYPTION "encryption"
#define TR_PREFS_KEY_INACTIVE_LIMIT "inactive-limit"
#define TR_PREFS_KEY_INACTIVE_LIMIT_ENABLED "inactive-limit-enabled"
#define TR_PREFS_KEY_INCOMPLETE_DIR "incomplete-dir"
#define TR_PREFS_KEY_INCOMPLETE_DIR_ENABLED "incomplete-dir-enabled"
#define TR_PREFS_KEY_LAZY_BITFIELD "lazy-bitfield-enabled"
@ -723,6 +725,12 @@ tr_bool tr_sessionIsRatioLimited ( const tr_session * );
void tr_sessionSetRatioLimit ( tr_session *, double desiredRatio );
double tr_sessionGetRatioLimit ( const tr_session * );
void tr_sessionSetInactivityLimited ( tr_session *, tr_bool isLimited );
tr_bool tr_sessionIsInactivityLimited ( const tr_session * );
void tr_sessionSetInactiveLimit ( tr_session *, uint64_t inactivityMinutes );
uint64_t tr_sessionGetInactiveLimit ( const tr_session * );
void tr_sessionSetPeerLimit( tr_session *, uint16_t maxGlobalPeers );
uint16_t tr_sessionGetPeerLimit( const tr_session * );
@ -1159,6 +1167,32 @@ double tr_torrentGetRatioLimit( const tr_torrent * tor );
tr_bool tr_torrentGetSeedRatio( const tr_torrent *, double * ratio );
/****
***** Inactive Time Limits
****/
typedef enum
{
TR_INACTIVELIMIT_GLOBAL = 0, /* follow the global settings */
TR_INACTIVELIMIT_SINGLE = 1, /* override the global settings, seeding until a certain inactive time */
TR_INACTIVELIMIT_UNLIMITED = 2 /* override the global settings, seeding regardless of activity */
}
tr_inactvelimit;
void tr_torrentSetInactiveMode( tr_torrent * tor,
tr_inactvelimit mode );
tr_ratiolimit tr_torrentGetInactiveMode( const tr_torrent * tor );
void tr_torrentSetInactiveLimit( tr_torrent * tor,
uint64_t inactiveMinutes );
uint64_t tr_torrentGetInactiveLimit( const tr_torrent * tor );
tr_bool tr_torrentGetSeedInactive( const tr_torrent *, uint64_t * inactiveMinutes );
/****
***** Peer Limits
****/
@ -1288,6 +1322,10 @@ typedef void ( tr_torrent_completeness_func )( tr_torrent * torrent,
typedef void ( tr_torrent_ratio_limit_hit_func )( tr_torrent * torrent,
void * user_data );
typedef void ( tr_torrent_inactive_limit_hit_func )( tr_torrent * torrent,
void * user_data );
/**
* Register to be notified whenever a torrent's "completeness"
* changes. This will be called, for example, when a torrent
@ -1337,6 +1375,20 @@ void tr_torrentSetRatioLimitHitCallback(
void tr_torrentClearRatioLimitHitCallback( tr_torrent * torrent );
/**
* Register to be notified whenever a torrent's inactivity limit
* has been hit. This will be called when the seeding torrent's
* idle time has met or exceeded the designated inactivity limit.
*
* Has the same restrictions as tr_torrentSetCompletenessCallback
*/
void tr_torrentSetInactivityLimitHitCallback(
tr_torrent * torrent,
tr_torrent_inactive_limit_hit_func func,
void * user_data );
void tr_torrentClearInactiveLimitHitCallback( tr_torrent * torrent );
/**
* MANUAL ANNOUNCE
@ -1846,7 +1898,7 @@ typedef struct tr_stat
/** Number of seconds since the last activity (or since started).
-1 if activity is not seeding or downloading. */
int idleSecs;
/** A torrent is considered finished if it has met its seed ratio.
As a result, only paused torrents can be finished. */
tr_bool finished;

View File

@ -283,8 +283,6 @@ static void sleepCallback(void * controller, io_service_t y, natural_t messageTy
[fDefaults objectForKey: @"SpeedLimitAutoOffDate"]]);
tr_bencDictAddInt(&settings, TR_PREFS_KEY_ALT_SPEED_TIME_DAY, [fDefaults integerForKey: @"SpeedLimitAutoDay"]);
tr_bencDictAddBool(&settings, TR_PREFS_KEY_START, [fDefaults boolForKey: @"AutoStartDownload"]);
tr_bencDictAddInt(&settings, TR_PREFS_KEY_DSPEED_KBps, [fDefaults integerForKey: @"DownloadLimit"]);
tr_bencDictAddBool(&settings, TR_PREFS_KEY_DSPEED_ENABLED, [fDefaults boolForKey: @"CheckDownload"]);
tr_bencDictAddInt(&settings, TR_PREFS_KEY_USPEED_KBps, [fDefaults integerForKey: @"UploadLimit"]);
@ -300,6 +298,8 @@ static void sleepCallback(void * controller, io_service_t y, natural_t messageTy
tr_bencDictAddBool(&settings, TR_PREFS_KEY_DHT_ENABLED, [fDefaults boolForKey: @"DHTGlobal"]);
tr_bencDictAddStr(&settings, TR_PREFS_KEY_DOWNLOAD_DIR, [[[fDefaults stringForKey: @"DownloadFolder"]
stringByExpandingTildeInPath] UTF8String]);
tr_bencDictAddInt(&settings, TR_PREFS_KEY_INACTIVE_LIMIT, [fDefaults integerForKey: @"InactiveLimitMinutes"]);
tr_bencDictAddBool(&settings, TR_PREFS_KEY_INACTIVE_LIMIT_ENABLED, [fDefaults boolForKey: @"InactiveLimitCheck"]);
tr_bencDictAddStr(&settings, TR_PREFS_KEY_INCOMPLETE_DIR, [[[fDefaults stringForKey: @"IncompleteDownloadFolder"]
stringByExpandingTildeInPath] UTF8String]);
tr_bencDictAddBool(&settings, TR_PREFS_KEY_INCOMPLETE_DIR_ENABLED, [fDefaults boolForKey: @"UseIncompleteDownloadFolder"]);
@ -332,6 +332,7 @@ static void sleepCallback(void * controller, io_service_t y, natural_t messageTy
tr_bencDictAddInt(&settings, TR_PREFS_KEY_RPC_PORT, [fDefaults integerForKey: @"RPCPort"]);
tr_bencDictAddStr(&settings, TR_PREFS_KEY_RPC_USERNAME, [[fDefaults stringForKey: @"RPCUsername"] UTF8String]);
tr_bencDictAddBool(&settings, TR_PREFS_KEY_RPC_WHITELIST_ENABLED, [fDefaults boolForKey: @"RPCUseWhitelist"]);
tr_bencDictAddBool(&settings, TR_PREFS_KEY_START, [fDefaults boolForKey: @"AutoStartDownload"]);
tr_formatter_size_init(1024, [NSLocalizedString(@"KB", "File size - kilobytes") UTF8String],
[NSLocalizedString(@"MB", "File size - megabytes") UTF8String],

View File

@ -76,6 +76,10 @@
<integer>-2</integer>
<key>FilterSearchType</key>
<string>Name</string>
<key>InactiveLimitCheck</key>
<false/>
<key>InactiveLimitMinutes</key>
<integer>30</integer>
<key>IncompleteDownloadFolder</key>
<string>~/Downloads</string>
<key>InfoVisible</key>

View File

@ -31,11 +31,10 @@
BOOL fSet;
IBOutlet NSPopUpButton * fPriorityPopUp, * fRatioPopUp;
IBOutlet NSPopUpButton * fPriorityPopUp, * fRatioPopUp, * fInactivePopUp;
IBOutlet NSButton * fUploadLimitCheck, * fDownloadLimitCheck, * fGlobalLimitCheck;
IBOutlet NSTextField * fUploadLimitField, * fDownloadLimitField, * fRatioLimitField,
* fUploadLimitLabel, * fDownloadLimitLabel, * fPeersConnectLabel,
* fPeersConnectField;
IBOutlet NSTextField * fUploadLimitField, * fDownloadLimitField, * fRatioLimitField, * fInactiveLimitField,
* fUploadLimitLabel, * fDownloadLimitLabel, * fInactiveLimitLabel, * fPeersConnectLabel, * fPeersConnectField;
NSString * fInitialString;
}
@ -51,6 +50,9 @@
- (void) setRatioSetting: (id) sender;
- (void) setRatioLimit: (id) sender;
- (void) setInactiveSetting: (id) sender;
- (void) setInactiveLimit: (id) sender;
- (void) setPriority: (id) sender;
- (void) setPeersConnectLimit: (id) sender;

View File

@ -139,20 +139,28 @@
[fGlobalLimitCheck setState: globalUseSpeedLimit];
[fGlobalLimitCheck setEnabled: YES];
//get ratio info
//get ratio and inactive info
enumerator = [fTorrents objectEnumerator];
torrent = [enumerator nextObject]; //first torrent
NSInteger checkRatio = [torrent ratioSetting];
NSInteger checkRatio = [torrent ratioSetting], checkInactive = [torrent inactiveSetting];
CGFloat ratioLimit = [torrent ratioLimit];
NSUInteger inactiveLimit = [torrent inactiveLimitMinutes];
while ((torrent = [enumerator nextObject]) && (checkRatio != INVALID || ratioLimit != INVALID))
while ((torrent = [enumerator nextObject])
&& (checkRatio != INVALID || ratioLimit != INVALID || checkInactive != INVALID || inactiveLimit != INVALID))
{
if (checkRatio != INVALID && checkRatio != [torrent ratioSetting])
checkRatio = INVALID;
if (ratioLimit != INVALID && ratioLimit != [torrent ratioLimit])
ratioLimit = INVALID;
if (checkInactive != INVALID && checkInactive != [torrent inactiveSetting])
checkInactive = INVALID;
if (inactiveLimit != INVALID && inactiveLimit != [torrent inactiveLimitMinutes])
inactiveLimit = INVALID;
}
//set ratio view
@ -174,6 +182,25 @@
else
[fRatioLimitField setStringValue: @""];
//set inactive view
if (checkInactive == TR_INACTIVELIMIT_SINGLE)
index = OPTION_POPUP_LIMIT;
else if (checkInactive == TR_INACTIVELIMIT_UNLIMITED)
index = OPTION_POPUP_NO_LIMIT;
else if (checkInactive == TR_INACTIVELIMIT_GLOBAL)
index = OPTION_POPUP_GLOBAL;
else
index = -1;
[fInactivePopUp selectItemAtIndex: index];
[fInactivePopUp setEnabled: YES];
[fInactiveLimitField setHidden: checkInactive != TR_INACTIVELIMIT_SINGLE];
if (inactiveLimit != INVALID)
[fInactiveLimitField setIntegerValue: inactiveLimit];
else
[fInactiveLimitField setStringValue: @""];
[fInactiveLimitLabel setHidden: checkInactive != TR_INACTIVELIMIT_SINGLE];
//get priority info
enumerator = [fTorrents objectEnumerator];
torrent = [enumerator nextObject]; //first torrent
@ -298,12 +325,53 @@
- (void) setRatioLimit: (id) sender
{
CGFloat limit = [sender floatValue];
const CGFloat limit = [sender floatValue];
for (Torrent * torrent in fTorrents)
[torrent setRatioLimit: limit];
}
- (void) setInactiveSetting: (id) sender
{
NSInteger setting;
bool single = NO;
switch ([sender indexOfSelectedItem])
{
case OPTION_POPUP_LIMIT:
setting = TR_INACTIVELIMIT_SINGLE;
single = YES;
break;
case OPTION_POPUP_NO_LIMIT:
setting = TR_INACTIVELIMIT_UNLIMITED;
break;
case OPTION_POPUP_GLOBAL:
setting = TR_INACTIVELIMIT_GLOBAL;
break;
default:
NSAssert1(NO, @"Unknown option selected in inactive popup: %d", [sender indexOfSelectedItem]);
return;
}
for (Torrent * torrent in fTorrents)
[torrent setInactiveSetting: setting];
[fInactiveLimitField setHidden: !single];
[fInactiveLimitLabel setHidden: !single];
if (single)
{
[fInactiveLimitField selectText: self];
[[[self view] window] makeKeyAndOrderFront: self];
}
}
- (void) setInactiveLimit: (id) sender
{
const NSUInteger limit = [sender integerValue];
for (Torrent * torrent in fTorrents)
[torrent setInactiveLimitMinutes: limit];
}
- (void) setPriority: (id) sender
{
tr_priority_t priority;
@ -388,6 +456,12 @@
[fRatioLimitField setHidden: YES];
[fRatioLimitField setStringValue: @""];
[fInactivePopUp setEnabled: NO];
[fInactivePopUp selectItemAtIndex: -1];
[fInactiveLimitField setHidden: YES];
[fInactiveLimitField setStringValue: @""];
[fInactiveLimitLabel setHidden: YES];
[fPeersConnectField setEnabled: NO];
[fPeersConnectField setStringValue: @""];
[fPeersConnectLabel setEnabled: NO];

View File

@ -37,7 +37,7 @@
NSString * fInitialString;
IBOutlet NSPopUpButton * fFolderPopUp, * fIncompleteFolderPopUp, * fImportFolderPopUp;
IBOutlet NSTextField * fRatioStopField, * fQueueDownloadField, * fQueueSeedField, * fStalledField;
IBOutlet NSTextField * fRatioStopField, * fInactiveStopField, * fQueueDownloadField, * fQueueSeedField, * fStalledField;
IBOutlet NSTextField * fUploadField, * fDownloadField,
* fSpeedLimitUploadField, * fSpeedLimitDownloadField;
@ -115,8 +115,11 @@
- (void) setRenamePartialFiles: (id) sender;
- (void) applyRatioSetting: (id) sender;
- (void) updateRatioStopField;
- (void) setRatioStop: (id) sender;
- (void) updateRatioStopField;
- (void) applyInactiveStopSetting: (id) sender;
- (void) setInactiveStop: (id) sender;
- (void) applySpeedSettings: (id) sender;
- (void) applyAltSpeedSettings;

View File

@ -183,6 +183,9 @@ tr_session * fHandle;
//set stop ratio
[fRatioStopField setFloatValue: [fDefaults floatForKey: @"RatioLimit"]];
//set inactive seeding minutes
[fInactiveStopField setIntegerValue: [fDefaults integerForKey: @"InactiveLimitMinutes"]];
//set limits
[self updateLimitFields];
@ -589,11 +592,17 @@ tr_session * fHandle;
- (void) applyRatioSetting: (id) sender
{
//[[NSNotificationCenter defaultCenter] postNotificationName: @"UpdateUI" object: nil];
tr_sessionSetRatioLimited(fHandle, [fDefaults boolForKey: @"RatioCheck"]);
tr_sessionSetRatioLimit(fHandle, [fDefaults floatForKey: @"RatioLimit"]);
}
- (void) setRatioStop: (id) sender
{
[fDefaults setFloat: [sender floatValue] forKey: @"RatioLimit"];
[self applyRatioSetting: nil];
}
- (void) updateRatioStopField
{
if (fHasLoaded)
@ -602,11 +611,17 @@ tr_session * fHandle;
[self applyRatioSetting: nil];
}
- (void) setRatioStop: (id) sender
- (void) applyInactiveStopSetting: (id) sender
{
[fDefaults setFloat: [sender floatValue] forKey: @"RatioLimit"];
tr_sessionSetInactivityLimited(fHandle, [fDefaults boolForKey: @"InactiveLimitCheck"]);
tr_sessionSetInactiveLimit(fHandle, [fDefaults integerForKey: @"InactiveLimitMinutes"]);
}
- (void) setInactiveStop: (id) sender
{
[fDefaults setInteger: [sender integerValue] forKey: @"InactiveLimitMinutes"];
[self applyRatioSetting: nil];
[self applyInactiveStopSetting: nil];
}
- (void) updateLimitFields
@ -1226,6 +1241,13 @@ tr_session * fHandle;
const float ratioLimit = tr_sessionGetRatioLimit(fHandle);
[fDefaults setFloat: ratioLimit forKey: @"RatioLimit"];
//inactive seed limit
const BOOL inactivityLimited = tr_sessionIsInactivityLimited(fHandle);
[fDefaults setBool: inactivityLimited forKey: @"InactiveLimitCheck"];
const NSUInteger inactiveLimitMin = tr_sessionGetInactiveLimit(fHandle);
[fDefaults setInteger: inactiveLimitMin forKey: @"InactiveLimitMinutes"];
//update gui if loaded
if (fHasLoaded)
{
@ -1264,6 +1286,9 @@ tr_session * fHandle;
//ratio limit enabled handled by bindings
[fRatioStopField setFloatValue: ratioLimit];
//inactivity limit enabled handled by bindings
[fInactiveStopField setIntegerValue: inactiveLimitMin];
}
[[NSNotificationCenter defaultCenter] postNotificationName: @"SpeedLimitUpdate" object: nil];

View File

@ -98,6 +98,12 @@
- (BOOL) seedRatioSet;
- (CGFloat) progressStopRatio;
- (tr_inactvelimit) inactiveSetting;
- (void) setInactiveSetting: (tr_inactvelimit) setting;
- (NSUInteger) inactiveLimitMinutes;
- (void) setInactiveLimitMinutes: (NSUInteger) limit;
- (BOOL) seedInactiveLimitSet;
- (BOOL) usesSpeedLimit: (BOOL) upload;
- (void) setUseSpeedLimit: (BOOL) use upload: (BOOL) upload;
- (NSInteger) speedLimit: (BOOL) upload;

View File

@ -45,6 +45,7 @@
- (void) completenessChange: (NSDictionary *) statusInfo;
- (void) ratioLimitHit;
- (void) inactiveLimitHit;
- (void) metadataRetrieved;
- (NSString *) etaString;
@ -65,6 +66,11 @@ void ratioLimitHitCallback(tr_torrent * torrent, void * torrentData)
[(Torrent *)torrentData performSelectorOnMainThread: @selector(ratioLimitHit) withObject: nil waitUntilDone: NO];
}
void inactiveLimitHitCallback(tr_torrent * torrent, void * torrentData)
{
[(Torrent *)torrentData performSelectorOnMainThread: @selector(inactiveLimitHit) withObject: nil waitUntilDone: NO];
}
void metadataCallback(tr_torrent * torrent, void * torrentData)
{
[(Torrent *)torrentData performSelectorOnMainThread: @selector(metadataRetrieved) withObject: nil waitUntilDone: NO];
@ -292,7 +298,7 @@ int trashDataFile(const char * filename)
tr_torrentStart(fHandle);
[self update];
//capture, specifically, ratio setting changing to unlimited
//capture, specifically, stop-seeding settings changing to unlimited
[[NSNotificationCenter defaultCenter] postNotificationName: @"UpdateOptions" object: nil];
}
}
@ -387,6 +393,32 @@ int trashDataFile(const char * filename)
return fStat->seedRatioPercentDone;
}
- (tr_inactvelimit) inactiveSetting
{
return tr_torrentGetInactiveMode(fHandle);
}
- (void) setInactiveSetting: (tr_inactvelimit) setting
{
tr_torrentSetInactiveMode(fHandle, setting);
}
- (NSUInteger) inactiveLimitMinutes
{
return tr_torrentGetInactiveLimit(fHandle);
}
- (void) setInactiveLimitMinutes: (NSUInteger) limit
{
NSAssert(limit > 0, @"Inactive limit must be greater than zero");
tr_torrentSetInactiveLimit(fHandle, limit);
}
- (BOOL) seedInactiveLimitSet
{
return tr_torrentGetSeedInactive(fHandle, NULL);
}
- (BOOL) usesSpeedLimit: (BOOL) upload
{
return tr_torrentUsesSpeedLimit(fHandle, upload ? TR_UP : TR_DOWN);
@ -980,7 +1012,7 @@ int trashDataFile(const char * filename)
string = [downloadString stringByAppendingFormat: @", %@", uploadString];
}
//add time when downloading
//add time when downloading or seed limit set
if (fStat->activity == TR_STATUS_DOWNLOAD || ([self isSeeding] && [self seedRatioSet]))
string = [string stringByAppendingFormat: @" - %@", [self etaString]];
@ -1129,6 +1161,7 @@ int trashDataFile(const char * filename)
- (NSString *) remainingTimeString
{
#warning update?
if (fStat->activity == TR_STATUS_DOWNLOAD || ([self isSeeding] && [self seedRatioSet]))
return [self etaString];
else
@ -1613,6 +1646,7 @@ int trashDataFile(const char * filename)
tr_torrentSetCompletenessCallback(fHandle, completenessChangeCallback, self);
tr_torrentSetRatioLimitHitCallback(fHandle, ratioLimitHitCallback, self);
tr_torrentSetInactiveLimitHitCallback(fHandle, inactiveLimitHitCallback, self);
tr_torrentSetMetadataCallback(fHandle, metadataCallback, self);
fHashString = [[NSString alloc] initWithUTF8String: fInfo->hashString];
@ -1768,6 +1802,14 @@ int trashDataFile(const char * filename)
[[NSNotificationCenter defaultCenter] postNotificationName: @"TorrentStoppedForRatio" object: self];
}
- (void) inactiveLimitHit
{
fStat = tr_torrentStat(fHandle);
#warning fix
[[NSNotificationCenter defaultCenter] postNotificationName: @"TorrentStoppedForRatio" object: self];
}
- (void) metadataRetrieved
{
fStat = tr_torrentStat(fHandle);

View File

@ -2,13 +2,13 @@
<archive type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="7.10">
<data>
<int key="IBDocument.SystemTarget">1060</int>
<string key="IBDocument.SystemVersion">10C540</string>
<string key="IBDocument.InterfaceBuilderVersion">740</string>
<string key="IBDocument.AppKitVersion">1038.25</string>
<string key="IBDocument.HIToolboxVersion">458.00</string>
<string key="IBDocument.SystemVersion">10F569</string>
<string key="IBDocument.InterfaceBuilderVersion">762</string>
<string key="IBDocument.AppKitVersion">1038.29</string>
<string key="IBDocument.HIToolboxVersion">461.00</string>
<object class="NSMutableDictionary" key="IBDocument.PluginVersions">
<string key="NS.key.0">com.apple.InterfaceBuilder.CocoaPlugin</string>
<string key="NS.object.0">740</string>
<string key="NS.object.0">762</string>
</object>
<object class="NSMutableArray" key="IBDocument.EditedObjectIDs">
<bool key="EncodedWithXMLCoder">YES</bool>
@ -43,13 +43,13 @@
<int key="NSvFlags">258</int>
<object class="NSMutableArray" key="NSSubviews">
<bool key="EncodedWithXMLCoder">YES</bool>
<object class="NSTextField" id="787858145">
<object class="NSTextField" id="317277208">
<reference key="NSNextResponder" ref="617828785"/>
<int key="NSvFlags">268</int>
<string key="NSFrame">{{207, 54}, {45, 20}}</string>
<string key="NSFrame">{{218, 54}, {45, 20}}</string>
<reference key="NSSuperview" ref="617828785"/>
<bool key="NSEnabled">YES</bool>
<object class="NSTextFieldCell" key="NSCell" id="156964320">
<object class="NSTextFieldCell" key="NSCell" id="517007757">
<int key="NSCellFlags">-1804468671</int>
<int key="NSCellFlags2">272761856</int>
<object class="NSFont" key="NSSupport" id="26">
@ -57,6 +57,208 @@
<double key="NSSize">11</double>
<int key="NSfFlags">3100</int>
</object>
<object class="NSNumberFormatter" key="NSFormatter" id="285060614">
<object class="NSMutableDictionary" key="NS.attributes">
<bool key="EncodedWithXMLCoder">YES</bool>
<object class="NSArray" key="dict.sortedKeys">
<bool key="EncodedWithXMLCoder">YES</bool>
<string>allowsFloats</string>
<string>formatterBehavior</string>
<string>lenient</string>
<string>maximum</string>
<string>minimum</string>
<string>negativeInfinitySymbol</string>
<string>nilSymbol</string>
<string>numberStyle</string>
<string>positiveInfinitySymbol</string>
</object>
<object class="NSMutableArray" key="dict.values">
<bool key="EncodedWithXMLCoder">YES</bool>
<boolean value="YES"/>
<integer value="1040"/>
<boolean value="NO"/>
<real value="10000"/>
<real value="1"/>
<string>-∞</string>
<string/>
<integer value="0"/>
<string>+∞</string>
</object>
</object>
<string key="NS.positiveformat">#</string>
<string key="NS.negativeformat">#</string>
<nil key="NS.positiveattrs"/>
<nil key="NS.negativeattrs"/>
<nil key="NS.zero"/>
<object class="NSAttributedString" key="NS.nil">
<string key="NSString"/>
</object>
<object class="NSAttributedString" key="NS.nan">
<string key="NSString">NaN</string>
<object class="NSDictionary" key="NSAttributes" id="1014964092">
<bool key="EncodedWithXMLCoder">YES</bool>
<reference key="dict.sortedKeys" ref="0"/>
<object class="NSMutableArray" key="dict.values">
<bool key="EncodedWithXMLCoder">YES</bool>
</object>
</object>
</object>
<real value="1" key="NS.min"/>
<real value="10000" key="NS.max"/>
<object class="NSDecimalNumberHandler" key="NS.rounding">
<int key="NS.roundingmode">3</int>
<bool key="NS.raise.overflow">YES</bool>
<bool key="NS.raise.underflow">YES</bool>
<bool key="NS.raise.dividebyzero">YES</bool>
</object>
<string key="NS.decimal">.</string>
<string key="NS.thousand">,</string>
<bool key="NS.hasthousands">NO</bool>
<bool key="NS.localized">YES</bool>
<bool key="NS.allowsfloats">YES</bool>
</object>
<reference key="NSControlView" ref="317277208"/>
<bool key="NSDrawsBackground">YES</bool>
<object class="NSColor" key="NSBackgroundColor" id="246996512">
<int key="NSColorSpace">6</int>
<string key="NSCatalogName">System</string>
<string key="NSColorName">textBackgroundColor</string>
<object class="NSColor" key="NSColor">
<int key="NSColorSpace">3</int>
<bytes key="NSWhite">MQA</bytes>
</object>
</object>
<object class="NSColor" key="NSTextColor" id="648134242">
<int key="NSColorSpace">6</int>
<string key="NSCatalogName">System</string>
<string key="NSColorName">textColor</string>
<object class="NSColor" key="NSColor" id="644997769">
<int key="NSColorSpace">3</int>
<bytes key="NSWhite">MAA</bytes>
</object>
</object>
</object>
</object>
<object class="NSPopUpButton" id="110760088">
<reference key="NSNextResponder" ref="617828785"/>
<int key="NSvFlags">268</int>
<string key="NSFrame">{{69, 52}, {144, 22}}</string>
<reference key="NSSuperview" ref="617828785"/>
<bool key="NSEnabled">YES</bool>
<object class="NSPopUpButtonCell" key="NSCell" id="669284794">
<int key="NSCellFlags">-2076049856</int>
<int key="NSCellFlags2">133120</int>
<reference key="NSSupport" ref="26"/>
<reference key="NSControlView" ref="110760088"/>
<int key="NSButtonFlags">-2038284033</int>
<int key="NSButtonFlags2">1</int>
<object class="NSFont" key="NSAlternateImage" id="292875478">
<string key="NSName">LucidaGrande</string>
<double key="NSSize">11</double>
<int key="NSfFlags">16</int>
</object>
<string key="NSAlternateContents"/>
<object class="NSMutableString" key="NSKeyEquivalent">
<characters key="NS.bytes"/>
</object>
<int key="NSPeriodicDelay">400</int>
<int key="NSPeriodicInterval">75</int>
<object class="NSMenuItem" key="NSMenuItem" id="424536198">
<reference key="NSMenu" ref="719019509"/>
<string key="NSTitle">Stop When Inactive</string>
<string key="NSKeyEquiv"/>
<int key="NSKeyEquivModMask">1048576</int>
<int key="NSMnemonicLoc">2147483647</int>
<int key="NSState">1</int>
<object class="NSCustomResource" key="NSOnImage" id="662512792">
<string key="NSClassName">NSImage</string>
<string key="NSResourceName">NSMenuCheckmark</string>
</object>
<object class="NSCustomResource" key="NSMixedImage" id="999867276">
<string key="NSClassName">NSImage</string>
<string key="NSResourceName">NSMenuMixedState</string>
</object>
<string key="NSAction">_popUpItemAction:</string>
<reference key="NSTarget" ref="669284794"/>
</object>
<bool key="NSMenuItemRespectAlignment">YES</bool>
<object class="NSMenu" key="NSMenu" id="719019509">
<object class="NSMutableString" key="NSTitle">
<characters key="NS.bytes">OtherViews</characters>
</object>
<object class="NSMutableArray" key="NSMenuItems">
<bool key="EncodedWithXMLCoder">YES</bool>
<object class="NSMenuItem" id="271264514">
<reference key="NSMenu" ref="719019509"/>
<string key="NSTitle">Global Setting</string>
<string key="NSKeyEquiv"/>
<int key="NSKeyEquivModMask">1048576</int>
<int key="NSMnemonicLoc">2147483647</int>
<reference key="NSOnImage" ref="662512792"/>
<reference key="NSMixedImage" ref="999867276"/>
<string key="NSAction">_popUpItemAction:</string>
<reference key="NSTarget" ref="669284794"/>
</object>
<object class="NSMenuItem" id="408933788">
<reference key="NSMenu" ref="719019509"/>
<string key="NSTitle">Unlimited</string>
<string key="NSKeyEquiv"/>
<int key="NSKeyEquivModMask">1048576</int>
<int key="NSMnemonicLoc">2147483647</int>
<reference key="NSOnImage" ref="662512792"/>
<reference key="NSMixedImage" ref="999867276"/>
<string key="NSAction">_popUpItemAction:</string>
<reference key="NSTarget" ref="669284794"/>
</object>
<reference ref="424536198"/>
</object>
</object>
<int key="NSSelectedIndex">2</int>
<int key="NSPreferredEdge">3</int>
<bool key="NSUsesItemFromMenu">YES</bool>
<bool key="NSAltersState">YES</bool>
<int key="NSArrowPosition">1</int>
</object>
</object>
<object class="NSTextField" id="919278636">
<reference key="NSNextResponder" ref="617828785"/>
<int key="NSvFlags">268</int>
<string key="NSFrame">{{11, 57}, {56, 14}}</string>
<reference key="NSSuperview" ref="617828785"/>
<bool key="NSEnabled">YES</bool>
<object class="NSTextFieldCell" key="NSCell" id="563562657">
<int key="NSCellFlags">67239424</int>
<int key="NSCellFlags2">272629760</int>
<string key="NSContents">Inactivity:</string>
<reference key="NSSupport" ref="26"/>
<reference key="NSControlView" ref="919278636"/>
<object class="NSColor" key="NSBackgroundColor" id="874092629">
<int key="NSColorSpace">6</int>
<string key="NSCatalogName">System</string>
<string key="NSColorName">controlColor</string>
<object class="NSColor" key="NSColor">
<int key="NSColorSpace">3</int>
<bytes key="NSWhite">MC42NjY2NjY2NjY3AA</bytes>
</object>
</object>
<object class="NSColor" key="NSTextColor" id="90083712">
<int key="NSColorSpace">6</int>
<string key="NSCatalogName">System</string>
<string key="NSColorName">controlTextColor</string>
<reference key="NSColor" ref="644997769"/>
</object>
</object>
</object>
<object class="NSTextField" id="787858145">
<reference key="NSNextResponder" ref="617828785"/>
<int key="NSvFlags">268</int>
<string key="NSFrame">{{218, 76}, {45, 20}}</string>
<reference key="NSSuperview" ref="617828785"/>
<bool key="NSEnabled">YES</bool>
<object class="NSTextFieldCell" key="NSCell" id="156964320">
<int key="NSCellFlags">-1804468671</int>
<int key="NSCellFlags2">272761856</int>
<reference key="NSSupport" ref="26"/>
<object class="NSNumberFormatter" key="NSFormatter" id="180699713">
<object class="NSMutableDictionary" key="NS.attributes">
<bool key="EncodedWithXMLCoder">YES</bool>
@ -95,13 +297,7 @@
<nil key="NS.nil"/>
<object class="NSAttributedString" key="NS.nan">
<string key="NSString">NaN</string>
<object class="NSDictionary" key="NSAttributes" id="136839943">
<bool key="EncodedWithXMLCoder">YES</bool>
<reference key="dict.sortedKeys" ref="0"/>
<object class="NSMutableArray" key="dict.values">
<bool key="EncodedWithXMLCoder">YES</bool>
</object>
</object>
<reference key="NSAttributes" ref="1014964092"/>
</object>
<integer value="0" key="NS.min"/>
<real value="10000" key="NS.max"/>
@ -119,63 +315,34 @@
</object>
<reference key="NSControlView" ref="787858145"/>
<bool key="NSDrawsBackground">YES</bool>
<object class="NSColor" key="NSBackgroundColor" id="246996512">
<int key="NSColorSpace">6</int>
<string key="NSCatalogName">System</string>
<string key="NSColorName">textBackgroundColor</string>
<object class="NSColor" key="NSColor">
<int key="NSColorSpace">3</int>
<bytes key="NSWhite">MQA</bytes>
</object>
</object>
<object class="NSColor" key="NSTextColor" id="648134242">
<int key="NSColorSpace">6</int>
<string key="NSCatalogName">System</string>
<string key="NSColorName">textColor</string>
<object class="NSColor" key="NSColor" id="644997769">
<int key="NSColorSpace">3</int>
<bytes key="NSWhite">MAA</bytes>
</object>
</object>
<reference key="NSBackgroundColor" ref="246996512"/>
<reference key="NSTextColor" ref="648134242"/>
</object>
</object>
<object class="NSTextField" id="275413408">
<reference key="NSNextResponder" ref="617828785"/>
<int key="NSvFlags">268</int>
<string key="NSFrame">{{9, 73}, {49, 17}}</string>
<string key="NSFrame">{{9, 95}, {88, 17}}</string>
<reference key="NSSuperview" ref="617828785"/>
<bool key="NSEnabled">YES</bool>
<object class="NSTextFieldCell" key="NSCell" id="960257683">
<int key="NSCellFlags">67239424</int>
<int key="NSCellFlags2">272629760</int>
<string key="NSContents">Seeding</string>
<string key="NSContents">Seeding Limits</string>
<object class="NSFont" key="NSSupport" id="27">
<string key="NSName">LucidaGrande-Bold</string>
<double key="NSSize">11</double>
<int key="NSfFlags">3357</int>
</object>
<reference key="NSControlView" ref="275413408"/>
<object class="NSColor" key="NSBackgroundColor" id="874092629">
<int key="NSColorSpace">6</int>
<string key="NSCatalogName">System</string>
<string key="NSColorName">controlColor</string>
<object class="NSColor" key="NSColor">
<int key="NSColorSpace">3</int>
<bytes key="NSWhite">MC42NjY2NjY2NjY3AA</bytes>
</object>
</object>
<object class="NSColor" key="NSTextColor" id="90083712">
<int key="NSColorSpace">6</int>
<string key="NSCatalogName">System</string>
<string key="NSColorName">controlTextColor</string>
<reference key="NSColor" ref="644997769"/>
</object>
<reference key="NSBackgroundColor" ref="874092629"/>
<reference key="NSTextColor" ref="90083712"/>
</object>
</object>
<object class="NSTextField" id="1004759797">
<reference key="NSNextResponder" ref="617828785"/>
<int key="NSvFlags">268</int>
<string key="NSFrame">{{9, 159}, {117, 14}}</string>
<string key="NSFrame">{{9, 181}, {117, 14}}</string>
<reference key="NSSuperview" ref="617828785"/>
<bool key="NSEnabled">YES</bool>
<object class="NSTextFieldCell" key="NSCell" id="51582947">
@ -191,7 +358,7 @@
<object class="NSTextField" id="234468111">
<reference key="NSNextResponder" ref="617828785"/>
<int key="NSvFlags">268</int>
<string key="NSFrame">{{9, 197}, {46, 17}}</string>
<string key="NSFrame">{{9, 219}, {46, 17}}</string>
<reference key="NSSuperview" ref="617828785"/>
<bool key="NSEnabled">YES</bool>
<object class="NSTextFieldCell" key="NSCell" id="235794164">
@ -207,7 +374,7 @@
<object class="NSTextField" id="38678337">
<reference key="NSNextResponder" ref="617828785"/>
<int key="NSvFlags">268</int>
<string key="NSFrame">{{123, 115}, {35, 20}}</string>
<string key="NSFrame">{{123, 137}, {35, 20}}</string>
<reference key="NSSuperview" ref="617828785"/>
<bool key="NSEnabled">YES</bool>
<object class="NSTextFieldCell" key="NSCell" id="886515737">
@ -244,7 +411,7 @@
<nil key="NS.nil"/>
<object class="NSAttributedString" key="NS.nan">
<string key="NSString">NaN</string>
<reference key="NSAttributes" ref="136839943"/>
<reference key="NSAttributes" ref="1014964092"/>
</object>
<integer value="0" key="NS.min"/>
<real value="10000" key="NS.max"/>
@ -269,7 +436,7 @@
<object class="NSTextField" id="531478243">
<reference key="NSNextResponder" ref="617828785"/>
<int key="NSvFlags">268</int>
<string key="NSFrame">{{163, 118}, {29, 14}}</string>
<string key="NSFrame">{{163, 140}, {29, 14}}</string>
<reference key="NSSuperview" ref="617828785"/>
<bool key="NSEnabled">YES</bool>
<object class="NSTextFieldCell" key="NSCell" id="619733085">
@ -285,7 +452,7 @@
<object class="NSTextField" id="520423397">
<reference key="NSNextResponder" ref="617828785"/>
<int key="NSvFlags">268</int>
<string key="NSFrame">{{123, 137}, {35, 20}}</string>
<string key="NSFrame">{{123, 159}, {35, 20}}</string>
<reference key="NSSuperview" ref="617828785"/>
<bool key="NSEnabled">YES</bool>
<object class="NSTextFieldCell" key="NSCell" id="668169900">
@ -322,7 +489,7 @@
<nil key="NS.nil"/>
<object class="NSAttributedString" key="NS.nan">
<string key="NSString">NaN</string>
<reference key="NSAttributes" ref="136839943"/>
<reference key="NSAttributes" ref="1014964092"/>
</object>
<integer value="0" key="NS.min"/>
<real value="10000" key="NS.max"/>
@ -344,10 +511,26 @@
<reference key="NSTextColor" ref="648134242"/>
</object>
</object>
<object class="NSTextField" id="706967535">
<reference key="NSNextResponder" ref="617828785"/>
<int key="NSvFlags">268</int>
<string key="NSFrame">{{268, 57}, {47, 14}}</string>
<reference key="NSSuperview" ref="617828785"/>
<bool key="NSEnabled">YES</bool>
<object class="NSTextFieldCell" key="NSCell" id="38211108">
<int key="NSCellFlags">67239424</int>
<int key="NSCellFlags2">272629760</int>
<string key="NSContents">minutes</string>
<reference key="NSSupport" ref="26"/>
<reference key="NSControlView" ref="706967535"/>
<reference key="NSBackgroundColor" ref="874092629"/>
<reference key="NSTextColor" ref="90083712"/>
</object>
</object>
<object class="NSTextField" id="1027547097">
<reference key="NSNextResponder" ref="617828785"/>
<int key="NSvFlags">268</int>
<string key="NSFrame">{{163, 140}, {29, 14}}</string>
<string key="NSFrame">{{163, 162}, {29, 14}}</string>
<reference key="NSSuperview" ref="617828785"/>
<bool key="NSEnabled">YES</bool>
<object class="NSTextFieldCell" key="NSCell" id="1042346107">
@ -363,7 +546,7 @@
<object class="NSPopUpButton" id="705594185">
<reference key="NSNextResponder" ref="617828785"/>
<int key="NSvFlags">268</int>
<string key="NSFrame">{{89, 52}, {116, 22}}</string>
<string key="NSFrame">{{69, 74}, {144, 22}}</string>
<reference key="NSSuperview" ref="617828785"/>
<bool key="NSEnabled">YES</bool>
<object class="NSPopUpButtonCell" key="NSCell" id="931579513">
@ -373,11 +556,7 @@
<reference key="NSControlView" ref="705594185"/>
<int key="NSButtonFlags">-2038284033</int>
<int key="NSButtonFlags2">1</int>
<object class="NSFont" key="NSAlternateImage">
<string key="NSName">LucidaGrande</string>
<double key="NSSize">11</double>
<int key="NSfFlags">16</int>
</object>
<reference key="NSAlternateImage" ref="292875478"/>
<string key="NSAlternateContents"/>
<object class="NSMutableString" key="NSKeyEquivalent">
<characters key="NS.bytes"/>
@ -391,14 +570,8 @@
<int key="NSKeyEquivModMask">1048576</int>
<int key="NSMnemonicLoc">2147483647</int>
<int key="NSState">1</int>
<object class="NSCustomResource" key="NSOnImage" id="632268411">
<string key="NSClassName">NSImage</string>
<string key="NSResourceName">NSMenuCheckmark</string>
</object>
<object class="NSCustomResource" key="NSMixedImage" id="917913453">
<string key="NSClassName">NSImage</string>
<string key="NSResourceName">NSMenuMixedState</string>
</object>
<reference key="NSOnImage" ref="662512792"/>
<reference key="NSMixedImage" ref="999867276"/>
<string key="NSAction">_popUpItemAction:</string>
<reference key="NSTarget" ref="931579513"/>
</object>
@ -412,12 +585,12 @@
<reference ref="759858272"/>
<object class="NSMenuItem" id="100083644">
<reference key="NSMenu" ref="57997422"/>
<string key="NSTitle">Seed Forever</string>
<string key="NSTitle">Unlimited</string>
<string key="NSKeyEquiv"/>
<int key="NSKeyEquivModMask">1048576</int>
<int key="NSMnemonicLoc">2147483647</int>
<reference key="NSOnImage" ref="632268411"/>
<reference key="NSMixedImage" ref="917913453"/>
<reference key="NSOnImage" ref="662512792"/>
<reference key="NSMixedImage" ref="999867276"/>
<string key="NSAction">_popUpItemAction:</string>
<reference key="NSTarget" ref="931579513"/>
</object>
@ -427,8 +600,8 @@
<string key="NSKeyEquiv"/>
<int key="NSKeyEquivModMask">1048576</int>
<int key="NSMnemonicLoc">2147483647</int>
<reference key="NSOnImage" ref="632268411"/>
<reference key="NSMixedImage" ref="917913453"/>
<reference key="NSOnImage" ref="662512792"/>
<reference key="NSMixedImage" ref="999867276"/>
<string key="NSAction">_popUpItemAction:</string>
<reference key="NSTarget" ref="931579513"/>
</object>
@ -443,13 +616,13 @@
<object class="NSTextField" id="457156870">
<reference key="NSNextResponder" ref="617828785"/>
<int key="NSvFlags">268</int>
<string key="NSFrame">{{10, 57}, {77, 14}}</string>
<string key="NSFrame">{{10, 79}, {35, 14}}</string>
<reference key="NSSuperview" ref="617828785"/>
<bool key="NSEnabled">YES</bool>
<object class="NSTextFieldCell" key="NSCell" id="1061208496">
<int key="NSCellFlags">67239424</int>
<int key="NSCellFlags2">272629760</int>
<string key="NSContents">Stop Seeding:</string>
<string key="NSContents">Ratio:</string>
<reference key="NSSupport" ref="26"/>
<reference key="NSControlView" ref="457156870"/>
<reference key="NSBackgroundColor" ref="874092629"/>
@ -459,7 +632,7 @@
<object class="NSTextField" id="340525598">
<reference key="NSNextResponder" ref="617828785"/>
<int key="NSvFlags">268</int>
<string key="NSFrame">{{9, 182}, {95, 14}}</string>
<string key="NSFrame">{{9, 204}, {95, 14}}</string>
<reference key="NSSuperview" ref="617828785"/>
<bool key="NSEnabled">YES</bool>
<object class="NSTextFieldCell" key="NSCell" id="780052505">
@ -542,7 +715,7 @@
<nil key="NS.nil"/>
<object class="NSAttributedString" key="NS.nan">
<string key="NSString">NaN</string>
<reference key="NSAttributes" ref="136839943"/>
<reference key="NSAttributes" ref="1014964092"/>
</object>
<integer value="1" key="NS.min"/>
<real value="3000" key="NS.max"/>
@ -583,7 +756,7 @@
<object class="NSButton" id="166572511">
<reference key="NSNextResponder" ref="617828785"/>
<int key="NSvFlags">268</int>
<string key="NSFrame">{{11, 116}, {90, 18}}</string>
<string key="NSFrame">{{11, 138}, {90, 18}}</string>
<reference key="NSSuperview" ref="617828785"/>
<bool key="NSEnabled">YES</bool>
<object class="NSButtonCell" key="NSCell" id="482789677">
@ -610,7 +783,7 @@
<object class="NSButton" id="900455097">
<reference key="NSNextResponder" ref="617828785"/>
<int key="NSvFlags">268</int>
<string key="NSFrame">{{11, 96}, {230, 18}}</string>
<string key="NSFrame">{{11, 118}, {230, 18}}</string>
<reference key="NSSuperview" ref="617828785"/>
<bool key="NSEnabled">YES</bool>
<object class="NSButtonCell" key="NSCell" id="582573900">
@ -632,7 +805,7 @@
<object class="NSButton" id="614569420">
<reference key="NSNextResponder" ref="617828785"/>
<int key="NSvFlags">268</int>
<string key="NSFrame">{{11, 138}, {106, 18}}</string>
<string key="NSFrame">{{11, 160}, {106, 18}}</string>
<reference key="NSSuperview" ref="617828785"/>
<bool key="NSEnabled">YES</bool>
<object class="NSButtonCell" key="NSCell" id="818727845">
@ -654,7 +827,7 @@
<object class="NSPopUpButton" id="529271757">
<reference key="NSNextResponder" ref="617828785"/>
<int key="NSvFlags">268</int>
<string key="NSFrame">{{106, 177}, {101, 22}}</string>
<string key="NSFrame">{{106, 199}, {101, 22}}</string>
<reference key="NSSuperview" ref="617828785"/>
<bool key="NSEnabled">YES</bool>
<object class="NSPopUpButtonCell" key="NSCell" id="545585394">
@ -679,8 +852,8 @@
<string key="NSClassName">NSImage</string>
<string key="NSResourceName">PriorityNormal</string>
</object>
<reference key="NSOnImage" ref="632268411"/>
<reference key="NSMixedImage" ref="917913453"/>
<reference key="NSOnImage" ref="662512792"/>
<reference key="NSMixedImage" ref="999867276"/>
<string key="NSAction">_popUpItemAction:</string>
<int key="NSTag">1</int>
<reference key="NSTarget" ref="545585394"/>
@ -700,8 +873,8 @@
<string key="NSClassName">NSImage</string>
<string key="NSResourceName">PriorityHigh</string>
</object>
<reference key="NSOnImage" ref="632268411"/>
<reference key="NSMixedImage" ref="917913453"/>
<reference key="NSOnImage" ref="662512792"/>
<reference key="NSMixedImage" ref="999867276"/>
<string key="NSAction">_popUpItemAction:</string>
<reference key="NSTarget" ref="545585394"/>
</object>
@ -716,8 +889,8 @@
<string key="NSClassName">NSImage</string>
<string key="NSResourceName">PriorityLow</string>
</object>
<reference key="NSOnImage" ref="632268411"/>
<reference key="NSMixedImage" ref="917913453"/>
<reference key="NSOnImage" ref="662512792"/>
<reference key="NSMixedImage" ref="999867276"/>
<string key="NSAction">_popUpItemAction:</string>
<int key="NSTag">2</int>
<reference key="NSTarget" ref="545585394"/>
@ -732,7 +905,7 @@
</object>
</object>
</object>
<string key="NSFrameSize">{351, 219}</string>
<string key="NSFrameSize">{351, 241}</string>
<reference key="NSSuperview"/>
<object class="NSMutableString" key="NSClassName">
<characters key="NS.bytes">NSView</characters>
@ -951,6 +1124,54 @@
</object>
<int key="connectionID">78</int>
</object>
<object class="IBConnectionRecord">
<object class="IBOutletConnection" key="connection">
<string key="label">delegate</string>
<reference key="source" ref="317277208"/>
<reference key="destination" ref="1001"/>
</object>
<int key="connectionID">90</int>
</object>
<object class="IBConnectionRecord">
<object class="IBOutletConnection" key="connection">
<string key="label">fInactivePopUp</string>
<reference key="source" ref="1001"/>
<reference key="destination" ref="110760088"/>
</object>
<int key="connectionID">93</int>
</object>
<object class="IBConnectionRecord">
<object class="IBOutletConnection" key="connection">
<string key="label">fInactiveLimitField</string>
<reference key="source" ref="1001"/>
<reference key="destination" ref="317277208"/>
</object>
<int key="connectionID">94</int>
</object>
<object class="IBConnectionRecord">
<object class="IBActionConnection" key="connection">
<string key="label">setInactiveLimit:</string>
<reference key="source" ref="1001"/>
<reference key="destination" ref="317277208"/>
</object>
<int key="connectionID">95</int>
</object>
<object class="IBConnectionRecord">
<object class="IBActionConnection" key="connection">
<string key="label">setInactiveSetting:</string>
<reference key="source" ref="1001"/>
<reference key="destination" ref="110760088"/>
</object>
<int key="connectionID">96</int>
</object>
<object class="IBConnectionRecord">
<object class="IBOutletConnection" key="connection">
<string key="label">fInactiveLimitLabel</string>
<reference key="source" ref="1001"/>
<reference key="destination" ref="706967535"/>
</object>
<int key="connectionID">101</int>
</object>
</object>
<object class="IBMutableOrderedSet" key="objectRecords">
<object class="NSArray" key="orderedObjects">
@ -1003,6 +1224,10 @@
<reference ref="38678337"/>
<reference ref="1004759797"/>
<reference ref="275413408"/>
<reference ref="919278636"/>
<reference ref="110760088"/>
<reference ref="317277208"/>
<reference ref="706967535"/>
</object>
<reference key="parent" ref="0"/>
<string key="objectName">Options</string>
@ -1369,6 +1594,101 @@
<reference key="object" ref="884480943"/>
<reference key="parent" ref="355652245"/>
</object>
<object class="IBObjectRecord">
<int key="objectID">79</int>
<reference key="object" ref="919278636"/>
<object class="NSMutableArray" key="children">
<bool key="EncodedWithXMLCoder">YES</bool>
<reference ref="563562657"/>
</object>
<reference key="parent" ref="617828785"/>
</object>
<object class="IBObjectRecord">
<int key="objectID">80</int>
<reference key="object" ref="110760088"/>
<object class="NSMutableArray" key="children">
<bool key="EncodedWithXMLCoder">YES</bool>
<reference ref="669284794"/>
</object>
<reference key="parent" ref="617828785"/>
</object>
<object class="IBObjectRecord">
<int key="objectID">81</int>
<reference key="object" ref="317277208"/>
<object class="NSMutableArray" key="children">
<bool key="EncodedWithXMLCoder">YES</bool>
<reference ref="517007757"/>
</object>
<reference key="parent" ref="617828785"/>
</object>
<object class="IBObjectRecord">
<int key="objectID">82</int>
<reference key="object" ref="517007757"/>
<object class="NSMutableArray" key="children">
<bool key="EncodedWithXMLCoder">YES</bool>
<reference ref="285060614"/>
</object>
<reference key="parent" ref="317277208"/>
</object>
<object class="IBObjectRecord">
<int key="objectID">83</int>
<reference key="object" ref="285060614"/>
<reference key="parent" ref="517007757"/>
</object>
<object class="IBObjectRecord">
<int key="objectID">84</int>
<reference key="object" ref="669284794"/>
<object class="NSMutableArray" key="children">
<bool key="EncodedWithXMLCoder">YES</bool>
<reference ref="719019509"/>
</object>
<reference key="parent" ref="110760088"/>
</object>
<object class="IBObjectRecord">
<int key="objectID">85</int>
<reference key="object" ref="719019509"/>
<object class="NSMutableArray" key="children">
<bool key="EncodedWithXMLCoder">YES</bool>
<reference ref="424536198"/>
<reference ref="271264514"/>
<reference ref="408933788"/>
</object>
<reference key="parent" ref="669284794"/>
</object>
<object class="IBObjectRecord">
<int key="objectID">86</int>
<reference key="object" ref="424536198"/>
<reference key="parent" ref="719019509"/>
</object>
<object class="IBObjectRecord">
<int key="objectID">87</int>
<reference key="object" ref="271264514"/>
<reference key="parent" ref="719019509"/>
</object>
<object class="IBObjectRecord">
<int key="objectID">88</int>
<reference key="object" ref="408933788"/>
<reference key="parent" ref="719019509"/>
</object>
<object class="IBObjectRecord">
<int key="objectID">89</int>
<reference key="object" ref="563562657"/>
<reference key="parent" ref="919278636"/>
</object>
<object class="IBObjectRecord">
<int key="objectID">97</int>
<reference key="object" ref="706967535"/>
<object class="NSMutableArray" key="children">
<bool key="EncodedWithXMLCoder">YES</bool>
<reference ref="38211108"/>
</object>
<reference key="parent" ref="617828785"/>
</object>
<object class="IBObjectRecord">
<int key="objectID">98</int>
<reference key="object" ref="38211108"/>
<reference key="parent" ref="706967535"/>
</object>
</object>
</object>
<object class="NSMutableDictionary" key="flattenedProperties">
@ -1455,9 +1775,33 @@
<string>52.IBPluginDependency</string>
<string>6.IBPluginDependency</string>
<string>7.IBPluginDependency</string>
<string>79.IBPluginDependency</string>
<string>79.ImportedFromIB2</string>
<string>8.IBPluginDependency</string>
<string>80.IBPluginDependency</string>
<string>80.ImportedFromIB2</string>
<string>81.IBPluginDependency</string>
<string>81.ImportedFromIB2</string>
<string>82.IBPluginDependency</string>
<string>83.IBNumberFormatterBehaviorMetadataKey</string>
<string>83.IBNumberFormatterLocalizesFormatMetadataKey</string>
<string>83.IBPluginDependency</string>
<string>84.IBPluginDependency</string>
<string>85.IBEditorWindowLastContentRect</string>
<string>85.IBPluginDependency</string>
<string>85.ImportedFromIB2</string>
<string>86.IBPluginDependency</string>
<string>86.ImportedFromIB2</string>
<string>87.IBPluginDependency</string>
<string>87.ImportedFromIB2</string>
<string>88.IBPluginDependency</string>
<string>88.ImportedFromIB2</string>
<string>89.IBPluginDependency</string>
<string>9.IBPluginDependency</string>
<string>9.ImportedFromIB2</string>
<string>97.IBPluginDependency</string>
<string>97.ImportedFromIB2</string>
<string>98.IBPluginDependency</string>
</object>
<object class="NSMutableArray" key="dict.values">
<bool key="EncodedWithXMLCoder">YES</bool>
@ -1485,7 +1829,7 @@
<integer value="1"/>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
<integer value="1"/>
<string>{{256, 611}, {351, 219}}</string>
<string>{{256, 589}, {351, 241}}</string>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
<integer value="1"/>
<string>{{519, 803}, {351, 160}}</string>
@ -1515,7 +1859,7 @@
<boolean value="YES"/>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
<string>{{334, 634}, {138, 54}}</string>
<string>{{314, 631}, {143, 54}}</string>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
<integer value="1"/>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
@ -1542,8 +1886,32 @@
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
<integer value="1"/>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
<integer value="1"/>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
<integer value="1"/>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
<integer value="1041"/>
<boolean value="YES"/>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
<string>{{314, 609}, {161, 54}}</string>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
<integer value="1"/>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
<integer value="1"/>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
<integer value="1"/>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
<integer value="1"/>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
<integer value="1"/>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
<integer value="1"/>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
</object>
</object>
<object class="NSMutableDictionary" key="unlocalizedProperties">
@ -1562,7 +1930,7 @@
</object>
</object>
<nil key="sourceID"/>
<int key="maxID">78</int>
<int key="maxID">101</int>
</object>
<object class="IBClassDescriber" key="IBDocument.Classes">
<object class="NSMutableArray" key="referencedPartialClassDescriptions">
@ -1582,6 +1950,8 @@
<bool key="EncodedWithXMLCoder">YES</bool>
<object class="NSArray" key="dict.sortedKeys">
<bool key="EncodedWithXMLCoder">YES</bool>
<string>setInactiveLimit:</string>
<string>setInactiveSetting:</string>
<string>setPeersConnectLimit:</string>
<string>setPriority:</string>
<string>setRatioLimit:</string>
@ -1599,6 +1969,8 @@
<string>id</string>
<string>id</string>
<string>id</string>
<string>id</string>
<string>id</string>
</object>
</object>
<object class="NSMutableDictionary" key="outlets">
@ -1609,8 +1981,10 @@
<string>fDownloadLimitField</string>
<string>fDownloadLimitLabel</string>
<string>fGlobalLimitCheck</string>
<string>fInactiveLimitField</string>
<string>fInactiveLimitLabel</string>
<string>fInactivePopUp</string>
<string>fPeersConnectField</string>
<string>fPeersConnectLabel</string>
<string>fPriorityPopUp</string>
<string>fRatioLimitField</string>
<string>fRatioPopUp</string>
@ -1629,6 +2003,8 @@
<string>NSPopUpButton</string>
<string>NSTextField</string>
<string>NSPopUpButton</string>
<string>NSTextField</string>
<string>NSPopUpButton</string>
<string>NSButton</string>
<string>NSTextField</string>
<string>NSTextField</string>
@ -2206,6 +2582,7 @@
</object>
</object>
<int key="IBDocument.localizationMode">0</int>
<string key="IBDocument.TargetRuntimeIdentifier">IBCocoaFramework</string>
<object class="NSMutableDictionary" key="IBDocument.PluginDeclaredDependencyDefaults">
<string key="NS.key.0">com.apple.InterfaceBuilder.CocoaPlugin.macosx</string>
<integer value="1060" key="NS.object.0"/>
@ -2217,5 +2594,26 @@
<bool key="IBDocument.PluginDeclaredDependenciesTrackSystemTargetVersion">YES</bool>
<string key="IBDocument.LastKnownRelativeProjectPath">../../Transmission.xcodeproj</string>
<int key="IBDocument.defaultPropertyAccessControl">3</int>
<object class="NSMutableDictionary" key="IBDocument.LastKnownImageSizes">
<bool key="EncodedWithXMLCoder">YES</bool>
<object class="NSArray" key="dict.sortedKeys">
<bool key="EncodedWithXMLCoder">YES</bool>
<string>NSMenuCheckmark</string>
<string>NSMenuMixedState</string>
<string>NSSwitch</string>
<string>PriorityHigh</string>
<string>PriorityLow</string>
<string>PriorityNormal</string>
</object>
<object class="NSMutableArray" key="dict.values">
<bool key="EncodedWithXMLCoder">YES</bool>
<string>{9, 8}</string>
<string>{7, 2}</string>
<string>{15, 15}</string>
<string>{14, 14}</string>
<string>{14, 14}</string>
<string>{14, 14}</string>
</object>
</object>
</data>
</archive>

View File

@ -2,17 +2,17 @@
<archive type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="7.10">
<data>
<int key="IBDocument.SystemTarget">1050</int>
<string key="IBDocument.SystemVersion">10D573</string>
<string key="IBDocument.SystemVersion">10F569</string>
<string key="IBDocument.InterfaceBuilderVersion">762</string>
<string key="IBDocument.AppKitVersion">1038.29</string>
<string key="IBDocument.HIToolboxVersion">460.00</string>
<string key="IBDocument.HIToolboxVersion">461.00</string>
<object class="NSMutableDictionary" key="IBDocument.PluginVersions">
<string key="NS.key.0">com.apple.InterfaceBuilder.CocoaPlugin</string>
<string key="NS.object.0">762</string>
</object>
<object class="NSMutableArray" key="IBDocument.EditedObjectIDs">
<bool key="EncodedWithXMLCoder">YES</bool>
<integer value="1361"/>
<integer value="256"/>
</object>
<object class="NSArray" key="IBDocument.PluginDependencies">
<bool key="EncodedWithXMLCoder">YES</bool>
@ -433,7 +433,7 @@
<string key="NSExtension">NSResponder</string>
</object>
<object class="NSCustomView" id="314557528">
<nil key="NSNextResponder"/>
<reference key="NSNextResponder"/>
<int key="NSvFlags">256</int>
<object class="NSMutableArray" key="NSSubviews">
<bool key="EncodedWithXMLCoder">YES</bool>
@ -446,7 +446,7 @@
<bool key="EncodedWithXMLCoder">YES</bool>
<object class="NSTabViewItem" id="73412354">
<object class="NSView" key="NSView" id="833882848">
<reference key="NSNextResponder" ref="463462813"/>
<nil key="NSNextResponder"/>
<int key="NSvFlags">256</int>
<object class="NSMutableArray" key="NSSubviews">
<bool key="EncodedWithXMLCoder">YES</bool>
@ -961,7 +961,6 @@
</object>
</object>
<string key="NSFrame">{{10, 33}, {496, 272}}</string>
<reference key="NSSuperview" ref="463462813"/>
</object>
<string key="NSLabel">Adding</string>
<reference key="NSColor" ref="977951849"/>
@ -969,14 +968,14 @@
</object>
<object class="NSTabViewItem" id="298493360">
<object class="NSView" key="NSView" id="159788047">
<nil key="NSNextResponder"/>
<reference key="NSNextResponder" ref="463462813"/>
<int key="NSvFlags">256</int>
<object class="NSMutableArray" key="NSSubviews">
<bool key="EncodedWithXMLCoder">YES</bool>
<object class="NSTextField" id="192996348">
<reference key="NSNextResponder" ref="159788047"/>
<int key="NSvFlags">256</int>
<string key="NSFrame">{{311, 180}, {35, 22}}</string>
<string key="NSFrame">{{311, 154}, {35, 22}}</string>
<reference key="NSSuperview" ref="159788047"/>
<bool key="NSEnabled">YES</bool>
<object class="NSTextFieldCell" key="NSCell" id="283641828">
@ -1059,7 +1058,7 @@
<object class="NSTextField" id="977701368">
<reference key="NSNextResponder" ref="159788047"/>
<int key="NSvFlags">256</int>
<string key="NSFrame">{{41, 182}, {56, 17}}</string>
<string key="NSFrame">{{41, 156}, {56, 17}}</string>
<reference key="NSSuperview" ref="159788047"/>
<bool key="NSEnabled">YES</bool>
<object class="NSTextFieldCell" key="NSCell" id="1040746680">
@ -1075,7 +1074,7 @@
<object class="NSTextField" id="271336507">
<reference key="NSNextResponder" ref="159788047"/>
<int key="NSvFlags">256</int>
<string key="NSFrame">{{351, 182}, {101, 17}}</string>
<string key="NSFrame">{{351, 156}, {101, 17}}</string>
<reference key="NSSuperview" ref="159788047"/>
<bool key="NSEnabled">YES</bool>
<object class="NSTextFieldCell" key="NSCell" id="506158787">
@ -1176,16 +1175,110 @@
<reference key="NSTextColor" ref="430340990"/>
</object>
</object>
<object class="NSButton" id="457261886">
<reference key="NSNextResponder" ref="159788047"/>
<int key="NSvFlags">256</int>
<string key="NSFrame">{{105, 197}, {220, 18}}</string>
<reference key="NSSuperview" ref="159788047"/>
<bool key="NSEnabled">YES</bool>
<object class="NSButtonCell" key="NSCell" id="1020157033">
<int key="NSCellFlags">67239424</int>
<int key="NSCellFlags2">0</int>
<string key="NSContents">Stop seeding when inactive for:</string>
<reference key="NSSupport" ref="86725571"/>
<reference key="NSControlView" ref="457261886"/>
<int key="NSButtonFlags">1211912703</int>
<int key="NSButtonFlags2">2</int>
<reference key="NSNormalImage" ref="1001726176"/>
<reference key="NSAlternateImage" ref="764913887"/>
<string key="NSAlternateContents"/>
<string key="NSKeyEquivalent"/>
<int key="NSPeriodicDelay">200</int>
<int key="NSPeriodicInterval">25</int>
</object>
</object>
<object class="NSTextField" id="430240209">
<reference key="NSNextResponder" ref="159788047"/>
<int key="NSvFlags">256</int>
<string key="NSFrame">{{331, 196}, {41, 22}}</string>
<reference key="NSSuperview" ref="159788047"/>
<bool key="NSEnabled">YES</bool>
<object class="NSTextFieldCell" key="NSCell" id="279439304">
<int key="NSCellFlags">-1804468671</int>
<int key="NSCellFlags2">272630784</int>
<reference key="NSSupport" ref="86725571"/>
<object class="NSNumberFormatter" key="NSFormatter" id="840222534">
<object class="NSMutableDictionary" key="NS.attributes">
<bool key="EncodedWithXMLCoder">YES</bool>
<object class="NSArray" key="dict.sortedKeys">
<bool key="EncodedWithXMLCoder">YES</bool>
<string>allowsFloats</string>
<string>formatterBehavior</string>
<string>lenient</string>
<string>locale</string>
<string>maximum</string>
<string>minimum</string>
<string>negativeInfinitySymbol</string>
<string>nilSymbol</string>
<string>numberStyle</string>
<string>positiveInfinitySymbol</string>
</object>
<object class="NSMutableArray" key="dict.values">
<bool key="EncodedWithXMLCoder">YES</bool>
<boolean value="YES"/>
<integer value="1040"/>
<boolean value="YES"/>
<reference ref="260779128"/>
<real value="10000"/>
<real value="1"/>
<string>-∞</string>
<string/>
<integer value="0"/>
<string>+∞</string>
</object>
</object>
<string key="NS.positiveformat">#</string>
<string key="NS.negativeformat">#</string>
<nil key="NS.positiveattrs"/>
<nil key="NS.negativeattrs"/>
<nil key="NS.zero"/>
<object class="NSAttributedString" key="NS.nil">
<string key="NSString"/>
</object>
<object class="NSAttributedString" key="NS.nan">
<string key="NSString">NaN</string>
<reference key="NSAttributes" ref="72222796"/>
</object>
<real value="1" key="NS.min"/>
<real value="10000" key="NS.max"/>
<object class="NSDecimalNumberHandler" key="NS.rounding">
<int key="NS.roundingmode">3</int>
<bool key="NS.raise.overflow">YES</bool>
<bool key="NS.raise.underflow">YES</bool>
<bool key="NS.raise.dividebyzero">YES</bool>
</object>
<string key="NS.decimal">.</string>
<string key="NS.thousand">,</string>
<bool key="NS.hasthousands">NO</bool>
<bool key="NS.localized">NO</bool>
<bool key="NS.allowsfloats">YES</bool>
</object>
<reference key="NSControlView" ref="430240209"/>
<bool key="NSDrawsBackground">YES</bool>
<reference key="NSBackgroundColor" ref="317620196"/>
<reference key="NSTextColor" ref="430340990"/>
</object>
</object>
<object class="NSTextField" id="926230950">
<reference key="NSNextResponder" ref="159788047"/>
<int key="NSvFlags">256</int>
<string key="NSFrame">{{24, 242}, {73, 17}}</string>
<string key="NSFrame">{{50, 242}, {47, 17}}</string>
<reference key="NSSuperview" ref="159788047"/>
<bool key="NSEnabled">YES</bool>
<object class="NSTextFieldCell" key="NSCell" id="1052593840">
<int key="NSCellFlags">67239424</int>
<int key="NSCellFlags2">4194304</int>
<string key="NSContents">Automatic:</string>
<string key="NSContents">Limits:</string>
<reference key="NSSupport" ref="86725571"/>
<reference key="NSControlView" ref="926230950"/>
<reference key="NSBackgroundColor" ref="977951849"/>
@ -1223,7 +1316,7 @@
<object class="NSButton" id="959697936">
<reference key="NSNextResponder" ref="159788047"/>
<int key="NSvFlags">256</int>
<string key="NSFrame">{{100, 181}, {205, 18}}</string>
<string key="NSFrame">{{100, 155}, {205, 18}}</string>
<reference key="NSSuperview" ref="159788047"/>
<bool key="NSEnabled">YES</bool>
<object class="NSButtonCell" key="NSCell" id="415355814">
@ -1245,7 +1338,7 @@
<object class="NSTextField" id="642835928">
<reference key="NSNextResponder" ref="159788047"/>
<int key="NSvFlags">256</int>
<string key="NSFrame">{{297, 154}, {35, 22}}</string>
<string key="NSFrame">{{297, 128}, {35, 22}}</string>
<reference key="NSSuperview" ref="159788047"/>
<bool key="NSEnabled">YES</bool>
<object class="NSTextFieldCell" key="NSCell" id="440983450">
@ -1308,7 +1401,7 @@
<object class="NSTextField" id="929631251">
<reference key="NSNextResponder" ref="159788047"/>
<int key="NSvFlags">256</int>
<string key="NSFrame">{{337, 156}, {101, 17}}</string>
<string key="NSFrame">{{337, 130}, {101, 17}}</string>
<reference key="NSSuperview" ref="159788047"/>
<bool key="NSEnabled">YES</bool>
<object class="NSTextFieldCell" key="NSCell" id="153425121">
@ -1324,7 +1417,7 @@
<object class="NSButton" id="802622975">
<reference key="NSNextResponder" ref="159788047"/>
<int key="NSvFlags">256</int>
<string key="NSFrame">{{100, 155}, {191, 18}}</string>
<string key="NSFrame">{{100, 129}, {191, 18}}</string>
<reference key="NSSuperview" ref="159788047"/>
<bool key="NSEnabled">YES</bool>
<object class="NSButtonCell" key="NSCell" id="265029926">
@ -1346,7 +1439,7 @@
<object class="NSTextField" id="805721613">
<reference key="NSNextResponder" ref="159788047"/>
<int key="NSvFlags">256</int>
<string key="NSFrame">{{374, 128}, {41, 22}}</string>
<string key="NSFrame">{{374, 102}, {41, 22}}</string>
<reference key="NSSuperview" ref="159788047"/>
<bool key="NSEnabled">YES</bool>
<object class="NSTextFieldCell" key="NSCell" id="997390601">
@ -1359,20 +1452,30 @@
<object class="NSArray" key="dict.sortedKeys">
<bool key="EncodedWithXMLCoder">YES</bool>
<string>allowsFloats</string>
<string>currencySymbol</string>
<string>formatterBehavior</string>
<string>locale</string>
<string>internationalCurrencySymbol</string>
<string>lenient</string>
<string>maximum</string>
<string>minimum</string>
<string>minimumIntegerDigits</string>
<string>negativeFormat</string>
<string>numberStyle</string>
<string>positiveFormat</string>
</object>
<object class="NSMutableArray" key="dict.values">
<bool key="EncodedWithXMLCoder">YES</bool>
<integer value="0"/>
<boolean value="NO"/>
<string>¤</string>
<integer value="1040"/>
<reference ref="260779128"/>
<string>¤¤</string>
<boolean value="NO"/>
<real value="10000"/>
<real value="1"/>
<real value="1"/>
<integer value="1"/>
<string>#0</string>
<integer value="0"/>
<string>#0</string>
</object>
</object>
<string key="NS.positiveformat">#0</string>
@ -1396,7 +1499,7 @@
<string key="NS.decimal">.</string>
<string key="NS.thousand">,</string>
<bool key="NS.hasthousands">NO</bool>
<bool key="NS.localized">NO</bool>
<bool key="NS.localized">YES</bool>
<bool key="NS.allowsfloats">NO</bool>
</object>
<reference key="NSControlView" ref="805721613"/>
@ -1408,7 +1511,7 @@
<object class="NSTextField" id="452040825">
<reference key="NSNextResponder" ref="159788047"/>
<int key="NSvFlags">256</int>
<string key="NSFrame">{{420, 130}, {55, 17}}</string>
<string key="NSFrame">{{420, 104}, {55, 17}}</string>
<reference key="NSSuperview" ref="159788047"/>
<bool key="NSEnabled">YES</bool>
<object class="NSTextFieldCell" key="NSCell" id="416442895">
@ -1424,7 +1527,7 @@
<object class="NSButton" id="605552642">
<reference key="NSNextResponder" ref="159788047"/>
<int key="NSvFlags">256</int>
<string key="NSFrame">{{100, 129}, {268, 18}}</string>
<string key="NSFrame">{{100, 103}, {268, 18}}</string>
<reference key="NSSuperview" ref="159788047"/>
<bool key="NSEnabled">YES</bool>
<object class="NSButtonCell" key="NSCell" id="983632896">
@ -1446,7 +1549,7 @@
<object class="NSTextField" id="489294512">
<reference key="NSNextResponder" ref="159788047"/>
<int key="NSvFlags">256</int>
<string key="NSFrame">{{20, 90}, {77, 17}}</string>
<string key="NSFrame">{{20, 64}, {77, 17}}</string>
<reference key="NSSuperview" ref="159788047"/>
<bool key="NSEnabled">YES</bool>
<object class="NSTextFieldCell" key="NSCell" id="146274476">
@ -1462,7 +1565,7 @@
<object class="NSPopUpButton" id="986412145">
<reference key="NSNextResponder" ref="159788047"/>
<int key="NSvFlags">256</int>
<string key="NSFrame">{{298, 84}, {130, 26}}</string>
<string key="NSFrame">{{298, 58}, {130, 26}}</string>
<reference key="NSSuperview" ref="159788047"/>
<bool key="NSEnabled">YES</bool>
<object class="NSPopUpButtonCell" key="NSCell" id="705215561">
@ -1514,7 +1617,7 @@
<object class="NSButton" id="144778876">
<reference key="NSNextResponder" ref="159788047"/>
<int key="NSvFlags">256</int>
<string key="NSFrame">{{100, 64}, {183, 18}}</string>
<string key="NSFrame">{{100, 38}, {183, 18}}</string>
<reference key="NSSuperview" ref="159788047"/>
<bool key="NSEnabled">YES</bool>
<object class="NSButtonCell" key="NSCell" id="665924860">
@ -1536,7 +1639,7 @@
<object class="NSPopUpButton" id="1042395974">
<reference key="NSNextResponder" ref="159788047"/>
<int key="NSvFlags">256</int>
<string key="NSFrame">{{298, 59}, {130, 26}}</string>
<string key="NSFrame">{{298, 33}, {130, 26}}</string>
<reference key="NSSuperview" ref="159788047"/>
<bool key="NSEnabled">YES</bool>
<object class="NSPopUpButtonCell" key="NSCell" id="301407755">
@ -1584,7 +1687,7 @@
<object class="NSButton" id="630340288">
<reference key="NSNextResponder" ref="159788047"/>
<int key="NSvFlags">256</int>
<string key="NSFrame">{{100, 89}, {195, 18}}</string>
<string key="NSFrame">{{100, 63}, {195, 18}}</string>
<reference key="NSSuperview" ref="159788047"/>
<bool key="NSEnabled">YES</bool>
<object class="NSButtonCell" key="NSCell" id="1000733872">
@ -1603,26 +1706,44 @@
<int key="NSPeriodicInterval">25</int>
</object>
</object>
<object class="NSTextField" id="654576556">
<reference key="NSNextResponder" ref="159788047"/>
<int key="NSvFlags">256</int>
<string key="NSFrame">{{377, 198}, {55, 17}}</string>
<reference key="NSSuperview" ref="159788047"/>
<bool key="NSEnabled">YES</bool>
<object class="NSTextFieldCell" key="NSCell" id="517021610">
<int key="NSCellFlags">67239424</int>
<int key="NSCellFlags2">272629760</int>
<string key="NSContents">minutes</string>
<reference key="NSSupport" ref="86725571"/>
<reference key="NSControlView" ref="654576556"/>
<reference key="NSBackgroundColor" ref="977951849"/>
<reference key="NSTextColor" ref="400627124"/>
</object>
</object>
</object>
<string key="NSFrame">{{10, 33}, {496, 272}}</string>
<reference key="NSSuperview" ref="463462813"/>
</object>
<string key="NSLabel">Management</string>
<reference key="NSColor" ref="977951849"/>
<reference key="NSTabView" ref="463462813"/>
</object>
</object>
<reference key="NSSelectedTabViewItem" ref="73412354"/>
<reference key="NSSelectedTabViewItem" ref="298493360"/>
<reference key="NSFont" ref="86725571"/>
<int key="NSTvFlags">0</int>
<bool key="NSAllowTruncatedLabels">YES</bool>
<bool key="NSDrawsBackground">YES</bool>
<object class="NSMutableArray" key="NSSubviews">
<bool key="EncodedWithXMLCoder">YES</bool>
<reference ref="833882848"/>
<reference ref="159788047"/>
</object>
</object>
</object>
<string key="NSFrameSize">{542, 331}</string>
<reference key="NSSuperview"/>
<string key="NSClassName">NSView</string>
<string key="NSExtension">NSResponder</string>
</object>
@ -1712,7 +1833,7 @@ eNcdg+B/jfSiABDBAmGkCTGQKN5CVjECL6QolJAi7kCNMQJgBAn+ECM7HokZCCAgAA8BAAADAAAAAQAS
AAABAQADAAAAAQASAAABAgADAAAABAAABSIBAwADAAAAAQAFAAABBgADAAAAAQACAAABEQAEAAAAAQAA
AAgBEgADAAAAAQABAAABFQADAAAAAQAEAAABFgADAAAAAQASAAABFwAEAAAAAQAABGABHAADAAAAAQAB
AAABPQADAAAAAQACAAABUgADAAAAAQABAAABUwADAAAABAAABSqHcwAHAAAYmAAABTIAAAAAAAgACAAI
AAgAAQABAAEAAQAAGJhhcHBsAhAAAG1udHJSR0IgWFlaIAfaAAMAHQAXABYADWFjc3BBUFBMAAAAAAAA
AAgAAQABAAEAAQAAGJhhcHBsAhAAAG1udHJSR0IgWFlaIAfaAAYAGgAKAB0ANWFjc3BBUFBMAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAD21gABAAAAANMtYXBwbAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAEWRlc2MAAAFQAAAAYmRzY20AAAG0AAAA8GNwcnQAAAKkAAAA0Hd0
cHQAAAN0AAAAFHJYWVoAAAOIAAAAFGdYWVoAAAOcAAAAFGJYWVoAAAOwAAAAFHJUUkMAAAPEAAAIDGFh
@ -2948,7 +3069,7 @@ AAABAAAAAQ</bytes>
<string key="NSExtension">NSResponder</string>
</object>
<object class="NSCustomView" id="538122014">
<reference key="NSNextResponder"/>
<nil key="NSNextResponder"/>
<int key="NSvFlags">256</int>
<object class="NSMutableArray" key="NSSubviews">
<bool key="EncodedWithXMLCoder">YES</bool>
@ -3442,7 +3563,6 @@ AAABAAAAAQ</bytes>
</object>
</object>
<string key="NSFrameSize">{542, 342}</string>
<reference key="NSSuperview"/>
<string key="NSClassName">NSView</string>
<string key="NSExtension">NSResponder</string>
</object>
@ -7904,6 +8024,94 @@ AAABAAAAAQ</bytes>
</object>
<int key="connectionID">1957</int>
</object>
<object class="IBConnectionRecord">
<object class="IBOutletConnection" key="connection">
<string key="label">nextKeyView</string>
<reference key="source" ref="430240209"/>
<reference key="destination" ref="192996348"/>
</object>
<int key="connectionID">1963</int>
</object>
<object class="IBConnectionRecord">
<object class="IBOutletConnection" key="connection">
<string key="label">delegate</string>
<reference key="source" ref="430240209"/>
<reference key="destination" ref="511492310"/>
</object>
<int key="connectionID">1964</int>
</object>
<object class="IBConnectionRecord">
<object class="IBBindingConnection" key="connection">
<string key="label">enabled: values.CheckStalled</string>
<reference key="source" ref="654576556"/>
<reference key="destination" ref="356871564"/>
<object class="NSNibBindingConnector" key="connector">
<reference key="NSSource" ref="654576556"/>
<reference key="NSDestination" ref="356871564"/>
<string key="NSLabel">enabled: values.CheckStalled</string>
<string key="NSBinding">enabled</string>
<string key="NSKeyPath">values.CheckStalled</string>
<int key="NSNibBindingConnectorVersion">2</int>
</object>
</object>
<int key="connectionID">1971</int>
</object>
<object class="IBConnectionRecord">
<object class="IBActionConnection" key="connection">
<string key="label">applyInactiveStopSetting:</string>
<reference key="source" ref="511492310"/>
<reference key="destination" ref="457261886"/>
</object>
<int key="connectionID">1972</int>
</object>
<object class="IBConnectionRecord">
<object class="IBBindingConnection" key="connection">
<string key="label">value: values.InactiveLimitCheck</string>
<reference key="source" ref="457261886"/>
<reference key="destination" ref="356871564"/>
<object class="NSNibBindingConnector" key="connector">
<reference key="NSSource" ref="457261886"/>
<reference key="NSDestination" ref="356871564"/>
<string key="NSLabel">value: values.InactiveLimitCheck</string>
<string key="NSBinding">value</string>
<string key="NSKeyPath">values.InactiveLimitCheck</string>
<int key="NSNibBindingConnectorVersion">2</int>
</object>
</object>
<int key="connectionID">1973</int>
</object>
<object class="IBConnectionRecord">
<object class="IBBindingConnection" key="connection">
<string key="label">enabled: values.InactiveLimitCheck</string>
<reference key="source" ref="430240209"/>
<reference key="destination" ref="356871564"/>
<object class="NSNibBindingConnector" key="connector">
<reference key="NSSource" ref="430240209"/>
<reference key="NSDestination" ref="356871564"/>
<string key="NSLabel">enabled: values.InactiveLimitCheck</string>
<string key="NSBinding">enabled</string>
<string key="NSKeyPath">values.InactiveLimitCheck</string>
<int key="NSNibBindingConnectorVersion">2</int>
</object>
</object>
<int key="connectionID">1974</int>
</object>
<object class="IBConnectionRecord">
<object class="IBActionConnection" key="connection">
<string key="label">setInactiveStop:</string>
<reference key="source" ref="511492310"/>
<reference key="destination" ref="430240209"/>
</object>
<int key="connectionID">1975</int>
</object>
<object class="IBConnectionRecord">
<object class="IBOutletConnection" key="connection">
<string key="label">fInactiveStopField</string>
<reference key="source" ref="511492310"/>
<reference key="destination" ref="430240209"/>
</object>
<int key="connectionID">1976</int>
</object>
</object>
<object class="IBMutableOrderedSet" key="objectRecords">
<object class="NSArray" key="orderedObjects">
@ -8257,6 +8465,9 @@ AAABAAAAAQ</bytes>
<reference ref="144778876"/>
<reference ref="1042395974"/>
<reference ref="630340288"/>
<reference ref="457261886"/>
<reference ref="430240209"/>
<reference ref="654576556"/>
</object>
<reference key="parent" ref="298493360"/>
</object>
@ -10721,6 +10932,57 @@ AAABAAAAAQ</bytes>
<reference key="object" ref="548071836"/>
<reference key="parent" ref="1042006550"/>
</object>
<object class="IBObjectRecord">
<int key="objectID">1958</int>
<reference key="object" ref="457261886"/>
<object class="NSMutableArray" key="children">
<bool key="EncodedWithXMLCoder">YES</bool>
<reference ref="1020157033"/>
</object>
<reference key="parent" ref="159788047"/>
</object>
<object class="IBObjectRecord">
<int key="objectID">1959</int>
<reference key="object" ref="430240209"/>
<object class="NSMutableArray" key="children">
<bool key="EncodedWithXMLCoder">YES</bool>
<reference ref="279439304"/>
</object>
<reference key="parent" ref="159788047"/>
</object>
<object class="IBObjectRecord">
<int key="objectID">1960</int>
<reference key="object" ref="279439304"/>
<object class="NSMutableArray" key="children">
<bool key="EncodedWithXMLCoder">YES</bool>
<reference ref="840222534"/>
</object>
<reference key="parent" ref="430240209"/>
</object>
<object class="IBObjectRecord">
<int key="objectID">1961</int>
<reference key="object" ref="840222534"/>
<reference key="parent" ref="279439304"/>
</object>
<object class="IBObjectRecord">
<int key="objectID">1962</int>
<reference key="object" ref="1020157033"/>
<reference key="parent" ref="457261886"/>
</object>
<object class="IBObjectRecord">
<int key="objectID">1969</int>
<reference key="object" ref="654576556"/>
<object class="NSMutableArray" key="children">
<bool key="EncodedWithXMLCoder">YES</bool>
<reference ref="517021610"/>
</object>
<reference key="parent" ref="159788047"/>
</object>
<object class="IBObjectRecord">
<int key="objectID">1970</int>
<reference key="object" ref="517021610"/>
<reference key="parent" ref="654576556"/>
</object>
</object>
</object>
<object class="NSMutableDictionary" key="flattenedProperties">
@ -11127,8 +11389,23 @@ AAABAAAAAQ</bytes>
<string>1951.IBPluginDependency</string>
<string>1951.ImportedFromIB2</string>
<string>1952.IBPluginDependency</string>
<string>1958.IBPluginDependency</string>
<string>1958.ImportedFromIB2</string>
<string>1959.IBPluginDependency</string>
<string>1959.ImportedFromIB2</string>
<string>196.IBPluginDependency</string>
<string>196.ImportedFromIB2</string>
<string>1960.IBPluginDependency</string>
<string>1961.IBNumberFormatterBehaviorMetadataKey</string>
<string>1961.IBNumberFormatterLocalizesFormatMetadataKey</string>
<string>1961.IBNumberFormatterSampleNumberKey</string>
<string>1961.IBPluginDependency</string>
<string>1961.ImportedFromIB2</string>
<string>1962.IBPluginDependency</string>
<string>1969.CustomClassName</string>
<string>1969.IBPluginDependency</string>
<string>1969.ImportedFromIB2</string>
<string>1970.IBPluginDependency</string>
<string>198.IBPluginDependency</string>
<string>198.ImportedFromIB2</string>
<string>199.IBPluginDependency</string>
@ -11312,6 +11589,7 @@ AAABAAAAAQ</bytes>
<string>921.IBNumberFormatterLocalizesFormatMetadataKey</string>
<string>921.IBPluginDependency</string>
<string>921.ImportedFromIB2</string>
<string>922.IBNumberFormatterBehaviorMetadataKey</string>
<string>922.IBNumberFormatterLocalizesFormatMetadataKey</string>
<string>922.IBPluginDependency</string>
<string>922.ImportedFromIB2</string>
@ -11740,6 +12018,21 @@ AAABAAAAAQ</bytes>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
<real value="1"/>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
<integer value="1041"/>
<boolean value="YES"/>
<real value="5"/>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
<real value="1"/>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
<string>ColorTextField</string>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
<real value="1"/>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
<real value="1"/>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
<real value="1"/>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
<real value="1"/>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
<real value="1"/>
@ -11925,6 +12218,7 @@ AAABAAAAAQ</bytes>
<boolean value="YES"/>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
<real value="1"/>
<integer value="1040"/>
<boolean value="YES"/>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
<real value="1"/>
@ -11961,7 +12255,7 @@ AAABAAAAAQ</bytes>
</object>
</object>
<nil key="sourceID"/>
<int key="maxID">1957</int>
<int key="maxID">1976</int>
</object>
<object class="IBClassDescriber" key="IBDocument.Classes">
<object class="NSMutableArray" key="referencedPartialClassDescriptions">
@ -12109,6 +12403,7 @@ AAABAAAAAQ</bytes>
<object class="NSArray" key="dict.sortedKeys">
<bool key="EncodedWithXMLCoder">YES</bool>
<string>addRemoveRPCIP:</string>
<string>applyInactiveStopSetting:</string>
<string>applyRatioSetting:</string>
<string>applySpeedSettings:</string>
<string>folderSheetShow:</string>
@ -12135,6 +12430,7 @@ AAABAAAAAQ</bytes>
<string>setDownloadLocation:</string>
<string>setEncryptionMode:</string>
<string>setGlobalLimit:</string>
<string>setInactiveStop:</string>
<string>setLPD:</string>
<string>setNat:</string>
<string>setPEX:</string>
@ -12227,6 +12523,8 @@ AAABAAAAAQ</bytes>
<string>id</string>
<string>id</string>
<string>id</string>
<string>id</string>
<string>id</string>
</object>
</object>
<object class="NSMutableDictionary" key="outlets">
@ -12243,6 +12541,7 @@ AAABAAAAAQ</bytes>
<string>fGeneralView</string>
<string>fGroupsView</string>
<string>fImportFolderPopUp</string>
<string>fInactiveStopField</string>
<string>fIncompleteFolderPopUp</string>
<string>fNatCheck</string>
<string>fNetworkView</string>
@ -12283,6 +12582,7 @@ AAABAAAAAQ</bytes>
<string>NSView</string>
<string>NSView</string>
<string>NSPopUpButton</string>
<string>NSTextField</string>
<string>NSPopUpButton</string>
<string>NSButton</string>
<string>NSView</string>