Welcome to the Second Life Forums Archive

These forums are CLOSED. Please visit the new forums HERE

Babbage Linden asks: what can LL change in LSL to reduce lag?

Void Singer
Int vSelf = Sing(void);
Join date: 24 Sep 2005
Posts: 6,973
12-05-2009 09:03
I may have to revise my statement concerning dormant vs idle scripts in light of llTargetOmega (which I'm being told continues running even if the script is set to not running, but dies when the script is removed? that's.... kind of freakish)

in which case there is either still some script operation under not running (and hence cpu usage) or some type of temporary prim property storage with a callback to the originating script (or the space is created by the script, which suggest higher bandwidth requirements even if the script is dormant, which seems not good)
_____________________
|
| . "Cat-Like Typing Detected"
| . This post may contain errors in logic, spelling, and
| . grammar known to the SL populace to cause confusion
|
| - Please Use PHP tags when posting scripts/code, Thanks.
| - Can't See PHP or URL Tags Correctly? Check Out This Link...
| -
Lear Cale
wordy bugger
Join date: 22 Aug 2007
Posts: 3,569
12-07-2009 06:15
From: Void Singer
not dormant... idle, dormant scripts are ignored
I was unaware of formal definitions for these terms. I was referring to scripts with no events pending, nothing to do. I suppose by "dormant", you mean ones with no *possible* events? Evidently, you mean "not running". I call those "not running", since it's unambiguous.

