Go Back   SB-Innovation - Leecher Mod Source Nr. 1 > English Filesharing forums (P2P) > FAQ & Tutorials

FAQ & Tutorials Assistance and guidances for filesharing.

Reply
 
LinkBack Thread Tools

BitTorrent Tracker Analysis : What.CD
Old 30.07.09, 21:23   #1 (permalink)
Zorvak is surrounded by an impressive atmosphereZorvak is surrounded by an impressive atmosphereZorvak is surrounded by an impressive atmosphereZorvak is surrounded by an impressive atmosphereZorvak is surrounded by an impressive atmosphere
 
Zorvak's Avatar
 
Zorvak is offline
Activity Longevity
0/20 5/20
Today Posts
0/5 sssssss58
Join Date: 20.07.09
Posts: 58
Post BitTorrent Tracker Analysis : What.CD

____________________________________________________________________________________

Project Gazelle is a php frontend for private bittorrent tracker, developed by What.CD sysops.
Private tracker that use Gazelle : What.CD, Save The Coratee, TorrentIt, Vortex, Wunza, Filmdom, PTP, etc.
The source code itself is available to public, google it for more info.

After you read this article, I hope you gain knowledge about how staff member found cheater and avoid any future ban from What.CD

Note from the developers :
Quote:
"some of our tools, such as cheater evasion, will not be included in the public version of the source, for obvious reasons."
This is true. If you read the source code, it's clear that they remove any anti-cheating script from the public source code.
But keep reading, you'll understand how they caught cheater so fast even if you make a little mistake.

I'll divide the analysis into two sections :

I. Gazelle Source Code
II. Staff Account's Screenshot

I. Gazelle Source Code

