Reorganized code

adein [02-10-15 - 23:54]
Reorganized code
Filename
RangeReticle.lua
RangeReticle.txt
RangeReticle.xml
libs/LibAddonMenu-2.0.txt
libs/LibAnimation-1.0/LibAnimation.lua
libs/UTF8/utf8.lua
libs/UTF8/utf8data.lua
rrSavedVarsDefaults.lua
diff --git a/RangeReticle.lua b/RangeReticle.lua
index 6a941a0..645b6b8 100755
--- a/RangeReticle.lua
+++ b/RangeReticle.lua
@@ -1,148 +1,99 @@
--- Load the addon menu library
-local LAM = LibStub("LibAddonMenu-2.0")
-local db
-local hostileOORColorHex, hostileIRColorHex, hostileIMRColorHex
-local alliesOORColorHex, alliesIRColorHex, alliesIMRColorHex
-local neutralOORColorHex, neutralIRColorHex, neutralIMRColorHex
-local npcsOORColorHex, npcsIRColorHex, npcsIMRColorHex
-local previousDimensionsX, previousDimensionsY
+-- Global Initalizations
+RR           = {}
+RR.addonName = 'RangeReticle'
+RR.version   = '0.6'

--- Defaults for settings
-local defaults = {
+-- Addon Setup
+function RR.Initialize(eventCode, addOnName)
+    if (addOnName ~= RR.addonName) then return end

-    hostileNameEnabled = true,
-    hostileLevelEnabled = true,
-    hostileRangeEnabled = true,
-	hostileDifficultyEnabled = true,
-    hostileReticleColoringEnabled = true,
-    hostileRangeColoringEnabled = true,
-    hostileNameLevelColoringEnabled = true,
-    hostileOutOfRangeEnabled = true,
-    hostileOORColor = {r=1, g=1, b=0},
-    hostileInRangeEnabled = true,
-    hostileInRangeDistance = 28,
-    hostileIRColor = {r=1, g=0.65, b=0},
-    hostileInMeleeRangeEnabled = true,
-    hostileInMeleeRangeDistance = 5,
-    hostileIMRColor = {r=1, g=0, b=0},
+    RR.LoadSettings()
+    RR.RegisterCommands()
+    --RR.CreateSettingsUI()
+    RR.RegisterEvents()

-    alliesNameEnabled = true,
-    alliesLevelEnabled = true,
-    alliesRangeEnabled = true,
-    alliesReticleColoringEnabled = true,
-    alliesRangeColoringEnabled = true,
-    alliesNameLevelColoringEnabled = true,
-    alliesOutOfRangeEnabled = true,
-    alliesOORColor = {r=0, g=1, b=1},
-    alliesInRangeEnabled = true,
-    alliesInRangeDistance = 28,
-    alliesIRColor = {r=0, g=0, b=1},
-    alliesInMeleeRangeEnabled = true,
-    alliesInMeleeRangeDistance = 5,
-    alliesIMRColor = {r=0, g=1, b=0},
+    EVENT_MANAGER:UnregisterForEvent(RR.addonName, EVENT_ADD_ON_LOADED)
+end

-    neutralNameEnabled = false,
-    neutralLevelEnabled = false,
-    neutralRangeEnabled = false,
-	neutralDifficultyEnabled = false,
-    neutralReticleColoringEnabled = false,
-    neutralRangeColoringEnabled = false,
-    neutralNameLevelColoringEnabled = false,
-    neutralOutOfRangeEnabled = false,
-    neutralOORColor = {r=1, g=1, b=0},
-    neutralInRangeEnabled = false,
-    neutralInRangeDistance = 28,
-    neutralIRColor = {r=1, g=0.65, b=0},
-    neutralInMeleeRangeEnabled = false,
-    neutralInMeleeRangeDistance = 5,
-    neutralIMRColor = {r=1, g=0, b=0},
+-- Load Addon Settings
+function RR.LoadSettings()
+    RR.SavedVars = ZO_SavedVars:NewAccountWide('RRSavedVariables' , 1, nil, RR.SavedVarsDefaults, nil)

-    npcsNameEnabled = false,
-    npcsLevelEnabled = false,
-    npcsRangeEnabled = false,
-    npcsReticleColoringEnabled = false,
-    npcsRangeColoringEnabled = false,
-    npcsNameLevelColoringEnabled = false,
-    npcsOutOfRangeEnabled = false,
-    npcsOORColor = {r=0, g=1, b=1},
-    npcsInRangeEnabled = false,
-    npcsInRangeDistance = 28,
-    npcsIRColor = {r=0, g=0, b=1},
-    npcsInMeleeRangeEnabled = false,
-    npcsInMeleeRangeDistance = 5,
-    npcsIMRColor = {r=0, g=1, b=0},
-}
+    RR.targetDebubInfo = false

--- Convert an RGB color percentage 0 to 1 to Hex
-local function RGBPercToHex(r, g, b)
-	r = r <= 1 and r >= 0 and r or 0
-	g = g <= 1 and g >= 0 and g or 0
-	b = b <= 1 and b >= 0 and b or 0
-	return string.format("%02x%02x%02x", r*255, g*255, b*255)
-end
+    -- Convert colors to hex
+    RR.hostileIRColorHex = RR.RGBPercToHex(RR.SavedVars.hostileOORColor.r,RR.SavedVars.hostileOORColor.g,RR.SavedVars.hostileOORColor.b)
+    RR.hostileOORColorHex = RR.RGBPercToHex(RR.SavedVars.hostileIRColor.r,RR.SavedVars.hostileIRColor.g,RR.SavedVars.hostileIRColor.b)
+    RR.hostileIMRColorHex = RR.RGBPercToHex(RR.SavedVars.hostileIMRColor.r,RR.SavedVars.hostileIMRColor.g,RR.SavedVars.hostileIMRColor.b)

-local function tprint(tbl, indent)
-  if not indent then indent = 0 end
-  for k, v in pairs(tbl) do
-    formatting = string.rep("  ", indent) .. k .. ": "
-    if type(v) == "table" then
-      CHAT_SYSTEM:AddMessage(formatting)
-      tprint(v, indent+1)
-    elseif type(v) == 'boolean' then
-      CHAT_SYSTEM:AddMessage(formatting .. tostring(v))
-    else
-      CHAT_SYSTEM:AddMessage(formatting .. tostring(v))
-    end
-  end
-end
+    RR.alliesIRColorHex = RR.RGBPercToHex(RR.SavedVars.alliesOORColor.r,RR.SavedVars.alliesOORColor.g,RR.SavedVars.alliesOORColor.b)
+    RR.alliesOORColorHex = RR.RGBPercToHex(RR.SavedVars.alliesIRColor.r,RR.SavedVars.alliesIRColor.g,RR.SavedVars.alliesIRColor.b)
+    RR.alliesIMRColorHex = RR.RGBPercToHex(RR.SavedVars.alliesIMRColor.r,RR.SavedVars.alliesIMRColor.g,RR.SavedVars.alliesIMRColor.b)

--- Setup the addon when it loads
-local function AddonSetup()
-	-- Populate the settings DB
-	Range_ReticleDB = Range_ReticleDB or {}
-	for k,v in pairs(defaults) do
-	    if type(Range_ReticleDB[k]) == "nil" then
-	        Range_ReticleDB[k] = v
-	    end
-	end
-	db = Range_ReticleDB
+    RR.neutralIRColorHex = RR.RGBPercToHex(RR.SavedVars.neutralOORColor.r,RR.SavedVars.neutralOORColor.g,RR.SavedVars.neutralOORColor.b)
+    RR.neutralOORColorHex = RR.RGBPercToHex(RR.SavedVars.neutralIRColor.r,RR.SavedVars.neutralIRColor.g,RR.SavedVars.neutralIRColor.b)
+    RR.neutralIMRColorHex = RR.RGBPercToHex(RR.SavedVars.neutralIMRColor.r,RR.SavedVars.neutralIMRColor.g,RR.SavedVars.neutralIMRColor.b)

-	-- Convert colors to hex
-    hostileIRColorHex = RGBPercToHex(db.hostileOORColor.r,db.hostileOORColor.g,db.hostileOORColor.b)
-    hostileOORColorHex = RGBPercToHex(db.hostileIRColor.r,db.hostileIRColor.g,db.hostileIRColor.b)
-    hostileIMRColorHex = RGBPercToHex(db.hostileIMRColor.r,db.hostileIMRColor.g,db.hostileIMRColor.b)
+    RR.npcsIRColorHex = RR.RGBPercToHex(RR.SavedVars.npcsOORColor.r,RR.SavedVars.npcsOORColor.g,RR.SavedVars.npcsOORColor.b)
+    RR.npcsOORColorHex = RR.RGBPercToHex(RR.SavedVars.npcsIRColor.r,RR.SavedVars.npcsIRColor.g,RR.SavedVars.npcsIRColor.b)
+    RR.npcsIMRColorHex = RR.RGBPercToHex(RR.SavedVars.npcsIMRColor.r,RR.SavedVars.npcsIMRColor.g,RR.SavedVars.npcsIMRColor.b)

-    alliesIRColorHex = RGBPercToHex(db.alliesOORColor.r,db.alliesOORColor.g,db.alliesOORColor.b)
-    alliesOORColorHex = RGBPercToHex(db.alliesIRColor.r,db.alliesIRColor.g,db.alliesIRColor.b)
-    alliesIMRColorHex = RGBPercToHex(db.alliesIMRColor.r,db.alliesIMRColor.g,db.alliesIMRColor.b)
+    RR.previousDimensionsX = 10000
+    RR.previousDimensionsY = 10000
+end

-    neutralIRColorHex = RGBPercToHex(db.neutralOORColor.r,db.neutralOORColor.g,db.neutralOORColor.b)
-    neutralOORColorHex = RGBPercToHex(db.neutralIRColor.r,db.neutralIRColor.g,db.neutralIRColor.b)
-    neutralIMRColorHex = RGBPercToHex(db.neutralIMRColor.r,db.neutralIMRColor.g,db.neutralIMRColor.b)
+-- Register slash commands
+function RR.RegisterCommands()
+  SLASH_COMMANDS['/rret'] = function(text)
+    if text == nil or string.len(text) <= 0 or text == 'help' then
+        d("RangeReticle Help:")
+        d("/rret : display help.")
+        d("/rret map : dump map debug information to chat")
+        d("rret dbg : toggle target debug info mode")
+    elseif text == 'map' then
+        RR.Debug()
+    elseif text == 'dbg' then
+        RR.targetDebubInfo = not RR.targetDebubInfo
+    end
+  end
+end

-    npcsIRColorHex = RGBPercToHex(db.npcsOORColor.r,db.npcsOORColor.g,db.npcsOORColor.b)
-    npcsOORColorHex = RGBPercToHex(db.npcsIRColor.r,db.npcsIRColor.g,db.npcsIRColor.b)
-    npcsIMRColorHex = RGBPercToHex(db.npcsIMRColor.r,db.npcsIMRColor.g,db.npcsIMRColor.b)
+-- Register for events
+function RR.RegisterEvents()
+    EVENT_MANAGER:RegisterForEvent(RR.addonName, EVENT_RETICLE_HIDDEN_UPDATE, RR.OnReticleHiddenUpdate)
+end

-    previousDimensionsX = 10000
-    previousDimensionsY = 10000
+-- Reticle hidden update
+function RR.OnReticleHiddenUpdate(event)
+    local reticleHidden = IsReticleHidden()
+    RangeReticleRange:SetHidden(reticleHidden)
+    RangeReticleName:SetHidden(reticleHidden)
+end

-	SLASH_COMMANDS["/rret"] = CommandHandler
+-- Convert an RGB color percentage 0 to 1 to Hex
+function RR.RGBPercToHex(r, g, b)
+    r = r <= 1 and r >= 0 and r or 0
+    g = g <= 1 and g >= 0 and g or 0
+    b = b <= 1 and b >= 0 and b or 0
+    return string.format("%02x%02x%02x", r*255, g*255, b*255)
 end

 -- Create the settings in the control panel
-local function CreateSettings()
+function RR.CreateSettingsUI()
+    RR.LAM = LibStub("LibAddonMenu-2.0")
+
     local panelData = {
         type = "panel",
-        name = "RangeReticle",
-        displayName = "RangeReticle",
+        name = RR.addonName,
+        displayName = RR.addonName .. " by Adein",
         author = "Adein",
-        version = "0.6",
-        slashCommand = "/rret",	--(optional) will register a keybind to open to this panel
+        version = RR.version,
         registerForRefresh = true,	--boolean (optional) (will refresh all options controls when a setting is changed and when the panel is shown)
         registerForDefaults = true,	--boolean (optional) (will set all options controls back to default values)
     }

+    RR.LAM:RegisterAddonPanel(RR.addonName, panelData)
+
     local optionsTable = {
         [1] = {
             type = "header",
@@ -158,76 +109,76 @@ local function CreateSettings()
                     type = "checkbox",
                     name = "Show Name",
                     tooltip = "If enabled, the target name is shown above the reticle",
-                    getFunc = function() return db.hostileNameEnabled end,
-                    setFunc = function() db.hostileNameEnabled = not db.hostileNameEnabled end,
+                    getFunc = function() return RR.SavedVars.hostileNameEnabled end,
+                    setFunc = function() RR.SavedVars.hostileNameEnabled = not RR.SavedVars.hostileNameEnabled end,
                     width = "half",	--or "half" (optional)
                 },
                 [2] = {
                     type = "checkbox",
                     name = "Show Level",
                     tooltip = "If enabled, the target level is shown above the reticle",
-                    getFunc = function() return db.hostileLevelEnabled end,
-                    setFunc = function() db.hostileLevelEnabled = not db.hostileLevelEnabled end,
+                    getFunc = function() return RR.SavedVars.hostileLevelEnabled end,
+                    setFunc = function() RR.SavedVars.hostileLevelEnabled = not RR.SavedVars.hostileLevelEnabled end,
                     width = "half",	--or "half" (optional)
                 },
                 [3] = {
                     type = "checkbox",
                     name = "Show Range",
                     tooltip = "If enabled, the target range is shown at the top-right of the reticle",
-                    getFunc = function() return db.hostileRangeEnabled end,
-                    setFunc = function() db.hostileRangeEnabled = not db.hostileRangeEnabled end,
+                    getFunc = function() return RR.SavedVars.hostileRangeEnabled end,
+                    setFunc = function() RR.SavedVars.hostileRangeEnabled = not RR.SavedVars.hostileRangeEnabled end,
                     width = "half",	--or "half" (optional)
                 },
                 [4] = {
                     type = "checkbox",
                     name = "Show Target Difficulty",
                     tooltip = "If enabled, the target difficulty is shown as *'s above the reticle",
-                    getFunc = function() return db.hostileDifficultyEnabled end,
-                    setFunc = function() db.hostileDifficultyEnabled = not db.hostileDifficultyEnabled end,
+                    getFunc = function() return RR.SavedVars.hostileDifficultyEnabled end,
+                    setFunc = function() RR.SavedVars.hostileDifficultyEnabled = not RR.SavedVars.hostileDifficultyEnabled end,
                     width = "half",	--or "half" (optional)
                 },
                 [5] = {
                     type = "checkbox",
                     name = "Colorize Reticle",
                     tooltip = "If enabled, the color of the target reticle is colorized to reflect range status",
-                    getFunc = function() return db.hostileReticleColoringEnabled end,
-                    setFunc = function() db.hostileReticleColoringEnabled = not db.hostileReticleColoringEnabled end,
+                    getFunc = function() return RR.SavedVars.hostileReticleColoringEnabled end,
+                    setFunc = function() RR.SavedVars.hostileReticleColoringEnabled = not RR.SavedVars.hostileReticleColoringEnabled end,
                     width = "half",	--or "half" (optional)
                 },
                 [6] = {
                     type = "checkbox",
                     name = "Colorize Range",
                     tooltip = "If enabled, the color of the target range is colorized to reflect range status",
-                    getFunc = function() return db.hostileRangeColoringEnabled end,
-                    setFunc = function() db.hostileRangeColoringEnabled = not db.hostileRangeColoringEnabled end,
+                    getFunc = function() return RR.SavedVars.hostileRangeColoringEnabled end,
+                    setFunc = function() RR.SavedVars.hostileRangeColoringEnabled = not RR.SavedVars.hostileRangeColoringEnabled end,
                     width = "half",	--or "half" (optional)
                 },
                 [7] = {
                     type = "checkbox",
                     name = "Colorize Name and Level",
                     tooltip = "If enabled, the color of the name and level is colorized to reflect range status",
-                    getFunc = function() return db.hostileNameLevelColoringEnabled end,
-                    setFunc = function() db.hostileNameLevelColoringEnabled = not db.hostileNameLevelColoringEnabled end,
+                    getFunc = function() return RR.SavedVars.hostileNameLevelColoringEnabled end,
+                    setFunc = function() RR.SavedVars.hostileNameLevelColoringEnabled = not RR.SavedVars.hostileNameLevelColoringEnabled end,
                     width = "half",	--or "half" (optional)
                 },
                 [8] = {
                     type = "checkbox",
                     name = "Out Of Range",
                     tooltip = "If enabled, the reticle color will change when the target is out of range",
-                    getFunc = function() return db.hostileOutOfRangeEnabled end,
-                    setFunc = function() db.hostileOutOfRangeEnabled = not db.hostileOutOfRangeEnabled end,
+                    getFunc = function() return RR.SavedVars.hostileOutOfRangeEnabled end,
+                    setFunc = function() RR.SavedVars.hostileOutOfRangeEnabled = not RR.SavedVars.hostileOutOfRangeEnabled end,
                     width = "half",	--or "half" (optional)
                 },
                 [9] = {
                     type = "colorpicker",
                     name = "Out Of Range Color",
                     tooltip = "The reticle color when the target is out of range",
-                    getFunc = function() return db.hostileOORColor.r, db.hostileOORColor.g, db.hostileOORColor.b end,
+                    getFunc = function() return RR.SavedVars.hostileOORColor.r, RR.SavedVars.hostileOORColor.g, RR.SavedVars.hostileOORColor.b end,
                     setFunc = function(r,g,b,a)
-                        db.hostileOORColor.r = r
-                        db.hostileOORColor.g = g
-                        db.hostileOORColor.b = b
-                        hostileOORColorHex = RGBPercToHex(r,g,b)
+                        RR.SavedVars.hostileOORColor.r = r
+                        RR.SavedVars.hostileOORColor.g = g
+                        RR.SavedVars.hostileOORColor.b = b
+                        hostileOORColorHex = RR.RGBPercToHex(r,g,b)
 				        end,
                     width = "half",	--or "half" (optional)
                 },
@@ -235,8 +186,8 @@ local function CreateSettings()
                     type = "checkbox",
                     name = "In Range",
                     tooltip = "If enabled, the reticle color will change when the target is in range",
-                    getFunc = function() return db.hostileInRangeEnabled end,
-                    setFunc = function() db.hostileInRangeEnabled = not db.hostileInRangeEnabled end,
+                    getFunc = function() return RR.SavedVars.hostileInRangeEnabled end,
+                    setFunc = function() RR.SavedVars.hostileInRangeEnabled = not RR.SavedVars.hostileInRangeEnabled end,
                     width = "half",	--or "half" (optional)
                 },
                 [11] = {
@@ -246,20 +197,20 @@ local function CreateSettings()
                     min = 0,
                     max = 60,
                     step = 1,	--(optional)
-                    getFunc = function() return db.hostileInRangeDistance end,
-                    setFunc = function(value) db.hostileInRangeDistance = value end,
+                    getFunc = function() return RR.SavedVars.hostileInRangeDistance end,
+                    setFunc = function(value) RR.SavedVars.hostileInRangeDistance = value end,
                     width = "half",	--or "half" (optional)
                 },
                 [12] = {
                     type = "colorpicker",
                     name = "In Range Color",
                     tooltip = "The reticle color when the target is in range",
-                    getFunc = function() return db.hostileIRColor.r, db.hostileIRColor.g, db.hostileIRColor.b end,
+                    getFunc = function() return RR.SavedVars.hostileIRColor.r, RR.SavedVars.hostileIRColor.g, RR.SavedVars.hostileIRColor.b end,
                     setFunc = function(r,g,b,a)
-                        db.hostileIRColor.r = r
-                        db.hostileIRColor.g = g
-                        db.hostileIRColor.b = b
-                        hostileIRColorHex = RGBPercToHex(r,g,b)
+                        RR.SavedVars.hostileIRColor.r = r
+                        RR.SavedVars.hostileIRColor.g = g
+                        RR.SavedVars.hostileIRColor.b = b
+                        hostileIRColorHex = RR.RGBPercToHex(r,g,b)
                         end,
                     width = "half",	--or "half" (optional)
                 },
@@ -267,8 +218,8 @@ local function CreateSettings()
                     type = "checkbox",
                     name = "In Melee Range",
                     tooltip = "If enabled, the reticle color will change when the target is in melee range",
