Quantcast

Update to ACE3 r1214 (probably 3 days before the next update).

Ludovicus [07-24-19 - 16:51]
Update to ACE3 r1214 (probably 3 days before the next update).
Filename
libs/AceConfig-3.0/AceConfig-3.0.lua
libs/AceConfig-3.0/AceConfigCmd-3.0/AceConfigCmd-3.0.lua
libs/AceConfig-3.0/AceConfigDialog-3.0/AceConfigDialog-3.0.lua
libs/AceConfig-3.0/AceConfigRegistry-3.0/AceConfigRegistry-3.0.lua
libs/AceDBOptions-3.0/AceDBOptions-3.0.lua
libs/AceEvent-3.0/AceEvent-3.0.lua
libs/AceGUI-3.0/AceGUI-3.0.lua
libs/AceGUI-3.0/widgets/AceGUIContainer-DropDownGroup.lua
libs/AceGUI-3.0/widgets/AceGUIContainer-ScrollFrame.lua
libs/AceGUI-3.0/widgets/AceGUIContainer-TabGroup.lua
libs/AceGUI-3.0/widgets/AceGUIContainer-TreeGroup.lua
libs/AceGUI-3.0/widgets/AceGUIContainer-Window.lua
libs/AceGUI-3.0/widgets/AceGUIWidget-Button.lua
libs/AceGUI-3.0/widgets/AceGUIWidget-CheckBox.lua
libs/AceGUI-3.0/widgets/AceGUIWidget-ColorPicker.lua
libs/AceGUI-3.0/widgets/AceGUIWidget-DropDown-Items.lua
libs/AceGUI-3.0/widgets/AceGUIWidget-DropDown.lua
libs/AceGUI-3.0/widgets/AceGUIWidget-Icon.lua
libs/AceGUI-3.0/widgets/AceGUIWidget-Label.lua
libs/AceGUI-3.0/widgets/AceGUIWidget-MultiLineEditBox.lua
libs/AceGUI-3.0/widgets/AceGUIWidget-Slider.lua
diff --git a/libs/AceConfig-3.0/AceConfig-3.0.lua b/libs/AceConfig-3.0/AceConfig-3.0.lua
index a99ddf7..5071cdc 100755
--- a/libs/AceConfig-3.0/AceConfig-3.0.lua
+++ b/libs/AceConfig-3.0/AceConfig-3.0.lua
@@ -3,7 +3,7 @@
 -- as well as associate it with a slash command.
 -- @class file
 -- @name AceConfig-3.0
