Old 06-01-2022, 09:56 AM   #1
Mavriq
Human being with feelings
 
Mavriq's Avatar
 
Join Date: Aug 2016
Location: Thunder Bay, Canada
Posts: 297
Default Mavriq Lua Batteries v0.1.0rc3 - Includes Mac Version

v0.1.0rc3 Update
I have finally gotten a mac version out. At the same time several modules are not working in any OS, most notably wxLua. It has been very problematic, and I'm not sure I can ever make it realiable. Anyway, look below for what is working on what OS's.

Details

Scripters have had difficulties using Lua modules with REAPER due to a variety of reasons. This project aims to fix that by making the most common and useful modules available in one package. It follows the approached used by the popular Lua Batteries package available on some platforms.

Some of the included features: Run any function from a dll/Dylib, Run Machine Language, secure networking, multiplatform wxWdigets for building GUIs and much more!

Currently is Windows and Mac. Will release linux versions in the future.

Using the Library

Install the package from ReaPack (see below)</br>
Include the following at the top of your script.

Code:
dofile( reaper.GetResourcePath() ..
   "/Scripts/Mavriq ReaScript Repository/Various/Mavriq-Lua-Batteries/batteries_header.lua")
You can then call the libraries via require statements: [font=monospace]require("socket.core")[/font]

Remember to Tip your Waiter!

This a massive undertaking and I've spends several weeks of full time work on this already. If you find this useful please donate. Thanks!

Documentation

There is documentation available for each included library under the doc folder in the Github release. On Reapack it is available via a separate package. There are also example test files for many under the tests folder.

Included Modules
Mavriq Library (Win/Mac)

Some utility functions for quickly printing tables and formatted strings to the console.

BinaryHeap (Win/Mac)

Binaryheap is an implementation of the Binary Heap to B-Tree sorting algorithm. Some common uses are for:
  • Priority Queues
  • Graph Algorithms: Dijkstra's shortest path, Prim's Minimum Spanning Tree
  • Solving: largest element in an array, Sort an array, Merge sorted arrays
  • Get min or max element
Cffi-lua (Win/Mac)


This allows all sorts of fun things from lua:
  • call any function from any library.
  • Execute C code on the fly
  • Execute Machine Code on the fly

One of the most powerful tools in Mavriq Lua Batteries. Besides examples in the cffi-lua docs you can look for cffi (python) and luajit ffi as they are very similar interfaces based on libffi.

Copas (Win)

Copas is a dispatcher based on coroutines that can be used for asynchronous networking. For example TCP or UDP based servers. But it also features timers and client support for http(s), ftp and smtp requests.

It uses LuaSocket as the interface with the TCP/IP stack and LuaSec for ssl support.

It has several high level duplicates of http(s), ftp, smtp functions from lusockets/luasec but are handled asynchronously.

It also makes creating network servers much easier buy handling the esoteric elements for you. Xavante uses copas to create its http server.

dkjson (Win/Mac)

This is a JSON module written in Lua. It supports UTF-8.

JSON (JavaScript Object Notation) is a format for serializing data based on the syntax for JavaScript data structures. It is an ideal format for transmitting data between different applications and commonly used for dynamic web pages. It can also be used to save Lua data structures, but you should be aware that not every Lua table can be represented by the JSON standard. For example tables that contain both string keys and an array part cannot be exactly represented by JSON. You can solve this by putting your array data in an explicit subtable.

dkjson is written in Lua without any dependencies, but when LPeg is available dkjson can use it to speed up decoding.

Lbase64 (Win/Mac)

Pure Lua base64 encoder/decoder.

Librs232 (Win/Mac)

Multiplatform library for serial communications over RS-232 (serial port). Great for things that are controlled via a com port.

Lpeg (Win/Mac)


LPeg is a new pattern-matching library for Lua, based on Parsing Expression Grammars (PEGs).

Lpeg expressions are much like regular expressions in their power. LPeg uses &quot;first-class&quot; patterns which allow better documentation (as it is easy to comment the code, to break complex definitions in smaller parts, etc.) and are extensible, as we can define new functions to create and compose patterns.

Lrexlib-pcre (Win/Mac)

Regular expression library on PCRE API.

Lua-curl (Win/Mac)

Provides curl like functions to lua. Fetch web pages, files etc. Post HTML forms, File uploads. Can do multiple files at once.