-                    getFunc = function() return db.hostileInMeleeRangeEnabled end,
-                    setFunc = function() db.hostileInMeleeRangeEnabled = not db.hostileInMeleeRangeEnabled end,
+                    getFunc = function() return RR.SavedVars.hostileInMeleeRangeEnabled end,
+                    setFunc = function() RR.SavedVars.hostileInMeleeRangeEnabled = not RR.SavedVars.hostileInMeleeRangeEnabled end,
                     width = "half",	--or "half" (optional)
                 },
                 [14] = {
@@ -278,20 +229,20 @@ local function CreateSettings()
                     min = 0,
                     max = 60,
                     step = 1,	--(optional)
-                    getFunc = function() return db.hostileInMeleeRangeDistance end,
-                    setFunc = function(value) db.hostileInMeleeRangeDistance = value end,
+                    getFunc = function() return RR.SavedVars.hostileInMeleeRangeDistance end,
+                    setFunc = function(value) RR.SavedVars.hostileInMeleeRangeDistance = value end,
                     width = "half",	--or "half" (optional)
                 },
                 [15] = {
                     type = "colorpicker",
                     name = "In Melee Range Color",
                     tooltip = "The reticle color when the target is in melee range",
-                    getFunc = function() return db.hostileIMRColor.r, db.hostileIMRColor.g, db.hostileIMRColor.b end,
+                    getFunc = function() return RR.SavedVars.hostileIMRColor.r, RR.SavedVars.hostileIMRColor.g, RR.SavedVars.hostileIMRColor.b end,
                     setFunc = function(r,g,b,a)
-                        db.hostileIMRColor.r = r
-                        db.hostileIMRColor.g = g
-                        db.hostileIMRColor.b = b
-                        hostileIMRColorHex = RGBPercToHex(r,g,b)
+                        RR.SavedVars.hostileIMRColor.r = r
+                        RR.SavedVars.hostileIMRColor.g = g
+                        RR.SavedVars.hostileIMRColor.b = b
+                        hostileIMRColorHex = RR.RGBPercToHex(r,g,b)
                         end,
                     width = "half",	--or "half" (optional)
                 },
@@ -306,76 +257,76 @@ local function CreateSettings()
                     type = "checkbox",
                     name = "Show Name",
                     tooltip = "If enabled, the target name is shown above the reticle",
-                    getFunc = function() return db.alliesNameEnabled end,
-                    setFunc = function() db.alliesNameEnabled = not db.alliesNameEnabled end,
+                    getFunc = function() return RR.SavedVars.alliesNameEnabled end,
+                    setFunc = function() RR.SavedVars.alliesNameEnabled = not RR.SavedVars.alliesNameEnabled end,
                     width = "half",	--or "half" (optional)
                 },
                 [2] = {
                     type = "checkbox",
                     name = "Show Level",
                     tooltip = "If enabled, the target level is shown above the reticle",
-                    getFunc = function() return db.alliesLevelEnabled end,
-                    setFunc = function() db.alliesLevelEnabled = not db.alliesLevelEnabled end,
+                    getFunc = function() return RR.SavedVars.alliesLevelEnabled end,
+                    setFunc = function() RR.SavedVars.alliesLevelEnabled = not RR.SavedVars.alliesLevelEnabled end,
                     width = "half",	--or "half" (optional)
                 },
                 [3] = {
                     type = "checkbox",
                     name = "Show Range",
                     tooltip = "If enabled, the target range is shown at the top-right of the reticle",
-                    getFunc = function() return db.alliesRangeEnabled end,
-                    setFunc = function() db.alliesRangeEnabled = not db.alliesRangeEnabled end,
+                    getFunc = function() return RR.SavedVars.alliesRangeEnabled end,
+                    setFunc = function() RR.SavedVars.alliesRangeEnabled = not RR.SavedVars.alliesRangeEnabled end,
                     width = "half",	--or "half" (optional)
                 },
                 [4] = {
                     type = "checkbox",
                     name = "Show Target Difficulty",
                     tooltip = "If enabled, the target difficulty is shown as *'s above the reticle",
-                    getFunc = function() return db.alliesDifficultyEnabled end,
-                    setFunc = function() db.alliesDifficultyEnabled = not db.alliesDifficultyEnabled end,
+                    getFunc = function() return RR.SavedVars.alliesDifficultyEnabled end,
+                    setFunc = function() RR.SavedVars.alliesDifficultyEnabled = not RR.SavedVars.alliesDifficultyEnabled end,
                     width = "half",	--or "half" (optional)
                 },
                 [5] = {
                     type = "checkbox",
                     name = "Colorize Reticle",
                     tooltip = "If enabled, the color of the target reticle is colorized to reflect range status",
-                    getFunc = function() return db.alliesReticleColoringEnabled end,
-                    setFunc = function() db.alliesReticleColoringEnabled = not db.alliesReticleColoringEnabled end,
+                    getFunc = function() return RR.SavedVars.alliesReticleColoringEnabled end,
+                    setFunc = function() RR.SavedVars.alliesReticleColoringEnabled = not RR.SavedVars.alliesReticleColoringEnabled end,
                     width = "half",	--or "half" (optional)
                 },
                 [6] = {
                     type = "checkbox",
                     name = "Colorize Range",
                     tooltip = "If enabled, the color of the target range is colorized to reflect range status",
-                    getFunc = function() return db.alliesRangeColoringEnabled end,
-                    setFunc = function() db.alliesRangeColoringEnabled = not db.alliesRangeColoringEnabled end,
+                    getFunc = function() return RR.SavedVars.alliesRangeColoringEnabled end,
+                    setFunc = function() RR.SavedVars.alliesRangeColoringEnabled = not RR.SavedVars.alliesRangeColoringEnabled end,
                     width = "half",	--or "half" (optional)
                 },
                 [7] = {
                     type = "checkbox",
                     name = "Colorize Name and Level",
                     tooltip = "If enabled, the color of the name and level is colorized to reflect range status",
-                    getFunc = function() return db.alliesNameLevelColoringEnabled end,
-                    setFunc = function() db.alliesNameLevelColoringEnabled = not db.alliesNameLevelColoringEnabled end,
+                    getFunc = function() return RR.SavedVars.alliesNameLevelColoringEnabled end,
+                    setFunc = function() RR.SavedVars.alliesNameLevelColoringEnabled = not RR.SavedVars.alliesNameLevelColoringEnabled end,
                     width = "half",	--or "half" (optional)
                 },
                 [8] = {
                     type = "checkbox",
                     name = "Out Of Range",
                     tooltip = "If enabled, the reticle color will change when the target is out of range",
-                    getFunc = function() return db.alliesOutOfRangeEnabled end,
-                    setFunc = function() db.alliesOutOfRangeEnabled = not db.alliesOutOfRangeEnabled end,
+                    getFunc = function() return RR.SavedVars.alliesOutOfRangeEnabled end,
+                    setFunc = function() RR.SavedVars.alliesOutOfRangeEnabled = not RR.SavedVars.alliesOutOfRangeEnabled end,
                     width = "half",	--or "half" (optional)
                 },
                 [9] = {
                     type = "colorpicker",
                     name = "Out Of Range Color",
                     tooltip = "The reticle color when the target is out of range",
-                    getFunc = function() return db.alliesOORColor.r, db.alliesOORColor.g, db.alliesOORColor.b end,
+                    getFunc = function() return RR.SavedVars.alliesOORColor.r, RR.SavedVars.alliesOORColor.g, RR.SavedVars.alliesOORColor.b end,
                     setFunc = function(r,g,b,a)
-                        db.alliesOORColor.r = r
-                        db.alliesOORColor.g = g
-                        db.alliesOORColor.b = b
-                        alliesOORColorHex = RGBPercToHex(r,g,b)
+                        RR.SavedVars.alliesOORColor.r = r
+                        RR.SavedVars.alliesOORColor.g = g
+                        RR.SavedVars.alliesOORColor.b = b
+                        alliesOORColorHex = RR.RGBPercToHex(r,g,b)
 				        end,
                     width = "half",	--or "half" (optional)
                 },
@@ -383,8 +334,8 @@ local function CreateSettings()
                     type = "checkbox",
                     name = "In Range",
                     tooltip = "If enabled, the reticle color will change when the target is in range",
-                    getFunc = function() return db.alliesInRangeEnabled end,
-                    setFunc = function() db.alliesInRangeEnabled = not db.alliesInRangeEnabled end,
+                    getFunc = function() return RR.SavedVars.alliesInRangeEnabled end,
+                    setFunc = function() RR.SavedVars.alliesInRangeEnabled = not RR.SavedVars.alliesInRangeEnabled end,
                     width = "half",	--or "half" (optional)
                 },
                 [11] = {
@@ -394,20 +345,20 @@ local function CreateSettings()
                     min = 0,
                     max = 60,
                     step = 1,	--(optional)
-                    getFunc = function() return db.alliesInRangeDistance end,
-                    setFunc = function(value) db.alliesInRangeDistance = value end,
+                    getFunc = function() return RR.SavedVars.alliesInRangeDistance end,
+                    setFunc = function(value) RR.SavedVars.alliesInRangeDistance = value end,
                     width = "half",	--or "half" (optional)
                 },
                 [12] = {
                     type = "colorpicker",
                     name = "In Range Color",
                     tooltip = "The reticle color when the target is in range",
-                    getFunc = function() return db.alliesIRColor.r, db.alliesIRColor.g, db.alliesIRColor.b end,
+                    getFunc = function() return RR.SavedVars.alliesIRColor.r, RR.SavedVars.alliesIRColor.g, RR.SavedVars.alliesIRColor.b end,
                     setFunc = function(r,g,b,a)
-                        db.alliesIRColor.r = r
-                        db.alliesIRColor.g = g
-                        db.alliesIRColor.b = b
-                        alliesIRColorHex = RGBPercToHex(r,g,b)
+                        RR.SavedVars.alliesIRColor.r = r
+                        RR.SavedVars.alliesIRColor.g = g
+                        RR.SavedVars.alliesIRColor.b = b
+                        alliesIRColorHex = RR.RGBPercToHex(r,g,b)
                         end,
                     width = "half",	--or "half" (optional)
                 },
@@ -415,8 +366,8 @@ local function CreateSettings()
                     type = "checkbox",
                     name = "In Melee Range",
                     tooltip = "If enabled, the reticle color will change when the target is in melee range",
-                    getFunc = function() return db.alliesInMeleeRangeEnabled end,
-                    setFunc = function() db.alliesInMeleeRangeEnabled = not db.alliesInMeleeRangeEnabled end,
+                    getFunc = function() return RR.SavedVars.alliesInMeleeRangeEnabled end,
+                    setFunc = function() RR.SavedVars.alliesInMeleeRangeEnabled = not RR.SavedVars.alliesInMeleeRangeEnabled end,
                     width = "half",	--or "half" (optional)
                 },
                 [14] = {
@@ -426,20 +377,20 @@ local function CreateSettings()
                     min = 0,
                     max = 60,
                     step = 1,	--(optional)
-                    getFunc = function() return db.alliesInMeleeRangeDistance end,
-                    setFunc = function(value) db.alliesInMeleeRangeDistance = value end,
+                    getFunc = function() return RR.SavedVars.alliesInMeleeRangeDistance end,
+                    setFunc = function(value) RR.SavedVars.alliesInMeleeRangeDistance = value end,
                     width = "half",	--or "half" (optional)
                 },
                 [15] = {
                     type = "colorpicker",
                     name = "In Melee Range Color",
                     tooltip = "The reticle color when the target is in melee range",
-                    getFunc = function() return db.alliesIMRColor.r, db.alliesIMRColor.g, db.alliesIMRColor.b end,
+                    getFunc = function() return RR.SavedVars.alliesIMRColor.r, RR.SavedVars.alliesIMRColor.g, RR.SavedVars.alliesIMRColor.b end,
                     setFunc = function(r,g,b,a)
-                        db.alliesIMRColor.r = r
-                        db.alliesIMRColor.g = g
-                        db.alliesIMRColor.b = b
-                        alliesIMRColorHex = RGBPercToHex(r,g,b)
+                        RR.SavedVars.alliesIMRColor.r = r
+                        RR.SavedVars.alliesIMRColor.g = g
+                        RR.SavedVars.alliesIMRColor.b = b
+                        alliesIMRColorHex = RR.RGBPercToHex(r,g,b)
                         end,
                     width = "half",	--or "half" (optional)
                 },
@@ -454,76 +405,76 @@ local function CreateSettings()
                     type = "checkbox",
                     name = "Show Name",
                     tooltip = "If enabled, the target name is shown above the reticle",
-                    getFunc = function() return db.neutralNameEnabled end,
-                    setFunc = function() db.neutralNameEnabled = not db.neutralNameEnabled end,
+                    getFunc = function() return RR.SavedVars.neutralNameEnabled end,
+                    setFunc = function() RR.SavedVars.neutralNameEnabled = not RR.SavedVars.neutralNameEnabled end,
                     width = "half",	--or "half" (optional)
                 },
                 [2] = {
                     type = "checkbox",
                     name = "Show Level",
                     tooltip = "If enabled, the target level is shown above the reticle",
-                    getFunc = function() return db.neutralLevelEnabled end,
-                    setFunc = function() db.neutralLevelEnabled = not db.neutralLevelEnabled end,
+                    getFunc = function() return RR.SavedVars.neutralLevelEnabled end,
+                    setFunc = function() RR.SavedVars.neutralLevelEnabled = not RR.SavedVars.neutralLevelEnabled end,
                     width = "half",	--or "half" (optional)
                 },
                 [3] = {
                     type = "checkbox",
                     name = "Show Range",
                     tooltip = "If enabled, the target range is shown at the top-right of the reticle",
-                    getFunc = function() return db.neutralRangeEnabled end,
-                    setFunc = function() db.neutralRangeEnabled = not db.neutralRangeEnabled end,
+                    getFunc = function() return RR.SavedVars.neutralRangeEnabled end,
+                    setFunc = function() RR.SavedVars.neutralRangeEnabled = not RR.SavedVars.neutralRangeEnabled end,
                     width = "half",	--or "half" (optional)
                 },
                 [4] = {
                     type = "checkbox",
                     name = "Show Target Difficulty",
                     tooltip = "If enabled, the target difficulty is shown as *'s above the reticle",
-                    getFunc = function() return db.neutralDifficultyEnabled end,
-                    setFunc = function() db.neutralDifficultyEnabled = not db.neutralDifficultyEnabled end,
+                    getFunc = function() return RR.SavedVars.neutralDifficultyEnabled end,
+                    setFunc = function() RR.SavedVars.neutralDifficultyEnabled = not RR.SavedVars.neutralDifficultyEnabled end,
                     width = "half",	--or "half" (optional)
                 },
                 [5] = {
                     type = "checkbox",
                     name = "Colorize Reticle",
                     tooltip = "If enabled, the color of the target reticle is colorized to reflect range status",
-                    getFunc = function() return db.neutralReticleColoringEnabled end,
-                    setFunc = function() db.neutralReticleColoringEnabled = not db.neutralReticleColoringEnabled end,
+                    getFunc = function() return RR.SavedVars.neutralReticleColoringEnabled end,
+                    setFunc = function() RR.SavedVars.neutralReticleColoringEnabled = not RR.SavedVars.neutralReticleColoringEnabled end,
                     width = "half",	--or "half" (optional)
                 },
                 [6] = {
                     type = "checkbox",
                     name = "Colorize Range",
                     tooltip = "If enabled, the color of the target range is colorized to reflect range status",
-                    getFunc = function() return db.neutralRangeColoringEnabled end,
-                    setFunc = function() db.neutralRangeColoringEnabled = not db.neutralRangeColoringEnabled end,
+                    getFunc = function() return RR.SavedVars.neutralRangeColoringEnabled end,
+                    setFunc = function() RR.SavedVars.neutralRangeColoringEnabled = not RR.SavedVars.neutralRangeColoringEnabled end,
                     width = "half",	--or "half" (optional)
                 },
                 [7] = {
                     type = "checkbox",
                     name = "Colorize Name and Level",
                     tooltip = "If enabled, the color of the name and level is colorized to reflect range status",
-                    getFunc = function() return db.neutralNameLevelColoringEnabled end,
-                    setFunc = function() db.neutralNameLevelColoringEnabled = not db.neutralNameLevelColoringEnabled end,
+                    getFunc = function() return RR.SavedVars.neutralNameLevelColoringEnabled end,
+                    setFunc = function() RR.SavedVars.neutralNameLevelColoringEnabled = not RR.SavedVars.neutralNameLevelColoringEnabled end,
                     width = "half",	--or "half" (optional)
                 },
                 [8] = {
                     type = "checkbox",
                     name = "Out Of Range",
                     tooltip = "If enabled, the reticle color will change when the target is out of range",
-                    getFunc = function() return db.neutralOutOfRangeEnabled end,
-                    setFunc = function() db.neutralOutOfRangeEnabled = not db.neutralOutOfRangeEnabled end,
+                    getFunc = function() return RR.SavedVars.neutralOutOfRangeEnabled end,
+                    setFunc = function() RR.SavedVars.neutralOutOfRangeEnabled = not RR.SavedVars.neutralOutOfRangeEnabled end,
                     width = "half",	--or "half" (optional)
                 },
                 [9] = {
                     type = "colorpicker",
                     name = "Out Of Range Color",
                     tooltip = "The reticle color when the target is out of range",
-                    getFunc = function() return db.neutralOORColor.r, db.neutralOORColor.g, db.neutralOORColor.b end,
+                    getFunc = function() return RR.SavedVars.neutralOORColor.r, RR.SavedVars.neutralOORColor.g, RR.SavedVars.neutralOORColor.b end,
                     setFunc = function(r,g,b,a)
-                        db.neutralOORColor.r = r
-                        db.neutralOORColor.g = g
-                        db.neutralOORColor.b = b
-                        neutralOORColorHex = RGBPercToHex(r,g,b)
+                        RR.SavedVars.neutralOORColor.r = r
+                        RR.SavedVars.neutralOORColor.g = g
+                        RR.SavedVars.neutralOORColor.b = b
+                        neutralOORColorHex = RR.RGBPercToHex(r,g,b)
 				        end,
                     width = "half",	--or "half" (optional)
                 },
@@ -531,8 +482,8 @@ local function CreateSettings()
                     type = "checkbox",
                     name = "In Range",
                     tooltip = "If enabled, the reticle color will change when the target is in range",
-                    getFunc = function() return db.neutralInRangeEnabled end,
-                    setFunc = function() db.neutralInRangeEnabled = not db.neutralInRangeEnabled end,
+                    getFunc = function() return RR.SavedVars.neutralInRangeEnabled end,
+                    setFunc = function() RR.SavedVars.neutralInRangeEnabled = not RR.SavedVars.neutralInRangeEnabled end,
                     width = "half",	--or "half" (optional)
                 },
                 [11] = {
@@ -542,20 +493,20 @@ local function CreateSettings()
                     min = 0,
                     max = 60,
                     step = 1,	--(optional)
-                    getFunc = function() return db.neutralInRangeDistance end,
-                    setFunc = function(value) db.neutralInRangeDistance = value end,
+                    getFunc = function() return RR.SavedVars.neutralInRangeDistance end,
+                    setFunc = function(value) RR.SavedVars.neutralInRangeDistance = value end,
                     width = "half",	--or "half" (optional)
                 },
                 [12] = {
                     type = "colorpicker",
                     name = "In Range Color",
                     tooltip = "The reticle color when the target is in range",
-                    getFunc = function() return db.neutralIRColor.r, db.neutralIRColor.g, db.neutralIRColor.b end,
+                    getFunc = function() return RR.SavedVars.neutralIRColor.r, RR.SavedVars.neutralIRColor.g, RR.SavedVars.neutralIRColor.b end,
                     setFunc = function(r,g,b,a)
-                        db.neutralIRColor.r = r
-                        db.neutralIRColor.g = g
-                        db.neutralIRColor.b = b
-                        neutralIRColorHex = RGBPercToHex(r,g,b)
+                        RR.SavedVars.neutralIRColor.r = r
+                        RR.SavedVars.neutralIRColor.g = g
+                        RR.SavedVars.neutralIRColor.b = b
+                        neutralIRColorHex = RR.RGBPercToHex(r,g,b)
                         end,
                     width = "half",	--or "half" (optional)
                 },
@@ -563,8 +514,8 @@ local function CreateSettings()
                     type = "checkbox",
                     name = "In Melee Range",
                     tooltip = "If enabled, the reticle color will change when the target is in melee range",
-                    getFunc = function() return db.neutralInMeleeRangeEnabled end,
-                    setFunc = function() db.neutralInMeleeRangeEnabled = not db.neutralInMeleeRangeEnabled end,
+                    getFunc = function() return RR.SavedVars.neutralInMeleeRangeEnabled end,
+                    setFunc = function() RR.SavedVars.neutralInMeleeRangeEnabled = not RR.SavedVars.neutralInMeleeRangeEnabled end,
                     width = "half",	--or "half" (optional)
                 },
                 [14] = {
@@ -574,20 +525,20 @@ local function CreateSettings()
                     min = 0,
                     max = 60,
                     step = 1,	--(optional)
-                    getFunc = function() return db.neutralInMeleeRangeDistance end,
-                    setFunc = function(value) db.neutralInMeleeRangeDistance = value end,
+                    getFunc = function() return RR.SavedVars.neutralInMeleeRangeDistance end,
+                    setFunc = function(value) RR.SavedVars.neutralInMeleeRangeDistance = value end,
                     width = "half",	--or "half" (optional)
                 },
                 [15] = {
                     type = "colorpicker",
                     name = "In Melee Range Color",
                     tooltip = "The reticle color when the target is in melee range",
-                    getFunc = function() return db.neutralIMRColor.r, db.neutralIMRColor.g, db.neutralIMRColor.b end,
+                    getFunc = function() return RR.SavedVars.neutralIMRColor.r, RR.SavedVars.neutralIMRColor.g, RR.SavedVars.neutralIMRColor.b end,
                     setFunc = function(r,g,b,a)
-                        db.neutralIMRColor.r = r
-                        db.neutralIMRColor.g = g
-                        db.neutralIMRColor.b = b
-                        neutralIMRColorHex = RGBPercToHex(r,g,b)
+                        RR.SavedVars.neutralIMRColor.r = r
+                        RR.SavedVars.neutralIMRColor.g = g
+                        RR.SavedVars.neutralIMRColor.b = b
+                        neutralIMRColorHex = RR.RGBPercToHex(r,g,b)
                         end,
                     width = "half",	--or "half" (optional)
                 },
@@ -602,76 +553,76 @@ local function CreateSettings()
                     type = "checkbox",
                     name = "Show Name",
                     tooltip = "If enabled, the target name is shown above the reticle",
