+/*
+ * This is now version 3 of the XLine subsystem, let's see if we can get it as nice and
+ * efficient as we can this time so we can close this file and never ever touch it again ..
+ *
+ * Background:
+ * Version 1 stored all line types in one list (one for g, one for z, etc). This was fine,
+ * but both version 1 and 2 suck at applying lines efficiently. That is, every time a new line
+ * was added, it iterated every existing line for every existing user. Ow. Expiry was also
+ * expensive, as the lists were NOT sorted.
+ *
+ * Version 2 moved permanent lines into a seperate list from non-permanent to help optimize
+ * matching speed, but matched in the same way.
+ * Expiry was also sped up by sorting the list by expiry (meaning just remove the items at the
+ * head of the list that are outdated.)
+ *
+ * This was fine and good, but it looked less than ideal in code, and matching was still slower
+ * than it could have been, something which we address here.
+ *
+ * VERSION 3:
+ * All lines are (as in v1) stored together -- no seperation of perm and non-perm. They are stored in
+ * a map of maps (first map is line type, second map is for quick lookup on add/delete/etc).
+ *
+ * Expiry is *no longer* performed on a timer, and no longer uses a sorted list of any variety. This
+ * is now done by only checking for expiry when a line is accessed, meaning that expiry is no longer
+ * a resource intensive problem.
+ *
+ * Application no longer tries to apply every single line on every single user - instead, now only lines
+ * added since the previous application are applied. This keeps S2S ADDLINE during burst nice and fast,
+ * while at the same time not slowing things the fuck down when we try adding a ban with lots of preexisting
+ * bans. :)
+ */