Lua-cjson (Win/Mac)

The Lua CJSON module provides JSON support for Lua.

Features
  • Fast, standards compliant encoding/parsing routines
  • Full support for JSON with UTF-8, including decoding surrogate pairs
  • Optional run-time support for common exceptions to the JSON specification (infinity, NaN,..)
  • No dependencies on other libraries
Caveats
  • UTF-16 and UTF-32 are not supported
Luaexpat

LuaExpat is a SAX XML parser based on the Expat library.


Luafilesystem (Win/Mac)

The missing file system functions for lua: chdir, currentdir, dir iterators, symlinks, mkdir, rmdir, file attributes, etc

Luafun (Win/Mac)

Lua Fun provides a set of more than 50 programming primitives typically found in languages like Standard ML, Haskell, Erlang, JavaScript, Python and even Lisp. High-order functions such as map, filter, reduce, zip, etc., make it easy to write simple and efficient functional code.

Lua-LXSH (Win/Mac)

LXSH is a collection of [lexers] lexing and [syntax highlighters] highlighting written in Lua using the excellent pattern-matching library LPeg. Several syntax's are currently supported: Lua, C, BibTeX and shell script. The syntax highlighters support three output formats: HTML html designed to be easily embedded in web pages, LaTeX latex which can be used to generate high quality PDF files and RTF rtf which can be used in graphical text editors like Microsoft Word and LibreOffice (formerly OpenOffice). Three predefined color schemes are included. Here are some examples of the supported input languages, output formats and color schemes:

Lua-Protobuffers (Win/Mac)

Protocol buffers are Google's language-neutral, platform-neutral, extensible mechanism for serializing structured data – think XML, but smaller, faster, and simpler. You define how you want your data to be structured once, then you can use special generated source code to easily write and read your structured data to and from a variety of data streams and using a variety of languages.

This project offers a C module manipulating Google's protobuf protocol, both for version 2 and 3 syntax and semantics. It splits to the lower-level and the high-level parts for different goals.

Luasec (Win/Mac)


LuaSec is a binding for OpenSSL library to provide TLS/SSL communication. It takes an already established TCP connection and creates a secure session between the peers. It builds upon Luasocket to deliver networking with security.

LuaSocket (Win/Mac)

LuaSocket is a Lua extension library that is composed by two parts: a C core that provides support for the TCP and UDP transport layers, and a set of Lua modules that add support for functionality commonly needed by applications that deal with the Internet.

The included lua modules are: SMTP, HTTP, FTP. Also there is MIME for common encodings, URL for url manipulation and LTN12 for filters, sinks, sources and pumps. LTN12 is particularly useful and a good description of its uses can be found on the lua-wiki. It can be very useful outside of networking when working with larger data.

Luasql (See Inline of OS Support)

LuaSQL is a simple interface from Lua to a DBMS. It enables a Lua program to:

