View Full Version : Soulsplit gem stall theiver
Soulsplit gem stall theiver
Features
- Hovers over stall for maximum XP
- Solves interface random
- baker , spice , gem , fur , silk , silver stall support
- Auto login
- Logs out if a certain text appears in the chatbox (optional)
- Timeout failsafe
Instructions
- Download srlRSPS include from https://github.com/officerBarbrady/srlRSPS
- Extract to c:simba/includes and rename to 'RSPS'
- Change script interpreter to lape
- Fill out the script info
- Start near preferred stall, clear your inventory of any valuables
- If the script stops please post the screenshot on this thread
- Set your brightness to max
The Mayor
02-02-2014, 04:00 AM
Don't you need a program name?
Don't you need a program name?
nop
please do some rs3 scripting.
please do some rs3 scripting.
Waiting for the minmap to be fixed
Hoodz
02-02-2014, 02:13 PM
Waiting for the minmap to be fixed
what do you mean with that?
what do you mean with that?
The minimap goes completely blank it's an openGL glitch, Might just use Brandons directX plugin
Hoodz
02-02-2014, 03:09 PM
The minimap goes completely blank it's an openGL glitch, Might just use Brandons directX plugin
Just teleport a few times/walk in other area's and try going into the lobby. That will fix it
Just teleport a few times/walk in other area's and try going into the lobby. That will fix it
Yea, that's if you're playing legit. But if your botting that's annoying to do
Yea, that's if you're playing legit. But if your botting that's annoying to do
Yeh u got a point there :p
trashcan
02-08-2014, 03:29 AM
Unknown declaration "waitOption" at line 77, column 14
Unknown declaration "waitOption" at line 77, column 14
Compiles fine for me, you must have installed it wrong show me your includes folder (C:simba/includes)
hazlloyd
02-17-2014, 10:45 PM
Got the script working, but it doesn't click.
Got the script working, but it doesn't click.
Is your brightness on max?
hazlloyd
02-17-2014, 11:44 PM
Is your brightness on max?
Hi Brady.
I am playing on SS2, 'oldschool' detail, 317 gameframe with 562 hitsplats.
Brightness is on maximum, and the zoom feature is set to default. (point in the middle)
Hi Brady.
I am playing on SS2, 'oldschool' detail, 317 gameframe with 562 hitsplats.
Brightness is on maximum, and the zoom feature is set to default. (point in the middle)
Did you drag the green arrow to the client?
hazlloyd
02-17-2014, 11:53 PM
Did you drag the green arrow to the client?
Thank you sir.
Have only really started using vilavu, but know basic pascal. You may be my motivation to make me script :P
Brilliant script.
hazlloyd
02-18-2014, 12:07 AM
In regards to the script.
interface,
Select an option
Destroy this high valued item
Keep this item
when thieving 'Gems' works almost perfectly.
Would it be possible to code the interface above so that it drops the 'high valued items'?
Such items are:
Super Defence(4)
Morchella Mushroom
Coins
Edit: A different interface is shown for coins.
In regards to the script.
interface,
when thieving 'Gems' works almost perfectly.
Would it be possible to code the interface above so that it drops the 'high valued items'?
Such items are:
Super Defence(4)
Morchella Mushroom
Coins
Edit: A different interface is shown for coins.
Yes, what thieving level is needed for gems?
hazlloyd
02-18-2014, 12:22 AM
Level 80 for gems stall.
Finally, script is failing a lot, so have turned fails = 10 to fails = 100.
Level 80 for gems stall.
Finally, script is failing a lot, so have turned fails = 10 to fails = 100.
If or when I get 80 thieving I might add that
hazlloyd
02-18-2014, 03:09 PM
If or when I get 80 thieving I might add that
If you would like an account with 80 thieving, let me know.
hazlloyd;
Do you think you could post a picture of all the items that are considered 'valuable'
currently, I have a drop that will drop all valuables, but I also made a function that will drop all items but the values, and then come back and drop them.
Reasoning:
If I wait for the 'are you sure you want to drop?' interface to show up, then it will take an extra 400-600 ms per item.. assuming 80% of the items aren't valuable that means 11 seconds are wasted each time it drops an inventory. It's better to just drop all the other items, and then go back to the items that you know are valuable. This is made even faster by not even right clicking and attempting to drop items that are known to have the interface pop up (again moving the mouse, right clicking, waiting for the ption another 500 ms)
So ultimately this will speed up the script significantly
hazlloyd;
Updated script, just need more bitmaps. Be sure to update RSPS include:
{$I RSPS/srlRSPS.Simba}
// VERSION 1.00
const
timeout = 30000;
fails = 30;
stall = 'spice';
{*baker * spice * gem * fur * silk * silver*}
logOutChatMessage = [''];
{Logout if text appears in chat, Leave blank if you don't want to use}
{
Example form:
timeout = 10000;
fails = 10;
stall = 'Fur';
logOutChatMessage = ['r u botting','bot?'];
}
var
e:_rsps_server;
uptexts:TStringArray;
failSafeTimer, failCount, steals, randoms:integer;
startXP:integer;
bmpArray:TIntegerArray;
procedure loadUptext(stallType:string);
begin
case lowerCase(stallType) of
'baker' : uptexts := ['aker','Bake','Bak'];
'spice' : uptexts := ['pice','Spice','Spi'];
'gem' : uptexts := ['Gem','em'];
'fur' : uptexts := ['Fur'];
'silk' : uptexts := ['Silk','ilk'];
'silver': uptexts := ['ilver','lver','Silver'];
end;
setLength(bmpArray, 3);
bmpArray[0] := BitmapFromString(20, 10, 'meJyTO/xebt8Lma33ZNZfk1xyUmzmbkYGBgUFAyApd+iN3NGPcqe+aZz7 LbPrMUh20iZkBFQgs+MBRKPk7H1iE9YDdUGQ3PEvQF1yB14BZc W6V6JpBCKoxuVn+NLrMGXRFW++DVK/6zHQqSBLYU7Fr0uoeQFfSpXM7qcQBNK77wW6smk7QOYDFQDNB9 oCNHn1RZCrCjr5ovNBgmB7IQhkNUTlphsya68IVU+TnHcAJAIM PbAIUCNQBCjOF1sEsQ4ktfUe0ExQUIA1gsxfclKobQlQPUgv0F K4xrYlfLltnP5JoLA98ApiAtQcWHCJ9a4BBqzi2d9yp39AbUdz eUoVyEcQNwOlwFZIrjwnueAwUBwaO0c/AlXCXQ7RCFQA9DWe8IToBRkOcTlEL9DkRccgXgY6DIKAsgAufC LU');
bmpArray[1] := BitmapFromString(11, 9, 'meJzz3XzZYcMls3UXTVacNll+Qnfyeq2OJXCk0TjLd/Nl6w2XTFadgSjQm7ZFd8JaiKx29zKt1gVAWbM150AKwGoMZm4H GgKUgiCgAqDhQAVwNQZz9upN3gRV0LNCq32h+XqQA+DKDBceAN oClIIgiAJkNcaLj4AMgajpWw10CdANyGqA7jSct09vxjagLFwB XA0QAZ1hvPAw0KlAWaB3gC4BBoIDWA1EGdAQkC2zdwFlIQoAwP qZxQ==');
bmpArray[2] := BitmapFromString(18, 8, 'meJyTO/BK7vgXmd1PZdZfk9n1WGbTDcmV5yQXHOZLr2NkYFBQMACSIKlN N2Q235ZcfkZy9j6x3jVyh9/Lnf4hs+OB5JKTyLqEqqdBdBk7uEE1br0HkoLoOvoRpGv9Ncl5B/hy20Aa114B6gJKCZVNAKo3tHaG6tp8G2T46otAlWKTNkEQSGXH cpBT4Y4s6EQ4EujCHQ9A1i0/IzZtB0QLp38SUAqI5Pa9QDiyeQFCF9giiNfEZu4GqVlwmDM8Gy S19orcoTcg2bVXxKZuRbFr6z2orkXHQA5bfRFoI19sEciiw+9B LgRKAR2/5CREC1QX0L9AjUArlpwEqod4jS+lCqTr6Eeof2fvE6qbBXEzBE F1AQMNGIYT1gMA6TCvBQ==');
end;
function findStall:boolean;
var
tentTPA:TPointArray;
tentATPA:T2DPointArray;
i:integer;
move:TPoint;
begin
SetColorToleranceSpeed(2);
SetToleranceSpeed2Modifiers(0.13, 0.69);
FindColorsTolerance(tentTPA, 9150895, mainscreen.bounds, 6);
SetToleranceSpeed2Modifiers(0.2, 0.2);
SetColorToleranceSpeed(1);
if length(tentTPA) > 0 then
begin
tentATPA := clusterTPA(tentTPA, 2);
filterTpasBetween(tentATPA, 0, 50);
sortATPAFromFirstpoint(tentATPA, point(258, 219));
for i := 0 to high(tentATPA) do
begin
move := middleTPA(tentATPA[i]);
mmouse(move.x, move.y, 0, 0);
if e.waitUpTextMulti(uptexts, 300) then
exit(true);
end;
end;
end;
function checkMarkExists:boolean;
begin
result := (countColorTolerance(3051090, 238, 434, 280, 471, 61) > 90)
end;
function selectOptionExists:boolean;
var
text:string;
begin
text := getSimpleText([128], 202, 410, 327, 433, 'charsnpc07');
result := text.contains(['elect','ption','Opti']);
end;
function valDrop:boolean;
begin
result := checkMarkExists or selectOptionExists;
end;
procedure clickYes;
begin
if checkMarkExists then
mouse(296, 454, 0, 0, mouse_left)
else if selectOptionExists then
mouse(258, 454, 0, 0, mouse_left)
else
end;
function _rsps_server.dropValauble:boolean;
var
i, c, k:integer;
begin
c := inventory.count();
if (c = 0) then
exit(true);
for i := 0 to 27 do
if inventory.slotFull(i) then
begin
inventory.interactItem(i, mouse_right);
if self.waitOption('rop', 200) then
if waitFunc(@valDrop, 50, 700) then
clickYes;
end;
exit(k = c);
end;
function getInterfaceText:string;
var
textTPA:TPointArray;
textATPA:T2DPointArray;
begin
findColorsTolerance(textTPA, 65535, 430, 69, 504, 82, 1);
textATPA := splitTPAEx(textTPA, 1, 10);
filtertpasbetween(textatpa, 0, 1);
SortATPAFromFirstPointX(textATPA, Point(0, 0));
result := getTextATPA(textATPA, 3, 'smallchars07');
end;
function interfaceEvent:boolean;
begin
result := getInterfaceText = 'close window';
end;
procedure findRandoms;
begin
if interfaceEvent then
begin
mmouse(455, 76, 0, 0);
if e.waitUpTextMulti(['Close','lose'], 300) then
begin
clickMouse2(mouse_left);
randoms := randoms + 1;
end;
end;
end;
function ss_loggedin:boolean;
begin
result := (getColor(426, 543) = 16777215);
end;
procedure ss_login;
begin
if not ss_loggedin then
begin
mouse(480, 469);
waitFunc(@ss_loggedin, 40, 5000);
wait(1200);
end;
end;
procedure ss_logout;
begin
mouse(753, 64);
wait(1200);
mouse(643, 429);
end;
procedure terminate(message:String;screenshot:boolean);
var
bmp, i:integer;
begin
if screenshot then
begin
bmp := bitmapFromClient(1, 54, 762, 554);
DisplayDebugImgWindow(762, 500);
DrawBitmapDebugImg(Bmp);
end;
writeln('=======================================') ;
writeln('Script stopped, error message : ' );
writeln(message);
writeln('=======================================') ;
ss_logout;
for i := 0 to high(bmpArray) do
freeBitmap(bmpArray[i]);
terminateScript();
end;
function perHour(what:integer):integer;
begin
result := Round(what * (3600.0 / (GetTimeRunning / 1000.0)));
end;
function progress:boolean;
var
steals_PH:integer;
begin
steals_PH := Round(steals * (3600.0 / (GetTimeRunning / 1000.0)));
clearDebug;
writeln('=======================================') ;
writeln('Time running ' , timeRunning);
Writeln('Steals : ', steals, ' Per hour ', steals_PH);
writeln('XP : ' , (ss_GetXPBarTotal - startXP) , ' Per hour ', perHour(ss_GetXpBarTotal - startXP));
writeln('Randoms : ' , randoms );
if steals > 0 then
writeln('Random :: steals ratio : ' , (randoms / steals));
writeln('=======================================') ;
result := not isKeyDown(113);
end;
// didClick <> mine
procedure loop;
begin
if (timeFromMark(failSafeTimer) > timeout) then
terminate('Ran out of time , last action : ' + toStr(TimeFromMark(failSafeTimer)), true);
if (failCount > fails) then
terminate('Too many fails , show the debug screeny on the script thread, fails: ' + toStr(failCount), true);
ss_login;
findRandoms;
if (inventory.full) then
begin
e.dropAllExcept(inventory.bitmapPositionMulti(bmpA rray, [50, 50, 50]));
// e.dropValauble;
end;
if e.isUpTextMulti(uptexts) then
begin
clickMouse2(mouse_left);
if DidClick(true, 200) then
begin
steals := steals + 1;
wait(1900);
end;
end
else
if not (e.IsUpTextMulti(['1 more'])) then
begin
if not findStall() then
failCount := failCount + 1
else
begin
if DidClick(true, 200) then
begin
steals := steals + 1;
failCount := 0;
markTime(failSafeTimer);
wait(1900);
end;
end;
end;
if (logOutChatMessage[0] <> '') then
if e.chatTextExists(logOutChatMessage) then
terminate('Found chat text , chatlog ' + toStr(e.getChat), true);
end;
begin
e.init('soulsplit');
mainscreen.bounds := intToBox(2, 57, 514, 392);
loadUptext(stall);
inventory.setUp(intToBox(563, 266, 721, 513));
startXP := ss_getXpBarTotal();
while progress() do
loop;
end.
chubbard615
04-14-2014, 02:06 PM
I keep getting a Unknown compiler directives at 13:3
any ideas?
I keep getting a Unknown compiler directives at 13:3
any ideas?
Change interpreter from pascal to lape
oshoft
04-16-2014, 03:19 PM
duplicate declaration
kyncent
04-27-2014, 09:52 PM
i get duplicate declaration drop all at line 66, column 38. I've had a lot of problems trying to get srl.srl.simba to work in general. Please help Robert. I've looked at a lot of your scripts and they are all nice. I only have one that works and that is the fighter
smp2031
04-30-2014, 02:29 AM
i get duplicate declaration drop all at line 66, column 38. I've had a lot of problems trying to get srl.srl.simba to work in general. Please help Robert. I've looked at a lot of your scripts and they are all nice. I only have one that works and that is the fighter
use roberts new code
hazlloyd;
Updated script, just need more bitmaps. Be sure to update RSPS include:
{$I RSPS/srlRSPS.Simba}
// VERSION 1.00
const
timeout = 30000;
fails = 30;
stall = 'spice';
{*baker * spice * gem * fur * silk * silver*}
logOutChatMessage = [''];
{Logout if text appears in chat, Leave blank if you don't want to use}
{
Example form:
timeout = 10000;
fails = 10;
stall = 'Fur';
logOutChatMessage = ['r u botting','bot?'];
}
var
e:_rsps_server;
uptexts:TStringArray;
failSafeTimer, failCount, steals, randoms:integer;
startXP:integer;
bmpArray:TIntegerArray;
procedure loadUptext(stallType:string);
begin
case lowerCase(stallType) of
'baker' : uptexts := ['aker','Bake','Bak'];
'spice' : uptexts := ['pice','Spice','Spi'];
'gem' : uptexts := ['Gem','em'];
'fur' : uptexts := ['Fur'];
'silk' : uptexts := ['Silk','ilk'];
'silver': uptexts := ['ilver','lver','Silver'];
end;
setLength(bmpArray, 3);
bmpArray[0] := BitmapFromString(20, 10, 'meJyTO/xebt8Lma33ZNZfk1xyUmzmbkYGBgUFAyApd+iN3NGPcqe+aZz7 LbPrMUh20iZkBFQgs+MBRKPk7H1iE9YDdUGQ3PEvQF1yB14BZc W6V6JpBCKoxuVn+NLrMGXRFW++DVK/6zHQqSBLYU7Fr0uoeQFfSpXM7qcQBNK77wW6smk7QOYDFQDNB9 oCNHn1RZCrCjr5ovNBgmB7IQhkNUTlphsya68IVU+TnHcAJAIM PbAIUCNQBCjOF1sEsQ4ktfUe0ExQUIA1gsxfclKobQlQPUgv0F K4xrYlfLltnP5JoLA98ApiAtQcWHCJ9a4BBqzi2d9yp39AbUdz eUoVyEcQNwOlwFZIrjwnueAwUBwaO0c/AlXCXQ7RCFQA9DWe8IToBRkOcTlEL9DkRccgXgY6DIKAsgAufC LU');
bmpArray[1] := BitmapFromString(11, 9, 'meJzz3XzZYcMls3UXTVacNll+Qnfyeq2OJXCk0TjLd/Nl6w2XTFadgSjQm7ZFd8JaiKx29zKt1gVAWbM150AKwGoMZm4H GgKUgiCgAqDhQAVwNQZz9upN3gRV0LNCq32h+XqQA+DKDBceAN oClIIgiAJkNcaLj4AMgajpWw10CdANyGqA7jSct09vxjagLFwB XA0QAZ1hvPAw0KlAWaB3gC4BBoIDWA1EGdAQkC2zdwFlIQoAwP qZxQ==');
bmpArray[2] := BitmapFromString(18, 8, 'meJyTO/BK7vgXmd1PZdZfk9n1WGbTDcmV5yQXHOZLr2NkYFBQMACSIKlN N2Q235ZcfkZy9j6x3jVyh9/Lnf4hs+OB5JKTyLqEqqdBdBk7uEE1br0HkoLoOvoRpGv9Ncl5B/hy20Aa114B6gJKCZVNAKo3tHaG6tp8G2T46otAlWKTNkEQSGXH cpBT4Y4s6EQ4EujCHQ9A1i0/IzZtB0QLp38SUAqI5Pa9QDiyeQFCF9giiNfEZu4GqVlwmDM8Gy S19orcoTcg2bVXxKZuRbFr6z2orkXHQA5bfRFoI19sEciiw+9B LgRKAR2/5CREC1QX0L9AjUArlpwEqod4jS+lCqTr6Eeof2fvE6qbBXEzBE F1AQMNGIYT1gMA6TCvBQ==');
end;
function findStall:boolean;
var
tentTPA:TPointArray;
tentATPA:T2DPointArray;
i:integer;
move:TPoint;
begin
SetColorToleranceSpeed(2);
SetToleranceSpeed2Modifiers(0.13, 0.69);
FindColorsTolerance(tentTPA, 9150895, mainscreen.bounds, 6);
SetToleranceSpeed2Modifiers(0.2, 0.2);
SetColorToleranceSpeed(1);
if length(tentTPA) > 0 then
begin
tentATPA := clusterTPA(tentTPA, 2);
filterTpasBetween(tentATPA, 0, 50);
sortATPAFromFirstpoint(tentATPA, point(258, 219));
for i := 0 to high(tentATPA) do
begin
move := middleTPA(tentATPA[i]);
mmouse(move.x, move.y, 0, 0);
if e.waitUpTextMulti(uptexts, 300) then
exit(true);
end;
end;
end;
function checkMarkExists:boolean;
begin
result := (countColorTolerance(3051090, 238, 434, 280, 471, 61) > 90)
end;
function selectOptionExists:boolean;
var
text:string;
begin
text := getSimpleText([128], 202, 410, 327, 433, 'charsnpc07');
result := text.contains(['elect','ption','Opti']);
end;
function valDrop:boolean;
begin
result := checkMarkExists or selectOptionExists;
end;
procedure clickYes;
begin
if checkMarkExists then
mouse(296, 454, 0, 0, mouse_left)
else if selectOptionExists then
mouse(258, 454, 0, 0, mouse_left)
else
end;
function _rsps_server.dropValauble:boolean;
var
i, c, k:integer;
begin
c := inventory.count();
if (c = 0) then
exit(true);
for i := 0 to 27 do
if inventory.slotFull(i) then
begin
inventory.interactItem(i, mouse_right);
if self.waitOption('rop', 200) then
if waitFunc(@valDrop, 50, 700) then
clickYes;
end;
exit(k = c);
end;
function getInterfaceText:string;
var
textTPA:TPointArray;
textATPA:T2DPointArray;
begin
findColorsTolerance(textTPA, 65535, 430, 69, 504, 82, 1);
textATPA := splitTPAEx(textTPA, 1, 10);
filtertpasbetween(textatpa, 0, 1);
SortATPAFromFirstPointX(textATPA, Point(0, 0));
result := getTextATPA(textATPA, 3, 'smallchars07');
end;
function interfaceEvent:boolean;
begin
result := getInterfaceText = 'close window';
end;
procedure findRandoms;
begin
if interfaceEvent then
begin
mmouse(455, 76, 0, 0);
if e.waitUpTextMulti(['Close','lose'], 300) then
begin
clickMouse2(mouse_left);
randoms := randoms + 1;
end;
end;
end;
function ss_loggedin:boolean;
begin
result := (getColor(426, 543) = 16777215);
end;
procedure ss_login;
begin
if not ss_loggedin then
begin
mouse(480, 469);
waitFunc(@ss_loggedin, 40, 5000);
wait(1200);
end;
end;
procedure ss_logout;
begin
mouse(753, 64);
wait(1200);
mouse(643, 429);
end;
procedure terminate(message:String;screenshot:boolean);
var
bmp, i:integer;
begin
if screenshot then
begin
bmp := bitmapFromClient(1, 54, 762, 554);
DisplayDebugImgWindow(762, 500);
DrawBitmapDebugImg(Bmp);
end;
writeln('=======================================') ;
writeln('Script stopped, error message : ' );
writeln(message);
writeln('=======================================') ;
ss_logout;
for i := 0 to high(bmpArray) do
freeBitmap(bmpArray[i]);
terminateScript();
end;
function perHour(what:integer):integer;
begin
result := Round(what * (3600.0 / (GetTimeRunning / 1000.0)));
end;
function progress:boolean;
var
steals_PH:integer;
begin
steals_PH := Round(steals * (3600.0 / (GetTimeRunning / 1000.0)));
clearDebug;
writeln('=======================================') ;
writeln('Time running ' , timeRunning);
Writeln('Steals : ', steals, ' Per hour ', steals_PH);
writeln('XP : ' , (ss_GetXPBarTotal - startXP) , ' Per hour ', perHour(ss_GetXpBarTotal - startXP));
writeln('Randoms : ' , randoms );
if steals > 0 then
writeln('Random :: steals ratio : ' , (randoms / steals));
writeln('=======================================') ;
result := not isKeyDown(113);
end;
// didClick <> mine
procedure loop;
begin
if (timeFromMark(failSafeTimer) > timeout) then
terminate('Ran out of time , last action : ' + toStr(TimeFromMark(failSafeTimer)), true);
if (failCount > fails) then
terminate('Too many fails , show the debug screeny on the script thread, fails: ' + toStr(failCount), true);
ss_login;
findRandoms;
if (inventory.full) then
begin
e.dropAllExcept(inventory.bitmapPositionMulti(bmpA rray, [50, 50, 50]));
// e.dropValauble;
end;
if e.isUpTextMulti(uptexts) then
begin
clickMouse2(mouse_left);
if DidClick(true, 200) then
begin
steals := steals + 1;
wait(1900);
end;
end
else
if not (e.IsUpTextMulti(['1 more'])) then
begin
if not findStall() then
failCount := failCount + 1
else
begin
if DidClick(true, 200) then
begin
steals := steals + 1;
failCount := 0;
markTime(failSafeTimer);
wait(1900);
end;
end;
end;
if (logOutChatMessage[0] <> '') then
if e.chatTextExists(logOutChatMessage) then
terminate('Found chat text , chatlog ' + toStr(e.getChat), true);
end;
begin
e.init('soulsplit');
mainscreen.bounds := intToBox(2, 57, 514, 392);
loadUptext(stall);
inventory.setUp(intToBox(563, 266, 721, 513));
startXP := ss_getXpBarTotal();
while progress() do
loop;
end.
u
can you put that in code tags please..
smp2031
04-30-2014, 11:52 AM
sorry for repost i couldnt figure out how to put code tags :P
Nitwit
05-11-2014, 05:27 AM
Exception in Script: File "RSPS/srlRSPS.Simba" not found at line 1, column 5
I'm really lost, I downloaded the zip file, extracted to include, renamed RSPS.simba. Still not working...
Epistolizer
05-13-2014, 01:26 AM
Hi Robert, I'm getting this message when I try to run the script - Exception in Script: Duplicate declaration "dropALL" at line 66, column 38
Any ideas what I should do?
Ashaman88
05-13-2014, 01:07 PM
moved to outdated. pm when/if it's updated!
Powered by vBulletin® Version 4.2.1 Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.