PHP Code:
// Check DNS blacklists to see if IP is a proxy or a tor node
function blacklisted_ip($IP) {
    
// http://en.wikipedia.org/wiki/Comparison_of_DNS_blacklists
    
$DNSBLs = array('http.dnsbl.sorbs.net''misc.dnsbl.sorbs.net''socks.dnsbl.sorbs.net''ohps.dnsbl.net.au''tor.dan.me.uk');

    
// Reverse IP, so 127.0.0.1 becomes 1.0.0.127
    
$IP implode('.'array_reverse(explode('.'$IP)));

    foreach(
$DNSBLs as $DNSBL) {
        
$TestHost $IP.'.'.$DNSBL;
        
$ResolvedHost gethostbyname($TestHost);
        if(
$ResolvedHost!=$TestHost) {
            return 
$DNSBL.' ('.$TestHost.' returned '.$ResolvedHost.')';
        }
    }
    return 
false;

This function checks if the user use proxy / tor to access the website by checking these lists :
1. http.dnsbl.sorbs.net : Open HTTP proxy servers
2. misc.dnsbl.sorbs.net : Additional proxy servers
3. socks.dnsbl.sorbs.net : Open SOCKS proxy servers
4. ohps.dnsbl.net.au : RIP as of April 29,2009
5. tor.dan.me.uk : All tor nodes (both entry and exit nodes)
You can use dnsbltools.com to check if your IP/proxy is in DNS blacklists or not.


PHP Code:
    // Cookie management
    
if ($_COOKIE['keeplogged']!='') {
        
$LoginCookie=decrypt($_COOKIE['keeplogged']);
        
$LoginCookie=explode("|~|",decrypt($LoginCookie));
        
$CookieID $LoginCookie[2];
        if(
$CookieID!=$LoggedUser['CookieID'] || !$CookieID) {
            
// The user's cookie is different from the one we have stored in the database
            // They're either trying hax, or have logged in from multiple computers.
            // Both of these are a big no-no.
            
logout();
        }
    } 
This routine check if the cookie in your browser and database is different or not.


PHP Code:
CREATE TABLE `cheater_log` (
  `
IDint(5NOT NULL auto_increment,
  `
Clientvarchar(8) default NULL,
  `
Userint(10) default NULL,
  `
TorrentIDint(10) default NULL,
  `
Testint(2) default NULL,
  `
Timetimestamp NOT NULL default CURRENT_TIMESTAMP,
  `
Peerstext,
  `
GroupIDint(10) default NULL,
  
PRIMARY KEY  (`ID`)
ENGINE=InnoDB DEFAULT CHARSET=latin1
Once they caught cheater, they store the data in this table.


PHP Code:
CREATE TABLE `users_history_emails` (
  `
UserIDint(10NOT NULL,
  `
OldEmailvarchar(255) default NULL,
  `
NewEmailvarchar(255) default NULL,
  `
ChangeTimedatetime default NULL,
  `
ChangerIPvarchar(15) default NULL
ENGINE=InnoDB DEFAULT CHARSET=latin1;

CREATE TABLE `users_history_ips` (
  `
UserIDint(10NOT NULL,
  `
IPvarchar(15NOT NULL default '0.0.0.0',
  `
StartTimedatetime NOT NULL default '0000-00-00 00:00:00',
  `
EndTimedatetime default NULL,
  
PRIMARY KEY  (`UserID`,`IP`,`StartTime`),
  
KEY `UserID` (`UserID`),
  
KEY `IP` (`IP`),
  
KEY `StartTime` (`StartTime`),
  
KEY `EndTime` (`EndTime`)
ENGINE=InnoDB DEFAULT CHARSET=utf8;

CREATE TABLE `users_history_passkeys` (
  `
UserIDint(10NOT NULL,
  `
OldPassKeyvarchar(32) default NULL,
  `
NewPassKeyvarchar(32) default NULL,
  `
ChangeTimedatetime default NULL,
  `
ChangerIPvarchar(15) default NULL
ENGINE=InnoDB DEFAULT CHARSET=latin1;

CREATE TABLE `users_history_passwords` (
  `
UserIDint(10NOT NULL,
  `
ChangeTimedatetime default NULL,
  `
ChangerIPvarchar(15) default NULL
ENGINE=InnoDB DEFAULT CHARSET=latin1
These changes are logged, with IP & timestamp.
1. Email change
2. IP change
3. Passkey change
4. Password change


PHP Code:
    $DB->query("SELECT MAX(Sequence) FROM users_history_ratio");
    list(
$Sequence) = $DB->next_record();
    
$LastSequence $Sequence;
    
$Sequence++;
    if(!
$Sequence){
        
$Sequence 1;
    }

    
$DB->query("INSERT INTO users_history_ratio(Sequence, UserID, Uploaded, Downloaded, UpChange, DownChange, Time)
        SELECT '$Sequence', m.ID, m.Uploaded, m.Downloaded, (m.Uploaded - r.Uploaded), (m.Downloaded - r.Downloaded), '"
.sqltime()."'
        FROM users_main AS m
        LEFT JOIN users_history_ratio AS r ON r.UserID=m.ID AND r.Sequence='$LastSequence'"
); 
Every day and every hour, a script dump your ratio history to database.
This is what the script log :
- UserID
- Uploaded
- Downloaded
- UpChange
- DownChange
- Time
The log is stored separately, so at day 20 a staff can still see how much you upload / download at day 5.


PHP Code:
    m_cheater              false;
    
m_cheater_speed        26214400
XBTT's abnormal upload speed detection, deactivated by default.
If upload speed is greater than 25 MB/s, consider that user is cheating.


PHP Code:
// F****** btjunkie piece of s***
if(strpos($_SERVER['HTTP_REFERER'], 'btjunkie.org')) {
        
// This code is executed if someone is downloading a torrent from btjunkie
        // Do what you want here, be creative. ;)

Yeah, they hate btjunkie. Don't try to download What.CD's torrent from btjunkie.


PHP Code:
log_attempt($UserID);
if (
$Enabled=='2') {
        
$Err='Your account has been disabled.<br />This is either due to inactivity or rule violation.';
} elseif (
$Enabled=='0') {
        
$Err="Your account has not been confirmed.<br />Please check your email.";
} else {
        
$Err="Your username or password was incorrect.";

If you're unable to log in, there're 3 reasons given :
- Your account has been disabled. This is either due to inactivity or rule violation.
- Your account has not been confirmed.
- Your username or password was incorrect.
You won't see the ban reason, although moderators usually put the reason in the Staff Notes.


PHP Code:
`BanReasonenum('0','1','2','3','4'NOT NULL default '0',

// Disabled manually by moderators / admins
BanReason=1

// If a user hasn't been taken off ratio watch in the two weeks since he was put on, banhammer
BanReason=2
AdminComment
=Disabled by ratio watch system

// If a user has downloaded more than 10 gigs while on ratio watch, banhammer
BanReason=3
AdminComment
=Disabled by ratio watch system for downloading more than 10 gigs on ratio watch

// Disable inactive user accounts
BanReason=3
AdminComment
=Disabled for inactivity

// Disable unconfirmed users
BanReason=3
AdminComment
=Disabled for inactivity (never logged in
There're 4 different kind of ban reason.
I haven't seen the 4th reason in the source code, maybe it's either "reserved" or "disabled automatically for cheating";


PHP Code:
$DB->query("UPDATE users_info AS ui JOIN users_main AS um ON um.ID=ui.UserID
        SET um.Enabled='2',
        ui.BanDate='"
.sqltime()."',
        ui.BanReason='3',
        ui.AdminComment=CONCAT('"
.sqltime()." - Disabled for inactivity', ui.AdminComment)
        WHERE um.PermissionID IN ('"
.USER."', '".MEMBER    ."')
        AND um.LastAccess<'"
.time_minus(60*60*24*7*10)."'
        AND um.LastAccess!='0000-00-00 00:00:00'
        AND ui.Donor='0'
        AND um.Enabled!='2'"
); 
Users will be disabled for inactivity if they don't login for 10 weeks (70 days).


PHP Code:
$DB->query("UPDATE users_info AS ui JOIN users_main AS um ON um.ID=ui.UserID
        SET um.Enabled='2',
        ui.BanDate='"
.sqltime()."',
        ui.BanReason='3',
        ui.AdminComment=CONCAT('"
.sqltime()." - Disabled for inactivity (never logged in)', ui.AdminComment)
        WHERE um.LastAccess='0000-00-00 00:00:00'
        AND ui.JoinDate<'"
.time_minus(60*60*24*7)."'
        AND um.Enabled!='2'
        "
); 
Unconfirmed users will be disabled after 1 week (7 days)



II. Staff Account's Screenshot

Maybe you have seen lots of What.CD tracker screenshots, with user / power user permission.
It's time to see what staff account screenshots looks like.
Since we'll deal with staff more often than admin account, let's focus on staff account :

1. Staff Account's Toolbox


2a. User's Permission


2b. Power User's Permission


2c. Staff's Permission


3. IP Bans
Note : There's no expires date


4. Login Watch


5. Invite Pool


6. User Search


7. Active Reports


8. Duplicate IPs


9. User's Profile
Unlike regular user, staff have access to specific feature when they access your profile.


10. Watched users
Usually, staff have to click "Add to watchlist" to make a user account go into "Watch List".
But, I'm sure the system will add any account to "Watch List" automatically if the account meet specific suspicious condition.


Final Note :
Gazelle is open source, so developer can easily modify it to add more feature, like new feature in toolbox or anti-cheating script.
What you see here may be obsolete in a few month later.
 
Say 'Thank You!' for this post.
Reply With Quote
Who Said Thanks:
Vation (07.02.10), abookhalil (22.12.09), pimphead07 (22.12.09), Instab (22.12.09), GotIt (15.12.09), saebrtooth (13.11.09), MiCRON (11.10.09), thecoolest (03.09.09), Dark Knight (03.08.09), Haggar (31.07.09), Kyllyee (31.07.09), Mihai (31.07.09), alpacino (31.07.09), anonftw (31.07.09), hitman (30.07.09), ghostfucker (30.07.09), SBfreak (30.07.09), naughtydog (30.07.09), cheatos (30.07.09), IceBox (30.07.09), Großmutter (30.07.09), shoulder (30.07.09), anon (30.07.09)

Old 30.07.09, 21:34   #2 (permalink)
Moderator
anon enjoys a great reputationanon enjoys a great reputation
anon enjoys a great reputationanon enjoys a great reputationanon enjoys a great reputationanon enjoys a great reputation
 
anon's Avatar
 
anon is offline
Activity Longevity
20/20 15/20
Today Posts
1/5 ssss17255
Join Date: 01.02.08
Location: small bandwidth innovation
Posts: 17,255
Approved! Great work! Thanks for making the information accesible to everyone, specially the source code explanations. We can learn a lot from your post.

Will there be other "tracker analysis" threads from you?
__________________
[ P2PFire - very lightweight IP range blocker ]
[ RSD English Version - Latest Download ]
[ IP Scripts: Switch | Reclaim ]

[ Categorized Tutorial List ]

No support over PM! Your message will be IGNORED!


Last edited by anon; 24.09.06 at 14:49.
 
Say 'Thank You!' for this post.
Reply With Quote

Old 30.07.09, 21:58   #3 (permalink)
Coder
cheatos is a wonderful sightcheatos is a wonderful sightcheatos is a wonderful sightcheatos is a wonderful sightcheatos is a wonderful sightcheatos is a wonderful sightcheatos is a wonderful sightcheatos is a wonderful sightcheatos is a wonderful sightcheatos is a wonderful sight
 
cheatos's Avatar
 
cheatos is offline
Activity Longevity
13/20 6/20
Today Posts
0/5 ssssss990
Join Date: 10.06.09
Location: 6661696C
P2P Client: uTorrent
Posts: 990
great work ,
thanks for the info,

hoping for IPT analyzing
__________________

Last edited by cheatos; 30.07.09 at 21:58.
 
Say 'Thank You!' for this post.
Reply With Quote

Old 30.07.09, 22:05   #4 (permalink)
Zorvak is surrounded by an impressive atmosphereZorvak is surrounded by an impressive atmosphereZorvak is surrounded by an impressive atmosphereZorvak is surrounded by an impressive atmosphereZorvak is surrounded by an impressive atmosphere
 
Zorvak's Avatar
 
Zorvak is offline
Activity Longevity
0/20 5/20
Today Posts
0/5 sssssss58
Join Date: 20.07.09
Posts: 58
Quote:
Will there be other "tracker analysis" threads from you?
Yeah, I think I'll cover another tracker in my next analysis thread. Stay tuned
Meanwhile, feel free to ask anything about What.CD
 
Say 'Thank You!' for this post.
Reply With Quote
Who Said Thanks:
anon (30.07.09)

Old 30.07.09, 22:14   #5 (permalink)
Member
naughtydog will soon be famousnaughtydog will soon be famousnaughtydog will soon be famous
 
naughtydog's Avatar
 
naughtydog is offline
Activity Longevity
1/20 6/20
Today Posts
0/5 ssssss141
Join Date: 15.06.09
Location: Treasure Island
P2P Client: utorrent and Ratio Master
Posts: 141
Great work. Very well explained too, yes IPT should be next...
__________________
http://www.sb-innovation.de/signaturepics/sigpic28562_2.gif



Quote:
#020 • Red Says: 20.07.09 at 3:05 am

Lol, having an interview to join a tracker. What’s next? Having to present a CV when buying bread?
 
Say 'Thank You!' for this post.
Reply With Quote

Old 30.07.09, 22:30   #6 (permalink)
Elite
SBfreak has much to be proud ofSBfreak has much to be proud ofSBfreak has much to be proud ofSBfreak has much to be proud ofSBfreak has much to be proud ofSBfreak has much to be proud ofSBfreak has much to be proud ofSBfreak has much to be proud ofSBfreak has much to be proud ofSBfreak has much to be proud ofSBfreak has much to be proud ofSBfreak has much to be proud of
 
SBfreak's Avatar
 
SBfreak is offline
Activity Longevity
18/20 9/20
Today Posts
1/5 sssss2558
Join Date: 24.12.08
Location: /usr/sb1r3ak/.fail
P2P Client: NoLife++
Posts: 2,558
Well I feel like a nubzor again but thank you for your effort.
+rep to you my friend.
 
Say 'Thank You!' for this post.
Reply With Quote

Old 31.07.09, 04:49   #7 (permalink)
Member
darkside is an unknown person
 
darkside's Avatar
 
darkside is offline
Activity Longevity
0/20 12/20
Today Posts
0/5 sssssss44
Join Date: 21.07.08
Location: pakistan
Posts: 44
Great work and Very very experienced too.
 
Say 'Thank You!' for this post.
Reply With Quote

Old 31.07.09, 08:07   #8 (permalink)
Advanced User
alpacino is just really nicealpacino is just really nicealpacino is just really nicealpacino is just really nicealpacino is just really nicealpacino is just really nicealpacino is just really nicealpacino is just really nice
 
alpacino's Avatar
 
alpacino is offline
Activity Longevity
2/20 7/20
Today Posts
0/5 sssss1363
Join Date: 19.03.09
Location: locked in Alchemilla Hospital
P2P Client: none, just the toolz
Posts: 1,363
Thanks for the detailed info, although I don't understand too much (been rusty on source codes for sometime now), I'm sure it will be very useful for coders and future tracker designers.
__________________

 
Say 'Thank You!' for this post.
Reply With Quote

Old 31.07.09, 08:43   #9 (permalink)
Advanced User
Mihai is a wonderful sightMihai is a wonderful sightMihai is a wonderful sightMihai is a wonderful sightMihai is a wonderful sightMihai is a wonderful sightMihai is a wonderful sightMihai is a wonderful sightMihai is a wonderful sightMihai is a wonderful sight
 
Mihai's Avatar
 
Mihai is offline
Activity Longevity
6/20 7/20
Today Posts
0/5 ssssss917
Join Date: 05.03.09
Location: Bansilvania
P2P Client: Waffles maker 1.4.8
Posts: 917
Interesting.But that thing about how much you uploaded and in how much time should make waffles method imposible to use.But it's not and i used it with high speeds too.
__________________

The Waffles method:The Waffles Method

The GT MethodThe GT Method
I know you can't resist my methods.No one can.

If you can't enjoy the tracker then it's not that good as you think it is.


"Ever tried. Ever failed. No matter. Try Again. Fail again. Fail better."-Samuel Beckett
"If at first the idea is not absurd, then there is no hope for it" -Albert Einstein
 
Say 'Thank You!' for this post.
Reply With Quote

Old 31.07.09, 10:35   #10 (permalink)
Zorvak is surrounded by an impressive atmosphereZorvak is surrounded by an impressive atmosphereZorvak is surrounded by an impressive atmosphereZorvak is surrounded by an impressive atmosphereZorvak is surrounded by an impressive atmosphere
 
Zorvak's Avatar
 
Zorvak is offline
Activity Longevity
0/20 5/20
Today Posts
0/5 sssssss58
Join Date: 20.07.09
Posts: 58
Quote:
Interesting.But that thing about how much you uploaded and in how much time should make waffles method imposible to use.But it's not and i used it with high speeds too.
Right now, I can't found any read access to users_history_ratio or users_history_ratio_hourly table except at economic stats, where the staff see how much total upload / total download for their tracker.
This means staff can't see your ratio history.

I find stat_history.php but it doesn't have any code in it.
Maybe the developers don't show it to public or the function isn't ready yet.
It's better to be careful, though.

Same thing with "Rejoins Watch" on staff toolbox, it's missing.
 
Say 'Thank You!' for this post.
Reply With Quote

Old 31.07.09, 18:55   #11 (permalink)
Moderator
anon enjoys a great reputationanon enjoys a great reputation
anon enjoys a great reputationanon enjoys a great reputationanon enjoys a great reputationanon enjoys a great reputation
 
anon's Avatar
 
anon is offline
Activity Longevity
20/20 15/20
Today Posts
1/5 ssss17255
Join Date: 01.02.08
Location: small bandwidth innovation
Posts: 17,255
Slow and steady is the way to go...

Zorvak, no pressure man, but is it possible for you to analyze the SoftMP3 source code for your next thread? SceneSound and CareStreet are using it. I saw something about 6MB/s inside cheat.php and faking at that speed worked for me, but I'm a coding n00b, you can enlighten us better.
__________________
[ P2PFire - very lightweight IP range blocker ]
[ RSD English Version - Latest Download ]
[ IP Scripts: Switch | Reclaim ]

[ Categorized Tutorial List ]

No support over PM! Your message will be IGNORED!


Last edited by anon; 24.09.06 at 14:49.
 
Say 'Thank You!' for this post.
Reply With Quote

Old 31.07.09, 19:20   #12 (permalink)
Member
shawshankraj is surrounded by an impressive atmosphereshawshankraj is surrounded by an impressive atmosphereshawshankraj is surrounded by an impressive atmosphereshawshankraj is surrounded by an impressive atmosphereshawshankraj is surrounded by an impressive atmosphere
 
shawshankraj's Avatar
 
shawshankraj is offline
Activity Longevity
5/20 7/20
Today Posts
0/5 ssssss634
Join Date: 08.04.09
Location: from heaven
P2P Client: utorrent
Posts: 634
Great work
+1 from me..
May be it's useful to some member..
 
Say 'Thank You!' for this post.
Reply With Quote

Old 31.07.09, 22:43   #13 (permalink)
Zorvak is surrounded by an impressive atmosphereZorvak is surrounded by an impressive atmosphereZorvak is surrounded by an impressive atmosphereZorvak is surrounded by an impressive atmosphereZorvak is surrounded by an impressive atmosphere
 
Zorvak's Avatar
 
Zorvak is offline
Activity Longevity
0/20 5/20
Today Posts
0/5 sssssss58
Join Date: 20.07.09
Posts: 58
Quote:
Great work. Very well explained too, yes IPT should be next...
Unfortunately, IPT source code isn't released to public.

Quote:
Zorvak, no pressure man, but is it possible for you to analyze the SoftMP3 source code for your next thread? SceneSound and CareStreet are using it. I saw something about 6MB/s inside cheat.php and faking at that speed worked for me, but I'm a coding n00b, you can enlighten us better.
Don't worry, SoftMP3 is one of the tracker on my analyzing list.
According to the source code, 4 MB/s is the limit, otherwise you'll enter the cheat database.
But, I'll have to look at the other file to check another anti-cheating script.

I forgot to say this, but make sure you use tor + elite proxy chain if you want to get Gazelle source code directly from What.CD's SVN.
Maybe they will closely monitor who download the source code from their server now.

Last edited by Zorvak; 01.08.09 at 21:27.
 
Say 'Thank You!' for this post.
Reply With Quote
Who Said Thanks:
anon (31.07.09)

Old 04.08.09, 09:28   #14 (permalink)
sbrocks is an unknown person
 
sbrocks is offline
Activity Longevity
0/20 6/20
Today Posts
0/5 ssssss120
Join Date: 15.06.09
Location: usa
P2P Client: utorrent
Posts: 120
i have a question, i've been banned before. and i got another new acc which was registered using another country's IP; my own ip is dynamic, is that safe to login again with this acc? yeah of course the ip is different from the one i got banned, but they are belongs to a ip range
 
Say 'Thank You!' for this post.
Reply With Quote

Old 04.08.09, 09:58   #15 (permalink)
Advanced User
alpacino is just really nicealpacino is just really nicealpacino is just really nicealpacino is just really nicealpacino is just really nicealpacino is just really nicealpacino is just really nicealpacino is just really nice
 
alpacino's Avatar
 
alpacino is offline
Activity Longevity
2/20 7/20
Today Posts
0/5 sssss1363
Join Date: 19.03.09
Location: locked in Alchemilla Hospital
P2P Client: none, just the toolz
Posts: 1,363
____________________________________________________________________________________

This is the wrong section for asking but, anyway, if the account belongs to another country, then it's very likely it will be banned as soon as you log in using your country ip. If you have dynamic ip, you should've created the account in your own country, after cleaning all traces (cookies,etc) and renewing the ip, unless we are talking about a trade here.
__________________

 
Say 'Thank You!' for this post.
Reply With Quote
Reply

Bookmarks

Tags
analysis, bittorrent, gazelle, tracker, what.cd, whatcd

Thread Tools

Posting Rules
You may not post new threads
You may post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are On




All times are GMT +2. The time now is 04:38.


vBulletin skins developed by: eXtremepixels
Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2010, Jelsoft Enterprises Ltd.
SEO by vBSEO 3.3.2
©2007-2010 SB-Innovation, All Rights Reserved

Suchmaschinenoptimierung mit Ranking-Hits
Page generated in 0.45749 seconds with 29 queries

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146