Connect to ODBC (Win), ADO (Win), Oracle (Win/Mac), MySQL (Win/Mac), SQLite (Win/Mac), Firebird (Win) and PostgreSQL (Win/ databases;
Execute arbitrary SQL statements;
Retrieve results in a row-by-row cursor fashion.

If you need to connect to a db with lua, this is the one.

Features include:
  • Normalisation of broken down date objects
  • allows for complex time/date manipulation logic e.g. &quot;What day is it in 2 days, 5 hours from now?&quot;
  • [font=monospace]strftime[/font] style formatting
  • timezone arithmetic (linux only)
Lua-zip (Win/Mac)


A full service inflate/deflate library built on the libzip library.

Lustache (Win/Mac)

lustache is an implementation of the mustache template system in Lua. Takes a &quot;form/template&quot; and combines it with data. This &quot;form&quot; could be HTML, config files, source code or anything else that where you need to replace placeholders with data.

lyaml (Win)

LibYAML binding for Lua, with a fast C implementation for converting between %YAML 1.1 and Lua tables, and a low-level YAML event parser for implementing more intricate YAML document loading.

MD5 (Win/Mac)

This pure-Lua module computes md5 in Lua.

Middleclass (Win/Mac)

This library is for adding class like behavior to lua. There is not much documentation but a Wikipedia page has a reasonable overview.

Moses (Win/Mac)

Does everything but part the red sea. Massive utilities for tables are arrays. If you work with either, this has everything not includes by default in lua.

Penlight (Win/Mac)


This is a must have library for lua.
  • Tables and Arrays
  • Strings
  • Paths an Directories
  • Date and Time
  • Data
  • Functional Programming
  • Classes
  • Testing Framework

If you program in lua, you need to know this library.

Rings

Rings offers a single function which creates a new Lua state and returns an object representing it. The state which creates other states is called the master and the created ones are called slaves. The master can execute code in any of its slaves but each slave only has direct access to its master (or its own slaves).

All standard Lua libraries are opened automatically in a new state; other libraries have to be loaded explicitly.

The object representing a slave state has a method (dostring) which can execute Lua code in the corresponding state. This method can receive arguments (only numbers, strings, booleans and userdata, which are converted to lightuserdata) and always returns a boolean indicating whether the code executed correctly or not, followed by eventual return values or an error message.


Serpent (Win/Mac)

Lua serializer and pretty printer.

Features
  • Human readable:
    • Provides single-line and multi-line output.
    • Nested tables are properly indented in the multi-line output.
    • Numerical keys are listed first.
    • Keys are (optionally) sorted alphanumerically.
    • Array part skips keys ({'a', 'b'} instead of {[1] = 'a', [2] = 'b'}).
    • nil values are included when expected ({1, nil, 3} instead of {1, [3]=3}).
    • Keys use short notation ({foo = 'foo'} instead of {['foo'] = 'foo'}).
    • Shared references and self-references are marked in the output.
  • Machine readable: provides reliable deserialization using loadstring().
  • Supports deeply nested tables.
  • Supports tables with self-references.
  • Keeps shared tables and functions shared after de/serialization.
  • Supports function serialization using string.dump().
  • Supports serialization of global functions.
  • Supports __tostring and __serialize metamethods.
  • Escapes new-line \010 and end-of-file control \026 characters in strings.
  • Configurable with options and custom formatters.*
Stdlib (Win/Mac)


A large collection of useful functions. Many extend existing lua functions and other bring new Classes such a tree, container, object, list, optparse, set, and strbuf.

Timerwheel (Win/Mac)

Can create times that run a callback function when they expire.

Vstruct (Win/Mac)

A library for packing and unpacking binary data. If you've used lpack, struct, or the string.pack built into 5.3, you're already familiar with the concept. It's written in pure Lua and supports a variety of advanced features.
  • Signed and unsigned integers, strings (fixed-width, null-
    terminated, and length-prefixed), fixed and floating point values,
    bitmasks, and booleans.
  • Bit-packed versions of most of these (e.g. four 4-bit ints packed
    into 16 bits).
  • Arbitrary sizes, such as 24-bit ints or 128-bit bitfields; it's not
    limited to C types.
  • Big and little endian data.
  • Widechar strings.
  • Operations on both files and strings.
  • Written entirely in Lua; runs anywhere Lua 5.1 or 5.2 do, and has
    no external dependencies.

And vstruct's "killer feature":
  • Named fields and support for repetition and nested structs, allowing
    you to describe not just the format on disk of your data, but how it
    should be shaped once loaded into Lua.
wxLua



wxLua is a Lua wrapper for the cross-platform wxWidgets GUI library. It allows developers to create applications for Windows, macOS, and Linux using Lua. Unlike other cross-platform toolkits, wxWidgets (and by extension wxlua) gives applications a native look and feel as it uses the platform's native API rather than emulating the GUI.


Xavante (Win/Mac)

Xavante is a Lua HTTP 1.1 Web server that uses a modular architecture based on URI mapped handlers. Xavante currently offers a file handler, a redirect handler and a WSAPI handler. Those are used for general files, URI remapping and WSAPI applications respectively

ZipWriter (Win/Mac)

A library for working with Zip files.

Background

Reaper is missing exports of LUA C functions as it is built statically. As such things such as the luasockets library etc will not work. If loaded they will throw an error complaining of missing symbols when the library tries to access them.

It isn't practical to change how REAPER is built to address this. As such there are a couple of workarounds.

The first is to build lua in statically to each module. This is the approach used in Mavriq Lua Sockets. This works ok, but takes a lot of work to specifically craft each binary.

The second is to dynamically load the lua functions from the lua interpreter. Lua must be built as a dynamic library. To load it we use a call something like this:

Code:
assert(package.loadlib( "liblua.so","*"))
The module specified in the first argument must be the full path. The [font=monospace]*[/font] in the second argument tells lua to load the entire library and load it into the script space. You can call individual functions as well by specifying one there and the call will return the function:

Code:
fn = assert(package.loadlib( "liblua.so","some_function"))
Binaries

You can find builds under releases on GitHub, or you can install via ReaPack.

https://github.com/mavriq-dev/public...ster/index.xml

Last edited by Mavriq; 05-03-2023 at 08:34 AM.
Mavriq is offline   Reply With Quote
Old 06-01-2022, 11:43 AM   #2
BirdBird
Human being with feelings
 
BirdBird's Avatar
 
Join Date: Mar 2019
Posts: 425
Default

Awesome! Thank you for your work.
BirdBird is offline   Reply With Quote
Old 06-01-2022, 12:05 PM   #3
Mavriq
Human being with feelings
 
Mavriq's Avatar
 
Join Date: Aug 2016
Location: Thunder Bay, Canada
Posts: 297
Default

And you as well. Quite a few calls for you to be "scripter of the year".
Mavriq is offline   Reply With Quote
Old 06-01-2022, 12:10 PM   #4
Sexan
Human being with feelings
 
Sexan's Avatar
 
Join Date: Jun 2009
Location: Croatia
Posts: 4,595
Default

This is fantastic! Really great work!
Sexan is online now   Reply With Quote
Old 06-01-2022, 02:31 PM   #5
daniellumertz
Human being with feelings
 
daniellumertz's Avatar
 
Join Date: Dec 2017
Location: Brazil
Posts: 1,992
Default

Whuuut this is a bomb!!!

Reascripts LUA extension unlocked !!!
daniellumertz is offline   Reply With Quote
Old 06-01-2022, 04:30 PM   #6
X-Raym
Human being with feelings
 
X-Raym's Avatar
 
Join Date: Apr 2013
Location: France
Posts: 9,875
Default

I think you are years ahead everyone with all this advanced stuffs hah !


Well done !
X-Raym is offline   Reply With Quote
Old 06-01-2022, 07:17 PM   #7
Mavriq
Human being with feelings
 
Mavriq's Avatar
 
Join Date: Aug 2016
Location: Thunder Bay, Canada
Posts: 297
Default

Hopefully Windows was the hardest of the 3 platforms. LOTS of lua modules and the libraries they depended on are not easy to make work on that platform. FFI support was REALLY ugly to get working.

Also it's really an honor to have so many scripting greats giving thanks to little old me. I'm humbled. A huge thank you back as everything I've done is built on work others have done before me.

Last edited by Mavriq; 06-01-2022 at 07:23 PM.
Mavriq is offline   Reply With Quote
Old 06-02-2022, 02:41 AM   #8
amagalma
Human being with feelings
 
amagalma's Avatar
 
Join Date: Apr 2011
Posts: 3,451
Default

Thank you very much for this Mavriq! This is huge!!
__________________
Most of my scripts can be found in ReaPack.
If you find them useful, a donation would be greatly appreciated! Thank you! :)
amagalma is offline   Reply With Quote
Old 06-02-2022, 09:29 AM   #9
Rockum
Human being with feelings
 
