{"category":"internal","changelog":"---------------------------------------------------------------------------------------------------\nVersion: 2.2.23\nDate: September 24, 2026\n  Changes:\n    - Added PlanetsLib as optional dependency in order to set minimum compatible version. \n  Bugfixes:\n    - Fixed Recipe:copy_unlock to copy the enabled status if no unlock techs were found.\n    - Fixed several Space-related functions to accomodate the new origin-based PlanetsLib.\n---------------------------------------------------------------------------------------------------\nVersion: 2.2.22\nDate: September 22, 2026\n  Bugfixes:\n    - Fixed Entity:set_minable_result to nil out minable.results.\n      Added second argument to allow setting the count alongside the result.\n    - Added Entity:set_minable_results to handle minable.results.\n    - Finally fixed Data:krycopy to handle minable results.\n---------------------------------------------------------------------------------------------------\nVersion: 2.2.21\nDate: September 22, 2026\n  Minor Features:\n    - Added several Item functions regarding fuel_categories.\n      Includes add_fuel_category, remove_fuel_category, add_fuel_categories, remove_fuel_categories.\n    - Added Recipe:add_categories and remove_categories to handle multiple categories.\n  Changes:\n    - Split EquipmentGrid:add/remove category functions to individual add/remove category/categories. \n      No longer handles both table and string. This change is for consistency with the other category functions.\n---------------------------------------------------------------------------------------------------\nVersion: 2.2.20\nDate: September 20, 2026\n  Optimizations:\n    - Modified the filter field from Event.register to pass directly through to the base game's filter field.\n  Info:\n    - Added github pages documentation (preliminary pass, subject to change, currently using the most basic formatting).\n      Many thanks to SafTheLamb for helping me figure out the first steps to set this up.\n      Sorry for beating you to the punch on publishing.\n---------------------------------------------------------------------------------------------------\nVersion: 2.2.19\nDate: September 12, 2026\n  Minor Features:\n    - Added ItemSubgroup:count_placeable_entries(entity_types) and count_placeable_rows(entity_types)\n    - Added ItemGroup:count_placeable_rows(entity_types)\n---------------------------------------------------------------------------------------------------\nVersion: 2.2.18\nDate: September 8, 2026\n  Changes:\n    - Updated Space to use PlanetsLib:extend instead of data:extend, if orbit field is defined.\n      Still falls back to data:extend when orbit is not defined.\n    - Updated several Space positional functions to support data-final-fixes.\n---------------------------------------------------------------------------------------------------\nVersion: 2.2.17\nDate: September 6, 2026\n  Minor Features:\n    - Added Technology:has_pack(pack) and Technology:set_pack_count(pack, count).\n  Changes:\n    - Updated Technology:add_pack/remove_pack/replace_pack to use has_pack.\n      Also added more specific logging for when these Technology functions make no changes.\n  Bugfixes:\n    - Oops, I forgot to publish this one, because I never changed the version number in info.json\n---------------------------------------------------------------------------------------------------\nVersion: 2.2.16\nDate: August 30, 2026\n  Bugfixes:\n    - Had another look at how PlanetsLib works, and needed to change some assumptions made with the previous functionality.\n      Specifically fixes the new functions when orbit table is defined, but then subsequently ignored by PlanetsLib.\n      When parent is star, uses distance to update distance and orbit.distance; otherwise uses orbit.distance.\n---------------------------------------------------------------------------------------------------\nVersion: 2.2.15\nDate: August 29, 2026\n  Minor Features:\n    - Added several Space-related functions that directly tie into PlanetsLib.\n      This includes set_distance, update_distance, copy_distance, set_orientation, set_position, and copy_position.\n      Due to the use of PlanetsLib:update, these functions can only run during data and data-updates.\n---------------------------------------------------------------------------------------------------\nVersion: 2.2.14\nDate: August 9, 2026\n  Changes:\n    - Added output_fluid_box to list of ignored rescale_entity fields.\n  Minor Features:\n    - Added Entity:rescale_connection_covers(covers, scale) to rescale fluid pipe and heat pipe covers.\n    - Added Entity:rescale_graphics(graphics, scale) to rescale specific fields within an entity.\n      This was needed to rescale heat_pictures within energy_source without rescaling other fields.\n---------------------------------------------------------------------------------------------------\nVersion: 2.2.13\nDate: August 2, 2026\n  Bugfixes:\n    - Fixed Entity/Inventory.is_named_bp function, regarding nil comparison with named blueprints.\n---------------------------------------------------------------------------------------------------\nVersion: 2.2.12\nDate: July 30, 2026\n  Minor Features:\n    - Added Data:get_localised_name/description to retrieve the field that would be used for this prototype.\n      Recipe inherits from main_product if defined, items inherit from place_result.\n    - Added Data:append/prepend_localised_name/description to modify localised_name and description.\n    - Added Energy module to work with Energy values (i.e. \"150kW\" and \"5MJ\").\n      Energy.scale should be the most useful; scales up/down any Energy value by a given scalar.\n    - Added Entity:scale_energy and scale_energy_source to scale top-level fields and nested energy_source fields respectively.\n---------------------------------------------------------------------------------------------------\nVersion: 2.2.11\nDate: July 27, 2026\n  Bugfixes:\n    - Updated Entity:get_minable_item() to return the Item wrapper with the correct item prototype.\n  Minor Features:\n    - Added Item:get_place_result() to return the matching Entity wrapper, with correct entity prototype.\n---------------------------------------------------------------------------------------------------\nVersion: 2.2.10\nDate: July 23, 2026\n  Minor Features:\n    - Allowed Technology:add_effect to actually work with with non-recipe-unlocks, via effect_type.\n    - Updated Recipe:add_unlock to utilize Technology:add_effect directly, instead of passing itself through.\n---------------------------------------------------------------------------------------------------\nVersion: 2.2.9\nDate: July 22, 2026\n  Changes:\n    - Made several runtime optimizations by removing unnecessary calls and caching lookups locally.\n      Reduced time usage from the previous 0.120-0.500 down to 0.050-0.200, with default settings and thousands of placed entities using this functionality.\n---------------------------------------------------------------------------------------------------\nVersion: 2.2.8\nDate: July 21, 2026\n  Bugfixes:\n    - Minor back compat fix when loading saves from v2.2.4 that had spread-on-ticks mods enabled.\n---------------------------------------------------------------------------------------------------\nVersion: 2.2.7\nDate: July 19, 2026\n  Bugfixes:\n    - Changed Data:append_order to only append to existing order; should not create new order field.\n  Minor Features:\n    - Added Data:copy_all_fields to copy all fields from a source prototype.\n---------------------------------------------------------------------------------------------------\nVersion: 2.2.6\nDate: July 15, 2026\n  Bugfixes:\n    - Fixed several runtime compatibility issues with Factorio 2.1 (thanks to goakiller900).\n    - Fixed some minor data stage issues, and updated several annotations for consistency.\n  Minor Features:\n    - Added Category:add_to() and remove_from(), and removed useless shell functions (create/add/remove)\n      Entity, Recipe, and EquipmentGrid now use these functions instead of defining their own when appropriate.\n---------------------------------------------------------------------------------------------------\nVersion: 2.2.5\nDate: July 14, 2026\n  Bugfixes:\n    - Folded in several bugfixes from goakiller900's stdlib2 continuation project.\n  Info:\n    - Updated github repo to reflect latest version from mod portal.\n---------------------------------------------------------------------------------------------------\nVersion: 2.2.4\nDate: July 11, 2026\n  Changes:\n    - Replaced Table.contains with a link to core's util.contains_value; functionally identical.\n    - Updated Event.register/on_event and Event.remove to preserve filter, pattern, and options data.\n    - Added get_event_id to Event.script.\n  Major Features:\n    - Added some generic spread-across-ticks logic, specifically intended for use with entities.\n      Also added setting to control number of entities checked per tick (for mods using this feature)\n      Made a strong attempt to minimize ups impact; under default settings, time usage should remain between 0.100 and 0.500, even with several thousands of entities utilizing the functionality.\n      This partially depends on how the source mod utilizes this functionality.\n      This list currently only includes Heat Inserter and Logistics Reactor Next v2\n    - Added wrapper for Things API, to shorthand remote calls and add some basic validity checking.\n    - Added support for Even Pickier Dollies within Event script.\n      If an event is registered that contains moved_entity, maps it to event.entity field as well.\n    - Added on_created_entity to Event.core_events\n      Registers to on_built_entity, on_robot_built_entity, on_space_platform_built_entity, script_raised_built, script_raised_revive, on_entity_cloned\n    - Added on_removed_entity to Event.core_events\n      Registers to on_player_mined_entity, on_robot_mined_entity, on_space_platform_mined_entity, script_raised_destroy, on_entity_died\n  Bugfixes:\n    - Fixed mod-setting script to allow writes during settings phase \n---------------------------------------------------------------------------------------------------\nVersion: 2.2.3\nDate: July 2, 2026\n  Info:\n    - Added slightly better error handling for failed data:copy (hopefully!)\n  Minor Features:\n    - Added new item-group and item-subgroup.lua\n      Written entirely for the purposes of counting visible entries in the Factoriopedia\n    - Added Entity:has_collision_layer(layer)\n    - Added Recipe:get_main_product()\n    - Added Data:set_subgroup and set_order\n      Both simply wrap around Data:subgroup_order, with additional validity checks \n    - Added Data:append_order() which simply appends a string to self.order\n---------------------------------------------------------------------------------------------------\nVersion: 2.2.2\nDate: June 30, 2026\n  Bugfixes:\n    - Fixed Recipe:add_category and remove_category using incorrectly named table\n  Minor Features:\n    - Added Entity:add_category and remove_category (for use with crafting_categories)\n    - Added Entity:add_categories and remove_categories (for use with multiple crafting_categories)\n---------------------------------------------------------------------------------------------------\nVersion: 2.2.1\nDate: June 29, 2026\n  Minor Features:\n    - Added Data:change_type()\n---------------------------------------------------------------------------------------------------\nVersion: 2.2.0\nDate: June 23, 2026\n  Info:\n    - Updated to Factorio 2.1\n  Changes:\n    - Replaced Recipe:set/change_category with add_category and remove_category\n      These functions utilize the new crafting_categories table\n    - Reformmatted some recipe functions for consistency\n  Minor Features:\n    - Added Table.contains\n  Bugfixes:\n    - Fixed circuit connector not being rescaled properly (incorrect fields were being rescaled)\n---------------------------------------------------------------------------------------------------\nVersion: 2.1.1\nDate: May 26, 2026\n  Info:\n    - Fixed year in date of the previous changelog\n    - Removed some leftover css files\n  Minor Features:\n    - Added space-connection and space-location scripts (under stdlib/data/)\n      Similar to planet script, mainly just a shorthand wrapper for functions contained in the space script\n    - Added mod-setting script (under stdlib/data/)\n      Can be used during startup or data phase to interact with mod settings\n      Primary function is to shorthand checks for setting existing, and grabbing value\n      Includes force_hidden(value) function, to mark as hidden and set a forced_value\n---------------------------------------------------------------------------------------------------\nVersion: 2.1.0\nDate: January 4, 2026\n  Info:\n    - Potentially resolved long standing issues between PyPostProcessing and Stdlib since 2.0\n  Changes:\n    - Updated Recipe:add_ingredient to only accept ingredient tables (previously allowed name/count)\n---------------------------------------------------------------------------------------------------\nVersion: 2.0.12\nDate: December 26, 2025\n  Minor Features:\n    - Added Recipe:set_results, set_ingredients, get_result_amount, get_ingredient_amount\n---------------------------------------------------------------------------------------------------\nVersion: 2.0.11\nDate: November 23, 2025\n  Minor Features:\n    - Added Recipe:set_result_amount, multiply_result, multiply_results.\n---------------------------------------------------------------------------------------------------\nVersion: 2.0.10\nDate: November 17, 2025\n  Minor Features:\n    - Added Recipe:set_ingredient_amount, to directly modify ingredient counts.\n  Changes:\n    - Removed hardcoded 0.75 reduction when applying rescale_entity with squeak through functionality.\n      Added optional shrink_value to Entity:rescale_entity, defaults to 0.75 when undefined.\n---------------------------------------------------------------------------------------------------\nVersion: 2.0.9\nDate: October 12, 2025\n  Minor Features:\n    - Added Space:create_space_connection to manually create connections between planet/space locations.\n      Attempts to generate a merged asteroid table based on origin and destination spawn definitions.\n      May not work exactly as intended, but maybe the randomness is more interesting for asteroids.\n  Bugfixes:\n    - Corrected year in several previous changelog entries.\n---------------------------------------------------------------------------------------------------\nVersion: 2.0.8\nDate: October 2, 2025\n  Minor Features:\n    - Added Technology:get_recipes and Recipe:get_technologies\n    - Updated Recipe:copy_unlock to use the new functions\n      Recipe:copy_unlock now adds unlocks to all matching technologies, instead of only the first.\n    - Updated Data:replace_icon to remove the icons field when only string is provided\n  Bugfixes:\n    - Fixed table:remove_string to always return the table, even if string search fails.\n  Changes:\n    - Disabled unnecessary log messages when running is_valid on non-existent data types.\n---------------------------------------------------------------------------------------------------\nVersion: 2.0.7\nDate: September 14, 2025\n  Minor Features:\n    - Added new EquipmentGrid class with functions to update grid size and equipment categories.\n      Specifically included: update_size, add_categories, and remove_categories.\n    - Added Table:is_array to check if table is either a simple array or a key-value pair.\n  Changes:\n    - Updated remove_string and insert_string to also return the newly modified table.\n---------------------------------------------------------------------------------------------------\nVersion: 2.0.6\nDate: March 30, 2025\n  Bugfixes:\n    - Removed requirement for a valid recipe when using Technology:remove_unlock.\n      Allows use of remove_unlock after the base recipe has been removed.\n  Minor Features:\n    - Added remove_string function to utils/table.lua\n      Similar logic but simply removes the table entry instead.\n    - Added Technology:add_unlock, providing the same functionality as Recipe:add_unlock\n---------------------------------------------------------------------------------------------------\nVersion: 2.0.5\nDate: March 30, 2025\n  Bugfixes:\n    - Fixed copy_cost checking the wrong table before copying.\n---------------------------------------------------------------------------------------------------\nVersion: 2.0.4\nDate: May 7, 2025\n  Bugfixes:\n    - Updated multiply_cost to log missing unit field instead of causing an error on startup.\n      Now returns false instead of self on failed multiply.\n    - Updated copy_cost to log missing unit field instead of silently copying nil value.\n      Now returns false instead of self on failed copy.\n  Minor Features:\n    - Added Recipe:multiply_ingredient (multiplies single ingredient specified by name)\n---------------------------------------------------------------------------------------------------\nVersion: 2.0.3\nDate: April 6, 2025\n  Changes:\n    - Data:copy applies new_name to main_product if detected\n  Minor Features:\n    - Added Data:replace_name, which utilizes Data:copy to rename a data object\n    - Added Table.scale (originally provided by Kirazy for use with mini machines)\n      Takes a table of numbers and scales them by the value provided.\n    - Added Entity:rescale_entity function (originally provided by Kirazy for use with mini machines)\n      Applies scale value to a list of allowed fields within the entity (to rescale the size)\n      Ignored fields, such as fluid_boxes and energy_source, need to be modified separately.\n---------------------------------------------------------------------------------------------------\nVersion: 2.0.2\nDate: March 30, 2025\n  Changes:\n    - Added some detail to error messages for data:copy function.\n  Minor Features:\n    - Added insert_string function to utils/table.lua\n      Simply searches for a string in a simple array, and inserts a string value just before it.\n      Similar to the basic table.insert function, but uses string instead of key value.\n---------------------------------------------------------------------------------------------------\nVersion: 2.0.1\nDate: December 16, 2024\n  Bugfixes:\n    - Reverted breaking changes within entity.lua (namely Entity:change_lab_inputs)\n---------------------------------------------------------------------------------------------------\nVersion: 2.0.0\nDate: December 15, 2024\n  Info:\n    - Comments for almost all functionaility updated to use EmmyLua instead of ldoc.\n      These comment updates were all graciously provided by Kuxynator.\n  Minor Features:\n    - Added Technology:replace_prereq (shorthand for remove_prereq and add_prereq in one command)\n  Bugfixes:\n    - Incorporated various fixes graciously provided by Kuxynator, including but not limited to:\n      direction, orientation, color, train, recipe, and game\n      replaced all instances of game.write_file and game.remove_path with helpers instead\n      line optimizations with data:get_field and data:get_icons\n      line optimizations with resource:get_resource_types\n    - Incorporated M.Userdata fix by hgschmie in utils/is.lua\n---------------------------------------------------------------------------------------------------\nVersion: 1.4.8\nDate: 2022-11-27\n  Bugfixes:\n    - Fix a crash in Event.get_event_handler(event_id) (#159)\n---------------------------------------------------------------------------------------------------\nVersion: 1.4.7\nDate: 2022-06-04\n  Changes:\n    - Dispatched events with a nil filter function will return the pattern as the second argument. #157\n    - Remove __DebugAdapter mutates.\n---------------------------------------------------------------------------------------------------\nVersion: 1.4.6\nDate: 2020-11-25\n  Features:\n    - Added Entity:count_circuit_connections.\n    - Added Event:on_init_if, Event:on_load_if, Event.on_event_if.\n    - Added Data:Util:extend_style_by_name.\n    - Added Entity:find_resources.\n  Changes:\n    - Inventory:transfer_inventory returns a dictionary of filters if dest can't hold them.\n    - Removed Entity:destroy_entity, Entity:create_entity, Entity:revive_entity.\n---------------------------------------------------------------------------------------------------\nVersion: 1.4.5\nDate: 2020-09-22\n  Features:\n    - Added Position:flip.\n    - Added Position:swapped and Position:flipped mutates.\n    - Added Area:min, Area:max, Area:width, Area:height, Area:rectangle.\n  Bugfixes:\n    - Potential optimization with Queue.\n---------------------------------------------------------------------------------------------------\nVersion: 1.4.4\nDate: 2020-08-23\n  Bugfixes:\n    - Fix error with Inventory:get_blueprint on empty blueprint books.\n---------------------------------------------------------------------------------------------------\nVersion: 1.4.3\nDate: 2020-05-24\n  Features:\n    - Add Orientation module.\n    - Add Direction module.\n  Changes:\n    - Added mod name to some log events.\n    - Use raise_built instead of manual events.\n---------------------------------------------------------------------------------------------------\nVersion: 1.4.2\nDate: 2020-03-19\n  Features:\n    - Added Item:add_to_labs.\n    - Added Item:remove_from_labs.\n    - Added Entity:change_lab_inputs.\n    - Added Inventory.swap_inventory.\n    - Added Inventory.transfer_inventory.\n    - Replace Color with Color2 see Docs.\n    - Added Table.all\n---------------------------------------------------------------------------------------------------\nVersion: 1.4.1\nDate: 31.1.2020\n\n  Bugfixes:\n    - Fix changelog formatting and errors.\n\n  Features:\n    - Added Interface.get_global and Interface.get_globals.\n\n  Changes:\n    - String_Array changed to a function return.\n    - Removed Core __index to itself.\n    - Standardized __index requires.\n    - Remove data.lua file as it is no longer needed.\n---------------------------------------------------------------------------------------------------\nVersion: 1.4.0\nDate: 26.1.2020\n\n  Features:\n    - Update to Factorio 0.18\n---------------------------------------------------------------------------------------------------\nVersion: 1.3.0\nDate: 21.7.2019\n\n  Features:\n    - Added Position:random.\n    - Added Position:update.\n    - Added Position:to_string_xy.\n    - Added Position:normalized, ceiled, floored, rounded for modifying the position in place.\n    - Added Position:is_Position, is_simple_position, is_complex_position.\n    - Added Area:update.\n    - Added Area:to_string_xy.\n    - Added Area:is_normalized.\n    - Added Area:dimensions.\n    - Added Area:rectangle.\n    - Added Area:is_Area, is_simple_area, is_complex_area.\n    - Added new Color module (color2).\n\n  Bugfixes:\n    - Position:center correctly looks inwards when on a boundry.\n    - Area:center_points correctly looks inwards when on a boundry.\n    - Technology:add_pack type check fix.\n\n  Changes:\n    - Area:iterate, spiral_iterate can return a position object.\n    - Removed safetostring.\n    - Area/Position:set is now Area/Position:load.\n    - Area:normalized now normalizes the area in place.\n---------------------------------------------------------------------------------------------------\nVersion: 1.2.2\nDate: 21.7.2019\n\n  Features:\n    - Added Gui.on_confirmed.\n---------------------------------------------------------------------------------------------------\nVersion: 1.2.1\nDate: 13.7.2019\n\n  Features:\n    - Added Event.core_events.init_and_load.\n    - Added Direction.to_vector.\n\n  Bugfixes:\n    - Factorio doesn't allow requiring in functions no moar.\n---------------------------------------------------------------------------------------------------\nVersion: 1.2.0\nDate: 22.6.2019\n\n  Features:\n    - Added Position:flip_x, Position:flip_y\n    - Added Queue:peek_at, push_at, pop_at, next, rnext.\n    - Added Queue[i] support for pushing or overwriting items in the queue.\n    - Added STDLIB global variable containing factorio-stdlib specific scripts.\n    - Added globals concat, safetostring.\n\n  Changes:\n    - Everything is unified under __class\n---------------------------------------------------------------------------------------------------\nVersion: 1.1.1\nDate: 14.6.2019\n\n  Optimizations:\n    - Made Event.dispatch more effecient.\n\n  Changes:\n    - Event.dispatch does not pcall on Core Events if protected mode is set.\n\n  Features:\n    - Events can now be registered with a table of options to overide the default set options.\n---------------------------------------------------------------------------------------------------\nVersion: 1.1.0\nDate: 4.6.2019\n\n  Bugfixes:\n    - Event shortcuts have proper return.\n\n  Features:\n    - Added Event.on_event.\n    - Added Table.unique_values.\n    - Added Game. write_mods()/write_statistics()/write_surfaces().\n\n  Changes:\n    - Updated the readme and wiki.\n    - Removed mod_name requirement from Logger. Any mods using this module may need to remove the mod_name paramater when creating a new logger.\n---------------------------------------------------------------------------------------------------\nVersion: 1.0.7\nDate: 4.6.2019\n\n  Bugfixes:\n    - Fix Changes logic for real this time.\n---------------------------------------------------------------------------------------------------\nVersion: 1.0.6\nDate: 4.6.2019\n\n  Bugfixes:\n    - Fix Changes logic.\n---------------------------------------------------------------------------------------------------\nVersion: 1.0.5\nDate: 4.6.2019\n\n  Features:\n    - Added Event.set_protected_mode().\n    - Added Player.pdata().\n    - Added Quickstart chart_size_multiplier config.\n    - Added vendor script version (simple semvar).\n    - Added vendor script pulsar (A* pathfinding).\n\n  Changes:\n    - Changes module no longer uses pcall. Changes files will need to be registered.\n\n  Minor Features:\n    - Added thumbnail.\n    - Added settings namespace to the test data loader.\n    - Add settings namespace to the test data loader\n---------------------------------------------------------------------------------------------------\nVersion: 1.0.4\nDate: 4.6.2019\n\n  Bugfixes:\n    - Fix quickstart script deleting the character.\n\n  Minor Features:\n    - Added magic deploy script.\n---------------------------------------------------------------------------------------------------\nVersion: 1.0.3\nDate: 4.6.2019\n\n  Bugfixes:\n    - Fix player->character renames for .17.35\n---------------------------------------------------------------------------------------------------\nVersion: 1.0.2\nDate: 4.6.2019\n\n  Bugfixes:\n    - Actually include the data.lua file in the release.\n---------------------------------------------------------------------------------------------------\nVersion: 1.0.1\nDate: 4.6.2019\n\n  Bugfixes:\n    - Add data.lua file to trick Factorio into thinking this mod changes the game.\n---------------------------------------------------------------------------------------------------\nVersion: 1.0.0\nDate: 4.6.2019\n\n  Major Features:\n    - Initial Release as a library mod.\n    - Initial Release of the Data library\n\n  Features:\n    - Added inspect available as a global function a prettier table printer.\n    - Added vendor scripts; beholder, bump, cron, enumerable, inspect, md5, memoize, middleclass, mm, semver, serpent, stateful\n\n  Changes:\n    - All modules and classes are local by default.\n    - All global variables have been eliminated.\n    - Any module that registers events must have their register_events() function called.\n    - Module locations have been moved around to have a more consistent structure. Check out the API docs.\n    - Area/Position are now returned as objects.\n    - Remove marker debug entities in favor of built in rendering.\n---------------------------------------------------------------------------------------------------\nVersion: 0.8.0\nDate: 1.27.2017\n\n  Features:\n    - Added Entity.set_indestructible, toggles an entity so that it can not be damaged or mined by either the player or other forces\n    - Added Entity.set_frozen, toggles an entity as inactive, making it inoperable and non-rotatable\n    - Added Surface.get_surface_bounds, creates an area that represents the generated boundaries of a surface\n\n  Changes:\n    - Changed Surface.find_all_entities to support area search criteria\n    - Changed Inventory.copy_inventory to support itemstacks with durability, health or ammo\n    - Changed Trains.find_filtered to support the entity type in the search criteria. Defaults to 'locomotive'\n    - Changed Entity.set_data/Entity.get_data to use a unit's unit_number as a key for data, enhancing performance for entities who have unit_numbers\n    - Deprecated Area.adjust, due to misleading name. (use Area.normalize instead)\n\n  Bugfixes:\n    - Fixed loading error when train module was loaded before the game object existed\n    - Fixed Trains.on_train_id_changed event not firing correctly\n---------------------------------------------------------------------------------------------------\nVersion: 0.7.0\nDate: 30.9.2016\n\n  Features:\n    - Added Area.adjust, modifies area to ensure x,y coordinate values are normalized\n    - Added Area.construct, creates an area from two pairs of x,y coordinates\n    - Added Area.size, replaces the deprecated function, Area.area.\n    - Added Position.copy, creates a copy of a position\n    - Added Position.construct, creates a position from an x,y pair\n    - Added table.find, searches a table for the first element that matches the function\n    - Added table.any, searches a table and returns true if any elements matches the function\n    - Added Trains module, providing train utility methods and events:\n    - Added Trains.set_data, sets persistent mod data on a train\n    - Added Trains.get_data, gets mod data on a train\n    - Added Trains.on_train_id_changed event, contains the old and new id of the train, and fires when a train id changes (e.g. locomotives are added to an existing train)\n    - Added Trains.find_filtered, searches and returns a table of trains on surface(s) for trains that match the area, name, or state criteria\n    - Added Trains.get_train_id, returns the train id of a train\n    - Added Trains.get_main_locomotive, finds and returns the main locomotive entity of any train\n    - Added Time-based events, require 'stdlib/event/time' to enable them, then register the events to script them.\n    - Event.Time.sunset, fires an event when sunset occurs for a surface\n    - Event.Time.sunrise, fires an event when sunrise occurs for a surface\n    - Event.Time.midday, fires an event noon occurs for a surface\n    - Event.Time.midnight, fires an event when midnight occurs for a surface\n    - Event.Time.minutely, fires an event when an in-game minute passes\n    - Event.Time.hourly, fires an event when an in-game hour passes\n    - Event.Time.daily, fires an event when an in-game day passes\n    - Added Config system, for easier management of persistent mod configuration\n    - Added Config.new, ex: Config.new(global.config) creates a new configuration, stored at global.config\n    - Added config.set, allows setting a value at nested paths, ex: (Config.new(global.config).set(\"your.path.here\", foo)\n    - Added config.get, allows getting nested values, ex: (Config.new(global.config).get(\"your.path.here\")\n    - Added config.delete, deletes a value at a config path, ex: (Config.new(global.config).delete(\"your.path.here\")\n    - Added config.is_set, tests whether a config value is set or not, ex: (Config.new(global.config).is_set(\"your.path.here\")\n\n  Changes:\n    - Changed Game.print_all to print to offline players (fixes <https://github.com/Afforess/Factorio-Stdlib/issues/49>)\n    - Deprecated Game.print_force (use force.print instead)\n    - Deprecated Game.print_surface (use surface.print instead)\n    - Deprecated Area.area, due to misleading name. (use Area.size instead)\n\n  Bugfixes:\n    - Fixed documentation for the Entity.to_collision_area\n    - Fixed documentation for the Area.to_table\n---------------------------------------------------------------------------------------------------\nVersion: 0.6.0\nDate: 30.7.2016\n\n  Features:\n    - Added table.keys, when passed a table, returns a copy of all the keys in the table\n    - Added table.values, when passed a table, returns a copy of all of the values in the table\n    - Added table.flatten, when passed a table, creates a copy of the table where inner nested tables were flattened into the outer table\n    - Added table.min, when passed an array, returns the minimum value\n    - Added table.max, when passed an array, returns the maximum value\n    - Added table.sum, when passed an array, adds up all the values and returns the sum\n    - Added table.avg, when passed an array, calculates the average value\n    - Added Area.area, calculates the size an area occupies\n    - Added Tile.adjacent, given a tile, returns a list of adjacent tile positions  (N, E, S, W) or (N, NE, E, SE, S, SW, W, NW), depending if diagonal tiles are specified.\n    - Added Position.equals method, to test whether two positions are at the same x,y coordinate positions\n    - Added string.split, which when given a separator, will split a string apart on the separator, returning a list of substrings\n    - Added string.is_empty, to test if a string is nil or the empty string\n    - Added a GUI event handler system. Multiple handlers for each event can be registered, using regex patterns to match element names.\n    - Gui.on_click(pattern, callback) fires a click event to the callback for any gui element whose name that matches the pattern\n    - Gui.on_checked_state_changed(pattern, callback) fires a on_checked_state_change event to the callback for any gui element whose name that matches the pattern\n    - Gui.on_text_changed(pattern, callback) fires a on_text_changed event to the callback for any gui element whose name that matches the pattern\n    - Added a Data module, which allows for easier search and manipulation of data structures\n    - Data.select, when given a selection string, returns a list of all data.raw elements that matched the selection. The returned list is backed by the real data.raw and changes to it are reflected in the data.raw and therefore the game.\n    - `Data.select('recipe') -- returns a table with all recipes`\n    - `Data.select('recipe:steel.*') -- returns a table with all recipes whose name matches 'steel.*'``\n    - `Data.select('recipe:steel.*').energy_required = 1 -- sets all recipes whose name matches 'steel.*' to require 1 energy to produce`\n    - `Data.select('recipe:steel.*').apply('energy_required', 1) = 1 -- sets all recipes whose name matches 'steel.*' to require 1 energy to produce. Apply returns itself, so apply function calls can be chained.`\n    - Recipe.select, when given a selection string, returns a list of all recipe elements in data.raw that matched the selection. The returned list is backed by the real data.raw and changes to it are reflected in the data.raw and therefore the game.\n    - `Recipe.select('steel.*:ingredients') -- returns a table with all ingredients from all recipes whose name matches 'steel.*'`\n    - `Recipe.select('steel.*:ingredients:iron-plate') -- returns a table with all iron-plate ingredient objects, from all recipes whose name matches 'steel.*'`\n\n  Changes:\n    - Changed table.each to abort iteration if the callback returns true. Iteration continues for false, nil, or missing return values.\n\n  Bugfixes:\n    - Fixed documentation for the Time module\n    - Fixed missing newline in the documentation for the Logger.new function\n---------------------------------------------------------------------------------------------------\nVersion: 0.5.1\nDate: 4.7.2016\n\n  Bugfixes:\n    - Fixed Event registry not notifying of an error in an event handler when the game was loaded, but no players were connected to the game\n---------------------------------------------------------------------------------------------------\nVersion: 0.5.0\nDate: 12.6.2016\n\n  Features:\n    - Improved table.map, filter, and each to also include additional arguments and index.\n    - Added Event.core_events, allows registering Events for on_init, on_load, and on_configuration_changed\n    - Added options to Logger.new, adds option to modify the file extension and alter the timestamp format\n    - Added Chunk.get to calculate the chunk coordinates for a given tile position\n    - Added Chunk.get_data, retrieves mod data stored on a chunk position\n    - Added Chunk.set_data sets mod data on a chunk position\n    - Added Tile.from_position, calculates tile coordinates from a position\n    - Added Tile.to_area, returns the area that a single tile occupies\n    - Added Tile.get_data, retrieves mod data stored on a tile position\n    - Added Tile.set_data, sets mod data on a tile position\n    - Added Area.spiral_iterate, is an alternate iterator (compared to Area.iterate) that iterates the Area in an inside-out spiral fashion\n    - Added Area.center, returns the center position of an Area\n    - Added string.contains, tests if a string contains a substring\n    - Added Time constants, provides easy reference for Time.SECOND, Time.MINUTE, Time.HOUR, Time.DAY, and Time.WEEK in factorio tick time\n    - Improved the lua docs, so they share the same look and feel as the factorio lua docs\n\n  Bugfixes:\n    - Fixed Logger writing after one hour instead of one minute\n    - Fixed Event registry with Event.core_events.init not raising errors correctly\n---------------------------------------------------------------------------------------------------\nVersion: 0.4.0\nDate: 9.5.2016\n\n  Features:\n    - Added string.trim(), which can remove leading and trailing whitespace from a string\n    - Added string.starts_with(...), tests if a string starts with a given substring\n    - Added string.ends_with(...), tests if a string ends with a given substring\n    - Added Entity.get_data, retrieves persistent mod-data associated with an entity\n    - Added Entity.set_data, sets or removes persistent mod-data associated with an entity\n    - Added table.each, iterates a table and applies a function to each value in the table\n    - Added table.filter, iterates a table and returns a copy that contains all the elements that passed the filter\n    - Added table.first, returns the first item in the array\n    - Added table.last, returns the last item in the array\n    - Added table.map, returns a copy of the table transformed by the function\n    - Added table.merge, merges table b into table a, overwriting any duplicate entries in table a with values in table b\n    - Improved Event Registry\n    - Added access to the event handler reference (the function handling the event) in event._handler\n    - Added Event.remove, allows events to be de-registered\n\n  Bugfixes:\n    - Fixed incorrect parameters in Surface.find_all_entities\n---------------------------------------------------------------------------------------------------\nVersion: 0.3.0\nDate: 24.4.2016\n\n  Features:\n    - Added Area.iterate function, allows iteration of the positions inside an area\n    - Added Entity.has function, can safely test if an entity has read access to a field\n    - Added Surface.lookup function, capable of converting strings, tables, or arrays to LuaSurface factorio object\n    - Added Surface.find_all_entities function, searches all loaded chunks on surface(s) for all entities that match criteria\n    - Added Event Registry, provides alternate Event registration from script.on_event.\n    - Event.register allows multiple event handlers to be registered for the same event\n    - Events that cause an error will not abort the game but print a warning to all players\n    - Events handlers cascade and can be aborted. Returning true in an event handler prevents any later handlers from being executed.\n\n  Bugfixes:\n    - Clarified documentation for Logger.log\n---------------------------------------------------------------------------------------------------\nVersion: 0.2.1\nDate: 12.4.2016\n\n  Features:\n    - Added Area.expand function, expands an area by a given amount\n    - Added Area.shrink function, shrinks an area by a given amount\n\n  Bugfixes:\n    - Correct documentation for Area.offset\n---------------------------------------------------------------------------------------------------\nVersion: 0.2.0\nDate: 6.4.2016\n\n  Features:\n    - Added Position.distance_squared for Euclidean distances between two points\n    - Added Position.distance for Euclidean distances between two points\n    - Added Position.manhattan_distance for calculating the manhattan distance between two points\n    - Added Entity.to_selection_area, creates an area that surrounds an entity selection box\n    - Added Entity.to_collision_area, creates an area that surrounds an entity collision box\n    - Added Area.inside function, tests if a position is inside an area\n    - Added Area.offset function, offsets an area by a position\n    - Added Area.round_to_integer function, rounds are to integer\n    - Added Area.to_table function, converts area to x/y, left_top/right_bottom format\n    - Majority of functions now give error messages for missing arguments\n---------------------------------------------------------------------------------------------------\nVersion: 0.1.0\nDate: 6.6.2016\n\n  Features:\n    - Added Inventory.copy_inventory function\n    - Added Position.add function\n    - Added Position.subtract function\n    - Added Position.translate function\n    - Added Position.tostring function\n    - Unit testing with [busted lua library](http://olivinelabs.com/busted)\n---------------------------------------------------------------------------------------------------\nVersion: 0.0.6\nDate: 6.6.2016\n\n  Features:\n    - Initial release\n","created_at":"2024-10-25T04:55:30.007000Z","description":"[![A](https://img.shields.io/badge/Ko--fi-Donate-darkred?logo=kofi&logoColor=white)](https://ko-fi.com/kryzeth)\r\n*Donations appreciated, but never required*\r\n\r\n---\r\n\r\n#Main Info\r\nThis is an unofficial fork of the original [Factorio Standard Library](https://mods.factorio.com/mod/stdlib), primarily updated to work with my own mods which required it, and has since been expanded with additional functionality for use within my own mods.\r\n\r\n#Notes\r\nIf you are a brand new modder, I strongly checking out one of the other standard libraries instead, made by more experienced and knowledgeable developers, depending on your specific use case:\r\n\r\n- [Factorio Library](https://mods.factorio.com/mod/flib) by Raiguard\r\n- [GUI Library](https://mods.factorio.com/mod/glib) by CodeGreen\r\n- [Factorio Data Standards Library](https://mods.factorio.com/mod/fdsl) by SafTheLamb\r\n- [Extended Runtime Event Library](https://mods.factorio.com/mod/perel) by Protocol1903\r\n- [Blueprint Manipulation Library](https://mods.factorio.com/mod/bplib) and [Things API](https://mods.factorio.com/mod/0-things) by The_LORD_thy_GOD\r\n\r\n---\r\n\r\nMany thanks to [goakiller900](https://mods.factorio.com/user/goakiller900) for setting up nearly the entire backend of the github repo, allowing me to synchronize github and mod portal releases, as well as providing several runtime fixes that had slipped through the cracks between Factorio versions 2.0 and 2.1","downloads_count":97862,"faq":"# Documentation\r\nAvailable on the homepage via: https://kryzeth.github.io/kry_stdlib/\r\n\r\n# How to use\r\n\r\nFrom within your mod, add a require line for each module you wish to use at the top of each file where you plan to use them.\r\nThese are some of the most common modules used during data, data-updates, and data-final-fixes:\r\n\r\n```\r\nlocal Data = require('__kry_stdlib__/stdlib/data/data')\r\nlocal Item = require('__kry_stdlib__/stdlib/data/item')\r\nlocal Recipe = require('__kry_stdlib__/stdlib/data/recipe')\r\nlocal Tech = require('__kry_stdlib__/stdlib/data/technology')\r\nlocal Entity = require('__kry_stdlib__/stdlib/data/entity')\r\nlocal Setting = require('__kry_stdlib__/stdlib/data/mod-setting')\r\n```\r\nThese can only be used when Space Age is enabled:\r\n```\r\nlocal Planet = require('__kry_stdlib__/stdlib/data/planet')\r\nlocal Location = require('__kry_stdlib__/stdlib/data/space-location')\r\nlocal Connection = require('__kry_stdlib__/stdlib/data/space-connection')\r\n```\r\n\r\nThese are all considered \"wrappers\" for Factorio data.raw objects of the same type. For example, these two definitions are generally equivalent:\r\n```\r\nRecipe(\"iron-gear-wheel\")\r\ndata.raw.recipe[\"iron-gear-wheel\"]\r\n```\r\nIn both cases, you can access their fields directly, the biggest difference is the additional functionality\r\nInstead of modifying the ingredients table directly, it can be accessed more safely\r\n```\r\ndata.raw.recipe[\"iron-gear-wheel\"].ingredients = {{name=\"iron-plate\",amount=2,type='item\"}}\r\nRecipe(\"iron-gear-wheel\"):set_ingredient_amount(\"iron-plate\", 2)\r\n```\r\n\r\n# Readme (old)\r\nFrom the original mod, still partially true, available at: https://github.com/Afforess/Factorio-Stdlib/wiki/Home/0c08eb0a751d2721c4572ff286f302fbc5657421","homepage":"https://kryzeth.github.io/kry_stdlib/","images":[],"license":{"description":"A permissive license that is short and to the point. It lets people do anything with your code with proper attribution and without warranty.","id":"default_mit","name":"mit","title":"MIT","url":"https://opensource.org/licenses/MIT"},"name":"kry_stdlib","owner":"Kryzeth","releases":[{"download_url":"/download/kry_stdlib/671b24c232fe23a2a84a35d7","file_name":"kry_stdlib_1.5.1.zip","info_json":{"dependencies":["base >= 2.0.0"],"factorio_version":"2.0"},"released_at":"2024-10-25T04:55:30.003000Z","sha1":"a8d601f5019ab3dba75365e1314d4ce527c0f6ad","version":"1.5.1"},{"download_url":"/download/kry_stdlib/671db3038e2875ce5b1a6743","file_name":"kry_stdlib_1.5.2.zip","info_json":{"dependencies":["base >= 2.0.0"],"factorio_version":"2.0"},"released_at":"2024-10-27T03:26:59.956000Z","sha1":"b7866fe74fc2f46efafab54e431570c56aae5beb","version":"1.5.2"},{"download_url":"/download/kry_stdlib/672054d517916e23a5b245a1","file_name":"kry_stdlib_1.5.4.zip","info_json":{"dependencies":["base >= 2.0.0"],"factorio_version":"2.0"},"released_at":"2024-10-29T03:21:57.914000Z","sha1":"7686de8305b23eacb676f11e368068e2d133020f","version":"1.5.4"},{"download_url":"/download/kry_stdlib/672aee8a3c9b04f3638942b1","file_name":"kry_stdlib_1.5.5.zip","info_json":{"dependencies":["base >= 2.0.0"],"factorio_version":"2.0"},"released_at":"2024-11-06T04:20:26.486000Z","sha1":"bf35780c366f419572f4dc58d5053b4de41277a3","version":"1.5.5"},{"download_url":"/download/kry_stdlib/675f95e86b41d44970868f07","file_name":"kry_stdlib_2.0.0.zip","info_json":{"dependencies":["base >= 2.0.0"],"factorio_version":"2.0"},"released_at":"2024-12-16T02:52:24.904000Z","sha1":"d81215c768e01859fe24a77c1fea91b676f64dd7","version":"2.0.0"},{"download_url":"/download/kry_stdlib/6760efb01025ced5a3840173","file_name":"kry_stdlib_2.0.1.zip","info_json":{"dependencies":["base >= 2.0.0"],"factorio_version":"2.0"},"released_at":"2024-12-17T03:27:44.369000Z","sha1":"d6d915346c92c951501be4560d0c31cc6031e031","version":"2.0.1"},{"download_url":"/download/kry_stdlib/67ea073f3e745dec995e073e","file_name":"kry_stdlib_2.0.2.zip","info_json":{"dependencies":["base >= 2.0.0"],"factorio_version":"2.0"},"released_at":"2025-03-31T03:08:47.264000Z","sha1":"fb87a629ad336d084db82be28b80b7903a0866ba","version":"2.0.2"},{"download_url":"/download/kry_stdlib/67f35fcd5a065626f2c95028","file_name":"kry_stdlib_2.0.3.zip","info_json":{"dependencies":["base >= 2.0.0"],"factorio_version":"2.0"},"released_at":"2025-04-07T05:17:01.883000Z","sha1":"e8e752abefb449c6d4a899d3e6c4cc3116bac575","version":"2.0.3"},{"download_url":"/download/kry_stdlib/681c35432b16601beb2cffcc","file_name":"kry_stdlib_2.0.4.zip","info_json":{"dependencies":["base >= 2.0.0"],"factorio_version":"2.0"},"released_at":"2025-05-08T04:38:27.327000Z","sha1":"6f79052cfd4ee77482e84766466e64fe4013e6ce","version":"2.0.4"},{"download_url":"/download/kry_stdlib/681d3212fb1b0d875dd98ba5","file_name":"kry_stdlib_2.0.5.zip","info_json":{"dependencies":["base >= 2.0.0"],"factorio_version":"2.0"},"released_at":"2025-05-08T22:37:06.453000Z","sha1":"bc430a391d3afc7e1bf01e9f057790c93257be93","version":"2.0.5"},{"download_url":"/download/kry_stdlib/683ca0e5cfa9d2d21a2a7f55","file_name":"kry_stdlib_2.0.6.zip","info_json":{"dependencies":["base >= 2.0.0"],"factorio_version":"2.0"},"released_at":"2025-06-01T18:50:13.236000Z","sha1":"a99687da62126cb8b6e81f2a654bdcf14d003b67","version":"2.0.6"},{"download_url":"/download/kry_stdlib/68c785c77ab3abdb57dedb57","file_name":"kry_stdlib_2.0.7.zip","info_json":{"dependencies":["base >= 2.0.0"],"factorio_version":"2.0"},"released_at":"2025-09-15T03:19:35.809000Z","sha1":"eb517c84bd4b90277ecbc934c95d1fd3c265c477","version":"2.0.7"},{"download_url":"/download/kry_stdlib/68dead16f5203cca7a5a782d","file_name":"kry_stdlib_2.0.8.zip","info_json":{"dependencies":["base >= 2.0.0"],"factorio_version":"2.0"},"released_at":"2025-10-02T16:49:26.161000Z","sha1":"f226deb0a030c58a6d11a34ca918a56de0a3590a","version":"2.0.8"},{"download_url":"/download/kry_stdlib/68eb5534acb3c53399b5a057","file_name":"kry_stdlib_2.0.9.zip","info_json":{"dependencies":["base >= 2.0.0"],"factorio_version":"2.0"},"released_at":"2025-10-12T07:13:56.687000Z","sha1":"cf995f4dc1302960be9ee3ae32e16905bae18890","version":"2.0.9"},{"download_url":"/download/kry_stdlib/691e94bdadf0ace748c4f686","file_name":"kry_stdlib_2.0.10.zip","info_json":{"dependencies":["base >= 2.0.0"],"factorio_version":"2.0"},"released_at":"2025-11-20T04:10:37.506000Z","sha1":"b56d3fa65441838d4dbb651c9f0fabaddc7a5890","version":"2.0.10"},{"download_url":"/download/kry_stdlib/6923a52b32b4745b338625cc","file_name":"kry_stdlib_2.0.11.zip","info_json":{"dependencies":["base >= 2.0.0"],"factorio_version":"2.0"},"released_at":"2025-11-24T00:22:03.231000Z","sha1":"eb8fb59637da4a7635b4d467eff0a81b5c836768","version":"2.0.11"},{"download_url":"/download/kry_stdlib/694e688bcc7798ee16ceede4","file_name":"kry_stdlib_2.0.12.zip","info_json":{"dependencies":["base >= 2.0.0"],"factorio_version":"2.0"},"released_at":"2025-12-26T10:50:51.041000Z","sha1":"4eeeff5fe8e8849d8377ff8118709f999acc4417","version":"2.0.12"},{"download_url":"/download/kry_stdlib/695a4bbd824d75f82d834661","file_name":"kry_stdlib_2.1.0.zip","info_json":{"dependencies":["base >= 2.0.0"],"factorio_version":"2.0"},"released_at":"2026-01-04T11:15:09.172000Z","sha1":"41ee009aab73f87f761fb6483b09172b30a77cb1","version":"2.1.0"},{"download_url":"/download/kry_stdlib/6a17809a54a66af4cb87c6a7","file_name":"kry_stdlib_2.1.1.zip","info_json":{"dependencies":["base >= 2.0.0"],"factorio_version":"2.0"},"released_at":"2026-05-27T23:39:06.634000Z","sha1":"9c4382c003d96f914f8bd7fa56fae6efab469ef5","version":"2.1.1"},{"download_url":"/download/kry_stdlib/6a3aa5d1c09dc3c46c4bf3ea","file_name":"kry_stdlib_2.2.0.zip","info_json":{"dependencies":["base"],"factorio_version":"2.1"},"released_at":"2026-06-23T15:27:13.967000Z","sha1":"04167040b2aea7ecd7ce2266ac1d0a97620c6365","version":"2.2.0"},{"download_url":"/download/kry_stdlib/6a44861b4fdc8d70d24a9386","file_name":"kry_stdlib_2.2.2.zip","info_json":{"dependencies":["base"],"factorio_version":"2.1"},"released_at":"2026-07-01T03:14:35.149000Z","sha1":"17763502d1c27d2b27fa25528ff7b207a9531ad6","version":"2.2.2"},{"download_url":"/download/kry_stdlib/6a470ebb4aa68b6d2255ac00","file_name":"kry_stdlib_2.1.2.zip","info_json":{"dependencies":["base >= 2.0.0"],"factorio_version":"2.0"},"released_at":"2026-07-03T01:22:03.823000Z","sha1":"ba47460af7844fffb22ef7e099ed64cf544656bf","version":"2.1.2"},{"download_url":"/download/kry_stdlib/6a47ecbb6b2e79555025b7d9","file_name":"kry_stdlib_2.2.3.zip","info_json":{"dependencies":["base"],"factorio_version":"2.1"},"released_at":"2026-07-03T17:09:15.717000Z","sha1":"af7ca70379d909104e155f3f984b4b3747fd7c9f","version":"2.2.3"},{"download_url":"/download/kry_stdlib/6a5442e4b818789c6f6a7dd3","file_name":"kry_stdlib_2.2.4.zip","info_json":{"dependencies":["base"],"factorio_version":"2.1"},"released_at":"2026-07-13T01:44:04.021000Z","sha1":"1ab511a4360d24f18909e541493f2039b79365f6","version":"2.2.4"},{"download_url":"/download/kry_stdlib/6a563ce2ffc9cbdc3bcd334a","file_name":"kry_stdlib_2.2.5.zip","info_json":{"dependencies":["base"],"factorio_version":"2.1"},"released_at":"2026-07-14T13:42:58.876000Z","sha1":"8ba8dfd5a9bda992593ff7db6355ac444090c55e","version":"2.2.5"},{"download_url":"/download/kry_stdlib/6a58450768e63bf86c1f0c33","file_name":"kry_stdlib_2.2.6.zip","info_json":{"dependencies":["base"],"factorio_version":"2.1"},"released_at":"2026-07-16T02:42:15.356000Z","sha1":"dc94b722142d17c3194d9feafb32cd4d1ca68002","version":"2.2.6"},{"download_url":"/download/kry_stdlib/6a5c7a9c8437c5b8c268da66","file_name":"kry_stdlib_2.2.7.zip","info_json":{"dependencies":["base"],"factorio_version":"2.1"},"released_at":"2026-07-19T07:19:56.505000Z","sha1":"93fb1421d4ac4be6f16ced13950ba049e56191e1","version":"2.2.7"},{"download_url":"/download/kry_stdlib/6a6001b5fa0e877cf162da2d","file_name":"kry_stdlib_2.2.8.zip","info_json":{"dependencies":["base"],"factorio_version":"2.1"},"released_at":"2026-07-21T23:33:09.566000Z","sha1":"bede53655a711c389aaa8f68c1290042a6fe6ff5","version":"2.2.8"},{"download_url":"/download/kry_stdlib/6a6189ca3fb9d3d1a6115488","file_name":"kry_stdlib_2.2.9.zip","info_json":{"dependencies":["base"],"factorio_version":"2.1"},"released_at":"2026-07-23T03:26:02.282000Z","sha1":"6271fae832e2e27982e683dfe5a660506c6ee443","version":"2.2.9"},{"download_url":"/download/kry_stdlib/6a62b52502a8bf18e1b21af5","file_name":"kry_stdlib_2.2.10.zip","info_json":{"dependencies":["base"],"factorio_version":"2.1"},"released_at":"2026-07-24T00:43:17.556000Z","sha1":"540eb6123a258a53e3f40baf344bd35b7d92cb23","version":"2.2.10"},{"download_url":"/download/kry_stdlib/6a67f5ee864b960b4402a4f7","file_name":"kry_stdlib_2.2.11.zip","info_json":{"dependencies":["base"],"factorio_version":"2.1"},"released_at":"2026-07-28T00:21:02.377000Z","sha1":"49137ee67cc9a0d973aaed33f0b082861a7b7bc4","version":"2.2.11"},{"download_url":"/download/kry_stdlib/6a6c1eedca6c582304026892","file_name":"kry_stdlib_2.2.12.zip","info_json":{"dependencies":["base"],"factorio_version":"2.1"},"released_at":"2026-07-31T04:05:01.044000Z","sha1":"4f096d81b84e36304bf189e9f87b725a5425c155","version":"2.2.12"},{"download_url":"/download/kry_stdlib/6a6f7eb43e7289e6e65616a9","file_name":"kry_stdlib_2.2.13.zip","info_json":{"dependencies":["base"],"factorio_version":"2.1"},"released_at":"2026-08-02T17:30:28.691000Z","sha1":"4b05dc85dfcc8d2bbdd4fb45535d4704ebdc1a7f","version":"2.2.13"},{"download_url":"/download/kry_stdlib/6a791b72f8e64577d282257a","file_name":"kry_stdlib_2.2.14.zip","info_json":{"dependencies":["base"],"factorio_version":"2.1"},"released_at":"2026-08-10T00:29:38.456000Z","sha1":"9c0607e402c3b65d12c586931351de84ad815d85","version":"2.2.14"},{"download_url":"/download/kry_stdlib/6a93c3f6db280259fc0f2a23","file_name":"kry_stdlib_2.2.15.zip","info_json":{"dependencies":["base"],"factorio_version":"2.1"},"released_at":"2026-08-30T05:47:34.752000Z","sha1":"082de4626e0f96345a7b5667da5b064f55f13697","version":"2.2.15"},{"download_url":"/download/kry_stdlib/6a93d32f11804501f02c99a5","file_name":"kry_stdlib_2.2.16.zip","info_json":{"dependencies":["base"],"factorio_version":"2.1"},"released_at":"2026-08-30T06:52:31.931000Z","sha1":"1501c57280b67ab1221f4e78cd5fa1b65e8f4ebb","version":"2.2.16"},{"download_url":"/download/kry_stdlib/6aa0ee24ce0627d97fca6f70","file_name":"kry_stdlib_2.2.18.zip","info_json":{"dependencies":["base"],"factorio_version":"2.1"},"released_at":"2026-09-09T05:27:00.357000Z","sha1":"dca4724022fe967418090bb5cbb5a93016589a37","version":"2.2.18"},{"download_url":"/download/kry_stdlib/6aa63ddff2438948106e01b8","file_name":"kry_stdlib_2.2.19.zip","info_json":{"dependencies":["base"],"factorio_version":"2.1"},"released_at":"2026-09-13T06:08:31.260000Z","sha1":"59246818d718b4f6303ad133447615b7fc18cb8d","version":"2.2.19"},{"download_url":"/download/kry_stdlib/6ab208ec5081be06e16a01c8","file_name":"kry_stdlib_2.2.20.zip","info_json":{"dependencies":["base"],"factorio_version":"2.1"},"released_at":"2026-09-22T04:49:48.751000Z","sha1":"897580789ba93fcaba3b2310241b43e1f997ab30","version":"2.2.20"},{"download_url":"/download/kry_stdlib/6ab349e9e236a1d2410f88d8","file_name":"kry_stdlib_2.2.21.zip","info_json":{"dependencies":["base >= 2.1.20"],"factorio_version":"2.1"},"released_at":"2026-09-23T03:39:21.165000Z","sha1":"46345db4da18582d8a71ac5f3d92d16c5e984a95","version":"2.2.21"},{"download_url":"/download/kry_stdlib/6ab47728bbe328bcd8f0e601","file_name":"kry_stdlib_2.2.22.zip","info_json":{"dependencies":["base >= 2.1.20"],"factorio_version":"2.1"},"released_at":"2026-09-24T01:04:40.930000Z","sha1":"f566fc152511fbad8b81fab2b63b45fdb879c00f","version":"2.2.22"},{"download_url":"/download/kry_stdlib/6ab5e6311cb86c26b8114bf6","file_name":"kry_stdlib_2.2.23.zip","info_json":{"dependencies":["base >= 2.1.20","(?) PlanetsLib >= 2.0.0"],"factorio_version":"2.1"},"released_at":"2026-09-25T03:10:41.150000Z","sha1":"5e844b0eff37f594d9d5f16ab8d6139fbfc251ba","version":"2.2.23"}],"score":1.6666666666667922,"source_url":"https://github.com/kryzeth/kry_stdlib","summary":"Unofficial fork of the Factorio Standard Library, which was a project to bring Factorio modders high-quality, commonly-required utilities and tools. Compatibility with older mods which relied on the original stdlib mod is not guaranteed.","tags":[],"thumbnail":"/assets/332dd2474a98fb6d37d53e35e308faf01ca5590b.thumb.png","title":"Factorio Standard Library","updated_at":"2026-09-25T03:10:41.156000Z"}
