This release implements over 100 new statements and functions. The user interface, on the other hand, barely changes at all in this release.
Files and Folders
This release fully implements Panorama’s functions and statements for accessing the file system (except for operations that will be implemented via custom functions and statements). Implementing support for Files and Folders was a bit tricky because Cocoa file access is quite different from the Carbon system used by Panorama 6 and earlier. The goal was to maintain near 100% compatibility with legacy formulas and procedures that use HFS paths and folder ids, while allowing new code to be written directly using standard UNIX file paths. To learn more about how this was done, see Files and Folders.
Cross Database Calculations
This release implements all of Panorama’s lookup( functions, and goes quite a bit farther. The superlookup( function allows any formula to be used for the key and data. Using this you could, for example, implement multi-field keys and/or retrieve multiple fields at once. If you are just interested in data in the current record in another database, the formulavalue( function is a greatly enhanced version of fieldvalue(. If you need a supercharched lookupall( function, the arraybuild( function now has the option of an additionaly query formula, which allows you to specify exactly what data you are interested in extracting into your array.
The new aggregate( function allows you to calculate totals, counts, minimums, maximums or averages on the fly. If your database isn’t too large, you could even include totals and averages in form objects so that they would update on-the-fly as the database changes.
Sorting and Outlines
This version fully implements Panorama’s sorting capabilities, which are quite a bit more complicated than I remembered (for example, sorting summary values automatically drags along the data records). There is also a new reverseorder statement that simply turns the current database upside down.
Grouping and outlines work exactly as they did in Panorama 6, however, when collapsing and expanding the outline, there is a cool animation! Totals, averages, etc. also work.
Not really sorting or outlines, but this release also implements propagate, unpropagate, runningtotal, etc.
Searching
In addition to the find and nextmatch statements, your programs can now findabove, findbelow findbackwards and previousmatch.
Field Configuration
This release allows you to access (getfieldproperties( and modify setfieldproperties the properties of any field, including name, data type, formulas, patterns, etc. You can also add, insert and delete fields, and you can move the current field to a new position with the database (see movefieldbefore).
Permanent Variables
Since you can’t save yet, variables aren’t really permanent, but this release does support the permanent and unpermanent statements, and will read permanent variables from Panorama 6 databases. The code for saving permanent variables has been written and tested, so when database saving is implemented it will be ready to go.
Dictionaries
This release includes an advanced version of Panorama’s Dictionary feature (see initializedictionary(, getdictionaryvalue(, setdictionaryvalue, dumpdictionary(, etc.) Unlike previous versions, dictionaries can now include any data type, not just text, but also numbers, dates, even binary data. To accomplish this a new dictionary format is used, but Panorama will automatically convert any old format dictionaries it encounters to the new format (however, if stored in a field or permanent variable, you must use the Binary Variables & Fields wizard in Panorama 6 to designate the field or variable as containing binary data, see Binary Fields below). Note: All of the dictionary operations are implemented as functions – they were statements in Panorama 6. These will be implemented later as custom statements based on the new functions.
Binary Fields
A field can now be designated as holding binary data (see setfieldproperties). When a field contains binary data, its contents are displayed, and may be modified, in hexadecimal format.
Panorama 6 allowed binary data to be stored in a text field, but that is no longer allowed. If you have an existing Panorama 6 database, you must use the Binary Variables & Fields wizard in Panorama 6 to designate the fields that contain binary data (you can also designate one or more permanent variables). When the database is opened into the new Panorama, the designated text fields will automatically be converted into binary fields with the proper binary data.
Double Chevron Notation
Several statements and functions now support a “double chevron” notation for referencing a field in the current database while scanning a second database with a formula. See arraybuild(, superlookup(, aggregate( and formulasum.
There’s More
The formulasum function has a bunch of new options, though you’ll probably want to use the aggregate( function instead.
The exportcell( function now gives you the choice of using the field’s output pattern.
The lookupall( function now allows multiple data fields.
The new md5( function generates checksums (other, better, algorithms to follow).
The BinaryToText( and TextToBinary( functions now allow the encoding type to be specified via a keyword (previously could only be specified numerically).
Field names with carriage returns are no longer allowed. Carriage returns in field names will be converted to spaces when importing from Panorama 6
Additional statements and functions listed below.
Assorted bug fixes.
Brand new features implemented in this release (features that were not included in Panorama 6):
- aggregate( -- The aggregate( function calculates an aggregate (sum (total), count, minimum, maximum or average) by scanning specified records in a database.
- filedisplayname( -- The filedisplayname( function returns the display name for the specified file or folder.
- fileidnumber( -- The fileidnumber( function returns the id number for the specified file or folder.
- findabove -- The findabove statement locates the next previous record (above the current record) in the active database for which the specified condition is true.
- findbelow -- The findbelow statement locates the next visible record (below the current record) in the active database for which the specified condition is true.
- hextobinary( -- The hextobinary( function converts a sequence of hexadecimal digits into a raw binary data value.
- hfspath( -- The hfspath( function converts a UNIX path into an HFS path.
- info("applicationsfolder") -- The info("applicationsfolder") function returns the path to the current user's Applications folder.
- info("applicationsupportfolder") -- The info("applicationsupportfolder") function returns the path to the current user's Application Support folder (inside the Library folder).
- info("cachefolder") -- The info("cachefolder") function returns the path to the current user's Cache folder (in the Library folder).
- info("collapsible") -- The info("collapsible") function checks to see if the current record is collapsible.
- info("documentsfolder") -- The info("documentsfolder") function returns the path to the current user's Documents folder.
- info("downloadsfolder") -- The info("downloadsfolder") function returns the path to the current user's Downloads folder.
- info("libraryfolder") -- The info("libraryfolder") function returns the path to the current user's Library folder.
- info("moviesfolder") -- The info("moviesfolder") function returns the path to the current user's Movies folder.
- info("musicfolder") -- The info("musicfolder") function returns the path to the current user's Music folder.
- info("picturesfolder") -- The info("picturesfolder") function returns the path to the current user's Pictures folder.
- info("publicfolder") -- The info("publicfolder") function returns the path to the current user's Public folder.
- info("userfolder") -- The info("userfolder") function returns the path to the current user's home folder.
- initializedictionary( -- The initializedictionary( function builds a new dictionary and initializes it with zero or more key/value entries (see Data Dictionaries).
- md5( -- The md5( function calculates the MD5 hash of a binary or text data item.
- movefieldbefore -- The movefieldbefore statement moves the current field to a new position.
- previousmatch -- The previousmatch statement locates the previous (closer to the top) visible record in the active database for which the condition specified in the most recent Find statement is true.
- reverseorder -- The reverseorder statement reverses the order of the records in the database.
- savedialog -- The savedialog statement displays a modal dialog that allows a user to specify the name and location of a new file.
- superlookup( -- The superlookup( function searches a database for a record that matches a query formula, then uses a second formula to return other information from the same record. This is similar to the lookup( function, but instead of using an individual field for the key and data, any valid true/false (Boolean) formula can be used.
- unixpath( -- The unixpath( function converts an HFS path into a UNIX path.
Features implemented in this release that work differently than they did in Panorama 6.
- addfield -- The addfield statement adds a new field to the current database (on the end).
- arraybuild -- The arraybuild statement builds an array by scanning a database and creating an array element for every record (including invisible records) in the database (see Text Arrays).
- arrayselectedbuild -- The arrayselectedbuild statement builds an array by scanning a database and creating an array element for every visible (selected) record in the database (see Text Arrays).
- changedictionaryvalues( -- The changedictionaryvalues( function changes one or more values in a dictionary (see Data Dictionaries).
- copyfile -- The copyfile statement copies a file (or folder).
- copypartialdictionary( -- The copypartialdictionary( function partially copies a dictionary (see Data Dictionaries).
- deletedictionaryvalue( -- The deletedictionaryvalue( function deletes one or more key/value pairs from a dictionary (see Data Dictionaries).
- dumpdictionary( -- The dumpdictionary( function returns a carriage return separated array of dictionary keys and values (see Data Dictionaries).
- dumpdictionaryquoted( -- The dumpdictionaryquoted( function returns a carriage return separated array of dictionary keys and values (see Data Dictionaries). The text values are quoted.
- export -- The export statement exports the selected rows in the current database into a text file.
- exportcell( -- The exportcell( function takes any database field and converts it to text, using the appropriate display pattern if one has been defined for the field.
- fieldvalue( -- The fieldvalue( function grabs the contents of a field in the current record of a database. You can grab data from the current database, or from another database.
- fileappend -- The fileappend statement appends new data to an existing disk file.
- filedate( -- The filedate( function returns the modification date of a file.
- fileerase -- The fileerase statement erases a disk file or a folder, removing it from the hard disk.
- fileexists( -- The fileexists( function returns true if a file exists, false if it does not.
- fileinfo( -- The fileinfo( function returns information about a file (or folder) on the disk, including the size, creation and modification date and time, type, creator and lock status.
- fileload( -- The fileload( function reads the entire contents of any file on disk.
- fileloadpartial( -- The fileloadpartial( function reads a portion of the contents of any file on disk.
- filerename -- The filerename statement renames and/or moves a file or folder.
- Files and Folders -- organization of files and folders
- filesave -- The filesave statement saves data directly into a disk file.
- filesize( -- The filesize( function determines the size of any file on disk.
- filetime( -- The filetime( function returns the modification time of a file.
- folder( -- The folder( function creates a Folder ID that unambiguously describes the location of a folder on the hard disk.
- folderexists( -- The folderexists( function returns true if a folder exists, false if it does not.
- folderpath( -- The folderpath( function converts a Folder ID into the HFS path of that folder.
- formulasum -- The formulasum statement calculates a total by scanning a database, returning the accumulated sum of evaluating a formula over and over again for each scanned record.
- formulavalue( -- The formulavalue( function calculates the result of a formula based on data in the current record of any open database. This is similar to the fieldvalue( function, but allows any formula to be used, rather than just a single field.
- formulavalue -- The formulavalue statement calculates the result of a formula. Usually this is done with an assignment statement (for example `x=2 * y` ), but the formulavalue statement gives you more flexibility. You can specify what database is to be used for the calculation (an assignment statement always uses the current database) and you can specify the formula using a variable, making it easy to change on the fly. This statement also gives you more control over how errors are handled.
- getdictionarykey( -- The getdictionarykey( function returns the key of an item in the dictionary, given its value). This is essentially the opposite of the getdictionaryvalue( function (see Data Dictionaries).
- getdictionaryvalue( -- The getdictionaryvalue( function returns the value of an item in the dictionary, given its key (see Data Dictionaries).
- getfieldproperties( -- The getfieldproperties( function returns a dictionary containing all of the properties of the specified field. (See the setfieldproperties statement if you want to change one or more field properties.)
- groupup -- The groupup statement divides the database into groups, with a summary record at the end of each group. The groups are arranged in ascending order (low to high).
- info("expandable") -- The info("expandable") function checks to see if the current record is expandable.
- initializedictionaryvalue( -- The initializedictionaryvalue( function builds a new dictionary and initializes it with one or more entries (see Data Dictionaries). This function is deprecated, we recommend using the initializedictionary( function instead.
- insertfield -- The insertfield statement inserts a new field into the database in front of the current field.
- listdictionarykeys( -- The listdictionarykeys( function returns a list of the keys in a dictionary collection.
- listfiles( -- The listfiles( function builds a text array listing the files in a folder.
- lookup( -- The lookup( function searches a database for a value, then returns other information from the same record. For example, the lookup( function can look up a phone number given a customer name, or look up a price given a part number.
- lookupall( -- The lookupall( function builds a text array containing one item for every record in the target database where the data in the keyField matches the keyData. Each item in the text array contains the value extracted from the dataField for that record. If the data field is a numeric or date field, it is converted to text using the default patterns for that field.
- lookuplast( -- The lookuplast( function searches the selected records in a database for a value, then returns other information from the same record. For example, the lookuplast( function can look up a phone number given a customer name, or look up a price given a part number. Unlike the lookup( function which searches from the top of the database, the lookuplast( function searches backwards from the bottom.
- lookuplastselected( -- The lookuplastselected( function searches the selected records in a database for a value, then returns other information from the same record. For example, the lookuplastselected( function can look up a phone number given a customer name, or look up a price given a part number. Unlike the lookupselected( function which searches from the top of the database, the lookuplastselected( function searches backwards from the bottom.
- lookupselected( -- The lookupselected( function searches the selected records in a database for a value, then returns other information from the same record. For example, the lookupselected( function can look up a phone number given a customer name, or look up a price given a part number.
- makefolder -- The makefolder statement creates a new folder, and if necessary, also creates any enclosing folders needed to create the specified new folder.
- mergedictionaries( -- The mergedictionaries( function merges the contents of two or more dictionaries (see Data Dictionaries).
- nextmatch -- The nextmatch statement locates the next visible record in the active database for which the condition specified in the most recent Find statement is true.
- outlinelevel -- The outlinelevel statement expands or collapses the entire database to show a specific level of data or summary level.
- propagate -- The propagate statement fills all the empty cells in the current field. Each empty cell is filled with the value of the first non-empty cell above it.
- propagateup -- The propagateup statement fills all the empty cells in the current field. Each empty cell is filled with the value of the first non-empty cell below it.
- removedetail -- The removedetail statement removes data records from the current database, leaving only summary records. It can also delete low level summary records, leaving only higher levels.
- removesummaries -- The removesummaries statement removes summary records from the current database.
- renamedictionarykey( -- The renamedictionarykey( function changes the key (name) of one or more values in a dictionary (see Data Dictionaries).
- setfieldproperties -- The setfieldproperties statement modifies one or more properties (name, data type, formula, etc.) of the current field.
- sizeof( -- The sizeof( function calculates the amount of memory used by a field or a variable.
- table( -- The table( function searches a database for a value, then returns other information from the same record. Unlike the lookup( function, the table( function does not require an exact match. If it does not find an exact match the table( function will use the closest match. For example, the table( function can look up a tax rate given an income amount, or look up a shipping price given a zip code and weight.
- unpropagate -- The unpropagate statement removes repeating data from the currently selected field. If several records in a row contain the same data, this statement erases all but the first (top) value.
- unpropagateup -- The unpropagateup statement removes repeating data from the currently selected field. If several records in a row contain the same data, this statement erases all but the last (bottom) value.
Features implemented in this release that work exactly the same as they did in Panorama 6.
- arraylookup( -- The arraylookup( function uses a key to look up a value in a two dimensional text array containing key/value pairs (see Text Arrays).
- average -- The average statement calculates averages and sub-averages for the selected records in the current field.
- collapse -- The collapse statement hides the detail records associated with the currently active summary record.
- count -- The count statement counts all non-empty data cells for the current field.
- define -- The define statement performs an assignment, much like an equals sign or the assign statement. However, the define statement only performs the assignment if the variable is currently undefined. If the variable already has a value, the define statement leaves it alone. The define statement is especially useful for initializing permanent variables.
- deletefield -- The deletefield statement deletes the current field from the database.
- dictionaryvalueexists( -- The dictionaryvalueexists( function returns true or false depending on whether or not a key/value pair exists in a dictionary (see Data Dictionaries).
- expand -- The expand statement reveals the next level of collapsed detail records associated with the currently active summary record.
- expandall -- The expandall statement reveals all collapsed detail records associated with the currently active summary record.
- find -- The find statement locates the first visible record in the active database for which the specified condition is true.
- findbackwards -- The findbackwards statement locates the last visible record in the active database for which the specified condition is true.
- formulacalc -- The formulacalc statement allows you to evaluate a formula that you were not able to code into the procedure when it was being written.
- groupdown -- The groupdown statement divides the database into groups, with a summary record at the end of each group. The groups are arranged in descending order (high to low).
- info("desktopfolder") -- The info("desktopfolder") function returns the path to the user's desktop folder.
- info("empty") -- The info("empty") function returns true or false depending on the result of the last select operation. If no records were selected the function will return true, otherwise it will return false.
- info("found") -- The info("found") function returns true or false depending on whether the last find or next statement was successful.
- info("panoramafolder") -- The info("panoramafolder") function returns the location of the folder containing the currently running copy of Panorama.
- info("panoramaname") -- The info("panoramaname") function returns the name of the currently running copy of Panorama.
- info("summary") -- The info("summary") function returns the summary level of the current record, from 0 (data record) to 7.
- info("tempfolder") -- The info("tempfolder") function returns the path to the current user's temporary folder (for files you plan to use only for a short time).
- info("unixusername") -- The info("unixusername") function returns the short user name of the logged in user.
- info("user") -- The info("user") function returns the name of the user of this computer.
- maximum -- The maximum statement calculates the maximum and sub-maximums for the current field.
- minimum -- The minimum statement calculates the minimum and sub-minimums for the current field.
- permanent -- The permanent statement creates one or more permanent variables.
- runningdifference -- The runningdifference statement calculates the running difference for the current field.
- runningtotal -- The runningtotal statement calculates the running total for the current field.
- set -- The set statement performs an assignment, much like an equals sign or the assign statement. However, the destination of the assignment can be calculated on the fly.
- sortdown -- The sortdown statement sorts the database by the current field. The database is sorted in descending order (high to low).
- sortdownwithin -- The sortdownwithin statement sorts the database by the current field, leaving any previous sorts intact. The database is sorted in descending order (high to low).
- sortupwithin -- The sortupwithin statement sorts the database by the current field, leaving any previous sorts intact. The database is sorted in ascending order (low to high).
- strip( -- The strip( function strips off leading and trailing blanks and other whitespace (carriage returns, tabs, etc.)
- summarylevel -- The summarylevel statement changes the summary level of the current line.
- total -- The total statement calculates totals and subtotals for the current field.
- unpermanent -- The unpermanent statement converts one or more permanent variables into regular fileglobal variables. The variables will no longer be saved as part of the database.
ALL features that were added or changed in this release:
- addfield -- The addfield statement adds a new field to the current database (on the end).
- collapse -- The collapse statement hides the detail records associated with the currently active summary record.
- count -- The count statement counts all non-empty data cells for the current field.
- fileappend -- The fileappend statement appends new data to an existing disk file.
- filedate( -- The filedate( function returns the modification date of a file.
- filedisplayname( -- The filedisplayname( function returns the display name for the specified file or folder.
- fileexists( -- The fileexists( function returns true if a file exists, false if it does not.
- fileidnumber( -- The fileidnumber( function returns the id number for the specified file or folder.
- fileinfo( -- The fileinfo( function returns information about a file (or folder) on the disk, including the size, creation and modification date and time, type, creator and lock status.
- fileload( -- The fileload( function reads the entire contents of any file on disk.
- filerename -- The filerename statement renames and/or moves a file or folder.
- filesave -- The filesave statement saves data directly into a disk file.
- filesize( -- The filesize( function determines the size of any file on disk.
- filetime( -- The filetime( function returns the modification time of a file.
- findabove -- The findabove statement locates the next previous record (above the current record) in the active database for which the specified condition is true.
- findbackwards -- The findbackwards statement locates the last visible record in the active database for which the specified condition is true.
- findbelow -- The findbelow statement locates the next visible record (below the current record) in the active database for which the specified condition is true.
- groupdown -- The groupdown statement divides the database into groups, with a summary record at the end of each group. The groups are arranged in descending order (high to low).
- hfspath( -- The hfspath( function converts a UNIX path into an HFS path.
- info("applicationsfolder") -- The info("applicationsfolder") function returns the path to the current user's Applications folder.
- info("applicationsupportfolder") -- The info("applicationsupportfolder") function returns the path to the current user's Application Support folder (inside the Library folder).
- info("cachefolder") -- The info("cachefolder") function returns the path to the current user's Cache folder (in the Library folder).
- info("collapsible") -- The info("collapsible") function checks to see if the current record is collapsible.
- info("desktopfolder") -- The info("desktopfolder") function returns the path to the user's desktop folder.
- info("documentsfolder") -- The info("documentsfolder") function returns the path to the current user's Documents folder.
- info("downloadsfolder") -- The info("downloadsfolder") function returns the path to the current user's Downloads folder.
- info("empty") -- The info("empty") function returns true or false depending on the result of the last select operation. If no records were selected the function will return true, otherwise it will return false.
- info("expandable") -- The info("expandable") function checks to see if the current record is expandable.
- info("libraryfolder") -- The info("libraryfolder") function returns the path to the current user's Library folder.
- info("moviesfolder") -- The info("moviesfolder") function returns the path to the current user's Movies folder.
- info("musicfolder") -- The info("musicfolder") function returns the path to the current user's Music folder.
- info("panoramafolder") -- The info("panoramafolder") function returns the location of the folder containing the currently running copy of Panorama.
- info("panoramaname") -- The info("panoramaname") function returns the name of the currently running copy of Panorama.
- info("picturesfolder") -- The info("picturesfolder") function returns the path to the current user's Pictures folder.
- info("publicfolder") -- The info("publicfolder") function returns the path to the current user's Public folder.
- info("summary") -- The info("summary") function returns the summary level of the current record, from 0 (data record) to 7.
- info("tempfolder") -- The info("tempfolder") function returns the path to the current user's temporary folder (for files you plan to use only for a short time).
- info("unixusername") -- The info("unixusername") function returns the short user name of the logged in user.
- info("user") -- The info("user") function returns the name of the user of this computer.
- info("userfolder") -- The info("userfolder") function returns the path to the current user's home folder.
- outlinelevel -- The outlinelevel statement expands or collapses the entire database to show a specific level of data or summary level.
- removesummaries -- The removesummaries statement removes summary records from the current database.
- runningtotal -- The runningtotal statement calculates the running total for the current field.
- setfieldproperties -- The setfieldproperties statement modifies one or more properties (name, data type, formula, etc.) of the current field.
- sizeof( -- The sizeof( function calculates the amount of memory used by a field or a variable.
- total -- The total statement calculates totals and subtotals for the current field.
- unixpath( -- The unixpath( function converts an HFS path into a UNIX path.
- unpermanent -- The unpermanent statement converts one or more permanent variables into regular fileglobal variables. The variables will no longer be saved as part of the database.
See Also
- Version 0.1.001 (released July 7th, 2012) -- Summary of Version 0.1.001 (released 7/7/2012)
- Version 0.1.002 (released August 12th, 2012) -- Summary of Version 0.1.002 (released 8/12/2012)
- Version 0.1.003 (released December 2nd, 2012) -- Summary of Version 0.1.003 (released 12/2/2012)
- Version 0.1.004 (released December 10th, 2012) -- Summary of Version 0.1.004 (released 12/10/2012)
- Version 0.1.005 (released December 21st, 2012) -- Summary of Version 0.1.005 (released 12/21/2012)
- Version 0.1.006 (released December 26th, 2012) -- Summary of Version 0.1.006 (released 12/26/2012)
- Version 0.1.007 (released May 1st, 2013) -- Summary of Version 0.1.007 (released 5/1/2013)
- Version 0.1.008 (released May 22nd, 2013) -- Summary of Version 0.1.008 (released 5/22/2013)
- Version 0.1.010 (released October 14th, 2013) -- Summary of Version 0.1.010 (released 10/14/2013)
- Version 0.1.011 (released December 6th, 2013) -- Summary of Version 0.1.011 (released 12/6/2013)
- Version 0.1.012 (released August 29th, 2015) -- Summary of Version 0.1.012 (released 8/29/2015)
- Version 0.1.013 (released September 6th, 2015) -- Summary of Version 0.1.013 (released 9/6/2015)
- Version 0.1.014 (released September 14th, 2015) -- Summary of Version 0.1.014 (released 9/14/2015)
- Version 0.1.015 (released September 29th, 2015) -- Summary of Version 0.1.015 (released 9/29/2015)
- Version 0.1.016 (released October 12th, 2015) -- Summary of Version 0.1.016 (released 10/12/2015)
- Version 0.1.017 (released November 11th, 2015) -- Summary of Version 0.1.017 (released 11/11/2015)
- Version 0.1.018 (released December 7th, 2015) -- Summary of Version 0.1.018 (released 12/7/2015)
- Version 0.1.019 (released January 28th, 2016) -- Summary of Version 0.1.019 (released 1/28/2016)
- Version 0.1.020 (released February 15th, 2016) -- Summary of Version 0.1.020 (released 2/15/2016)
- Version 0.1.021 (released February 29th, 2016) -- Summary of Version 0.1.021 (released 2/29/2016)
- Version 0.1.022 (released March 1st, 2016) -- Summary of Version 0.1.022 (released 3/1/2016)
- Version 0.1.023 (released May 27th, 2016) -- Summary of Version 0.1.023 (released 5/27/2016)
- Version 0.1.024 (released June 12th, 2016) -- Summary of Version 0.1.024 (released 6/12/2016)
- Version 0.1.025 (released July 21st, 2016) -- Summary of Version 0.1.025 (released 7/21/2016)
- Version 0.1.026 (released August 29th, 2016) -- Summary of Version 0.1.026 (released 8/29/2016)
- Version 0.1.027 (released September 18th, 2016) -- Summary of Version 0.1.027 (released 9/18/2016)
- Version 0.1.028 (released November 9th, 2016) -- Summary of Version 0.1.028 (released 11/9/2016)
- Version 0.1.029 (released December 31st, 2016) -- Summary of Version 0.1.029 (released 12/31/2016)
- Version 0.1.030 (released February 12th, 2017) -- Summary of Version 0.1.030 (released 2/12/2017)
- Version 0.1.031 (released March 3rd, 2017) -- Summary of Version 0.1.031 (released 3/3/2017)
- Version 0.1.032 (released April 3rd, 2017) -- Summary of Version 0.1.032 (released 4/3/2017)
- Version 0.9 (released May 15th, 2017) -- Summary of Version 0.9 (released 5/15/2017)
- Version 0.9.001 (released July 18th, 2017) -- Summary of Version 0.9.001 (released 7/18/2017)
- Version 0.9.002 (released July 27th, 2017) -- Summary of Version 0.9.002 (released 7/27/2017)
- Version 0.9.003 (released September 10th, 2017) -- Summary of Version 0.9.003 (released 9/10/2017)
- Version 0.9.004 (released September 14th, 2017) -- Summary of Version 0.9.004 (released 9/14/2017)
- Version 0.9.005 (released September 19th, 2017) -- Summary of Version 0.9.005 (released 9/19/2017)
- Version 0.9.006 (released September 27th, 2017) -- Summary of Version 0.9.006 (released 9/27/2017)
- Version 0.9.007 (released October 3rd, 2017) -- Summary of Version 0.9.007 (released 10/3/2017)
- Version 0.9.008 (released October 12th, 2017) -- Summary of Version 0.9.008 (released 10/12/2017)
- Version 10.0.0 (released October 18th, 2017) -- Summary of Version 10.0.0 (released 10/18/2017)
- Version 10.0.01 (released December 10th, 2017) -- Summary of Version 10.0.01 (released 12/10/2017)
- Version 10.1 (released August 6th, 2018) -- Summary of Version 10.1 (released 8/6/2018)
- Version 10.1.1 (released August 30th, 2018) -- Summary of Version 10.1.1 (released 8/30/2018)
- Version 10.1.2 (released November 15th, 2018) -- Summary of Version 10.1.2 (released 11/15/2018)
- Version 10.2 (released October 1st, 2024) -- Summary of Version 10.2 (released 10/01/2024)
- Version 10.2.0 b12 (released January 27, 2021) -- Summary of Version 10.2.0 b12 (released 01/27/2021)
- Version 10.2.0 b13 (released February 15, 2021) -- Summary of Version 10.2.0 b13 (released 02/15/2021)
- Version 10.2.0 b14 (released March 14, 2021) -- Summary of Version 10.2.0 b14 (released 03/14/2021)
- Version 10.2.0 b15 (released March 30, 2021) -- Summary of Version 10.2.0 b15 (released 03/30/2021)
- Version 10.2.0 b16 (released April 27, 2021) -- Summary of Version 10.2.0 b16 (released 04/27/2021)
- Version 10.2.0 b17 (released June 23, 2021) -- Summary of Version 10.2.0 b17 (released 06/23/2021)
- Version 10.2.0 b18 (released July 21, 2021) -- Summary of Version 10.2.0 b18 (released 07/21/2021)
- Version 10.2.0 b20 (released August 26, 2021) -- Summary of Version 10.2.0 b20 (released 08/26/2021)
- Version 10.2.0 b21 (released September 20, 2021) -- Summary of Version 10.2.0 b21 (released 09/20/2021)
- Version 10.2.0 b22 (released October 6, 2021) -- Summary of Version 10.2.0 b22 (released 10/06/2021)
- Version 10.2.0 b23 (released October 20, 2021) -- Summary of Version 10.2.0 b23 (released 10/20/2021)
- Version 10.2.0 b24 (released October 21, 2021) -- Summary of Version 10.2.0 b24 (released 10/21/2021)
- Version 10.2.0 b25 (released December 10, 2021) -- Summary of Version 10.2.0 b25 (released 12/10/2021)
- Version 10.2.0 b26 (released June 15, 2022) -- Summary of Version 10.2.0 b26 (released 06/15/2022)
- Version 10.2.0 b27 (released August 11, 2022) -- Summary of Version 10.2.0 b27 (released 08/11/2022)
- Version 10.2.0 b28 (released August 23, 2022) -- Summary of Version 10.2.0 b28 (released 08/23/2022)
- Version 10.2.0 b29 (released September 13, 2022) -- Summary of Version 10.2.0 b29 (released 09/13/2022)
- Version 10.2.0 b30 (released October 30, 2022) -- Summary of Version 10.2.0 b30 (released 10/30/2022)
- Version 10.2.0 b31 (released January 16, 2023) -- Summary of Version 10.2.0 b31 (released 01/16/2023)
- Version 10.2.0 b32 (released January 21, 2023) -- Summary of Version 10.2.0 b32 (released 01/21/2023)
- Version 10.2.0 b33 (released April 30, 2023) -- Summary of Version 10.2.0 b33 (released 04/30/2023)
- Version 10.2.0 b34 (released October 27, 2023) -- Summary of Version 10.2.0 b34 (released 10/27/2023)
- Version 10.2.0 b35 (released December 4, 2023) -- Summary of Version 10.2.0 b35 (released 12/4/2023)
- Version 10.2.0 b36 (released December 25, 2023) -- Summary of Version 10.2.0 b36 (released 12/25/2023)
- Version 10.2.0 b37 (released January 11, 2024) -- Summary of Version 10.2.0 b37 (released 1/11/2024)
- Version 10.2.0 b38 (released April 7, 2024) -- Summary of Version 10.2.0 b38 (released 4/7/2024)
- Version 10.2.0 b39 (released June 26, 2024) -- Summary of Version 10.2.0 b39 (released 06/26/2024)
- Version 10.2.0 b40 (released October 1, 2024) -- Summary of Version 10.2.0_b40 (released 10/01/2024)