# v2.8.3.668

TradeSkillMaster: Revived

- Release Date: March 23rd, 2023
- Author: Gnomezilla on Warmane-Icecrown [https://github.com/Bananaman].


## Total Time Elapsed Shown After "Full Scan" and "Group Scan" Completion

The "Full Scan" and "Group Scan" features now display the "total time elapsed" in the status bar after completion, such as "Done Scanning (1:35:27)".

This helps players get a better feel for how long each scan takes, and gives people something nice to look at after each scan.


## Improved Formatting of the "Full Scan" Time Estimate

We now display the time as `elapsed time / ~estimated total time`, such as `0:15:37 / ~1:41:27`.

The total time estimate is continuously updated during the scan, based on our intelligent, weighted "seconds per page" metric and the total number of pages (which can dynamically change during a scan, when other people post or buy auctions). This "total time estimate" therefore follows the server performance beautifully and is very accurate yet responsive to server performance changes.

It's easier to understand than our previous display of "estimated time remaining", since the server might rapidly send you 10 pages in just a few seconds (which then counted down the "estimated time remaining" very quickly), before suddenly stalling for 30 seconds without any progress. It was still exactly as accurate as the new display method, but the new method is nicer to look at and easier to understand.



---

# v2.8.3.667

TradeSkillMaster: Revived

- Release Date: March 20th, 2023
- Author: Gnomezilla on Warmane-Icecrown [https://github.com/Bananaman].


## AuctionDB's "GetAll" Scans Can Now Be Disabled

You can now completely disable "GetAll" scans via the AuctionDB settings. This is useful if your server doesn't return all auctions in its "GetAll" results, which means that you'll get incorrect market value calculations for all items. If you're playing on such servers, it's best to disable the "GetAll" feature to avoid accidentally polluting your price database with incorrect data.

Go into TSM's main options, and then the "AuctionDB" section at the top. Click on the "Options" tab, and use the "Disable GetAll Auction Scans" checkbox. Disabling the "GetAll" feature will also hide its button from the auction scanning GUI.

This protection feature is disabled by default, since most casual players probably won't care that "GetAll" generates incorrect market values. However, it's an incredibly good feature for professional gold makers, who want to avoid all risks of calculating incorrect item prices.

Regardless of whether you use this feature or not, the AuctionDB scan GUI has also been cleaned up now, with much cleaner and more uniform spacing between the various scan buttons.



---

# v2.8.3.666

TradeSkillMaster: Revived

- Release Date: March 19th, 2023
- Author: Gnomezilla on Warmane-Icecrown [https://github.com/Bananaman].


## The Market Value Algorithm Actually Works Now

The new market value algorithm now actually calculates the market value.

Yes, seriously. For some reason, the previous algorithm author didn't think about sorting the auction scan data by "buyout price" before parsing it, which meant that all previous TSM calculations were completely incorrect. All previous versions of TSM generate absolutely batshit insane market prices, such as "1 Wool = 500 Gold", simply because the old algorithm was completely broken.

Therefore, TSM's core feature, the "dbmarket" value which is used in its automatic pricing algorithms, was completely broken and useless.

It has now been fixed. All market value calculations are now correct.

In fact, all of your old AuctionDB databases should be wiped and restarted from zero data with this new patch, so that you get rid of all old, corrupt market price data.


## Completely Rewritten Auction Scanning Algorithm

Rewritten, cleaned up and much faster auction scanning algorithm, which uses almost zero memory and NEVER causes any memory overflow crashes, unlike the old algorithm.

This new algorithm is 1.3x-27.3x faster depending on input data size, and on average 5x faster for most data. It uses less than 5% of the memory of the old algorithm. :)

If you want to see for yourself that the new algorithm is working correctly, you simply have to set `verifyNewAlgorithm = true` at the top of `TradeSkillMaster_AuctionDB/Modules/Scanning.lua`, and then run a "GetAll" scan to quickly fetch a huge amount of auctions. It will then process all of the data via both the old and new algorithms, and will display the speed improvements of the new algorithm. If there are any differences at all between the calculations of the two algorithms, it would tell you about that via an "error" message. But the algorithms behave completely identically, so you don't have to worry about that and won't see any errors. This verification feature was simply added because the algorithm rewrite is a massive change, and I am sure that some people will want to verify the complex new algorithm with their own eyes.


## Fixed Database Decoding Crash

Fixed a database decoding bug which caused TSM to crash anytime you attempted to decode data for a "corrupted" item in the database.

This bug usually manifested itself as people failing to perform auction house scans, since every "Full Scan" and "GetAll Scan" (but not "Group Scan") ends by decoding EVERY existing item in your current database (to reset their last-seen, cheapest "minBuyout" value to nil before processing the new data). This meant that the decode failures were usually triggered when people reached the end of their auction scans (but would also happen any other time when something attempts to decode data for that item, such as attempting to view the price-info tooltip of an item that has corrupt data in your database).

The cause of the random database corruption is pretty much impossible to find, but it's extremely rare (and it might even have been caused by people re-using databases from older versions of TSM). The fix simply ignores the corrupt "market day / scan" data for items that cannot be correctly decoded, thus purging those corrupt "days / scans" from the database automatically, while still rescuing their remaining non-corrupt data.


## Added Support for SharedMedia and Custom GUI Fonts

For some insane reason, TradeSkillMaster uses "Arial" as its default font, which is one of the ugliest fonts in the Universe.

Therefore, I've implemented LibSharedMedia support in TSM, which means that you now have access to a huge variety of fonts. By default, TSM will only list the game's own fonts, but you can install the [SharedMedia](https://github.com/bkader/SharedMedia#install) addon for WOTLK to add over 100 extra fonts that are now usable in TSM! Other addons you've installed may also be adding extra fonts to the LibSharedMedia collection!

To change TSM's font, simply type "/tsm", then go into the main tab, and then "Options". Scroll down to the bottom, until you see the new "Normal Font" and "Header Font" options. Have fun!

Note: TSM is unable to use SharedMedia fonts that are registered by addons that load AFTER TSM, since TSM accesses the fonts and creates its own GUI immediately when it loads, even before the user opens TSM's GUI. To use fonts from such an addon, you have to add that addon to "OptionalDeps" in "TradeSkillMaster.toc", which tells the game that you want TSM to load AFTER the addon that provides your extra fonts. This step isn't necessary for SharedMedia fonts, since they're already marked as an optional TSM dependency now.


## Made the "Group Scan" (AuctionDB) Progress Bar More Logical

The old progress bar for "Group Scans" used absolutely insane numbering and progress messages. It previously went: "Preparing Filter 1 / 2", "Preparing Filter 2 / 2", "Scanning 0 / 2 (Page 1 / 1)", "Scanning 0 / 2 (Page 2 / 16)", ... "Scanning 0 / 2 (Page 16 / 16)", "Scanning 1 / 2 (Page 1 / 1)", "Scanning 1 / 2 (Page 2 / 6)", ... "Scanning 1 / 2 (Page 6 / 6)", "Done Scanning".

It made absolutely zero sense, and was inconsistent with the behavior of other "counting" progress labels in TSM. There were two issues with it: The item scanner counted from 0, so item 0 was actually item 1, and item 1 was actually item 2, etc. The other issue is that it always said "Page 1 / 1" while requesting the first page, which was a very confusing and misleading display.

Both issues have now been fixed, and the exact same scan would now look as follows: "Preparing Filter 1 / 2", "Preparing Filter 2 / 2", "Scanning 1 / 2 (Page 1 / ?)", "Scanning 1 / 2 (Page 2 / 16)", ... "Scanning 1 / 2 (Page 16 / 16)", "Scanning 2 / 2 (Page 1 / ?)", "Scanning 2 / 2 (Page 2 / 6)", ... "Scanning 2 / 2 (Page 6 / 6)", "Done Scanning".

In other words, we now properly count the items we're processing, and we display a temporary question mark while we're fetching page 1 (while we don't know how many other pages exist), which then changes into the actual page count as the scan proceeds.


## Made the "Auctioning" Module's Progress Bar More Logical

This is similar to the "Group Scan" issues described above.

The "Auctioning" module's features (Post Scan / Cancel Scan / Reset Scan) had several issues.

They were counting items from 0, so the progres bar said "Scanning 0 / 2" for the first item, and "Scanning 1 / 2" for the final item. That has now been fixed and now counts properly (as "1/2" and "2/2").

They also had a completely broken page counter, which didn't properly reset between items, which meant that you'd see complete nonsense while scanning, such as "Scanning 3 / 5 (Page 5 / 5)" followed by "Scanning 4 / 5 (Page 5 / 5)" (keeping the previous page counter), and then the proper counter would finally show up as "Scanning 4 / 5 (Page 1 / 12)" after a few seconds (whenever the server finally replied to the query). It was broken and confusing as hell. That's now been fixed too, so that it properly resets the page counter before every new item it's scanning.

Furthermore, the confusing "Page 1 / 1 ... Page 2 / 18" issue has been fixed here too, and now says "Page 1 / ?" while fetching the first page of each item.

Lastly, their page counter was inconsistent with the behavior of regular "AuctionDB: Group Scan" and the "Shopping" progress bars. The page counter in "Auctioning" was zero-indexed, meaning that "Scanning Page 1/8" meant that you were actually scanning page 2/8. That math has now been fixed here, for consistency with the AuctionDB and Shopping scanner's math, because that's a much more logical way to display the pages.


## Made the "Shopping" Module's Progress Bar More Logical

The "Shopping" module's scanner had multiple issues.

The bar background was supposed to gradually "fill in" to indicate progress for both the "current/total item progress" and the "page progress of the current item". But the math was completely broken. It rendered the progress bar incorrectly, since it ended up counting the progress as "2 items below the item it's currently working on" (due to a mistaken "-1" in the old math). As a result, if you were currently scanning item 3 of 3, you SHOULD have seen a 66% full bar (since 2 of 3 items are done, and the 3rd is being worked on). But you instead only saw a 33% full bar, which was completely wrong. This was especially noticeable if you performed a multi-item search, such as "copper ore; copper bar; gold ore; gold bar".

They were also counting items from 0, so the progress bar said "Scanning 0 / 2" for the first item, and "Scanning 1 / 2" for the final item. That has now been fixed and now counts properly (as "1/2" and "2/2"), just like with the other modules above.

Lastly, the confusing "Page 1 / 1 ... Page 2 / 18" issue has been fixed here too, and now says "Page 1 / ?" while fetching the first page of each item.


## Accurate Time Estimate for the "Full Scan" Progress Bar

Implemented an accurate "time remaining" estimate for the "Full Scan" algorithm. The progress bar now shows how much time remains until the scan is complete, such as `Scanning page 293/2399 (~1:04:34)`, meaning that roughly one hour remains. This is very useful for people who want to use the comprehensive "Full Scan" scanning method, but who hate the feeling of blindly scanning without being able to see the remaining time.

The first time you run a scan on a server, you'll have a very unpredictable estimate, since we use a learning algorithm. The estimate is based on how fast the server is feeding us the "auction pages" on average, which is impossible to know on the first run. Most servers will gradually throttle the player's requests and use random load throttling, so you'll see a growing estimate until it finally settles on an accurate estimate after around 80% of the pages have been received. The slowdown curve depends on the server's throttling implementation, and cannot be predicted ahead of time.

Think of the first run as the "learning run". After you've completed a "Full Scan", our algorithm learns from it and will produce excellent estimates for all future scans, using a blending algorithm which takes into account both the active run's speed and previous speeds, to predict the server's behavior. The statistics are stored per-server and per-faction, so if you're playing both Alliance and Horde, you'll have to do one full scan per faction to teach it about both factions.

Note regarding the other scan types: The "GetAll Scan" algorithm only takes a few seconds, so it doesn't need any time estimate. And the "Group Scan" algorithm can't implement any estimate, since there's no way to know how many "auction pages" the remaining items in the group will have.


## Improved "GetAll" Algorithm Reliability

Most private servers don't implement WoW's "can we perform a GetAll Query?" API, and incorrectly answer that the user is allowed to run a query, even though you may still be throttled after a recent "GetAll" scan. Therefore, TSM's own "don't start a GetAll if we're on cooldown" check doesn't work on private servers. The user may therefore click on "Run GetAll Scan" and will then just blindly sit there like an idiot while the request has actually been secretly ignored by the server.

This situation has now been fixed, so that the "GetAll" scan UI tells the user when the server has silently throttled / ignored their "GetAll" request, so they don't sit there and wait for hours without any progress. Basically, if it's taken longer than 30 seconds, we're assuming that the request has been silently ignored by the server, and will now tell the user via the TSM GUI's progress bar message. It first says `Running query...` as usual, which then changes to `Running query... Server not responding due to throttling? Try again later...` if there hasn't been a server response in more than 30 seconds.

The "GetAll" algorithm has also been improved to automatically detect when your server is only sending limited / truncated data. Extremely large private servers such as Warmane simply have too many auctions, and their "GetAll" scan won't retrieve all of them. We now warn the user via a chat-message whenever we detect truncated auction data, and we then tell them to use "Full Scan" instead.

It's unfortunately impossible to calculate accurate market values if your server is sending truncated "GetAll" responses, but people may still prefer the speed of the "GetAll" scans, so we're therefore still allowing their "truncated" auction data to be processed. The users will have to read the warning message and decide for themselves which scans they want to use.

The inaccuracy of an incomplete "GetAll" scan completely depends on how the server implements "GetAll". If the server sorts the cheapest auctions first, then it's somewhat acceptable for popular items which have many stacks (and are therefore likely to contain enough data points in the "GetAll" result), and those items will "just" tend to be undervalued by 2-10% less than their real market value (since their percentile-based scans will look at less auctions than the real amount). But for very rare or unpopular items, the partial "GetAll" scan is very dangerous, since you might only receive the massively overpriced auctions of a certain item, and thereby calculate an insanely high market value for it. These dangers are increased if the server sends the auctions in a totally random order, which means an even greater risk of market price pollution by only seeing overpriced auctions for many of the items.

Furthermore, receiving incomplete "GetAll" results means that TSM will wipe all of its "cheapest, current buyout price" data for all items, and then fills them with incorrect data (or nothing at all if an item wasn't seen in the latest fetch), thus hindering your ability to look up the correct "best current buyout prices" too.

In summary, you'll have to use partial "GetAll" results at your own risk! A "Full Scan" is ALWAYS much better when your server's "GetAll" doesn't provide all auction data!


## Improved All Auction Data and Market Value Processing

There were several bugs everywhere in the old code. For example, only the "GetAll" scan had correctly implemented filtering of non-buyout items (auctions that ONLY have a bid price, without any buyout price), which meant that TSM's other scan methods ("Full Scan", "Group Scan", etc) were injecting invalid data into the player's database, such as items with empty "buyout prices". They were being treated as items with a buyout price of ZERO (as if they were totally free items, at no cost!). This serious bug happened every time when there were ANY bid-based auctions for an item in the latest scan.

All of the auction scanning and processing algorithms have been rewritten for correctness, and will now filter out those useless "bid-only" data entries. We will only analyze auctions that have buyout prices.

Several bugs have also been fixed related to items being incorrectly marked as "seen and scanned now" even when there was no new data for that item in the latest data batch (this was yet again related to the "incoming data only has bid-based auctions" bug). We now only update the scan-statistics for items when we encounter new data for them with valid buyout prices.

There were also bugs in the market value calculation algorithm, which would crash with "division by zero" if given empty input data (yet again related to only having bid-based auctions in the input data, but this crash only happened if there were only bid-based auctions for an item, without any buyout-based auctions whatsoever for that item, so it was rare to encounter this crash). That issue has also been fixed now, by adding perfect protection against empty inputs in the market value calculation algorithm.

We also no longer update the market value for an item if we were unable to calculate a new market value (the old code simply wrote invalid market values to the database without any sanity checks).

All of these improvements mean that TSM's market price estimates are now infinitely more reliable than old TSM versions.


## Fixed Missing "Interruption" Events in Auction Scanners

This is a great example of what a total mess the TSM codebase is...

All auction scanners (AuctionDB, Auctioning and Shopping) were missing their "scan interrupted" event, which is triggered when the Auction House frame closes while a scan is ongoing.

The problem was caused by the fact that TSM previously used the "LibAuctionScan-1.0" library, which emits the "SCAN_INTERRUPTED" event. All TSM scanners were still written to react to that old event name. But TSM nowadays uses their own scanning library instead, which sends the "INTERRUPTED" event instead. They literally forgot to update the event handlers when they switched the library, and they didn't even bother deleting the old library either.

All three scanning methods have now been fixed, to react to the proper "INTERRUPTED" event, to be able to detect when your scans are interrupted by the auction window being closed.

Furthermore, the "Shopping" module hadn't implemented interruption handling whatsoever. There literally wasn't any event handler for it. It has now been properly implemented, so that the "Shopping" scanner works properly and correctly resets itself after interruptions.


## IMPORTANT!

When upgrading to this improved version, it's an extremely good idea to delete your old-school, CORRUPT auction database, since your old data has been generated by the extremely buggy algorithms of the old TSM. For example, some of those old "auction data corrupting" bugs include the fact that it was calculating completely incorrect market values when doing "GetAll" scans, since it was previously unable to handle per-item prices inside item stacks, and another bug is the fact that all other scan methods generated wrong market values too, thanks to TSM's previously completely broken market value algorithm (those problems are described in the other changelog entries above).

There is NO GOOD REASON to keep your old auction database. It's all corrupt thanks to all the old TSM bugs, 100% guaranteed. You need to start fresh.

If you're ready to start fresh, simply delete these files (where `YOUR_ACCOUNT_NAME` is your own account name):

```
./WoW/WTF/Account/YOUR_ACCOUNT_NAME/SavedVariables/TradeSkillMaster_AuctionDB.lua.bak
./WoW/WTF/Account/YOUR_ACCOUNT_NAME/SavedVariables/TradeSkillMaster_AuctionDB.lua
```

Then do a "Full Scan" in the game, and you'll be sure that all data from now on is processed using more intelligent algorithms.

All serious bugs are fixed now. You can finally relax and enjoy TSM.



---

v2.8.3
*Made TSMAPI:IsSoulbound() MUCH more efficient which will GREATLY reduce the interface log of all modules..

v2.8.2
*Added LibChatAnims to fix Blizzard bug with adding chat filters.

v2.8.1
*Updated connected realms.
*Added some more validation to price sources to avoid lua errors.

v2.8
*Fixed issue with TSM error handler.
*Removed 1.x dealfinding / shopping list support for importing items to groups.
*Added options for displaying prospect and mill values in tooltips (enabled by default).
*Reorganized general tooltip options slightly.
*Fixed bug with "/tsm version" not going in the right chat tab.
*Added confirmation for copying a profile.

v2.7
*Added new "check" function for doing logic operations in custom prices.
*Fixed bug with multiple fixed gold values in custom prices being invalid in certain situations.
*Removed "Status / Credits" tab and put credits at the bottom of the first tab instead.
*Modified the "New Group Name" editbox to contain the current group name by default.
*Made external price sources (mainly from Auctioneer) more consistent with TSM price sources.

v2.6.2
*Added verify for a sync setup which has been corrupted due to manual copying of saved variables.
*Added help button to main TSM frame for opening TSM assistant.
*Made lines under icons in main TSM frame shorter so they don't interfere with the title text.

v2.6.1
*Fixed typo in Assistant step.
*Made Assistant window wider.

v2.6
*Added new TSM Assistant feature!
*Removed SetUnit hook from LibExtraTip to avoid errors.
*Updated localized strings.
*Updated hard-coded list of connected realms.

v2.5.14
*Added line to TSM Info / Help page.

v2.5.13
*Fixed issue with importing groups with spaces in the subgroup names.
*Fixed bug with post confirmation window and removed coloring of g/s/c letters.

v2.5.12
*Fixed bug introduced in v2.5.11 with percentages in price sources.

v2.5.11
*Fixed bug with parsing price sources with multiple percentages.

v2.5.10
*Added functionality to TSMAPI functions including auto-complete support for editboxes.
*Minor code cleanup.

v2.5.9
*Fixed bug which was causing lua errors in TSM_Shopping.

v2.5.8
*Minor bug fix.

v2.5.7
*Improved TSM:GROUPS:* events for external usage.

v2.5.6
*Added TUJ as optional dependency to ensure it loads first.

v2.5.5
*Fixed bug with importing operations.

v2.5.4
*Cleaned up some code in the error handler and made it more resilient.

v2.5.3
*No change - fixing issue with curse packager.

v2.5.2
*Fixed bug with new change in v2.5.1.

v2.5.1
*Fixed bug with preparing filters taking a very long time.
*Removed name from auction results row.
*Removed some debug code.

v2.5
*Added error message when you try and move a group to one of its subgroups.
*Reorganized and cleaned up the code.
*Added option for embedding TSM's tooltip lines (enabled by default to maintain prior behavior).
*TSM's error handler will now ignore errors from auc-stat-wowuction.
*Fixed issue with multi-account syncing in patch 5.4.7.

v2.4.5
*Fixed issue with resizing the TSM window.
*Added some debug code.
*Potentially fixed bug with scans scanning too many pages due to missing item info.
*Fixed bug with main window not correctly saving its position and size between sessions.
*Fixed bug with moving the main window from the TSM icon
*Added TSMAPI:Assert for unexpected conditions which should be reported as errors to the TSM team.
*Added TSMAPI:Verify for conditions which require corrective action by the user and are not addon bugs.
*Soulbound items will no longer be moved for warehousing/auctioning options on the BankUI.
*Added events and event logger. Improved error handler.
*Fixed bug with tooltips having a delayed update after modifier keys are pressed.
*Errors occurring within threads should now be properly reported.
*Added vanilla gems to conversions.
*Added TSMAPI:GetConnectedRealms() to allow for basic connected realm support.
*Fixed bug with multi-account code constantly trying to add people to the friends list.

v2.4.4
*Fixed bug with TSM tooltip.
*Cleaned up some code.

v2.4.3
*Added tooltip options for displaying custom price sources in tooltips.

v2.4.2
*Fixed stack overflow issue with importing of large groups.

v2.4.1
*No change, trying to fix issue with curse.

v2.4
*Implemented new method for modules to export data to the TSM app.
*Changed red group color to be orange instead.
*Added support for scanning the last page (used by the Sniper feature of TSM_Shopping).
*Cleaned up much of the Auction scanning code.
*Made the "max" labels in the post frame clickable buttons.
*Added support for tabbing between fields in the post frame.
*Fixed some issues with prices changing incorrectly in the post frame when certain fields were modified.
*Added caching of battlepet names on-load to reduce errors from incomplete battlepet info.

v2.3.2
*Fixed some display issues with slider tooltips.

v2.3.1
*Fixed bug with common search term generation for items which have overlapping names (ie gems).
*Fixed bug in group import code.

v2.3
*TSM will now take into account common classes when generating AH query.
*Added option (enabled by default) to color group names within group trees based on their sub-group depth.
*Added display of locals to error handler.
*Fixed bug in common search term code.

v2.2.10
*Added [Jard's Peculiar Energy Source] to soulbound mats.

v2.2.9
*Fixed bug with adding a special character when renaming a group.

v2.2.8
*Fixed bug with battle pets.

v2.2.7
*Groups in grouptrees will now be selected by default.
*Greatly improved TSM's display of error messages.
*Fixed bug in TSMAPI:CreateTimeDelay which caused label-less timers to collide.

v2.2.6
*Fixed an issue with common search terms for items whose name matches the common search term (ie uncut gems).

v2.2.5
*Fixed bug with the current profile not being saved.
*Fixed bug with getting battle pet item info.
*Fixed sorting of auction result table.
*Removing an operation from a group will no longer switch to the new operation page.

v2.2.4
*Made group trees select all groups by default.

v2.2.3
*Fixed bug with formatted gold amounts in custom prices.

v2.2.2
*Fixed issue with using itemlinks in custom prices.

v2.2.1
*Fixed issue with group trees not remember their selection status in some situations.

v2.2
*Fixed bug with getting battle pet item info.
*Removed TSMAPI function to disable TSM error handler from packaged versions.
*Added list of groups which an operation is currently applied to, along with a remove button for each group, to the management tab of operations.
*Typing "/tsm freset" will now reset the position of all movable frames from all modules.
*Group trees will now remember which groups are selected (all will be deselected by default).
*Custom prices will now support any number of formatted gold values (instead of just one).
*Renamed TSMSelectionList to TSMGroupItemList interally.
*Added "avg()" function support to custom prices.

v2.1.14
*Fixed typo in code which caused issues with the bank UI and the DufUIBank addon.
*Fixed issues with sliders and treegroups caused by 5.4 changes.

v2.1.13
*Grabbing latest version of AccurateTime (again).

v2.1.12
*Grabbing latest version of AccurateTime.

v2.1.11
*Added some missing soulbound mats to internal lookup table.
*AccurateTime will now be embedded instead of standalone.

v2.1.10
*Fixed issue with '/tsm bankui' creating duplicate windows.
*Fixed bug with auction result sorting.
*Fixed some memory leaks.

v2.1.9
*Added new !AccurateTime library and fixed some issues around debugprofilestart/stop usage.
*Cleaned up .toc file a bit.
*Added bankui support for DufUIBank addon.

v2.1.8
*The BankUI will now remember its position (independantly for bank and guild bank).
*Added /tsm bankuireset to reset the BankUI frame position

v2.1.7
*Added caching to various commonly used APIs.
*Bug fix with item info caching.
*Added disenchant mats to tooltip.

v2.1.6
*added bankUI support for cargBags Nivaya

v2.1.5
*Fixed bug with clicking on scrolling table columns.

v2.1.4
*Added latent kor'kron pieces as non-disenchantable.
*Fixed bug with tree groups.

v2.1.3
*Fixed some conversion/destroying ratios.
*Fixed some patch 5.4 issues.
*Fixed a bug with switching profiles.
*Limited quantity items from a vendor will no longer be tracked.
*Updated TOC for patch 5.4.

v2.1.2
*Fixed various issues with disenchanting ratios.
*Fixed issue with soulbound materials.
*Made room for shopping tooltip options.
*Fixed bug with importing of subgroup structure.

v2.1.1
*Fixed bug with multiple occurrences of a custom price sources within a custom price.
*Fixed disenchanting ratios.
*Fixed tooltips for auction result rows.
*Improved how module icons are displayed in the main TSM window.

v2.1
*Some advanced features will now be designated as such with red title text.
*Added theme option for the color used to designate advanced features.
*Added the ability to import and export operations.
*Fixed issue with detecting disenchantable items on non-enUS clients.
*Added support for decimal places in percentages in custom prices.
*Added option to export/import subgroup structure when exporting/importing groups.
*Group selection trees will now remember their expanded/collapsed status info on a per-module basis.
*Shift-clicking the "<<< Remove" button in the "Items" tab of a group will now remove the items from all groups rather than move the items to their parent group.
*Filtering the item selection list in the "Items" tab for groups will now hide filtered-out rows.
*Added option for changing the chat tab which TSM and its modules use for printing messages.
*Added loop detection to custom price code.
*Fixed a bug with custom prices with specific items in them.
*Fixed error from missing localization phrase.
*Fixed stack overflow with very long custom prices.
*Added the ability to create custom price sources.
*Added more error checking to the custom price validation code.

v2.0.10
*Fix for error when alt-clicking buying in destroy mode.

v2.0.9
*Fixed some divide by zero issues found on 5.4 PTR.
*Fixed issue with bank updates going out to modules after bank was closed.
*Fixed bug with alt-click buying in destroy mode for TSM_Shopping.

v2.0.8
*Fixed bug with certain gold amounts not getting correctly formatted.

v2.0.7
*All scrolling tables will now have constant-height rows.
*Fixed bug with tooltip for battlepets.

v2.0.6
*Fixed issue with spaces in itemStrings.

v2.0.5
*Added option for including soulbound items in movement APIs.
*Fixed bug with syncing code trying to sync with the current character.
*Fixed various issues with manual posting.

v2.0.4
*Updated LibExtraTip.
*Fixed a bug with auction result tooltips not working for battlepets.
*TSM tooltip data will now be shown for battlepets as well as items.

v2.0.3
*Fixed a bug with vendorsell price source.

v2.0.2
*Fixed a bug with being unable to add ungrouped random enchant items as the base item.
*Fixed issue with first() and vendorsell in custom prices.

v2.0.1
*Fixed a bug with the version showing as "Dev" instead of v2.0.

v2.0
*First 2.0 Version!
\\

v1.6
*Updated TOC for patch 5.2.
*Added quick buyout feature to auction result frames.
*Added more theme options and preset themes.
*Adjusted milling/prospecting/disenchanting ratios as necessary.
*Added basic battle pet support.
*Improved the TSM error handler.
*Many other minor bug fixes and improvements.

v1.5
*Updated existing themes and added some new ones.
*Changed default theme to "Goblineer" as voted on by forum members.
*Updated TOC for patch 5.0.4
*TSM will now block all chat messages related to creating and canceling auctions.
*Added a slash command for resetting the position of the main TSM frame - '/tsm freset'.
*Fixed the green +/- buttons in treegroups.
*Made all the progress bars across the modules consistent.
*Rewrote all the auction results table code to address multiple issues.
*Added a slider to the TSM options tab for adjusting how many rows are shown in auction results tables.
*Many other minor bug fixes and improvements.

v1.4
*Redesigned the look and feel of the main TSM window and the auction house tab.
*Added a bunch of new options for customizing the new look.
*Added the ability to import / export appearance settings.
*Added a list of importable preset themes for TSM.
*There is now a hidden gem somewhere in TSM. Find it and something cool will happen :).
*Removed a few things which will cause errors in patch 5.0.4.
*Added support for the general stats which are now also included in the TUJ realm edition.
*TSM will now be packaged with a new version of LibAuctionScan which has significant scan speed improvements.
*Many other minor bug fixes and improvements.

v1.3
*Added further warnings for users who may still have TSM_Gathering installed.
*Fixed error caused by having Auctioneer enabled by not the Appraiser module.
*Performed a major reorganization of TSM's code to make it easier to find specific functions.
*Added tooltip support for selection lists.
*Fixed a bug with SelectionLists not adding/removing items that were selected by not visible.
*Updated all the disenchanting tables to fix a handful of inaccuracies.
*Fixed an error caused by changing the Auction House scale before opening it for the first time.
*SelectionList filters will now be parsed to avoid string pattern errors.
*Many other minor bug fixes and improvements.

v1.2
*Added destroying data for essences / shards / crystals for the Destroying feature in the Shopping module.
*Fixed various bugs with the TSM auction house tab / detached frame not displaying correctly.
*Added option for opening all your bags when the AH is shown.
*Added option for detaching the TSM auction house tab by default.
*The TSM auction house tab will now remember its detached possition throughout a single session.
*Removed localized strings from error handler and added client locale info.
*Many other minor bug fixes and improvements.

v1.1
*Improved TSM's error catcher.
*TSM's AH tab is now it's own window which can be detached from the main AH frame.
*When TSM's tab is attached, it'll hide behind the main AH frame when you switch tabs, allowing your TSM scan to continue "in the background".
*Added options for making the main AH frame movable and for changing the scale of the AH frame.
*Added an option for removing the bids from auction results to make the buyouts easier to read (bids are now hidden by default).
*Updated the LDBIcon to use a different texture than the minimap icon.
*Many other minor bug fixes and improvements.

v1.0
*First Release Version!
\\

**Beta Versions:**

v0.2.4
*Updated some APIs for a new feature that's in the works.
*Updated the TOC for patch 4.2.

v0.2.3
*Added support for spell tooltips.
*Removed the extra "v" that would show up infront of version numbers.
*Took out the Destroying button code (was moved to the Destroying module's code).
*Added some new info messages that'll appear in popups when the user logs in.
*Many other minor changes.

v0.2.2
*Added AceHook and lib-st libraries.
*Fixed a typo in one of the tips.
*Many other minor changes.

v0.2.1
*Finally fixed the bug where selectionlists (such as the one used for adding or removing items to Auctioning groups / categories) were only displaying the first 4 items under some circumstances.
*Updated the TOC for patch 4.1

v0.2
*Added TSM tips to the status bar of the main TSM window. The tip will change everytime the TSM window is open.
*Added a ton of support code for the AuctionDB and Destroying modules.
*Cleaned up the unused slash command code as well as a bunch of other parts of the code.
*Updated the credits.
*Many other changes that aren't evident to the user but better the addon's code as a whole.

v0.1.7
*Removed the slash command line from the minimap button tooltip as it was causing some errors.
*Tooltip functions can now access stack size info.
*Cleaned up the TSMMacroButton code and fixed some bugs.

v0.1.6
*SelectionLists should now clear the selected row on release.
*Added VersionKey APIs.
*Removed a few extra libraries from the TOC file / addon folder.
*Turned on no-lib creation.
*Updated the credits.
*Cleaned up some of the code.

v0.1.5
*Fixed a bug with the main TSM window on non-english clients.
*Minor improvements to the GUI functions.
*Added an option to the "Status" page for hiding the minimap icon.

v0.1.4
*Fixed some minor bugs with two of the TSMAPI functions.
*This update is required for using the latest version of Crafting

v0.1.3
*Adjusted the sidebar so it should resize more in order to not be blocked by right action bars.
*Fixed a bug with the selectionlists in auctioning sometimes only showing 4 items.
*Updated the included TSM Guidebook pdf.

v0.1.2
*The sidebar frame should no longer go off the screen.
*Added another popup to help new users.

v0.1.1
*Should be way more obvious when no modules are installed.

v0.1
*First Beta Release!