- Added json.removeFirst macro function, similar to json.difference() but will only remove the first occurrence of match. e.g. json.removeFirst('[2,2,4,5,6,6,4]', '[2,6]') = [2,4,5,6,4]
- Fix for trailing end of line character of version string in getInfo('client') macro function.
- Added a client id to getInfo. This will return the id of a client (an essentially randonmly generated id that can't be used to identify your ip etc). This is so macro writers can save settings per client in the campaign.
- Fix for parser error messages not being displayed nicely.

Also the following math functions have been added. While they have been tested they could stand to have more testing done, so please test them a bit more before relying on them

- math.abs -- Return the absolute (non negative) of of a value.
- math.ceil -- Return the nearest whole number, rounding up
- math.floor -- Return the nearest whole number, rounding down
- math.cos -- Return the cosine of an angle (angle in degrees)
- math.cos_r -- Return the cosine of an angle (angle in radians)
- math.sin -- Return the sine of an an angle (angle in degrees)
- math.sin_r -- Return the sine of an angle (angle in radians)
- math.tan -- Return the tangent of an angle (angle in degrees)
- math.tan_r -- Return the tangent of an angle (angle in radians)
- math.acos -- Return the inverse cosine of a ratio (returned angle is in degrees)
- math.acos_r -- Return the inverse cosine of a ratio (returned angle is in radians)
- math.asin -- Return the inverse sine of a ratio (returned angle is in degrees)
- math.asin_r -- Return the inverse sine of a ratio (returned angle is in radians)
- math.atan -- Return the inverse tangent of a ratio (returned angle is in degrees)
- math.atan_r -- Return the inverse tangent of a ratio (returned angle is in radians)
- math.atan2 -- A version of atan that takes 2 arguments instead of a ratio so that it can return angle based on signs of inputs (allowing you to determine quadrant). Return is in degrees
- math.atan2_r -- A version of atan that takes 2 arguments instead of a ratio so that it can return angle based on signs of inputs (allowing you to determine quadrant). Return is in radians
- math.cbrt, math.cuberoot -- Return the cube root of a number
- math.hypot, math.hypotenuse -- Return the hypotenuse (h = sqrt(a*a + b*b)) for the two sides passed in
- math.log -- Return the natural logarithm of a number
- math.log10 -- Return the base 10 logarithm of a number
- math.min -- Returns the minimum number from its arguments (2+ arguments)
- math.max -- Returns the maximum number from its arguments (2+ arguments)
- math.mod -- Returns the modulus of the arguments (remainder from the division)
- math.pow -- Returns the value of the first argument raised to the power of the second
- math.sqrt, math.squareroot -- Returns the square root of a number
- math.toRadians -- Converts an angle from degrees to radians
- math.toDegrees -- Converts an angle from radians to degrees
- math.pi -- Returns the value of PI, mmmmm pie...
- math.e -- Returns the mathematical constant e (base of natural logarithm)
- math.isOdd -- Returns 1 if the argument is odd, 0 if it is even
- math.isEven -- Returns 1 if the argument is even, 0 if it is odd
- math.isInt -- Returns 1 if the argument is an integer, 0 if it is not.