Join Date: Apr 2009
Location: Nashville
Posts: 178
Default

When you say this took a lot of time and effort... I believe you. Wow, what a massive undertaking.
Rockum is online now   Reply With Quote
Old 06-02-2022, 09:57 AM   #10
Meo-Ada Mespotine
Human being with feelings
 
Meo-Ada Mespotine's Avatar
 
Join Date: May 2017
Location: Leipzig
Posts: 6,621
Default

And I thought, you only worked on networking support, but now you revealed your actual plan for Lua-worl-domination XD

Real nice work. Will test it, when you managed to finish support for Mac and Linux. I think, there's cool stuff that allows features that Ultraschall desperately needs
__________________
Use you/she/her.Ultraschall-Api Lua Api4Reaper - Donate, if you wish

On vacation for the time being...
Meo-Ada Mespotine is offline   Reply With Quote
Old 06-21-2022, 10:31 PM   #11
kartalex
Human being with feelings
 
Join Date: Dec 2015
Posts: 172
Default

Looks great!

So.. can we create a Reaper Script with wxWidgets?

Is there a template or little lesson?
kartalex is offline   Reply With Quote
Old 06-22-2022, 08:06 AM   #12
Mavriq
Human being with feelings
 
Mavriq's Avatar
 
Join Date: Aug 2016
Location: Thunder Bay, Canada
Posts: 297
Default

