Compare commits
	
		
			14 Commits
		
	
	
		
			3ca25f7ec4
			...
			multiskin
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
|  | 9f49060ae6 | ||
|  | 8e8c79aca2 | ||
|  | 601fee1079 | ||
|  | c36b1e5fc4 | ||
|  | b1f9e9f1fd | ||
|  | f150e4c988 | ||
|  | 503f44ac70 | ||
|  | eb7a52daff | ||
|  | 753be543f1 | ||
|  | 35db060560 | ||
|  | fd77253816 | ||
|  | f6502ba32b | ||
|  | aa9984b789 | ||
|  | afce9f1140 | 
							
								
								
									
										3
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						| @@ -6,3 +6,6 @@ tags | ||||
| *.vim | ||||
| armor.conf | ||||
|  | ||||
| ## Eclipse project files & directories | ||||
| .project | ||||
| .settings | ||||
|   | ||||
| @@ -68,6 +68,9 @@ armor_fire_protect = false | ||||
| -- Enable punch damage effects. | ||||
| armor_punch_damage = true | ||||
|  | ||||
| -- Enable migration of old armor inventories | ||||
| armor_migrate_old_inventory = true | ||||
|  | ||||
| API | ||||
| --- | ||||
|  | ||||
|   | ||||
							
								
								
									
										152
									
								
								3d_armor/api.lua
									
									
									
									
									
								
							
							
						
						| @@ -1,4 +1,4 @@ | ||||