-                    getFunc = function() return db.npcsNameEnabled end,
-                    setFunc = function() db.npcsNameEnabled = not db.npcsNameEnabled end,
+                    getFunc = function() return RR.SavedVars.npcsNameEnabled end,
+                    setFunc = function() RR.SavedVars.npcsNameEnabled = not RR.SavedVars.npcsNameEnabled end,
                     width = "half",	--or "half" (optional)
                 },
                 [2] = {
                     type = "checkbox",
                     name = "Show Level",
                     tooltip = "If enabled, the target level is shown above the reticle",
-                    getFunc = function() return db.npcsLevelEnabled end,
-                    setFunc = function() db.npcsLevelEnabled = not db.npcsLevelEnabled end,
+                    getFunc = function() return RR.SavedVars.npcsLevelEnabled end,
+                    setFunc = function() RR.SavedVars.npcsLevelEnabled = not RR.SavedVars.npcsLevelEnabled end,
                     width = "half",	--or "half" (optional)
                 },
                 [3] = {
                     type = "checkbox",
                     name = "Show Range",
                     tooltip = "If enabled, the target range is shown at the top-right of the reticle",
-                    getFunc = function() return db.npcsRangeEnabled end,
-                    setFunc = function() db.npcsRangeEnabled = not db.npcsRangeEnabled end,
+                    getFunc = function() return RR.SavedVars.npcsRangeEnabled end,
+                    setFunc = function() RR.SavedVars.npcsRangeEnabled = not RR.SavedVars.npcsRangeEnabled end,
                     width = "half",	--or "half" (optional)
                 },
                 [4] = {
                     type = "checkbox",
                     name = "Show Target Difficulty",
                     tooltip = "If enabled, the target difficulty is shown as *'s above the reticle",
-                    getFunc = function() return db.npcsDifficultyEnabled end,
-                    setFunc = function() db.npcsDifficultyEnabled = not db.npcsDifficultyEnabled end,
+                    getFunc = function() return RR.SavedVars.npcsDifficultyEnabled end,
+                    setFunc = function() RR.SavedVars.npcsDifficultyEnabled = not RR.SavedVars.npcsDifficultyEnabled end,
                     width = "half",	--or "half" (optional)
                 },
                 [5] = {
                     type = "checkbox",
                     name = "Colorize Reticle",
                     tooltip = "If enabled, the color of the target reticle is colorized to reflect range status",
-                    getFunc = function() return db.npcsReticleColoringEnabled end,
-                    setFunc = function() db.npcsReticleColoringEnabled = not db.npcsReticleColoringEnabled end,
+                    getFunc = function() return RR.SavedVars.npcsReticleColoringEnabled end,
+                    setFunc = function() RR.SavedVars.npcsReticleColoringEnabled = not RR.SavedVars.npcsReticleColoringEnabled end,
                     width = "half",	--or "half" (optional)
                 },
                 [6] = {
                     type = "checkbox",
                     name = "Colorize Range",
                     tooltip = "If enabled, the color of the target range is colorized to reflect range status",
-                    getFunc = function() return db.npcsRangeColoringEnabled end,
-                    setFunc = function() db.npcsRangeColoringEnabled = not db.npcsRangeColoringEnabled end,
+                    getFunc = function() return RR.SavedVars.npcsRangeColoringEnabled end,
+                    setFunc = function() RR.SavedVars.npcsRangeColoringEnabled = not RR.SavedVars.npcsRangeColoringEnabled end,
                     width = "half",	--or "half" (optional)
                 },
                 [7] = {
                     type = "checkbox",
                     name = "Colorize Name and Level",
                     tooltip = "If enabled, the color of the name and level is colorized to reflect range status",
-                    getFunc = function() return db.npcsNameLevelColoringEnabled end,
-                    setFunc = function() db.npcsNameLevelColoringEnabled = not db.npcsNameLevelColoringEnabled end,
+                    getFunc = function() return RR.SavedVars.npcsNameLevelColoringEnabled end,
+                    setFunc = function() RR.SavedVars.npcsNameLevelColoringEnabled = not RR.SavedVars.npcsNameLevelColoringEnabled end,
                     width = "half",	--or "half" (optional)
                 },
                 [8] = {
                     type = "checkbox",
                     name = "Out Of Range",
                     tooltip = "If enabled, the reticle color will change when the target is out of range",
-                    getFunc = function() return db.npcsOutOfRangeEnabled end,
-                    setFunc = function() db.npcsOutOfRangeEnabled = not db.npcsOutOfRangeEnabled end,
+                    getFunc = function() return RR.SavedVars.npcsOutOfRangeEnabled end,
+                    setFunc = function() RR.SavedVars.npcsOutOfRangeEnabled = not RR.SavedVars.npcsOutOfRangeEnabled end,
                     width = "half",	--or "half" (optional)
                 },
                 [9] = {
                     type = "colorpicker",
                     name = "Out Of Range Color",
                     tooltip = "The reticle color when the target is out of range",
-                    getFunc = function() return db.npcsOORColor.r, db.npcsOORColor.g, db.npcsOORColor.b end,
+                    getFunc = function() return RR.SavedVars.npcsOORColor.r, RR.SavedVars.npcsOORColor.g, RR.SavedVars.npcsOORColor.b end,
                     setFunc = function(r,g,b,a)
-                        db.npcsOORColor.r = r
-                        db.npcsOORColor.g = g
-                        db.npcsOORColor.b = b
-                        npcsOORColorHex = RGBPercToHex(r,g,b)
+                        RR.SavedVars.npcsOORColor.r = r
+                        RR.SavedVars.npcsOORColor.g = g
+                        RR.SavedVars.npcsOORColor.b = b
+                        npcsOORColorHex = RR.RGBPercToHex(r,g,b)
 				        end,
                     width = "half",	--or "half" (optional)
                 },
@@ -679,8 +630,8 @@ local function CreateSettings()
                     type = "checkbox",
                     name = "In Range",
                     tooltip = "If enabled, the reticle color will change when the target is in range",
-                    getFunc = function() return db.npcsInRangeEnabled end,
-                    setFunc = function() db.npcsInRangeEnabled = not db.npcsInRangeEnabled end,
+                    getFunc = function() return RR.SavedVars.npcsInRangeEnabled end,
+                    setFunc = function() RR.SavedVars.npcsInRangeEnabled = not RR.SavedVars.npcsInRangeEnabled end,
                     width = "half",	--or "half" (optional)
                 },
                 [11] = {
@@ -690,20 +641,20 @@ local function CreateSettings()
                     min = 0,
                     max = 60,
                     step = 1,	--(optional)
-                    getFunc = function() return db.npcsInRangeDistance end,
-                    setFunc = function(value) db.npcsInRangeDistance = value end,
+                    getFunc = function() return RR.SavedVars.npcsInRangeDistance end,
+                    setFunc = function(value) RR.SavedVars.npcsInRangeDistance = value end,
                     width = "half",	--or "half" (optional)
                 },
                 [12] = {
                     type = "colorpicker",
                     name = "In Range Color",
                     tooltip = "The reticle color when the target is in range",
-                    getFunc = function() return db.npcsIRColor.r, db.npcsIRColor.g, db.npcsIRColor.b end,
+                    getFunc = function() return RR.SavedVars.npcsIRColor.r, RR.SavedVars.npcsIRColor.g, RR.SavedVars.npcsIRColor.b end,
                     setFunc = function(r,g,b,a)
-                        db.npcsIRColor.r = r
-                        db.npcsIRColor.g = g
-                        db.npcsIRColor.b = b
-                        npcsIRColorHex = RGBPercToHex(r,g,b)
+                        RR.SavedVars.npcsIRColor.r = r
+                        RR.SavedVars.npcsIRColor.g = g
+                        RR.SavedVars.npcsIRColor.b = b
+                        npcsIRColorHex = RR.RGBPercToHex(r,g,b)
                         end,
                     width = "half",	--or "half" (optional)
                 },
@@ -711,8 +662,8 @@ local function CreateSettings()
                     type = "checkbox",
                     name = "In Melee Range",
                     tooltip = "If enabled, the reticle color will change when the target is in melee range",
-                    getFunc = function() return db.npcsInMeleeRangeEnabled end,
-                    setFunc = function() db.npcsInMeleeRangeEnabled = not db.npcsInMeleeRangeEnabled end,
+                    getFunc = function() return RR.SavedVars.npcsInMeleeRangeEnabled end,
+                    setFunc = function() RR.SavedVars.npcsInMeleeRangeEnabled = not RR.SavedVars.npcsInMeleeRangeEnabled end,
                     width = "half",	--or "half" (optional)
                 },
                 [14] = {
@@ -722,20 +673,20 @@ local function CreateSettings()
                     min = 0,
                     max = 60,
                     step = 1,	--(optional)
-                    getFunc = function() return db.npcsInMeleeRangeDistance end,
-                    setFunc = function(value) db.npcsInMeleeRangeDistance = value end,
+                    getFunc = function() return RR.SavedVars.npcsInMeleeRangeDistance end,
+                    setFunc = function(value) RR.SavedVars.npcsInMeleeRangeDistance = value end,
                     width = "half",	--or "half" (optional)
                 },
                 [15] = {
                     type = "colorpicker",
                     name = "In Melee Range Color",
                     tooltip = "The reticle color when the target is in melee range",
-                    getFunc = function() return db.npcsIMRColor.r, db.npcsIMRColor.g, db.npcsIMRColor.b end,
+                    getFunc = function() return RR.SavedVars.npcsIMRColor.r, RR.SavedVars.npcsIMRColor.g, RR.SavedVars.npcsIMRColor.b end,
                     setFunc = function(r,g,b,a)
-                        db.npcsIMRColor.r = r
-                        db.npcsIMRColor.g = g
-                        db.npcsIMRColor.b = b
-                        npcsIMRColorHex = RGBPercToHex(r,g,b)
+                        RR.SavedVars.npcsIMRColor.r = r
+                        RR.SavedVars.npcsIMRColor.g = g
+                        RR.SavedVars.npcsIMRColor.b = b
+                        npcsIMRColorHex = RR.RGBPercToHex(r,g,b)
                         end,
                     width = "half",	--or "half" (optional)
                 },
@@ -743,11 +694,10 @@ local function CreateSettings()
         },
     }

-    LAM:RegisterAddonPanel("RangeReticle", panelData)
-    LAM:RegisterOptionControls("RangeReticle", optionsTable)
+    LAM:RegisterOptionControls(RR.addonName, optionsTable)
 end

-function GetColor(imrColor, irColor, oorColor, inMeleeRangeEnabled, inRangeEnabled, outOfRangeEnabled, targetInMeleeRange, targetInRange)
+function RR.GetColor(imrColor, irColor, oorColor, inMeleeRangeEnabled, inRangeEnabled, outOfRangeEnabled, targetInMeleeRange, targetInRange)
     local colorRed = 1
     local colorGreen = 1
     local colorBlue = 1