Yes. Windows only at this point.

There are a pile of examples under the tests folder. Also documentation for wxlua under the Docs directory.

https://github.com/pkulchenko/wxlua/.../docs/wxlua.md

FYI wxlua is maintained by the same individual that wrote Zerobrane Studio and Mobdebug.
Mavriq is offline   Reply With Quote
Old 10-14-2022, 03:49 AM   #13
Meo-Ada Mespotine
Human being with feelings
 
Meo-Ada Mespotine's Avatar
 
Join Date: May 2017
Location: Leipzig
Posts: 6,621
Default

Any news on Mac/Linux support?
__________________
Use you/she/her.Ultraschall-Api Lua Api4Reaper - Donate, if you wish

On vacation for the time being...
Meo-Ada Mespotine is offline   Reply With Quote
Old 01-21-2023, 12:21 PM   #14
krzysiek
Human being with feelings
 
Join Date: Jun 2019
Posts: 18
Default Not working on M1 MacBook Air

Hi there,
first of all thanks for the amazing work you've been doing. Access to these modules allowed me to write a script to connect with google api which is amazing.

I'm using it on Windows and it works nice. However, I think it is impossible to install on M1 mac... unless I'm doing somthing wrong. First I did it from Reapack->Synchronize packages. But then when I tried to run my script (which already runs on Widnows) I got compilation error "/Mavriq ReaScript Repository/Various/Mavriq-Lua-Batteries/bin/lua53.dll" no such file. So i checked and it was true. So I went to your github and downloaded the repo which had that file and just put it in there. Now it says that this file is "not a mach-o file". I also tried running your debigging script. It also doesn't run because it says that it needs your Lua-Sockets. Which I have installed. I checked your script and it seems that you're checking if there is a file called "core.lua" which is not present when you install from Reapack or on your Github repo.

Maybe I'm just missing something... If that is the case I'd really appriciate pointing me the right direction If it doesn't work on M1 mac I'll keep working on my script from a windows machine. Do you know if there are gonna be next versions of your integration?

Enjoy your day, Krzysiek.
krzysiek is offline   Reply With Quote
Old 02-19-2023, 08:11 PM   #15
dsyrock
Human being with feelings
 
dsyrock's Avatar
 
Join Date: Sep 2018
Location: China
Posts: 565
Default

Hi, can you give me some examples of lua culf? The codes I found in it's offcial github page can not run.
dsyrock is offline   Reply With Quote
Old 03-28-2023, 06:42 AM   #16
X-Raym
Human being with feelings
 
X-Raym's Avatar
 
Join Date: Apr 2013
Location: France
Posts: 9,875
Default

Hi,


Just experimenting,


It seems wx is stilling keyboard focus,





Here is my code snippet:
https://gist.github.com/X-Raym/21081...e1712ce4bdf5b0


Thx!
X-Raym is offline   Reply With Quote
Old 04-18-2023, 02:41 PM   #17
Rockum
Human being with feelings
 
Join Date: Apr 2009
Location: Nashville
Posts: 178
Default

Wow, X-Raym very cool. I think you just gave me a solution...
Rockum is online now   Reply With Quote
Old 04-18-2023, 03:07 PM   #18
X-Raym
Human being with feelings
 
X-Raym's Avatar
 
Join Date: Apr 2013
Location: France
Posts: 9,875
Default

@Rocksum
A solution ? but it doesnt work ^^
X-Raym is offline   Reply With Quote
Old 04-18-2023, 06:43 PM   #19
Rockum
Human being with feelings
 
Join Date: Apr 2009
Location: Nashville
Posts: 178
Default

Ah stealing focus... I still may have gotten an idea how to do something by using cells in my script.
Rockum is online now   Reply With Quote
Old 04-19-2023, 12:17 AM   #20
X-Raym
Human being with feelings
 
X-Raym's Avatar
 
Join Date: Apr 2013
Location: France
Posts: 9,875
Default

@Rocksum
You might consider reapy-boost for similar Python Library usage,
or building something with ReaImGui in Lua with columns layout and inputs 😉
X-Raym is offline   Reply With Quote
Old 04-19-2023, 01:21 AM   #21
Meo-Ada Mespotine
Human being with feelings
 