--- @release $Id: AceConfig-3.0.lua 1161 2017-08-12 14:30:16Z funkydude $
+-- @release $Id: AceConfig-3.0.lua 1202 2019-05-15 23:11:22Z nevcairiel $

 --[[
 AceConfig-3.0
@@ -45,7 +45,7 @@ local pcall, error, type, pairs = pcall, error, type, pairs
 function AceConfig:RegisterOptionsTable(appName, options, slashcmd)
 	local ok,msg = pcall(cfgreg.RegisterOptionsTable, self, appName, options)
 	if not ok then error(msg, 2) end
-
+
 	if slashcmd then
 		if type(slashcmd) == "table" then
 			for _,cmd in pairs(slashcmd) do
diff --git a/libs/AceConfig-3.0/AceConfigCmd-3.0/AceConfigCmd-3.0.lua b/libs/AceConfig-3.0/AceConfigCmd-3.0/AceConfigCmd-3.0.lua
index 33f9fe1..5113875 100755
--- a/libs/AceConfig-3.0/AceConfigCmd-3.0/AceConfigCmd-3.0.lua
+++ b/libs/AceConfig-3.0/AceConfigCmd-3.0/AceConfigCmd-3.0.lua
@@ -1,7 +1,7 @@
 --- AceConfigCmd-3.0 handles access to an options table through the "command line" interface via the ChatFrames.
 -- @class file
 -- @name AceConfigCmd-3.0
--- @release $Id: AceConfigCmd-3.0.lua 1161 2017-08-12 14:30:16Z funkydude $
+-- @release $Id: AceConfigCmd-3.0.lua 1202 2019-05-15 23:11:22Z nevcairiel $

 --[[
 AceConfigCmd-3.0
@@ -63,7 +63,7 @@ local funcmsg = "expected function or member name"

 -- pickfirstset() - picks the first non-nil value and returns it

-local function pickfirstset(...)
+local function pickfirstset(...)
 	for i=1,select("#",...) do
 		if select(i,...)~=nil then
 			return select(i,...)
@@ -120,7 +120,7 @@ local function callfunction(info, tab, methodtype, ...)
 	info.arg = tab.arg
 	info.option = tab
 	info.type = tab.type
-
+
 	if type(method)=="function" then
 		return method(info, ...)
 	else
@@ -131,7 +131,7 @@ end
 -- do_final() - do the final step (set/execute) along with validation and confirmation

 local function do_final(info, inputpos, tab, methodtype, ...)
-	if info.validate then
+	if info.validate then
 		local res = callmethod(info,inputpos,tab,"validate",...)
 		if type(res)=="string" then
 			usererr(info, inputpos, "'"..strsub(info.input, inputpos).."' - "..res)
@@ -139,7 +139,7 @@ local function do_final(info, inputpos, tab, methodtype, ...)
 		end
 	end
 	-- console ignores .confirm
-
+
 	callmethod(info,inputpos,tab,methodtype, ...)
 end

@@ -152,8 +152,8 @@ local function getparam(info, inputpos, tab, depth, paramname, types, errormsg)
 	if val~=nil then
 		if val==false then
 			val=nil
-		elseif not types[type(val)] then
-			err(info, inputpos, "'" .. paramname.. "' - "..errormsg)
+		elseif not types[type(val)] then
+			err(info, inputpos, "'" .. paramname.. "' - "..errormsg)
 		end
 		info[paramname] = val
 		info[paramname.."_at"] = depth
@@ -166,13 +166,13 @@ end
 local dummytable={}

 local function iterateargs(tab)
-	if not tab.plugins then
-		return pairs(tab.args)
+	if not tab.plugins then
+		return pairs(tab.args)
 	end
-
+
 	local argtabkey,argtab=next(tab.plugins)
 	local v
-
+
 	return function(_, k)
 		while argtab do
 			k,v = next(argtab, k)
@@ -206,18 +206,18 @@ local function showhelp(info, inputpos, tab, depth, noHead)
 	if not noHead then
 		print("|cff33ff99"..info.appName.."|r: Arguments to |cffffff78/"..info[0].."|r "..strsub(info.input,1,inputpos-1)..":")
 	end
-
+
 	local sortTbl = {}	-- [1..n]=name
 	local refTbl = {}   -- [name]=tableref
-
+
 	for k,v in iterateargs(tab) do
 		if not refTbl[k] then	-- a plugin overriding something in .args
 			tinsert(sortTbl, k)
 			refTbl[k] = v
 		end
 	end
-
-	tsort(sortTbl, function(one, two)
+
+	tsort(sortTbl, function(one, two)
 		local o1 = refTbl[one].order or 100
 		local o2 = refTbl[two].order or 100
 		if type(o1) == "function" or type(o1) == "string" then
@@ -240,7 +240,7 @@ local function showhelp(info, inputpos, tab, depth, noHead)
 		if o1==o2 then return tostring(one)<tostring(two) end   -- compare names
 		return o1<o2
 	end)
-
+
 	for i = 1, #sortTbl do
 		local k = sortTbl[i]
 		local v = refTbl[k]
@@ -327,7 +327,7 @@ local function keybindingValidateFunc(text)
 	return s
 end

--- handle() - selfrecursing function that processes input->optiontable
+-- handle() - selfrecursing function that processes input->optiontable
 -- - depth - starts at 0
 -- - retfalse - return false rather than produce error if a match is not found (used by inlined groups)

@@ -346,16 +346,16 @@ local function handle(info, inputpos, tab, depth, retfalse)
 	local oldfunc,oldfunc_at = getparam(info,inputpos,tab,depth,"func",functypes,funcmsg)
 	local oldvalidate,oldvalidate_at = getparam(info,inputpos,tab,depth,"validate",functypes,funcmsg)
 	--local oldconfirm,oldconfirm_at = getparam(info,inputpos,tab,depth,"confirm",functypes,funcmsg)
-
+
 	-------------------------------------------------------------------
 	-- Act according to .type of this table
-
+
 	if tab.type=="group" then
 		------------ group --------------------------------------------
-
+
 		if type(tab.args)~="table" then err(info, inputpos) end
 		if tab.plugins and type(tab.plugins)~="table" then err(info,inputpos) end
-
+
 		-- grab next arg from input
 		local _,nextpos,arg = (info.input):find(" *([^ ]+) *", inputpos)
 		if not arg then
@@ -363,11 +363,11 @@ local function handle(info, inputpos, tab, depth, retfalse)
 			return
 		end
 		nextpos=nextpos+1
-
+
 		-- loop .args and try to find a key with a matching name
 		for k,v in iterateargs(tab) do
 			if not(type(k)=="string" and type(v)=="table" and type(v.type)=="string") then err(info,inputpos, "options table child '"..tostring(k).."' is malformed") end
-
+
 			-- is this child an inline group? if so, traverse into it
 			if v.type=="group" and pickfirstset(v.cmdInline, v.inline, false) then
 				info[depth+1] = k
@@ -383,8 +383,8 @@ local function handle(info, inputpos, tab, depth, retfalse)
 				return handle(info,nextpos,v,depth+1)
 			end
 		end
-
-		-- no match
+
+		-- no match
 		if retfalse then
 			-- restore old infotable members and return false to indicate failure
 			info.handler,info.handler_at = oldhandler,oldhandler_at
@@ -395,23 +395,23 @@ local function handle(info, inputpos, tab, depth, retfalse)
 			--info.confirm,info.confirm_at = oldconfirm,oldconfirm_at
 			return false
 		end
-
+
 		-- couldn't find the command, display error
 		usererr(info, inputpos, "'"..arg.."' - " .. L["unknown argument"])
 		return
 	end
-
+
 	local str = strsub(info.input,inputpos);
-
+
 	if tab.type=="execute" then
 		------------ execute --------------------------------------------
 		do_final(info, inputpos, tab, "func")
-

-
+
+
 	elseif tab.type=="input" then
 		------------ input --------------------------------------------
-
+
 		local res = true
 		if tab.pattern then
 			if not(type(tab.pattern)=="string") then err(info, inputpos, "'pattern' - expected a string") end
@@ -420,11 +420,11 @@ local function handle(info, inputpos, tab, depth, retfalse)
 				return
 			end
 		end
-
+
 		do_final(info, inputpos, tab, "set", str)
-

-
+
+
 	elseif tab.type=="toggle" then
 		------------ toggle --------------------------------------------
 		local b
@@ -444,7 +444,7 @@ local function handle(info, inputpos, tab, depth, retfalse)
 			else
 				b = not b
 			end
-
+
 		elseif str==L["on"] then
 			b = true
 		elseif str==L["off"] then
@@ -459,9 +459,9 @@ local function handle(info, inputpos, tab, depth, retfalse)
 			end
 			return
 		end
-
+
 		do_final(info, inputpos, tab, "set", b)
-
+

 	elseif tab.type=="range" then
 		------------ range --------------------------------------------
@@ -481,21 +481,21 @@ local function handle(info, inputpos, tab, depth, retfalse)
 			usererr(info, inputpos, val.." - "..format(L["must be equal to or lower than %s"], tostring(info.max)) )
 			return
 		end
-
+
 		do_final(info, inputpos, tab, "set", val)

-
+
 	elseif tab.type=="select" then
 		------------ select ------------------------------------
 		local str = strtrim(strlower(str))
-
+
 		local values = tab.values
 		if type(values) == "function" or type(values) == "string" then
 			info.values = values
 			values = callmethod(info, inputpos, tab, "values")
 			info.values = nil
 		end
-
+
 		if str == "" then
 			local b = callmethod(info, inputpos, tab, "get")
 			local fmt = "|cffffff78- [%s]|r %s"
@@ -512,7 +512,7 @@ local function handle(info, inputpos, tab, depth, retfalse)
 		end

 		local ok
-		for k,v in pairs(values) do
+		for k,v in pairs(values) do
 			if strlower(k)==str then
 				str = k	-- overwrite with key (in case of case mismatches)
 				ok = true
@@ -523,20 +523,20 @@ local function handle(info, inputpos, tab, depth, retfalse)
 			usererr(info, inputpos, "'"..str.."' - "..L["unknown selection"])
 			return
 		end
-
+
 		do_final(info, inputpos, tab, "set", str)
-
+
 	elseif tab.type=="multiselect" then
 		------------ multiselect -------------------------------------------
 		local str = strtrim(strlower(str))
-
+
 		local values = tab.values
 		if type(values) == "function" or type(values) == "string" then
 			info.values = values
 			values = callmethod(info, inputpos, tab, "values")
 			info.values = nil
 		end
-
+
 		if str == "" then
 			local fmt = "|cffffff78- [%s]|r %s"
 			local fmt_sel = "|cffffff78- [%s]|r %s |cffff0000*|r"
@@ -550,7 +550,7 @@ local function handle(info, inputpos, tab, depth, retfalse)
 			end
 			return
 		end
-
+
 		--build a table of the selections, checking that they exist
 		--parse for =on =off =default in the process
 		--table will be key = true for options that should toggle, key = [on|off|default] for options to be set
@@ -559,25 +559,25 @@ local function handle(info, inputpos, tab, depth, retfalse)
 			--parse option=on etc
 			local opt, val = v:match('(.+)=(.+)')
 			--get option if toggling
-			if not opt then
-				opt = v
+			if not opt then
+				opt = v
 			end
-
+
 			--check that the opt is valid
 			local ok
-			for k,v in pairs(values) do
+			for k,v in pairs(values) do
 				if strlower(k)==opt then
 					opt = k	-- overwrite with key (in case of case mismatches)
 					ok = true
 					break
 				end
 			end
-
+
 			if not ok then
 				usererr(info, inputpos, "'"..opt.."' - "..L["unknown selection"])
 				return
 			end
-
+
 			--check that if val was supplied it is valid
 			if val then
 				if val == L["on"] or val == L["off"] or (tab.tristate and val == L["default"]) then
@@ -596,14 +596,14 @@ local function handle(info, inputpos, tab, depth, retfalse)
 				sels[opt] = true
 			end
 		end
-
+
 		for opt, val in pairs(sels) do
 			local newval
-
+
 			if (val == true) then
 				--toggle the option
 				local b = callmethod(info, inputpos, tab, "get", opt)
-
+
 				if tab.tristate then
 					--cycle in true, nil, false order
 					if b then
@@ -627,11 +627,11 @@ local function handle(info, inputpos, tab, depth, retfalse)
 					newval = nil
 				end
 			end
-
+
 			do_final(info, inputpos, tab, "set", opt, newval)
 		end
-
-
+
+
 	elseif tab.type=="color" then
 		------------ color --------------------------------------------
 		local str = strtrim(strlower(str))
@@ -639,16 +639,16 @@ local function handle(info, inputpos, tab, depth, retfalse)
 			--TODO: Show current value
 			return
 		end
-
+
 		local r, g, b, a
-
+
 		local hasAlpha = tab.hasAlpha
 		if type(hasAlpha) == "function" or type(hasAlpha) == "string" then
 			info.hasAlpha = hasAlpha
 			hasAlpha = callmethod(info, inputpos, tab, 'hasAlpha')
 			info.hasAlpha = nil
 		end
-
+
 		if hasAlpha then
 			if str:len() == 8 and str:find("^%x*$")  then
 				--parse a hex string
@@ -662,7 +662,7 @@ local function handle(info, inputpos, tab, depth, retfalse)
 				usererr(info, inputpos, format(L["'%s' - expected 'RRGGBBAA' or 'r g b a'."], str))
 				return
 			end
-
+
 			if r >= 0.0 and r <= 1.0 and g >= 0.0 and g <= 1.0 and b >= 0.0 and b <= 1.0 and a >= 0.0 and a <= 1.0 then
 				--values are valid
 			elseif r >= 0 and r <= 255 and g >= 0 and g <= 255 and b >= 0 and b <= 255 and a >= 0 and a <= 255 then
@@ -701,7 +701,7 @@ local function handle(info, inputpos, tab, depth, retfalse)
 				usererr(info, inputpos, format(L["'%s' - values must all be either in the range 0-1 or 0-255."], str))
 			end
 		end
-
+
 		do_final(info, inputpos, tab, "set", r,g,b,a)

 	elseif tab.type=="keybinding" then
@@ -737,7 +737,7 @@ end
 -- MyAddon = LibStub("AceAddon-3.0"):NewAddon("MyAddon", "AceConsole-3.0")
 -- -- Use AceConsole-3.0 to register a Chat Command
 -- MyAddon:RegisterChatCommand("mychat", "ChatCommand")
---
+--
 -- -- Show the GUI if no input is supplied, otherwise handle the chat input.
 -- function MyAddon:ChatCommand(input)
 --   -- Assuming "MyOptions" is the appName of a valid options table
@@ -754,7 +754,7 @@ function AceConfigCmd:HandleCommand(slashcmd, appName, input)
 		error([[Usage: HandleCommand("slashcmd", "appName", "input"): 'appName' - no options table "]]..tostring(appName)..[[" has been registered]], 2)
 	end
 	local options = assert( optgetter("cmd", MAJOR) )
-
+
 	local info = {   -- Don't try to recycle this, it gets handed off to callbacks and whatnot
 		[0] = slashcmd,
 		appName = appName,
@@ -765,7 +765,7 @@ function AceConfigCmd:HandleCommand(slashcmd, appName, input)
 		uiType = "cmd",
 		uiName = MAJOR,
 	}
-
+
 	handle(info, 1, options, 0)  -- (info, inputpos, table, depth)
 end

diff --git a/libs/AceConfig-3.0/AceConfigDialog-3.0/AceConfigDialog-3.0.lua b/libs/AceConfig-3.0/AceConfigDialog-3.0/AceConfigDialog-3.0.lua
index d5cbc45..bcfe071 100755
--- a/libs/AceConfig-3.0/AceConfigDialog-3.0/AceConfigDialog-3.0.lua
+++ b/libs/AceConfig-3.0/AceConfigDialog-3.0/AceConfigDialog-3.0.lua
@@ -1,13 +1,13 @@
 --- AceConfigDialog-3.0 generates AceGUI-3.0 based windows based on option tables.
 -- @class file
 -- @name AceConfigDialog-3.0
--- @release $Id: AceConfigDialog-3.0.lua 1197 2019-01-21 23:41:10Z nevcairiel $
+-- @release $Id: AceConfigDialog-3.0.lua 1212 2019-06-26 05:53:51Z nevcairiel $

 local LibStub = LibStub
 local gui = LibStub("AceGUI-3.0")
 local reg = LibStub("AceConfigRegistry-3.0")

-local MAJOR, MINOR = "AceConfigDialog-3.0", 69
+local MAJOR, MINOR = "AceConfigDialog-3.0", 73
 local AceConfigDialog, oldminor = LibStub:NewLibrary(MAJOR, MINOR)

 if not AceConfigDialog then return end
@@ -56,18 +56,18 @@ local width_multiplier = 170
 --[[
 Group Types
   Tree 	- All Descendant Groups will all become nodes on the tree, direct child options will appear above the tree
-  		- Descendant Groups with inline=true and thier children will not become nodes
+        - Descendant Groups with inline=true and thier children will not become nodes

   Tab	- Direct Child Groups will become tabs, direct child options will appear above the tab control
-  		- Grandchild groups will default to inline unless specified otherwise
+        - Grandchild groups will default to inline unless specified otherwise

   Select- Same as Tab but with entries in a dropdown rather than tabs


   Inline Groups
-  	- Will not become nodes of a select group, they will be effectivly part of thier parent group seperated by a border
-  	- If declared on a direct child of a root node of a select group, they will appear above the group container control
-  	- When a group is displayed inline, all descendants will also be inline members of the group
+    - Will not become nodes of a select group, they will be effectivly part of thier parent group seperated by a border
+    - If declared on a direct child of a root node of a select group, they will appear above the group container control
+    - When a group is displayed inline, all descendants will also be inline members of the group

 ]]

@@ -168,11 +168,11 @@ local allIsLiteral = {
 local function GetOptionsMemberValue(membername, option, options, path, appName, ...)
 	--get definition for the member
 	local inherits = isInherited[membername]
-
+

 	--get the member of the option, traversing the tree if it can be inherited
 	local member
-
+
 	if inherits then
 		local group = options
 		if group[membername] ~= nil then
@@ -187,7 +187,7 @@ local function GetOptionsMemberValue(membername, option, options, path, appName,
 	else
 		member = option[membername]
 	end
-
+
 	--check if we need to call a functon, or if we have a literal value
 	if ( not allIsLiteral[membername] ) and ( type(member) == "function" or ((not stringIsLiteral[membername]) and type(member) == "string") ) then
 		--We have a function to call
@@ -196,13 +196,13 @@ local function GetOptionsMemberValue(membername, option, options, path, appName,
 		local handler
 		local group = options
 		handler = group.handler or handler
-
+
 		for i = 1, #path do
 			group = GetSubOption(group, path[i])
 			info[i] = path[i]
 			handler = group.handler or handler
 		end
-
+
 		info.options = options
 		info.appName = appName
 		info[0] = appName
@@ -212,8 +212,8 @@ local function GetOptionsMemberValue(membername, option, options, path, appName,
 		info.type = option.type
 		info.uiType = "dialog"
 		info.uiName = MAJOR
-
-		local a, b, c ,d
+
+		local a, b, c ,d
 		--using 4 returns for the get of a color type, increase if a type needs more
 		if type(member) == "function" then
 			--Call the function
@@ -230,8 +230,8 @@ local function GetOptionsMemberValue(membername, option, options, path, appName,
 		return a,b,c,d
 	else
 		--The value isnt a function to call, return it
-		return member
-	end
+		return member
+	end
 end

 --[[calls an options function that could be inherited, method name or function ref
@@ -296,7 +296,7 @@ local function compareOptions(a,b)
 		return NameA:upper() < NameB:upper()
 	end
 	if OrderA < 0 then
-		if OrderB > 0 then
+		if OrderB >= 0 then
 			return false
 		end
 	else
@@ -315,7 +315,7 @@ end
 local function BuildSortedOptionsTable(group, keySort, opts, options, path, appName)
 	tempOrders = new()
 	tempNames = new()
-
+
 	if group.plugins then
 		for plugin, t in pairs(group.plugins) do
 			for k, v in pairs(t) do
@@ -331,7 +331,7 @@ local function BuildSortedOptionsTable(group, keySort, opts, options, path, appN
 			end
 		end
 	end
-
+
 	for k, v in pairs(group.args) do
 		if not opts[k] then
 			tinsert(keySort, k)
@@ -362,7 +362,7 @@ local function DelTree(tree)
 end

 local function CleanUserData(widget, event)
-
+
 	local user = widget:GetUserDataTable()

 	if user.path then
@@ -402,7 +402,7 @@ end
 -- - Gets a status table for the given appname and options path.
 -- @param appName The application name as given to `:RegisterOptionsTable()`
 -- @param path The path to the options (a table with all group keys)
--- @return
+-- @return
 function AceConfigDialog:GetStatusTable(appName, path)
 	local status = self.Status

@@ -436,7 +436,7 @@ end
 function AceConfigDialog:SelectGroup(appName, ...)
 	local path = new()

-
+
 	local app = reg:GetOptionsTable(appName)
 	if not app then
 		error(("%s isn't registed with AceConfigRegistry, unable to open config"):format(appName), 2)
@@ -448,9 +448,9 @@ function AceConfigDialog:SelectGroup(appName, ...)
 		status.groups = {}
 	end
 	status = status.groups
-	local treevalue
-	local treestatus
-
+	local treevalue
+	local treestatus
+
 	for n = 1, select("#",...) do
 		local key = select(n, ...)

@@ -477,12 +477,12 @@ function AceConfigDialog:SelectGroup(appName, ...)
 			--the selected group will be overwritten if a child is the final target but still needs to be open
 			treestatus.selected = treevalue
 			treestatus.groups[treevalue] = true
-
+
 		end
-
+
 		--move to the next group in the path
 		group = GetSubOption(group, key)
-		if not group then
+		if not group then
 			break
 		end
 		tinsert(path, key)
@@ -492,10 +492,10 @@ function AceConfigDialog:SelectGroup(appName, ...)
 		end
 		status = status.groups
 	end
-
+
 	del(path)
 	reg:NotifyChange(appName)
-end
+end

 local function OptionOnMouseOver(widget, event)
 	--show a tooltip/set the status bar to the desc text
@@ -510,14 +510,14 @@ local function OptionOnMouseOver(widget, event)
 	local desc = GetOptionsMemberValue("desc", opt, options, path, appName)
 	local usage = GetOptionsMemberValue("usage", opt, options, path, appName)
 	local descStyle = opt.descStyle
-
+
 	if descStyle and descStyle ~= "tooltip" then return end
-
+
 	GameTooltip:SetText(name, 1, .82, 0, true)
-
+
 	if opt.type == "multiselect" then
 		GameTooltip:AddLine(user.text, 0.5, 0.5, 0.8, true)
-	end
+	end
 	if type(desc) == "string" then
 		GameTooltip:AddLine(desc, 1, 1, 1, true)
 	end
@@ -675,7 +675,7 @@ local function ActivateControl(widget, event, ...)
 			end
 		end
 	end
-
+
 	local success
 	if validated and option.type ~= "execute" then
 		if type(validate) == "string" then
@@ -690,7 +690,7 @@ local function ActivateControl(widget, event, ...)
 			if not success then validated = false end
 		end
 	end
-
+
 	local rootframe = user.rootframe
 	if not validated or type(validated) == "string" then
 		if not validated then
@@ -715,7 +715,7 @@ local function ActivateControl(widget, event, ...)
 		del(info)
 		return true
 	else
-
+
 		local confirmText = option.confirmText
 		--call confirm func/method
 		if type(confirm) == "string" then
@@ -756,10 +756,10 @@ local function ActivateControl(widget, event, ...)
 						confirmText = confirmText.." - "..desc
 					end
 				end
-
+
 				local iscustom = user.rootframe:GetUserData("iscustom")
 				local rootframe
-
+
 				if iscustom then
 					rootframe = user.rootframe
 				end
@@ -796,7 +796,7 @@ local function ActivateControl(widget, event, ...)
 		--full refresh of the frame, some controls dont cause this on all events
 		if option.type == "color" then
 			if event == "OnValueConfirmed" then
-
+
 				if iscustom then
 					AceConfigDialog:Open(user.appName, user.rootframe, unpack(basepath))
 				else
@@ -1049,6 +1049,10 @@ local function CreateControl(userControlType, fallbackControlType)
 	return control
 end

+local function sortTblAsStrings(x,y)
+	return tostring(x) < tostring(y) -- Support numbers as keys
+end
+
 --[[
 	options - root of the options table being fed
 	container - widget that controls will be placed in
@@ -1079,7 +1083,7 @@ local function FeedOptions(appName, options,container,rootframe,path,group,inlin
 					else
 						GroupContainer = gui:Create("SimpleGroup")
 					end
-
+
 					GroupContainer.width = "fill"
 					GroupContainer:SetLayout("flow")
 					container:AddChild(GroupContainer)
@@ -1088,14 +1092,14 @@ local function FeedOptions(appName, options,container,rootframe,path,group,inlin
 			else
 				--Control to feed
 				local control
-
+
 				local name = GetOptionsMemberValue("name", v, options, path, appName)
-
+
 				if v.type == "execute" then
-
+
 					local imageCoords = GetOptionsMemberValue("imageCoords",v, options, path, appName)
 					local image, width, height = GetOptionsMemberValue("image",v, options, path, appName)
-
+
 					local iconControl = type(image) == "string" or type(image) == "number"
 					control = CreateControl(v.dialogControl or v.control, iconControl and "Icon" or "Button")
 					if iconControl then
@@ -1125,7 +1129,7 @@ local function FeedOptions(appName, options,container,rootframe,path,group,inlin

 				elseif v.type == "input" then
 					control = CreateControl(v.dialogControl or v.control, v.multiline and "MultiLineEditBox" or "EditBox")
-
+
 					if v.multiline and control.SetNumLines then
 						control:SetNumLines(tonumber(v.multiline) or 4)
 					end
@@ -1144,15 +1148,15 @@ local function FeedOptions(appName, options,container,rootframe,path,group,inlin
 					local value = GetOptionsMemberValue("get",v, options, path, appName)
 					control:SetValue(value)
 					control:SetCallback("OnValueChanged",ActivateControl)
-
+
 					if v.descStyle == "inline" then
 						local desc = GetOptionsMemberValue("desc", v, options, path, appName)
 						control:SetDescription(desc)
 					end
-
+
 					local image = GetOptionsMemberValue("image", v, options, path, appName)
 					local imageCoords = GetOptionsMemberValue("imageCoords", v, options, path, appName)
-
+
 					if type(image) == "string" or type(image) == "number" then
 						if type(imageCoords) == "table" then
 							control:SetImage(image, unpack(imageCoords))
@@ -1175,6 +1179,7 @@ local function FeedOptions(appName, options,container,rootframe,path,group,inlin

 				elseif v.type == "select" then
 					local values = GetOptionsMemberValue("values", v, options, path, appName)
+					local sorting = GetOptionsMemberValue("sorting", v, options, path, appName)
 					if v.style == "radio" then
 						local disabled = CheckOptionDisabled(v, options, path, appName)
 						local width = GetOptionsMemberValue("width",v,options,path,appName)
@@ -1185,12 +1190,14 @@ local function FeedOptions(appName, options,container,rootframe,path,group,inlin

 						control:PauseLayout()
 						local optionValue = GetOptionsMemberValue("get",v, options, path, appName)
-						local t = {}
-						for value, text in pairs(values) do
-							t[#t+1]=value
+						if not sorting then
+							sorting = {}
+							for value, text in pairs(values) do
+								sorting[#sorting+1]=value
+							end
+							tsort(sorting, sortTblAsStrings)
 						end
-						tsort(t)
-						for k, value in ipairs(t) do
+						for k, value in ipairs(sorting) do
 							local text = values[value]
 							local radio = gui:Create("CheckBox")
 							radio:SetLabel(text)
@@ -1224,7 +1231,7 @@ local function FeedOptions(appName, options,container,rootframe,path,group,inlin
 							itemType = nil
 						end
 						control:SetLabel(name)
-						control:SetList(values, nil, itemType)
+						control:SetList(values, sorting, itemType)
 						local value = GetOptionsMemberValue("get",v, options, path, appName)
 						if not values[value] then
 							value = nil
@@ -1236,7 +1243,7 @@ local function FeedOptions(appName, options,container,rootframe,path,group,inlin
 				elseif v.type == "multiselect" then
 					local values = GetOptionsMemberValue("values", v, options, path, appName)
 					local disabled = CheckOptionDisabled(v, options, path, appName)
-
+
 					local valuesort = new()
 					if values then
 						for value, text in pairs(values) do
@@ -1244,7 +1251,7 @@ local function FeedOptions(appName, options,container,rootframe,path,group,inlin
 						end
 					end
 					tsort(valuesort)
-
+
 					local controlType = v.dialogControl or v.control
 					if controlType then
 						control = gui:Create(controlType)
@@ -1313,9 +1320,9 @@ local function FeedOptions(appName, options,container,rootframe,path,group,inlin
 						control:ResumeLayout()
 						control:DoLayout()

-
+
 					end
-
+
 					del(valuesort)

 				elseif v.type == "color" then
@@ -1340,7 +1347,7 @@ local function FeedOptions(appName, options,container,rootframe,path,group,inlin
 				elseif v.type == "description" then
 					control = CreateControl(v.dialogControl or v.control, "Label")
 					control:SetText(name)
-
+
 					local fontSize = GetOptionsMemberValue("fontSize",v, options, path, appName)
 					if fontSize == "medium" then
 						control:SetFontObject(GameFontHighlight)
@@ -1349,10 +1356,10 @@ local function FeedOptions(appName, options,container,rootframe,path,group,inlin
 					else -- small or invalid
 						control:SetFontObject(GameFontHighlightSmall)
 					end
-
+
 					local imageCoords = GetOptionsMemberValue("imageCoords",v, options, path, appName)
 					local image, width, height = GetOptionsMemberValue("image",v, options, path, appName)
-
+
 					if type(image) == "string" or type(image) == "number" then
 						if not width then
 							width = GetOptionsMemberValue("imageWidth",v, options, path, appName)
@@ -1401,7 +1408,7 @@ local function FeedOptions(appName, options,container,rootframe,path,group,inlin
 					InjectInfo(control, options, v, path, rootframe, appName)
 					container:AddChild(control)
 				end
-
+
 			end
 		end
 		tremove(path)
@@ -1426,7 +1433,7 @@ local function TreeOnButtonEnter(widget, event, uniquevalue, button)
 	local option = user.option
 	local path = user.path
 	local appName = user.appName
-
+
 	local feedpath = new()
 	for i = 1, #path do
 		feedpath[i] = path[i]
@@ -1441,8 +1448,9 @@ local function TreeOnButtonEnter(widget, event, uniquevalue, button)

 	local name = GetOptionsMemberValue("name", group, options, feedpath, appName)
 	local desc = GetOptionsMemberValue("desc", group, options, feedpath, appName)
-
+
 	GameTooltip:SetOwner(button, "ANCHOR_NONE")
+	GameTooltip:ClearAllPoints()
 	if widget.type == "TabGroup" then
 		GameTooltip:SetPoint("BOTTOM",button,"TOP")
 	else
@@ -1450,11 +1458,11 @@ local function TreeOnButtonEnter(widget, event, uniquevalue, button)
 	end

 	GameTooltip:SetText(name, 1, .82, 0, true)
-
+
 	if type(desc) == "string" then
 		GameTooltip:AddLine(desc, 1, 1, 1, true)
 	end
-
+
 	GameTooltip:Show()
 end

@@ -1465,25 +1473,25 @@ end

 local function GroupExists(appName, options, path, uniquevalue)
 	if not uniquevalue then return false end
-
+
 	local feedpath = new()
 	local temppath = new()
 	for i = 1, #path do
 		feedpath[i] = path[i]
 	end
-
+
 	BuildPath(feedpath, ("\001"):split(uniquevalue))
-
+
 	local group = options
 	for i = 1, #feedpath do
 		local v = feedpath[i]
 		temppath[i] = v
 		group = GetSubOption(group, v)
-
-		if not group or group.type ~= "group" or CheckOptionHidden(group, options, temppath, appName) then
+
+		if not group or group.type ~= "group" or CheckOptionHidden(group, options, temppath, appName) then
 			del(feedpath)
 			del(temppath)
-			return false
+			return false
 		end
 	end
 	del(feedpath)
@@ -1602,7 +1610,7 @@ function AceConfigDialog:FeedGroup(appName,options,container,rootframe,path, isR
 			tab:SetCallback("OnGroupSelected", GroupSelected)
 			tab:SetCallback("OnTabEnter", TreeOnButtonEnter)
 			tab:SetCallback("OnTabLeave", TreeOnButtonLeave)
-
+
 			local status = AceConfigDialog:GetStatusTable(appName, path)
 			if not status.groups then
 				status.groups = {}
@@ -1622,7 +1630,7 @@ function AceConfigDialog:FeedGroup(appName,options,container,rootframe,path, isR
 					break
 				end
 			end
-
+
 			container:AddChild(tab)

 		elseif grouptype == "select" then
@@ -1645,7 +1653,7 @@ function AceConfigDialog:FeedGroup(appName,options,container,rootframe,path, isR
 			if firstgroup then
 				select:SetGroup((GroupExists(appName, options, path,status.groups.selected) and status.groups.selected) or firstgroup)
 			end
-
+
 			select.width = "fill"
 			select.height = "fill"

@@ -1657,14 +1665,14 @@ function AceConfigDialog:FeedGroup(appName,options,container,rootframe,path, isR
 			local tree = gui:Create("TreeGroup")
 			InjectInfo(tree, options, group, path, rootframe, appName)
 			tree:EnableButtonTooltips(false)
-
+
 			tree.width = "fill"
 			tree.height = "fill"

 			tree:SetCallback("OnGroupSelected", GroupSelected)
 			tree:SetCallback("OnButtonEnter", TreeOnButtonEnter)
 			tree:SetCallback("OnButtonLeave", TreeOnButtonLeave)
-
+
 			local status = AceConfigDialog:GetStatusTable(appName, path)
 			if not status.groups then
 				status.groups = {}
@@ -1705,7 +1713,7 @@ local function RefreshOnUpdate(this)
 		end
 		this.closing[appName] = nil
 	end
-
+
 	if this.closeAll then
 		for k, v in pairs(AceConfigDialog.OpenFrames) do
 			if not this.closeAllOverride[k] then
@@ -1715,7 +1723,7 @@ local function RefreshOnUpdate(this)
 		this.closeAll = nil
 		wipe(this.closeAllOverride)
 	end
-
+
 	for appName in pairs(this.apps) do
 		if AceConfigDialog.OpenFrames[appName] then
 			local user = AceConfigDialog.OpenFrames[appName]:GetUserDataTable()
@@ -1800,10 +1808,10 @@ function AceConfigDialog:Open(appName, container, ...)
 	local options = app("dialog", MAJOR)

 	local f
-
+
 	local path = new()
 	local name = GetOptionsMemberValue("name", options, options, path, appName)
-
+
 	--If an optional path is specified add it to the path table before feeding the options
 	--as container is optional as well it may contain the first element of the path
 	if type(container) == "string" then
@@ -1813,7 +1821,7 @@ function AceConfigDialog:Open(appName, container, ...)
 	for n = 1, select("#",...) do
 		tinsert(path, (select(n, ...)))
 	end
-
+
 	local option = options
 	if type(container) == "table" and container.type == "BlizOptionsGroup" and #path > 0 then
 		for i = 1, #path do
@@ -1821,7 +1829,7 @@ function AceConfigDialog:Open(appName, container, ...)
 		end
 		name = format("%s - %s", name, GetOptionsMemberValue("name", option, options, path, appName))
 	end
-
+
 	--if a container is given feed into that
 	if container then
 		f = container
@@ -1915,19 +1923,19 @@ end
 -- @param name A descriptive name to display in the options tree (defaults to appName)
 -- @param parent The parent to use in the interface options tree.
 -- @param ... The path in the options table to feed into the interface options panel.
--- @return The reference to the frame registered into the Interface Options.
+-- @return The reference to the frame registered into the Interface Options.
 function AceConfigDialog:AddToBlizOptions(appName, name, parent, ...)
 	local BlizOptions = AceConfigDialog.BlizOptions
-
+
 	local key = appName
 	for n = 1, select("#", ...) do
 		key = key.."\001"..select(n, ...)
 	end
-
+
 	if not BlizOptions[appName] then
 		BlizOptions[appName] = {}
 	end
-
+
 	if not BlizOptions[appName][key] then
 		local group = gui:Create("BlizOptionsGroup")
 		BlizOptions[appName][key] = group
diff --git a/libs/AceConfig-3.0/AceConfigRegistry-3.0/AceConfigRegistry-3.0.lua b/libs/AceConfig-3.0/AceConfigRegistry-3.0/AceConfigRegistry-3.0.lua
index 1e40811..f8d9225 100755
--- a/libs/AceConfig-3.0/AceConfigRegistry-3.0/AceConfigRegistry-3.0.lua
+++ b/libs/AceConfig-3.0/AceConfigRegistry-3.0/AceConfigRegistry-3.0.lua
@@ -4,14 +4,14 @@
 -- * Valid **uiTypes**: "cmd", "dropdown", "dialog". This is verified by the library at call time. \\
 -- * The **uiName** field is expected to contain the full name of the calling addon, including version, e.g. "FooBar-1.0". This is verified by the library at call time.\\
 -- * The **appName** field is the options table name as given at registration time \\
---
+--
 -- :IterateOptionsTables() (and :GetOptionsTable() if only given one argument) return a function reference that the requesting config handling addon must call with valid "uiType", "uiName".
 -- @class file
 -- @name AceConfigRegistry-3.0
--- @release $Id: AceConfigRegistry-3.0.lua 1193 2018-08-02 12:24:37Z funkydude $
+-- @release $Id: AceConfigRegistry-3.0.lua 1207 2019-06-23 12:08:33Z nevcairiel $
 local CallbackHandler = LibStub("CallbackHandler-1.0")

-local MAJOR, MINOR = "AceConfigRegistry-3.0", 18
+local MAJOR, MINOR = "AceConfigRegistry-3.0", 20
 local AceConfigRegistry = LibStub:NewLibrary(MAJOR, MINOR)

 if not AceConfigRegistry then return end
@@ -33,7 +33,7 @@ local error, assert = error, assert


 AceConfigRegistry.validated = {
-	-- list of options table names ran through :ValidateOptionsTable automatically.
+	-- list of options table names ran through :ValidateOptionsTable automatically.
 	-- CLEARED ON PURPOSE, since newer versions may have newer validators
 	cmd = {},
 	dropdown = {},
@@ -94,13 +94,20 @@ local basekeys={
 }

 local typedkeys={
-	header={},
+	header={
+		control=optstring,
+		dialogControl=optstring,
+		dropdownControl=optstring,
+	},
 	description={
 		image=optstringnumberfunc,
 		imageCoords=optmethodtable,
 		imageHeight=optnumber,
 		imageWidth=optnumber,
 		fontSize=optstringfunc,
+		control=optstring,
+		dialogControl=optstring,
+		dropdownControl=optstring,
 	},
 	group={
 		args=istable,
@@ -117,6 +124,9 @@ local typedkeys={
 		imageCoords=optmethodtable,
 		imageHeight=optnumber,
 		imageWidth=optnumber,
+		control=optstring,
+		dialogControl=optstring,
+		dropdownControl=optstring,
 	},
 	input={
 		pattern=optstring,
@@ -130,6 +140,9 @@ local typedkeys={
 		tristate=optbool,
 		image=optstringnumberfunc,
 		imageCoords=optmethodtable,
+		control=optstring,
+		dialogControl=optstring,
+		dropdownControl=optstring,
 	},
 	tristate={
 	},
@@ -141,12 +154,16 @@ local typedkeys={
 		step=optnumber,
 		bigStep=optnumber,
 		isPercent=optbool,
+		control=optstring,
+		dialogControl=optstring,
+		dropdownControl=optstring,
 	},
 	select={
 		values=ismethodtable,
+		sorting=optmethodtable,
 		style={
-			["nil"]=true,
-			["string"]={dropdown=true,radio=true},
+			["nil"]=true,
+			["string"]={dropdown=true,radio=true},
 			_="string: 'dropdown' or 'radio'"
 		},
 		control=optstring,
@@ -164,9 +181,14 @@ local typedkeys={
 	},
 	color={
 		hasAlpha=optmethodbool,
+		control=optstring,
+		dialogControl=optstring,
+		dropdownControl=optstring,
 	},
 	keybinding={
-		-- TODO
+		control=optstring,
+		dialogControl=optstring,
+		dropdownControl=optstring,
 	},
 }

@@ -203,13 +225,13 @@ local function validate(options,errlvl,...)
 	if type(options.type)~="string" then
 		err(".type: expected a string, got a "..type(options.type), errlvl,...)
 	end
-
+
 	-- get type and 'typedkeys' member
 	local tk = typedkeys[options.type]
 	if not tk then
 		err(".type: unknown type '"..options.type.."'", errlvl,...)
 	end
-
+
 	-- make sure that all options[] are known parameters
 	for k,v in pairs(options) do
 		if not (tk[k] or basekeys[k]) then
@@ -302,7 +324,7 @@ function AceConfigRegistry:RegisterOptionsTable(appName, options, skipValidation
 				AceConfigRegistry:ValidateOptionsTable(options, appName, errlvl)	-- upgradable
 				AceConfigRegistry.validated[uiType][appName] = true
 			end
-			return options
+			return options
 		end
 	elseif type(options)=="function" then
 		AceConfigRegistry.tables[appName] = function(uiType, uiName, errlvl)
@@ -340,7 +362,7 @@ function AceConfigRegistry:GetOptionsTable(appName, uiType, uiName)
 	if not f then
 		return nil
 	end
-
+
 	if uiType then
 		return f(uiType,uiName,1)	-- get the table for us
 	else
diff --git a/libs/AceDBOptions-3.0/AceDBOptions-3.0.lua b/libs/AceDBOptions-3.0/AceDBOptions-3.0.lua
index 7477698..6ed3103 100755
--- a/libs/AceDBOptions-3.0/AceDBOptions-3.0.lua
+++ b/libs/AceDBOptions-3.0/AceDBOptions-3.0.lua
@@ -1,7 +1,7 @@
 --- AceDBOptions-3.0 provides a universal AceConfig options screen for managing AceDB-3.0 profiles.
 -- @class file
 -- @name AceDBOptions-3.0
--- @release $Id: AceDBOptions-3.0.lua 1193 2018-08-02 12:24:37Z funkydude $
+-- @release $Id: AceDBOptions-3.0.lua 1202 2019-05-15 23:11:22Z nevcairiel $
 local ACEDBO_MAJOR, ACEDBO_MINOR = "AceDBOptions-3.0", 15
 local AceDBOptions = LibStub:NewLibrary(ACEDBO_MAJOR, ACEDBO_MINOR)

@@ -240,22 +240,22 @@ local tmpprofiles = {}
 -- @return Hashtable of all profiles with the internal name as keys and the display name as value.
 local function getProfileList(db, common, nocurrent)
 	local profiles = {}
-
+
 	-- copy existing profiles into the table
 	local currentProfile = db:GetCurrentProfile()
-	for i,v in pairs(db:GetProfiles(tmpprofiles)) do
-		if not (nocurrent and v == currentProfile) then
-			profiles[v] = v
-		end
+	for i,v in pairs(db:GetProfiles(tmpprofiles)) do
+		if not (nocurrent and v == currentProfile) then
+			profiles[v] = v
+		end
 	end
-
+
 	-- add our default profiles to choose from ( or rename existing profiles)
 	for k,v in pairs(defaultProfiles) do
 		if (common or profiles[k]) and not (nocurrent and k == currentProfile) then
 			profiles[k] = v
 		end
 	end
-
+
 	return profiles
 end

@@ -280,11 +280,11 @@ function OptionsHandlerPrototype:GetCurrentProfile()
 	return self.db:GetCurrentProfile()
 end

---[[
+--[[
 	List all active profiles
 	you can control the output with the .arg variable
 	currently four modes are supported
-
+
 	(empty) - return all available profiles
 	"nocurrent" - returns all available profiles except the currently active profile
 	"common" - returns all avaialble profiles + some commonly used profiles ("char - realm", "realm", "class", "Default")
@@ -302,7 +302,7 @@ function OptionsHandlerPrototype:ListProfiles(info)
 	else
 		profiles = getProfileList(self.db)
 	end
-
+
 	return profiles
 end

@@ -336,19 +336,19 @@ local function getOptionsHandler(db, noDefaultProfiles)
 	if not defaultProfiles then
 		generateDefaultProfiles(db)
 	end
-
+
 	local handler = AceDBOptions.handlers[db] or { db = db, noDefaultProfiles = noDefaultProfiles }
-
+
 	for k,v in pairs(OptionsHandlerPrototype) do
 		handler[k] = v
 	end
-
+
 	AceDBOptions.handlers[db] = handler
 	return handler
 end

 --[[
-	the real options table
+	the real options table
 ]]
 local optionsTable = {
 	desc = {
@@ -436,7 +436,7 @@ local optionsTable = {
 --- Get/Create a option table that you can use in your addon to control the profiles of AceDB-3.0.
 -- @param db The database object to create the options table for.
 -- @return The options table to be used in AceConfig-3.0
--- @usage
+-- @usage
 -- -- Assuming `options` is your top-level options table and `self.db` is your database:
 -- options.args.profiles = LibStub("AceDBOptions-3.0"):GetOptionsTable(self.db)
 function AceDBOptions:GetOptionsTable(db, noDefaultProfiles)
@@ -445,7 +445,7 @@ function AceDBOptions:GetOptionsTable(db, noDefaultProfiles)
 			name = L["profiles"],
 			desc = L["profiles_sub"],
 		}
-
+
 	tbl.handler = getOptionsHandler(db, noDefaultProfiles)
 	tbl.args = optionsTable

diff --git a/libs/AceEvent-3.0/AceEvent-3.0.lua b/libs/AceEvent-3.0/AceEvent-3.0.lua
index bbf55c2..7ccd880 100755
--- a/libs/AceEvent-3.0/AceEvent-3.0.lua
+++ b/libs/AceEvent-3.0/AceEvent-3.0.lua
@@ -2,14 +2,14 @@
 -- All dispatching is done using **CallbackHandler-1.0**. AceEvent is a simple wrapper around
 -- CallbackHandler, and dispatches all game events or addon message to the registrees.
 --
--- **AceEvent-3.0** can be embeded into your addon, either explicitly by calling AceEvent:Embed(MyAddon) or by
+-- **AceEvent-3.0** can be embeded into your addon, either explicitly by calling AceEvent:Embed(MyAddon) or by
 -- specifying it as an embeded library in your AceAddon. All functions will be available on your addon object
 -- and can be accessed directly, without having to explicitly call AceEvent itself.\\
 -- It is recommended to embed AceEvent, otherwise you'll have to specify a custom `self` on all calls you
 -- make into AceEvent.
 -- @class file
 -- @name AceEvent-3.0
--- @release $Id: AceEvent-3.0.lua 1161 2017-08-12 14:30:16Z funkydude $
+-- @release $Id: AceEvent-3.0.lua 1202 2019-05-15 23:11:22Z nevcairiel $
 local CallbackHandler = LibStub("CallbackHandler-1.0")

 local MAJOR, MINOR = "AceEvent-3.0", 4
@@ -25,22 +25,22 @@ AceEvent.embeds = AceEvent.embeds or {} -- what objects embed this lib

 -- APIs and registry for blizzard events, using CallbackHandler lib
 if not AceEvent.events then
-	AceEvent.events = CallbackHandler:New(AceEvent,
+	AceEvent.events = CallbackHandler:New(AceEvent,
 		"RegisterEvent", "UnregisterEvent", "UnregisterAllEvents")
 end

-function AceEvent.events:OnUsed(target, eventname)
+function AceEvent.events:OnUsed(target, eventname)
 	AceEvent.frame:RegisterEvent(eventname)
 end

-function AceEvent.events:OnUnused(target, eventname)
+function AceEvent.events:OnUnused(target, eventname)
 	AceEvent.frame:UnregisterEvent(eventname)
 end


 -- APIs and registry for IPC messages, using CallbackHandler lib
 if not AceEvent.messages then
-	AceEvent.messages = CallbackHandler:New(AceEvent,
+	AceEvent.messages = CallbackHandler:New(AceEvent,
 		"RegisterMessage", "UnregisterMessage", "UnregisterAllMessages"
 	)
 	AceEvent.SendMessage = AceEvent.messages.Fire
diff --git a/libs/AceGUI-3.0/AceGUI-3.0.lua b/libs/AceGUI-3.0/AceGUI-3.0.lua
index a31a85a..66a5529 100755
--- a/libs/AceGUI-3.0/AceGUI-3.0.lua
+++ b/libs/AceGUI-3.0/AceGUI-3.0.lua
@@ -1,6 +1,6 @@
 --- **AceGUI-3.0** provides access to numerous widgets which can be used to create GUIs.
 -- AceGUI is used by AceConfigDialog to create the option GUIs, but you can use it by itself
--- to create any custom GUI. There are more extensive examples in the test suite in the Ace3
+-- to create any custom GUI. There are more extensive examples in the test suite in the Ace3
 -- stand-alone distribution.
 --
 -- **Note**: When using AceGUI-3.0 directly, please do not modify the frames of the widgets directly,
@@ -24,7 +24,7 @@
 -- f:AddChild(btn)
 -- @class file
 -- @name AceGUI-3.0
--- @release $Id: AceGUI-3.0.lua 1193 2018-08-02 12:24:37Z funkydude $
+-- @release $Id: AceGUI-3.0.lua 1202 2019-05-15 23:11:22Z nevcairiel $
 local ACEGUI_MAJOR, ACEGUI_MINOR = "AceGUI-3.0", 36
 local AceGUI, oldminor = LibStub:NewLibrary(ACEGUI_MAJOR, ACEGUI_MINOR)

@@ -51,7 +51,7 @@ AceGUI.LayoutRegistry = AceGUI.LayoutRegistry or {}
 AceGUI.WidgetBase = AceGUI.WidgetBase or {}
 AceGUI.WidgetContainerBase = AceGUI.WidgetContainerBase or {}
 AceGUI.WidgetVersions = AceGUI.WidgetVersions or {}
-
+
 -- local upvalues
 local WidgetRegistry = AceGUI.WidgetRegistry
 local LayoutRegistry = AceGUI.LayoutRegistry
@@ -79,7 +79,7 @@ do
 	-- Internal Storage of the objects changed, from an array table
 	-- to a hash table, and additionally we introduced versioning on
 	-- the widgets which would discard all widgets from a pre-29 version
-	-- anyway, so we just clear the storage now, and don't try to
+	-- anyway, so we just clear the storage now, and don't try to
 	-- convert the storage tables to the new format.
 	-- This should generally not cause *many* widgets to end up in trash,
 	-- since once dialogs are opened, all addons should be loaded already
@@ -89,7 +89,7 @@ do
 	if oldminor and oldminor < 29 and AceGUI.objPools then
 		AceGUI.objPools = nil
 	end
-
+
 	AceGUI.objPools = AceGUI.objPools or {}
 	local objPools = AceGUI.objPools
 	--Returns a new instance, if none are available either returns a new table or calls the given contructor
@@ -97,11 +97,11 @@ do
 		if not WidgetRegistry[type] then
 			error("Attempt to instantiate unknown widget type", 2)
 		end
-
+
 		if not objPools[type] then
 			objPools[type] = {}
 		end
-
+
 		local newObj = next(objPools[type])
 		if not newObj then
 			newObj = WidgetRegistry[type]()
@@ -151,12 +151,12 @@ function AceGUI:Create(type)
 			widget.OnAcquire = widget.Aquire
 			widget.Aquire = nil
 		end
-
+
 		if rawget(widget, "Release") then
-			widget.OnRelease = rawget(widget, "Release")
+			widget.OnRelease = rawget(widget, "Release")
 			widget.Release = nil
 		end
-
+
 		if widget.OnAcquire then
 			widget:OnAcquire()
 		else
@@ -238,18 +238,18 @@ end
 --[[
 	Widgets must provide the following functions
 		OnAcquire() - Called when the object is acquired, should set everything to a default hidden state
-
+
 	And the following members
 		frame - the frame or derivitive object that will be treated as the widget for size and anchoring purposes
 		type - the type of the object, same as the name given to :RegisterWidget()
-
+
 	Widgets contain a table called userdata, this is a safe place to store data associated with the wigdet
 	It will be cleared automatically when a widget is released
 	Placing values directly into a widget object should be avoided
-
+
 	If the Widget can act as a container for other Widgets the following
 		content - frame or derivitive that children will be anchored to
-
+
 	The Widget can supply the following Optional Members
 		:OnRelease() - Called when the object is Released, should remove any additional anchors and clear any data
 		:OnWidthSet(width) - Called when the width of the widget is changed
@@ -265,21 +265,21 @@ end
 -- Widget Base Template --
 --------------------------
 do
-	local WidgetBase = AceGUI.WidgetBase
-
+	local WidgetBase = AceGUI.WidgetBase
+
 	WidgetBase.SetParent = function(self, parent)
 		local frame = self.frame
 		frame:SetParent(nil)
 		frame:SetParent(parent.content)
 		self.parent = parent
 	end
-
+
 	WidgetBase.SetCallback = function(self, name, func)
 		if type(func) == "function" then
 			self.events[name] = func
 		end
 	end
-
+
 	WidgetBase.Fire = function(self, name, ...)
 		if self.events[name] then
 			local success, ret = safecall(self.events[name], self, name, ...)
@@ -288,7 +288,7 @@ do
 			end
 		end
 	end
-
+
 	WidgetBase.SetWidth = function(self, width)
 		self.frame:SetWidth(width)
 		self.frame.width = width
@@ -296,7 +296,7 @@ do
 			self:OnWidthSet(width)
 		end
 	end
-
+
 	WidgetBase.SetRelativeWidth = function(self, width)
 		if width <= 0 or width > 1 then
 			error(":SetRelativeWidth(width): Invalid relative width.", 2)
@@ -304,7 +304,7 @@ do
 		self.relWidth = width
 		self.width = "relative"
 	end
-
+
 	WidgetBase.SetHeight = function(self, height)
 		self.frame:SetHeight(height)
 		self.frame.height = height
@@ -312,7 +312,7 @@ do
 			self:OnHeightSet(height)
 		end
 	end
-
+
 	--[[ WidgetBase.SetRelativeHeight = function(self, height)
 		if height <= 0 or height > 1 then
 			error(":SetRelativeHeight(height): Invalid relative height.", 2)
@@ -324,47 +324,47 @@ do
 	WidgetBase.IsVisible = function(self)
 		return self.frame:IsVisible()
 	end
-
+
 	WidgetBase.IsShown= function(self)
 		return self.frame:IsShown()
 	end
-
+
 	WidgetBase.Release = function(self)
 		AceGUI:Release(self)
 	end
-
+
 	WidgetBase.SetPoint = function(self, ...)
 		return self.frame:SetPoint(...)
 	end
-
+
 	WidgetBase.ClearAllPoints = function(self)
 		return self.frame:ClearAllPoints()
 	end
-
+
 	WidgetBase.GetNumPoints = function(self)
 		return self.frame:GetNumPoints()
 	end
-
+
 	WidgetBase.GetPoint = function(self, ...)
 		return self.frame:GetPoint(...)
-	end
-
+	end
+
 	WidgetBase.GetUserDataTable = function(self)
 		return self.userdata
 	end
-
+
 	WidgetBase.SetUserData = function(self, key, value)
 		self.userdata[key] = value
 	end
-
+
 	WidgetBase.GetUserData = function(self, key)
 		return self.userdata[key]
 	end
-
+
 	WidgetBase.IsFullHeight = function(self)
 		return self.height == "fill"
 	end
-
+
 	WidgetBase.SetFullHeight = function(self, isFull)
 		if isFull then
 			self.height = "fill"
@@ -372,11 +372,11 @@ do
 			self.height = nil
 		end
 	end
-
+
 	WidgetBase.IsFullWidth = function(self)
 		return self.width == "fill"
 	end
-
+
 	WidgetBase.SetFullWidth = function(self, isFull)
 		if isFull then
 			self.width = "fill"
@@ -384,29 +384,29 @@ do
 			self.width = nil
 		end
 	end
-
+
 --	local function LayoutOnUpdate(this)
 --		this:SetScript("OnUpdate",nil)
 --		this.obj:PerformLayout()
 --	end
-
+
 	local WidgetContainerBase = AceGUI.WidgetContainerBase
-
+
 	WidgetContainerBase.PauseLayout = function(self)
 		self.LayoutPaused = true
 	end
-
+
 	WidgetContainerBase.ResumeLayout = function(self)
 		self.LayoutPaused = nil
 	end
-
+
 	WidgetContainerBase.PerformLayout = function(self)
 		if self.LayoutPaused then
 			return
 		end
 		safecall(self.LayoutFunc, self.content, self.children)
 	end
-
+
 	--call this function to layout, makes sure layed out objects get a frame to get sizes etc
 	WidgetContainerBase.DoLayout = function(self)
 		self:PerformLayout()
@@ -414,7 +414,7 @@ do
 --			self.frame:SetScript("OnUpdate", LayoutOnUpdate)
 --		end
 	end
-
+
 	WidgetContainerBase.AddChild = function(self, child, beforeWidget)
 		if beforeWidget then
 			local siblingIndex = 1
@@ -422,7 +422,7 @@ do
 				if widget == beforeWidget then
 					break
 				end
-				siblingIndex = siblingIndex + 1
+				siblingIndex = siblingIndex + 1
 			end
 			tinsert(self.children, siblingIndex, child)
 		else
@@ -432,7 +432,7 @@ do
 		child.frame:Show()
 		self:DoLayout()
 	end
-
+
 	WidgetContainerBase.AddChildren = function(self, ...)
 		for i = 1, select("#", ...) do
 			local child = select(i, ...)
@@ -442,7 +442,7 @@ do
 		end
 		self:DoLayout()
 	end
-
+
 	WidgetContainerBase.ReleaseChildren = function(self)
 		local children = self.children
 		for i = 1,#children do
@@ -450,7 +450,7 @@ do
 			children[i] = nil
 		end
 	end
-
+
 	WidgetContainerBase.SetLayout = function(self, Layout)
 		self.LayoutFunc = AceGUI:GetLayout(Layout)
 	end
@@ -474,7 +474,7 @@ do
 			end
 		end
 	end
-
+
 	local function ContentResize(this)
 		if this:GetWidth() and this:GetHeight() then
 			this.width = this:GetWidth()
@@ -486,7 +486,7 @@ do
 	setmetatable(WidgetContainerBase, {__index=WidgetBase})

 	--One of these function should be called on each Widget Instance as part of its creation process
-
+
 	--- Register a widget-class as a container for newly created widgets.
 	-- @param widget The widget class
 	function AceGUI:RegisterAsContainer(widget)
@@ -502,7 +502,7 @@ do
 		widget:SetLayout("List")
 		return widget
 	end
-
+
 	--- Register a widget-class as a widget.
 	-- @param widget The widget class
 	function AceGUI:RegisterAsWidget(widget)
@@ -529,11 +529,11 @@ end
 -- @param Version The version of the widget
 function AceGUI:RegisterWidgetType(Name, Constructor, Version)
 	assert(type(Constructor) == "function")
-	assert(type(Version) == "number")
-
+	assert(type(Version) == "number")
+
 	local oldVersion = WidgetVersions[Name]
 	if oldVersion and oldVersion >= Version then return end
-
+
 	WidgetVersions[Name] = Version
 	WidgetRegistry[Name] = Constructor
 end
@@ -602,7 +602,7 @@ AceGUI:RegisterLayout("List",
 		local width = content.width or content:GetWidth() or 0
 		for i = 1, #children do
 			local child = children[i]
-
+
 			local frame = child.frame
 			frame:ClearAllPoints()
 			frame:Show()
@@ -611,22 +611,22 @@ AceGUI:RegisterLayout("List",
 			else
 				frame:SetPoint("TOPLEFT", children[i-1].frame, "BOTTOMLEFT")
 			end
-
+
 			if child.width == "fill" then
 				child:SetWidth(width)
 				frame:SetPoint("RIGHT", content)
-
+
 				if child.DoLayout then
 					child:DoLayout()
 				end
 			elseif child.width == "relative" then
 				child:SetWidth(width * child.relWidth)
-
+
 				if child.DoLayout then
 					child:DoLayout()
 				end
 			end
-
+
 			height = height + (frame.height or frame:GetHeight() or 0)
 		end
 		safecall(content.obj.LayoutFinished, content.obj, nil, height)
@@ -661,17 +661,17 @@ AceGUI:RegisterLayout("Flow",
 		--height of the current row
 		local rowheight = 0
 		local rowoffset = 0
-
+
 		local width = content.width or content:GetWidth() or 0
-
+
 		--control at the start of the row
 		local rowstart
 		local rowstartoffset
 		local isfullheight
-
+
 		local frameoffset
 		local lastframeoffset
-		local oversize
+		local oversize
 		for i = 1, #children do
 			local child = children[i]
 			oversize = nil
@@ -679,17 +679,17 @@ AceGUI:RegisterLayout("Flow",
 			local frameheight = frame.height or frame:GetHeight() or 0
 			local framewidth = frame.width or frame:GetWidth() or 0
 			lastframeoffset = frameoffset
-			-- HACK: Why did we set a frameoffset of (frameheight / 2) ?
+			-- HACK: Why did we set a frameoffset of (frameheight / 2) ?
 			-- That was moving all widgets half the widgets size down, is that intended?
 			-- Actually, it seems to be neccessary for many cases, we'll leave it in for now.
 			-- If widgets seem to anchor weirdly with this, provide a valid alignoffset for them.
 			-- TODO: Investigate moar!
 			frameoffset = child.alignoffset or (frameheight / 2)
-
+
 			if child.width == "relative" then
 				framewidth = width * child.relWidth
 			end
-
+
 			frame:Show()
 			frame:ClearAllPoints()
 			if i == 1 then
@@ -728,11 +728,11 @@ AceGUI:RegisterLayout("Flow",
 				else
 					--handles cases where the new height is higher than either control because of the offsets
 					--math.max(rowheight-rowoffset+frameoffset, frameheight-frameoffset+rowoffset)
-
+
 					--offset is always the larger of the two offsets
 					rowoffset = math_max(rowoffset, frameoffset)
 					rowheight = math_max(rowheight, rowoffset + (frameheight / 2))
-
+
 					frame:SetPoint("TOPLEFT", children[i-1].frame, "TOPRIGHT", 0, frameoffset - lastframeoffset)
 					usedwidth = framewidth + usedwidth
 				end
@@ -741,11 +741,11 @@ AceGUI:RegisterLayout("Flow",
 			if child.width == "fill" then
 				safelayoutcall(child, "SetWidth", width)
 				frame:SetPoint("RIGHT", content)
-
+
 				usedwidth = 0
 				rowstart = frame
 				rowstartoffset = frameoffset
-
+
 				if child.DoLayout then
 					child:DoLayout()
 				end
@@ -754,7 +754,7 @@ AceGUI:RegisterLayout("Flow",
 				rowstartoffset = rowoffset
 			elseif child.width == "relative" then
 				safelayoutcall(child, "SetWidth", width * child.relWidth)
-
+
 				if child.DoLayout then
 					child:DoLayout()
 				end
@@ -763,20 +763,20 @@ AceGUI:RegisterLayout("Flow",
 					frame:SetPoint("RIGHT", content)
 				end
 			end
-
+
 			if child.height == "fill" then
 				frame:SetPoint("BOTTOM", content)
 				isfullheight = true
 			end
 		end
-
+
 		--anchor the last row, if its full height needs a special case since  its height has just been changed by the anchor
 		if isfullheight then
 			rowstart:SetPoint("TOPLEFT", content, "TOPLEFT", 0, -height)
 		elseif rowstart then
 			rowstart:SetPoint("TOPLEFT", content, "TOPLEFT", 0, -(height + (rowoffset - rowstartoffset) + 3))
 		end
-
+
 		height = height + rowheight + 3
 		safecall(content.obj.LayoutFinished, content.obj, nil, height)
 	end)
@@ -840,7 +840,7 @@ AceGUI:RegisterLayout("Table",
 		local spaceH = tableObj.spaceH or tableObj.space or 0
 		local spaceV = tableObj.spaceV or tableObj.space or 0
 		local totalH = (content:GetWidth() or content.width or 0) - spaceH * (#cols - 1)
-
+
 		-- We need to reuse these because layout events can come in very frequently
 		local layoutCache = obj:GetUserData("layoutCache")
 		if not layoutCache then
@@ -848,7 +848,7 @@ AceGUI:RegisterLayout("Table",
 			obj:SetUserData("layoutCache", layoutCache)
 		end
 		local t, laneH, laneV, rowspans, rowStart, colStart = unpack(layoutCache)
-
+
 		-- Create the grid
 		local n, slotFound = 0
 		for i,child in ipairs(children) do
@@ -913,7 +913,7 @@ AceGUI:RegisterLayout("Table",
 							local f = child.frame
 							f:ClearAllPoints()
 							local childH = f:GetWidth() or 0
-
+
 							laneH[col] = max(laneH[col], childH - GetCellDimension("H", laneH, colStart[child], col - 1, spaceH))
 						end
 					end
@@ -947,7 +947,7 @@ AceGUI:RegisterLayout("Table",
 					local cellObj = child:GetUserData("cell")
 					local offsetH = GetCellDimension("H", laneH, 1, colStart[child] - 1, spaceH) + (colStart[child] == 1 and 0 or spaceH)
 					local cellH = GetCellDimension("H", laneH, colStart[child], col, spaceH)
-
+
 					local f = child.frame
 					f:ClearAllPoints()
 					local childH = f:GetWidth() or 0
@@ -957,7 +957,7 @@ AceGUI:RegisterLayout("Table",
 					if child:IsFullWidth() or alignFn == "fill" or childH > cellH then
 						f:SetPoint("RIGHT", content, "LEFT", offsetH + align + cellH, 0)
 					end
-
+
 					if child.DoLayout then
 						child:DoLayout()
 					end
@@ -976,7 +976,7 @@ AceGUI:RegisterLayout("Table",
 					local cellObj = child:GetUserData("cell")
 					local offsetV = GetCellDimension("V", laneV, 1, rowStart[child] - 1, spaceV) + (rowStart[child] == 1 and 0 or spaceV)
 					local cellV = GetCellDimension("V", laneV, rowStart[child], row, spaceV)
-
+
 					local f = child.frame
 					local childV = f:GetHeight() or 0

@@ -991,7 +991,7 @@ AceGUI:RegisterLayout("Table",

 		-- Calculate total height
 		local totalV = GetCellDimension("V", laneV, 1, #laneV, spaceV)
-
+
 		-- Cleanup
 		for _,v in pairs(layoutCache) do wipe(v) end

diff --git a/libs/AceGUI-3.0/widgets/AceGUIContainer-DropDownGroup.lua b/libs/AceGUI-3.0/widgets/AceGUIContainer-DropDownGroup.lua
index b0f81b7..4b09d64 100755
--- a/libs/AceGUI-3.0/widgets/AceGUIContainer-DropDownGroup.lua
+++ b/libs/AceGUI-3.0/widgets/AceGUIContainer-DropDownGroup.lua
@@ -150,7 +150,7 @@ local function Constructor()
 		widget[method] = func
 	end
 	dropdown.parentgroup = widget
-
+
 	return AceGUI:RegisterAsContainer(widget)
 end

diff --git a/libs/AceGUI-3.0/widgets/AceGUIContainer-ScrollFrame.lua b/libs/AceGUI-3.0/widgets/AceGUIContainer-ScrollFrame.lua
index eb8e215..d110d03 100755
--- a/libs/AceGUI-3.0/widgets/AceGUIContainer-ScrollFrame.lua
+++ b/libs/AceGUI-3.0/widgets/AceGUIContainer-ScrollFrame.lua
@@ -40,7 +40,7 @@ end
 Methods
 -------------------------------------------------------------------------------]]
 local methods = {
-	["OnAcquire"] = function(self)
+	["OnAcquire"] = function(self)
 		self:SetScroll(0)
 		self.scrollframe:SetScript("OnUpdate", FixScrollOnUpdate)
 	end,
@@ -77,7 +77,7 @@ local methods = {
 	["MoveScroll"] = function(self, value)
 		local status = self.status or self.localstatus
 		local height, viewheight = self.scrollframe:GetHeight(), self.content:GetHeight()
-
+
 		if self.scrollBarShown then
 			local diff = height - viewheight
 			local delta = 1
diff --git a/libs/AceGUI-3.0/widgets/AceGUIContainer-TabGroup.lua b/libs/AceGUI-3.0/widgets/AceGUIContainer-TabGroup.lua
index 9129f9d..053e27d 100755
--- a/libs/AceGUI-3.0/widgets/AceGUIContainer-TabGroup.lua
+++ b/libs/AceGUI-3.0/widgets/AceGUIContainer-TabGroup.lua
@@ -161,21 +161,21 @@ local methods = {
 		self.tablist = tabs
 		self:BuildTabs()
 	end,
-
+

 	["BuildTabs"] = function(self)
 		local hastitle = (self.titletext:GetText() and self.titletext:GetText() ~= "")
 		local tablist = self.tablist
 		local tabs = self.tabs
-
+
 		if not tablist then return end
-
+
 		local width = self.frame.width or self.frame:GetWidth() or 0
-
+
 		wipe(widths)
 		wipe(rowwidths)
 		wipe(rowends)
-
+
 		--Place Text into tabs and get thier initial width
 		for i, v in ipairs(tablist) do
 			local tab = tabs[i]
@@ -183,19 +183,19 @@ local methods = {
 				tab = self:CreateTab(i)
 				tabs[i] = tab
 			end
-
+
 			tab:Show()
 			tab:SetText(v.text)
 			tab:SetDisabled(v.disabled)
 			tab.value = v.value
-
+
 			widths[i] = tab:GetWidth() - 6 --tabs are anchored 10 pixels from the right side of the previous one to reduce spacing, but add a fixed 4px padding for the text
 		end
-
+
 		for i = (#tablist)+1, #tabs, 1 do
 			tabs[i]:Hide()
 		end
-
+
 		--First pass, find the minimum number of rows needed to hold all tabs and the initial tab layout
 		local numtabs = #tablist
 		local numrows = 1
@@ -213,7 +213,7 @@ local methods = {
 		end
 		rowwidths[numrows] = usedwidth + 10 --first tab in each row takes up an extra 10px
 		rowends[numrows] = #tablist
-
+
 		--Fix for single tabs being left on the last row, move a tab from the row above if applicable
 		if numrows > 1 then
 			--if the last row has only one tab
@@ -244,22 +244,22 @@ local methods = {
 					tab:SetPoint("LEFT", tabs[tabno-1], "RIGHT", -10, 0)
 				end
 			end
-
+
 			-- equal padding for each tab to fill the available width,
 			-- if the used space is above 75% already
-			-- the 18 pixel is the typical width of a scrollbar, so we can have a tab group inside a scrolling frame,
+			-- the 18 pixel is the typical width of a scrollbar, so we can have a tab group inside a scrolling frame,
 			-- and not have the tabs jump around funny when switching between tabs that need scrolling and those that don't
 			local padding = 0
 			if not (numrows == 1 and rowwidths[1] < width*0.75 - 18) then
 				padding = (width - rowwidths[row]) / (endtab - starttab+1)
 			end
-
+
 			for i = starttab, endtab do
 				PanelTemplates_TabResize(tabs[i], padding + 4, nil, nil, width, tabs[i]:GetFontString():GetStringWidth())
 			end
 			starttab = endtab + 1
 		end
-
+
 		self.borderoffset = (hastitle and 17 or 10)+((numrows)*20)
 		self.border:SetPoint("TOPLEFT", 1, -self.borderoffset)
 	end,
@@ -285,7 +285,7 @@ local methods = {
 		content:SetHeight(contentheight)
 		content.height = contentheight
 	end,
-
+
 	["LayoutFinished"] = function(self, width, height)
 		if self.noAutoHeight then return end
 		self:SetHeight((height or 0) + (self.borderoffset + 23))
@@ -342,7 +342,7 @@ local function Constructor()
 	for method, func in pairs(methods) do
 		widget[method] = func
 	end
-
+
 	return AceGUI:RegisterAsContainer(widget)
 end

diff --git a/libs/AceGUI-3.0/widgets/AceGUIContainer-TreeGroup.lua b/libs/AceGUI-3.0/widgets/AceGUIContainer-TreeGroup.lua
index ba916d0..3558edd 100755
--- a/libs/AceGUI-3.0/widgets/AceGUIContainer-TreeGroup.lua
+++ b/libs/AceGUI-3.0/widgets/AceGUIContainer-TreeGroup.lua
@@ -2,7 +2,7 @@
 TreeGroup Container
 Container that uses a tree control to switch between groups.
 -------------------------------------------------------------------------------]]
-local Type, Version = "TreeGroup", 41
+local Type, Version = "TreeGroup", 42
 local AceGUI = LibStub and LibStub("AceGUI-3.0", true)
 if not AceGUI or (AceGUI:GetWidgetVersion(Type) or 0) >= Version then return end

@@ -36,7 +36,7 @@ do
 	function del(t)
 		for k in pairs(t) do
 			t[k] = nil
-		end
+		end
 		pool[t] = true
 	end
 end
@@ -66,7 +66,7 @@ local function UpdateButton(button, treeline, selected, canExpand, isExpanded)
 	local value = treeline.value
 	local uniquevalue = treeline.uniquevalue
 	local disabled = treeline.disabled
-
+
 	button.treeline = treeline
 	button.value = value
 	button.uniquevalue = uniquevalue
@@ -87,7 +87,7 @@ local function UpdateButton(button, treeline, selected, canExpand, isExpanded)
 		button:SetHighlightFontObject("GameFontHighlightSmall")
 		button.text:SetPoint("LEFT", (icon and 16 or 0) + 8 * level, 2)
 	end
-
+
 	if disabled then
 		button:EnableMouse(false)
 		button.text:SetText("|cff808080"..text..FONT_COLOR_CODE_CLOSE)
@@ -95,20 +95,20 @@ local function UpdateButton(button, treeline, selected, canExpand, isExpanded)
 		button.text:SetText(text)
 		button:EnableMouse(true)
 	end
-
+
 	if icon then
 		button.icon:SetTexture(icon)
 		button.icon:SetPoint("LEFT", 8 * level, (level == 1) and 0 or 1)
 	else
 		button.icon:SetTexture(nil)
 	end
-
+
 	if iconCoords then
 		button.icon:SetTexCoord(unpack(iconCoords))
 	else
 		button.icon:SetTexCoord(0, 1, 0, 1)
 	end
-
+
 	if canExpand then
 		if not isExpanded then
 			toggle:SetNormalTexture(130838) -- Interface\\Buttons\\UI-PlusButton-UP
@@ -209,6 +209,7 @@ local function Button_OnEnter(frame)

 	if self.enabletooltips then
 		GameTooltip:SetOwner(frame, "ANCHOR_NONE")
+		GameTooltip:ClearAllPoints()
 		GameTooltip:SetPoint("LEFT",frame,"RIGHT")
 		GameTooltip:SetText(frame.text:GetText() or "", 1, .82, 0, true)

@@ -275,10 +276,10 @@ local function Dragger_OnMouseUp(frame)
 	treeframe:SetHeight(0)
 	treeframe:SetPoint("TOPLEFT", frame, "TOPLEFT",0,0)
 	treeframe:SetPoint("BOTTOMLEFT", frame, "BOTTOMLEFT",0,0)
-
+
 	local status = self.status or self.localstatus
 	status.treewidth = treeframe:GetWidth()
-
+
 	treeframe.obj:Fire("OnTreeResize",treeframe:GetWidth())
 	-- recalculate the content width
 	treeframe.obj:OnWidthSet(status.fullwidth)
@@ -363,8 +364,8 @@ local methods = {
 	--sets the tree to be displayed
 	["SetTree"] = function(self, tree, filter)
 		self.filter = filter
-		if tree then
-			assert(type(tree) == "table")
+		if tree then
+			assert(type(tree) == "table")
 		end
 		self.tree = tree
 		self:RefreshTree()
@@ -372,7 +373,7 @@ local methods = {

 	["BuildLevel"] = function(self, tree, level, parent)
 		local groups = (self.status or self.localstatus).groups
-
+
 		for i, v in ipairs(tree) do
 			if v.children then
 				if not self.filter or ShouldDisplayLevel(v.children) then
@@ -409,7 +410,7 @@ local methods = {
 		local tree = self.tree

 		local treeframe = self.treeframe
-
+
 		status.scrollToSelection = status.scrollToSelection or scrollToSelection	-- needs to be cached in case the control hasn't been drawn yet (code bails out below)

 		self:BuildLevel(tree, 1)
@@ -426,7 +427,7 @@ local methods = {
 		end

 		local first, last
-
+
 		scrollToSelection = status.scrollToSelection
 		status.scrollToSelection = nil

@@ -502,9 +503,9 @@ local methods = {
 			button:Show()
 			buttonnum = buttonnum + 1
 		end
-
+
 	end,
-
+
 	["SetSelected"] = function(self, value)
 		local status = self.status or self.localstatus
 		if status.selected ~= value then
@@ -554,16 +555,16 @@ local methods = {
 		local treeframe = self.treeframe
 		local status = self.status or self.localstatus
 		status.fullwidth = width
-
+
 		local contentwidth = width - status.treewidth - 20
 		if contentwidth < 0 then
 			contentwidth = 0
 		end
 		content:SetWidth(contentwidth)
 		content.width = contentwidth
-
+
 		local maxtreewidth = math_min(400, width - 50)
-
+
 		if maxtreewidth > 100 and status.treewidth > maxtreewidth then
 			self:SetTreeWidth(maxtreewidth, status.treesizable)
 		end
@@ -589,16 +590,16 @@ local methods = {
 				treewidth = DEFAULT_TREE_WIDTH
 			else
 				resizable = false
-				treewidth = DEFAULT_TREE_WIDTH
+				treewidth = DEFAULT_TREE_WIDTH
 			end
 		end
 		self.treeframe:SetWidth(treewidth)
 		self.dragger:EnableMouse(resizable)
-
+
 		local status = self.status or self.localstatus
 		status.treewidth = treewidth
 		status.treesizable = resizable
-
+
 		-- recalculate the content width
 		if status.fullwidth then
 			self:OnWidthSet(status.fullwidth)
diff --git a/libs/AceGUI-3.0/widgets/AceGUIContainer-Window.lua b/libs/AceGUI-3.0/widgets/AceGUIContainer-Window.lua
index 9818e6d..2e28a3d 100755
--- a/libs/AceGUI-3.0/widgets/AceGUIContainer-Window.lua
+++ b/libs/AceGUI-3.0/widgets/AceGUIContainer-Window.lua
@@ -30,21 +30,21 @@ do
 	local function frameOnClose(this)
 		this.obj:Fire("OnClose")
 	end
-
+
 	local function closeOnClick(this)
 		PlaySound(799) -- SOUNDKIT.GS_TITLE_OPTION_EXIT
 		this.obj:Hide()
 	end
-
+
 	local function frameOnMouseDown(this)
 		AceGUI:ClearFocus()
 	end
-
+
 	local function titleOnMouseDown(this)
 		this:GetParent():StartMoving()
 		AceGUI:ClearFocus()
 	end
-
+
 	local function frameOnMouseUp(this)
 		local frame = this:GetParent()
 		frame:StopMovingOrSizing()
@@ -55,22 +55,22 @@ do
 		status.top = frame:GetTop()
 		status.left = frame:GetLeft()
 	end
-
+
 	local function sizerseOnMouseDown(this)
 		this:GetParent():StartSizing("BOTTOMRIGHT")
 		AceGUI:ClearFocus()
 	end
-
+
 	local function sizersOnMouseDown(this)
 		this:GetParent():StartSizing("BOTTOM")
 		AceGUI:ClearFocus()
 	end
-
+
 	local function sizereOnMouseDown(this)
 		this:GetParent():StartSizing("RIGHT")
 		AceGUI:ClearFocus()
 	end
-
+
 	local function sizerOnMouseUp(this)
 		this:GetParent():StopMovingOrSizing()
 	end
@@ -78,19 +78,19 @@ do
 	local function SetTitle(self,title)
 		self.titletext:SetText(title)
 	end
-
+
 	local function SetStatusText(self,text)
 		-- self.statustext:SetText(text)
 	end
-
+
 	local function Hide(self)
 		self.frame:Hide()
 	end
-
+
 	local function Show(self)
 		self.frame:Show()
 	end
-
+
 	local function OnAcquire(self)
 		self.frame:SetParent(UIParent)
 		self.frame:SetFrameStrata("FULLSCREEN_DIALOG")
@@ -98,21 +98,21 @@ do
 		self:EnableResize(true)
 		self:Show()
 	end
-
+
 	local function OnRelease(self)
 		self.status = nil
 		for k in pairs(self.localstatus) do
 			self.localstatus[k] = nil
 		end
 	end
-
+
 	-- called to set an external table to store status in
 	local function SetStatusTable(self, status)
 		assert(type(status) == "table")
 		self.status = status
 		self:ApplyStatus()
 	end
-
+
 	local function ApplyStatus(self)
 		local status = self.status or self.localstatus
 		local frame = self.frame
@@ -125,7 +125,7 @@ do
 			frame:SetPoint("CENTER",UIParent,"CENTER")
 		end
 	end
-
+
 	local function OnWidthSet(self, width)
 		local content = self.content
 		local contentwidth = width - 34
@@ -135,8 +135,8 @@ do
 		content:SetWidth(contentwidth)
 		content.width = contentwidth
 	end
-
-
+
+
 	local function OnHeightSet(self, height)
 		local content = self.content
 		local contentheight = height - 57
@@ -146,19 +146,19 @@ do
 		content:SetHeight(contentheight)
 		content.height = contentheight
 	end
-
+
 	local function EnableResize(self, state)
 		local func = state and "Show" or "Hide"
 		self.sizer_se[func](self.sizer_se)
 		self.sizer_s[func](self.sizer_s)
 		self.sizer_e[func](self.sizer_e)
 	end
-
+
 	local function Constructor()
 		local frame = CreateFrame("Frame",nil,UIParent)
 		local self = {}
 		self.type = "Window"
-
+
 		self.Hide = Hide
 		self.Show = Show
 		self.SetTitle =  SetTitle
@@ -170,9 +170,9 @@ do
 		self.OnWidthSet = OnWidthSet
 		self.OnHeightSet = OnHeightSet
 		self.EnableResize = EnableResize
-
+
 		self.localstatus = {}
-
+
 		self.frame = frame
 		frame.obj = self
 		frame:SetWidth(700)
@@ -183,7 +183,7 @@ do
 		frame:SetResizable(true)
 		frame:SetFrameStrata("FULLSCREEN_DIALOG")
 		frame:SetScript("OnMouseDown", frameOnMouseDown)
-
+
 		frame:SetScript("OnShow",frameOnShow)
 		frame:SetScript("OnHide",frameOnClose)
 		frame:SetMinResize(240,240)
@@ -193,81 +193,81 @@ do
 		titlebg:SetTexture(251966) -- Interface\\PaperDollInfoFrame\\UI-GearManager-Title-Background
 		titlebg:SetPoint("TOPLEFT", 9, -6)
 		titlebg:SetPoint("BOTTOMRIGHT", frame, "TOPRIGHT", -28, -24)
-
+
 		local dialogbg = frame:CreateTexture(nil, "BACKGROUND")
 		dialogbg:SetTexture(137056) -- Interface\\Tooltips\\UI-Tooltip-Background
 		dialogbg:SetPoint("TOPLEFT", 8, -24)
 		dialogbg:SetPoint("BOTTOMRIGHT", -6, 8)
 		dialogbg:SetVertexColor(0, 0, 0, .75)
-
+
 		local topleft = frame:CreateTexture(nil, "BORDER")
 		topleft:SetTexture(251963) -- Interface\\PaperDollInfoFrame\\UI-GearManager-Border
 		topleft:SetWidth(64)
 		topleft:SetHeight(64)
 		topleft:SetPoint("TOPLEFT")
 		topleft:SetTexCoord(0.501953125, 0.625, 0, 1)
-
+
 		local topright = frame:CreateTexture(nil, "BORDER")
 		topright:SetTexture(251963) -- Interface\\PaperDollInfoFrame\\UI-GearManager-Border
 		topright:SetWidth(64)
 		topright:SetHeight(64)
 		topright:SetPoint("TOPRIGHT")
 		topright:SetTexCoord(0.625, 0.75, 0, 1)
-
+
 		local top = frame:CreateTexture(nil, "BORDER")
 		top:SetTexture(251963) -- Interface\\PaperDollInfoFrame\\UI-GearManager-Border
 		top:SetHeight(64)
 		top:SetPoint("TOPLEFT", topleft, "TOPRIGHT")
 		top:SetPoint("TOPRIGHT", topright, "TOPLEFT")
 		top:SetTexCoord(0.25, 0.369140625, 0, 1)
-
+
 		local bottomleft = frame:CreateTexture(nil, "BORDER")
 		bottomleft:SetTexture(251963) -- Interface\\PaperDollInfoFrame\\UI-GearManager-Border
 		bottomleft:SetWidth(64)
 		bottomleft:SetHeight(64)
 		bottomleft:SetPoint("BOTTOMLEFT")
 		bottomleft:SetTexCoord(0.751953125, 0.875, 0, 1)
-
+
 		local bottomright = frame:CreateTexture(nil, "BORDER")
 		bottomright:SetTexture(251963) -- Interface\\PaperDollInfoFrame\\UI-GearManager-Border
 		bottomright:SetWidth(64)
 		bottomright:SetHeight(64)
 		bottomright:SetPoint("BOTTOMRIGHT")
 		bottomright:SetTexCoord(0.875, 1, 0, 1)
-
+
 		local bottom = frame:CreateTexture(nil, "BORDER")
 		bottom:SetTexture(251963) -- Interface\\PaperDollInfoFrame\\UI-GearManager-Border
 		bottom:SetHeight(64)
 		bottom:SetPoint("BOTTOMLEFT", bottomleft, "BOTTOMRIGHT")
 		bottom:SetPoint("BOTTOMRIGHT", bottomright, "BOTTOMLEFT")
 		bottom:SetTexCoord(0.376953125, 0.498046875, 0, 1)
-
+
 		local left = frame:CreateTexture(nil, "BORDER")
 		left:SetTexture(251963) -- Interface\\PaperDollInfoFrame\\UI-GearManager-Border
 		left:SetWidth(64)
 		left:SetPoint("TOPLEFT", topleft, "BOTTOMLEFT")
 		left:SetPoint("BOTTOMLEFT", bottomleft, "TOPLEFT")
 		left:SetTexCoord(0.001953125, 0.125, 0, 1)
-
+
 		local right = frame:CreateTexture(nil, "BORDER")
 		right:SetTexture(251963) -- Interface\\PaperDollInfoFrame\\UI-GearManager-Border
 		right:SetWidth(64)
 		right:SetPoint("TOPRIGHT", topright, "BOTTOMRIGHT")
 		right:SetPoint("BOTTOMRIGHT", bottomright, "TOPRIGHT")
 		right:SetTexCoord(0.1171875, 0.2421875, 0, 1)
-
+
 		local close = CreateFrame("Button", nil, frame, "UIPanelCloseButton")
 		close:SetPoint("TOPRIGHT", 2, 1)
 		close:SetScript("OnClick", closeOnClick)
 		self.closebutton = close
 		close.obj = self
-
+
 		local titletext = frame:CreateFontString(nil, "ARTWORK")
 		titletext:SetFontObject(GameFontNormal)
 		titletext:SetPoint("TOPLEFT", 12, -8)
 		titletext:SetPoint("TOPRIGHT", -32, -8)
 		self.titletext = titletext
-
+
 		local title = CreateFrame("Button", nil, frame)
 		title:SetPoint("TOPLEFT", titlebg)
 		title:SetPoint("BOTTOMRIGHT", titlebg)
@@ -275,7 +275,7 @@ do
 		title:SetScript("OnMouseDown",titleOnMouseDown)
 		title:SetScript("OnMouseUp", frameOnMouseUp)
 		self.title = title
-
+
 		local sizer_se = CreateFrame("Frame",nil,frame)
 		sizer_se:SetPoint("BOTTOMRIGHT",frame,"BOTTOMRIGHT",0,0)
 		sizer_se:SetWidth(25)
@@ -311,7 +311,7 @@ do
 		sizer_s:SetScript("OnMouseDown",sizersOnMouseDown)
 		sizer_s:SetScript("OnMouseUp", sizerOnMouseUp)
 		self.sizer_s = sizer_s
-
+
 		local sizer_e = CreateFrame("Frame",nil,frame)
 		sizer_e:SetPoint("BOTTOMRIGHT",frame,"BOTTOMRIGHT",0,25)
 		sizer_e:SetPoint("TOPRIGHT",frame,"TOPRIGHT",0,0)
@@ -320,17 +320,17 @@ do
 		sizer_e:SetScript("OnMouseDown",sizereOnMouseDown)
 		sizer_e:SetScript("OnMouseUp", sizerOnMouseUp)
 		self.sizer_e = sizer_e
-
+
 		--Container Support
 		local content = CreateFrame("Frame",nil,frame)
 		self.content = content
 		content.obj = self
 		content:SetPoint("TOPLEFT",frame,"TOPLEFT",12,-32)
 		content:SetPoint("BOTTOMRIGHT",frame,"BOTTOMRIGHT",-12,13)
-
+
 		AceGUI:RegisterAsContainer(self)
-		return self
+		return self
 	end
-
+
 	AceGUI:RegisterWidgetType(Type,Constructor,Version)
 end
diff --git a/libs/AceGUI-3.0/widgets/AceGUIWidget-Button.lua b/libs/AceGUI-3.0/widgets/AceGUIWidget-Button.lua
index 0a23be4..0e286ca 100755
--- a/libs/AceGUI-3.0/widgets/AceGUIWidget-Button.lua
+++ b/libs/AceGUI-3.0/widgets/AceGUIWidget-Button.lua
@@ -51,7 +51,7 @@ local methods = {
 			self:SetWidth(self.text:GetStringWidth() + 30)
 		end
 	end,
-
+
 	["SetAutoWidth"] = function(self, autoWidth)
 		self.autoWidth = autoWidth
 		if self.autoWidth then
diff --git a/libs/AceGUI-3.0/widgets/AceGUIWidget-CheckBox.lua b/libs/AceGUI-3.0/widgets/AceGUIWidget-CheckBox.lua
index be9ae81..53ef618 100755
--- a/libs/AceGUI-3.0/widgets/AceGUIWidget-CheckBox.lua
+++ b/libs/AceGUI-3.0/widgets/AceGUIWidget-CheckBox.lua
@@ -221,11 +221,11 @@ local methods = {
 			self:SetHeight(24)
 		end
 	end,
-
+
 	["SetImage"] = function(self, path, ...)
 		local image = self.image
 		image:SetTexture(path)
-
+
 		if image:GetTexture() then
 			local n = select("#", ...)
 			if n == 4 or n == 8 then
diff --git a/libs/AceGUI-3.0/widgets/AceGUIWidget-ColorPicker.lua b/libs/AceGUI-3.0/widgets/AceGUIWidget-ColorPicker.lua
index 4e911db..1101162 100755
--- a/libs/AceGUI-3.0/widgets/AceGUIWidget-ColorPicker.lua
+++ b/libs/AceGUI-3.0/widgets/AceGUIWidget-ColorPicker.lua
@@ -1,7 +1,7 @@
 --[[-----------------------------------------------------------------------------
 ColorPicker Widget
 -------------------------------------------------------------------------------]]
-local Type, Version = "ColorPicker", 24
+local Type, Version = "ColorPicker", 25
 local AceGUI = LibStub and LibStub("AceGUI-3.0", true)
 if not AceGUI or (AceGUI:GetWidgetVersion(Type) or 0) >= Version then return end

@@ -13,7 +13,7 @@ local CreateFrame, UIParent = CreateFrame, UIParent

 -- Global vars/functions that we don't upvalue since they might get hooked, or upgraded
 -- List them here for Mikk's FindGlobals script
--- GLOBALS: ShowUIPanel, HideUIPanel, ColorPickerFrame, OpacitySliderFrame
+-- GLOBALS: ColorPickerFrame, OpacitySliderFrame

 --[[-----------------------------------------------------------------------------
 Support functions
@@ -47,7 +47,7 @@ local function Control_OnLeave(frame)
 end

 local function ColorSwatch_OnClick(frame)
-	HideUIPanel(ColorPickerFrame)
+	ColorPickerFrame:Hide()
 	local self = frame.obj
 	if not self.disabled then
 		ColorPickerFrame:SetFrameStrata("FULLSCREEN_DIALOG")
@@ -77,7 +77,7 @@ local function ColorSwatch_OnClick(frame)
 			ColorCallback(self, r, g, b, a, true)
 		end

-		ShowUIPanel(ColorPickerFrame)
+		ColorPickerFrame:Show()
 	end
 	AceGUI:ClearFocus()
 end
diff --git a/libs/AceGUI-3.0/widgets/AceGUIWidget-DropDown-Items.lua b/libs/AceGUI-3.0/widgets/AceGUIWidget-DropDown-Items.lua
index 549ce3e..7ae1401 100755
--- a/libs/AceGUI-3.0/widgets/AceGUIWidget-DropDown-Items.lua
+++ b/libs/AceGUI-3.0/widgets/AceGUIWidget-DropDown-Items.lua
@@ -1,4 +1,4 @@
---[[ $Id: AceGUIWidget-DropDown-Items.lua 1192 2018-07-30 18:03:51Z funkydude $ ]]--
+--[[ $Id: AceGUIWidget-DropDown-Items.lua 1202 2019-05-15 23:11:22Z nevcairiel $ ]]--

 local AceGUI = LibStub("AceGUI-3.0")

@@ -33,7 +33,7 @@ end

 -- ItemBase is the base "class" for all dropdown items.
 -- Each item has to use ItemBase.Create(widgetType) to
--- create an initial 'self' value.
+-- create an initial 'self' value.
 -- ItemBase will add common functions and ui event handlers.
 -- Be sure to keep basic usage when you override functions.

@@ -52,7 +52,7 @@ function ItemBase.Frame_OnEnter(this)
 		self.highlight:Show()
 	end
 	self:Fire("OnEnter")
-
+
 	if self.specialOnEnter then
 		self.specialOnEnter(self)
 	end
@@ -60,10 +60,10 @@ end

 function ItemBase.Frame_OnLeave(this)
 	local self = this.obj
-
+
 	self.highlight:Hide()
 	self:Fire("OnLeave")
-
+
 	if self.specialOnLeave then
 		self.specialOnLeave(self)
 	end
@@ -89,7 +89,7 @@ end
 --       Do not call this method directly
 function ItemBase.SetPullout(self, pullout)
 	self.pullout = pullout
-
+
 	self.frame:SetParent(nil)
 	self.frame:SetParent(pullout.itemFrame)
 	self.parent = pullout.itemFrame
@@ -155,12 +155,12 @@ function ItemBase.Create(type)
 	self.frame = frame
 	frame.obj = self
 	self.type = type
-
+
 	self.useHighlight = true
-
+
 	frame:SetHeight(17)
 	frame:SetFrameStrata("FULLSCREEN_DIALOG")
-
+
 	local text = frame:CreateFontString(nil,"OVERLAY","GameFontNormalSmall")
 	text:SetTextColor(1,1,1)
 	text:SetJustifyH("LEFT")
@@ -178,7 +178,7 @@ function ItemBase.Create(type)
 	highlight:Hide()
 	self.highlight = highlight

-	local check = frame:CreateTexture("OVERLAY")
+	local check = frame:CreateTexture("OVERLAY")
 	check:SetWidth(16)
 	check:SetHeight(16)
 	check:SetPoint("LEFT",frame,"LEFT",3,-1)
@@ -192,26 +192,26 @@ function ItemBase.Create(type)
 	sub:SetPoint("RIGHT",frame,"RIGHT",-3,-1)
 	sub:SetTexture(130940) -- Interface\\ChatFrame\\ChatFrameExpandArrow
 	sub:Hide()
-	self.sub = sub
-
+	self.sub = sub
+
 	frame:SetScript("OnEnter", ItemBase.Frame_OnEnter)
 	frame:SetScript("OnLeave", ItemBase.Frame_OnLeave)
-
+
 	self.OnAcquire = ItemBase.OnAcquire
 	self.OnRelease = ItemBase.OnRelease
-
+
 	self.SetPullout = ItemBase.SetPullout
 	self.GetText    = ItemBase.GetText
 	self.SetText    = ItemBase.SetText
 	self.SetDisabled = ItemBase.SetDisabled
-
+
 	self.SetPoint   = ItemBase.SetPoint
 	self.Show       = ItemBase.Show
 	self.Hide       = ItemBase.Hide
-
+
 	self.SetOnLeave = ItemBase.SetOnLeave
 	self.SetOnEnter = ItemBase.SetOnEnter
-
+
 	return self
 end

@@ -223,20 +223,20 @@ end

 --[[
 	Template for items:
-
+
 -- Item:
 --
 do
 	local widgetType = "Dropdown-Item-"
 	local widgetVersion = 1
-
+
 	local function Constructor()
 		local self = ItemBase.Create(widgetType)
-
+
 		AceGUI:RegisterAsWidget(self)
 		return self
 	end
-
+
 	AceGUI:RegisterWidgetType(widgetType, Constructor, widgetVersion + ItemBase.version)
 end
 --]]
@@ -247,25 +247,25 @@ end
 do
 	local widgetType = "Dropdown-Item-Header"
 	local widgetVersion = 1
-
+
 	local function OnEnter(this)
 		local self = this.obj
 		self:Fire("OnEnter")
-
+
 		if self.specialOnEnter then
 			self.specialOnEnter(self)
 		end
 	end
-
+
 	local function OnLeave(this)
 		local self = this.obj
 		self:Fire("OnLeave")
-
+
 		if self.specialOnLeave then
 			self.specialOnLeave(self)
 		end
 	end
-
+
 	-- exported, override
 	local function SetDisabled(self, disabled)
 		ItemBase.SetDisabled(self, disabled)
@@ -273,21 +273,21 @@ do
 			self.text:SetTextColor(1, 1, 0)
 		end
 	end
-
+
 	local function Constructor()
 		local self = ItemBase.Create(widgetType)
-
+
 		self.SetDisabled = SetDisabled
-
+
 		self.frame:SetScript("OnEnter", OnEnter)
 		self.frame:SetScript("OnLeave", OnLeave)
-
+
 		self.text:SetTextColor(1, 1, 0)
-
+
 		AceGUI:RegisterAsWidget(self)
 		return self
 	end
-
+
 	AceGUI:RegisterWidgetType(widgetType, Constructor, widgetVersion + ItemBase.version)
 end

@@ -296,7 +296,7 @@ end
 do
 	local widgetType = "Dropdown-Item-Execute"
 	local widgetVersion = 1
-
+
 	local function Frame_OnClick(this, button)
 		local self = this.obj
 		if self.disabled then return end
@@ -305,16 +305,16 @@ do
 			self.pullout:Close()
 		end
 	end
-
+
 	local function Constructor()
 		local self = ItemBase.Create(widgetType)
-
+
 		self.frame:SetScript("OnClick", Frame_OnClick)
-
+
 		AceGUI:RegisterAsWidget(self)
 		return self
 	end
-
+
 	AceGUI:RegisterWidgetType(widgetType, Constructor, widgetVersion + ItemBase.version)
 end

@@ -324,7 +324,7 @@ end
 do
 	local widgetType = "Dropdown-Item-Toggle"
 	local widgetVersion = 4
-
+
 	local function UpdateToggle(self)
 		if self.value then
 			self.check:Show()
@@ -332,12 +332,12 @@ do
 			self.check:Hide()
 		end
 	end
-
+
 	local function OnRelease(self)
 		ItemBase.OnRelease(self)
 		self:SetValue(nil)
 	end
-
+
 	local function Frame_OnClick(this, button)
 		local self = this.obj
 		if self.disabled then return end
@@ -350,31 +350,31 @@ do
 		UpdateToggle(self)
 		self:Fire("OnValueChanged", self.value)
 	end
-
+
 	-- exported
 	local function SetValue(self, value)
 		self.value = value
 		UpdateToggle(self)
 	end
-
+
 	-- exported
 	local function GetValue(self)
 		return self.value
 	end
-
+
 	local function Constructor()
 		local self = ItemBase.Create(widgetType)
-
+
 		self.frame:SetScript("OnClick", Frame_OnClick)
-
+
 		self.SetValue = SetValue
 		self.GetValue = GetValue
 		self.OnRelease = OnRelease
-
+
 		AceGUI:RegisterAsWidget(self)
 		return self
 	end
-
+
 	AceGUI:RegisterWidgetType(widgetType, Constructor, widgetVersion + ItemBase.version)
 end

@@ -384,55 +384,55 @@ end
 do
 	local widgetType = "Dropdown-Item-Menu"
 	local widgetVersion = 2
-
+
 	local function OnEnter(this)
 		local self = this.obj
 		self:Fire("OnEnter")
-
+
 		if self.specialOnEnter then
 			self.specialOnEnter(self)
 		end
-
+
 		self.highlight:Show()
-
+
 		if not self.disabled and self.submenu then
 			self.submenu:Open("TOPLEFT", self.frame, "TOPRIGHT", self.pullout:GetRightBorderWidth(), 0, self.frame:GetFrameLevel() + 100)
 		end
 	end
-
+
 	local function OnHide(this)
 		local self = this.obj
 		if self.submenu then
 			self.submenu:Close()
 		end
 	end
-
+
 	-- exported
 	local function SetMenu(self, menu)
 		assert(menu.type == "Dropdown-Pullout")
 		self.submenu = menu
 	end
-
+
 	-- exported
 	local function CloseMenu(self)
 		self.submenu:Close()
 	end
-
+
 	local function Constructor()
 		local self = ItemBase.Create(widgetType)
-
+
 		self.sub:Show()
-
+
 		self.frame:SetScript("OnEnter", OnEnter)
 		self.frame:SetScript("OnHide", OnHide)
-
+
 		self.SetMenu   = SetMenu
 		self.CloseMenu = CloseMenu
-
+
 		AceGUI:RegisterAsWidget(self)
 		return self
 	end
-
+
 	AceGUI:RegisterWidgetType(widgetType, Constructor, widgetVersion + ItemBase.version)
 end

@@ -441,31 +441,31 @@ end
 do
 	local widgetType = "Dropdown-Item-Separator"
 	local widgetVersion = 2
-
+
 	-- exported, override
 	local function SetDisabled(self, disabled)
 		ItemBase.SetDisabled(self, disabled)
 		self.useHighlight = false
 	end
-
+
 	local function Constructor()
 		local self = ItemBase.Create(widgetType)
-
+
 		self.SetDisabled = SetDisabled
-
+
 		local line = self.frame:CreateTexture(nil, "OVERLAY")
 		line:SetHeight(1)
 		line:SetColorTexture(.5, .5, .5)
 		line:SetPoint("LEFT", self.frame, "LEFT", 10, 0)
 		line:SetPoint("RIGHT", self.frame, "RIGHT", -10, 0)
-
+
 		self.text:Hide()
-
+
 		self.useHighlight = false
-
+
 		AceGUI:RegisterAsWidget(self)
 		return self
 	end
-
+
 	AceGUI:RegisterWidgetType(widgetType, Constructor, widgetVersion + ItemBase.version)
 end
diff --git a/libs/AceGUI-3.0/widgets/AceGUIWidget-DropDown.lua b/libs/AceGUI-3.0/widgets/AceGUIWidget-DropDown.lua
index cf0b0aa..0d6308f 100755
--- a/libs/AceGUI-3.0/widgets/AceGUIWidget-DropDown.lua
+++ b/libs/AceGUI-3.0/widgets/AceGUIWidget-DropDown.lua
@@ -1,9 +1,9 @@
---[[ $Id: AceGUIWidget-DropDown.lua 1167 2017-08-29 22:08:48Z funkydude $ ]]--
+--[[ $Id: AceGUIWidget-DropDown.lua 1209 2019-06-24 21:01:01Z nevcairiel $ ]]--
 local AceGUI = LibStub("AceGUI-3.0")

 -- Lua APIs
 local min, max, floor = math.min, math.max, math.floor
-local select, pairs, ipairs, type = select, pairs, ipairs, type
+local select, pairs, ipairs, type, tostring = select, pairs, ipairs, type, tostring
 local tsort = table.sort

 -- WoW APIs
@@ -40,9 +40,9 @@ end
 do
 	local widgetType = "Dropdown-Pullout"
 	local widgetVersion = 3
-
+
 	--[[ Static data ]]--
-
+
 	local backdrop = {
 		bgFile = "Interface\\ChatFrame\\ChatFrameBackground",
 		edgeFile = "Interface\\DialogFrame\\UI-DialogBox-Border",
@@ -60,9 +60,9 @@ do

 	local defaultWidth = 200
 	local defaultMaxHeight = 600
-
+
 	--[[ UI Event Handlers ]]--
-
+
 	-- HACK: This should be no part of the pullout, but there
 	--       is no other 'clean' way to response to any item-OnEnter
 	--       Used to close Submenus when an other item is entered
@@ -74,22 +74,22 @@ do
 			end
 		end
 	end
-
+
 	-- See the note in Constructor() for each scroll related function
 	local function OnMouseWheel(this, value)
 		this.obj:MoveScroll(value)
 	end
-
+
 	local function OnScrollValueChanged(this, value)
 		this.obj:SetScroll(value)
 	end
-
+
 	local function OnSizeChanged(this)
 		this.obj:FixScroll()
 	end
-
+
 	--[[ Exported methods ]]--
-
+
 	-- exported
 	local function SetScroll(self, value)
 		local status = self.scrollStatus
@@ -106,9 +106,9 @@ do
 		child:SetPoint("TOPLEFT", frame, "TOPLEFT", 0, offset)
 		child:SetPoint("TOPRIGHT", frame, "TOPRIGHT", self.slider:IsShown() and -12 or 0, offset)
 		status.offset = offset
-		status.scrollvalue = value
+		status.scrollvalue = value
 	end
-
+
 	-- exported
 	local function MoveScroll(self, value)
 		local status = self.scrollStatus
@@ -127,7 +127,7 @@ do
 			self.slider:SetValue(min(max(status.scrollvalue + delta*(1000/(diff/45)),0), 1000))
 		end
 	end
-
+
 	-- exported
 	local function FixScroll(self)
 		local status = self.scrollStatus
@@ -140,7 +140,7 @@ do
 			child:SetPoint("TOPRIGHT", frame, "TOPRIGHT", 0, offset)
 			self.slider:SetValue(0)
 		else
-			self.slider:Show()
+			self.slider:Show()
 			local value = (offset / (viewheight - height) * 1000)
 			if value > 1000 then value = 1000 end
 			self.slider:SetValue(value)
@@ -153,44 +153,44 @@ do
 			end
 		end
 	end
-
+
 	-- exported, AceGUI callback
 	local function OnAcquire(self)
 		self.frame:SetParent(UIParent)
 		--self.itemFrame:SetToplevel(true)
 	end
-
+
 	-- exported, AceGUI callback
 	local function OnRelease(self)
 		self:Clear()
 		self.frame:ClearAllPoints()
 		self.frame:Hide()
 	end
-
+
 	-- exported
 	local function AddItem(self, item)
 		self.items[#self.items + 1] = item
-
+
 		local h = #self.items * 16
 		self.itemFrame:SetHeight(h)
 		self.frame:SetHeight(min(h + 34, self.maxHeight)) -- +34: 20 for scrollFrame placement (10 offset) and +14 for item placement
-
+
 		item.frame:SetPoint("LEFT", self.itemFrame, "LEFT")
 		item.frame:SetPoint("RIGHT", self.itemFrame, "RIGHT")
-
+
 		item:SetPullout(self)
 		item:SetOnEnter(OnEnter)
 	end
-
+
 	-- exported
-	local function Open(self, point, relFrame, relPoint, x, y)
+	local function Open(self, point, relFrame, relPoint, x, y)
 		local items = self.items
 		local frame = self.frame
 		local itemFrame = self.itemFrame
-
+
 		frame:SetPoint(point, relFrame, relPoint, x, y)

-
+
 		local height = 8
 		for i, item in pairs(items) do
 			if i == 1 then
@@ -198,23 +198,23 @@ do
 			else
 				item:SetPoint("TOP", items[i-1].frame, "BOTTOM", 0, 1)
 			end
-
+
 			item:Show()
-
+
 			height = height + 16
 		end
 		itemFrame:SetHeight(height)
 		fixstrata("TOOLTIP", frame, frame:GetChildren())
 		frame:Show()
 		self:Fire("OnOpen")
-	end
-
+	end
+
 	-- exported
 	local function Close(self)
 		self.frame:Hide()
 		self:Fire("OnClose")
-	end
-
+	end
+
 	-- exported
 	local function Clear(self)
 		local items = self.items
@@ -222,18 +222,18 @@ do
 			AceGUI:Release(item)
 			items[i] = nil
 		end
-	end
-
+	end
+
 	-- exported
 	local function IterateItems(self)
 		return ipairs(self.items)
 	end
-
+
 	-- exported
 	local function SetHideOnLeave(self, val)
 		self.hideOnLeave = val
 	end
-
+
 	-- exported
 	local function SetMaxHeight(self, height)
 		self.maxHeight = height or defaultMaxHeight
@@ -243,19 +243,19 @@ do
 			self.frame:SetHeight(self.itemFrame:GetHeight() + 34) -- see :AddItem
 		end
 	end
-
+
 	-- exported
 	local function GetRightBorderWidth(self)
 		return 6 + (self.slider:IsShown() and 12 or 0)
 	end
-
+
 	-- exported
 	local function GetLeftBorderWidth(self)
 		return 6
 	end
-
+
 	--[[ Constructor ]]--
-
+
 	local function Constructor()
 		local count = AceGUI:GetNextWidgetNum(widgetType)
 		local frame = CreateFrame("Frame", "AceGUI30Pullout"..count, UIParent)
@@ -264,7 +264,7 @@ do
 		self.type = widgetType
 		self.frame = frame
 		frame.obj = self
-
+
 		self.OnAcquire = OnAcquire
 		self.OnRelease = OnRelease

@@ -278,37 +278,37 @@ do
 		self.SetScroll  = SetScroll
 		self.MoveScroll = MoveScroll
 		self.FixScroll  = FixScroll
-
+
 		self.SetMaxHeight = SetMaxHeight
 		self.GetRightBorderWidth = GetRightBorderWidth
 		self.GetLeftBorderWidth = GetLeftBorderWidth
-
+
 		self.items = {}
-
+
 		self.scrollStatus = {
 			scrollvalue = 0,
 		}
-
+
 		self.maxHeight = defaultMaxHeight
-
+
 		frame:SetBackdrop(backdrop)
 		frame:SetBackdropColor(0, 0, 0)
 		frame:SetFrameStrata("FULLSCREEN_DIALOG")
 		frame:SetClampedToScreen(true)
 		frame:SetWidth(defaultWidth)
-		frame:SetHeight(self.maxHeight)
+		frame:SetHeight(self.maxHeight)
 		--frame:SetToplevel(true)
-
+
 		-- NOTE: The whole scroll frame code is copied from the AceGUI-3.0 widget ScrollFrame
 		local scrollFrame = CreateFrame("ScrollFrame", nil, frame)
 		local itemFrame = CreateFrame("Frame", nil, scrollFrame)
-
+
 		self.scrollFrame = scrollFrame
 		self.itemFrame = itemFrame
-
+
 		scrollFrame.obj = self
 		itemFrame.obj = self
-
+
 		local slider = CreateFrame("Slider", "AceGUI30PulloutScrollbar"..count, scrollFrame)
 		slider:SetOrientation("VERTICAL")
 		slider:SetHitRectInsets(0, 0, -10, 0)
@@ -318,7 +318,7 @@ do
 		slider:SetFrameStrata("FULLSCREEN_DIALOG")
 		self.slider = slider
 		slider.obj = self
-
+
 		scrollFrame:SetScrollChild(itemFrame)
 		scrollFrame:SetPoint("TOPLEFT", frame, "TOPLEFT", 6, -12)
 		scrollFrame:SetPoint("BOTTOMRIGHT", frame, "BOTTOMRIGHT", -6, 12)
@@ -327,46 +327,46 @@ do
 		scrollFrame:SetScript("OnSizeChanged", OnSizeChanged)
 		scrollFrame:SetToplevel(true)
 		scrollFrame:SetFrameStrata("FULLSCREEN_DIALOG")
-
+
 		itemFrame:SetPoint("TOPLEFT", scrollFrame, "TOPLEFT", 0, 0)
 		itemFrame:SetPoint("TOPRIGHT", scrollFrame, "TOPRIGHT", -12, 0)
 		itemFrame:SetHeight(400)
 		itemFrame:SetToplevel(true)
 		itemFrame:SetFrameStrata("FULLSCREEN_DIALOG")
-
+
 		slider:SetPoint("TOPLEFT", scrollFrame, "TOPRIGHT", -16, 0)
 		slider:SetPoint("BOTTOMLEFT", scrollFrame, "BOTTOMRIGHT", -16, 0)
 		slider:SetScript("OnValueChanged", OnScrollValueChanged)
 		slider:SetMinMaxValues(0, 1000)
 		slider:SetValueStep(1)
 		slider:SetValue(0)
-
+
 		scrollFrame:Show()
 		itemFrame:Show()
 		slider:Hide()
-
+
 		self:FixScroll()
-
+
 		AceGUI:RegisterAsWidget(self)
 		return self
 	end
-
+
 	AceGUI:RegisterWidgetType(widgetType, Constructor, widgetVersion)
 end

 do
 	local widgetType = "Dropdown"
-	local widgetVersion = 31
-
+	local widgetVersion = 34
+
 	--[[ Static data ]]--
-
+
 	--[[ UI event handler ]]--
-
+
 	local function Control_OnEnter(this)
 		this.obj.button:LockHighlight()
 		this.obj:Fire("OnEnter")
 	end
-
+
 	local function Control_OnLeave(this)
 		this.obj.button:UnlockHighlight()
 		this.obj:Fire("OnLeave")
@@ -378,7 +378,7 @@ do
 			self.pullout:Close()
 		end
 	end
-
+
 	local function Dropdown_TogglePullout(this)
 		local self = this.obj
 		PlaySound(856) -- SOUNDKIT.IG_MAINMENU_OPTION_CHECKBOX_ON
@@ -393,17 +393,17 @@ do
 			AceGUI:SetFocus(self)
 		end
 	end
-
+
 	local function OnPulloutOpen(this)
 		local self = this.userdata.obj
 		local value = self.value
-
+
 		if not self.multiselect then
 			for i, item in this:IterateItems() do
 				item:SetValue(item.userdata.value == value)
 			end
 		end
-
+
 		self.open = true
 		self:Fire("OnOpened")
 	end
@@ -413,7 +413,7 @@ do
 		self.open = nil
 		self:Fire("OnClosed")
 	end
-
+
 	local function ShowMultiText(self)
 		local text
 		for i, widget in self.pullout:IterateItems() do
@@ -429,10 +429,10 @@ do
 		end
 		self:SetText(text)
 	end
-
+
 	local function OnItemValueChanged(this, event, checked)
 		local self = this.userdata.obj
-
+
 		if self.multiselect then
 			self:Fire("OnValueChanged", this.userdata.value, checked)
 			ShowMultiText(self)
@@ -443,14 +443,14 @@ do
 			else
 				this:SetValue(true)
 			end
-			if self.open then
+			if self.open then
 				self.pullout:Close()
 			end
 		end
 	end
-
+
 	--[[ Exported methods ]]--
-
+
 	-- exported, AceGUI callback
 	local function OnAcquire(self)
 		local pullout = AceGUI:Create("Dropdown-Pullout")
@@ -460,13 +460,13 @@ do
 		pullout:SetCallback("OnOpen", OnPulloutOpen)
 		self.pullout.frame:SetFrameLevel(self.frame:GetFrameLevel() + 1)
 		fixlevels(self.pullout.frame, self.pullout.frame:GetChildren())
-
+
 		self:SetHeight(44)
 		self:SetWidth(200)
 		self:SetLabel()
 		self:SetPulloutWidth(nil)
 	end
-
+
 	-- exported, AceGUI callback
 	local function OnRelease(self)
 		if self.open then
@@ -474,20 +474,20 @@ do
 		end
 		AceGUI:Release(self.pullout)
 		self.pullout = nil
-
+
 		self:SetText("")
 		self:SetDisabled(false)
 		self:SetMultiselect(false)
-
+
 		self.value = nil
 		self.list = nil
 		self.open = nil
 		self.hasClose = nil
-
+
 		self.frame:ClearAllPoints()
 		self.frame:Hide()
 	end
-
+
 	-- exported
 	local function SetDisabled(self, disabled)
 		self.disabled = disabled
@@ -503,19 +503,19 @@ do
 			self.text:SetTextColor(1,1,1)
 		end
 	end
-
+
 	-- exported
 	local function ClearFocus(self)
 		if self.open then
 			self.pullout:Close()
 		end
 	end
-
+
 	-- exported
 	local function SetText(self, text)
 		self.text:SetText(text or "")
 	end
-
+
 	-- exported
 	local function SetLabel(self, text)
 		if text and text ~= "" then
@@ -532,7 +532,7 @@ do
 			self.alignoffset = 12
 		end
 	end
-
+
 	-- exported
 	local function SetValue(self, value)
 		if self.list then
@@ -540,12 +540,12 @@ do
 		end
 		self.value = value
 	end
-
+
 	-- exported
 	local function GetValue(self)
 		return self.value
 	end
-
+
 	-- exported
 	local function SetItemValue(self, item, value)
 		if not self.multiselect then return end
@@ -558,7 +558,7 @@ do
 		end
 		ShowMultiText(self)
 	end
-
+
 	-- exported
 	local function SetItemDisabled(self, item, disabled)
 		for i, widget in self.pullout:IterateItems() do
@@ -567,7 +567,7 @@ do
 			end
 		end
 	end
-
+
 	local function AddListItem(self, value, text, itemType)
 		if not itemType then itemType = "Dropdown-Item-Toggle" end
 		local exists = AceGUI:GetWidgetVersion(itemType)
@@ -580,7 +580,7 @@ do
 		item:SetCallback("OnValueChanged", OnItemValueChanged)
 		self.pullout:AddItem(item)
 	end
-
+
 	local function AddCloseButton(self)
 		if not self.hasClose then
 			local close = AceGUI:Create("Dropdown-Item-Execute")
@@ -589,21 +589,29 @@ do
 			self.hasClose = true
 		end
 	end
-
+
 	-- exported
 	local sortlist = {}
+	local function sortTbl(x,y)
+		local num1, num2 = tonumber(x), tonumber(y)
+		if num1 and num2 then -- numeric comparison, either two numbers or numeric strings
+			return num1 < num2
+		else -- compare everything else tostring'ed
+			return tostring(x) < tostring(y)
+		end
+	end
 	local function SetList(self, list, order, itemType)
 		self.list = list
 		self.pullout:Clear()
 		self.hasClose = nil
 		if not list then return end
-
+
 		if type(order) ~= "table" then
 			for v in pairs(list) do
 				sortlist[#sortlist + 1] = v
 			end
-			tsort(sortlist)
-
+			tsort(sortlist, sortTbl)
+
 			for i, key in ipairs(sortlist) do
 				AddListItem(self, key, list[key], itemType)
 				sortlist[i] = nil
@@ -618,7 +626,7 @@ do
 			AddCloseButton(self)
 		end
 	end
-
+
 	-- exported
 	local function AddItem(self, value, text, itemType)
 		if self.list then
@@ -626,7 +634,7 @@ do
 			AddListItem(self, value, text, itemType)
 		end
 	end
-
+
 	-- exported
 	local function SetMultiselect(self, multi)
 		self.multiselect = multi
@@ -635,23 +643,23 @@ do
 			AddCloseButton(self)
 		end
 	end
-
+
 	-- exported
 	local function GetMultiselect(self)
 		return self.multiselect
 	end
-
+
 	local function SetPulloutWidth(self, width)
 		self.pulloutWidth = width
 	end
-
+
 	--[[ Constructor ]]--
-
+
 	local function Constructor()
 		local count = AceGUI:GetNextWidgetNum(widgetType)
 		local frame = CreateFrame("Frame", nil, UIParent)
 		local dropdown = CreateFrame("Frame", "AceGUI30DropDown"..count, frame, "UIDropDownMenuTemplate")
-
+
 		local self = {}
 		self.type = widgetType
 		self.frame = frame
@@ -659,10 +667,10 @@ do
 		self.count = count
 		frame.obj = self
 		dropdown.obj = self
-
+
 		self.OnRelease   = OnRelease
 		self.OnAcquire   = OnAcquire
-
+
 		self.ClearFocus  = ClearFocus

 		self.SetText     = SetText
@@ -677,9 +685,9 @@ do
 		self.SetItemValue = SetItemValue
 		self.SetItemDisabled = SetItemDisabled
 		self.SetPulloutWidth = SetPulloutWidth
-
+
 		self.alignoffset = 26
-
+
 		frame:SetScript("OnHide",Dropdown_OnHide)

 		dropdown:ClearAllPoints()
@@ -690,10 +698,10 @@ do
 		local left = _G[dropdown:GetName() .. "Left"]
 		local middle = _G[dropdown:GetName() .. "Middle"]
 		local right = _G[dropdown:GetName() .. "Right"]
-
+
 		middle:ClearAllPoints()
 		right:ClearAllPoints()
-
+
 		middle:SetPoint("LEFT", left, "RIGHT", 0, 0)
 		middle:SetPoint("RIGHT", right, "LEFT", 0, 0)
 		right:SetPoint("TOPRIGHT", dropdown, "TOPRIGHT", 0, 17)
@@ -704,7 +712,7 @@ do
 		button:SetScript("OnEnter",Control_OnEnter)
 		button:SetScript("OnLeave",Control_OnLeave)
 		button:SetScript("OnClick",Dropdown_TogglePullout)
-
+
 		local button_cover = CreateFrame("BUTTON",nil,self.frame)
 		self.button_cover = button_cover
 		button_cover.obj = self
@@ -713,14 +721,14 @@ do
 		button_cover:SetScript("OnEnter",Control_OnEnter)
 		button_cover:SetScript("OnLeave",Control_OnLeave)
 		button_cover:SetScript("OnClick",Dropdown_TogglePullout)
-
+
 		local text = _G[dropdown:GetName() .. "Text"]
 		self.text = text
 		text.obj = self
 		text:ClearAllPoints()
 		text:SetPoint("RIGHT", right, "RIGHT" ,-43, 2)
 		text:SetPoint("LEFT", left, "LEFT", 25, 2)
-
+
 		local label = frame:CreateFontString(nil,"OVERLAY","GameFontNormalSmall")
 		label:SetPoint("TOPLEFT",frame,"TOPLEFT",0,0)
 		label:SetPoint("TOPRIGHT",frame,"TOPRIGHT",0,0)
@@ -732,6 +740,6 @@ do
 		AceGUI:RegisterAsWidget(self)
 		return self
 	end
-
+
 	AceGUI:RegisterWidgetType(widgetType, Constructor, widgetVersion)
-end
+end
diff --git a/libs/AceGUI-3.0/widgets/AceGUIWidget-Icon.lua b/libs/AceGUI-3.0/widgets/AceGUIWidget-Icon.lua
index bc3d02a..378e813 100755
--- a/libs/AceGUI-3.0/widgets/AceGUIWidget-Icon.lua
+++ b/libs/AceGUI-3.0/widgets/AceGUIWidget-Icon.lua
@@ -56,7 +56,7 @@ local methods = {
 	["SetImage"] = function(self, path, ...)
 		local image = self.image
 		image:SetTexture(path)
-
+
 		if image:GetTexture() then
 			local n = select("#", ...)
 			if n == 4 or n == 8 then
diff --git a/libs/AceGUI-3.0/widgets/AceGUIWidget-Label.lua b/libs/AceGUI-3.0/widgets/AceGUIWidget-Label.lua
index 7a754f6..eec999e 100755
--- a/libs/AceGUI-3.0/widgets/AceGUIWidget-Label.lua
+++ b/libs/AceGUI-3.0/widgets/AceGUIWidget-Label.lua
@@ -57,12 +57,12 @@ local function UpdateImageAnchor(self)
 		label:SetWidth(width)
 		height = label:GetStringHeight()
 	end
-
+
 	-- avoid zero-height labels, since they can used as spacers
 	if not height or height == 0 then
 		height = 1
 	end
-
+
 	self.resizing = true
 	frame:SetHeight(height)
 	frame.height = height
@@ -113,7 +113,7 @@ local methods = {
 	["SetImage"] = function(self, path, ...)
 		local image = self.image
 		image:SetTexture(path)
-
+
 		if image:GetTexture() then
 			self.imageshown = true
 			local n = select("#", ...)
diff --git a/libs/AceGUI-3.0/widgets/AceGUIWidget-MultiLineEditBox.lua b/libs/AceGUI-3.0/widgets/AceGUIWidget-MultiLineEditBox.lua
index 9af4b87..f702110 100755
--- a/libs/AceGUI-3.0/widgets/AceGUIWidget-MultiLineEditBox.lua
+++ b/libs/AceGUI-3.0/widgets/AceGUIWidget-MultiLineEditBox.lua
@@ -233,7 +233,7 @@ local methods = {
 		end
 		Layout(self)
 	end,
-
+
 	["ClearFocus"] = function(self)
 		self.editBox:ClearFocus()
 		self.frame:SetScript("OnShow", nil)
@@ -253,12 +253,12 @@ local methods = {
 	["GetCursorPosition"] = function(self)
 		return self.editBox:GetCursorPosition()
 	end,
-
+
 	["SetCursorPosition"] = function(self, ...)
 		return self.editBox:SetCursorPosition(...)
 	end,
-
-
+
+
 }

 --[[-----------------------------------------------------------------------------
@@ -273,7 +273,7 @@ local backdrop = {
 local function Constructor()
 	local frame = CreateFrame("Frame", nil, UIParent)
 	frame:Hide()
-
+
 	local widgetNum = AceGUI:GetNextWidgetNum(Type)

 	local label = frame:CreateFontString(nil, "OVERLAY", "GameFontNormalSmall")
@@ -290,7 +290,7 @@ local function Constructor()
 	button:SetText(ACCEPT)
 	button:SetScript("OnClick", OnClick)
 	button:Disable()
-
+
 	local text = button:GetFontString()
 	text:ClearAllPoints()
 	text:SetPoint("TOPLEFT", button, "TOPLEFT", 5, -5)
@@ -339,7 +339,7 @@ local function Constructor()
 	editBox:SetScript("OnTextChanged", OnTextChanged)
 	editBox:SetScript("OnTextSet", OnTextSet)
 	editBox:SetScript("OnEditFocusGained", OnEditFocusGained)
-
+

 	scrollFrame:SetScrollChild(editBox)

diff --git a/libs/AceGUI-3.0/widgets/AceGUIWidget-Slider.lua b/libs/AceGUI-3.0/widgets/AceGUIWidget-Slider.lua
index 5a81759..019c84e 100755
--- a/libs/AceGUI-3.0/widgets/AceGUIWidget-Slider.lua
+++ b/libs/AceGUI-3.0/widgets/AceGUIWidget-Slider.lua
@@ -105,7 +105,7 @@ local function EditBox_OnEnterPressed(frame)
 	else
 		value = tonumber(value)
 	end
-
+
 	if value then
 		PlaySound(856) -- SOUNDKIT.IG_MAINMENU_OPTION_CHECKBOX_ON
 		self.slider:SetValue(value)