From: someone
.... but argent is right, their check needs some help (there has to be some kind of a check to see if any conditions have triggered events, and also the script time counter is also always running as long as the script is running, and probably used as the convenient check point.
I disagree. A script with no events pending (with possible exception for listens) should not be "visited" at all, even if the check is very efficient.

Is 2 microseconds "efficient"?

Note that it's probably not the time to run the instructions that takes the time, but the time to pull the relevant information from memory, especially if it's in disk cache.
Lear Cale
wordy bugger
Join date: 22 Aug 2007
Posts: 3,569
12-07-2009 06:18
From: Void Singer
I may have to revise my statement concerning dormant vs idle scripts in light of llTargetOmega (which I'm being told continues running even if the script is set to not running, but dies when the script is removed? that's.... kind of freakish)

in which case there is either still some script operation under not running (and hence cpu usage) or some type of temporary prim property storage with a callback to the originating script (or the space is created by the script, which suggest higher bandwidth requirements even if the script is dormant, which seems not good)
Well, that's a special case, but definitely one to note. This is a corner case, really: should this be script time or physics time? In a way, it's both.
Argent Stonecutter
Emergency Mustelid
Join date: 20 Sep 2005
Posts: 20,263
12-07-2009 06:31
From: Lear Cale

I disagree. A script with no events pending (with possible exception for listens) should not be "visited" at all, even if the check is very efficient.

Is 2 microseconds "efficient"?
If it's more than a few dozen nanoseconds to do a table lookup on an event, then they need to fix it. The time is going to be dominated by memory access, since the data is probably not in L2 cache (5 cycles, or about 2-3 ns away). For list following and table lookup, the speed of the memory (throughput) isn't the critical factor, it's the cost of a cache miss (pipeline stall) you really need to worry about, because main memory is too far away for prefetch to do any good on this kind of tight loop. Say they have about two cache misses to wait through (follow the link to the next script, indirect fetch through the table). That means about 30 cycles stall if they're using AMD or Core Duo CPUs, 80 cycles if they're using Pentium 4. 2-3 GHz CPU (probably 3 GHz if P4, 2 GHz if AMD or Core Duo), so that's 15-27ns per table lookup per script.

From: someone
Note that it's probably not the time to run the instructions that takes the time, but the time to pull the relevant information from memory, especially if it's in disk cache.
If the relevant information is not in memory, then the problem isn't script time, it's script memory, and the sim will be lagging its guts out from swapping if that happens more than very occasionally.
_____________________
Argent Stonecutter - http://globalcausalityviolation.blogspot.com/

"And now I'm going to show you something really cool."

Skyhook Station - http://xrl.us/skyhook23
Coonspiracy Store - http://xrl.us/coonstore
Lear Cale
wordy bugger
Join date: 22 Aug 2007
Posts: 3,569
12-07-2009 07:01
Today's processors are considerably faster than memory access. Even if data is in memory, it takes a long time to fetch it. Even if it's in L2 cache, it takes a long time, relative to instructions.

In any case, it takes 2 microseconds, which IMHO is too long and should be fixed, as I said in my first post. This wastes far more CPU time than anything else in LSL.
Meade Paravane
Hedgehog
Join date: 21 Nov 2006
Posts: 4,845
12-07-2009 07:25
From: Ilana Debevec
From: Meade Paravane
I really like the llLinkParticleSystem idea. Is there a JIRA for that yet?
Not that I'm aware of.. yet.

/me finds .

Vote!
_____________________
Tired of shouting clubs and lucky chairs? Vote for llParcelSay!!!
- Go here: http://jira.secondlife.com/browse/SVC-1224
- If you see "if you were logged in.." on the left, click it and log in
- Click the "Vote for it" link on the left
Meade Paravane
Hedgehog
Join date: 21 Nov 2006
Posts: 4,845
12-07-2009 07:33
From: Void Singer
I may have to revise my statement concerning dormant vs idle scripts in light of llTargetOmega (which I'm being told continues running even if the script is set to not running, but dies when the script is removed? that's.... kind of freakish)

/me would have to see this to believe it. I always thought llTargetOmega continued after the script was gone.

As for running vs. not, I suspect that's confusion about how llTargetOmega behaves when it's set on a physical object. When it's on a physical object, it does collisions and stuff which, I guess, could cause a bit of extra processing time to show up on a script that has collision events even if it's set to not-running. Could be wrong, though. On a non-physical object, it should be 100% client side after it starts spinning.
_____________________
Tired of shouting clubs and lucky chairs? Vote for llParcelSay!!!
- Go here: http://jira.secondlife.com/browse/SVC-1224
- If you see "if you were logged in.." on the left, click it and log in
- Click the "Vote for it" link on the left
Viktoria Dovgal
Join date: 29 Jul 2007
Posts: 3,593
12-07-2009 09:05
The llTargetOmega weirdness is correct for nonphysical objects. Remove the script and the movement stops. Set the script to not running and it keeps spinning, _but_ it won't resume if you take and re-rez.

For physical objects, the movement _does_ stop once the script is set to not running.
Argent Stonecutter
Emergency Mustelid
Join date: 20 Sep 2005
Posts: 20,263
12-07-2009 12:04
From: Lear Cale
Today's processors are considerably faster than memory access.
Yes, I know that. But not THAT slow. Main memory is not 4000 cycles away.

From: someone
Even if data is in memory, it takes a long time to fetch it. Even if it's in L2 cache, it takes a long time, relative to instructions.
L1 cache in a Pentium 4 is 2 cycles away. L2 cache is 5 cycles away.

From: someone
In any case, it takes 2 microseconds
WHAT takes 2 microseconds? What exactly are you measuring?
_____________________
Argent Stonecutter - http://globalcausalityviolation.blogspot.com/

"And now I'm going to show you something really cool."

Skyhook Station - http://xrl.us/skyhook23
Coonspiracy Store - http://xrl.us/coonstore
Lear Cale
wordy bugger
Join date: 22 Aug 2007
Posts: 3,569
12-07-2009 12:20
From: Argent Stonecutter
WHAT takes 2 microseconds? What exactly are you measuring?
Using "Top Scripts", we see that scripts that have no events scheduled, or which can't possibly even have events to handle (e.g., state with only an entry handler) almost always read at 0.002 milliseconds. Sometimes they read at 0.001.

My undrestanding is that this is how much CPU time they took on the last pass of the scheduler.
Argent Stonecutter
Emergency Mustelid
Join date: 20 Sep 2005
Posts: 20,263
12-07-2009 12:44
From: Lear Cale
Using "Top Scripts", we see that scripts that have no events scheduled, or which can't possibly even have events to handle (e.g., state with only an entry handler) almost always read at 0.002 milliseconds. Sometimes they read at 0.001.

My undrestanding is that this is how much CPU time they took on the last pass of the scheduler.
I can't see any way that event handling could have that effect. Sounds more to me like they're measuring the time it takes to instrument the script. Like they're making a system call for each script every frame, to see how much time it's taking, and that system call is taking 1-2 ms.

Eg:

Get clock time.
See if script needs to run, if so:
* Run it.
Get clock time.

Instead of:

See if script needs to run, if so:
* Get clock time.
* Run script.
* Get clock time.
_____________________
Argent Stonecutter - http://globalcausalityviolation.blogspot.com/

"And now I'm going to show you something really cool."

Skyhook Station - http://xrl.us/skyhook23
Coonspiracy Store - http://xrl.us/coonstore
Void Singer
Int vSelf = Sing(void);
Join date: 24 Sep 2005
Posts: 6,973
12-07-2009 13:38
From: Meade Paravane
/me would have to see this to believe it. I always thought llTargetOmega continued after the script was gone.

As for running vs. not, I suspect that's confusion about how llTargetOmega behaves when it's set on a physical object. When it's on a physical object, it does collisions and stuff which, I guess, could cause a bit of extra processing time to show up on a script that has collision events even if it's set to not-running. Could be wrong, though. On a non-physical object, it should be 100% client side after it starts spinning.

it gets weirder, apparently it it not a matter of client side not getting updated, as it was tested with a second client that tp'd in AFTER the script was stopped, both see it stopped upon script removal though... but in yet another twist, when the second viewer was a linux client that happened to be on a different virtual desktop (so effectively minimized) while the script was being removed, the view didn't update, and the object continued spinning (separate issue, but still funny)

I take no credit for the observations, I still can't get in, someone else told me about it and I suggested things to test.

I Know some of that idle time we see is for the script time counter, and if it operates off of some type of cycle increment (which would make sense for dilation effects) it''d explain why it needs the constant poll, even when idle... I'm not sure how necessary the script time counter is (it may be what's used to time built in function delays), but if if it's not a necessity it'd be nice if it only ran when we set it up.
_____________________
|
| . "Cat-Like Typing Detected"
| . This post may contain errors in logic, spelling, and
| . grammar known to the SL populace to cause confusion
|
| - Please Use PHP tags when posting scripts/code, Thanks.
| - Can't See PHP or URL Tags Correctly? Check Out This Link...
| -
Meade Paravane
Hedgehog
Join date: 21 Nov 2006
Posts: 4,845
12-07-2009 13:43
From: Void Singer
it gets weirder, apparently it it not a matter of client side not getting updated, as it was tested with a second client that tp'd in AFTER the script was stopped, both see it stopped upon script removal though... but in yet another twist, when the second viewer was a linux client that happened to be on a different virtual desktop (so effectively minimized) while the script was being removed, the view didn't update, and the object continued spinning (separate issue, but still funny).