| local skin_previews = {} | ||||
| local use_multiskin = minetest.global_exists("multiskin") | ||||
| local use_player_monoids = minetest.global_exists("player_monoids") | ||||
| local use_armor_monoid = minetest.global_exists("armor_monoid") | ||||
| local armor_def = setmetatable({}, { | ||||
| @@ -39,7 +39,7 @@ armor = { | ||||
| 		"list[current_player;main;0,5.85;8,3;8]", | ||||
| 	def = armor_def, | ||||
| 	textures = armor_textures, | ||||
| 	default_skin = "character", | ||||
| 	default_skin = "character.png", | ||||
| 	materials = { | ||||
| 		wood = "group:wood", | ||||
| 		cactus = "default:cactus", | ||||
| @@ -69,6 +69,7 @@ armor = { | ||||
| 		on_damage = {}, | ||||
| 		on_destroy = {}, | ||||
| 	}, | ||||
| 	migrate_old_inventory = true, | ||||
| 	version = "0.4.9", | ||||
| } | ||||
|  | ||||
| @@ -156,35 +157,45 @@ armor.run_callbacks = function(self, callback, player, index, stack) | ||||
| end | ||||
|  | ||||
| armor.update_player_visuals = function(self, player) | ||||
| 	if not player then | ||||
| 	local name = self:get_valid_player(player, "[update_player_visuals]") | ||||
| 	if not name then | ||||
| 		return | ||||
| 	end | ||||
| 	local name = player:get_player_name() | ||||
| 	if self.textures[name] then | ||||
| 		default.player_set_textures(player, { | ||||
| 			self.textures[name].skin, | ||||
| 			self.textures[name].armor, | ||||
| 			self.textures[name].wielditem, | ||||
| 		}) | ||||
| 	local textures = { | ||||
| 		"blank.png", | ||||
| 		"blank.png", | ||||
| 		self.textures[name].armor, | ||||
| 		self.textures[name].wielditem, | ||||
| 	} | ||||
| 	if use_multiskin then | ||||
| 		multiskin.textures[name] = textures | ||||
| 		multiskin.update_player_visuals(player) | ||||
| 	else | ||||
| 		textures[1] = armor.default_skin | ||||
| 		default.player_set_textures(player, textures) | ||||
| 	end | ||||
| 	self:run_callbacks("on_update", player) | ||||
| end | ||||
|  | ||||
| armor.set_player_armor = function(self, player) | ||||
| 	local name, player_inv = self:get_valid_player(player, "[set_player_armor]") | ||||
| 	local name, armor_inv = self:get_valid_player(player, "[set_player_armor]") | ||||
| 	if not name then | ||||
| 		return | ||||
| 	end | ||||
| 	local state = 0 | ||||
| 	local count = 0 | ||||
| 	local material = {count=1} | ||||
| 	local preview = armor:get_preview(name) | ||||
| 	local texture = "3d_armor_trans.png" | ||||
| 	local preview = "3d_armor_preview.png" | ||||
| 	local texture = "blank.png" | ||||
| 	local textures = {} | ||||
| 	local physics = {} | ||||
| 	local attributes = {} | ||||
| 	local levels = {} | ||||
| 	local groups = {} | ||||
| 	local change = {} | ||||
| 	if use_multiskin then | ||||
| 		preview = multiskin.get_preview(player) or preview | ||||
| 	end | ||||
| 	for _, phys in pairs(self.physics) do | ||||
| 		physics[phys] = 1 | ||||
| 	end | ||||
| @@ -195,7 +206,10 @@ armor.set_player_armor = function(self, player) | ||||
| 		change[group] = 1 | ||||
| 		levels[group] = 0 | ||||
| 	end | ||||
| 	local list = player_inv:get_list("armor") | ||||
| 	local list = armor_inv:get_list("armor") | ||||
| 	if type(list) ~= "table" then | ||||
| 		return | ||||
| 	end | ||||
| 	for i, stack in pairs(list) do | ||||
| 		if stack:get_count() == 1 then | ||||
| 			local def = stack:get_definition() | ||||
| @@ -211,6 +225,7 @@ armor.set_player_armor = function(self, player) | ||||
| 						local level = def.groups["armor_"..element] | ||||
| 						levels["fleshy"] = levels["fleshy"] + level | ||||
| 					end | ||||
| 					break | ||||
| 				end | ||||
| 				-- DEPRECATED, use armor_groups instead | ||||
| 				if def.groups["armor_radiation"] and levels["radiation"] then | ||||
| @@ -286,11 +301,10 @@ armor.set_player_armor = function(self, player) | ||||
| 	self.def[name].state = state | ||||
| 	self.def[name].count = count | ||||
| 	self:update_player_visuals(player) | ||||
| 	self:run_callbacks("on_update", player) | ||||
| end | ||||
|  | ||||
| armor.punch = function(self, player, hitter, time_from_last_punch, tool_capabilities) | ||||
| 	local name, player_inv = self:get_valid_player(player, "[punch]") | ||||
| 	local name, armor_inv = self:get_valid_player(player, "[punch]") | ||||
| 	if not name then | ||||
| 		return | ||||
| 	end | ||||
| @@ -298,7 +312,7 @@ armor.punch = function(self, player, hitter, time_from_last_punch, tool_capabili | ||||
| 	local count = 0 | ||||
| 	local recip = true | ||||
| 	local default_groups = {cracky=3, snappy=3, choppy=3, crumbly=3, level=1} | ||||
| 	local list = player_inv:get_list("armor") | ||||
| 	local list = armor_inv:get_list("armor") | ||||
| 	for i, stack in pairs(list) do | ||||
| 		if stack:get_count() == 1 then | ||||
| 			local name = stack:get_name() | ||||
| @@ -375,33 +389,6 @@ armor.damage = function(self, player, index, stack, use) | ||||
| 	end | ||||
| end | ||||
|  | ||||
| armor.get_player_skin = function(self, name) | ||||
| 	local skin = nil | ||||
| 	if self.skin_mod == "skins" or self.skin_mod == "simple_skins" then | ||||
| 		skin = skins.skins[name] | ||||
| 	elseif self.skin_mod == "u_skins" then | ||||
| 		skin = u_skins.u_skins[name] | ||||
| 	elseif self.skin_mod == "wardrobe" then | ||||
| 		local skins = wardrobe.playerSkins or {} | ||||
| 		if skins[name] then | ||||
| 			skin = string.gsub(skins[name], "%.png$","") | ||||
| 		end | ||||
| 	end | ||||
| 	return skin or armor.default_skin | ||||
| end | ||||
|  | ||||
| armor.add_preview = function(self, preview) | ||||
| 	skin_previews[preview] = true | ||||
| end | ||||
|  | ||||
| armor.get_preview = function(self, name) | ||||
| 	local preview = armor:get_player_skin(name).."_preview.png" | ||||
| 	if skin_previews[preview] then | ||||
| 		return preview | ||||
| 	end | ||||
| 	return "character_preview.png" | ||||
| end | ||||
|  | ||||
| armor.get_armor_formspec = function(self, name, listring) | ||||
| 	if armor.def[name].init_time == 0 then | ||||
| 		return "label[0,0;Armor not initialized!]" | ||||
| @@ -417,12 +404,64 @@ armor.get_armor_formspec = function(self, name, listring) | ||||
| 	for _, attr in pairs(self.attributes) do | ||||
| 		formspec = formspec:gsub("armor_attr_"..attr, armor.def[name][attr]) | ||||
| 	end | ||||
| 	for _, group in pairs(self.attributes) do | ||||
| 		formspec = formspec:gsub("armor_group_"..group, armor.def[name][group]) | ||||
| 	for group, _ in pairs(self.registered_groups) do | ||||
| 		formspec = formspec:gsub("armor_group_"..group, | ||||
| 			armor.def[name].groups[group]) | ||||
| 	end | ||||
| 	return formspec | ||||
| end | ||||
|  | ||||
| armor.serialize_inventory_list = function(self, list) | ||||
| 	local list_table = {} | ||||
| 	for _, stack in ipairs(list) do | ||||
| 		table.insert(list_table, stack:to_string()) | ||||
| 	end | ||||
| 	return minetest.serialize(list_table) | ||||
| end | ||||
|  | ||||
| armor.deserialize_inventory_list = function(self, list_string) | ||||
| 	local list_table = minetest.deserialize(list_string) | ||||
| 	local list = {} | ||||
| 	for _, stack in ipairs(list_table or {}) do | ||||
| 		table.insert(list, ItemStack(stack)) | ||||
| 	end | ||||
| 	return list | ||||
| end | ||||
|  | ||||
| armor.load_armor_inventory = function(self, player) | ||||
| 	local msg = "[load_armor_inventory]" | ||||
| 	local name = player:get_player_name() | ||||
| 	if not name then | ||||
| 		minetest.log("warning", S("3d_armor: Player name is nil @1", msg)) | ||||
| 		return | ||||
| 	end | ||||
| 	local armor_inv = minetest.get_inventory({type="detached", name=name.."_armor"}) | ||||
| 	if not armor_inv then | ||||
| 		minetest.log("warning", S("3d_armor: Detached armor inventory is nil @1", msg)) | ||||
| 		return | ||||
| 	end | ||||
| 	local armor_list_string = player:get_attribute("3d_armor_inventory") | ||||
| 	if armor_list_string then | ||||
| 		armor_inv:set_list("armor", self:deserialize_inventory_list(armor_list_string)) | ||||
| 		return true | ||||
| 	end | ||||
| end | ||||
|  | ||||
| armor.save_armor_inventory = function(self, player) | ||||
| 	local msg = "[save_armor_inventory]" | ||||
| 	local name = player:get_player_name() | ||||
| 	if not name then | ||||
| 		minetest.log("warning", S("3d_armor: Player name is nil @1", msg)) | ||||
| 		return | ||||
| 	end | ||||
| 	local armor_inv = minetest.get_inventory({type="detached", name=name.."_armor"}) | ||||
| 	if not armor_inv then | ||||
| 		minetest.log("warning", S("3d_armor: Detached armor inventory is nil @1", msg)) | ||||
| 		return | ||||
| 	end | ||||
| 	player:set_attribute("3d_armor_inventory", self:serialize_inventory_list(armor_inv:get_list("armor"))) | ||||
| end | ||||
|  | ||||
| armor.update_inventory = function(self, player) | ||||
| 	-- DEPRECATED: Legacy inventory support | ||||
| end | ||||
| @@ -434,17 +473,13 @@ armor.set_inventory_stack = function(self, player, i, stack) | ||||
| 		minetest.log("warning", "3d_armor: Player name is nil "..msg) | ||||
| 		return | ||||
| 	end | ||||
| 	local player_inv = player:get_inventory() | ||||
| 	local armor_inv = minetest.get_inventory({type="detached", name=name.."_armor"}) | ||||
| 	if not player_inv then | ||||
| 		minetest.log("warning", "3d_armor: Player inventory is nil "..msg) | ||||
| 		return | ||||
| 	elseif not armor_inv then | ||||
| 		minetest.log("warning", "3d_armor: Detached armor inventory is nil "..msg) | ||||
| 	if not armor_inv then | ||||
| 		minetest.log("warning", S("3d_armor: Detached armor inventory is nil @1", msg)) | ||||
| 		return | ||||
| 	end | ||||
| 	player_inv:set_stack("armor", i, stack) | ||||
| 	armor_inv:set_stack("armor", i, stack) | ||||
| 	self:save_armor_inventory(player) | ||||
| end | ||||
|  | ||||
| armor.get_valid_player = function(self, player, msg) | ||||
| @@ -458,7 +493,7 @@ armor.get_valid_player = function(self, player, msg) | ||||
| 		minetest.log("warning", "3d_armor: Player name is nil "..msg) | ||||
| 		return | ||||
| 	end | ||||
| 	local inv = player:get_inventory() | ||||
| 	local inv = minetest.get_inventory({type="detached", name=name.."_armor"}) | ||||
| 	if not inv then | ||||
| 		minetest.log("warning", "3d_armor: Player inventory is nil "..msg) | ||||
| 		return | ||||
| @@ -467,8 +502,11 @@ armor.get_valid_player = function(self, player, msg) | ||||
| end | ||||
|  | ||||
| armor.drop_armor = function(pos, stack) | ||||
| 	local obj = minetest.add_item(pos, stack) | ||||
| 	if obj then | ||||
| 		obj:setvelocity({x=math.random(-1, 1), y=5, z=math.random(-1, 1)}) | ||||
| 	local node = minetest.get_node_or_nil(pos) | ||||
| 	if node then | ||||
| 		local obj = minetest.add_item(pos, stack) | ||||
| 		if obj then | ||||
| 			obj:setvelocity({x=math.random(-1, 1), y=5, z=math.random(-1, 1)}) | ||||
| 		end | ||||
| 	end | ||||
| end | ||||
|   | ||||
| @@ -1,6 +1,12 @@ | ||||
| local S = function(s) return s end | ||||
| if minetest.global_exists("intllib") then | ||||
| 	S = intllib.Getter() | ||||
| 	if intllib.make_gettext_pair then | ||||
| 		-- New method using gettext. | ||||
| 		S = intllib.make_gettext_pair() | ||||
| 	else | ||||
| 		-- Old method using text files. | ||||
| 		S = intllib.Getter() | ||||
| 	end | ||||
| end | ||||
|  | ||||
| armor:register_armor("3d_armor:helmet_admin", { | ||||
|   | ||||
| @@ -5,3 +5,4 @@ fire? | ||||
| ethereal? | ||||
| bakedclay? | ||||
| intllib? | ||||
| multiskin? | ||||
|   | ||||
| @@ -1,6 +1,12 @@ | ||||
| local S = function(s) return s end | ||||
| if minetest.global_exists("intllib") then | ||||
| 	S = intllib.Getter() | ||||
| 	if intllib.make_gettext_pair then | ||||
| 		-- New method using gettext. | ||||
| 		S = intllib.make_gettext_pair() | ||||
| 	else | ||||
| 		-- Old method using text files. | ||||
| 		S = intllib.Getter() | ||||
| 	end | ||||
| end | ||||
| local modname = minetest.get_current_modname() | ||||
| local modpath = minetest.get_modpath(modname) | ||||
| @@ -41,11 +47,11 @@ end | ||||
| -- Load Configuration | ||||
|  | ||||
| for name, config in pairs(armor.config) do | ||||
| 	local setting = minetest.setting_get("armor_"..name) | ||||
| 	local setting = minetest.settings:get("armor_"..name) | ||||
| 	if type(config) == "number" then | ||||
| 		setting = tonumber(setting) | ||||
| 	elseif type(config) == "boolean" then | ||||
| 		setting = minetest.setting_getbool("armor_"..name) | ||||
| 		setting = minetest.settings:get_bool("armor_"..name) | ||||
| 	end | ||||
| 	if setting ~= nil then | ||||
| 		armor.config[name] = setting | ||||
| @@ -59,25 +65,14 @@ for material, _ in pairs(armor.materials) do | ||||
| end | ||||
|  | ||||
| -- Mod Compatibility | ||||
|  | ||||
| if minetest.get_modpath("multiskin") then | ||||
| 	multiskin.model = "3d_armor_character.b3d" | ||||
| end | ||||
| if minetest.get_modpath("technic") then | ||||
| 	armor.formspec = armor.formspec.. | ||||
| 		"label[5,2.5;"..S("Radiation")..":  armor_group_radiation]" | ||||
| 	armor:register_armor_group("radiation") | ||||
| end | ||||
| local skin_mods = {"skins", "u_skins", "simple_skins", "wardrobe"} | ||||
| for _, mod in pairs(skin_mods) do | ||||
| 	local path = minetest.get_modpath(mod) | ||||
| 	if path then | ||||
| 		local dir_list = minetest.get_dir_list(path.."/textures") | ||||
| 		for _, fn in pairs(dir_list) do | ||||
| 			if fn:find("_preview.png$") then | ||||
| 				armor:add_preview(fn) | ||||
| 			end | ||||
| 		end | ||||
| 		armor.skin_mod = mod | ||||
| 	end | ||||
| end | ||||
| if not minetest.get_modpath("moreores") then | ||||
| 	armor.materials.mithril = nil | ||||
| end | ||||
| @@ -106,27 +101,23 @@ end) | ||||
|  | ||||
| local function init_player_armor(player) | ||||
| 	local name = player:get_player_name() | ||||
| 	local player_inv = player:get_inventory() | ||||
| 	local pos = player:getpos() | ||||
| 	if not name or not player_inv or not pos then | ||||
| 	if not name or not pos then | ||||
| 		return false | ||||
| 	end | ||||
| 	local armor_inv = minetest.create_detached_inventory(name.."_armor", { | ||||
| 		on_put = function(inv, listname, index, stack, player) | ||||
| 			player:get_inventory():set_stack(listname, index, stack) | ||||
| 			armor:save_armor_inventory(player) | ||||
| 			armor:run_callbacks("on_equip", player, index, stack) | ||||
| 			armor:set_player_armor(player) | ||||
| 		end, | ||||
| 		on_take = function(inv, listname, index, stack, player) | ||||
| 			player:get_inventory():set_stack(listname, index, nil) | ||||
| 			armor:save_armor_inventory(player) | ||||
| 			armor:run_callbacks("on_unequip", player, index, stack) | ||||
| 			armor:set_player_armor(player) | ||||
| 		end, | ||||
| 		on_move = function(inv, from_list, from_index, to_list, to_index, count, player) | ||||
| 			local plaver_inv = player:get_inventory() | ||||
| 			local stack = inv:get_stack(to_list, to_index) | ||||
| 			player_inv:set_stack(to_list, to_index, stack) | ||||
| 			player_inv:set_stack(from_list, from_index, nil) | ||||
| 			armor:save_armor_inventory(player) | ||||
| 			armor:set_player_armor(player) | ||||
| 		end, | ||||
| 		allow_put = function(inv, listname, index, stack, player) | ||||
| @@ -153,10 +144,18 @@ local function init_player_armor(player) | ||||
| 		end, | ||||
| 	}, name) | ||||
| 	armor_inv:set_size("armor", 6) | ||||
| 	player_inv:set_size("armor", 6) | ||||
| 	if not armor:load_armor_inventory(player) and armor.migrate_old_inventory then | ||||
| 		local player_inv = player:get_inventory() | ||||
| 		player_inv:set_size("armor", 6) | ||||
| 		for i=1, 6 do | ||||
| 			local stack = player_inv:get_stack("armor", i) | ||||
| 			armor_inv:set_stack("armor", i, stack) | ||||
| 		end | ||||
| 		armor:save_armor_inventory(player) | ||||
| 		player_inv:set_size("armor", 0) | ||||
| 	end | ||||
| 	for i=1, 6 do | ||||
| 		local stack = player_inv:get_stack("armor", i) | ||||
| 		armor_inv:set_stack("armor", i, stack) | ||||
| 		local stack = armor_inv:get_stack("armor", i) | ||||
| 		armor:run_callbacks("on_equip", player, i, stack) | ||||
| 	end | ||||
| 	armor.def[name] = { | ||||
| @@ -175,24 +174,13 @@ local function init_player_armor(player) | ||||
| 	for group, _ in pairs(armor.registered_groups) do | ||||
| 		armor.def[name].groups[group] = 0 | ||||
| 	end | ||||
| 	local skin = armor:get_player_skin(name) | ||||
| 	armor.textures[name] = { | ||||
| 		skin = skin..".png", | ||||
| 		armor = "3d_armor_trans.png", | ||||
| 		wielditem = "3d_armor_trans.png", | ||||
| 		preview = armor.default_skin.."_preview.png", | ||||
| 		armor = "blank.png", | ||||
| 		wielditem = "blank.png", | ||||
| 	} | ||||
| 	local texture_path = minetest.get_modpath("player_textures") | ||||
| 	if texture_path then | ||||
| 		local dir_list = minetest.get_dir_list(texture_path.."/textures") | ||||
| 		for _, fn in pairs(dir_list) do | ||||
| 			if fn == "player_"..name..".png" then | ||||
| 				armor.textures[name].skin = fn | ||||
| 				break | ||||
| 			end | ||||
| 		end | ||||
| 	end | ||||
| 	armor:set_player_armor(player) | ||||
| 	minetest.after(0, function(player) | ||||
| 		armor:set_player_armor(player) | ||||
| 	end, player) | ||||
| 	return true | ||||
| end | ||||
|  | ||||
| @@ -201,9 +189,10 @@ end | ||||
| default.player_register_model("3d_armor_character.b3d", { | ||||
| 	animation_speed = 30, | ||||
| 	textures = { | ||||
| 		armor.default_skin..".png", | ||||
| 		"3d_armor_trans.png", | ||||
| 		"3d_armor_trans.png", | ||||
| 		armor.default_skin, | ||||
| 		"blank.png", | ||||
| 		"blank.png", | ||||
| 		"blank.png", | ||||
| 	}, | ||||
| 	animations = { | ||||
| 		stand = {x=0, y=79}, | ||||
| @@ -215,22 +204,6 @@ default.player_register_model("3d_armor_character.b3d", { | ||||
| 	}, | ||||
| }) | ||||
|  | ||||
| minetest.register_on_player_receive_fields(function(player, formname, fields) | ||||
| 	local name = armor:get_valid_player(player, "[on_player_receive_fields]") | ||||
| 	if not name then | ||||
| 		return | ||||
| 	end | ||||
| 	for field, _ in pairs(fields) do | ||||
| 		if string.find(field, "skins_set") then | ||||
| 			minetest.after(0, function(player) | ||||
| 				local skin = armor:get_player_skin(name) | ||||
| 				armor.textures[name].skin = skin..".png" | ||||
| 				armor:set_player_armor(player) | ||||
| 			end, player) | ||||
| 		end | ||||
| 	end | ||||
| end) | ||||
|  | ||||
| minetest.register_on_joinplayer(function(player) | ||||
| 	default.player_set_model(player, "3d_armor_character.b3d") | ||||
| 	minetest.after(0, function(player) | ||||
| @@ -251,13 +224,13 @@ end) | ||||
|  | ||||
| if armor.config.drop == true or armor.config.destroy == true then | ||||
| 	minetest.register_on_dieplayer(function(player) | ||||
| 		local name, player_inv = armor:get_valid_player(player, "[on_dieplayer]") | ||||
| 		local name, armor_inv = armor:get_valid_player(player, "[on_dieplayer]") | ||||
| 		if not name then | ||||
| 			return | ||||
| 		end | ||||
| 		local drop = {} | ||||
| 		for i=1, player_inv:get_size("armor") do | ||||
| 			local stack = player_inv:get_stack("armor", i) | ||||
| 		for i=1, armor_inv:get_size("armor") do | ||||
| 			local stack = armor_inv:get_stack("armor", i) | ||||
| 			if stack:get_count() > 0 then | ||||
| 				table.insert(drop, stack) | ||||
| 				armor:set_inventory_stack(player, i, nil) | ||||
|   | ||||
| Before Width: | Height: | Size: 2.9 KiB After Width: | Height: | Size: 389 B | 
| Before Width: | Height: | Size: 242 B After Width: | Height: | Size: 356 B | 
| Before Width: | Height: | Size: 2.9 KiB After Width: | Height: | Size: 368 B | 
| Before Width: | Height: | Size: 208 B After Width: | Height: | Size: 336 B | 
| Before Width: | Height: | Size: 3.0 KiB After Width: | Height: | Size: 405 B | 
| Before Width: | Height: | Size: 264 B After Width: | Height: | Size: 355 B | 
| Before Width: | Height: | Size: 2.9 KiB After Width: | Height: | Size: 389 B | 
| Before Width: | Height: | Size: 248 B After Width: | Height: | Size: 356 B | 
| Before Width: | Height: | Size: 2.9 KiB After Width: | Height: | Size: 389 B | 
| Before Width: | Height: | Size: 242 B After Width: | Height: | Size: 356 B | 
| Before Width: | Height: | Size: 2.9 KiB After Width: | Height: | Size: 368 B | 
| Before Width: | Height: | Size: 206 B After Width: | Height: | Size: 336 B | 
| Before Width: | Height: | Size: 2.9 KiB After Width: | Height: | Size: 368 B | 
| Before Width: | Height: | Size: 210 B After Width: | Height: | Size: 336 B | 
| Before Width: | Height: | Size: 2.9 KiB After Width: | Height: | Size: 391 B | 
| Before Width: | Height: | Size: 196 B After Width: | Height: | Size: 347 B | 
| Before Width: | Height: | Size: 2.9 KiB After Width: | Height: | Size: 389 B | 
| Before Width: | Height: | Size: 282 B After Width: | Height: | Size: 361 B | 
| Before Width: | Height: | Size: 3.1 KiB After Width: | Height: | Size: 508 B | 
| Before Width: | Height: | Size: 314 B After Width: | Height: | Size: 431 B | 
| Before Width: | Height: | Size: 3.0 KiB After Width: | Height: | Size: 440 B | 
| Before Width: | Height: | Size: 280 B After Width: | Height: | Size: 382 B | 
| Before Width: | Height: | Size: 3.4 KiB After Width: | Height: | Size: 520 B | 
| Before Width: | Height: | Size: 456 B After Width: | Height: | Size: 414 B | 
| Before Width: | Height: | Size: 3.1 KiB After Width: | Height: | Size: 508 B | 
| Before Width: | Height: | Size: 318 B After Width: | Height: | Size: 431 B | 
| Before Width: | Height: | Size: 3.1 KiB After Width: | Height: | Size: 508 B | 
| Before Width: | Height: | Size: 300 B After Width: | Height: | Size: 431 B | 
| Before Width: | Height: | Size: 3.0 KiB After Width: | Height: | Size: 440 B | 
| Before Width: | Height: | Size: 276 B After Width: | Height: | Size: 382 B | 
| Before Width: | Height: | Size: 3.0 KiB After Width: | Height: | Size: 440 B | 
| Before Width: | Height: | Size: 284 B After Width: | Height: | Size: 382 B | 
| Before Width: | Height: | Size: 3.0 KiB After Width: | Height: | Size: 493 B | 
| Before Width: | Height: | Size: 281 B After Width: | Height: | Size: 399 B | 
| Before Width: | Height: | Size: 3.1 KiB After Width: | Height: | Size: 474 B | 
| Before Width: | Height: | Size: 362 B After Width: | Height: | Size: 407 B | 
| Before Width: | Height: | Size: 3.0 KiB After Width: | Height: | Size: 431 B | 
| Before Width: | Height: | Size: 192 B After Width: | Height: | Size: 343 B | 
| Before Width: | Height: | Size: 3.0 KiB After Width: | Height: | Size: 426 B | 
| Before Width: | Height: | Size: 225 B After Width: | Height: | Size: 343 B | 
| Before Width: | Height: | Size: 3.2 KiB After Width: | Height: | Size: 469 B | 
| Before Width: | Height: | Size: 253 B After Width: | Height: | Size: 352 B | 
| Before Width: | Height: | Size: 2.9 KiB After Width: | Height: | Size: 431 B | 
| Before Width: | Height: | Size: 184 B After Width: | Height: | Size: 343 B | 
| Before Width: | Height: | Size: 3.0 KiB After Width: | Height: | Size: 431 B | 
| Before Width: | Height: | Size: 185 B After Width: | Height: | Size: 343 B | 
| Before Width: | Height: | Size: 3.0 KiB After Width: | Height: | Size: 426 B | 
| Before Width: | Height: | Size: 215 B After Width: | Height: | Size: 343 B | 
| Before Width: | Height: | Size: 3.0 KiB After Width: | Height: | Size: 426 B | 
| Before Width: | Height: | Size: 226 B After Width: | Height: | Size: 343 B | 
| Before Width: | Height: | Size: 3.0 KiB After Width: | Height: | Size: 478 B | 
| Before Width: | Height: | Size: 202 B After Width: | Height: | Size: 350 B | 
| Before Width: | Height: | Size: 3.1 KiB After Width: | Height: | Size: 473 B | 
| Before Width: | Height: | Size: 186 B After Width: | Height: | Size: 337 B | 
| Before Width: | Height: | Size: 2.9 KiB After Width: | Height: | Size: 379 B | 
| Before Width: | Height: | Size: 2.9 KiB After Width: | Height: | Size: 379 B | 
| Before Width: | Height: | Size: 3.0 KiB After Width: | Height: | Size: 407 B | 
| Before Width: | Height: | Size: 2.9 KiB After Width: | Height: | Size: 379 B | 
| Before Width: | Height: | Size: 2.9 KiB After Width: | Height: | Size: 379 B | 
| Before Width: | Height: | Size: 2.9 KiB After Width: | Height: | Size: 379 B | 
| Before Width: | Height: | Size: 2.9 KiB After Width: | Height: | Size: 379 B | 
| Before Width: | Height: | Size: 2.8 KiB After Width: | Height: | Size: 382 B | 
| Before Width: | Height: | Size: 3.0 KiB After Width: | Height: | Size: 414 B | 
| Before Width: | Height: | Size: 2.9 KiB After Width: | Height: | Size: 398 B | 
| Before Width: | Height: | Size: 2.9 KiB After Width: | Height: | Size: 402 B | 
| Before Width: | Height: | Size: 3.1 KiB After Width: | Height: | Size: 430 B | 
| Before Width: | Height: | Size: 2.9 KiB After Width: | Height: | Size: 398 B | 
| Before Width: | Height: | Size: 2.9 KiB After Width: | Height: | Size: 398 B | 
| Before Width: | Height: | Size: 2.9 KiB After Width: | Height: | Size: 402 B | 
| Before Width: | Height: | Size: 2.9 KiB After Width: | Height: | Size: 402 B | 
| Before Width: | Height: | Size: 2.9 KiB After Width: | Height: | Size: 412 B | 
| Before Width: | Height: | Size: 3.0 KiB After Width: | Height: | Size: 420 B | 
| Before Width: | Height: | Size: 2.8 KiB After Width: | Height: | Size: 366 B | 
| Before Width: | Height: | Size: 2.8 KiB After Width: | Height: | Size: 365 B | 
| Before Width: | Height: | Size: 2.9 KiB After Width: | Height: | Size: 381 B | 
| Before Width: | Height: | Size: 2.8 KiB After Width: | Height: | Size: 366 B | 
| Before Width: | Height: | Size: 2.8 KiB After Width: | Height: | Size: 366 B | 
| Before Width: | Height: | Size: 2.8 KiB After Width: | Height: | Size: 365 B | 
| Before Width: | Height: | Size: 2.8 KiB After Width: | Height: | Size: 365 B | 
| Before Width: | Height: | Size: 2.8 KiB After Width: | Height: | Size: 359 B | 
| Before Width: | Height: | Size: 2.9 KiB After Width: | Height: | Size: 364 B | 
| Before Width: | Height: | Size: 2.9 KiB After Width: | Height: | Size: 379 B | 
| Before Width: | Height: | Size: 2.9 KiB After Width: | Height: | Size: 372 B | 
| Before Width: | Height: | Size: 3.0 KiB After Width: | Height: | Size: 413 B | 
| Before Width: | Height: | Size: 2.9 KiB After Width: | Height: | Size: 379 B | 
| Before Width: | Height: | Size: 2.9 KiB After Width: | Height: | Size: 379 B | 
| Before Width: | Height: | Size: 2.9 KiB After Width: | Height: | Size: 372 B | 
| Before Width: | Height: | Size: 2.9 KiB After Width: | Height: | Size: 372 B | 
| Before Width: | Height: | Size: 2.8 KiB After Width: | Height: | Size: 378 B | 
| Before Width: | Height: | Size: 3.0 KiB After Width: | Height: | Size: 414 B | 
| Before Width: | Height: | Size: 3.0 KiB After Width: | Height: | Size: 406 B | 
| Before Width: | Height: | Size: 187 B After Width: | Height: | Size: 363 B |