@@ -768,7 +718,7 @@ function GetColor(imrColor, irColor, oorColor, inMeleeRangeEnabled, inRangeEnabl
     return colorRed, colorGreen, colorBlue
 end

-function OnRangeUpdate()
+function RR.OnRangeUpdate()
     -- Determine if reticle is hidden
     local reticleHidden = IsReticleHidden()
     if reticleHidden then
@@ -781,6 +731,8 @@ function OnRangeUpdate()
     local targetClass = GetUnitClass('reticleover') -- TODO
     local targetRank, targetSubRank = GetUnitAvARank('reticleover') -- TODO
     local targetGrouped = IsUnitGrouped('reticleover') -- TODO
+    local targetX, targetY, targetH = GetMapPlayerPosition('reticleover')
+    local selfX, selfY, selfH = GetMapPlayerPosition('player')

     -- Local variables to store what needs to be done
     local nameEnabled = false
@@ -806,79 +758,85 @@ function OnRangeUpdate()

     -- Determine target type and if we need to do anything
     if targetReaction and targetName and string.len(targetName) > 0 then
+
+        if RR.targetDebubInfo then
+            d("Target X/Y/H: " .. tostring(targetX) .. ', ' .. tostring(targetY) .. ', ' .. tostring(targetH))
+            d("Self X/Y/H: " .. tostring(selfX) .. ', ' .. tostring(selfY) .. ', ' .. tostring(selfH))
+
+            d("Target Name: " .. tostring(targetName))
+            d("Target Reaction: " .. tostring(targetReaction))
+            d("Target Class: " .. tostring(targetClass))
+            d("Rank R/SR: " .. tostring(targetRank) .. ', ' .. tostring(targetSubRank))
+            d("Target Grouped: " .. tostring(targetGrouped))
+        end
+
 		if targetReaction == UNIT_REACTION_HOSTILE then
-            nameEnabled = db.hostileNameEnabled
-            levelEnabled = db.hostileLevelEnabled
-            rangeEnabled = db.hostileRangeEnabled
-			difficultyEnabled = db.hostileDifficultyEnabled
-            reticleColoringEnabled = db.hostileReticleColoringEnabled
-            rangeColoringEnabled = db.hostileRangeColoringEnabled
-            nameLevelColoringEnabled = db.hostileNameLevelColoringEnabled
-            outOfRangeEnabled = db.hostileOutOfRangeEnabled
-            inRangeEnabled = db.hostileInRangeEnabled
-            inMeleeRangeEnabled = db.hostileInMeleeRangeEnabled
-            oorColor = db.hostileOORColor
-            inRangeDistance = db.hostileInRangeDistance
-            irColor = db.hostileIRColor
-            inMeleeRangeDistance = db.hostileInMeleeRangeDistance
-            imrColor = db.hostileIMRColor
+            nameEnabled = RR.SavedVars.hostileNameEnabled
+            levelEnabled = RR.SavedVars.hostileLevelEnabled
+            rangeEnabled = RR.SavedVars.hostileRangeEnabled
+			difficultyEnabled = RR.SavedVars.hostileDifficultyEnabled
+            reticleColoringEnabled = RR.SavedVars.hostileReticleColoringEnabled
+            rangeColoringEnabled = RR.SavedVars.hostileRangeColoringEnabled
+            nameLevelColoringEnabled = RR.SavedVars.hostileNameLevelColoringEnabled
+            outOfRangeEnabled = RR.SavedVars.hostileOutOfRangeEnabled
+            inRangeEnabled = RR.SavedVars.hostileInRangeEnabled
+            inMeleeRangeEnabled = RR.SavedVars.hostileInMeleeRangeEnabled
+            oorColor = RR.SavedVars.hostileOORColor
+            inRangeDistance = RR.SavedVars.hostileInRangeDistance
+            irColor = RR.SavedVars.hostileIRColor
+            inMeleeRangeDistance = RR.SavedVars.hostileInMeleeRangeDistance
+            imrColor = RR.SavedVars.hostileIMRColor
         elseif targetReaction == UNIT_REACTION_PLAYER_ALLY then
-            nameEnabled = db.alliesNameEnabled
-            levelEnabled = db.alliesLevelEnabled
-            rangeEnabled = db.alliesRangeEnabled
-            reticleColoringEnabled = db.alliesReticleColoringEnabled
-            rangeColoringEnabled = db.alliesRangeColoringEnabled
-            nameLevelColoringEnabled = db.alliesNameLevelColoringEnabled
-            outOfRangeEnabled = db.alliesOutOfRangeEnabled
-            inRangeEnabled = db.alliesInRangeEnabled
-            inMeleeRangeEnabled = db.alliesInMeleeRangeEnabled
-            oorColor = db.alliesOORColor
-            inRangeDistance = db.alliesInRangeDistance
-            irColor = db.alliesIRColor
-            inMeleeRangeDistance = db.alliesInMeleeRangeDistance
-            imrColor = db.alliesIMRColor
+            nameEnabled = RR.SavedVars.alliesNameEnabled
+            levelEnabled = RR.SavedVars.alliesLevelEnabled
+            rangeEnabled = RR.SavedVars.alliesRangeEnabled
+            reticleColoringEnabled = RR.SavedVars.alliesReticleColoringEnabled
+            rangeColoringEnabled = RR.SavedVars.alliesRangeColoringEnabled
+            nameLevelColoringEnabled = RR.SavedVars.alliesNameLevelColoringEnabled
+            outOfRangeEnabled = RR.SavedVars.alliesOutOfRangeEnabled
+            inRangeEnabled = RR.SavedVars.alliesInRangeEnabled
+            inMeleeRangeEnabled = RR.SavedVars.alliesInMeleeRangeEnabled
+            oorColor = RR.SavedVars.alliesOORColor
+            inRangeDistance = RR.SavedVars.alliesInRangeDistance
+            irColor = RR.SavedVars.alliesIRColor
+            inMeleeRangeDistance = RR.SavedVars.alliesInMeleeRangeDistance
+            imrColor = RR.SavedVars.alliesIMRColor
         elseif targetReaction == UNIT_REACTION_NEUTRAL then
-            nameEnabled = db.neutralNameEnabled
-            levelEnabled = db.neutralLevelEnabled
-            rangeEnabled = db.neutralRangeEnabled
-			difficultyEnabled = db.neutralDifficultyEnabled
-            reticleColoringEnabled = db.neutralReticleColoringEnabled
-            rangeColoringEnabled = db.neutralRangeColoringEnabled
-            nameLevelColoringEnabled = db.neutralNameLevelColoringEnabled
-            outOfRangeEnabled = db.neutralOutOfRangeEnabled
-            inRangeEnabled = db.neutralInRangeEnabled
-            inMeleeRangeEnabled = db.neutralInMeleeRangeEnabled
-            oorColor = db.neutralOORColor
-            inRangeDistance = db.neutralInRangeDistance
-            irColor = db.neutralIRColor
-            inMeleeRangeDistance = db.neutralInMeleeRangeDistance
-            imrColor = db.neutralIMRColor
+            nameEnabled = RR.SavedVars.neutralNameEnabled
+            levelEnabled = RR.SavedVars.neutralLevelEnabled
+            rangeEnabled = RR.SavedVars.neutralRangeEnabled
+			difficultyEnabled = RR.SavedVars.neutralDifficultyEnabled
+            reticleColoringEnabled = RR.SavedVars.neutralReticleColoringEnabled
+            rangeColoringEnabled = RR.SavedVars.neutralRangeColoringEnabled
+            nameLevelColoringEnabled = RR.SavedVars.neutralNameLevelColoringEnabled
+            outOfRangeEnabled = RR.SavedVars.neutralOutOfRangeEnabled
+            inRangeEnabled = RR.SavedVars.neutralInRangeEnabled
+            inMeleeRangeEnabled = RR.SavedVars.neutralInMeleeRangeEnabled
+            oorColor = RR.SavedVars.neutralOORColor
+            inRangeDistance = RR.SavedVars.neutralInRangeDistance
+            irColor = RR.SavedVars.neutralIRColor
+            inMeleeRangeDistance = RR.SavedVars.neutralInMeleeRangeDistance
+            imrColor = RR.SavedVars.neutralIMRColor
         elseif targetReaction == UNIT_REACTION_NPC_ALLY or UNIT_REACTION_FRIENDLY then
-            nameEnabled = db.npcsNameEnabled
-            levelEnabled = db.npcsLevelEnabled
-            rangeEnabled = db.npcsRangeEnabled
-            reticleColoringEnabled = db.npcsReticleColoringEnabled
-            rangeColoringEnabled = db.npcsRangeColoringEnabled
-            nameLevelColoringEnabled = db.npcsNameLevelColoringEnabled
-            outOfRangeEnabled = db.npcsOutOfRangeEnabled
-            inRangeEnabled = db.npcsInRangeEnabled
-            inMeleeRangeEnabled = db.npcsInMeleeRangeEnabled
-            oorColor = db.npcsOORColor
-            inRangeDistance = db.npcsInRangeDistance
-            irColor = db.npcsIRColor
-            inMeleeRangeDistance = db.npcsInMeleeRangeDistance
-            imrColor = db.npcsIMRColor
+            nameEnabled = RR.SavedVars.npcsNameEnabled
+            levelEnabled = RR.SavedVars.npcsLevelEnabled
+            rangeEnabled = RR.SavedVars.npcsRangeEnabled
+            reticleColoringEnabled = RR.SavedVars.npcsReticleColoringEnabled
+            rangeColoringEnabled = RR.SavedVars.npcsRangeColoringEnabled
+            nameLevelColoringEnabled = RR.SavedVars.npcsNameLevelColoringEnabled
+            outOfRangeEnabled = RR.SavedVars.npcsOutOfRangeEnabled
+            inRangeEnabled = RR.SavedVars.npcsInRangeEnabled
+            inMeleeRangeEnabled = RR.SavedVars.npcsInMeleeRangeEnabled
+            oorColor = RR.SavedVars.npcsOORColor
+            inRangeDistance = RR.SavedVars.npcsInRangeDistance
+            irColor = RR.SavedVars.npcsIRColor
+            inMeleeRangeDistance = RR.SavedVars.npcsInMeleeRangeDistance
+            imrColor = RR.SavedVars.npcsIMRColor
         end
     end

     RangeReticleRange:SetText('')
     if rangeEnabled or nameLevelColoringEnabled or reticleColoringEnabled then
-        -- Get details of what's under the reticle
-        local targetX, targetY, targetH = GetMapPlayerPosition('reticleover')
-
-        -- Get details of the player
-        local selfX, selfY, selfH = GetMapPlayerPosition('player')
-
         -- Get map details
         local mapType = GetMapType()
         local mapContentType = GetMapContentType()
@@ -945,8 +903,8 @@ function OnRangeUpdate()
                 RangeReticleRange:SetText(tostring(distance) .. 'm')
             elseif rangeEnabled then
             	RangeReticleRange:SetText('e')
-            	--CHAT_SYSTEM:AddMessage("Dimensions: " .. tostring(dimensionsX) .. ', ' .. tostring(dimensionsY))
-            	--CHAT_SYSTEM:AddMessage("Multiplier: " .. tostring(multiplier))
+            	--d("Dimensions: " .. tostring(dimensionsX) .. ', ' .. tostring(dimensionsY))
+            	--d("Multiplier: " .. tostring(multiplier))
             end
         end
     end
@@ -985,7 +943,7 @@ function OnRangeUpdate()
         local colorGreen = 1
         local colorBlue = 1
         if nameLevelColoringEnabled then
-            colorRed, colorGreen, colorBlue = GetColor(imrColor, irColor, oorColor, inMeleeRangeEnabled, inRangeEnabled, outOfRangeEnabled, targetInMeleeRange, targetInRange)
+            colorRed, colorGreen, colorBlue = RR.GetColor(imrColor, irColor, oorColor, inMeleeRangeEnabled, inRangeEnabled, outOfRangeEnabled, targetInMeleeRange, targetInRange)
         end
 	    RangeReticleName:SetColor(colorRed, colorGreen, colorBlue)

@@ -993,7 +951,7 @@ function OnRangeUpdate()
         colorGreen = 1
         colorBlue = 1
         if reticleColoringEnabled then
-            colorRed, colorGreen, colorBlue = GetColor(imrColor, irColor, oorColor, inMeleeRangeEnabled, inRangeEnabled, outOfRangeEnabled, targetInMeleeRange, targetInRange)
+            colorRed, colorGreen, colorBlue = RR.GetColor(imrColor, irColor, oorColor, inMeleeRangeEnabled, inRangeEnabled, outOfRangeEnabled, targetInMeleeRange, targetInRange)
         end
         -- Set reticle color
         ZO_ReticleContainerReticle:SetColor(colorRed, colorGreen, colorBlue)
@@ -1004,7 +962,7 @@ function OnRangeUpdate()
         colorGreen = 1
         colorBlue = 1
         if rangeColoringEnabled then
-            colorRed, colorGreen, colorBlue = GetColor(imrColor, irColor, oorColor, inMeleeRangeEnabled, inRangeEnabled, outOfRangeEnabled, targetInMeleeRange, targetInRange)
+            colorRed, colorGreen, colorBlue = RR.GetColor(imrColor, irColor, oorColor, inMeleeRangeEnabled, inRangeEnabled, outOfRangeEnabled, targetInMeleeRange, targetInRange)
         end
         RangeReticleRange:SetColor(colorRed, colorGreen, colorBlue)
     else
@@ -1017,19 +975,8 @@ function OnRangeUpdate()
     end
 end

--- Slash command handlers
-local function CommandHandler(text)
-	-- Display help
-	if text == nil or string.len(text) <= 0 or string.lower(text) == "help" then
-		ChatMessage("RangeReticle Help:")
-		ChatMessage("/rret : display help.")
-		ChatMessage("/rret dbg : dump debug information to chat")
-    elseif text ~= nil and string.lower(text) == "dbg" then
-	end
-end
-
 -- Debug info to chat window
-local function Debug()
+function RR.Debug()
     -- Get details of what's under the reticle
     local targetX, targetY, targetH = GetMapPlayerPosition('reticleover')

@@ -1045,6 +992,13 @@ local function Debug()
     local mapCurrentFloor, mapNumFloors =  GetMapFloorInfo()
     local mapName = GetMapName()

+    -- Get target details
+    local targetReaction = GetUnitReaction('reticleover')
+    local targetName = GetUnitName('reticleover')
+    local targetClass = GetUnitClass('reticleover') -- TODO
+    local targetRank, targetSubRank = GetUnitAvARank('reticleover') -- TODO
+    local targetGrouped = IsUnitGrouped('reticleover') -- TODO
+
     --MAPTYPE_NONE: 0
     --MAPTYPE_SUBZONE: 1
     --MAPTYPE_ZONE: 2
@@ -1056,34 +1010,18 @@ local function Debug()
     --MAP_CONTENT_AVA: 1
     --MAP_CONTENT_DUNGEON: 2

-    CHAT_SYSTEM:AddMessage("Map Index: " .. tostring(mapIndex))
-    CHAT_SYSTEM:AddMessage("Map Zone Index: " .. tostring(mapZoneIndex))
-    CHAT_SYSTEM:AddMessage("Map W/H: " .. tostring(mapWidth) .. ', ' .. tostring(mapHeight))
-    CHAT_SYSTEM:AddMessage("Map Type: " .. tostring(mapType))
-    CHAT_SYSTEM:AddMessage("Map Content Type: " .. tostring(mapContentType))
-    CHAT_SYSTEM:AddMessage("Floor Cur/Num: " .. tostring(mapCurrentFloor) .. ', ' .. tostring(mapNumFloors))
-    CHAT_SYSTEM:AddMessage("Map Name: " .. tostring(mapName))
-    CHAT_SYSTEM:AddMessage("Target X/Y/H: " .. tostring(targetX) .. ', ' .. tostring(targetY) .. ', ' .. tostring(targetH))
-    CHAT_SYSTEM:AddMessage("Target X/Y/H: " .. tostring(selfX) .. ', ' .. tostring(selfY) .. ', ' .. tostring(selfH))
-
+    d("Map Index: " .. tostring(mapIndex))
+    d("Map Zone Index: " .. tostring(mapZoneIndex))
+    d("Map W/H: " .. tostring(mapWidth) .. ', ' .. tostring(mapHeight))
+    d("Map Type: " .. tostring(mapType))
+    d("Map Content Type: " .. tostring(mapContentType))
+    d("Floor Cur/Num: " .. tostring(mapCurrentFloor) .. ', ' .. tostring(mapNumFloors))
+    d("Map Name: " .. tostring(mapName))
     local dimensionsX, dimensionsY = ZO_WorldMapContainer:GetDimensions()
-    CHAT_SYSTEM:AddMessage("WMDimensions: " .. tostring(dimensionsX) .. ', ' .. tostring(dimensionsY))
+    d("WMDimensions: " .. tostring(dimensionsX) .. ', ' .. tostring(dimensionsY))
     local dimensionsX1, dimensionsY1 = ZO_WorldMapContainer1:GetDimensions()
-    CHAT_SYSTEM:AddMessage("1Dimensions: " .. tostring(dimensionsX1) .. ', ' .. tostring(dimensionsY1))
+    d("1Dimensions: " .. tostring(dimensionsX1) .. ', ' .. tostring(dimensionsY1))
 end

--- Reticle hidden update
-local function OnReticleHiddenUpdate(event)
-    local reticleHidden = IsReticleHidden()
-    RangeReticleRange:SetHidden(reticleHidden)
-	RangeReticleName:SetHidden(reticleHidden)
-end

--- Register event callbacks
-EVENT_MANAGER:RegisterForEvent("RangeReticleHidden", EVENT_RETICLE_HIDDEN_UPDATE, OnReticleHiddenUpdate)
-EVENT_MANAGER:RegisterForEvent("RangeReticleLoaded", EVENT_ADD_ON_LOADED, function(event, addon)
-		if addon == "RangeReticle" then
-			AddonSetup()
-			CreateSettings()
-		end
-	end)
+EVENT_MANAGER:RegisterForEvent(RR.addonName, EVENT_ADD_ON_LOADED , RR.Initialize)
diff --git a/RangeReticle.txt b/RangeReticle.txt
index f4e3ed0..beb3704 100755
--- a/RangeReticle.txt
+++ b/RangeReticle.txt
@@ -1,12 +1,26 @@
-## Title: Range Reticle - by Adein
-## APIVersion: 100005
-## Version: @project-version@
+## Title: RangeReticle
+## APIVersion: 100010
+## Version: 0.6
 ## Author: Adein
-## OptionalDependsOn: LibAddonMenu-2.0
-## SavedVariables: Range_ReticleDB
+## OptionalDependsOn: LibAddonMenu-2.0, LibStub
+## SavedVariables: RRSavedVariables

-libs\LibStub\LibStub.lua
+## Libraries:
+Libs\LibStub\LibStub.lua
 libs\LibAddonMenu-2.0\LibAddonMenu-2.0.lua
+libs\LibAddonMenu-2.0\controls\panel.lua
+libs\LibAddonMenu-2.0\controls\submenu.lua
+libs\LibAddonMenu-2.0\controls\button.lua
+libs\LibAddonMenu-2.0\controls\checkbox.lua
+libs\LibAddonMenu-2.0\controls\colorpicker.lua
+libs\LibAddonMenu-2.0\controls\custom.lua
+libs\LibAddonMenu-2.0\controls\description.lua
+libs\LibAddonMenu-2.0\controls\dropdown.lua
+libs\LibAddonMenu-2.0\controls\editbox.lua
+libs\LibAddonMenu-2.0\controls\header.lua
+libs\LibAddonMenu-2.0\controls\slider.lua
+libs\LibAddonMenu-2.0\controls\texture.lua

 RangeReticle.lua
+rrSavedVarsDefaults.lua
 RangeReticle.xml
diff --git a/RangeReticle.xml b/RangeReticle.xml
index 37d1a51..6995d0b 100755
--- a/RangeReticle.xml
+++ b/RangeReticle.xml
@@ -2,7 +2,7 @@
     <Controls>
         <TopLevelControl name="RangeReticle" movable="false">
             <OnUpdate>
-                OnRangeUpdate()
+                RR.OnRangeUpdate()
             </OnUpdate>
             <Controls>
                 <Label name="$(parent)Name" font="ZoFontChat" color="FFFFFF" wrapMode="ELLIPSIS" horizontalAlignment="CENTER" verticalAlignment="BOTTOM" text="">
diff --git a/libs/LibAddonMenu-2.0.txt b/libs/LibAddonMenu-2.0.txt
new file mode 100644
index 0000000..cbb0978
--- /dev/null
+++ b/libs/LibAddonMenu-2.0.txt
@@ -0,0 +1,23 @@
+## APIVersion: 100010
+## Title: LibAddonMenu-2.0
+## Version: 2.0 r16
+## Author: Seerah
+## Description: A library to aid in the creation of option panels.
+
+
+LibStub\LibStub.lua
+
+LibAddonMenu-2.0\LibAddonMenu-2.0.lua
+
+LibAddonMenu-2.0\controls\panel.lua
+LibAddonMenu-2.0\controls\submenu.lua
+LibAddonMenu-2.0\controls\button.lua
+LibAddonMenu-2.0\controls\checkbox.lua
+LibAddonMenu-2.0\controls\colorpicker.lua
+LibAddonMenu-2.0\controls\custom.lua
+LibAddonMenu-2.0\controls\description.lua
+LibAddonMenu-2.0\controls\dropdown.lua
+LibAddonMenu-2.0\controls\editbox.lua
+LibAddonMenu-2.0\controls\header.lua
+LibAddonMenu-2.0\controls\slider.lua
+LibAddonMenu-2.0\controls\texture.lua
diff --git a/libs/LibAnimation-1.0/LibAnimation.lua b/libs/LibAnimation-1.0/LibAnimation.lua
new file mode 100644
index 0000000..16323dd
--- /dev/null
+++ b/libs/LibAnimation-1.0/LibAnimation.lua
@@ -0,0 +1,248 @@
+----------------------------------------------------
+-- Lib Animation - for all your animation needs
+--
+-- @classmod LibAnimation
+-- @author Pawkette ( pawkette.heals@gmail.com )
+-- @copyright 2014 Pawkette
+--[[
+The MIT License (MIT)
+
+Copyright (c) <year> <copyright holders>
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
+]]
+----------------------------------------------------
+if ( not LibStub ) then return end
+
+local kName, kVersion   = 'LibAnimation-1.0', 2.1
+local LibAnimation      = LibStub:NewLibrary( kName, kVersion )
+if ( not LibAnimation ) then return end
+
+local AnimationMgr          = ANIMATION_MANAGER
+local defaultEase           = ZO_LinearEase
+
+local ANIMATION_SIZE        = ANIMATION_SIZE
+local ANIMATION_TRANSLATE   = ANIMATION_TRANSLATE
+local ANIMATION_SCALE       = ANIMATION_SCALE
+local ANIMATION_ALPHA       = ANIMATION_ALPHA
+local _
+
+--- Create a new animation for control
+-- @tparam table control (optional)
+-- @tparam number playbackType (optional)
+-- @tparam number loopCount (optional)
+-- @treturn LibAnimation object
+function LibAnimation:New( control, playbackType, loopCount )
+    local result    = setmetatable( {}, self )
+    local mt        = getmetatable( result )
+    mt.__index      = self
+
+    if ( not playbackType ) then
+        playbackType = 0
+    end
+
+    if ( not loopCount ) then
+        loopCount = 0
+    end
+
+    result:Initialize( control, playbackType, loopCount )
+    return result
+end
+
+--- Animation Constructor
+-- @tparam table control (optional)
+-- @tparam number playbackType (optional)
+-- @tparam number loopCount (optional)
+function LibAnimation:Initialize( control, playbackType, loopCount )
+    self.control    = control
+    self.timeline   = AnimationMgr:CreateTimeline()
+    self.timeline:SetPlaybackType( playbackType, loopCount )
+end
+
+function LibAnimation:Apply( control )
+    self.timeline:ApplyAllAnimationsToControl( control )
+end
+
+function LibAnimation:SetHandler( ... )
+    self.timeline:SetHandler( ... )
+end
+
+--- Allows you to add a callback at a certain point in the timeline
+-- @tparam function fn
+-- @tparam number delay how long to wait before calling
+function LibAnimation:InsertCallback( fn, delay )
+    if ( self.timeline ) then
+        self.timeline:InsertCallback( fn, delay )
+    end
+end
+
+--- Stop the animation
+function LibAnimation:Stop()
+    self.timeline:Stop()
+end
+
+--- Play the animation from the begining
+function LibAnimation:Play()
+    self.timeline:PlayFromStart()
+end
+
+--- Play the animation from the end
+function LibAnimation:PlayBackward()
+    self.timeline:PlayFromEnd()
+end
+
+--- Play the animation forward from where it was stopped
+function LibAnimation:Forward()
+    self.timeline:PlayForward()
+end
+
+--- Play the animation backward from where it was stopped
+function LibAnimation:Backward()
+    self.timeline:PlayBackward()
+end
+
+function LibAnimation:SetUserData( data )
+    self._udata = data
+end
+
+function LibAnimation:GetUserData()
+    return self._udata
+end
+
+--- Get's the existing animation or creates a new one
+-- @tparam number animType
+-- @tparam number delay (optional)
+-- @tresult animation
+function LibAnimation:Insert( animType, duration, delay, anchorIndex, fn )
+    local anim = self.timeline:InsertAnimation( animType, self.control, delay or 0 )
+
+    anim:SetDuration( duration or 1 )
+    anim:SetEasingFunction( fn or defaultEase )
+
+    if ( animType == ANIMATION_TRANSLATE ) then
+        anim:SetAnchorIndex( anchorIndex or 0 )
+    end
+    return anim
+end
+
+--- Create new translate animation
+-- @tparam number xorigin
+-- @tparam number yorigin
+-- @tparam number xoffset
+-- @tparam number yoffset
+-- @tparam number duration
+-- @tparam number delay (optional)
+-- @tparam number anchorIndex (optional)
+-- @tparam function fn easing function (optional)
+function LibAnimation:TranslateToFrom( xorigin, yorigin, xoffset, yoffset, duration, delay, anchorIndex, fn )
+    self:Stop()
+    local anim = self:Insert( ANIMATION_TRANSLATE, duration, delay, anchorIndex, fn )
+    anim:SetStartOffsetX( xorigin )
+    anim:SetStartOffsetY( yorigin )
+    anim:SetEndOffsetX( xoffset )
+    anim:SetEndOffsetY( yoffset )
+end
+
+--- Create new translate animation
+-- @tparam number xoffset
+-- @tparam number yoffset
+-- @tparam number duration
+-- @tparam number delay (optional)
+-- @tparam number anchorIndex (optional)
+-- @tparam function fn easing function (optional)
+function LibAnimation:TranslateTo( xoffset, yoffset, duration, delay, anchorIndex, fn )
+    local _, _, _, _, offsX, offsY = self.control:GetAnchor( anchorIndex or 0 )
+    self:TranslateToFrom( offsX, offsY, xoffset, yoffset, duration, delay, anchorIndex, fn )
+end
+
+--- Create a new size animation
+-- @tparam number startWidth
+-- @tparam number startHeight
+-- @tparam number width target width
+-- @tparam number height target height
+-- @tparam number duration
+-- @tparam number delay (optional)
+-- @tparam function fn easing function (optional)
+function LibAnimation:ResizeToFrom( startWidth, startHeight, width, height, duration, delay, fn )
+    self:Stop()
+    local anim = self:Insert( ANIMATION_SIZE, duration, delay, nil, fn )
+    anim:SetHeightStartAndEnd( startHeight, height )
+    anim:SetWidthStartAndEnd( startWidth, width )
+end
+
+--- Create a new size animation
+-- @tparam number width target width
+-- @tparam number height target height
+-- @tparam number duration
+-- @tparam number delay (optional)
+-- @tparam function fn easing function (optional)
+function LibAnimation:ResizeTo( width, height, duration, delay, fn )
+    self:ResizeToFrom( self.control:GetWidth(), self.control:GetHeight(), width, height, duration, delay, fn )
+end
+
+
+--- Create a new scale animation
+-- @tparam number startScale
+-- @tparam number scale
+-- @tparam number duration
+-- @tparam number delay (optional)
+-- @tparam function fn easing function (optional)
+function LibAnimation:ScaleToFrom( startScale, scale, duration, delay, fn )
+    self:Stop()
+    local anim = self:Insert( ANIMATION_SCALE, duration, delay, nil, fn )
+    anim:SetScaleValues( startScale, scale )
+end
+
+--- Create a new scale animation
+-- @tparam number scale
+-- @tparam number duration
+-- @tparam number delay (optional)
+-- @tparam function fn easing function (optional)
+function LibAnimation:ScaleTo( scale, duration, delay, fn )
+    self:ScaleToFrom( self.control:GetScale(), scale, duration, delay, fn )
+end
+
+
+function LibAnimation:AlphaToFrom( startAlpha, alpha, duration, delay, fn )
+    self:Stop()
+    local anim = self:Insert( ANIMATION_ALPHA, duration, delay, nil, fn )
+    anim:SetAlphaValues( startAlpha, alpha )
+end
+
+--- Create a new alpha animation
+-- @tparam number alpha
+-- @tparam number duration
+-- @tparam number delay (optional)
+-- @tparam function fn easing function (optional)
+function LibAnimation:AlphaTo( alpha, duration, delay, fn )
+    self:AlphaToFrom( self.control:GetAlpha(), alpha, duration, delay, fn )
+end
+
+--- Create a new scroll animation
+-- @tparam number x
+-- @tparam number y
+-- @tparam number duration
+-- @tparam number delay (optional)
+-- @tparam function fn easing function (optional)
+--[[function LibAnimation:ScrollTo( x, y, duration, delay, fn )
+    local anim = self:GetOrCreate( ANIMATION_SCROLL, delay )
+
+    anim:SetDuration( duration or 1 )
+    anim:SetEasingFunction( fn or defaultEase )
+end]]
\ No newline at end of file
diff --git a/libs/UTF8/utf8.lua b/libs/UTF8/utf8.lua
new file mode 100644
index 0000000..d6b015f
--- /dev/null
+++ b/libs/UTF8/utf8.lua
@@ -0,0 +1,321 @@
+-- $Id: utf8.lua 179 2009-04-03 18:10:03Z pasta $
+--
+-- Provides UTF-8 aware string functions implemented in pure lua:
+-- * string.utf8len(s)
+-- * string.utf8sub(s, i, j)
+-- * string.utf8reverse(s)
+--
+-- If utf8data.lua (containing the lower<->upper case mappings) is loaded, these
+-- additional functions are available:
+-- * string.utf8upper(s)
+-- * string.utf8lower(s)
+--
+-- All functions behave as their non UTF-8 aware counterparts with the exception
+-- that UTF-8 characters are used instead of bytes for all units.
+
+--[[
+Copyright (c) 2006-2007, Kyle Smith
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+    * Redistributions of source code must retain the above copyright notice,
+      this list of conditions and the following disclaimer.
+    * Redistributions in binary form must reproduce the above copyright
+      notice, this list of conditions and the following disclaimer in the
+      documentation and/or other materials provided with the distribution.
+    * Neither the name of the author nor the names of its contributors may be
+      used to endorse or promote products derived from this software without
+      specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
+FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+--]]
+
+-- ABNF from RFC 3629
+--
+-- UTF8-octets = *( UTF8-char )
+-- UTF8-char   = UTF8-1 / UTF8-2 / UTF8-3 / UTF8-4
+-- UTF8-1      = %x00-7F
+-- UTF8-2      = %xC2-DF UTF8-tail
+-- UTF8-3      = %xE0 %xA0-BF UTF8-tail / %xE1-EC 2( UTF8-tail ) /
+--               %xED %x80-9F UTF8-tail / %xEE-EF 2( UTF8-tail )
+-- UTF8-4      = %xF0 %x90-BF 2( UTF8-tail ) / %xF1-F3 3( UTF8-tail ) /
+--               %xF4 %x80-8F 2( UTF8-tail )
+-- UTF8-tail   = %x80-BF
+--
+
+-- returns the number of bytes used by the UTF-8 character at byte i in s
+-- also doubles as a UTF-8 character validator
+local function utf8charbytes (s, i)
+	-- argument defaults
+	i = i or 1
+
+	-- argument checking
+	if type(s) ~= "string" then
+		error("bad argument #1 to 'utf8charbytes' (string expected, got ".. type(s).. ")")
+	end
+	if type(i) ~= "number" then
+		error("bad argument #2 to 'utf8charbytes' (number expected, got ".. type(i).. ")")
+	end
+
+	local c = s:byte(i)
+
+	-- determine bytes needed for character, based on RFC 3629
+	-- validate byte 1
+	if c > 0 and c <= 127 then
+		-- UTF8-1
+		return 1
+
+	elseif c >= 194 and c <= 223 then
+		-- UTF8-2
+		local c2 = s:byte(i + 1)
+
+		if not c2 then
+			error("UTF-8 string terminated early")
+		end
+
+		-- validate byte 2
+		if c2 < 128 or c2 > 191 then
+			error("Invalid UTF-8 character")
+		end
+
+		return 2
+
+	elseif c >= 224 and c <= 239 then
+		-- UTF8-3
+		local c2 = s:byte(i + 1)
+		local c3 = s:byte(i + 2)
+
+		if not c2 or not c3 then
+			error("UTF-8 string terminated early")
+		end
+
+		-- validate byte 2
+		if c == 224 and (c2 < 160 or c2 > 191) then
+			error("Invalid UTF-8 character")
+		elseif c == 237 and (c2 < 128 or c2 > 159) then
+			error("Invalid UTF-8 character")
+		elseif c2 < 128 or c2 > 191 then
+			error("Invalid UTF-8 character")
+		end
+
+		-- validate byte 3
+		if c3 < 128 or c3 > 191 then
+			error("Invalid UTF-8 character")
+		end
+
+		return 3
+
+	elseif c >= 240 and c <= 244 then
+		-- UTF8-4
+		local c2 = s:byte(i + 1)
+		local c3 = s:byte(i + 2)
+		local c4 = s:byte(i + 3)
+
+		if not c2 or not c3 or not c4 then
+			error("UTF-8 string terminated early")
+		end
+
+		-- validate byte 2
+		if c == 240 and (c2 < 144 or c2 > 191) then
+			error("Invalid UTF-8 character")
+		elseif c == 244 and (c2 < 128 or c2 > 143) then
+			error("Invalid UTF-8 character")
+		elseif c2 < 128 or c2 > 191 then
+			error("Invalid UTF-8 character")
+		end
+
+		-- validate byte 3
+		if c3 < 128 or c3 > 191 then
+			error("Invalid UTF-8 character")
+		end
+
+		-- validate byte 4
+		if c4 < 128 or c4 > 191 then
+			error("Invalid UTF-8 character")
+		end
+
+		return 4
+
+	else
+		error("Invalid UTF-8 character")
+	end
+end
+
+
+-- returns the number of characters in a UTF-8 string
+local function utf8len (s)
+	-- argument checking
+	if type(s) ~= "string" then
+		error("bad argument #1 to 'utf8len' (string expected, got ".. type(s).. ")")
+	end
+
+	local pos = 1
+	local bytes = s:len()
+	local len = 0
+
+	while pos <= bytes do
+		len = len + 1
+		pos = pos + utf8charbytes(s, pos)
+	end
+
+	return len
+end
+
+-- install in the string library
+if not string.utf8len then
+	string.utf8len = utf8len
+end
+
+
+-- functions identically to string.sub except that i and j are UTF-8 characters
+-- instead of bytes
+local function utf8sub (s, i, j)
+	-- argument defaults
+	j = j or -1
+
+	-- argument checking
+	if type(s) ~= "string" then
+		error("bad argument #1 to 'utf8sub' (string expected, got ".. type(s).. ")")
+	end
+	if type(i) ~= "number" then
+		error("bad argument #2 to 'utf8sub' (number expected, got ".. type(i).. ")")
+	end
+	if type(j) ~= "number" then
+		error("bad argument #3 to 'utf8sub' (number expected, got ".. type(j).. ")")
+	end
+
+	local pos = 1
+	local bytes = s:len()
+	local len = 0
+
+	-- only set l if i or j is negative
+	local l = (i >= 0 and j >= 0) or s:utf8len()
+	local startChar = (i >= 0) and i or l + i + 1
+	local endChar   = (j >= 0) and j or l + j + 1
+
+	-- can't have start before end!
+	if startChar > endChar then
+		return ""
+	end
+
+	-- byte offsets to pass to string.sub
+	local startByte, endByte = 1, bytes
+
+	while pos <= bytes do
+		len = len + 1
+
+		if len == startChar then
+			startByte = pos
+		end
+
+		pos = pos + utf8charbytes(s, pos)
+
+		if len == endChar then
+			endByte = pos - 1
+			break
+		end
+	end
+
+	return s:sub(startByte, endByte)
+end
+
+-- install in the string library
+if not string.utf8sub then
+	string.utf8sub = utf8sub
+end
+
+
+-- replace UTF-8 characters based on a mapping table
+local function utf8replace (s, mapping)
+	-- argument checking
+	if type(s) ~= "string" then
+		error("bad argument #1 to 'utf8replace' (string expected, got ".. type(s).. ")")
+	end
+	if type(mapping) ~= "table" then
+		error("bad argument #2 to 'utf8replace' (table expected, got ".. type(mapping).. ")")
+	end
+
+	local pos = 1
+	local bytes = s:len()
+	local charbytes
+	local newstr = ""
+
+	while pos <= bytes do
+		charbytes = utf8charbytes(s, pos)
+		local c = s:sub(pos, pos + charbytes - 1)
+
+		newstr = newstr .. (mapping[c] or c)
+
+		pos = pos + charbytes
+	end
+
+	return newstr
+end
+
+
+-- identical to string.upper except it knows about unicode simple case conversions
+local function utf8upper (s)
+	return utf8replace(s, utf8_lc_uc)
+end
+
+-- install in the string library
+if not string.utf8upper and utf8_lc_uc then
+	string.utf8upper = utf8upper
+end
+
+
+-- identical to string.lower except it knows about unicode simple case conversions
+local function utf8lower (s)
+	return utf8replace(s, utf8_uc_lc)
+end
+
+-- install in the string library
+if not string.utf8lower and utf8_uc_lc then
+	string.utf8lower = utf8lower
+end
+
+
+-- identical to string.reverse except that it supports UTF-8
+local function utf8reverse (s)
+	-- argument checking
+	if type(s) ~= "string" then
+		error("bad argument #1 to 'utf8reverse' (string expected, got ".. type(s).. ")")
+	end
+
+	local bytes = s:len()
+	local pos = bytes
+	local charbytes
+	local newstr = ""
+
+	while pos > 0 do
+		c = s:byte(pos)
+		while c >= 128 and c <= 191 do
+			pos = pos - 1
+			c = s:byte(pos)
+		end
+
+		charbytes = utf8charbytes(s, pos)
+
+		newstr = newstr .. s:sub(pos, pos + charbytes - 1)
+
+		pos = pos - 1
+	end
+
+	return newstr
+end
+
+-- install in the string library
+if not string.utf8reverse then
+	string.utf8reverse = utf8reverse
+end
diff --git a/libs/UTF8/utf8data.lua b/libs/UTF8/utf8data.lua
new file mode 100644
index 0000000..655f719
--- /dev/null
+++ b/libs/UTF8/utf8data.lua
@@ -0,0 +1,1860 @@
+utf8_lc_uc = {
+	["a"] = "A",
+	["b"] = "B",
+	["c"] = "C",
+	["d"] = "D",
+	["e"] = "E",
+	["f"] = "F",
+	["g"] = "G",
+	["h"] = "H",
+	["i"] = "I",
+	["j"] = "J",
+	["k"] = "K",
+	["l"] = "L",
+	["m"] = "M",
+	["n"] = "N",
+	["o"] = "O",
+	["p"] = "P",
+	["q"] = "Q",
+	["r"] = "R",
+	["s"] = "S",
+	["t"] = "T",
+	["u"] = "U",
+	["v"] = "V",
+	["w"] = "W",
+	["x"] = "X",
+	["y"] = "Y",
+	["z"] = "Z",
+	["µ"] = "Μ",
+	["à"] = "À",
+	["á"] = "Á",
+	["â"] = "Â",
+	["ã"] = "Ã",
+	["ä"] = "Ä",
+	["å"] = "Å",
+	["æ"] = "Æ",
+	["ç"] = "Ç",
+	["è"] = "È",
+	["é"] = "É",
+	["ê"] = "Ê",
+	["ë"] = "Ë",
+	["ì"] = "Ì",
+	["í"] = "Í",
+	["î"] = "Î",
+	["ï"] = "Ï",
+	["ð"] = "Ð",
+	["ñ"] = "Ñ",
+	["ò"] = "Ò",
+	["ó"] = "Ó",
+	["ô"] = "Ô",
+	["õ"] = "Õ",
+	["ö"] = "Ö",
+	["ø"] = "Ø",
+	["ù"] = "Ù",
+	["ú"] = "Ú",
+	["û"] = "Û",
+	["ü"] = "Ü",
+	["ý"] = "Ý",
+	["þ"] = "Þ",
+	["ÿ"] = "Ÿ",
+	["ā"] = "Ā",
+	["ă"] = "Ă",
+	["ą"] = "Ą",
+	["ć"] = "Ć",
+	["ĉ"] = "Ĉ",
+	["ċ"] = "Ċ",
+	["č"] = "Č",
+	["ď"] = "Ď",
+	["đ"] = "Đ",
+	["ē"] = "Ē",
+	["ĕ"] = "Ĕ",
+	["ė"] = "Ė",
+	["ę"] = "Ę",
+	["ě"] = "Ě",
+	["ĝ"] = "Ĝ",
+	["ğ"] = "Ğ",
+	["ġ"] = "Ġ",
+	["ģ"] = "Ģ",
+	["ĥ"] = "Ĥ",
+	["ħ"] = "Ħ",
+	["ĩ"] = "Ĩ",
+	["ī"] = "Ī",
+	["ĭ"] = "Ĭ",
+	["į"] = "Į",
+	["ı"] = "I",
+	["ij"] = "IJ",
+	["ĵ"] = "Ĵ",
+	["ķ"] = "Ķ",
+	["ĺ"] = "Ĺ",
+	["ļ"] = "Ļ",
+	["ľ"] = "Ľ",
+	["ŀ"] = "Ŀ",
+	["ł"] = "Ł",
+	["ń"] = "Ń",
+	["ņ"] = "Ņ",
+	["ň"] = "Ň",
+	["ŋ"] = "Ŋ",
+	["ō"] = "Ō",
+	["ŏ"] = "Ŏ",
+	["ő"] = "Ő",
+	["œ"] = "Œ",
+	["ŕ"] = "Ŕ",
+	["ŗ"] = "Ŗ",
+	["ř"] = "Ř",
+	["ś"] = "Ś",
+	["ŝ"] = "Ŝ",
+	["ş"] = "Ş",
+	["š"] = "Š",
+	["ţ"] = "Ţ",
+	["ť"] = "Ť",
+	["ŧ"] = "Ŧ",
+	["ũ"] = "Ũ",
+	["ū"] = "Ū",
+	["ŭ"] = "Ŭ",
+	["ů"] = "Ů",
+	["ű"] = "Ű",
+	["ų"] = "Ų",
+	["ŵ"] = "Ŵ",
+	["ŷ"] = "Ŷ",
+	["ź"] = "Ź",
+	["ż"] = "Ż",
+	["ž"] = "Ž",
+	["ſ"] = "S",
+	["ƀ"] = "Ƀ",
+	["ƃ"] = "Ƃ",
+	["ƅ"] = "Ƅ",
+	["ƈ"] = "Ƈ",
+	["ƌ"] = "Ƌ",
+	["ƒ"] = "Ƒ",
+	["ƕ"] = "Ƕ",
+	["ƙ"] = "Ƙ",
+	["ƚ"] = "Ƚ",
+	["ƞ"] = "Ƞ",
+	["ơ"] = "Ơ",
+	["ƣ"] = "Ƣ",
+	["ƥ"] = "Ƥ",
+	["ƨ"] = "Ƨ",
+	["ƭ"] = "Ƭ",
+	["ư"] = "Ư",
+	["ƴ"] = "Ƴ",
+	["ƶ"] = "Ƶ",
+	["ƹ"] = "Ƹ",
+	["ƽ"] = "Ƽ",
+	["ƿ"] = "Ƿ",
+	["Dž"] = "DŽ",
+	["dž"] = "DŽ",
+	["Lj"] = "LJ",
+	["lj"] = "LJ",
+	["Nj"] = "NJ",
+	["nj"] = "NJ",
+	["ǎ"] = "Ǎ",
+	["ǐ"] = "Ǐ",
+	["ǒ"] = "Ǒ",
+	["ǔ"] = "Ǔ",
+	["ǖ"] = "Ǖ",
+	["ǘ"] = "Ǘ",
+	["ǚ"] = "Ǚ",
+	["ǜ"] = "Ǜ",
+	["ǝ"] = "Ǝ",
+	["ǟ"] = "Ǟ",
+	["ǡ"] = "Ǡ",
+	["ǣ"] = "Ǣ",
+	["ǥ"] = "Ǥ",
+	["ǧ"] = "Ǧ",
+	["ǩ"] = "Ǩ",
+	["ǫ"] = "Ǫ",
+	["ǭ"] = "Ǭ",
+	["ǯ"] = "Ǯ",
+	["Dz"] = "DZ",
+	["dz"] = "DZ",
+	["ǵ"] = "Ǵ",
+	["ǹ"] = "Ǹ",
+	["ǻ"] = "Ǻ",
+	["ǽ"] = "Ǽ",
+	["ǿ"] = "Ǿ",
+	["ȁ"] = "Ȁ",
+	["ȃ"] = "Ȃ",
+	["ȅ"] = "Ȅ",
+	["ȇ"] = "Ȇ",
+	["ȉ"] = "Ȉ",
+	["ȋ"] = "Ȋ",
+	["ȍ"] = "Ȍ",
+	["ȏ"] = "Ȏ",
+	["ȑ"] = "Ȑ",
+	["ȓ"] = "Ȓ",
+	["ȕ"] = "Ȕ",
+	["ȗ"] = "Ȗ",
+	["ș"] = "Ș",
+	["ț"] = "Ț",
+	["ȝ"] = "Ȝ",
+	["ȟ"] = "Ȟ",
+	["ȣ"] = "Ȣ",
+	["ȥ"] = "Ȥ",
+	["ȧ"] = "Ȧ",
+	["ȩ"] = "Ȩ",
+	["ȫ"] = "Ȫ",
+	["ȭ"] = "Ȭ",
+	["ȯ"] = "Ȯ",
+	["ȱ"] = "Ȱ",
+	["ȳ"] = "Ȳ",
+	["ȼ"] = "Ȼ",
+	["ɂ"] = "Ɂ",
+	["ɇ"] = "Ɇ",
+	["ɉ"] = "Ɉ",
+	["ɋ"] = "Ɋ",
+	["ɍ"] = "Ɍ",
+	["ɏ"] = "Ɏ",
+	["ɓ"] = "Ɓ",
+	["ɔ"] = "Ɔ",
+	["ɖ"] = "Ɖ",
+	["ɗ"] = "Ɗ",
+	["ə"] = "Ə",
+	["ɛ"] = "Ɛ",
+	["ɠ"] = "Ɠ",
+	["ɣ"] = "Ɣ",
+	["ɨ"] = "Ɨ",
+	["ɩ"] = "Ɩ",
+	["ɫ"] = "Ɫ",
+	["ɯ"] = "Ɯ",
+	["ɲ"] = "Ɲ",
+	["ɵ"] = "Ɵ",
+	["ɽ"] = "Ɽ",
+	["ʀ"] = "Ʀ",
+	["ʃ"] = "Ʃ",
+	["ʈ"] = "Ʈ",
+	["ʉ"] = "Ʉ",
+	["ʊ"] = "Ʊ",
+	["ʋ"] = "Ʋ",
+	["ʌ"] = "Ʌ",
+	["ʒ"] = "Ʒ",
+	["ͅ"] = "Ι",
+	["ͻ"] = "Ͻ",
+	["ͼ"] = "Ͼ",
+	["ͽ"] = "Ͽ",
+	["ά"] = "Ά",
+	["έ"] = "Έ",
+	["ή"] = "Ή",
+	["ί"] = "Ί",
+	["α"] = "Α",
+	["β"] = "Β",
+	["γ"] = "Γ",
+	["δ"] = "Δ",
+	["ε"] = "Ε",
+	["ζ"] = "Ζ",
+	["η"] = "Η",
+	["θ"] = "Θ",
+	["ι"] = "Ι",
+	["κ"] = "Κ",
+	["λ"] = "Λ",
+	["μ"] = "Μ",
+	["ν"] = "Ν",
+	["ξ"] = "Ξ",
+	["ο"] = "Ο",
+	["π"] = "Π",
+	["ρ"] = "Ρ",
+	["ς"] = "Σ",
+	["σ"] = "Σ",
+	["τ"] = "Τ",
+	["υ"] = "Υ",
+	["φ"] = "Φ",
+	["χ"] = "Χ",
+	["ψ"] = "Ψ",
+	["ω"] = "Ω",
+	["ϊ"] = "Ϊ",
+	["ϋ"] = "Ϋ",
+	["ό"] = "Ό",
+	["ύ"] = "Ύ",
+	["ώ"] = "Ώ",
+	["ϐ"] = "Β",
+	["ϑ"] = "Θ",
+	["ϕ"] = "Φ",
+	["ϖ"] = "Π",
+	["ϙ"] = "Ϙ",
+	["ϛ"] = "Ϛ",
+	["ϝ"] = "Ϝ",
+	["ϟ"] = "Ϟ",
+	["ϡ"] = "Ϡ",
+	["ϣ"] = "Ϣ",
+	["ϥ"] = "Ϥ",
+	["ϧ"] = "Ϧ",
+	["ϩ"] = "Ϩ",
+	["ϫ"] = "Ϫ",
+	["ϭ"] = "Ϭ",
+	["ϯ"] = "Ϯ",
+	["ϰ"] = "Κ",
+	["ϱ"] = "Ρ",
+	["ϲ"] = "Ϲ",
+	["ϵ"] = "Ε",
+	["ϸ"] = "Ϸ",
+	["ϻ"] = "Ϻ",
+	["а"] = "А",
+	["б"] = "Б",
+	["в"] = "В",
+	["г"] = "Г",
+	["д"] = "Д",
+	["е"] = "Е",
+	["ж"] = "Ж",
+	["з"] = "З",
+	["и"] = "И",
+	["й"] = "Й",
+	["к"] = "К",
+	["л"] = "Л",
+	["м"] = "М",
+	["н"] = "Н",
+	["о"] = "О",
+	["п"] = "П",
+	["р"] = "Р",
+	["с"] = "С",
+	["т"] = "Т",
+	["у"] = "У",
+	["ф"] = "Ф",
+	["х"] = "Х",
+	["ц"] = "Ц",
+	["ч"] = "Ч",
+	["ш"] = "Ш",
+	["щ"] = "Щ",
+	["ъ"] = "Ъ",
+	["ы"] = "Ы",
+	["ь"] = "Ь",
+	["э"] = "Э",
+	["ю"] = "Ю",
+	["я"] = "Я",
+	["ѐ"] = "Ѐ",
+	["ё"] = "Ё",
+	["ђ"] = "Ђ",
+	["ѓ"] = "Ѓ",
+	["є"] = "Є",
+	["ѕ"] = "Ѕ",
+	["і"] = "І",
+	["ї"] = "Ї",
+	["ј"] = "Ј",
+	["љ"] = "Љ",
+	["њ"] = "Њ",
+	["ћ"] = "Ћ",
+	["ќ"] = "Ќ",
+	["ѝ"] = "Ѝ",
+	["ў"] = "Ў",
+	["џ"] = "Џ",
+	["ѡ"] = "Ѡ",
+	["ѣ"] = "Ѣ",
+	["ѥ"] = "Ѥ",
+	["ѧ"] = "Ѧ",
+	["ѩ"] = "Ѩ",
+	["ѫ"] = "Ѫ",
+	["ѭ"] = "Ѭ",
+	["ѯ"] = "Ѯ",
+	["ѱ"] = "Ѱ",
+	["ѳ"] = "Ѳ",
+	["ѵ"] = "Ѵ",
+	["ѷ"] = "Ѷ",
+	["ѹ"] = "Ѹ",
+	["ѻ"] = "Ѻ",
+	["ѽ"] = "Ѽ",
+	["ѿ"] = "Ѿ",
+	["ҁ"] = "Ҁ",
+	["ҋ"] = "Ҋ",
+	["ҍ"] = "Ҍ",
+	["ҏ"] = "Ҏ",
+	["ґ"] = "Ґ",
+	["ғ"] = "Ғ",
+	["ҕ"] = "Ҕ",
+	["җ"] = "Җ",
+	["ҙ"] = "Ҙ",
+	["қ"] = "Қ",
+	["ҝ"] = "Ҝ",
+	["ҟ"] = "Ҟ",
+	["ҡ"] = "Ҡ",
+	["ң"] = "Ң",
+	["ҥ"] = "Ҥ",
+	["ҧ"] = "Ҧ",
+	["ҩ"] = "Ҩ",
+	["ҫ"] = "Ҫ",
+	["ҭ"] = "Ҭ",
+	["ү"] = "Ү",
+	["ұ"] = "Ұ",
+	["ҳ"] = "Ҳ",
+	["ҵ"] = "Ҵ",
+	["ҷ"] = "Ҷ",
+	["ҹ"] = "Ҹ",
+	["һ"] = "Һ",
+	["ҽ"] = "Ҽ",
+	["ҿ"] = "Ҿ",
+	["ӂ"] = "Ӂ",
+	["ӄ"] = "Ӄ",
+	["ӆ"] = "Ӆ",
+	["ӈ"] = "Ӈ",
+	["ӊ"] = "Ӊ",
+	["ӌ"] = "Ӌ",
+	["ӎ"] = "Ӎ",
+	["ӏ"] = "Ӏ",
+	["ӑ"] = "Ӑ",
+	["ӓ"] = "Ӓ",
+	["ӕ"] = "Ӕ",
+	["ӗ"] = "Ӗ",
+	["ә"] = "Ә",
+	["ӛ"] = "Ӛ",
+	["ӝ"] = "Ӝ",
+	["ӟ"] = "Ӟ",
+	["ӡ"] = "Ӡ",
+	["ӣ"] = "Ӣ",
+	["ӥ"] = "Ӥ",
+	["ӧ"] = "Ӧ",
+	["ө"] = "Ө",
+	["ӫ"] = "Ӫ",
+	["ӭ"] = "Ӭ",
+	["ӯ"] = "Ӯ",
+	["ӱ"] = "Ӱ",
+	["ӳ"] = "Ӳ",
+	["ӵ"] = "Ӵ",
+	["ӷ"] = "Ӷ",
+	["ӹ"] = "Ӹ",
+	["ӻ"] = "Ӻ",
+	["ӽ"] = "Ӽ",
+	["ӿ"] = "Ӿ",
+	["ԁ"] = "Ԁ",
+	["ԃ"] = "Ԃ",
+	["ԅ"] = "Ԅ",
+	["ԇ"] = "Ԇ",
+	["ԉ"] = "Ԉ",
+	["ԋ"] = "Ԋ",
+	["ԍ"] = "Ԍ",
+	["ԏ"] = "Ԏ",
+	["ԑ"] = "Ԑ",
+	["ԓ"] = "Ԓ",
+	["ա"] = "Ա",
+	["բ"] = "Բ",
+	["գ"] = "Գ",
+	["դ"] = "Դ",
+	["ե"] = "Ե",
+	["զ"] = "Զ",
+	["է"] = "Է",
+	["ը"] = "Ը",
+	["թ"] = "Թ",
+	["ժ"] = "Ժ",
+	["ի"] = "Ի",
+	["լ"] = "Լ",
+	["խ"] = "Խ",
+	["ծ"] = "Ծ",
+	["կ"] = "Կ",
+	["հ"] = "Հ",
+	["ձ"] = "Ձ",
+	["ղ"] = "Ղ",
+	["ճ"] = "Ճ",
+	["մ"] = "Մ",
+	["յ"] = "Յ",
+	["ն"] = "Ն",
+	["շ"] = "Շ",
+	["ո"] = "Ո",
+	["չ"] = "Չ",
+	["պ"] = "Պ",
+	["ջ"] = "Ջ",
+	["ռ"] = "Ռ",
+	["ս"] = "Ս",
+	["վ"] = "Վ",
+	["տ"] = "Տ",
+	["ր"] = "Ր",
+	["ց"] = "Ց",
+	["ւ"] = "Ւ",
+	["փ"] = "Փ",
+	["ք"] = "Ք",
+	["օ"] = "Օ",
+	["ֆ"] = "Ֆ",
+	["ᵽ"] = "Ᵽ",
+	["ḁ"] = "Ḁ",
+	["ḃ"] = "Ḃ",
+	["ḅ"] = "Ḅ",
+	["ḇ"] = "Ḇ",
+	["ḉ"] = "Ḉ",
+	["ḋ"] = "Ḋ",
+	["ḍ"] = "Ḍ",
+	["ḏ"] = "Ḏ",
+	["ḑ"] = "Ḑ",
+	["ḓ"] = "Ḓ",
+	["ḕ"] = "Ḕ",
+	["ḗ"] = "Ḗ",
+	["ḙ"] = "Ḙ",
+	["ḛ"] = "Ḛ",
+	["ḝ"] = "Ḝ",
+	["ḟ"] = "Ḟ",
+	["ḡ"] = "Ḡ",
+	["ḣ"] = "Ḣ",
+	["ḥ"] = "Ḥ",
+	["ḧ"] = "Ḧ",
+	["ḩ"] = "Ḩ",
+	["ḫ"] = "Ḫ",
+	["ḭ"] = "Ḭ",
+	["ḯ"] = "Ḯ",
+	["ḱ"] = "Ḱ",
+	["ḳ"] = "Ḳ",
+	["ḵ"] = "Ḵ",
+	["ḷ"] = "Ḷ",
+	["ḹ"] = "Ḹ",
+	["ḻ"] = "Ḻ",
+	["ḽ"] = "Ḽ",
+	["ḿ"] = "Ḿ",
+	["ṁ"] = "Ṁ",
+	["ṃ"] = "Ṃ",
+	["ṅ"] = "Ṅ",
+	["ṇ"] = "Ṇ",
+	["ṉ"] = "Ṉ",
+	["ṋ"] = "Ṋ",
+	["ṍ"] = "Ṍ",
+	["ṏ"] = "Ṏ",
+	["ṑ"] = "Ṑ",
+	["ṓ"] = "Ṓ",
+	["ṕ"] = "Ṕ",
+	["ṗ"] = "Ṗ",
+	["ṙ"] = "Ṙ",
+	["ṛ"] = "Ṛ",
+	["ṝ"] = "Ṝ",
+	["ṟ"] = "Ṟ",
+	["ṡ"] = "Ṡ",
+	["ṣ"] = "Ṣ",
+	["ṥ"] = "Ṥ",
+	["ṧ"] = "Ṧ",
+	["ṩ"] = "Ṩ",
+	["ṫ"] = "Ṫ",
+	["ṭ"] = "Ṭ",
+	["ṯ"] = "Ṯ",
+	["ṱ"] = "Ṱ",
+	["ṳ"] = "Ṳ",
+	["ṵ"] = "Ṵ",
+	["ṷ"] = "Ṷ",
+	["ṹ"] = "Ṹ",
+	["ṻ"] = "Ṻ",
+	["ṽ"] = "Ṽ",
+	["ṿ"] = "Ṿ",
+	["ẁ"] = "Ẁ",
+	["ẃ"] = "Ẃ",
+	["ẅ"] = "Ẅ",
+	["ẇ"] = "Ẇ",
+	["ẉ"] = "Ẉ",
+	["ẋ"] = "Ẋ",
+	["ẍ"] = "Ẍ",
+	["ẏ"] = "Ẏ",
+	["ẑ"] = "Ẑ",
+	["ẓ"] = "Ẓ",
+	["ẕ"] = "Ẕ",
+	["ẛ"] = "Ṡ",
+	["ạ"] = "Ạ",
+	["ả"] = "Ả",
+	["ấ"] = "Ấ",
+	["ầ"] = "Ầ",
+	["ẩ"] = "Ẩ",
+	["ẫ"] = "Ẫ",
+	["ậ"] = "Ậ",
+	["ắ"] = "Ắ",
+	["ằ"] = "Ằ",
+	["ẳ"] = "Ẳ",
+	["ẵ"] = "Ẵ",
+	["ặ"] = "Ặ",
+	["ẹ"] = "Ẹ",
+	["ẻ"] = "Ẻ",
+	["ẽ"] = "Ẽ",
+	["ế"] = "Ế",
+	["ề"] = "Ề",
+	["ể"] = "Ể",
+	["ễ"] = "Ễ",
+	["ệ"] = "Ệ",
+	["ỉ"] = "Ỉ",
+	["ị"] = "Ị",
+	["ọ"] = "Ọ",
+	["ỏ"] = "Ỏ",
+	["ố"] = "Ố",
+	["ồ"] = "Ồ",
+	["ổ"] = "Ổ",
+	["ỗ"] = "Ỗ",
+	["ộ"] = "Ộ",
+	["ớ"] = "Ớ",
+	["ờ"] = "Ờ",
+	["ở"] = "Ở",
+	["ỡ"] = "Ỡ",
+	["ợ"] = "Ợ",
+	["ụ"] = "Ụ",
+	["ủ"] = "Ủ",
+	["ứ"] = "Ứ",
+	["ừ"] = "Ừ",
+	["ử"] = "Ử",
+	["ữ"] = "Ữ",
+	["ự"] = "Ự",
+	["ỳ"] = "Ỳ",
+	["ỵ"] = "Ỵ",
+	["ỷ"] = "Ỷ",
+	["ỹ"] = "Ỹ",
+	["ἀ"] = "Ἀ",
+	["ἁ"] = "Ἁ",
+	["ἂ"] = "Ἂ",
+	["ἃ"] = "Ἃ",
+	["ἄ"] = "Ἄ",
+	["ἅ"] = "Ἅ",
+	["ἆ"] = "Ἆ",
+	["ἇ"] = "Ἇ",
+	["ἐ"] = "Ἐ",
+	["ἑ"] = "Ἑ",
+	["ἒ"] = "Ἒ",
+	["ἓ"] = "Ἓ",
+	["ἔ"] = "Ἔ",
+	["ἕ"] = "Ἕ",
+	["ἠ"] = "Ἠ",
+	["ἡ"] = "Ἡ",
+	["ἢ"] = "Ἢ",
+	["ἣ"] = "Ἣ",
+	["ἤ"] = "Ἤ",
+	["ἥ"] = "Ἥ",
+	["ἦ"] = "Ἦ",
+	["ἧ"] = "Ἧ",
+	["ἰ"] = "Ἰ",
+	["ἱ"] = "Ἱ",
+	["ἲ"] = "Ἲ",
+	["ἳ"] = "Ἳ",
+	["ἴ"] = "Ἴ",
+	["ἵ"] = "Ἵ",
+	["ἶ"] = "Ἶ",
+	["ἷ"] = "Ἷ",
+	["ὀ"] = "Ὀ",
+	["ὁ"] = "Ὁ",
+	["ὂ"] = "Ὂ",
+	["ὃ"] = "Ὃ",
+	["ὄ"] = "Ὄ",
+	["ὅ"] = "Ὅ",
+	["ὑ"] = "Ὑ",
+	["ὓ"] = "Ὓ",
+	["ὕ"] = "Ὕ",
+	["ὗ"] = "Ὗ",
+	["ὠ"] = "Ὠ",
+	["ὡ"] = "Ὡ",
+	["ὢ"] = "Ὢ",
+	["ὣ"] = "Ὣ",
+	["ὤ"] = "Ὤ",
+	["ὥ"] = "Ὥ",
+	["ὦ"] = "Ὦ",
+	["ὧ"] = "Ὧ",
+	["ὰ"] = "Ὰ",
+	["ά"] = "Ά",
+	["ὲ"] = "Ὲ",
+	["έ"] = "Έ",
+	["ὴ"] = "Ὴ",
+	["ή"] = "Ή",
+	["ὶ"] = "Ὶ",
+	["ί"] = "Ί",
+	["ὸ"] = "Ὸ",
+	["ό"] = "Ό",
+	["ὺ"] = "Ὺ",
+	["ύ"] = "Ύ",
+	["ὼ"] = "Ὼ",
+	["ώ"] = "Ώ",
+	["ᾀ"] = "ᾈ",
+	["ᾁ"] = "ᾉ",
+	["ᾂ"] = "ᾊ",
+	["ᾃ"] = "ᾋ",
+	["ᾄ"] = "ᾌ",
+	["ᾅ"] = "ᾍ",
+	["ᾆ"] = "ᾎ",
+	["ᾇ"] = "ᾏ",
+	["ᾐ"] = "ᾘ",
+	["ᾑ"] = "ᾙ",
+	["ᾒ"] = "ᾚ",
+	["ᾓ"] = "ᾛ",
+	["ᾔ"] = "ᾜ",
+	["ᾕ"] = "ᾝ",
+	["ᾖ"] = "ᾞ",
+	["ᾗ"] = "ᾟ",
+	["ᾠ"] = "ᾨ",
+	["ᾡ"] = "ᾩ",
+	["ᾢ"] = "ᾪ",
+	["ᾣ"] = "ᾫ",
+	["ᾤ"] = "ᾬ",
+	["ᾥ"] = "ᾭ",
+	["ᾦ"] = "ᾮ",
+	["ᾧ"] = "ᾯ",
+	["ᾰ"] = "Ᾰ",
+	["ᾱ"] = "Ᾱ",
+	["ᾳ"] = "ᾼ",
+	["ι"] = "Ι",
+	["ῃ"] = "ῌ",
+	["ῐ"] = "Ῐ",
+	["ῑ"] = "Ῑ",
+	["ῠ"] = "Ῠ",
+	["ῡ"] = "Ῡ",
+	["ῥ"] = "Ῥ",
+	["ῳ"] = "ῼ",
+	["ⅎ"] = "Ⅎ",
+	["ⅰ"] = "Ⅰ",
+	["ⅱ"] = "Ⅱ",
+	["ⅲ"] = "Ⅲ",
+	["ⅳ"] = "Ⅳ",
+	["ⅴ"] = "Ⅴ",
+	["ⅵ"] = "Ⅵ",
+	["ⅶ"] = "Ⅶ",
+	["ⅷ"] = "Ⅷ",
+	["ⅸ"] = "Ⅸ",
+	["ⅹ"] = "Ⅹ",
+	["ⅺ"] = "Ⅺ",
+	["ⅻ"] = "Ⅻ",
+	["ⅼ"] = "Ⅼ",
+	["ⅽ"] = "Ⅽ",
+	["ⅾ"] = "Ⅾ",
+	["ⅿ"] = "Ⅿ",
+	["ↄ"] = "Ↄ",
+	["ⓐ"] = "Ⓐ",
+	["ⓑ"] = "Ⓑ",
+	["ⓒ"] = "Ⓒ",
+	["ⓓ"] = "Ⓓ",
+	["ⓔ"] = "Ⓔ",
+	["ⓕ"] = "Ⓕ",
+	["ⓖ"] = "Ⓖ",
+	["ⓗ"] = "Ⓗ",
+	["ⓘ"] = "Ⓘ",
+	["ⓙ"] = "Ⓙ",
+	["ⓚ"] = "Ⓚ",
+	["ⓛ"] = "Ⓛ",
+	["ⓜ"] = "Ⓜ",
+	["ⓝ"] = "Ⓝ",
+	["ⓞ"] = "Ⓞ",
+	["ⓟ"] = "Ⓟ",
+	["ⓠ"] = "Ⓠ",
+	["ⓡ"] = "Ⓡ",
+	["ⓢ"] = "Ⓢ",
+	["ⓣ"] = "Ⓣ",
+	["ⓤ"] = "Ⓤ",
+	["ⓥ"] = "Ⓥ",
+	["ⓦ"] = "Ⓦ",
+	["ⓧ"] = "Ⓧ",
+	["ⓨ"] = "Ⓨ",
+	["ⓩ"] = "Ⓩ",
+	["ⰰ"] = "Ⰰ",
+	["ⰱ"] = "Ⰱ",
+	["ⰲ"] = "Ⰲ",
+	["ⰳ"] = "Ⰳ",
+	["ⰴ"] = "Ⰴ",
+	["ⰵ"] = "Ⰵ",
+	["ⰶ"] = "Ⰶ",
+	["ⰷ"] = "Ⰷ",
+	["ⰸ"] = "Ⰸ",
+	["ⰹ"] = "Ⰹ",
+	["ⰺ"] = "Ⰺ",
+	["ⰻ"] = "Ⰻ",
+	["ⰼ"] = "Ⰼ",
+	["ⰽ"] = "Ⰽ",
+	["ⰾ"] = "Ⰾ",
+	["ⰿ"] = "Ⰿ",
+	["ⱀ"] = "Ⱀ",
+	["ⱁ"] = "Ⱁ",
+	["ⱂ"] = "Ⱂ",
+	["ⱃ"] = "Ⱃ",
+	["ⱄ"] = "Ⱄ",
+	["ⱅ"] = "Ⱅ",
+	["ⱆ"] = "Ⱆ",
+	["ⱇ"] = "Ⱇ",
+	["ⱈ"] = "Ⱈ",
+	["ⱉ"] = "Ⱉ",
+	["ⱊ"] = "Ⱊ",
+	["ⱋ"] = "Ⱋ",
+	["ⱌ"] = "Ⱌ",
+	["ⱍ"] = "Ⱍ",
+	["ⱎ"] = "Ⱎ",
+	["ⱏ"] = "Ⱏ",
+	["ⱐ"] = "Ⱐ",
+	["ⱑ"] = "Ⱑ",
+	["ⱒ"] = "Ⱒ",
+	["ⱓ"] = "Ⱓ",
+	["ⱔ"] = "Ⱔ",
+	["ⱕ"] = "Ⱕ",
+	["ⱖ"] = "Ⱖ",
+	["ⱗ"] = "Ⱗ",
+	["ⱘ"] = "Ⱘ",
+	["ⱙ"] = "Ⱙ",
+	["ⱚ"] = "Ⱚ",
+	["ⱛ"] = "Ⱛ",
+	["ⱜ"] = "Ⱜ",
+	["ⱝ"] = "Ⱝ",
+	["ⱞ"] = "Ⱞ",
+	["ⱡ"] = "Ⱡ",
+	["ⱥ"] = "Ⱥ",
+	["ⱦ"] = "Ⱦ",
+	["ⱨ"] = "Ⱨ",
+	["ⱪ"] = "Ⱪ",
+	["ⱬ"] = "Ⱬ",
+	["ⱶ"] = "Ⱶ",
+	["ⲁ"] = "Ⲁ",
+	["ⲃ"] = "Ⲃ",
+	["ⲅ"] = "Ⲅ",
+	["ⲇ"] = "Ⲇ",
+	["ⲉ"] = "Ⲉ",
+	["ⲋ"] = "Ⲋ",
+	["ⲍ"] = "Ⲍ",
+	["ⲏ"] = "Ⲏ",
+	["ⲑ"] = "Ⲑ",
+	["ⲓ"] = "Ⲓ",
+	["ⲕ"] = "Ⲕ",
+	["ⲗ"] = "Ⲗ",
+	["ⲙ"] = "Ⲙ",
+	["ⲛ"] = "Ⲛ",
+	["ⲝ"] = "Ⲝ",
+	["ⲟ"] = "Ⲟ",
+	["ⲡ"] = "Ⲡ",
+	["ⲣ"] = "Ⲣ",
+	["ⲥ"] = "Ⲥ",
+	["ⲧ"] = "Ⲧ",
+	["ⲩ"] = "Ⲩ",
+	["ⲫ"] = "Ⲫ",
+	["ⲭ"] = "Ⲭ",
+	["ⲯ"] = "Ⲯ",
+	["ⲱ"] = "Ⲱ",
+	["ⲳ"] = "Ⲳ",
+	["ⲵ"] = "Ⲵ",
+	["ⲷ"] = "Ⲷ",
+	["ⲹ"] = "Ⲹ",
+	["ⲻ"] = "Ⲻ",
+	["ⲽ"] = "Ⲽ",
+	["ⲿ"] = "Ⲿ",
+	["ⳁ"] = "Ⳁ",
+	["ⳃ"] = "Ⳃ",
+	["ⳅ"] = "Ⳅ",
+	["ⳇ"] = "Ⳇ",
+	["ⳉ"] = "Ⳉ",
+	["ⳋ"] = "Ⳋ",
+	["ⳍ"] = "Ⳍ",
+	["ⳏ"] = "Ⳏ",
+	["ⳑ"] = "Ⳑ",
+	["ⳓ"] = "Ⳓ",
+	["ⳕ"] = "Ⳕ",
+	["ⳗ"] = "Ⳗ",
+	["ⳙ"] = "Ⳙ",
+	["ⳛ"] = "Ⳛ",
+	["ⳝ"] = "Ⳝ",
+	["ⳟ"] = "Ⳟ",
+	["ⳡ"] = "Ⳡ",
+	["ⳣ"] = "Ⳣ",
+	["ⴀ"] = "Ⴀ",
+	["ⴁ"] = "Ⴁ",
+	["ⴂ"] = "Ⴂ",
+	["ⴃ"] = "Ⴃ",
+	["ⴄ"] = "Ⴄ",
+	["ⴅ"] = "Ⴅ",
+	["ⴆ"] = "Ⴆ",
+	["ⴇ"] = "Ⴇ",
+	["ⴈ"] = "Ⴈ",
+	["ⴉ"] = "Ⴉ",
+	["ⴊ"] = "Ⴊ",
+	["ⴋ"] = "Ⴋ",
+	["ⴌ"] = "Ⴌ",
+	["ⴍ"] = "Ⴍ",
+	["ⴎ"] = "Ⴎ",
+	["ⴏ"] = "Ⴏ",
+	["ⴐ"] = "Ⴐ",
+	["ⴑ"] = "Ⴑ",
+	["ⴒ"] = "Ⴒ",
+	["ⴓ"] = "Ⴓ",
+	["ⴔ"] = "Ⴔ",
+	["ⴕ"] = "Ⴕ",
+	["ⴖ"] = "Ⴖ",
+	["ⴗ"] = "Ⴗ",
+	["ⴘ"] = "Ⴘ",
+	["ⴙ"] = "Ⴙ",
+	["ⴚ"] = "Ⴚ",
+	["ⴛ"] = "Ⴛ",
+	["ⴜ"] = "Ⴜ",
+	["ⴝ"] = "Ⴝ",
+	["ⴞ"] = "Ⴞ",
+	["ⴟ"] = "Ⴟ",
+	["ⴠ"] = "Ⴠ",
+	["ⴡ"] = "Ⴡ",
+	["ⴢ"] = "Ⴢ",
+	["ⴣ"] = "Ⴣ",
+	["ⴤ"] = "Ⴤ",
+	["ⴥ"] = "Ⴥ",
+	["a"] = "A",
+	["b"] = "B",
+	["c"] = "C",
+	["d"] = "D",
+	["e"] = "E",
+	["f"] = "F",
+	["g"] = "G",
+	["h"] = "H",
+	["i"] = "I",
+	["j"] = "J",
+	["k"] = "K",
+	["l"] = "L",
+	["m"] = "M",
+	["n"] = "N",
+	["o"] = "O",
+	["p"] = "P",
+	["q"] = "Q",
+	["r"] = "R",
+	["s"] = "S",
+	["t"] = "T",
+	["u"] = "U",
+	["v"] = "V",
+	["w"] = "W",
+	["x"] = "X",
+	["y"] = "Y",
+	["z"] = "Z",
+	["𐐨"] = "𐐀",
+	["𐐩"] = "𐐁",
+	["𐐪"] = "𐐂",
+	["𐐫"] = "𐐃",
+	["𐐬"] = "𐐄",
+	["𐐭"] = "𐐅",
+	["𐐮"] = "𐐆",
+	["𐐯"] = "𐐇",
+	["𐐰"] = "𐐈",
+	["𐐱"] = "𐐉",
+	["𐐲"] = "𐐊",
+	["𐐳"] = "𐐋",
+	["𐐴"] = "𐐌",
+	["𐐵"] = "𐐍",
+	["𐐶"] = "𐐎",
+	["𐐷"] = "𐐏",
+	["𐐸"] = "𐐐",
+	["𐐹"] = "𐐑",
+	["𐐺"] = "𐐒",
+	["𐐻"] = "𐐓",
+	["𐐼"] = "𐐔",
+	["𐐽"] = "𐐕",
+	["𐐾"] = "𐐖",
+	["𐐿"] = "𐐗",
+	["𐑀"] = "𐐘",
+	["𐑁"] = "𐐙",
+	["𐑂"] = "𐐚",
+	["𐑃"] = "𐐛",
+	["𐑄"] = "𐐜",
+	["𐑅"] = "𐐝",
+	["𐑆"] = "𐐞",
+	["𐑇"] = "𐐟",
+	["𐑈"] = "𐐠",
+	["𐑉"] = "𐐡",
+	["𐑊"] = "𐐢",
+	["𐑋"] = "𐐣",
+	["𐑌"] = "𐐤",
+	["𐑍"] = "𐐥",
+	["𐑎"] = "𐐦",
+	["𐑏"] = "𐐧",
+}
+
+
+utf8_uc_lc = {
+	["A"] = "a",
+	["B"] = "b",
+	["C"] = "c",
+	["D"] = "d",
+	["E"] = "e",
+	["F"] = "f",
+	["G"] = "g",
+	["H"] = "h",
+	["I"] = "i",
+	["J"] = "j",
+	["K"] = "k",
+	["L"] = "l",
+	["M"] = "m",
+	["N"] = "n",
+	["O"] = "o",
+	["P"] = "p",
+	["Q"] = "q",
+	["R"] = "r",
+	["S"] = "s",
+	["T"] = "t",
+	["U"] = "u",
+	["V"] = "v",
+	["W"] = "w",
+	["X"] = "x",
+	["Y"] = "y",
+	["Z"] = "z",
+	["À"] = "à",
+	["Á"] = "á",
+	["Â"] = "â",
+	["Ã"] = "ã",
+	["Ä"] = "ä",
+	["Å"] = "å",
+	["Æ"] = "æ",
+	["Ç"] = "ç",
+	["È"] = "è",
+	["É"] = "é",
+	["Ê"] = "ê",
+	["Ë"] = "ë",
+	["Ì"] = "ì",
+	["Í"] = "í",
+	["Î"] = "î",
+	["Ï"] = "ï",
+	["Ð"] = "ð",
+	["Ñ"] = "ñ",
+	["Ò"] = "ò",
+	["Ó"] = "ó",
+	["Ô"] = "ô",
+	["Õ"] = "õ",
+	["Ö"] = "ö",
+	["Ø"] = "ø",
+	["Ù"] = "ù",
+	["Ú"] = "ú",
+	["Û"] = "û",
+	["Ü"] = "ü",
+	["Ý"] = "ý",
+	["Þ"] = "þ",
+	["Ā"] = "ā",
+	["Ă"] = "ă",
+	["Ą"] = "ą",
+	["Ć"] = "ć",
+	["Ĉ"] = "ĉ",
+	["Ċ"] = "ċ",
+	["Č"] = "č",
+	["Ď"] = "ď",
+	["Đ"] = "đ",
+	["Ē"] = "ē",
+	["Ĕ"] = "ĕ",
+	["Ė"] = "ė",
+	["Ę"] = "ę",
+	["Ě"] = "ě",
+	["Ĝ"] = "ĝ",
+	["Ğ"] = "ğ",
+	["Ġ"] = "ġ",
+	["Ģ"] = "ģ",
+	["Ĥ"] = "ĥ",
+	["Ħ"] = "ħ",
+	["Ĩ"] = "ĩ",
+	["Ī"] = "ī",
+	["Ĭ"] = "ĭ",
+	["Į"] = "į",
+	["İ"] = "i",
+	["IJ"] = "ij",
+	["Ĵ"] = "ĵ",
+	["Ķ"] = "ķ",
+	["Ĺ"] = "ĺ",
+	["Ļ"] = "ļ",
+	["Ľ"] = "ľ",
+	["Ŀ"] = "ŀ",
+	["Ł"] = "ł",
+	["Ń"] = "ń",
+	["Ņ"] = "ņ",
+	["Ň"] = "ň",
+	["Ŋ"] = "ŋ",
+	["Ō"] = "ō",
+	["Ŏ"] = "ŏ",
+	["Ő"] = "ő",
+	["Œ"] = "œ",
+	["Ŕ"] = "ŕ",
+	["Ŗ"] = "ŗ",
+	["Ř"] = "ř",
+	["Ś"] = "ś",
+	["Ŝ"] = "ŝ",
+	["Ş"] = "ş",
+	["Š"] = "š",
+	["Ţ"] = "ţ",
+	["Ť"] = "ť",
+	["Ŧ"] = "ŧ",
+	["Ũ"] = "ũ",
+	["Ū"] = "ū",
+	["Ŭ"] = "ŭ",
+	["Ů"] = "ů",
+	["Ű"] = "ű",
+	["Ų"] = "ų",
+	["Ŵ"] = "ŵ",
+	["Ŷ"] = "ŷ",
+	["Ÿ"] = "ÿ",
+	["Ź"] = "ź",
+	["Ż"] = "ż",
+	["Ž"] = "ž",
+	["Ɓ"] = "ɓ",
+	["Ƃ"] = "ƃ",
+	["Ƅ"] = "ƅ",
+	["Ɔ"] = "ɔ",
+	["Ƈ"] = "ƈ",
+	["Ɖ"] = "ɖ",
+	["Ɗ"] = "ɗ",
+	["Ƌ"] = "ƌ",
+	["Ǝ"] = "ǝ",
+	["Ə"] = "ə",
+	["Ɛ"] = "ɛ",
+	["Ƒ"] = "ƒ",
+	["Ɠ"] = "ɠ",
+	["Ɣ"] = "ɣ",
+	["Ɩ"] = "ɩ",
+	["Ɨ"] = "ɨ",
+	["Ƙ"] = "ƙ",
+	["Ɯ"] = "ɯ",
+	["Ɲ"] = "ɲ",
+	["Ɵ"] = "ɵ",
+	["Ơ"] = "ơ",
+	["Ƣ"] = "ƣ",
+	["Ƥ"] = "ƥ",
+	["Ʀ"] = "ʀ",
+	["Ƨ"] = "ƨ",
+	["Ʃ"] = "ʃ",
+	["Ƭ"] = "ƭ",
+	["Ʈ"] = "ʈ",
+	["Ư"] = "ư",
+	["Ʊ"] = "ʊ",
+	["Ʋ"] = "ʋ",
+	["Ƴ"] = "ƴ",
+	["Ƶ"] = "ƶ",
+	["Ʒ"] = "ʒ",
+	["Ƹ"] = "ƹ",
+	["Ƽ"] = "ƽ",
+	["DŽ"] = "dž",
+	["Dž"] = "dž",
+	["LJ"] = "lj",
+	["Lj"] = "lj",
+	["NJ"] = "nj",
+	["Nj"] = "nj",
+	["Ǎ"] = "ǎ",
+	["Ǐ"] = "ǐ",
+	["Ǒ"] = "ǒ",
+	["Ǔ"] = "ǔ",
+	["Ǖ"] = "ǖ",
+	["Ǘ"] = "ǘ",
+	["Ǚ"] = "ǚ",
+	["Ǜ"] = "ǜ",
+	["Ǟ"] = "ǟ",
+	["Ǡ"] = "ǡ",
+	["Ǣ"] = "ǣ",
+	["Ǥ"] = "ǥ",
+	["Ǧ"] = "ǧ",
+	["Ǩ"] = "ǩ",
+	["Ǫ"] = "ǫ",
+	["Ǭ"] = "ǭ",
+	["Ǯ"] = "ǯ",
+	["DZ"] = "dz",
+	["Dz"] = "dz",
+	["Ǵ"] = "ǵ",
+	["Ƕ"] = "ƕ",
+	["Ƿ"] = "ƿ",
+	["Ǹ"] = "ǹ",
+	["Ǻ"] = "ǻ",
+	["Ǽ"] = "ǽ",
+	["Ǿ"] = "ǿ",
+	["Ȁ"] = "ȁ",
+	["Ȃ"] = "ȃ",
+	["Ȅ"] = "ȅ",
+	["Ȇ"] = "ȇ",
+	["Ȉ"] = "ȉ",
+	["Ȋ"] = "ȋ",
+	["Ȍ"] = "ȍ",
+	["Ȏ"] = "ȏ",
+	["Ȑ"] = "ȑ",
+	["Ȓ"] = "ȓ",
+	["Ȕ"] = "ȕ",
+	["Ȗ"] = "ȗ",
+	["Ș"] = "ș",
+	["Ț"] = "ț",
+	["Ȝ"] = "ȝ",
+	["Ȟ"] = "ȟ",
+	["Ƞ"] = "ƞ",
+	["Ȣ"] = "ȣ",
+	["Ȥ"] = "ȥ",
+	["Ȧ"] = "ȧ",
+	["Ȩ"] = "ȩ",
+	["Ȫ"] = "ȫ",
+	["Ȭ"] = "ȭ",
+	["Ȯ"] = "ȯ",
+	["Ȱ"] = "ȱ",
+	["Ȳ"] = "ȳ",
+	["Ⱥ"] = "ⱥ",
+	["Ȼ"] = "ȼ",
+	["Ƚ"] = "ƚ",
+	["Ⱦ"] = "ⱦ",
+	["Ɂ"] = "ɂ",
+	["Ƀ"] = "ƀ",
+	["Ʉ"] = "ʉ",
+	["Ʌ"] = "ʌ",
+	["Ɇ"] = "ɇ",
+	["Ɉ"] = "ɉ",
+	["Ɋ"] = "ɋ",
+	["Ɍ"] = "ɍ",
+	["Ɏ"] = "ɏ",
+	["Ά"] = "ά",
+	["Έ"] = "έ",
+	["Ή"] = "ή",
+	["Ί"] = "ί",
+	["Ό"] = "ό",
+	["Ύ"] = "ύ",
+	["Ώ"] = "ώ",
+	["Α"] = "α",
+	["Β"] = "β",
+	["Γ"] = "γ",
+	["Δ"] = "δ",
+	["Ε"] = "ε",
+	["Ζ"] = "ζ",
+	["Η"] = "η",
+	["Θ"] = "θ",
+	["Ι"] = "ι",
+	["Κ"] = "κ",
+	["Λ"] = "λ",
+	["Μ"] = "μ",
+	["Ν"] = "ν",
+	["Ξ"] = "ξ",
+	["Ο"] = "ο",
+	["Π"] = "π",
+	["Ρ"] = "ρ",
+	["Σ"] = "σ",
+	["Τ"] = "τ",
+	["Υ"] = "υ",
+	["Φ"] = "φ",
+	["Χ"] = "χ",
+	["Ψ"] = "ψ",
+	["Ω"] = "ω",
+	["Ϊ"] = "ϊ",
+	["Ϋ"] = "ϋ",
+	["Ϙ"] = "ϙ",
+	["Ϛ"] = "ϛ",
+	["Ϝ"] = "ϝ",
+	["Ϟ"] = "ϟ",
+	["Ϡ"] = "ϡ",
+	["Ϣ"] = "ϣ",
+	["Ϥ"] = "ϥ",
+	["Ϧ"] = "ϧ",
+	["Ϩ"] = "ϩ",
+	["Ϫ"] = "ϫ",
+	["Ϭ"] = "ϭ",
+	["Ϯ"] = "ϯ",
+	["ϴ"] = "θ",
+	["Ϸ"] = "ϸ",
+	["Ϲ"] = "ϲ",
+	["Ϻ"] = "ϻ",
+	["Ͻ"] = "ͻ",
+	["Ͼ"] = "ͼ",
+	["Ͽ"] = "ͽ",
+	["Ѐ"] = "ѐ",
+	["Ё"] = "ё",
+	["Ђ"] = "ђ",
+	["Ѓ"] = "ѓ",
+	["Є"] = "є",
+	["Ѕ"] = "ѕ",
+	["І"] = "і",
+	["Ї"] = "ї",
+	["Ј"] = "ј",
+	["Љ"] = "љ",
+	["Њ"] = "њ",
+	["Ћ"] = "ћ",
+	["Ќ"] = "ќ",
+	["Ѝ"] = "ѝ",
+	["Ў"] = "ў",
+	["Џ"] = "џ",
+	["А"] = "а",
+	["Б"] = "б",
+	["В"] = "в",
+	["Г"] = "г",
+	["Д"] = "д",
+	["Е"] = "е",
+	["Ж"] = "ж",
+	["З"] = "з",
+	["И"] = "и",
+	["Й"] = "й",
+	["К"] = "к",
+	["Л"] = "л",
+	["М"] = "м",
+	["Н"] = "н",
+	["О"] = "о",
+	["П"] = "п",
+	["Р"] = "р",
+	["С"] = "с",
+	["Т"] = "т",
+	["У"] = "у",
+	["Ф"] = "ф",
+	["Х"] = "х",
+	["Ц"] = "ц",
+	["Ч"] = "ч",
+	["Ш"] = "ш",
+	["Щ"] = "щ",
+	["Ъ"] = "ъ",
+	["Ы"] = "ы",
+	["Ь"] = "ь",
+	["Э"] = "э",
+	["Ю"] = "ю",
+	["Я"] = "я",
+	["Ѡ"] = "ѡ",
+	["Ѣ"] = "ѣ",
+	["Ѥ"] = "ѥ",
+	["Ѧ"] = "ѧ",
+	["Ѩ"] = "ѩ",
+	["Ѫ"] = "ѫ",
+	["Ѭ"] = "ѭ",
+	["Ѯ"] = "ѯ",
+	["Ѱ"] = "ѱ",
+	["Ѳ"] = "ѳ",
+	["Ѵ"] = "ѵ",
+	["Ѷ"] = "ѷ",
+	["Ѹ"] = "ѹ",
+	["Ѻ"] = "ѻ",
+	["Ѽ"] = "ѽ",
+	["Ѿ"] = "ѿ",
+	["Ҁ"] = "ҁ",
+	["Ҋ"] = "ҋ",
+	["Ҍ"] = "ҍ",
+	["Ҏ"] = "ҏ",
+	["Ґ"] = "ґ",
+	["Ғ"] = "ғ",
+	["Ҕ"] = "ҕ",
+	["Җ"] = "җ",
+	["Ҙ"] = "ҙ",
+	["Қ"] = "қ",
+	["Ҝ"] = "ҝ",
+	["Ҟ"] = "ҟ",
+	["Ҡ"] = "ҡ",
+	["Ң"] = "ң",
+	["Ҥ"] = "ҥ",
+	["Ҧ"] = "ҧ",
+	["Ҩ"] = "ҩ",
+	["Ҫ"] = "ҫ",
+	["Ҭ"] = "ҭ",
+	["Ү"] = "ү",
+	["Ұ"] = "ұ",
+	["Ҳ"] = "ҳ",
+	["Ҵ"] = "ҵ",
+	["Ҷ"] = "ҷ",
+	["Ҹ"] = "ҹ",
+	["Һ"] = "һ",
+	["Ҽ"] = "ҽ",
+	["Ҿ"] = "ҿ",
+	["Ӏ"] = "ӏ",
+	["Ӂ"] = "ӂ",
+	["Ӄ"] = "ӄ",
+	["Ӆ"] = "ӆ",
+	["Ӈ"] = "ӈ",
+	["Ӊ"] = "ӊ",
+	["Ӌ"] = "ӌ",
+	["Ӎ"] = "ӎ",
+	["Ӑ"] = "ӑ",
+	["Ӓ"] = "ӓ",
+	["Ӕ"] = "ӕ",
+	["Ӗ"] = "ӗ",
+	["Ә"] = "ә",
+	["Ӛ"] = "ӛ",
+	["Ӝ"] = "ӝ",
+	["Ӟ"] = "ӟ",
+	["Ӡ"] = "ӡ",
+	["Ӣ"] = "ӣ",
+	["Ӥ"] = "ӥ",
+	["Ӧ"] = "ӧ",
+	["Ө"] = "ө",
+	["Ӫ"] = "ӫ",
+	["Ӭ"] = "ӭ",
+	["Ӯ"] = "ӯ",
+	["Ӱ"] = "ӱ",
+	["Ӳ"] = "ӳ",
+	["Ӵ"] = "ӵ",
+	["Ӷ"] = "ӷ",
+	["Ӹ"] = "ӹ",
+	["Ӻ"] = "ӻ",
+	["Ӽ"] = "ӽ",
+	["Ӿ"] = "ӿ",
+	["Ԁ"] = "ԁ",
+	["Ԃ"] = "ԃ",
+	["Ԅ"] = "ԅ",
+	["Ԇ"] = "ԇ",
+	["Ԉ"] = "ԉ",
+	["Ԋ"] = "ԋ",
+	["Ԍ"] = "ԍ",
+	["Ԏ"] = "ԏ",
+	["Ԑ"] = "ԑ",
+	["Ԓ"] = "ԓ",
+	["Ա"] = "ա",
+	["Բ"] = "բ",
+	["Գ"] = "գ",
+	["Դ"] = "դ",
+	["Ե"] = "ե",
+	["Զ"] = "զ",
+	["Է"] = "է",
+	["Ը"] = "ը",
+	["Թ"] = "թ",
+	["Ժ"] = "ժ",
+	["Ի"] = "ի",
+	["Լ"] = "լ",
+	["Խ"] = "խ",
+	["Ծ"] = "ծ",
+	["Կ"] = "կ",
+	["Հ"] = "հ",
+	["Ձ"] = "ձ",
+	["Ղ"] = "ղ",
+	["Ճ"] = "ճ",
+	["Մ"] = "մ",
+	["Յ"] = "յ",
+	["Ն"] = "ն",
+	["Շ"] = "շ",
+	["Ո"] = "ո",
+	["Չ"] = "չ",
+	["Պ"] = "պ",
+	["Ջ"] = "ջ",
+	["Ռ"] = "ռ",
+	["Ս"] = "ս",
+	["Վ"] = "վ",
+	["Տ"] = "տ",
+	["Ր"] = "ր",
+	["Ց"] = "ց",
+	["Ւ"] = "ւ",
+	["Փ"] = "փ",
+	["Ք"] = "ք",
+	["Օ"] = "օ",
+	["Ֆ"] = "ֆ",
+	["Ⴀ"] = "ⴀ",
+	["Ⴁ"] = "ⴁ",
+	["Ⴂ"] = "ⴂ",
+	["Ⴃ"] = "ⴃ",
+	["Ⴄ"] = "ⴄ",
+	["Ⴅ"] = "ⴅ",
+	["Ⴆ"] = "ⴆ",
+	["Ⴇ"] = "ⴇ",
+	["Ⴈ"] = "ⴈ",
+	["Ⴉ"] = "ⴉ",
+	["Ⴊ"] = "ⴊ",
+	["Ⴋ"] = "ⴋ",
+	["Ⴌ"] = "ⴌ",
+	["Ⴍ"] = "ⴍ",
+	["Ⴎ"] = "ⴎ",
+	["Ⴏ"] = "ⴏ",
+	["Ⴐ"] = "ⴐ",
+	["Ⴑ"] = "ⴑ",
+	["Ⴒ"] = "ⴒ",
+	["Ⴓ"] = "ⴓ",
+	["Ⴔ"] = "ⴔ",
+	["Ⴕ"] = "ⴕ",
+	["Ⴖ"] = "ⴖ",
+	["Ⴗ"] = "ⴗ",
+	["Ⴘ"] = "ⴘ",
+	["Ⴙ"] = "ⴙ",
+	["Ⴚ"] = "ⴚ",
+	["Ⴛ"] = "ⴛ",
+	["Ⴜ"] = "ⴜ",
+	["Ⴝ"] = "ⴝ",
+	["Ⴞ"] = "ⴞ",
+	["Ⴟ"] = "ⴟ",
+	["Ⴠ"] = "ⴠ",
+	["Ⴡ"] = "ⴡ",
+	["Ⴢ"] = "ⴢ",
+	["Ⴣ"] = "ⴣ",
+	["Ⴤ"] = "ⴤ",
+	["Ⴥ"] = "ⴥ",
+	["Ḁ"] = "ḁ",
+	["Ḃ"] = "ḃ",
+	["Ḅ"] = "ḅ",
+	["Ḇ"] = "ḇ",
+	["Ḉ"] = "ḉ",
+	["Ḋ"] = "ḋ",
+	["Ḍ"] = "ḍ",
+	["Ḏ"] = "ḏ",
+	["Ḑ"] = "ḑ",
+	["Ḓ"] = "ḓ",
+	["Ḕ"] = "ḕ",
+	["Ḗ"] = "ḗ",
+	["Ḙ"] = "ḙ",
+	["Ḛ"] = "ḛ",
+	["Ḝ"] = "ḝ",
+	["Ḟ"] = "ḟ",
+	["Ḡ"] = "ḡ",
+	["Ḣ"] = "ḣ",
+	["Ḥ"] = "ḥ",
+	["Ḧ"] = "ḧ",
+	["Ḩ"] = "ḩ",
+	["Ḫ"] = "ḫ",
+	["Ḭ"] = "ḭ",
+	["Ḯ"] = "ḯ",
+	["Ḱ"] = "ḱ",
+	["Ḳ"] = "ḳ",
+	["Ḵ"] = "ḵ",
+	["Ḷ"] = "ḷ",
+	["Ḹ"] = "ḹ",
+	["Ḻ"] = "ḻ",
+	["Ḽ"] = "ḽ",
+	["Ḿ"] = "ḿ",
+	["Ṁ"] = "ṁ",
+	["Ṃ"] = "ṃ",
+	["Ṅ"] = "ṅ",
+	["Ṇ"] = "ṇ",
+	["Ṉ"] = "ṉ",
+	["Ṋ"] = "ṋ",
+	["Ṍ"] = "ṍ",
+	["Ṏ"] = "ṏ",
+	["Ṑ"] = "ṑ",
+	["Ṓ"] = "ṓ",
+	["Ṕ"] = "ṕ",
+	["Ṗ"] = "ṗ",
+	["Ṙ"] = "ṙ",
+	["Ṛ"] = "ṛ",
+	["Ṝ"] = "ṝ",
+	["Ṟ"] = "ṟ",
+	["Ṡ"] = "ṡ",
+	["Ṣ"] = "ṣ",
+	["Ṥ"] = "ṥ",
+	["Ṧ"] = "ṧ",
+	["Ṩ"] = "ṩ",
+	["Ṫ"] = "ṫ",
+	["Ṭ"] = "ṭ",
+	["Ṯ"] = "ṯ",
+	["Ṱ"] = "ṱ",
+	["Ṳ"] = "ṳ",
+	["Ṵ"] = "ṵ",
+	["Ṷ"] = "ṷ",
+	["Ṹ"] = "ṹ",
+	["Ṻ"] = "ṻ",
+	["Ṽ"] = "ṽ",
+	["Ṿ"] = "ṿ",
+	["Ẁ"] = "ẁ",
+	["Ẃ"] = "ẃ",
+	["Ẅ"] = "ẅ",
+	["Ẇ"] = "ẇ",
+	["Ẉ"] = "ẉ",
+	["Ẋ"] = "ẋ",
+	["Ẍ"] = "ẍ",
+	["Ẏ"] = "ẏ",
+	["Ẑ"] = "ẑ",
+	["Ẓ"] = "ẓ",
+	["Ẕ"] = "ẕ",
+	["Ạ"] = "ạ",
+	["Ả"] = "ả",
+	["Ấ"] = "ấ",
+	["Ầ"] = "ầ",
+	["Ẩ"] = "ẩ",
+	["Ẫ"] = "ẫ",
+	["Ậ"] = "ậ",
+	["Ắ"] = "ắ",
+	["Ằ"] = "ằ",
+	["Ẳ"] = "ẳ",
+	["Ẵ"] = "ẵ",
+	["Ặ"] = "ặ",
+	["Ẹ"] = "ẹ",
+	["Ẻ"] = "ẻ",
+	["Ẽ"] = "ẽ",
+	["Ế"] = "ế",
+	["Ề"] = "ề",
+	["Ể"] = "ể",
+	["Ễ"] = "ễ",
+	["Ệ"] = "ệ",
+	["Ỉ"] = "ỉ",
+	["Ị"] = "ị",
+	["Ọ"] = "ọ",
+	["Ỏ"] = "ỏ",
+	["Ố"] = "ố",
+	["Ồ"] = "ồ",
+	["Ổ"] = "ổ",
+	["Ỗ"] = "ỗ",
+	["Ộ"] = "ộ",
+	["Ớ"] = "ớ",
+	["Ờ"] = "ờ",
+	["Ở"] = "ở",
+	["Ỡ"] = "ỡ",
+	["Ợ"] = "ợ",
+	["Ụ"] = "ụ",
+	["Ủ"] = "ủ",
+	["Ứ"] = "ứ",
+	["Ừ"] = "ừ",
+	["Ử"] = "ử",
+	["Ữ"] = "ữ",
+	["Ự"] = "ự",
+	["Ỳ"] = "ỳ",
+	["Ỵ"] = "ỵ",
+	["Ỷ"] = "ỷ",
+	["Ỹ"] = "ỹ",
+	["Ἀ"] = "ἀ",
+	["Ἁ"] = "ἁ",
+	["Ἂ"] = "ἂ",
+	["Ἃ"] = "ἃ",
+	["Ἄ"] = "ἄ",
+	["Ἅ"] = "ἅ",
+	["Ἆ"] = "ἆ",
+	["Ἇ"] = "ἇ",
+	["Ἐ"] = "ἐ",
+	["Ἑ"] = "ἑ",
+	["Ἒ"] = "ἒ",
+	["Ἓ"] = "ἓ",
+	["Ἔ"] = "ἔ",
+	["Ἕ"] = "ἕ",
+	["Ἠ"] = "ἠ",
+	["Ἡ"] = "ἡ",
+	["Ἢ"] = "ἢ",
+	["Ἣ"] = "ἣ",
+	["Ἤ"] = "ἤ",
+	["Ἥ"] = "ἥ",
+	["Ἦ"] = "ἦ",
+	["Ἧ"] = "ἧ",
+	["Ἰ"] = "ἰ",
+	["Ἱ"] = "ἱ",
+	["Ἲ"] = "ἲ",
+	["Ἳ"] = "ἳ",
+	["Ἴ"] = "ἴ",
+	["Ἵ"] = "ἵ",
+	["Ἶ"] = "ἶ",
+	["Ἷ"] = "ἷ",
+	["Ὀ"] = "ὀ",
+	["Ὁ"] = "ὁ",
+	["Ὂ"] = "ὂ",
+	["Ὃ"] = "ὃ",
+	["Ὄ"] = "ὄ",
+	["Ὅ"] = "ὅ",
+	["Ὑ"] = "ὑ",
+	["Ὓ"] = "ὓ",
+	["Ὕ"] = "ὕ",
+	["Ὗ"] = "ὗ",
+	["Ὠ"] = "ὠ",
+	["Ὡ"] = "ὡ",
+	["Ὢ"] = "ὢ",
+	["Ὣ"] = "ὣ",
+	["Ὤ"] = "ὤ",
+	["Ὥ"] = "ὥ",
+	["Ὦ"] = "ὦ",
+	["Ὧ"] = "ὧ",
+	["ᾈ"] = "ᾀ",
+	["ᾉ"] = "ᾁ",
+	["ᾊ"] = "ᾂ",
+	["ᾋ"] = "ᾃ",
+	["ᾌ"] = "ᾄ",
+	["ᾍ"] = "ᾅ",
+	["ᾎ"] = "ᾆ",
+	["ᾏ"] = "ᾇ",
+	["ᾘ"] = "ᾐ",
+	["ᾙ"] = "ᾑ",
+	["ᾚ"] = "ᾒ",
+	["ᾛ"] = "ᾓ",
+	["ᾜ"] = "ᾔ",
+	["ᾝ"] = "ᾕ",
+	["ᾞ"] = "ᾖ",
+	["ᾟ"] = "ᾗ",
+	["ᾨ"] = "ᾠ",
+	["ᾩ"] = "ᾡ",
+	["ᾪ"] = "ᾢ",
+	["ᾫ"] = "ᾣ",
+	["ᾬ"] = "ᾤ",
+	["ᾭ"] = "ᾥ",
+	["ᾮ"] = "ᾦ",
+	["ᾯ"] = "ᾧ",
+	["Ᾰ"] = "ᾰ",
+	["Ᾱ"] = "ᾱ",
+	["Ὰ"] = "ὰ",
+	["Ά"] = "ά",
+	["ᾼ"] = "ᾳ",
+	["Ὲ"] = "ὲ",
+	["Έ"] = "έ",
+	["Ὴ"] = "ὴ",
+	["Ή"] = "ή",
+	["ῌ"] = "ῃ",
+	["Ῐ"] = "ῐ",
+	["Ῑ"] = "ῑ",
+	["Ὶ"] = "ὶ",
+	["Ί"] = "ί",
+	["Ῠ"] = "ῠ",
+	["Ῡ"] = "ῡ",
+	["Ὺ"] = "ὺ",
+	["Ύ"] = "ύ",
+	["Ῥ"] = "ῥ",
+	["Ὸ"] = "ὸ",
+	["Ό"] = "ό",
+	["Ὼ"] = "ὼ",
+	["Ώ"] = "ώ",
+	["ῼ"] = "ῳ",
+	["Ω"] = "ω",
+	["K"] = "k",
+	["Å"] = "å",
+	["Ⅎ"] = "ⅎ",
+	["Ⅰ"] = "ⅰ",
+	["Ⅱ"] = "ⅱ",
+	["Ⅲ"] = "ⅲ",
+	["Ⅳ"] = "ⅳ",
+	["Ⅴ"] = "ⅴ",
+	["Ⅵ"] = "ⅵ",
+	["Ⅶ"] = "ⅶ",
+	["Ⅷ"] = "ⅷ",
+	["Ⅸ"] = "ⅸ",
+	["Ⅹ"] = "ⅹ",
+	["Ⅺ"] = "ⅺ",
+	["Ⅻ"] = "ⅻ",
+	["Ⅼ"] = "ⅼ",
+	["Ⅽ"] = "ⅽ",
+	["Ⅾ"] = "ⅾ",
+	["Ⅿ"] = "ⅿ",
+	["Ↄ"] = "ↄ",
+	["Ⓐ"] = "ⓐ",
+	["Ⓑ"] = "ⓑ",
+	["Ⓒ"] = "ⓒ",
+	["Ⓓ"] = "ⓓ",
+	["Ⓔ"] = "ⓔ",
+	["Ⓕ"] = "ⓕ",
+	["Ⓖ"] = "ⓖ",
+	["Ⓗ"] = "ⓗ",
+	["Ⓘ"] = "ⓘ",
+	["Ⓙ"] = "ⓙ",
+	["Ⓚ"] = "ⓚ",
+	["Ⓛ"] = "ⓛ",
+	["Ⓜ"] = "ⓜ",
+	["Ⓝ"] = "ⓝ",
+	["Ⓞ"] = "ⓞ",
+	["Ⓟ"] = "ⓟ",
+	["Ⓠ"] = "ⓠ",
+	["Ⓡ"] = "ⓡ",
+	["Ⓢ"] = "ⓢ",
+	["Ⓣ"] = "ⓣ",
+	["Ⓤ"] = "ⓤ",
+	["Ⓥ"] = "ⓥ",
+	["Ⓦ"] = "ⓦ",
+	["Ⓧ"] = "ⓧ",
+	["Ⓨ"] = "ⓨ",
+	["Ⓩ"] = "ⓩ",
+	["Ⰰ"] = "ⰰ",
+	["Ⰱ"] = "ⰱ",
+	["Ⰲ"] = "ⰲ",
+	["Ⰳ"] = "ⰳ",
+	["Ⰴ"] = "ⰴ",
+	["Ⰵ"] = "ⰵ",
+	["Ⰶ"] = "ⰶ",
+	["Ⰷ"] = "ⰷ",
+	["Ⰸ"] = "ⰸ",
+	["Ⰹ"] = "ⰹ",
+	["Ⰺ"] = "ⰺ",
+	["Ⰻ"] = "ⰻ",
+	["Ⰼ"] = "ⰼ",
+	["Ⰽ"] = "ⰽ",
+	["Ⰾ"] = "ⰾ",
+	["Ⰿ"] = "ⰿ",
+	["Ⱀ"] = "ⱀ",
+	["Ⱁ"] = "ⱁ",
+	["Ⱂ"] = "ⱂ",
+	["Ⱃ"] = "ⱃ",
+	["Ⱄ"] = "ⱄ",
+	["Ⱅ"] = "ⱅ",
+	["Ⱆ"] = "ⱆ",
+	["Ⱇ"] = "ⱇ",
+	["Ⱈ"] = "ⱈ",
+	["Ⱉ"] = "ⱉ",
+	["Ⱊ"] = "ⱊ",
+	["Ⱋ"] = "ⱋ",
+	["Ⱌ"] = "ⱌ",
+	["Ⱍ"] = "ⱍ",
+	["Ⱎ"] = "ⱎ",
+	["Ⱏ"] = "ⱏ",
+	["Ⱐ"] = "ⱐ",
+	["Ⱑ"] = "ⱑ",
+	["Ⱒ"] = "ⱒ",
+	["Ⱓ"] = "ⱓ",
+	["Ⱔ"] = "ⱔ",
+	["Ⱕ"] = "ⱕ",
+	["Ⱖ"] = "ⱖ",
+	["Ⱗ"] = "ⱗ",
+	["Ⱘ"] = "ⱘ",
+	["Ⱙ"] = "ⱙ",
+	["Ⱚ"] = "ⱚ",
+	["Ⱛ"] = "ⱛ",
+	["Ⱜ"] = "ⱜ",
+	["Ⱝ"] = "ⱝ",
+	["Ⱞ"] = "ⱞ",
+	["Ⱡ"] = "ⱡ",
+	["Ɫ"] = "ɫ",
+	["Ᵽ"] = "ᵽ",
+	["Ɽ"] = "ɽ",
+	["Ⱨ"] = "ⱨ",
+	["Ⱪ"] = "ⱪ",
+	["Ⱬ"] = "ⱬ",
+	["Ⱶ"] = "ⱶ",
+	["Ⲁ"] = "ⲁ",
+	["Ⲃ"] = "ⲃ",
+	["Ⲅ"] = "ⲅ",
+	["Ⲇ"] = "ⲇ",
+	["Ⲉ"] = "ⲉ",
+	["Ⲋ"] = "ⲋ",
+	["Ⲍ"] = "ⲍ",
+	["Ⲏ"] = "ⲏ",
+	["Ⲑ"] = "ⲑ",
+	["Ⲓ"] = "ⲓ",
+	["Ⲕ"] = "ⲕ",
+	["Ⲗ"] = "ⲗ",
+	["Ⲙ"] = "ⲙ",
+	["Ⲛ"] = "ⲛ",
+	["Ⲝ"] = "ⲝ",
+	["Ⲟ"] = "ⲟ",
+	["Ⲡ"] = "ⲡ",
+	["Ⲣ"] = "ⲣ",
+	["Ⲥ"] = "ⲥ",
+	["Ⲧ"] = "ⲧ",
+	["Ⲩ"] = "ⲩ",
+	["Ⲫ"] = "ⲫ",
+	["Ⲭ"] = "ⲭ",
+	["Ⲯ"] = "ⲯ",
+	["Ⲱ"] = "ⲱ",
+	["Ⲳ"] = "ⲳ",
+	["Ⲵ"] = "ⲵ",
+	["Ⲷ"] = "ⲷ",
+	["Ⲹ"] = "ⲹ",
+	["Ⲻ"] = "ⲻ",
+	["Ⲽ"] = "ⲽ",
+	["Ⲿ"] = "ⲿ",
+	["Ⳁ"] = "ⳁ",
+	["Ⳃ"] = "ⳃ",
+	["Ⳅ"] = "ⳅ",
+	["Ⳇ"] = "ⳇ",
+	["Ⳉ"] = "ⳉ",
+	["Ⳋ"] = "ⳋ",
+	["Ⳍ"] = "ⳍ",
+	["Ⳏ"] = "ⳏ",
+	["Ⳑ"] = "ⳑ",
+	["Ⳓ"] = "ⳓ",
+	["Ⳕ"] = "ⳕ",
+	["Ⳗ"] = "ⳗ",
+	["Ⳙ"] = "ⳙ",
+	["Ⳛ"] = "ⳛ",
+	["Ⳝ"] = "ⳝ",
+	["Ⳟ"] = "ⳟ",
+	["Ⳡ"] = "ⳡ",
+	["Ⳣ"] = "ⳣ",
+	["A"] = "a",
+	["B"] = "b",
+	["C"] = "c",
+	["D"] = "d",
+	["E"] = "e",
+	["F"] = "f",
+	["G"] = "g",
+	["H"] = "h",
+	["I"] = "i",
+	["J"] = "j",
+	["K"] = "k",
+	["L"] = "l",
+	["M"] = "m",
+	["N"] = "n",
+	["O"] = "o",
+	["P"] = "p",
+	["Q"] = "q",
+	["R"] = "r",
+	["S"] = "s",
+	["T"] = "t",
+	["U"] = "u",
+	["V"] = "v",
+	["W"] = "w",
+	["X"] = "x",
+	["Y"] = "y",
+	["Z"] = "z",
+	["𐐀"] = "𐐨",
+	["𐐁"] = "𐐩",
+	["𐐂"] = "𐐪",
+	["𐐃"] = "𐐫",
+	["𐐄"] = "𐐬",
+	["𐐅"] = "𐐭",
+	["𐐆"] = "𐐮",
+	["𐐇"] = "𐐯",
+	["𐐈"] = "𐐰",
+	["𐐉"] = "𐐱",
+	["𐐊"] = "𐐲",
+	["𐐋"] = "𐐳",
+	["𐐌"] = "𐐴",
+	["𐐍"] = "𐐵",
+	["𐐎"] = "𐐶",
+	["𐐏"] = "𐐷",
+	["𐐐"] = "𐐸",
+	["𐐑"] = "𐐹",
+	["𐐒"] = "𐐺",
+	["𐐓"] = "𐐻",
+	["𐐔"] = "𐐼",
+	["𐐕"] = "𐐽",
+	["𐐖"] = "𐐾",
+	["𐐗"] = "𐐿",
+	["𐐘"] = "𐑀",
+	["𐐙"] = "𐑁",
+	["𐐚"] = "𐑂",
+	["𐐛"] = "𐑃",
+	["𐐜"] = "𐑄",
+	["𐐝"] = "𐑅",
+	["𐐞"] = "𐑆",
+	["𐐟"] = "𐑇",
+	["𐐠"] = "𐑈",
+	["𐐡"] = "𐑉",
+	["𐐢"] = "𐑊",
+	["𐐣"] = "𐑋",
+	["𐐤"] = "𐑌",
+	["𐐥"] = "𐑍",
+	["𐐦"] = "𐑎",
+	["𐐧"] = "𐑏",
+}
+
diff --git a/rrSavedVarsDefaults.lua b/rrSavedVarsDefaults.lua
new file mode 100644
index 0000000..422bdcf
--- /dev/null
+++ b/rrSavedVarsDefaults.lua
@@ -0,0 +1,63 @@
+RR.SavedVarsDefaults = {
+    ['hostileNameEnabled'] = true,
+    ['hostileLevelEnabled'] = true,
+    ['hostileRangeEnabled'] = true,
+	['hostileDifficultyEnabled'] = true,
+    ['hostileReticleColoringEnabled'] = true,
+    ['hostileRangeColoringEnabled'] = true,
+    ['hostileNameLevelColoringEnabled'] = true,
+    ['hostileOutOfRangeEnabled'] = true,
+    ['hostileOORColor'] = {r=1, g=1, b=0},
+    ['hostileInRangeEnabled'] = true,
+    ['hostileInRangeDistance'] = 28,
+    ['hostileIRColor'] = {r=1, g=0.65, b=0},
+    ['hostileInMeleeRangeEnabled'] = true,
+    ['hostileInMeleeRangeDistance'] = 5,
+    ['hostileIMRColor'] = {r=1, g=0, b=0},
+
+    ['alliesNameEnabled'] = true,
+    ['alliesLevelEnabled'] = true,
+    ['alliesRangeEnabled'] = true,
+    ['alliesReticleColoringEnabled'] = true,
+    ['alliesRangeColoringEnabled'] = true,
+    ['alliesNameLevelColoringEnabled'] = true,
+    ['alliesOutOfRangeEnabled'] = true,
+    ['alliesOORColor'] = {r=0, g=1, b=1},
+    ['alliesInRangeEnabled'] = true,
+    ['alliesInRangeDistance'] = 28,
+    ['alliesIRColor'] = {r=0, g=0, b=1},
+    ['alliesInMeleeRangeEnabled'] = true,
+    ['alliesInMeleeRangeDistance'] = 5,
+    ['alliesIMRColor'] = {r=0, g=1, b=0},
+
+    ['neutralNameEnabled'] = false,
+    ['neutralLevelEnabled'] = false,
+    ['neutralRangeEnabled'] = false,
+	['neutralDifficultyEnabled'] = false,
+    ['neutralReticleColoringEnabled'] = false,
+    ['neutralRangeColoringEnabled'] = false,
+    ['neutralNameLevelColoringEnabled'] = false,
+    ['neutralOutOfRangeEnabled'] = false,
+    ['neutralOORColor'] = {r=1, g=1, b=0},
+    ['neutralInRangeEnabled'] = false,
+    ['neutralInRangeDistance'] = 28,
+    ['neutralIRColor'] = {r=1, g=0.65, b=0},
+    ['neutralInMeleeRangeEnabled'] = false,
+    ['neutralInMeleeRangeDistance'] = 5,
+    ['neutralIMRColor'] = {r=1, g=0, b=0},
+
+    ['npcsNameEnabled'] = false,
+    ['npcsLevelEnabled'] = false,
+    ['npcsRangeEnabled'] = false,
+    ['npcsReticleColoringEnabled'] = false,
+    ['npcsRangeColoringEnabled'] = false,
+    ['npcsNameLevelColoringEnabled'] = false,
+    ['npcsOutOfRangeEnabled'] = false,
+    ['npcsOORColor'] = {r=0, g=1, b=1},
+    ['npcsInRangeEnabled'] = false,
+    ['npcsInRangeDistance'] = 28,
+    ['npcsIRColor'] = {r=0, g=0, b=1},
+    ['npcsInMeleeRangeEnabled'] = false,
+    ['npcsInMeleeRangeDistance'] = 5,
+    ['npcsIMRColor'] = {r=0, g=1, b=0},
+}
\ No newline at end of file