Hrm..

/me wonders if it's because TargetOmega isn't a prim property like color/size and, when you mod the object by changing its inventory, an object update happens and wipes out the old TargetOmega setting. That'd sorta explain the remove vs stop behavior. Sorta. I guess. Maybe.


/me tries to stear the thread back on track! Is it time to sum this up and send it to Babbage?
_____________________
Tired of shouting clubs and lucky chairs? Vote for llParcelSay!!!
- Go here: http://jira.secondlife.com/browse/SVC-1224
- If you see "if you were logged in.." on the left, click it and log in
- Click the "Vote for it" link on the left
Void Singer
Int vSelf = Sing(void);
Join date: 24 Sep 2005
Posts: 6,973
12-07-2009 14:29
From: Meade Paravane
Hrm..

/me wonders if it's because TargetOmega isn't a prim property like color/size and, when you mod the object by changing its inventory, an object update happens and wipes out the old TargetOmega setting. That'd sorta explain the remove vs stop behavior. Sorta. I guess. Maybe.

I knew there was something else that should've been tested... full object updates (should be workable with a second script and a llSetTextCall if anyone cares to test)

From: someone
/me tries to stear the thread back on track! Is it time to sum this up and send it to Babbage?

kick it, strip it, and ship it

(although the more that I think about it, that script time counter needs a look... it's gotta be responsible for at least some of that idle overhead, and I bet I'm on track with it counting by cycles and the possible ties to script delays)
_____________________
|
| . "Cat-Like Typing Detected"
| . This post may contain errors in logic, spelling, and
| . grammar known to the SL populace to cause confusion
|
| - Please Use PHP tags when posting scripts/code, Thanks.
| - Can't See PHP or URL Tags Correctly? Check Out This Link...
| -
Argent Stonecutter
Emergency Mustelid
Join date: 20 Sep 2005
Posts: 20,263
12-07-2009 14:36
From: Void Singer