Meo-Ada Mespotine's Avatar
 
Join Date: May 2017
Location: Leipzig
Posts: 6,621
Default

Quote:
Originally Posted by krzysiek View Post
Hi there,
first of all thanks for the amazing work you've been doing. Access to these modules allowed me to write a script to connect with google api which is amazing.

I'm using it on Windows and it works nice. However, I think it is impossible to install on M1 mac... unless I'm doing somthing wrong. First I did it from Reapack->Synchronize packages. But then when I tried to run my script (which already runs on Widnows) I got compilation error "/Mavriq ReaScript Repository/Various/Mavriq-Lua-Batteries/bin/lua53.dll" no such file. So i checked and it was true. So I went to your github and downloaded the repo which had that file and just put it in there. Now it says that this file is "not a mach-o file". I also tried running your debigging script. It also doesn't run because it says that it needs your Lua-Sockets. Which I have installed. I checked your script and it seems that you're checking if there is a file called "core.lua" which is not present when you install from Reapack or on your Github repo.

Maybe I'm just missing something... If that is the case I'd really appriciate pointing me the right direction If it doesn't work on M1 mac I'll keep working on my script from a windows machine. Do you know if there are gonna be next versions of your integration?

Enjoy your day, Krzysiek.

Probably a little late, but it's Windows only...unfortunately...
__________________
Use you/she/her.Ultraschall-Api Lua Api4Reaper - Donate, if you wish

On vacation for the time being...
Meo-Ada Mespotine is offline   Reply With Quote
Old 04-19-2023, 03:30 PM   #22
daniellumertz
Human being with feelings
 
daniellumertz's Avatar
 
Join Date: Dec 2017
Location: Brazil
Posts: 1,992
Default

Quote:
Originally Posted by Meo-Ada Mespotine View Post
Probably a little late, but it's Windows only...unfortunately...
he was working in the mac version, if I remember correctly it was almost done, someone interested could try to fork his work, someday....

his luasockets for reaper are for all 3 os tho
daniellumertz is offline   Reply With Quote
Old 04-23-2023, 07:36 AM   #23
Mavriq
Human being with feelings
 
Mavriq's Avatar
 
Join Date: Aug 2016
Location: Thunder Bay, Canada
Posts: 297
Default

Sorry folks, I've been too busy to put much time into this lately. I had everything but wxLua working on mac. Since I see interest in having this out, I'll see what I can do to make it available via Reapack without it.

[Edit]

I have it building on mac except for wxLua, luaexpat, and luasec. Unfortunately, I no longer have a signing certificate from Apple... If I was coding regularly again I would buy a developer subscription, but I'm not. Won't install without jumping through hoops.

Last edited by Mavriq; 04-23-2023 at 08:15 AM.
Mavriq is offline   Reply With Quote
Old 05-02-2023, 05:05 PM   #24
Mavriq
Human being with feelings
 
Mavriq's Avatar
 
Join Date: Aug 2016
Location: Thunder Bay, Canada
Posts: 297
Default Version 0.1.0rc2 Out - Includes mac version.

See the top post for more details.
Mavriq is offline   Reply With Quote
Old 05-03-2023, 08:34 AM   #25
Mavriq
Human being with feelings
 
Mavriq's Avatar
 
Join Date: Aug 2016
Location: Thunder Bay, Canada
Posts: 297
Default Fixed issue on M1

Fixed an issue for M1 - Thanks, Cordila from Discord, for pointing it out!
Mavriq is offline   Reply With Quote
Old 06-04-2023, 08:33 AM   #26
odedd
Human being with feelings
 
Join Date: Dec 2019
Posts: 193
Default

That is really useful stuff!

Is it possible to use only one of the libraries and include them in a script of my own? If so, any ideas as to how it should be done?

Also, is it legitimate in terms of fair use? I would of course give credit where credit is due. I just don't want to make users download so many libraries for a just a small feature I'll be using.

It will be a free script, btw.
__________________
Stem Manager | Project Archiver
odedd is offline   Reply With Quote
Reply

Thread Tools
Display Modes

Posting Rules
You may not post new threads
You may not 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

Forum Jump


All times are GMT -7. The time now is 10:43 AM.


Powered by vBulletin® Version 3.8.11
Copyright ©2000 - 2024, vBulletin Solutions Inc.