(although the more that I think about it, that script time counter needs a look... it's gotta be responsible for at least some of that idle overhead, and I bet I'm on track with it counting by cycles and the possible ties to script delays)
What do you mean "counting by cycles"?
_____________________
Argent Stonecutter - http://globalcausalityviolation.blogspot.com/

"And now I'm going to show you something really cool."

Skyhook Station - http://xrl.us/skyhook23
Coonspiracy Store - http://xrl.us/coonstore
Void Singer
Int vSelf = Sing(void);
Join date: 24 Sep 2005
Posts: 6,973
12-07-2009 14:59
From: Argent Stonecutter
What do you mean "counting by cycles"?

er frames, I meant frames...

if the if the script time counter (which reports seconds) is only updated every X frames (when it's visited, I don't think a frame would be a whole second) it'd be an excellent mechanism for updating it that would account for both dilation effects on it, and part of the idle overhead. at least it seems sensible to my sleep deprived mind.
_____________________
|
| . "Cat-Like Typing Detected"
| . This post may contain errors in logic, spelling, and
| . grammar known to the SL populace to cause confusion
|
| - Please Use PHP tags when posting scripts/code, Thanks.
| - Can't See PHP or URL Tags Correctly? Check Out This Link...
| -
Argent Stonecutter
Emergency Mustelid
Join date: 20 Sep 2005
Posts: 20,263
12-07-2009 15:03
From: Void Singer
if the if the script time counter (which reports seconds) is only updated every X frames (when it's visited, I don't think a frame would be a whole second) it'd be an excellent mechanism for updating it that would account for both dilation effects on it, and part of the idle overhead. at least it seems sensible to my sleep deprived mind.
If what Lear's reporting is actually real, then I think just fixing the logic as I suggested (so that it only actually performs script time updates and related calculations on scripts that actually have pending events) would be more than enough improvement.
_____________________
Argent Stonecutter - http://globalcausalityviolation.blogspot.com/

"And now I'm going to show you something really cool."

Skyhook Station - http://xrl.us/skyhook23
Coonspiracy Store - http://xrl.us/coonstore
Tegg Bode
FrootLoop Roo Overlord
Join date: 12 Jan 2007
Posts: 5,707
12-07-2009 23:26
They could reduce the default plywood texture resolution I suppose.

Perhaps make standard floor/wall prim sets that are stored on everyones hard drives. Not to say you couldn't still use your own but the standard ones would rez instantly in comparison for common sizes like 1x1x.3, 2x2x.3,4x4x.3, 5x5x.3, 6x6x.3, 10x10x.3, 12x12x.3 or 20x20x.3. Custom prims would still be used for extras or odd pieces etc, but you could easily halve the download traffic on an average building. So all the server would have to say is "there is a part#523 at location (x,y,z) with it's orientation perhaps or just seperate part#'s for walls.

Perhaps delete & relink all the near identical duplicated "red brick wall" textures and such from the texture database.

Perhaps a simple one line command that tells a script to sleep unless an avatar is in the sim or within 50 metre's.

A simple way of making all the unselected faces of a prim/object to a default lowres texture at 1x1 repeat mapping.

Maybe a way to report all the objects on a parcel and their locations, to help cleanup un found junk in the sky/ground.
_____________________
Level 38 Builder [Roo Clan]

Free Waterside & Roadside Vehicle Rez Platform, Desire (88, 17, 107)

Avatars & Roadside Seaview shops and vendorspace for rent, $2.00/prim/week, Desire (175,48,107)
Johan Laurasia
Fully Rezzed
Join date: 31 Oct 2006
Posts: 1,394
12-08-2009 03:25
From: Jack Abraham

Uncap non-physical movement; think of the WarpPos code that will be saved.

Remove the flight ceiling. Thanks to Argent and others, it stops no one from going that high; ending the need for flight assists would probably save one script per avatar.


I'm not against upcapping the flight ceiling, but I doubt it will eliminate flight assists. I use the /flight fast, and /flight god modes in my multi-gadget all the time, and I wouldn't stop using it if the flight ceiling was removed. It would eliminate lesser flight assists that probably most people use, but saving 1 script per avie... I doubt it. While most avatars probably use some lame freebie flight assist that just breaks the ceiling, multi-gadget, along with mystic tool and a few others combined make up alot of multiple function devices that people use. Again, I'm for the ceiling cap being removed, but I doubt it would save all that much (although it would save some).


I think another issue here that hasn't really been touched on is resource management. ALOT of people in SL are total rank amateurs and write sloppy cpu intensive scripts without any thought of how efficient the script is. While I'm not off in a corner counting cpu ticks or studying the innards of the severs like Void and a few others do, I do try to write tight, efficient code with the least amount of scripts as possible. Take my clocks for example. I'm up to the 3rd generation. My originals had open listens on channel 0 all the time! Now, they have no listens at all unless a menu is present. Not only that, I've got a few ideas that will improve the efficiency still more, and the originals were written 3 years ago when I was a total scripter noob. So, novice scripters write sloppy code, and on top of that, there's script kiddies out there who cobble cow dung together by throwing dinky scripts together (i.e. a rotation script and a particle script and a running water sound script all tossed into a pool).

On that issue, I think what's definitely need is a script cost number similar to ARC. I mentioned this to Babbage 3 times at the last meeting I attended, and he either didn't catch the text (3 times???), or didn't like the idea, because he completely ignored my suggestion.

I think a script cost number would do leaps and bounds to get scripters to improve their efficiency. Down the road, when script limits are imposed, instead of a set number of scripts that can be ran by a specific avatar, a max script cost could be set. This would cause scripters to write tight code (and even advertise the script cost), that non-scripters buying objects could use to compare against similarly functioned products. The biggest thing that could blow script cost would be number of scripts used, followed by the amount of cpu load the active script produces. Hair resizers would disappear overnight because no one in their right mind would buy hair that costs THEM such a huge amount of their script allotment.
Void Singer
Int vSelf = Sing(void);
Join date: 24 Sep 2005
Posts: 6,973
12-08-2009 03:35
From: Argent Stonecutter
If what Lear's reporting is actually real, then I think just fixing the logic as I suggested (so that it only actually performs script time updates and related calculations on scripts that actually have pending events) would be more than enough improvement.

I'm thinking it's the root source (or one of them) of what he's seeing.. and if so it may not be correctable without more than a bit a bit of reworking, but it does fall within the same issue.

random thought:
physics can contribute greatly to general sim lag (not necessarily script lag), so should probably be looked at as part of the package of overall per user/sim limits.... currently I think they're only talking about script limits, but if all a parcels scripts are physics stuff, that may drag down a sim even inside the limits they are considering.
_____________________
|
| . "Cat-Like Typing Detected"
| . This post may contain errors in logic, spelling, and
| . grammar known to the SL populace to cause confusion
|
| - Please Use PHP tags when posting scripts/code, Thanks.
| - Can't See PHP or URL Tags Correctly? Check Out This Link...
| -
Argent Stonecutter
Emergency Mustelid
Join date: 20 Sep 2005
Posts: 20,263
12-08-2009 05:44
From: Johan Laurasia
I'm not against upcapping the flight ceiling, but I doubt it will eliminate flight assists. I use the /flight fast, and /flight god modes in my multi-gadget all the time, and I wouldn't stop using it if the flight ceiling was removed.
Flight Feather doesn't have any such modes... deliberately so. It would have been easy for me to add aggressive boost, but I chose to make it quiet and transparent to use and *non-laggy*.

If your flight script is listening on channel 0 for commands like "/flight" then it's far laggier than it should be. No matter how tight you think your code is, that open listen eats far more CPU than you'd waste by "sloppy" code, and you'd be better using a "lame freebie flight assist".
_____________________
Argent Stonecutter - http://globalcausalityviolation.blogspot.com/

"And now I'm going to show you something really cool."

Skyhook Station - http://xrl.us/skyhook23
Coonspiracy Store - http://xrl.us/coonstore
Lear Cale
wordy bugger
Join date: 22 Aug 2007
Posts: 3,569
12-08-2009 07:01
From: Argent Stonecutter
I can't see any way that event handling could have that effect. Sounds more to me like they're measuring the time it takes to instrument the script. Like they're making a system call for each script every frame, to see how much time it's taking, and that system call is taking 1-2 ms.

Eg:

Get clock time.
See if script needs to run, if so:
* Run it.
Get clock time.

Instead of:

See if script needs to run, if so:
* Get clock time.
* Run script.
* Get clock time.
I respectfully disagree. They SHOULD accout for the time it takes to figure out whether a script should be run, otherwise we wouldn't know the cost of these scripts. It just shouldn't take ANY time for scripts without listens.
Lear Cale
wordy bugger
Join date: 22 Aug 2007
Posts: 3,569
12-08-2009 07:16
From: Argent Stonecutter
If what Lear's reporting is actually real, then I think just fixing the logic as I suggested (so that it only actually performs script time updates and related calculations on scripts that actually have pending events) would be more than enough improvement.
Again, I disagree. My guess is that testing to see if a script needs to run is what's taking time, not measuring the time. If I'm right, it's a very good thing that it's measured -- we need to see that having scripts with nothing to do costs CPU time!

What they need to fix is the fact that scripts with nothing to do take most of the CPU time allocated for scripts!

How many times do I need to repeat that simple suggestion? I don't seem to be making my point because everyone seems to be missing it.

Here's the beef:

In a typical sim, most of the CPU time for scripts is used for scripts with nothing to do!

Get it? We're wasting CPU time doing nothing. So, FIX IT if at all possible.

Now, I have a strong suspicion that for listens, it's just not feasible. I remember someone saying that if they're not using a hash-based system for listens, they're morons, but I have never quite figured out a way to employ hashes that doesn't cause more problems than it solves. And I'm sure I'm missing some of the facts that would complicate it even more.

But most events should either be obviously pending or not, and the fact that ANY event is pending should be a single flag, or possibly queuing the script in a run queue. Yes, this adds script time, but only for those with events. Our problem is for those *without events*.

A carousel should be used for timers, if it's not already.
Viktoria Dovgal
Join date: 29 Jul 2007
Posts: 3,593
12-08-2009 07:44
Simon's comments in http://jira.secondlife.com/browse/SVC-3819 explain the times that are supposed to be included in top scripts vs. the total script time display. Scanning overhead isn't intended to be included in top scripts (it _is_ supposed to be in total script time), if additional time is being displayed it may be residue from this bug (which should be partially/mostly fixed now, if not yet perfect).
Argent Stonecutter
Emergency Mustelid
Join date: 20 Sep 2005
Posts: 20,263
12-08-2009 08:29
From: Lear Cale
Again, I disagree. My guess is that testing to see if a script needs to run is what's taking time, not measuring the time.
I can't see that taking two milliseconds. But more to the point, it is impossible to calculate the time taken by an operation (whether that is "testing to see if its to run" or "running the code" without making a system call.

And making a system call is at far more expensive than accessing main memory. You switch execution context, switch memory context, switch privilege context, validate the call and arguments (to avoid modern analogs of the old DEC-10 password bug), marshal the response, then go back through the context switch again. System call overhead is why real-time microkernels like QNX kick butt, and why people keep going back to microkernel designs (real ones, not jokes like Mach and Windows NT) despite their complexity.

According to benchmarks, the "read" system call (which basically does a memory to memory copy if the data is already in disk cache) overhead in Linux is about as expensive as copying an extra 100-150 bytes from memory to memory, for each call.

Accessing main memory on a GHz processor doesn't take milliseconds. If the memory is really slow, say "5-5-5-5", it'll take worst case 20 memory bus cycles, which adds up to maybe 1/20th of a µs if you have a slow memory bus. If you're following a linked list of prims, you're doing a link fetch and a table lookup that aren't cached, though with prefetch the table is probably going to be pulled in on the same lookup as the next prim link.



From: someone
What they need to fix is the fact that scripts with nothing to do take most of the CPU time allocated for scripts!
I'm not disagreeing with that, IF that's actually a real problem. I don't trust Top Scripts to tell me that. Have you rezzed 1000 objects on a quiet sim and seen long term script time jump by a couple of milliseconds?

What I'm saying that the problem, if it is a real problem, is not likely to be caused by checking if the script is ready to handle events, it's caused by the instrumentation itself. Just making ONE system call is EXPENSIVE. Putting a system call in a critical path (and that's what they're doing if the numbers returned by Top Scripts are real) is just plain bad design.

From: someone
So, FIX IT if at all possible.
I agree with this. I'm saying that you have no basis to assume that event handling is what needs to be fixed.
_____________________
Argent Stonecutter - http://globalcausalityviolation.blogspot.com/

"And now I'm going to show you something really cool."

Skyhook Station - http://xrl.us/skyhook23
Coonspiracy Store - http://xrl.us/coonstore
1 2 3 4 5