From d531348339b40197420a200b301e75f35a07450a Mon Sep 17 00:00:00 2001
From: ezsh <ezsh.junk@gmail.com>
Date: Sun, 12 Apr 2020 14:48:21 +0200
Subject: [PATCH] Refactor slave summary implementation

The SlaveSummary function was a long-long sheet of if's and it was
practically unmaintainable. Refactor it into a list of rendering
delgates, where delegates are set once and called without branching.

Now we set delegates for each summary render call, but it can be done
on game start and game loading.
---
 devTools/FC.d.ts                              |   22 +-
 js/002-config/fc-js-init.js                   |    2 +-
 js/003-data/gameVariableData.js               |   35 +-
 js/003-data/slaveSummaryData.js               |  164 +
 src/002-config/fc-version.js                  |    2 +-
 .../backwardsCompatibility.js                 |    7 +
 src/debugging/debugJS.js                      |    2 +-
 src/events/intro/introSummary.tw              |    4 +-
 src/js/slaveListing.js                        |    2 +-
 src/js/slaveSummaryHelpers.js                 | 2636 +++++++
 src/js/slaveSummaryWidgets.js                 | 6345 +++++------------
 src/uncategorized/summaryOptions.tw           |   98 +-
 12 files changed, 4774 insertions(+), 4545 deletions(-)
 create mode 100644 js/003-data/slaveSummaryData.js
 create mode 100644 src/js/slaveSummaryHelpers.js

diff --git a/devTools/FC.d.ts b/devTools/FC.d.ts
index abc179ce417..4bc3727692c 100644
--- a/devTools/FC.d.ts
+++ b/devTools/FC.d.ts
@@ -254,8 +254,28 @@ declare namespace App {
 		}
 		namespace View { }
 		namespace SlaveSummary {
-			type StringRenderer = (slave: App.Entity.SlaveState) => String;
 			type AppendRenderer = (slave: App.Entity.SlaveState, parentNode: Node) => void;
+
+			class AbbreviationState {
+				clothes: number;
+				devotion: number;
+				diet: number;
+				drugs: number;
+				genitalia: number;
+				health: number;
+				hormoneBalance: number;
+				mental: number;
+				nationality: number;
+				origins: number;
+				physicals: number;
+				race: number;
+				rules: number;
+				rulesets: number;
+				skills: number;
+			}
+			class State {
+				abbreviation: AbbreviationState;
+			}
 		}
 	}
 
diff --git a/js/002-config/fc-js-init.js b/js/002-config/fc-js-init.js
index 6ee8fcd9812..5eff87da0a2 100644
--- a/js/002-config/fc-js-init.js
+++ b/js/002-config/fc-js-init.js
@@ -17,7 +17,7 @@ App.Arcology.Cell = {},
 App.Art = {};
 App.Corporate = {};
 App.Data = {};
-App.Data.HeroSlaves = { };
+App.Data.HeroSlaves = {};
 App.Data.Weather = {};
 App.Debug = {};
 App.Desc = {};
diff --git a/js/003-data/gameVariableData.js b/js/003-data/gameVariableData.js
index 27885b3ef3a..78cbf91463f 100644
--- a/js/003-data/gameVariableData.js
+++ b/js/003-data/gameVariableData.js
@@ -34,24 +34,30 @@ App.Data.defaultGameStateVariables = {
 	cashLastWeek: 0,
 
 	// UI content
+	UI: {
+		slaveSummary: {
+			abbreviation: {
+				clothes: 2,
+				devotion: 2,
+				diet: 2,
+				drugs: 2,
+				genitalia: 2,
+				health: 2,
+				mental: 2,
+				nationality: 2,
+				origins: 2,
+				physicals: 2,
+				race: 2,
+				rules: 2,
+				rulesets: 2,
+				skills: 2,
+			}
+		}
+	},
 	FSNamePref: 0,
 	HGFormality: 1,
 	HGSeverity: 0,
-	abbreviateClothes: 2,
-	abbreviateDevotion: 2,
-	abbreviateDiet: 2,
-	abbreviateDrugs: 2,
-	abbreviateGenitalia: 2,
-	abbreviateHealth: 2,
-	abbreviateMental: 2,
-	abbreviateNationality: 2,
-	abbreviateOrigins: 2,
-	abbreviatePhysicals: 2,
-	abbreviateRace: 2,
-	abbreviateRules: 2,
-	abbreviateRulesets: 2,
 	abbreviateSidebar: 2,
-	abbreviateSkills: 2,
 	adamPrinciple: 0,
 	allowFamilyTitles: 0,
 	allowMaleSlaveNames: false,
@@ -1385,7 +1391,6 @@ App.Data.resetOnNGPlus = {
 		compact: 1, Cash: 1, Upkeep: 1, SexSlaveCount: 1, roomPop: 1, Rep: 1, GSP: 1, Authority: 1, Security: 1, Crime: 1, confirmWeekEnd: 0,
 	},
 	DefaultBirthDestination: "individually decided fates",
-	abbreviateHormoneBalance: 2,
 	legendaryFacility: 0,
 	heroSlavesPurchased : [],
 	fcnn: [
diff --git a/js/003-data/slaveSummaryData.js b/js/003-data/slaveSummaryData.js
new file mode 100644
index 00000000000..d19b3cc91b7
--- /dev/null
+++ b/js/003-data/slaveSummaryData.js
@@ -0,0 +1,164 @@
+App.Data.SlaveSummary = {
+	long: {
+		clothes: {
+			"Western clothing": 'Chaps.',
+			"a Santa dress": 'Santa dress.',
+			"a ball gown": 'Ball gown.',
+			"a bimbo outfit": 'Bimbo outfit.',
+			"a biyelgee costume": 'Biyelgee costume.',
+			"a bra": 'Nice bra.',
+			"a bunny outfit": 'Bunny outfit.',
+			"a burkini": 'Burkini.',
+			"a burqa": 'Burqa.',
+			"a button-up shirt and panties": 'Button-up shirt, panties.',
+			"a button-up shirt": 'Nice button-up shirt.',
+			"a chattel habit": 'Chattel habit.',
+			"a cheerleader outfit": 'Cheerleader.',
+			"a comfortable bodysuit": 'Bodysuit.',
+			"a courtesan dress": 'Courtesan dress.',
+			"a cybersuit": 'Cybersuit.',
+			"a dirndl": 'Dirndl.',
+			"a fallen nuns habit": 'Slutty habit.',
+			"a gothic lolita dress": 'Gothic lolita dress.',
+			"a halter top dress": 'Halter top dress.',
+			"a hanbok": 'Hanbok.',
+			"a hijab and abaya": 'Hijab and abaya.',
+			"a hijab and blouse": 'Hijab and blouse.',
+			"a huipil": 'Huipil.',
+			"a kimono": 'Kimono.',
+			"a klan robe": 'Klan robe.',
+			"a latex catsuit": 'Nice latex.',
+			"a leotard": 'Leotard.',
+			"a long qipao": 'Long Qipao.',
+			"a maternity dress": 'Maternity dress.',
+			"a military uniform": 'Military uniform.',
+			"a mini dress": 'Mini dress.',
+			"a monokini": 'Monokini.',
+			"a mounty outfit": 'Mounty outfit.',
+			"a nice maid outfit": 'Nice maid.',
+			"a nice nurse outfit": 'Nice nurse.',
+			"a nice pony outfit": 'Nice pony outfit.',
+			"a niqab and abaya": 'Niqab and abaya.',
+			"a one-piece swimsuit": 'Swimsuit.',
+			"a penitent nuns habit": 'Cilice.',
+			"a police uniform": 'Police uniform.',
+			"a red army uniform": 'Red Army uniform.',
+			"a scalemail bikini": 'Scalemail bikini.',
+			"a schoolgirl outfit": 'Schoolgirl outfit.',
+			"a schutzstaffel uniform": 'Schutzstaffel uniform.',
+			"a skimpy loincloth": 'Skimpy loincloth.',
+			"a slave gown": 'Slave gown.',
+			"a slutty klan robe": 'Slutty klan robe.',
+			"a slutty maid outfit": 'Slutty maid.',
+			"a slutty nurse outfit": 'Slutty nurse.',
+			"a slutty outfit": 'Slutty outfit.',
+			"a slutty pony outfit": 'Slutty pony outfit.',
+			"a slutty qipao": 'Slutty qipao.',
+			"a slutty schutzstaffel uniform": 'Slutty Schutzstaffel uniform.',
+			"a sports bra": 'Sports bra.',
+			"a string bikini": 'String bikini.',
+			"a striped bra": 'Striped bra.',
+			"a succubus outfit": 'Succubus outfit.',
+			"a sweater and cutoffs": 'Jean s, sweater.',
+			"a sweater and panties": 'Sweater, panties.',
+			"a sweater": 'Nice sweater.',
+			"a t-shirt and jeans": 'Blue jeans, t-shirt.',
+			"a t-shirt and panties": 'Panties, t-shirt.',
+			"a t-shirt and thong": 'Thong, t-shirt.',
+			"a t-shirt": 'T-shirt.',
+			"a tank-top and panties": 'Tank-top, panties.',
+			"a tank-top": 'Nice tank-top.',
+			"a thong": 'Nice thong.',
+			"a toga": 'Toga.',
+			"a tube top and thong": 'Tube top, thong.',
+			"a tube top": 'Nice tube top.',
+			"an apron": 'Apron.',
+			"an oversized t-shirt and boys": 'Over-sized t-shirt, boy s.',
+			"an oversized t-shirt": 'Nice over-sized t-shirt.',
+			"attractive lingerie for a pregnant woman": 'Preggo lingerie.',
+			"attractive lingerie": 'Nice lingerie.',
+			"battlearmor": 'Battlearmor.',
+			"battledress": 'Battledress.',
+			"body oil": 'Body oil.',
+			"boys": 'Boy s.',
+			"chains": 'Chains.',
+			"clubslut netting": 'Netting.',
+			"conservative clothing": 'Conservative clothing.',
+			"cutoffs and a t-shirt": 'Cutoffs, t-shirt.',
+			"cutoffs": 'Jean s.',
+			"harem gauze": 'Harem outfit.',
+			"jeans": 'Tight blue jeans.',
+			"kitty lingerie": 'Kitty lingerie.',
+			"leather pants and a tube top": 'Leather pants, tube top.',
+			"leather pants and pasties": 'Leather pants, pasties.',
+			"leather pants": 'Nice leather pants.',
+			"lederhosen": 'Lederhosen.',
+			"nice business attire": 'Nice suit.',
+			"overalls": 'Overalls.',
+			"panties and pasties": 'Pasties, panties.',
+			"panties": 'Nice panties.',
+			"pasties": 'Pasties.',
+			"restrictive latex": 'Bondage latex.',
+			"shibari ropes": 'Shibari.',
+			"slutty business attire": 'Slutty suit.',
+			"slutty jewelry": 'Bangles.',
+			"spats and a tank top": 'Spats, tank top.',
+			"sport s and a sports bra": 'Shorts, bra.',
+			"sport s and a t-shirt": 'Nice sport s, shirt.',
+			"sport s": 'Shorts.',
+			"stretch pants and a crop-top": 'Stretch pants, crop-top.',
+			"striped panties": 'Striped panties.',
+			"striped underwear": 'Striped underwear',
+			"uncomfortable straps": 'Leather straps.',
+
+		},
+		accessory: {
+			collar: {
+				"ancient Egyptian": 'Wesekh.',
+				"ball gag": 'Ball gag.',
+				"bell collar": 'Bell collar.',
+				"bit gag": 'Bit gag.',
+				"bowtie": 'Bowtie collar.',
+				"cruel retirement counter": 'Cruel counter collar.',
+				"dildo gag": 'Dildo gag.',
+				"heavy gold": 'Gold collar.',
+				"leather with cowbell": 'Cowbell collar.',
+				"massive dildo gag": 'Throat-bulging dildo gag.',
+				"neck corset": 'Neck corset.',
+				"nice retirement counter": 'Nice counter collar.',
+				"porcelain mask": 'Porcelain mask.',
+				"preg biometrics": 'Pregnancy biometrics collar.',
+				"pretty jewelry": 'Pretty collar.',
+				"satin choker": 'Satin choker.',
+				"shock punishment": 'Shock collar.',
+				"silk ribbon": 'Silken ribbon.',
+				"stylish leather": 'Stylish leather collar.',
+				"tight steel": 'Steel collar.',
+				"uncomfortable leather": 'Leather collar.',
+			},
+			belly: {
+				"a corset": 'Corset.',
+				"a huge empathy belly": 'Huge fake belly.',
+				"a large empathy belly": 'Large fake belly.',
+				"a medium empathy belly": 'Medium fake belly.',
+				"a small empathy belly": 'Small fake belly.',
+				"a support band": 'Support band.',
+				"an extreme corset": 'Extreme corsetage.',
+				"shapewear": 'Shapewear.',
+			},
+			vaginal: {
+				"bullet vibrator": "Attached bullet vibrator.",
+				"smart bullet vibrator": "Attached smart bullet vibrator.",
+				"dildo": "Vaginal dildo.",
+				"large dildo": "Large vaginal dildo.",
+				"huge dildo": "Huge vaginal dildo.",
+				"long dildo": "Long vaginal dildo.",
+				"long, large dildo": "Long and large vaginal dildo.",
+				"long, huge dildo": "Long and wide vaginal dildo.",
+			}
+		},
+		short: {
+
+		},
+	}
+}
diff --git a/src/002-config/fc-version.js b/src/002-config/fc-version.js
index 9be650848c2..dda732eac5b 100644
--- a/src/002-config/fc-version.js
+++ b/src/002-config/fc-version.js
@@ -1,7 +1,7 @@
 App.Version = {
 	base: "0.10.7.1", // The vanilla version the mod is based off of, this should never be changed.
 	pmod: "3.4.0",
-	release: 1065,
+	release: 1066,
 };
 
 /* Use release as save version */
diff --git a/src/data/backwardsCompatibility/backwardsCompatibility.js b/src/data/backwardsCompatibility/backwardsCompatibility.js
index 930e64d4bce..6d870b3f7e9 100644
--- a/src/data/backwardsCompatibility/backwardsCompatibility.js
+++ b/src/data/backwardsCompatibility/backwardsCompatibility.js
@@ -199,6 +199,13 @@ App.Update.globalVariables = function(node) {
 		if (V.sortSlavesBy === "income" || V.sortSlavesBy === "lastWeeksCashIncome") {
 			V.sortSlavesBy = "weeklyIncome";
 		}
+
+		if (typeof V.abbreviateClothes === "number") {
+			for (const key of ["clothes", "devotion", "diet", "drugs", "genitalia", "health", "hormoneBalance",
+				"mental", "nationality", "origins", "physicals", "race", "rules", "rulesets", "skills"]) {
+				V.UI.slaveSummary.abbreviation[key] = V["abbreviate" + capFirstChar(key)];
+			}
+		}
 	}
 
 	if (typeof V.taitorWeeks !== "undefined") {
diff --git a/src/debugging/debugJS.js b/src/debugging/debugJS.js
index d2c4dabc29c..92f29adeb43 100644
--- a/src/debugging/debugJS.js
+++ b/src/debugging/debugJS.js
@@ -121,6 +121,6 @@ App.Debug.dumpGameState = function() {
 
 App.Debug.slaveSummaryText = function(idx) {
 	let span = document.createElement("span");
-	span.appendChild(SlaveSummary(State.variables.slaves[idx]));
+	span.appendChild(App.UI.SlaveSummary.render(State.variables.slaves[idx]));
 	return span.outerHTML;
 };
diff --git a/src/events/intro/introSummary.tw b/src/events/intro/introSummary.tw
index f4663b62525..25f164f96db 100644
--- a/src/events/intro/introSummary.tw
+++ b/src/events/intro/introSummary.tw
@@ -78,7 +78,7 @@ You may review your settings before clicking "Continue" to begin.<br>
 <<if ($economy != 100) || ($seeDicks != 25) || ($continent != "North America") || ($internationalTrade != 1) || ($internationalVariety != 1) || ($seeRace != 1) || ($seeNationality != 1) || ($seeExtreme != 0) || ($seeCircumcision != 1) || ($seeAge != 1) || ($plot != 1)>>
 	| [[restore defaults|Intro Summary][$seeDicks = 25, $economy = 100, $continent = "North America", $internationalTrade = 1, $internationalVariety = 1, $seeRace = 1, $seeNationality = 1, $seeExtreme = 0, $seeCircumcision = 1, $seeAge = 1, $plot = 1]]
 <</if>>
-	| [[Cheat Start|init Nationalities][cashX(1000000, "cheating"), $PC.rules.living = "luxurious",repX(20000, "cheating"), $dojo += 1, $cheatMode = 1, $seeDesk = 0, $seeFCNN = 0, $sortSlavesBy = "devotion", $sortSlavesOrder = "descending", $sortSlavesMain = 0, $rulesAssistantMain = 1, $abbreviateDevotion = 1, $abbreviateRules = 1, $abbreviateClothes = 2, $abbreviateHealth = 1, $abbreviateDiet = 1, $abbreviateDrugs = 1, $abbreviateRace = 1, $abbreviateNationality = 1, $abbreviateGenitalia = 1, $abbreviatePhysicals = 1, $abbreviateSkills = 1, $abbreviateMental = 2, $PC.skill.trading = 100, $PC.skill.warfare = 100, $PC.skill.slaving = 100, $PC.skill.engineering = 100, $PC.skill.medicine = 100, $PC.skill.hacking = 100, resetEyeColor($PC)]] //Intended for debugging: may have unexpected effects//
+	| [[Cheat Start|init Nationalities][cashX(1000000, "cheating"), $PC.rules.living = "luxurious",repX(20000, "cheating"), $dojo += 1, $cheatMode = 1, $seeDesk = 0, $seeFCNN = 0, $sortSlavesBy = "devotion", $sortSlavesOrder = "descending", $sortSlavesMain = 0, $rulesAssistantMain = 1, $UI.slaveSummary.abbreviation = {devotion: 1, rules: 1, clothes: 2, health: 1, diet: 1, drugs: 1, race: 1, nationality: 1, genitalia: 1, physicals: 1, skills: 1, mental: 2}, $PC.skill.trading = 100, $PC.skill.warfare = 100, $PC.skill.slaving = 100, $PC.skill.engineering = 100, $PC.skill.medicine = 100, $PC.skill.hacking = 100, resetEyeColor($PC)]] //Intended for debugging: may have unexpected effects//
 
 <<set $minimumSlaveAge = variableAsNumber($minimumSlaveAge, 3, 18, 18)>>
 <<set $retirementAge = variableAsNumber($retirementAge, 25, 120, 45)>>
@@ -1362,4 +1362,4 @@ You may review your settings before clicking "Continue" to begin.<br>
 	<</if>>
 
 	</div>
-</div>
\ No newline at end of file
+</div>
diff --git a/src/js/slaveListing.js b/src/js/slaveListing.js
index cc59d9a7aa1..86eb4a80105 100644
--- a/src/js/slaveListing.js
+++ b/src/js/slaveListing.js
@@ -328,7 +328,7 @@ App.UI.SlaveList.render = function() {
 			res.appendChild(App.UI.jobLinks.transfersFragment(index, (slave, assignment) => { App.UI.SlaveList.ScrollPosition.record(); assignJob(slave, assignment); }));
 		}
 
-		res.appendChild(SlaveSummary(slave));
+		res.appendChild(App.UI.SlaveSummary.render(slave));
 
 		if (postNote !== undefined) {
 			const pn = postNote(slave, index);
diff --git a/src/js/slaveSummaryHelpers.js b/src/js/slaveSummaryHelpers.js
new file mode 100644
index 00000000000..d08727fb011
--- /dev/null
+++ b/src/js/slaveSummaryHelpers.js
@@ -0,0 +1,2636 @@
+// WARNING This file defines objects referenced in slaveSummaryWidgets.js.
+// Either keep this file above the slaveSummaryWidgets.js in the name ordered list
+// (tweego process them in this order), or rework the references.
+
+/* eslint-disable camelcase */
+
+App.UI.SlaveSummaryImpl = function() {
+	const helpers = function() {
+		/**
+		 * @param {HTMLElement} element
+		 * @param {string|string[]} [classNames]
+		 */
+		function _addClassNames(element, classNames) {
+			if (classNames != undefined) { /* eslint-disable-line eqeqeq */
+				if (Array.isArray(classNames)) {
+					element.classList.add(...classNames);
+				} else {
+					element.classList.add(classNames);
+				}
+			}
+		}
+
+		/**
+		 * @param {Node} container
+		 * @param {string} text
+		 * @param {string|string[]} [classNames]
+		 * @param {boolean} [stdDecor=false]
+		 * @param {number} [value]
+		 */
+		function makeSpan(container, text, classNames, stdDecor = false, value) {
+			let r = document.createElement("span");
+			r.classList.add("ssi");
+			_addClassNames(r, classNames);
+			if (value != undefined && V.summaryStats) { /* eslint-disable-line eqeqeq */
+				text += `[${value}]`;
+			}
+			r.textContent = stdDecor ? `${capFirstChar(text)}.` : text;
+			if (container) {
+				container.appendChild(r);
+			}
+			return r;
+		}
+
+		/**
+		 * @param {Node} container
+		 * @param {string} text
+		 * @returns {Text}
+		 */
+		function addText(container, text) {
+			const r = document.createTextNode(text);
+			if (container) {
+				container.appendChild(r);
+			}
+			return r;
+		}
+
+		/**
+		 * @param {Node} [container]
+		 * @param {string|string[]} [classNames]
+		 */
+		function makeBlock(container, classNames) {
+			let r = document.createElement("span");
+			r.classList.add("ssb");
+			_addClassNames(r, classNames);
+			if (container) {
+				container.appendChild(r);
+			}
+			return r;
+		}
+
+		/**
+		 * @param {Node} container
+		 * @param {string|string[]} [classNames]
+		 * @returns {HTMLParagraphElement}
+		 */
+		function makeParagraph(container, classNames) {
+			let r = document.createElement("p");
+			r.classList.add("si");
+			_addClassNames(r, classNames);
+			if (container) {
+				container.appendChild(r);
+			}
+			return r;
+		}
+
+		/**
+		 * @param {object} dict
+		 * @param {*} value
+		 * @param {*} [defaultValue]
+		 * @returns {*|null}
+		 */
+		function getExactRating(dict, value, defaultValue = null) {
+			const res = dict[value];
+			return res ? res : defaultValue;
+		}
+
+		/**
+		 * @param {object} ratings
+		 * @param {number} value
+		 * @returns {*|null}
+		 */
+		function getNumericRating(ratings, value) {
+			let p;
+			for (p in ratings) {
+				// @ts-ignore
+				if (p >= value) {
+					return ratings[p];
+				}
+			}
+			return ratings[p];
+		}
+
+		return {
+			addText: addText,
+			makeSpan: makeSpan,
+			makeBlock: makeBlock,
+			makeParagraph: makeParagraph,
+			getExactRating: getExactRating,
+			getNumericRating: getNumericRating
+		};
+	}();
+
+	const bits = function() {
+		const addText = helpers.addText;
+		const makeSpan = helpers.makeSpan;
+		const makeBlock = helpers.makeBlock;
+		/**
+		 * @param {App.Entity.SlaveState} slave
+		 * @param {Node} c
+		 * @returns {void}
+		 */
+		function short_health(slave, c) {
+			if (slave.health.health < -20) {
+				makeSpan(c, "H", ["red", "strong"], true, slave.health.health);
+			} else if (slave.health.health <= 20) {
+				makeSpan(c, "H", ["yellow", "strong"], true, slave.health.health);
+			} else if (slave.health.health > 20) {
+				makeSpan(c, "H", ["green", "strong"], true, slave.health.health);
+			}
+			if (passage() === "Clinic" && V.clinicUpgradeScanner) {
+				if (slave.chem > 15) {
+					makeSpan(c, `C${Math.ceil(slave.chem / 10)}`, ["cyan", "strong"]);
+				} else if (slave.chem <= 15 && slave.assignment === "get treatment in the clinic") {
+					makeSpan(c, `CSafe`, ["green", "strong"]);
+				}
+			}
+		}
+
+		/**
+		 * @param {App.Entity.SlaveState} slave
+		 * @param {Node} c
+		 * @returns {void}
+		 */
+		function short_illness(slave, c) {
+			if (slave.health.illness > 4) {
+				makeSpan(c, `Ill${slave.health.illness}`, ["red", "strong"], true, slave.health.illness);
+			} else if (slave.health.illness > 3) {
+				makeSpan(c, `Ill${slave.health.illness}`, ["red", "strong"], true, slave.health.illness);
+			} else if (slave.health.illness > 2) {
+				makeSpan(c, `Ill${slave.health.illness}`, ["red", "strong"], true, slave.health.illness);
+			} else if (slave.health.illness > 0) {
+				makeSpan(c, `Ill${slave.health.illness}`, ["yellow", "strong"], true, slave.health.illness);
+			}
+		}
+
+		/**
+		 * @param {App.Entity.SlaveState} slave
+		 * @param {Node} c
+		 * @returns {void}
+		 */
+		function short_tired(slave, c) {
+			if (slave.health.tired > 90) {
+				makeSpan(c, "Exh", ["red", "strong"], true, slave.health.tired);
+			} else if (slave.health.tired > 60) {
+				makeSpan(c, "Tir+", "orange", true, slave.health.tired);
+			} else if (slave.health.tired > 30) {
+				makeSpan(c, "Tir", "yellow", true, slave.health.tired);
+			} else if (slave.health.tired < 0) {
+				makeSpan(c, "Ene", "green", true, slave.health.tired);
+			}
+		}
+
+		/**
+		 * @param {App.Entity.SlaveState} slave
+		 * @param {Node} c
+		 * @returns {void}
+		 */
+		function long_health(slave, c) {
+			if (slave.health.health < -90) {
+				makeSpan(c, "On the edge of death", ["red", "strong"], true, slave.health.health);
+			} else if (slave.health.health < -50) {
+				makeSpan(c, "Extremely unhealthy", ["red", "strong"], true, slave.health.health);
+			} else if (slave.health.health < -20) {
+				makeSpan(c, "Unhealthy", ["red", "strong"], true, slave.health.health);
+			} else if (slave.health.health <= 20) {
+				makeSpan(c, "healthy", "yellow", true, slave.health.health);
+			} else if (slave.health.health <= 50) {
+				makeSpan(c, "Very healthy", "green", true, slave.health.health);
+			} else if (slave.health.health <= 90) {
+				makeSpan(c, "Extremely healthy", "green", true, slave.health.health);
+			} else {
+				makeSpan(c, "Unnaturally healthy", "green", true, slave.health.health);
+			}
+			if (passage() === "Clinic" && V.clinicUpgradeScanner) {
+				if (slave.chem > 15) {
+					makeSpan(c, `Carcinogen buildup: ${Math.ceil(slave.chem / 10)}.`, "cyan");
+				} else if (slave.chem <= 15 && slave.assignment === "get treatment in the clinic") {
+					makeSpan(c, `Safe chem levels.`, "green");
+				}
+			}
+		}
+
+		/**
+		 * @param {App.Entity.SlaveState} slave
+		 * @param {Node} c
+		 * @returns {void}
+		 */
+		function long_illness(slave, c) {
+			if (slave.health.illness > 4) {
+				makeSpan(c, "Terribly ill", ["red", "strong"], true, slave.health.illness);
+			} else if (slave.health.illness > 3) {
+				makeSpan(c, "Very ill", ["red", "strong"], true, slave.health.illness);
+			} else if (slave.health.illness > 2) {
+				makeSpan(c, "Ill", ["red", "strong"], true, slave.health.illness);
+			} else if (slave.health.illness > 0) {
+				makeSpan(c, "Sick", "yellow", true, slave.health.illness);
+			}
+		}
+
+		/**
+		 * @param {App.Entity.SlaveState} slave
+		 * @param {Node} c
+		 * @returns {void}
+		 */
+		function long_tired(slave, c) {
+			if (slave.health.tired > 90) {
+				makeSpan(c, "Exhausted", ["red", "strong"], true, slave.health.tired);
+			} else if (slave.health.tired > 60) {
+				makeSpan(c, "Fatigued", "orange", true, slave.health.tired);
+			} else if (slave.health.tired > 30) {
+				makeSpan(c, "Tired", "yellow", true, slave.health.tired);
+			} else if (slave.health.tired < 0) {
+				makeSpan(c, "Energetic", "green", true, slave.health.tired);
+			}
+		}
+
+		/**
+		 * @param {App.Entity.SlaveState} slave
+		 * @param {Node} c
+		 * @returns {void}
+		 */
+		function long_age(slave, c) {
+			let r = makeSpan(c, "", "pink");
+			if (V.showAgeDetail === 1) {
+				r.textContent += `Age ` + `${slave.actualAge}` + `.`;
+			} else if (slave.actualAge >= 40) {
+				r.textContent += `Forties.`;
+			} else if (slave.actualAge >= 35) {
+				r.textContent += `Late thirties.`;
+			} else if (slave.actualAge >= 30) {
+				r.textContent += `Early thirties.`;
+			} else if (slave.actualAge >= 25) {
+				r.textContent += `Late twenties.`;
+			} else if (slave.actualAge >= 20) {
+				r.textContent += `Early twenties.`;
+			} else if (slave.actualAge >= 19) {
+				r.textContent += `Nineteen.`;
+			} else if (slave.actualAge >= 18) {
+				r.textContent += `Eighteen.`;
+			} else {
+				r.textContent += `Underage.`;
+			}
+			/*
+			 ** No NCS, then do the standard, However because of the wrinkles of Incubators, as long as visual age is greater
+			 ** than or equal to physical age, we do the old physical body/Looks for fresh out of the can NCS slaves.
+			 */
+			if (((slave.geneMods.NCS === 0) || (slave.visualAge >= slave.physicalAge))) {
+				if (slave.actualAge !== slave.physicalAge) {
+					r.textContent += ` ${slave.physicalAge}` + ` year old body.`;
+				}
+				if (slave.visualAge !== slave.physicalAge) {
+					r.textContent += ` Looks ` + `${slave.visualAge}` + `.`;
+				}
+			} else {
+				/*
+				 ** Now the rub. The use of physical Age for the year old body above, basically conflicts with the changes
+				 ** that NCS introduces, so here to *distinguish* the changes, we use visual age with the 'year old body'
+				 ** and appears, for example: Slave release from incubator at age 10, Her summary would show, 'Age 0. 10
+				 ** year old body.' But if she's given NCS a few weeks after release, while she's still before her first
+				 ** birthday, it'll appear the same. But once her birthday fires, if we ran with the above code it would
+				 ** say: 'Age 1. 11 year old body.' -- this conflicts with the way NCS works though, because she hasn't
+				 ** visually aged, so our change here makes it say 'Age 1. Appears to have a 10 year old body.'
+				 */
+				r.textContent += ` Appears to have a ` + `${slave.visualAge}` + ` year old body.`;
+			}
+			if (slave.geneMods.NCS === 1) {
+				makeSpan(r, "NCS", "orange");
+			}
+		}
+
+		/**
+		 * @param {App.Entity.SlaveState} slave
+		 * @param {Node} c
+		 * @returns {void}
+		 */
+		function long_face(slave, c) {
+			if (slave.face < -95) {
+				makeSpan(c, `Very ugly ${slave.faceShape} face`, "red", true, slave.face);
+			} else if (slave.face < -40) {
+				makeSpan(c, `Ugly ${slave.faceShape} face`, "red", true, slave.face);
+			} else if (slave.face < -10) {
+				makeSpan(c, `Unattractive ${slave.faceShape} face`, "red", true, slave.face);
+			} else if (slave.face <= 10) {
+				makeSpan(c, `Average ${slave.faceShape} face`, null, true, slave.face);
+			} else if (slave.face <= 40) {
+				makeSpan(c, `Attractive ${slave.faceShape} face`, "pink", true, slave.face);
+			} else if (slave.face <= 95) {
+				makeSpan(c, `Beautiful ${slave.faceShape} face`, "pink", true, slave.face);
+			} else {
+				makeSpan(c, `Very beautiful ${slave.faceShape} face`, "pink", true, slave.face);
+			}
+		}
+
+		/**
+		 * @param {App.Entity.SlaveState} slave
+		 * @param {Node} c
+		 * @returns {void}
+		 */
+		function long_eyes(slave, c) {
+			if (!canSee(slave)) {
+				makeSpan(c, "Blind.", "red");
+			} else if (!canSeePerfectly(slave)) {
+				makeSpan(c, "Nearsighted.", "yellow");
+			}
+		}
+
+		/**
+		 * @param {App.Entity.SlaveState} slave
+		 * @param {Node} c
+		 * @returns {void}
+		 */
+		function long_ears(slave, c) {
+			if (slave.hears <= -2) {
+				makeSpan(c, "Deaf.", "red");
+			} else if ((slave.hears === -1) && (slave.earwear !== "hearing aids")) {
+				makeSpan(c, "Hard of hearing.", "yellow");
+			}
+		}
+
+		/**
+		 * @param {App.Entity.SlaveState} slave
+		 * @param {Node} c
+		 * @returns {void}
+		 */
+		function long_lips(slave, c) {
+			if (slave.lips > 95) {
+				makeSpan(c, "Facepussy", undefined, true, slave.lips);
+			} else if (slave.lips > 70) {
+				makeSpan(c, "Huge lips", undefined, true, slave.lips);
+			} else if (slave.lips > 40) {
+				makeSpan(c, "Big lips", undefined, true, slave.lips);
+			} else if (slave.lips > 20) {
+				makeSpan(c, "Pretty lips", undefined, true, slave.lips);
+			} else if (slave.lips > 10) {
+				makeSpan(c, "Normal lips", undefined, true, slave.lips);
+			} else {
+				makeSpan(c, "Thin lips", "red", true, slave.lips);
+			}
+		}
+
+		/**
+		 * @param {App.Entity.SlaveState} slave
+		 * @param {Node} c
+		 * @returns {void}
+		 */
+		function long_teeth(slave, c) {
+			if (slave.teeth === "crooked") {
+				makeSpan(c, "Crooked teeth.", "yellow");
+			} else if (slave.teeth === "gapped") {
+				makeSpan(c, "Tooth gap.", "yellow");
+			} else if (slave.teeth === "cosmetic braces") {
+				makeSpan(c, "Cosmetic braces.");
+			} else if (slave.teeth === "straightening braces") {
+				makeSpan(c, "Braces.");
+			} else if (slave.teeth === "removable") {
+				makeSpan(c, "Removable teeth.");
+			} else if (slave.teeth === "pointy") {
+				makeSpan(c, "Sharp fangs.");
+			} else if (slave.teeth === "baby") {
+				makeSpan(c, "Baby teeth.");
+			} else if (slave.teeth === "mixed") {
+				makeSpan(c, "Mixed teeth.");
+			}
+		}
+
+		/**
+		 * @param {App.Entity.SlaveState} slave
+		 * @param {Node} c
+		 * @returns {void}
+		 */
+		function long_muscles(slave, c) {
+			if (slave.muscles > 95) {
+				makeSpan(c, "Hugely muscular", undefined, true, slave.muscles);
+			} else if (slave.muscles > 50) {
+				makeSpan(c, "Muscular", undefined, true, slave.muscles);
+			} else if (slave.muscles > 30) {
+				makeSpan(c, "Fit", undefined, true, slave.muscles);
+			} else if (slave.muscles > 5) {
+				makeSpan(c, "Toned", undefined, true, slave.muscles);
+			} else if (slave.muscles > -6) {
+				makeSpan(c, "Soft", undefined, true, slave.muscles);
+			} else if (slave.muscles > -31) {
+				if (V.arcologies[0].FSPhysicalIdealist === "unset") {
+					makeSpan(c, "Weak", "red", true, slave.muscles);
+				} else {
+					makeSpan(c, "Weak", undefined, true, slave.muscles);
+				}
+			} else if (slave.muscles > -96) {
+				if (V.arcologies[0].FSPhysicalIdealist === "unset") {
+					makeSpan(c, "Very weak", "red", true, slave.muscles);
+				} else {
+					makeSpan(c, "Very weak", undefined, true, slave.muscles);
+				}
+			} else {
+				makeSpan(c, "Frail", "red", true, slave.muscles);
+			}
+		}
+
+		/**
+		 * @param {App.Entity.SlaveState} slave
+		 * @param {Node} c
+		 * @returns {void}
+		 */
+		function long_voice(slave, c) {
+			if (slave.voice === 0) {
+				makeSpan(c, "Mute.", "red");
+			} else {
+				if (slave.accent === 3) {
+					makeSpan(c, "Bad accent.", "red");
+				} else if (slave.accent === 4) {
+					makeSpan(c, "No language skills.", "red");
+				} else if (slave.accent === 2) {
+					makeSpan(c, "Accent.");
+				} else if (slave.accent === 1) {
+					makeSpan(c, "Cute accent.", "pink");
+				}
+			}
+		}
+
+		/**
+		 * @param {App.Entity.SlaveState} slave
+		 * @param {Node} c
+		 * @returns {void}
+		 */
+		function long_tits_ass(slave, c) {
+			const styles = "pink";
+			if ((slave.boobs >= 12000) && (slave.butt > 9)) {
+				makeSpan(c, "Hyper T&A.", styles);
+			} else if ((slave.boobs > 4000) && (slave.butt > 8)) {
+				makeSpan(c, "Enormous T&A.", styles);
+			} else if ((slave.boobs > 2000) && (slave.butt > 6)) {
+				makeSpan(c, "Huge T&A.", styles);
+			} else if ((slave.boobs > 800) && (slave.butt > 4)) {
+				makeSpan(c, "Big T&A.", styles);
+			} else if ((slave.boobs < 500) && (slave.butt < 3) && (slave.weight <= 10) && (slave.muscles <= 30)) {
+				makeSpan(c, "Girlish figure.", styles);
+			} else if (slave.boobs >= 12000) {
+				makeSpan(c, "Immobilizing tits.", styles);
+			} else if (slave.boobs > 4000) {
+				makeSpan(c, "Monstrous tits.", styles);
+			} else if (slave.boobs > 2000) {
+				makeSpan(c, "Huge tits.", styles);
+			} else if (slave.boobs > 800) {
+				makeSpan(c, "Big tits.", styles);
+			} else if (slave.butt > 9) {
+				makeSpan(c, "Hyper ass.", styles);
+			} else if (slave.butt > 8) {
+				makeSpan(c, "Titanic ass.", styles);
+			} else if (slave.butt > 6) {
+				makeSpan(c, "Huge ass.", styles);
+			} else if (slave.butt > 4) {
+				makeSpan(c, "Big ass.", styles);
+			}
+		}
+
+		/**
+		 * @param {App.Entity.SlaveState} slave
+		 * @param {Node} c
+		 * @returns {void}
+		 */
+		function long_hips(slave, c) {
+			const styles = "red";
+			if (slave.hips < -1) {
+				if (slave.butt > 2 && (V.arcologies[0].FSTransformationFetishist < 20 || V.arcologies[0].FSTransformationFetishist === "unset") && (V.arcologies[0].FSHedonisticDecadence < 20 || V.arcologies[0].FSHedonisticDecadence === "unset") && (V.arcologies[0].FSAssetExpansionist < 20 || V.arcologies[0].FSAssetExpansionist === "unset") && (V.arcologies[0].FSIntellectualDependencyLawBeauty === 0)) {
+					makeSpan(c, "Disproportionately big butt.", styles);
+				}
+			} else if (slave.hips < 0) {
+				if (slave.butt > 4 && (V.arcologies[0].FSTransformationFetishist < 20 || V.arcologies[0].FSTransformationFetishist === "unset") && (V.arcologies[0].FSHedonisticDecadence < 20 || V.arcologies[0].FSHedonisticDecadence === "unset") && (V.arcologies[0].FSAssetExpansionist < 20 || V.arcologies[0].FSAssetExpansionist === "unset") && (V.arcologies[0].FSIntellectualDependencyLawBeauty === 0)) {
+					makeSpan(c, "Disproportionately big butt.", styles);
+				}
+			} else if (slave.hips > 2) {
+				if (slave.butt <= 8) {
+					makeSpan(c, "Disproportionately small butt.", styles);
+				}
+			} else if (slave.hips > 1) {
+				if (slave.butt <= 3 && ((V.arcologies[0].FSSlimnessEnthusiast === "unset") || (slave.boobs >= 500))) {
+					makeSpan(c, "Disproportionately small butt.", styles);
+				}
+			} else if (slave.hips > 0) {
+				if (slave.butt > 8) {
+					if ((V.arcologies[0].FSTransformationFetishist < 20 || V.arcologies[0].FSTransformationFetishist === "unset") && (V.arcologies[0].FSHedonisticDecadence < 20 || V.arcologies[0].FSHedonisticDecadence === "unset") && (V.arcologies[0].FSAssetExpansionist < 20 || V.arcologies[0].FSAssetExpansionist === "unset") && (V.arcologies[0].FSIntellectualDependencyLawBeauty === 0)) {
+						makeSpan(c, "Disproportionately big butt.", styles);
+					}
+				} else if (slave.butt <= 2 && ((V.arcologies[0].FSSlimnessEnthusiast === "unset") || (slave.boobs >= 500))) {
+					makeSpan(c, "Disproportionately small butt.", styles);
+				}
+			} else {
+				if (slave.butt > 6) {
+					if ((V.arcologies[0].FSTransformationFetishist < 20 || V.arcologies[0].FSTransformationFetishist === "unset") && (V.arcologies[0].FSHedonisticDecadence < 20 || V.arcologies[0].FSHedonisticDecadence === "unset") && (V.arcologies[0].FSAssetExpansionist < 20 || V.arcologies[0].FSAssetExpansionist === "unset") && (V.arcologies[0].FSIntellectualDependencyLawBeauty === 0)) {
+						makeSpan(c, "Disproportionately big butt.", styles);
+					}
+				} else if (slave.butt <= 1 && ((V.arcologies[0].FSSlimnessEnthusiast === "unset") || (slave.boobs >= 500))) {
+					makeSpan(c, "Disproportionately small butt.", styles);
+				}
+			}
+		}
+
+		/**
+		 * @param {App.Entity.SlaveState} slave
+		 * @param {Node} c
+		 * @returns {void}
+		 */
+		function long_waist(slave, c) {
+			if (slave.waist > 95) {
+				makeSpan(c, "Masculine waist", "red", true, slave.waist);
+			} else if (slave.waist > 40) {
+				makeSpan(c, "Ugly waist", "red", true, slave.waist);
+			} else if (slave.waist > 10) {
+				makeSpan(c, "Unattractive waist", "red", true, slave.waist);
+			} else if (slave.waist >= -10) {
+				makeSpan(c, "Average waist", null, true, slave.waist);
+			} else if (slave.waist >= -40) {
+				makeSpan(c, "Feminine waist", "pink", true, slave.waist);
+			} else if (slave.waist >= -95) {
+				makeSpan(c, "Hourglass waist", "pink", true, slave.waist);
+			} else {
+				makeSpan(c, "Absurdly narrow waist", "pink", true, slave.waist);
+			}
+		}
+
+		/**
+		 * @param {App.Entity.SlaveState} slave
+		 * @param {Node} c
+		 * @returns {void}
+		 */
+		function long_implants(slave, c) {
+			const styles = "pink";
+			if ((slave.boobsImplant !== 0) || (slave.buttImplant !== 0) || (slave.lipsImplant !== 0) || (slave.bellyImplant !== -1)) {
+				makeSpan(c, "Implants.", styles);
+			} else if ((slave.faceImplant >= 30) || (slave.waist < -95)) {
+				makeSpan(c, "Surgery enhanced.", styles);
+			} else {
+				makeSpan(c, "All natural.", styles);
+			}
+		}
+
+		/**
+		 * @param {App.Entity.SlaveState} slave
+		 * @param {Node} c
+		 * @returns {void}
+		 */
+		function long_lactation(slave, c) {
+			if (slave.lactation === 1) {
+				makeSpan(c, "Lactating naturally.", "pink");
+			} else if (slave.lactation === 2) {
+				makeSpan(c, "Heavy lactation.", "pink");
+			}
+		}
+
+		/**
+		 * @param {App.Entity.SlaveState} slave
+		 * @param {Node} c
+		 * @returns {void}
+		 */
+		function long_mods(slave, c) {
+			V.modScore = SlaveStatsChecker.modScore(slave);
+			if (slave.corsetPiercing === 0 && V.piercingScore < 3 && V.tatScore < 2) {
+				return;
+			} else if (V.modScore > 15 || (V.piercingScore > 8 && V.tatScore > 5)) {
+				makeSpan(c, "Extensive body mods.");
+			} else if (V.modScore > 7) {
+				makeSpan(c, "Noticeable body mods.");
+			} else {
+				makeSpan(c, "Light body mods.");
+			}
+		}
+
+		/**
+		 * @param {App.Entity.SlaveState} slave
+		 * @param {Node} c
+		 * @returns {void}
+		 */
+		function short_age(slave, c) {
+			let r = makeSpan(c, "", "pink");
+			if (V.showAgeDetail === 1) {
+				r.textContent += slave.actualAge.toString();
+			} else if (slave.actualAge >= 40) {
+				r.textContent += "40s";
+			} else if (slave.actualAge >= 35) {
+				r.textContent += "Lt30s";
+			} else if (slave.actualAge >= 30) {
+				r.textContent += "Ea30s";
+			} else if (slave.actualAge >= 25) {
+				r.textContent += "Lt20s";
+			} else if (slave.actualAge >= 20) {
+				r.textContent += "Ea20s";
+			} else if (slave.actualAge >= 18) {
+				r.textContent += slave.actualAge.toString();
+			}
+			if (slave.actualAge !== slave.physicalAge) {
+				r.textContent += ` w ${slave.physicalAge}y-bdy`;
+			}
+			if (slave.visualAge !== slave.physicalAge) {
+				r.textContent += ` Lks${slave.visualAge}`;
+			}
+		}
+
+		/**
+		 * @param {App.Entity.SlaveState} slave
+		 * @param {Node} c
+		 * @returns {void}
+		 */
+		function short_face(slave, c) {
+			if (slave.face < -95) {
+				makeSpan(c, "Face---", "red", true, slave.face);
+			} else if (slave.face < -40) {
+				makeSpan(c, "Face--", "red", true, slave.face);
+			} else if (slave.face < -10) {
+				makeSpan(c, "Face-", "red", true, slave.face);
+			} else if (slave.face <= 10) {
+				makeSpan(c, "Face", null, true, slave.face);
+			} else if (slave.face <= 40) {
+				makeSpan(c, "Face+", "pink", true, slave.face);
+			} else if (slave.face <= 95) {
+				makeSpan(c, "Face++", "pink", true, slave.face);
+			} else {
+				makeSpan(c, "Face+++", "pink", true, slave.face);
+			}
+		}
+
+		/**
+		 * @param {App.Entity.SlaveState} slave
+		 * @param {Node} c
+		 * @returns {void}
+		 */
+		function short_eyes(slave, c) {
+			if (!canSee(slave)) {
+				makeSpan(c, "Blind", "red");
+			} else if (!canSeePerfectly(slave)) {
+				makeSpan(c, "Sight-", "yellow");
+			}
+		}
+
+		/**
+		 * @param {App.Entity.SlaveState} slave
+		 * @param {Node} c
+		 * @returns {void}
+		 */
+		function short_ears(slave, c) {
+			if (slave.hears === -2) {
+				makeSpan(c, "Deaf", "red");
+			} else if ((slave.hears === -1) && (slave.earwear !== "hearing aids")) {
+				makeSpan(c, "Hearing-", "yellow");
+			}
+		}
+
+		/**
+		 * @param {App.Entity.SlaveState} slave
+		 * @param {Node} c
+		 * @returns {void}
+		 */
+		function short_lips(slave, c) {
+			if (slave.lips > 95) {
+				makeSpan(c, "Facepussy");
+			} else if (slave.lips > 70) {
+				makeSpan(c, "Lips+++", null, true, slave.lips);
+			} else if (slave.lips > 40) {
+				makeSpan(c, "Lips++", null, true, slave.lips);
+			} else if (slave.lips > 20) {
+				makeSpan(c, "Lips+", null, true, slave.lips);
+			} else if (slave.lips > 10) {
+				makeSpan(c, "Lips", null, true, slave.lips);
+			} else {
+				makeSpan(c, "Lips-", "red", true, slave.lips);
+			}
+		}
+
+		/**
+		 * @param {App.Entity.SlaveState} slave
+		 * @param {Node} c
+		 * @returns {void}
+		 */
+		function short_teeth(slave, c) {
+			if (slave.teeth === "crooked") {
+				makeSpan(c, "Cr Teeth", "yellow");
+			} else if (slave.teeth === "gapped") {
+				makeSpan(c, "Gap", "yellow");
+			} else if (slave.teeth === "cosmetic braces") {
+				makeSpan(c, `Cos Braces`);
+			} else if (slave.teeth === "straightening braces") {
+				makeSpan(c, `Braces`);
+			} else if (slave.teeth === "removable") {
+				makeSpan(c, `Rem Teeth`);
+			} else if (slave.teeth === "pointy") {
+				makeSpan(c, `Fangs`);
+			} else if (slave.teeth === "baby") {
+				makeSpan(c, `Baby`);
+			} else if (slave.teeth === "mixed") {
+				makeSpan(c, `Mixed`);
+			}
+		}
+
+		/**
+		 * @param {App.Entity.SlaveState} slave
+		 * @param {Node} c
+		 * @returns {void}
+		 */
+		function short_muscles(slave, c) {
+			if (slave.muscles > 95) {
+				makeSpan(c, "Musc++", undefined, true, slave.muscles);
+			} else if (slave.muscles > 50) {
+				makeSpan(c, "Musc+", undefined, true, slave.muscles);
+			} else if (slave.muscles > 30) {
+				makeSpan(c, "Fit", undefined, true, slave.muscles);
+			} else if (slave.muscles > 5) {
+				makeSpan(c, "Toned", undefined, true, slave.muscles);
+			} else if (slave.muscles > -6) {
+				makeSpan(c, "Soft", undefined, true, slave.muscles);
+			} else if (slave.muscles > -31) {
+				if (V.arcologies[0].FSPhysicalIdealist === "unset") {
+					makeSpan(c, "Weak", "red", true, slave.muscles);
+				} else {
+					makeSpan(c, "Soft", undefined, true, slave.muscles);
+				}
+			} else if (slave.muscles > -96) {
+				if (V.arcologies[0].FSPhysicalIdealist === "unset") {
+					makeSpan(c, "Weak+", "red", true, slave.muscles);
+				} else {
+					makeSpan(c, "Soft+", undefined, true, slave.muscles);
+				}
+			} else {
+				makeSpan(c, "Weak++", "red", true, slave.muscles);
+			}
+		}
+
+		/**
+		 * @param {App.Entity.SlaveState} slave
+		 * @param {Node} c
+		 * @returns {void}
+		 */
+		function short_voice(slave, c) {
+			if (slave.voice === 0) {
+				makeSpan(c, "Mute", "red");
+			} else {
+				if (slave.accent === 3) {
+					makeSpan(c, "Acc--", "red");
+				} else if (slave.accent === 2) {
+					makeSpan(c, "Acc-");
+				} else if (slave.accent === 4) {
+					makeSpan(c, "Acc--");
+				} else if (slave.accent === 1) {
+					makeSpan(c, "Acc", "pink");
+				}
+			}
+		}
+
+		/**
+		 * @param {App.Entity.SlaveState} slave
+		 * @param {Node} c
+		 * @returns {void}
+		 */
+		function short_tits_ass(slave, c) {
+			let styles = "pink";
+			if ((slave.boobs >= 12000) && (slave.butt > 9)) {
+				makeSpan(c, "T&A+++", styles);
+			} else if ((slave.boobs > 4000) && (slave.butt > 8)) {
+				makeSpan(c, "T&A++", styles);
+			} else if ((slave.boobs > 2000) && (slave.butt > 6)) {
+				makeSpan(c, "T&A+", styles);
+			} else if ((slave.boobs > 800) && (slave.butt > 4)) {
+				makeSpan(c, "T&A", styles);
+			} else if ((slave.boobs < 500) && (slave.butt < 3) && (slave.weight <= 10) && (slave.muscles <= 30)) {
+				makeSpan(c, "Girlish", styles);
+			} else if (slave.boobs >= 12000) {
+				makeSpan(c, "Boobs+++", styles);
+			} else if (slave.boobs > 4000) {
+				makeSpan(c, "Boobs++", styles);
+			} else if (slave.boobs > 2000) {
+				makeSpan(c, "Boobs+", styles);
+			} else if (slave.boobs > 800) {
+				makeSpan(c, "Boobs", styles);
+			} else if (slave.butt > 9) {
+				makeSpan(c, "Ass+++", styles);
+			} else if (slave.butt > 8) {
+				makeSpan(c, "Ass++", styles);
+			} else if (slave.butt > 6) {
+				makeSpan(c, "Ass+", styles);
+			} else if (slave.butt > 4) {
+				makeSpan(c, "Ass", styles);
+			}
+		}
+
+		/**
+		 * @param {App.Entity.SlaveState} slave
+		 * @param {Node} c
+		 * @returns {void}
+		 */
+		function short_hips(slave, c) {
+			let desc = "";
+			if (slave.hips < -1) {
+				if (slave.butt > 2 && (V.arcologies[0].FSTransformationFetishist < 20 || V.arcologies[0].FSTransformationFetishist === "unset") && (V.arcologies[0].FSHedonisticDecadence < 20 || V.arcologies[0].FSHedonisticDecadence === "unset")) {
+					desc = `Disp+`;
+				}
+			} else if (slave.hips < 0) {
+				if (slave.butt > 4 && (V.arcologies[0].FSTransformationFetishist < 20 || V.arcologies[0].FSTransformationFetishist === "unset") && (V.arcologies[0].FSHedonisticDecadence < 20 || V.arcologies[0].FSHedonisticDecadence === "unset")) {
+					desc = `Disp+`;
+				}
+			} else if (slave.hips > 2) {
+				if (slave.butt <= 8) {
+					desc = `Disp-`;
+				}
+			} else if (slave.hips > 1) {
+				if (slave.butt <= 3 && (V.arcologies[0].FSSlimnessEnthusiast === "unset" || (slave.boobs >= 500))) {
+					desc = `Disp-`;
+				}
+			} else if (slave.hips > 0) {
+				if (slave.butt > 8) {
+					if ((V.arcologies[0].FSTransformationFetishist < 20 || V.arcologies[0].FSTransformationFetishist === "unset") && (V.arcologies[0].FSHedonisticDecadence < 20 || V.arcologies[0].FSHedonisticDecadence === "unset")) {
+						desc = `Disp+`;
+					}
+				} else if (slave.butt <= 2 && (V.arcologies[0].FSSlimnessEnthusiast === "unset" || (slave.boobs >= 500))) {
+					desc = `Disp-`;
+				}
+			} else {
+				if (slave.butt > 6) {
+					if ((V.arcologies[0].FSTransformationFetishist < 20 || V.arcologies[0].FSTransformationFetishist === "unset") && (V.arcologies[0].FSHedonisticDecadence < 20 || V.arcologies[0].FSHedonisticDecadence === "unset")) {
+						desc = `Disp+`;
+					}
+				} else if (slave.butt <= 1 && (V.arcologies[0].FSSlimnessEnthusiast === "unset" || (slave.boobs >= 500))) {
+					desc = `Disp-`;
+				}
+			}
+			if (desc) {
+				makeSpan(c, desc, "red");
+			}
+		}
+
+		/**
+		 * @param {App.Entity.SlaveState} slave
+		 * @param {Node} c
+		 * @returns {void}
+		 */
+		function short_waist(slave, c) {
+			if (slave.waist > 95) {
+				makeSpan(c, "Wst---", "red", false, slave.waist);
+			} else if (slave.waist > 40) {
+				makeSpan(c, "Wst--", "red", false, slave.waist);
+			} else if (slave.waist > 10) {
+				makeSpan(c, "Wst-", "red", false, slave.waist);
+			} else if (slave.waist >= -10) {
+				makeSpan(c, "Wst", undefined, false, slave.waist);
+			} else if (slave.waist >= -40) {
+				makeSpan(c, "Wst+", "pink", false, slave.waist);
+			} else if (slave.waist >= -95) {
+				makeSpan(c, "Wst++", "pink", false, slave.waist);
+			} else {
+				makeSpan(c, "Wst+++", "pink", false, slave.waist);
+			}
+		}
+
+		/**
+		 * @param {App.Entity.SlaveState} slave
+		 * @param {Node} c
+		 * @returns {void}
+		 */
+		function short_implants(slave, c) {
+			if ((slave.boobsImplant === 0) && (slave.buttImplant === 0) && (slave.waist >= -95) && (slave.lipsImplant === 0) && (slave.faceImplant <= 5) && (slave.bellyImplant === -1)) {
+				makeSpan(c, "Natr", "pink");
+			} else {
+				makeSpan(c, "Impl", "pink");
+			}
+		}
+
+		/**
+		 * @param {App.Entity.SlaveState} slave
+		 * @param {Node} c
+		 * @returns {void}
+		 */
+		function short_lactation(slave, c) {
+			if (slave.lactation === 1) {
+				makeSpan(c, "Lact", "pink");
+			} else if (slave.lactation === 2) {
+				makeSpan(c, "Lact", "pink");
+			}
+		}
+
+		/**
+		 * @param {App.Entity.SlaveState} slave
+		 * @param {Node} c
+		 * @returns {void}
+		 */
+		function short_mods(slave, c) {
+			V.modScore = SlaveStatsChecker.modScore(slave);
+			if (slave.corsetPiercing === 0 && V.piercingScore < 3 && V.tatScore < 2) {
+				return;
+			} else if (V.modScore > 15 || (V.piercingScore > 8 && V.tatScore > 5)) {
+				makeSpan(c, "Mods++");
+			} else if (V.modScore > 7) {
+				makeSpan(c, "Mods+");
+			} else {
+				makeSpan(c, "Mods");
+			}
+			if (!jQuery.isEmptyObject(slave.brand)) {
+				makeSpan(c, "Br");
+			}
+		}
+
+
+		/**
+		 * @param {App.Entity.SlaveState} slave
+		 * @param {Node} c
+		 * @returns {void}
+		 */
+		function short_intelligence(slave, c) {
+			const intelligence = slave.intelligence + slave.intelligenceImplant;
+			if (slave.fetish === "mindbroken") {
+				return;
+			}
+			let education = "";
+			let naturalIntelligence = "";
+			let styles = undefined;
+			if (slave.intelligenceImplant >= 30) {
+				education = "(e+)";
+			} else if (slave.intelligenceImplant >= 15) {
+				education = "(e)";
+			} else if (slave.intelligenceImplant <= -15) {
+				education = "(e-)";
+			}
+			if (intelligence >= 130) {
+				naturalIntelligence = "I++++";
+				styles = "deepskyblue";
+			} else if (intelligence > 95) {
+				naturalIntelligence = "I+++";
+				styles = "deepskyblue";
+			} else if (intelligence > 50) {
+				naturalIntelligence = "I++";
+				styles = "deepskyblue";
+			} else if (intelligence > 15) {
+				naturalIntelligence = "I+";
+				styles = "deepskyblue";
+			} else if (intelligence >= -15) {
+				naturalIntelligence = "I";
+			} else if (intelligence >= -50) {
+				naturalIntelligence = "I-";
+				styles = "orangered";
+			} else if (intelligence >= -95) {
+				naturalIntelligence = "I--";
+				styles = "orangered";
+			} else {
+				naturalIntelligence = "I---";
+				styles = "orangered";
+			}
+			makeSpan(c, `${naturalIntelligence}${education}`, styles, true, intelligence);
+		}
+
+		/**
+		 * @param {App.Entity.SlaveState} slave
+		 * @param {Node} c
+		 * @returns {void}
+		 */
+		function short_skills(slave, c) {
+			let _SSkills = slave.skill.anal + slave.skill.oral;
+			let r = makeSpan(c, "", "aquamarine");
+			if (((_SSkills + slave.skill.whoring + slave.skill.entertainment) >= 400) && ((slave.vagina < 0) || (slave.skill.vaginal >= 100))) {
+				r.textContent += `MSS`;
+			} else {
+				_SSkills += slave.skill.vaginal;
+				_SSkills = Math.trunc(_SSkills);
+				if (_SSkills > 180) {
+					r.textContent += `S++`;
+				} else if ((_SSkills > 120) && (slave.vagina < 0)) {
+					r.textContent += `Sh++`;
+				} else if (_SSkills > 90) {
+					r.textContent += `S+`;
+				} else if (_SSkills > 30) {
+					r.textContent += `S`;
+				} else {
+					r.textContent += `S-`;
+				}
+				if (V.summaryStats) {
+					r.textContent += `[${_SSkills}]`;
+				}
+				r.textContent += " ";
+				if (slave.skill.whoring >= 100) {
+					r.textContent += `W+++`;
+				} else if (slave.skill.whoring > 60) {
+					r.textContent += `W++`;
+				} else if (slave.skill.whoring > 30) {
+					r.textContent += `W+`;
+				} else if (slave.skill.whoring > 10) {
+					r.textContent += `W`;
+				}
+				if (slave.skill.whoring > 10) {
+					if (V.summaryStats) {
+						r.textContent += `[${slave.skill.whoring}]`;
+					}
+				}
+				r.textContent += " ";
+				if (slave.skill.entertainment >= 100) {
+					r.textContent += `E+++`;
+				} else if (slave.skill.entertainment > 60) {
+					r.textContent += `E++`;
+				} else if (slave.skill.entertainment > 30) {
+					r.textContent += `E+`;
+				} else if (slave.skill.entertainment > 10) {
+					r.textContent += `E`;
+				}
+				if (slave.skill.entertainment > 10) {
+					if (V.summaryStats) {
+						r.textContent += `[${slave.skill.entertainment}]`;
+					}
+				}
+			}
+			if (slave.skill.combat > 0) {
+				r.textContent += " C";
+			}
+		}
+
+		/**
+		 * @param {App.Entity.SlaveState} slave
+		 * @param {Node} c
+		 * @returns {void}
+		 */
+		function short_prestige(slave, c) {
+			if (slave.prestige > 0) {
+				const styles = "green";
+				if (slave.prestige > 2) {
+					makeSpan(c, "Prest++", styles);
+				} else if (slave.prestige === 2) {
+					makeSpan(c, "Prest+", styles);
+				} else if (slave.prestige === 1) {
+					makeSpan(c, "Prest", styles);
+				}
+			}
+		}
+
+		/**
+		 * @param {App.Entity.SlaveState} slave
+		 * @param {Node} c
+		 * @returns {void}
+		 */
+		function short_porn_prestige(slave, c) {
+			if (slave.porn.prestige > 0) {
+				const styles = "green";
+				if (slave.porn.prestige > 2) {
+					makeSpan(c, "PPrest++", styles);
+				} else if (slave.porn.prestige === 2) {
+					makeSpan(c, "PPrest+", styles);
+				} else if (slave.porn.prestige === 1) {
+					makeSpan(c, "PPrest", styles);
+				}
+			}
+		}
+
+		/**
+		 * @param {App.Entity.SlaveState} slave
+		 * @param {Node} c
+		 * @returns {void}
+		 */
+		function long_intelligence(slave, c) {
+			const intelligence = slave.intelligence + slave.intelligenceImplant;
+			if (slave.fetish === "mindbroken") {
+				return;
+			}
+			let education = "";
+			let naturalIntelligence = "";
+			let styles = undefined;
+			if (slave.intelligenceImplant >= 30) {
+				education = ", well educated";
+			} else if (slave.intelligenceImplant >= 15) {
+				education = ", educated";
+			} else if (slave.intelligenceImplant <= -15) {
+				education = ", hindered";
+			}
+			if (intelligence >= 130) {
+				naturalIntelligence = "Genius";
+				styles = "deepskyblue";
+			} else if (intelligence > 95) {
+				naturalIntelligence = "Brilliant";
+				styles = "deepskyblue";
+			} else if (intelligence > 50) {
+				naturalIntelligence = "Very smart";
+				styles = "deepskyblue";
+			} else if (intelligence > 15) {
+				naturalIntelligence = "Smart";
+				styles = "deepskyblue";
+			} else if (intelligence >= -15) {
+				naturalIntelligence = "Average intelligence";
+			} else if (intelligence >= -50) {
+				naturalIntelligence = "Slow";
+				styles = "orangered";
+			} else if (intelligence >= -95) {
+				naturalIntelligence = "Very slow";
+				styles = "orangered";
+			} else {
+				naturalIntelligence = "Moronic";
+				styles = "orangered";
+			}
+			makeSpan(c, `${naturalIntelligence}${education}`, styles, true, intelligence);
+		}
+
+		/**
+		 * @param {App.Entity.SlaveState} slave
+		 * @param {Node} c
+		 * @returns {void}
+		 */
+		function long_skills(slave, c) {
+			let _SSkills = (slave.skill.anal + slave.skill.oral);
+			if (((_SSkills + slave.skill.whoring + slave.skill.entertainment) >= 400) && ((slave.vagina < 0) || (slave.skill.vaginal >= 100))) {
+				makeSpan(c, "Masterful Sex Slave.", "aquamarine");
+			} else {
+				let desc;
+				_SSkills += slave.skill.vaginal;
+				if (_SSkills > 180) {
+					desc = "Sex master";
+				} else if ((_SSkills > 120) && (slave.vagina < 0)) {
+					desc = "Masterful shemale";
+				} else if (_SSkills > 90) {
+					desc = "Sexual expert";
+				} else if (_SSkills > 30) {
+					desc = "Sexually skilled";
+				} else {
+					desc = "Sexually unskilled";
+				}
+				if (desc) {
+					makeSpan(c, desc, "aquamarine", true, Math.trunc(_SSkills));
+					desc = "";
+				}
+				if (slave.skill.whoring >= 100) {
+					desc = "Masterful whore";
+				} else if (slave.skill.whoring >= 60) {
+					desc = "Expert whore";
+				} else if (slave.skill.whoring >= 30) {
+					desc = "Skilled whore";
+				} else if (slave.skill.whoring >= 10) {
+					desc = "Basic whore";
+				}
+				if (desc) {
+					makeSpan(c, desc, "aquamarine", true, slave.skill.whoring);
+					desc = "";
+				}
+				if (slave.skill.entertainment >= 100) {
+					desc = "Masterful entertainer";
+				} else if (slave.skill.entertainment >= 60) {
+					desc = "Expert entertainer";
+				} else if (slave.skill.entertainment >= 30) {
+					desc = "Skilled entertainer";
+				} else if (slave.skill.entertainment >= 10) {
+					desc = "Basic entertainer";
+				}
+				if (desc) {
+					makeSpan(c, desc, "aquamarine", true, slave.skill.entertainment);
+					desc = "";
+				}
+			}
+			if (slave.skill.combat > 0) {
+				makeSpan(c, "Trained fighter.", "aquamarine");
+			}
+		}
+
+		/**
+		 * @param {App.Entity.SlaveState} slave
+		 * @param {Node} c
+		 * @returns {void}
+		 */
+		function long_prestige(slave, c) {
+			if (slave.prestige > 0) {
+				const styles = "green";
+				if (slave.prestige > 2) {
+					makeSpan(c, "Extremely prestigious.", styles);
+				} else if (slave.prestige === 2) {
+					makeSpan(c, "Very prestigious.", styles);
+				} else if (slave.prestige === 1) {
+					makeSpan(c, "Prestigious.", styles);
+				}
+			}
+		}
+
+		/**
+		 * @param {App.Entity.SlaveState} slave
+		 * @param {Node} c
+		 * @returns {void}
+		 */
+		function long_porn_prestige(slave, c) {
+			if (slave.porn.prestige > 0) {
+				const styles = "green";
+				if (slave.porn.prestige > 2) {
+					makeSpan(c, "Porn star.", styles);
+				} else if (slave.porn.prestige === 2) {
+					makeSpan(c, "Porn slut.", styles);
+				} else if (slave.porn.prestige === 1) {
+					makeSpan(c, "Porn amateur.", styles);
+				}
+			}
+		}
+
+		/**
+		 * @param {App.Entity.SlaveState} slave
+		 * @param {Node} c
+		 * @returns {void}
+		 */
+		function long_clothes(slave, c) {
+			makeSpan(c, helpers.getExactRating(App.Data.SlaveSummary.long.clothes, slave.clothes,  'Naked.'));
+		}
+
+		/**
+		 * @param {App.Entity.SlaveState} slave
+		 * @param {Node} c
+		 * @returns {void}
+		 */
+		function long_collar(slave, c) {
+			const s = App.Data.SlaveSummary.long.accessory.collar[slave.collar];
+			if (s) {
+				makeSpan(c, s);
+			}
+		}
+
+		/**
+		 * @param {App.Entity.SlaveState} slave
+		 * @param {Node} c
+		 * @returns {void}
+		 */
+		function long_belly(slave, c) {
+			const s = App.Data.SlaveSummary.long.accessory.belly[slave.bellyAccessory];
+			if (s) {
+				makeSpan(c, s);
+			}
+		}
+
+		/**
+		 * @param {App.Entity.SlaveState} slave
+		 * @param {Node} c
+		 * @returns {void}
+		 */
+		function long_arms(slave, c) {
+			if (["hand gloves", "elbow gloves"].includes(slave.armAccessory)) {
+				makeSpan(c, slave.armAccessory, undefined, true);
+			}
+		}
+
+		/**
+		 * @param {App.Entity.SlaveState} slave
+		 * @param {Node} c
+		 * @returns {void}
+		 */
+		function long_legs(slave, c) {
+			if (slave.legAccessory === "short stockings") {
+				makeSpan(c, "Short stockings.");
+			} else if (slave.legAccessory === "long stockings") {
+				makeSpan(c, "Long stockings.");
+			}
+		}
+
+		/**
+		 * @param {App.Entity.SlaveState} slave
+		 * @param {Node} c
+		 * @returns {void}
+		 */
+		function long_shoes(slave, c) {
+			if (["boots", "extreme heels", "extreme platform heels", "flats", "heels", "platform heels", "platform shoes", "pumps"].includes(slave.shoes)) {
+				makeSpan(c, slave.shoes, undefined, true);
+			} else if (slave.heels === 1) {
+				makeSpan(c, "Crawling.", "yellow");
+			}
+		}
+
+		/**
+		 * @param {App.Entity.SlaveState} slave
+		 * @param {Node} c
+		 * @returns {void}
+		 */
+		function long_chastity(slave, c) {
+			if (slave.chastityAnus === 1 && slave.chastityPenis === 1 && slave.chastityVagina === 1) {
+				makeSpan(c, "Full chastity.");
+			} else if (slave.chastityPenis === 1 && slave.chastityVagina === 1) {
+				makeSpan(c, "Genital chastity.");
+			} else if ((slave.chastityAnus === 1 && slave.chastityVagina === 1) || (slave.chastityAnus === 1 && slave.chastityPenis === 1)) {
+				makeSpan(c, "Combined chastity.");
+			} else if (slave.chastityVagina === 1) {
+				makeSpan(c, "Vaginal chastity.");
+			} else if (slave.chastityPenis === 1) {
+				makeSpan(c, "Chastity cage.");
+			} else if (slave.chastityAnus === 1) {
+				makeSpan(c, "Anal chastity.");
+			}
+		}
+
+		/**
+		 * @param {App.Entity.SlaveState} slave
+		 * @param {Node} c
+		 * @returns {void}
+		 */
+		function long_vaginal_acc(slave, c) {
+			if (slave.vaginalAttachment !== "vibrator") {
+				const s = App.Data.SlaveSummary.long.accessory.vaginal[slave.vaginalAccessory];
+				if (s) {
+					makeSpan(c, s);
+				}
+			}
+			if (slave.vaginalAttachment !== "none") {
+				switch (slave.vaginalAttachment) {
+					case "vibrator":
+						makeSpan(c, "Vibrating dildo.");
+						break;
+				}
+			}
+		}
+
+		/**
+		 * @param {App.Entity.SlaveState} slave
+		 * @param {Node} c
+		 * @returns {void}
+		 */
+		function long_dick_acc(slave, c) {
+			switch (slave.dickAccessory) {
+				case "sock":
+					makeSpan(c, "Cock sock.");
+					break;
+				case "bullet vibrator":
+					makeSpan(c, "Frenulum bullet vibrator.");
+					break;
+				case "smart bullet vibrator":
+					makeSpan(c, "Smart frenulum bullet vibrator.");
+					break;
+			}
+		}
+
+		/**
+		 * @param {App.Entity.SlaveState} slave
+		 * @param {Node} c
+		 * @returns {void}
+		 */
+		function long_buttplug(slave, c) {
+			switch (slave.buttplug) {
+				case "plug":
+					makeSpan(c, "Buttplug.");
+					break;
+				case "large plug":
+					makeSpan(c, "Large buttplug.");
+					break;
+				case "huge plug":
+					makeSpan(c, "Huge buttplug.");
+					break;
+				case "long plug":
+					makeSpan(c, "Long buttplug.");
+					break;
+				case "long, large plug":
+					makeSpan(c, "Large, long buttplug.");
+					break;
+				case "long, huge plug":
+					makeSpan(c, "Enormous buttplug.");
+					break;
+			}
+			switch (slave.buttplugAttachment) {
+				case "tail":
+					makeSpan(c, "Attached tail.");
+					break;
+				case "cat tail":
+					makeSpan(c, "Attached cat tail.");
+					break;
+				case "fox tail":
+					makeSpan(c, "Attached fox tail.");
+					break;
+				case "cow tail":
+					makeSpan(c, "Attached cow tail.");
+					break;
+			}
+		}
+
+		/**
+		 * @param {App.Entity.SlaveState} slave
+		 * @param {Node} c
+		 * @returns {void}
+		 */
+		function short_fetish(slave, c) {
+			let descStr = "";
+			switch (slave.fetish) {
+				case "submissive":
+					if (slave.fetishStrength > 95) {
+						descStr = `Sub++`;
+					} else if (slave.fetishStrength > 60) {
+						descStr = `Sub+`;
+					} else {
+						descStr = `Sub`;
+					}
+					break;
+				case "cumslut":
+					if (slave.fetishStrength > 95) {
+						descStr = `Oral++`;
+					} else if (slave.fetishStrength > 60) {
+						descStr = `Oral+`;
+					} else {
+						descStr = `Oral`;
+					}
+					break;
+				case "humiliation":
+					if (slave.fetishStrength > 95) {
+						descStr = `Humil++`;
+					} else if (slave.fetishStrength > 60) {
+						descStr = `Humil+`;
+					} else {
+						descStr = `Humil`;
+					}
+					break;
+				case "buttslut":
+					if (slave.fetishStrength > 95) {
+						descStr = `Anal++`;
+					} else if (slave.fetishStrength > 60) {
+						descStr = `Anal+`;
+					} else {
+						descStr = `Anal`;
+					}
+					break;
+				case "boobs":
+					if (slave.fetishStrength > 95) {
+						descStr = `Boobs++`;
+					} else if (slave.fetishStrength > 60) {
+						descStr = `Boobs+`;
+					} else {
+						descStr = `Boobs`;
+					}
+					break;
+				case "sadist":
+					if (slave.fetishStrength > 95) {
+						descStr = `Sadist++`;
+					} else if (slave.fetishStrength > 60) {
+						descStr = `Sadist+`;
+					} else {
+						descStr = `Sadist`;
+					}
+					break;
+				case "masochist":
+					if (slave.fetishStrength > 95) {
+						descStr = `Pain++`;
+					} else if (slave.fetishStrength > 60) {
+						descStr = `Pain+`;
+					} else {
+						descStr = `Pain`;
+					}
+					break;
+				case "dom":
+					if (slave.fetishStrength > 95) {
+						descStr = `Dom++`;
+					} else if (slave.fetishStrength > 60) {
+						descStr = `Dom+`;
+					} else {
+						descStr = `Dom`;
+					}
+					break;
+				case "pregnancy":
+					if (slave.fetishStrength > 95) {
+						descStr = `Preg++`;
+					} else if (slave.fetishStrength > 60) {
+						descStr = `Preg+`;
+					} else {
+						descStr = `Preg`;
+					}
+					break;
+				default:
+					descStr = `Vanilla`;
+					break;
+			}
+			if (V.summaryStats) {
+				descStr += `[${slave.fetishStrength}]`;
+			}
+			makeSpan(c, descStr, "lightcoral");
+		}
+
+		/**
+		 * @param {App.Entity.SlaveState} slave
+		 * @param {Node} c
+		 * @returns {void}
+		 */
+		function short_attraction(slave, c) {
+			if (slave.attrXY <= 5) {
+				makeSpan(c, "XY---", "red", false, slave.attrXY);
+			} else if (slave.attrXY <= 15) {
+				makeSpan(c, "XY--", "red", false, slave.attrXY);
+			} else if (slave.attrXY <= 35) {
+				makeSpan(c, "XY---", "red", false, slave.attrXY);
+			} else if (slave.attrXY <= 65) {
+				makeSpan(c, "XY", undefined, false, slave.attrXY);
+			} else if (slave.attrXY <= 85) {
+				makeSpan(c, "XY+", "green", false, slave.attrXY);
+			} else if (slave.attrXY <= 95) {
+				makeSpan(c, "XY++", "green", false, slave.attrXY);
+			} else if (slave.attrXX > 95) {
+				if (slave.energy <= 95) {
+					makeSpan(c, "Omni!", "green");
+				} else {
+					makeSpan(c, "Omni+Nympho!!", "green");
+				}
+			} else {
+				makeSpan(c, "XY+++", "green", false, slave.attrXY);
+			}
+			if (slave.attrXX <= 5) {
+				makeSpan(c, "XX---", "red", false, slave.attrXX);
+			} else if (slave.attrXX <= 15) {
+				makeSpan(c, "XX--", "red", false, slave.attrXX);
+			} else if (slave.attrXX <= 35) {
+				makeSpan(c, "XX-", "red", false, slave.attrXX);
+			} else if (slave.attrXX <= 65) {
+				makeSpan(c, "XX", undefined, false, slave.attrXX);
+			} else if (slave.attrXX <= 85) {
+				makeSpan(c, "XX+", "green", false, slave.attrXX);
+			} else if (slave.attrXX <= 95) {
+				makeSpan(c, "XX++", "green", false, slave.attrXX);
+			} else if (slave.attrXY <= 95) {
+				makeSpan(c, "XX+++", "green", false, slave.attrXX);
+			}
+			if (slave.energy > 95) {
+				if ((slave.attrXY <= 95) || (slave.attrXX <= 95)) {
+					makeSpan(c, "Nympho!", "green");
+				}
+			} else if (slave.energy > 80) {
+				makeSpan(c, "SD++", "green", false, slave.energy);
+			} else if (slave.energy > 60) {
+				makeSpan(c, "SD+", "green", false, slave.energy);
+			} else if (slave.energy > 40) {
+				makeSpan(c, "SD", "green", false, slave.energy);
+			} else if (slave.energy > 20) {
+				makeSpan(c, "SD-", "red", false, slave.energy);
+			} else {
+				makeSpan(c, "SD--", "red", false, slave.energy);
+			}
+		}
+
+		/**
+		 * @param {App.Entity.SlaveState} slave
+		 * @param {Node} c
+		 * @returns {void}
+		 */
+		function short_smart_fetish(slave, c) {
+			function settingStr() {
+				if (slave.fetishKnown === 1) {
+					if (slave.clitSetting === "off") {
+						return `SP-`;
+					} else if (((slave.fetish !== "submissive") || (slave.fetishStrength <= 95)) && (slave.clitSetting === "submissive")) {
+						return `SP:sub`;
+					} else if (((slave.fetish !== "cumslut") || (slave.fetishStrength <= 95)) && (slave.clitSetting === "oral")) {
+						return `SP:oral`;
+					} else if (((slave.fetish !== "humiliation") || (slave.fetishStrength <= 95)) && (slave.clitSetting === "humiliation")) {
+						return `SP:humil`;
+					} else if (((slave.fetish !== "buttslut") || (slave.fetishStrength <= 95)) && (slave.clitSetting === "anal")) {
+						return `SP:anal`;
+					} else if (((slave.fetish !== "boobs") || (slave.fetishStrength <= 95)) && (slave.clitSetting === "boobs")) {
+						return `SP:boobs`;
+					} else if (((slave.fetish !== "sadist") || (slave.fetishStrength <= 95)) && (slave.clitSetting === "sadist")) {
+						return `SP:sade`;
+					} else if (((slave.fetish !== "masochist") || (slave.fetishStrength <= 95)) && (slave.clitSetting === "masochist")) {
+						return `SP:pain`;
+					} else if (((slave.fetish !== "dom") || (slave.fetishStrength <= 95)) && (slave.clitSetting === "dom")) {
+						return `SP:dom`;
+					} else if (((slave.fetish !== "pregnancy") || (slave.fetishStrength <= 95)) && (slave.clitSetting === "pregnancy")) {
+						return `SP:preg`;
+					} else if (((slave.fetish !== "none") && (slave.clitSetting === "vanilla"))) {
+						return `SP:vanilla`;
+					} else if ((slave.energy <= 95) && (slave.clitSetting === "all")) {
+						return `SP:all`;
+					} else if ((slave.energy > 5) && (slave.clitSetting === "none")) {
+						return `SP:none`;
+					} else if (!["anti-men", "anti-women", "men", "women"].includes(slave.clitSetting)) {
+						return `SP:monitoring`;
+					}
+				} else {
+					switch (slave.clitSetting) {
+						case "off":
+							return `SP-`;
+						case "submissive":
+							return `SP:sub`;
+						case "lesbian":
+							return `SP:les`;
+						case "oral":
+							return `SP:oral`;
+						case "humiliation":
+							return `SP:humil`;
+						case "anal":
+							return `SP:anal`;
+						case "boobs":
+							return `SP:boobs`;
+						case "sadist":
+							return `SP:sade`;
+						case "masochist":
+							return `SP:pain`;
+						case "dom":
+							return `SP:dom`;
+						case "pregnancy":
+							return `SP:pregnancy`;
+						case "vanilla":
+							return `SP:vanilla`;
+						case "all":
+							return `SP:all`;
+						case "none":
+							return `SP:none`;
+					}
+				}
+				return null;
+			}
+			const s = settingStr();
+			if (s) {
+				makeSpan(c, settingStr());
+			}
+		}
+
+		/**
+		 * @param {App.Entity.SlaveState} slave
+		 * @param {Node} c
+		 * @returns {void}
+		 */
+		function short_smart_attraction(slave, c) {
+			function settingStr() {
+				if (slave.attrKnown === 1) {
+					if (slave.clitSetting === "women") {
+						if (slave.attrXX < 95) {
+							return `SP:women`;
+						} else {
+							return `SP:monitoring`;
+						}
+					} else if (slave.clitSetting === "men") {
+						if (slave.attrXY < 95) {
+							return `SP:men`;
+						} else {
+							return `SP:monitoring`;
+						}
+					} else if (slave.clitSetting === "anti-women") {
+						if (slave.attrXX > 0) {
+							return `SP:anti-women`;
+						} else {
+							return `SP:monitoring`;
+						}
+					} else if (slave.clitSetting === "anti-men") {
+						if (slave.attrXY > 0) {
+							return `SP:anti-men`;
+						} else {
+							return `SP:monitoring`;
+						}
+					}
+				} else {
+					if (slave.clitSetting === "women") {
+						return `SP:women`;
+					} else if (slave.clitSetting === "men") {
+						return `SP:men`;
+					} else if (slave.clitSetting === "anti-women") {
+						return `SP:anti-women`;
+					} else if (slave.clitSetting === "anti-men") {
+						return `SP:anti-men`;
+					}
+				}
+				return null;
+			}
+			const s = settingStr();
+			if (s) {
+				makeSpan(c, settingStr());
+			}
+		}
+
+		/**
+		 * @param {App.Entity.SlaveState} slave
+		 * @param {Node} c
+		 * @returns {void}
+		 */
+		function short_behavior_flaw(slave, c) {
+			function descStr() {
+				switch (slave.behavioralFlaw) {
+					case "arrogant":
+						return `Arrog`;
+					case "bitchy":
+						return `Bitchy`;
+					case "odd":
+						return `Odd`;
+					case "hates men":
+						return `Men-`;
+					case "hates women":
+						return `Women-`;
+					case "gluttonous":
+						return `Glut`;
+					case "anorexic":
+						return `Ano`;
+					case "devout":
+						return `Dev`;
+					case "liberated":
+						return `Lib`;
+					default:
+						slave.behavioralFlaw = "none";
+						return null;
+				}
+			}
+			const s = descStr();
+			if (s) {
+				makeSpan(c, descStr(), "red");
+			}
+		}
+
+		/**
+		 * @param {App.Entity.SlaveState} slave
+		 * @param {Node} c
+		 * @returns {void}
+		 */
+		function short_sex_flaw(slave, c) {
+			switch (slave.sexualFlaw) {
+				case "hates oral":
+					makeSpan(c, "Oral-", "red");
+					break;
+				case "hates anal":
+					makeSpan(c, "Anal-", "red");
+					break;
+				case "hates penetration":
+					makeSpan(c, "Fuck-", "red");
+					break;
+				case "shamefast":
+					makeSpan(c, "Shame", "red");
+					break;
+				case "idealistic":
+					makeSpan(c, "Ideal", "red");
+					break;
+				case "repressed":
+					makeSpan(c, "Repre", "red");
+					break;
+				case "apathetic":
+					makeSpan(c, "Apath", "red");
+					break;
+				case "crude":
+					makeSpan(c, "Crude", "red");
+					break;
+				case "judgemental":
+					makeSpan(c, "Judge", "red");
+					break;
+				case "cum addict":
+					makeSpan(c, "CumAdd", "yellow");
+					break;
+				case "anal addict":
+					makeSpan(c, "AnalAdd", "yellow");
+					break;
+				case "attention whore":
+					makeSpan(c, "Attention", "yellow");
+					break;
+				case "breast growth":
+					makeSpan(c, "BoobObsess", "yellow");
+					break;
+				case "abusive":
+					makeSpan(c, "Abusive", "yellow");
+					break;
+				case "malicious":
+					makeSpan(c, "Malice", "yellow");
+					break;
+				case "self hating":
+					makeSpan(c, "SelfHatr", "yellow");
+					break;
+				case "neglectful":
+					makeSpan(c, "SelfNeglect", "yellow");
+					break;
+				case "breeder":
+					makeSpan(c, "BreedObsess", "yellow");
+					break;
+				default:
+					slave.sexualFlaw = "none";
+					break;
+			}
+		}
+
+		/**
+		 * @param {App.Entity.SlaveState} slave
+		 * @param {Node} c
+		 * @returns {void}
+		 */
+		function short_behavior_quirk(slave, c) {
+			function descStr() {
+				switch (slave.behavioralQuirk) {
+					case "confident":
+						return `Confid`;
+					case "cutting":
+						return `Cutting`;
+					case "funny":
+						return `Funny`;
+					case "fitness":
+						return `Fit`;
+					case "adores women":
+						return `Women+`;
+					case "adores men":
+						return `Men+`;
+					case "insecure":
+						return `Insec`;
+					case "sinful":
+						return `Sinf`;
+					case "advocate":
+						return `Advoc`;
+					default:
+						slave.behavioralQuirk = "none";
+						return null;
+				}
+			}
+			const s = descStr();
+			if (s) {
+				makeSpan(c, s, "green");
+			}
+		}
+
+		/**
+		 * @param {App.Entity.SlaveState} slave
+		 * @param {Node} c
+		 * @returns {void}
+		 */
+		function short_sex_quirk(slave, c) {
+			function descStr() {
+				switch (slave.sexualQuirk) {
+					case "gagfuck queen":
+						return `Gagfuck`;
+					case "painal queen":
+						return `Painal`;
+					case "strugglefuck queen":
+						return `Struggle`;
+					case "tease":
+						return `Tease`;
+					case "romantic":
+						return `Romantic`;
+					case "perverted":
+						return `Perverted`;
+					case "caring":
+						return `Caring`;
+					case "unflinching":
+						return `Unflinch`;
+					case "size queen":
+						return `SizeQ`;
+					default:
+						slave.sexualQuirk = "none";
+						return null;
+				}
+			}
+			const s = descStr();
+			if (s) {
+				makeSpan(c, s, "green");
+			}
+		}
+
+		/**
+		 * @param {App.Entity.SlaveState} slave
+		 * @param {Node} c
+		 * @returns {void}
+		 */
+		function long_fetish(slave, c) {
+			function fetishStr() {
+				switch (slave.fetish) {
+					case "submissive":
+						if (slave.fetishStrength > 95) {
+							return "Complete submissive";
+						} else if (slave.fetishStrength > 60) {
+							return "Submissive";
+						} else {
+							return "Submissive tendencies";
+						}
+					case "cumslut":
+						if (slave.fetishStrength > 95) {
+							return "Cumslut";
+						} else if (slave.fetishStrength > 60) {
+							return "Oral fixation";
+						} else {
+							return "Prefers oral";
+						}
+					case "humiliation":
+						if (slave.fetishStrength > 95) {
+							return "Humiliation slut";
+						} else if (slave.fetishStrength > 60) {
+							return "Exhibitionist";
+						} else {
+							return "Interest in humiliation";
+						}
+					case "buttslut":
+						if (slave.fetishStrength > 95) {
+							return "Buttslut";
+						} else if (slave.fetishStrength > 60) {
+							return "Anal fixation";
+						} else {
+							return "Prefers anal";
+						}
+					case "boobs":
+						if (slave.fetishStrength > 95) {
+							return "Boobslut";
+						} else if (slave.fetishStrength > 60) {
+							return "Breast fixation";
+						} else {
+							return "Loves boobs";
+						}
+					case "sadist":
+						if (slave.fetishStrength > 95) {
+							return "Complete sadist";
+						} else if (slave.fetishStrength > 60) {
+							return "Sadist";
+						} else {
+							return "Sadistic tendencies";
+						}
+					case "masochist":
+						if (slave.fetishStrength > 95) {
+							return "Complete masochist";
+						} else if (slave.fetishStrength > 60) {
+							return "Masochist";
+						} else {
+							return "Masochistic tendencies";
+						}
+					case "dom":
+						if (slave.fetishStrength > 95) {
+							return "Complete dom";
+						} else if (slave.fetishStrength > 60) {
+							return "Dominant";
+						} else {
+							return "Dominant tendencies";
+						}
+					case "pregnancy":
+						if (slave.fetishStrength > 95) {
+							return "Pregnancy fetish";
+						} else if (slave.fetishStrength > 60) {
+							return "Pregnancy kink";
+						} else {
+							return "Interest in impregnation";
+						}
+					default:
+						return "Sexually vanilla";
+				}
+			}
+			makeSpan(c, fetishStr(), "lightcoral", true, slave.fetishStrength);
+		}
+
+		/**
+		 * @param {App.Entity.SlaveState} slave
+		 * @param {Node} c
+		 * @returns {void}
+		 */
+		function long_attraction(slave, c) {
+			if (slave.attrXY <= 5) {
+				makeSpan(c, "Disgusted by men", "red", true, slave.attrXY);
+			} else if (slave.attrXY <= 15) {
+				makeSpan(c, "Turned off by men", "red", true, slave.attrXY);
+			} else if (slave.attrXY <= 35) {
+				makeSpan(c, "Not attracted to men", "red", true, slave.attrXY);
+			} else if (slave.attrXY <= 65) {
+				makeSpan(c, "Indifferent to men", undefined, true, slave.attrXY);
+			} else if (slave.attrXY <= 85) {
+				makeSpan(c, "Attracted to men", "green", true, slave.attrXY);
+			} else if (slave.attrXY <= 95) {
+				makeSpan(c, "Aroused by men", "green", true, slave.attrXY);
+			} else if (slave.attrXX > 95) {
+				if (slave.energy <= 95) {
+					makeSpan(c, "Omnisexual!", "green");
+				} else {
+					makeSpan(c, "Omnisexual nymphomaniac!", "green");
+				}
+			} else {
+				makeSpan(c, "Passionate about men", "green", true, slave.attrXY);
+			}
+			if (slave.attrXX <= 5) {
+				makeSpan(c, "disgusted by women", "red", true, slave.attrXX);
+			} else if (slave.attrXX <= 15) {
+				makeSpan(c, "turned off by women", "red", true, slave.attrXX);
+			} else if (slave.attrXX <= 35) {
+				makeSpan(c, "not attracted to women", "red", true, slave.attrXX);
+			} else if (slave.attrXX <= 65) {
+				makeSpan(c, "indifferent to women", undefined, true, slave.attrXX);
+			} else if (slave.attrXX <= 85) {
+				makeSpan(c, "attracted to women", "green", true, slave.attrXX);
+			} else if (slave.attrXX <= 95) {
+				makeSpan(c, "aroused by women", "green", true, slave.attrXX);
+			} else if (slave.attrXY <= 95) {
+				makeSpan(c, "passionate about women", "green", true, slave.attrXX);
+			}
+			if (slave.energy > 95) {
+				if ((slave.attrXY <= 95) || (slave.attrXX <= 95)) {
+					makeSpan(c, "Nymphomaniac!", "green");
+				}
+			} else if (slave.energy > 80) {
+				makeSpan(c, "Powerful sex drive", "green", true, slave.energy);
+			} else if (slave.energy > 60) {
+				makeSpan(c, "Good sex drive", "green", true, slave.energy);
+			} else if (slave.energy > 40) {
+				makeSpan(c, "Average sex drive", "yellow", true, slave.energy);
+			} else if (slave.energy > 20) {
+				makeSpan(c, "Poor sex drive", "red", true, slave.energy);
+			} else {
+				makeSpan(c, "No sex drive", "red", true, slave.energy);
+			}
+		}
+
+		/**
+		 * @param {App.Entity.SlaveState} slave
+		 * @param {Node} c
+		 * @returns {void}
+		 */
+		function long_smart_fetish(slave, c) {
+			function descStr() {
+				if (slave.fetishKnown === 1) {
+					if (slave.clitSetting === "off") {
+						return `SP off.`;
+					} else if (((slave.fetish !== "submissive") || (slave.fetishStrength <= 95)) && (slave.clitSetting === "submissive")) {
+						return `SP: submissive.`;
+					} else if (((slave.fetish !== "cumslut") || (slave.fetishStrength <= 95)) && (slave.clitSetting === "oral")) {
+						return `SP: oral.`;
+					} else if (((slave.fetish !== "humiliation") || (slave.fetishStrength <= 95)) && (slave.clitSetting === "humiliation")) {
+						return `SP: humiliation.`;
+					} else if (((slave.fetish !== "buttslut") || (slave.fetishStrength <= 95)) && (slave.clitSetting === "anal")) {
+						return `SP: anal.`;
+					} else if (((slave.fetish !== "boobs") || (slave.fetishStrength <= 95)) && (slave.clitSetting === "boobs")) {
+						return `SP: breasts.`;
+					} else if (((slave.fetish !== "sadist") || (slave.fetishStrength <= 95)) && (slave.clitSetting === "sadist")) {
+						return `SP: sadism.`;
+					} else if (((slave.fetish !== "masochist") || (slave.fetishStrength <= 95)) && (slave.clitSetting === "masochist")) {
+						return `SP: masochism.`;
+					} else if (((slave.fetish !== "dom") || (slave.fetishStrength <= 95)) && (slave.clitSetting === "dom")) {
+						return `SP: dominance.`;
+					} else if (((slave.fetish !== "pregnancy") || (slave.fetishStrength <= 95)) && (slave.clitSetting === "pregnancy")) {
+						return `SP: pregnancy.`;
+					} else if ((slave.fetish !== "none") && (slave.clitSetting === "vanilla")) {
+						return `SP: vanilla.`;
+					} else if ((slave.energy <= 95) && (slave.clitSetting === "all")) {
+						return `SP: all.`;
+					} else if ((slave.energy > 5) && (slave.clitSetting === "none")) {
+						return `SP: none.`;
+					} else if (!["anti-men", "anti-women", "men", "women"].includes(slave.clitSetting)) {
+						return `SP: monitoring.`;
+					}
+				} else {
+					switch (slave.clitSetting) {
+						case "off":
+							return `SP off.`;
+						case "submissive":
+							return `SP: submissive.`;
+						case "oral":
+							return `SP: oral.`;
+						case "humiliation":
+							return `SP: humiliation.`;
+						case "anal":
+							return `SP: anal.`;
+						case "boobs":
+							return `SP: breasts.`;
+						case "sadist":
+							return `SP: sadism.`;
+						case "masochist":
+							return `SP: masochism.`;
+						case "dom":
+							return `SP: dominance.`;
+						case "pregnancy":
+							return `SP: pregnancy.`;
+						case "vanilla":
+							return `SP: vanilla.`;
+						case "all":
+							return `SP: all.`;
+						case "none":
+							return `SP: none.`;
+					}
+				}
+				return null;
+			}
+			const s = descStr();
+			if (s) {
+				makeSpan(c, s);
+			}
+		}
+
+		/**
+		 * @param {App.Entity.SlaveState} slave
+		 * @param {Node} c
+		 * @returns {void}
+		 */
+		function long_smart_attraction(slave, c) {
+			if (slave.attrKnown === 1) {
+				if ((slave.attrXX < 100) && (slave.clitSetting === "women")) {
+					makeSpan(c, `SP: women.`);
+				} else if ((slave.attrXY < 100) && (slave.clitSetting === "men")) {
+					makeSpan(c, `SP: men.`);
+				}
+			} else {
+				if (slave.clitSetting === "women") {
+					makeSpan(c, `SP: women.`);
+				} else if (slave.clitSetting === "men") {
+					makeSpan(c, `SP: men.`);
+				}
+			}
+		}
+
+		/**
+		 * @param {App.Entity.SlaveState} slave
+		 * @param {Node} c
+		 * @returns {void}
+		 */
+		function long_behavior_flaw(slave, c) {
+			function descStr() {
+				switch (slave.behavioralFlaw) {
+					case "arrogant":
+						return `Arrogant.`;
+					case "bitchy":
+						return `Bitchy.`;
+					case "odd":
+						return `Odd.`;
+					case "hates men":
+						return `Hates men.`;
+					case "hates women":
+						return `Hates women.`;
+					case "gluttonous":
+						return `Stress eater.`;
+					case "anorexic":
+						return `Anorexic.`;
+					case "devout":
+						return `Devoutly religious.`;
+					case "liberated":
+						return `Mentally liberated.`;
+					default:
+						slave.behavioralFlaw = "none";
+						return null;
+				}
+			}
+			const s = descStr();
+			if (s) {
+				makeSpan(c, s, "red");
+			}
+		}
+
+		/**
+		 * @param {App.Entity.SlaveState} slave
+		 * @param {Node} c
+		 * @returns {void}
+		 */
+		function long_sex_flaw(slave, c) {
+			switch (slave.sexualFlaw) {
+				case "hates oral":
+				case "hates anal":
+				case "hates penetration":
+				case "shamefast":
+					makeSpan(c, slave.sexualFlaw, "red", true);
+					break;
+				case "idealistic":
+				case "repressed":
+				case "apathetic":
+				case "crude":
+				case "judgemental":
+					makeSpan(c, `Sexually ${slave.sexualFlaw}.`, "red");
+					break;
+				case "cum addict":
+				case "anal addict":
+				case "attention whore":
+					makeSpan(c, slave.sexualFlaw, "yellow", true);
+					break;
+				case "breast growth":
+					makeSpan(c, `Breast obsession.`, "yellow");
+					break;
+				case "abusive":
+				case "malicious":
+					makeSpan(c, `Sexually ${slave.sexualFlaw}.`, "yellow");
+					break;
+				case "self hating":
+					makeSpan(c, `Self hatred.`, "yellow");
+					break;
+				case "neglectful":
+					makeSpan(c, `Self neglectful.`, "yellow");
+					break;
+				case "breeder":
+					makeSpan(c, `Breeding obsession.`, "yellow");
+					break;
+				default:
+					slave.sexualFlaw = "none";
+					break;
+			}
+		}
+
+		/**
+		 * @param {App.Entity.SlaveState} slave
+		 * @param {Node} c
+		 * @returns {void}
+		 */
+		function long_behavior_quirk(slave, c) {
+			switch (slave.behavioralQuirk) {
+				case "confident":
+				case "cutting":
+				case "funny":
+				case "fitness":
+				case "adores women":
+				case "adores men":
+				case "insecure":
+				case "sinful":
+				case "advocate":
+					makeSpan(c, slave.behavioralQuirk, "green", true);
+					break;
+				default:
+					slave.behavioralQuirk = "none";
+					break;
+			}
+		}
+
+		/**
+		 * @param {App.Entity.SlaveState} slave
+		 * @param {Node} c
+		 * @returns {void}
+		 */
+		function long_sex_quirk(slave, c) {
+			switch (slave.sexualQuirk) {
+				case "gagfuck queen":
+				case "painal queen":
+				case "strugglefuck queen":
+				case "tease":
+				case "romantic":
+				case "perverted":
+				case "caring":
+				case "unflinching":
+				case "size queen":
+					makeSpan(c, slave.sexualQuirk, "green", true);
+					break;
+				default:
+					slave.sexualQuirk = "none";
+					break;
+			}
+		}
+
+		/**
+		 * @param {App.Entity.SlaveState} slave
+		 * @param {Node} c
+		 * @returns {void}
+		 */
+		function short_family(slave, c) {
+			let res = "";
+			let handled = 0;
+			if (slave.mother > 0) {
+				const _ssj = V.slaves.findIndex(s => s.ID === slave.mother);
+				if (_ssj !== -1) {
+					res += `${SlaveFullName(V.slaves[_ssj])}'s ${getPronouns(slave).daughter}`;
+					if (slave.relationshipTarget === V.slaves[_ssj].ID) {
+						const friendShipShort = relationshipTermShort(slave);
+						res += ` & ${friendShipShort}`;
+						handled = 1;
+					}
+				}
+				res += " ";
+			} else if (slave.mother === -1) {
+				res += `Your ${getPronouns(slave).daughter}`;
+				if (slave.relationship < -1) {
+					res += ` & ${PCrelationshipTerm(slave)}`;
+					handled = 1;
+				}
+				res += " ";
+			} else if (slave.mother in V.missingTable && V.showMissingSlavesSD && V.showMissingSlaves) {
+				res += `${V.missingTable[slave.mother].fullName}'s ${getPronouns(slave).daughter} `;
+			}
+			if (slave.father > 0 && slave.father !== slave.mother) {
+				const _ssj = V.slaves.findIndex(s => s.ID === slave.father);
+				if (_ssj !== -1) {
+					res += `${SlaveFullName(V.slaves[_ssj])}'s ${getPronouns(slave).daughter}`;
+					if (slave.relationshipTarget === V.slaves[_ssj].ID && handled !== 1) {
+						const friendShipShort = relationshipTermShort(slave);
+						res += ` & ${friendShipShort}`;
+						handled = 1;
+					}
+				}
+				res += " ";
+			} else if (slave.father === -1 && slave.mother !== -1) {
+				res += `Your ${getPronouns(slave).daughter}`;
+				if (slave.relationship < -1) {
+					res += ` & ${PCrelationshipTerm(slave)}`;
+					handled = 1;
+				}
+				res += " ";
+			} else if (slave.father in V.missingTable && slave.father !== slave.mother && V.showMissingSlavesSD && V.showMissingSlaves) {
+				res += `${V.missingTable[slave.father].fullName}'s ${getPronouns(slave).daughter}`;
+			}
+			if (slave.daughters === 1) {
+				let _ssj = V.slaves.findIndex(s => s.mother === slave.ID);
+				if (_ssj !== -1) {
+					res += `${SlaveFullName(V.slaves[_ssj])}'s mother`;
+					if (slave.relationshipTarget === V.slaves[_ssj].ID) {
+						const friendShipShort = relationshipTermShort(slave);
+						res += ` & ${friendShipShort}`;
+						handled = 1;
+					}
+				}
+				res += " ";
+				_ssj = V.slaves.findIndex(s => s.father === slave.ID);
+				if (_ssj !== -1) {
+					res += `${SlaveFullName(V.slaves[_ssj])}'s father`;
+					if (slave.relationshipTarget === V.slaves[_ssj].ID && handled !== 1) {
+						const friendShipShort = relationshipTermShort(slave);
+						res += ` & ${friendShipShort}`;
+						handled = 1;
+					}
+				}
+				res += " ";
+			} else if (slave.daughters > 1) {
+				res += `multiple daughters `;
+			}
+			if (slave.sisters === 1) {
+				const _ssj = V.slaves.findIndex(s => areSisters(s, slave) > 0);
+				if (_ssj !== -1) {
+					res += `${SlaveFullName(V.slaves[_ssj])}'s ${getPronouns(slave).sister}`;
+					if (slave.relationshipTarget === V.slaves[_ssj].ID) {
+						const friendShipShort = relationshipTermShort(slave);
+						res += `& ${friendShipShort}`;
+						handled = 1;
+					}
+				}
+				res += " ";
+			} else if (slave.sisters > 1) {
+				res += `multiple sisters `;
+			}
+			if (slave.relationship > 0 && handled !== 1) {
+				const _ssj = V.slaves.findIndex(s => s.ID === slave.relationshipTarget);
+				if (_ssj !== -1) {
+					res += `${SlaveFullName(V.slaves[_ssj])}'s`;
+					const friendShipShort = relationshipTermShort(slave);
+					res += ` ${friendShipShort}`;
+				}
+			} else if (slave.relationship === -3 && slave.mother !== -1 && slave.father !== -1) {
+				res += `Your ${getPronouns(slave).wife}`;
+			} else if (slave.relationship === -2) {
+				res += `E Bonded`;
+			} else if (slave.relationship === -1) {
+				res += `E Slut`;
+			}
+			helpers.makeSpan(c, res);
+		}
+
+		/**
+		 * @param {App.Entity.SlaveState} slave
+		 * @param {Node} c
+		 * @returns {void}
+		 */
+		function short_clone(slave, c) {
+			if (slave.clone !== 0) {
+				makeSpan(c, "Clone");
+			}
+		}
+
+		/**
+		 * @param {App.Entity.SlaveState} slave
+		 * @param {Node} c
+		 * @returns {void}
+		 */
+		function short_rival(slave, c) {
+			if (slave.rivalry !== 0) {
+				const block = makeBlock(c, "lightsalmon");
+				const _ssj = V.slaves.findIndex(s => s.ID === slave.rivalryTarget);
+				if (_ssj !== -1) {
+					if (slave.rivalry <= 1) {
+						block.textContent = `Disl ${SlaveFullName(V.slaves[_ssj])}`;
+					} else if (slave.rivalry <= 2) {
+						block.textContent = `${SlaveFullName(V.slaves[_ssj])}'s rival`;
+					} else {
+						block.textContent = `Hates ${SlaveFullName(V.slaves[_ssj])}`;
+					}
+				}
+			}
+		}
+
+		/**
+		 * @param {App.Entity.SlaveState} slave
+		 * @param {Node} c
+		 * @returns {void}
+		 */
+		function long_family(slave, c) {
+			let handled = 0;
+			const block = makeBlock();
+			if (slave.mother > 0) {
+				const _ssj = V.slaves.findIndex(s => s.ID === slave.mother);
+				if (_ssj !== -1) {
+					addText(block, `${SlaveFullName(V.slaves[_ssj])}'s `);
+					const tmpSpan = makeSpan(block, getPronouns(slave).daughter, "lightgreen");
+					if (slave.relationshipTarget === V.slaves[_ssj].ID) {
+						const friendShipShort = relationshipTerm(slave);
+						tmpSpan.textContent += ` and ${friendShipShort}`;
+						handled = 1;
+					}
+					tmpSpan.textContent += '.';
+				}
+			} else if (slave.mother === -1) {
+				addText(block, `Your `);
+				if (slave.relationship < -1) {
+					makeSpan(block, `${getPronouns(slave).daughter} and ${PCrelationshipTerm(slave)}.`, "lightgreen");
+					handled = 1;
+				} else {
+					makeSpan(block, `${getPronouns(slave).daughter}.`, "lightgreen");
+				}
+			} else if (slave.mother in V.missingTable && V.showMissingSlavesSD && V.showMissingSlaves) {
+				addText(block, `${V.missingTable[slave.mother].fullName}'s `);
+				makeSpan(block, `${getPronouns(slave).daughter}.`, "lightgreen");
+			}
+			if (slave.father > 0 && slave.father !== slave.mother) {
+				const _ssj = V.slaves.findIndex(s => s.ID === slave.father);
+				if (_ssj !== -1) {
+					addText(block, `${SlaveFullName(V.slaves[_ssj])}'s `);
+					const tmpSpan = makeSpan(block, getPronouns(slave).daughter, "lightgreen");
+					if (slave.relationshipTarget === V.slaves[_ssj].ID) {
+						const friendShipShort = relationshipTerm(slave);
+						tmpSpan.textContent += ` and ${friendShipShort}`;
+						handled = 1;
+					}
+					tmpSpan.textContent += '.';
+				}
+			} else if (slave.father === -1 && slave.father !== slave.mother) {
+				addText(block, `Your `);
+				if (slave.relationship < -1) {
+					makeSpan(block, `${getPronouns(slave).daughter} and ${PCrelationshipTerm(slave)}.`, "lightgreen");
+					handled = 1;
+				} else {
+					makeSpan(block, `${getPronouns(slave).daughter}.`, "lightgreen");
+				}
+			} else if (slave.father in V.missingTable && slave.father !== slave.mother && V.showMissingSlavesSD && V.showMissingSlaves) {
+				addText(block, `${V.missingTable[slave.father].fullName}'s `);
+				makeSpan(block, `${getPronouns(slave).daughter}.`, "lightgreen");
+			}
+			if (areSisters(V.PC, slave) > 0) {
+				addText(block, `Your `);
+				if (slave.relationship < -1) {
+					makeSpan(block, `${relativeTerm(V.PC, slave)} and ${PCrelationshipTerm(slave)}.`, "lightgreen");
+					handled = 1;
+				} else {
+					makeSpan(block, `${relativeTerm(V.PC, slave)}.`, "lightgreen");
+				}
+			}
+			if (slave.daughters === 1) {
+				let _ssj = V.slaves.findIndex(s => s.mother === slave.ID);
+				if (_ssj !== -1) {
+					addText(block, `${SlaveFullName(V.slaves[_ssj])}'s `);
+					const tmpSpan = makeSpan(block, "mother", "lightgreen");
+					if (slave.relationshipTarget === V.slaves[_ssj].ID) {
+						const friendShipShort = relationshipTerm(slave);
+						tmpSpan.textContent += ` and ${friendShipShort}`;
+						handled = 1;
+					}
+					tmpSpan.textContent += '.';
+				}
+				_ssj = V.slaves.findIndex(s => s.father === slave.ID);
+				if (_ssj !== -1) {
+					addText(block, `${SlaveFullName(V.slaves[_ssj])}'s `);
+					const tmpSpan = makeSpan(block, "father", "lightgreen");
+					if (slave.relationshipTarget === V.slaves[_ssj].ID) {
+						const friendShipShort = relationshipTerm(slave);
+						tmpSpan.textContent += ` and ${friendShipShort}`;
+						handled = 1;
+					}
+					tmpSpan.textContent += '.';
+				}
+			} else if (slave.daughters > 1) {
+				if (slave.daughters > 10) {
+					makeSpan(block, "Has tons of daughters.", "lightgreen");
+				} else if (slave.daughters > 5) {
+					makeSpan(block, "Has many daughters.", "lightgreen");
+				} else {
+					makeSpan(block, "Has several daughters.", "lightgreen");
+				}
+			}
+			if (slave.sisters === 1) {
+				const _ssj = V.slaves.findIndex(s => areSisters(s, slave) > 0);
+				if (_ssj !== -1) {
+					addText(block, `${SlaveFullName(V.slaves[_ssj])}'s `);
+					const tmpSpan = makeSpan(block, getPronouns(slave).sister, "lightgreen");
+					if (slave.relationshipTarget === V.slaves[_ssj].ID) {
+						const friendShipShort = relationshipTerm(slave);
+						tmpSpan.textContent += ` and ${friendShipShort}`;
+						handled = 1;
+					}
+					tmpSpan.textContent += '.';
+				}
+			} else if (slave.sisters > 1) {
+				if (slave.sisters > 10) {
+					makeSpan(block, "One of many sisters.", "lightgreen");
+				} else if (slave.sisters > 5) {
+					makeSpan(block, "Has many sisters.", "lightgreen");
+				} else {
+					makeSpan(block, "Has several sisters.", "lightgreen");
+				}
+			}
+			if (slave.relationship > 0 && handled !== 1) {
+				const _ssj = V.slaves.findIndex(s => s.ID === slave.relationshipTarget);
+				if (_ssj !== -1) {
+					const friendship = relationshipTerm(slave);
+					addText(block, `${SlaveFullName(V.slaves[_ssj])}'s `);
+					makeSpan(block, `${friendship}.`, "lightgreen");
+				}
+			} else if (slave.relationship === -3 && slave.mother !== -1 && slave.father !== -1 && areSisters(V.PC, slave) === 0) {
+				makeSpan(block, `Your ${getPronouns(slave).wife}.`, "lightgreen");
+			} else if (slave.relationship === -2) {
+				makeSpan(block, "Emotionally bonded to you.", "lightgreen");
+			} else if (slave.relationship === -1) {
+				makeSpan(block, "Emotional slut.", "lightgreen");
+			}
+
+			if (block.textContent.length > 0) {
+				c.appendChild(block);
+			}
+		}
+
+		/**
+		 * @param {App.Entity.SlaveState} slave
+		 * @param {Node} c
+		 * @returns {void}
+		 */
+		function long_clone(slave, c) {
+			if (slave.clone !== 0) {
+				makeSpan(c, `Clone of ${slave.clone}.`, "skyblue");
+			}
+		}
+
+		/**
+		 * @param {App.Entity.SlaveState} slave
+		 * @param {Node} c
+		 * @returns {void}
+		 */
+		function long_rival(slave, c) {
+			if (slave.rivalry !== 0) {
+				const block = makeBlock(c);
+				const _ssj = V.slaves.findIndex(s => s.ID === slave.rivalryTarget);
+				if (_ssj !== -1) {
+					if (slave.rivalry <= 1) {
+						makeSpan(block, "Dislikes", "lightsalmon");
+						block.appendChild(document.createTextNode(` ${SlaveFullName(V.slaves[_ssj])}.`));
+					} else if (slave.rivalry <= 2) {
+						block.appendChild(document.createTextNode(`${SlaveFullName(V.slaves[_ssj])}'s `));
+						makeSpan(block, "rival.", "lightsalmon");
+					} else {
+						makeSpan(block, "Hates", "lightsalmon");
+						block.appendChild(document.createTextNode(` ${SlaveFullName(V.slaves[_ssj])}.`));
+					}
+				}
+			}
+		}
+
+		return {
+			long: {
+				health: long_health,
+				illness: long_illness,
+				tired: long_tired,
+				age: long_age,
+				face: long_face,
+				eyes: long_eyes,
+				ears: long_ears,
+				lips: long_lips,
+				teeth: long_teeth,
+				muscles: long_muscles,
+				voice: long_voice,
+				tits_ass: long_tits_ass,
+				hips: long_hips,
+				waist: long_waist,
+				implants: long_implants,
+				lactation: long_lactation,
+				mods: long_mods,
+				intelligence: long_intelligence,
+				skills: long_skills,
+				prestige: long_prestige,
+				porn_prestige: long_porn_prestige,
+				clothes: long_clothes,
+				collar: long_collar,
+				belly: long_belly,
+				arms: long_arms,
+				legs: long_legs,
+				shoes: long_shoes,
+				chastity: long_chastity,
+				vaginal_acc: long_vaginal_acc,
+				dick_acc: long_dick_acc,
+				buttplug: long_buttplug,
+				fetish: long_fetish,
+				attraction: long_attraction,
+				smart_fetish: long_smart_fetish,
+				smart_attraction: long_smart_attraction,
+				behavior_flaw: long_behavior_flaw,
+				sex_flaw: long_sex_flaw,
+				behavior_quirk: long_behavior_quirk,
+				sex_quirk: long_sex_quirk,
+				family: long_family,
+				clone: long_clone,
+				rival: long_rival
+			},
+			short: {
+				health: short_health,
+				illness: short_illness,
+				tired: short_tired,
+				age: short_age,
+				face: short_face,
+				eyes: short_eyes,
+				ears: short_ears,
+				lips: short_lips,
+				teeth: short_teeth,
+				muscles: short_muscles,
+				voice: short_voice,
+				tits_ass: short_tits_ass,
+				hips: short_hips,
+				waist: short_waist,
+				implants: short_implants,
+				lactation: short_lactation,
+				mods: short_mods,
+				intelligence: short_intelligence,
+				skills: short_skills,
+				prestige: short_prestige,
+				porn_prestige: short_porn_prestige,
+/*				clothes: short_clothes,
+				collar: short_collar,
+				belly: short_belly,
+				arms: short_arms,
+				legs: short_legs,
+				shoes: short_shoes,
+				chastity: short_chastity,
+				vaginal_acc: short_vaginal_acc,
+				dick_acc: short_dick_acc,
+				buttplug: short_buttplug,
+*/
+				fetish: short_fetish,
+				attraction: short_attraction,
+				smart_fetish: short_smart_fetish,
+				smart_attraction: short_smart_attraction,
+				behavior_flaw: short_behavior_flaw,
+				sex_flaw: short_sex_flaw,
+				behavior_quirk: short_behavior_quirk,
+				sex_quirk: short_sex_quirk,
+				family: short_family,
+				clone: short_clone,
+				rival: short_rival
+			}
+		};
+	}();
+
+	return {
+		helpers: helpers,
+		bits: bits
+	};
+}();
diff --git a/src/js/slaveSummaryWidgets.js b/src/js/slaveSummaryWidgets.js
index a5b28aa5561..8f5bc4fe424 100644
--- a/src/js/slaveSummaryWidgets.js
+++ b/src/js/slaveSummaryWidgets.js
@@ -1,4514 +1,2005 @@
-/* eslint-disable camelcase */
+App.UI.SlaveSummaryRenderers = function() {
 
-window.SlaveSummary = (function() {
-	/** @type {DocumentFragment} */
-	let res;
+	const bits = App.UI.SlaveSummaryImpl.bits;
+	const helpers = App.UI.SlaveSummaryImpl.helpers;
 
-	/**
-	 * @param {App.Entity.SlaveState} slave
-	 * @returns {DocumentFragment} */
-	function SlaveSummary(slave) {
-		res = document.createDocumentFragment();
-		let para = makeParagraph(res);
-
-		if (V.abbreviateDevotion === 1) {
-			short_devotion(slave, para);
-		} else if (V.abbreviateDevotion === 2) {
-			long_devotion(slave, para);
-		}
-		if (slave.fuckdoll === 0) {
-			if (V.abbreviateRules === 1) {
-				short_rules(slave, para);
-			} else if (V.abbreviateRules === 2) {
-				long_rules(slave, para);
-			}
-		}
-		if (V.abbreviateDiet === 1) {
-			short_weight(slave, para);
-		} else if (V.abbreviateDiet === 2) {
-			long_weight(slave, para);
-		}
-		if (V.abbreviateDiet === 1) {
-			short_diet(slave, para);
-		} else if (V.abbreviateDiet === 2) {
-			long_diet(slave, para);
-		}
-		if (V.abbreviateHealth === 1) {
-			short_health(slave, para);
-			short_illness(slave, para);
-			short_tired(slave, para);
-		} else if (V.abbreviateHealth === 2) {
-			long_health(slave, para);
-			long_illness(slave, para);
-			long_tired(slave, para);
-		}
-		if (V.abbreviateDrugs === 1) {
-			short_drugs(slave, para);
-		} else if (V.abbreviateDrugs === 2) {
-			long_drugs(slave, para);
-		}
-
-		para = makeParagraph(res);
-		para.classList.add("pink");
-
-		makeSpan(para, `${capFirstChar(SlaveTitle(slave))}${V.abbreviatePhysicals === 2 ? '.' : ''}`, ["coral", "strong"]);
-		if (V.seeRace === 1 && V.abbreviateRace !== 0) {
-			makeSpan(para, V.abbreviateRace === 1 ? short_race(slave) : long_race(slave), "tan");
-		}
-		if (V.abbreviateNationality !== 0) {
-			makeSpan(para, V.abbreviateNationality === 1 ? short_nationality(slave) : long_nationality(slave), "tan");
-		}
-		makeSpan(para, V.abbreviatePhysicals === 1 ? short_skin(slave) : `${capFirstChar(slave.skin)} skin.`);
-		if (V.abbreviateGenitalia === 1) {
-			short_genitals(slave, para);
-		} else if (V.abbreviateGenitalia === 2) {
-			long_genitals(slave, para);
-		}
-		if (V.abbreviatePhysicals === 1) {
-			short_age(slave, para);
-			short_face(slave, para);
-			short_eyes(slave, para);
-			short_ears(slave, para);
-			if (slave.markings !== "none") {
-				makeSpan(para, "Markings");
-			}
-			short_lips(slave, para);
-			short_teeth(slave, para);
-			short_muscles(slave, para);
-			addText(para, App.Desc.shortLimbs(slave));
-			short_voice(slave, para);
-			short_tits_ass(slave, para);
-			short_hips(slave, para);
-			short_waist(slave, para);
-			short_implants(slave, para);
-			short_lactation(slave, para);
-			short_mods(slave, para);
-		} else if (V.abbreviatePhysicals === 2) {
-			long_age(slave, para);
-			long_face(slave, para);
-			long_eyes(slave, para);
-			long_ears(slave, para);
-			long_lips(slave, para);
-			long_teeth(slave, para);
-			long_muscles(slave, para);
-			makeSpan(para, App.Desc.longLimbs(slave));
-			long_voice(slave, para);
-			long_tits_ass(slave, para);
-			long_hips(slave, para);
-			long_waist(slave, para);
-			long_implants(slave, para);
-			long_lactation(slave, para);
-			long_mods(slave, para);
-			if (!jQuery.isEmptyObject(slave.brand)) {
-				makeSpan(para, `Branded.`);
-			}
-		}
-		if (V.abbreviateHormoneBalance === 1) {
-			if (slave.hormoneBalance <= -21) {
-				makeSpan(para, "HB:M", ["deepskyblue", "strong"]);
-			} else if (slave.hormoneBalance <= 20) {
-				makeSpan(para, "HB:N", ["pink", "strong"]);
-			} else if (slave.hormoneBalance <= 500) {
-				makeSpan(para, "HB:F", ["pink", "strong"]);
-			}
-		} else if (V.abbreviateHormoneBalance === 2) {
-			const colorClass = slave.hormoneBalance <= -21 ? "deepskyblue" : "pink";
-			let desc = "";
-			if (slave.hormoneBalance < -400) {
-				desc = `Overwhelmingly masculine`;
-			} else if (slave.hormoneBalance <= -300) {
-				desc = `Extremely masculine`;
-			} else if (slave.hormoneBalance <= -200) {
-				desc = `Heavily masculine`;
-			} else if (slave.hormoneBalance <= -100) {
-				desc = `Very masculine`;
-			} else if (slave.hormoneBalance <= -21) {
-				desc = `Masculine`;
-			} else if (slave.hormoneBalance <= 20) {
-				desc = `Neutral`;
-			} else if (slave.hormoneBalance <= 99) {
-				desc = `Feminine`;
-			} else if (slave.hormoneBalance <= 199) {
-				desc = `Very feminine`;
-			} else if (slave.hormoneBalance <= 299) {
-				desc = `Heavily feminine`;
-			} else if (slave.hormoneBalance <= 399) {
-				desc = `Extremely feminine`;
-			} else if (slave.hormoneBalance <= 500) {
-				desc = `Overwhelmingly feminine`;
-			}
-			makeSpan(para, desc + " hormone balance.", colorClass);
-		}
-
-		para = makeParagraph(res);
-
-		if (V.abbreviateSkills === 1) {
-			short_intelligence(slave, para);
-			short_skills(slave, para);
-			short_prestige(slave, para);
-			short_porn_prestige(slave, para);
-		} else if (V.abbreviateSkills === 2) {
-			long_intelligence(slave, para);
-			long_skills(slave, para);
-			long_prestige(slave, para);
-			long_porn_prestige(slave, para);
-		}
-		if (V.abbreviateMental === 1) {
-			if (slave.fetish !== "mindbroken") {
-				if (slave.fetishKnown === 1) {
-					short_fetish(slave, para);
-				}
-				if (slave.attrKnown === 1) {
-					short_attraction(slave, para);
-				}
-			}
-			if (slave.clitPiercing === 3) {
-				short_smart_fetish(slave, para);
-				short_smart_attraction(slave, para);
-			}
-			short_behavior_flaw(slave, para);
-			short_sex_flaw(slave, para);
-			short_behavior_quirk(slave, para);
-			short_sex_quirk(slave, para);
-		} else if (V.abbreviateMental === 2) {
-			if (slave.fetish !== "mindbroken") {
-				if (slave.fetishKnown === 1) {
-					long_fetish(slave, para);
-				}
-				if (slave.attrKnown === 1) {
-					long_attraction(slave, para);
-				}
-			}
-			if (slave.clitPiercing === 3) {
-				long_smart_fetish(slave, para);
-				long_smart_attraction(slave, para);
-			}
-			long_behavior_flaw(slave, para);
-			long_sex_flaw(slave, para);
-			long_behavior_quirk(slave, para);
-			long_sex_quirk(slave, para);
-		}
-		if (slave.custom.label) {
-			makeSpan(res, `${capFirstChar(slave.custom.label)}.`, ["yellow", "strong"]);
-		}
-		if ((slave.relationship !== 0) || (V.abbreviateClothes === 2) || (V.abbreviateRulesets === 2)) {
-			para = makeParagraph(res);
-		}
-		if (V.abbreviateMental === 1) {
-			makeSpan(para, short_extended_family(slave), "lightgreen");
-			short_clone(slave, para);
-			short_rival(slave, para);
-		} else if (V.abbreviateMental === 2) {
-			long_extended_family(slave, para);
-			long_clone(slave, para);
-			long_rival(slave, para);
-		}
-		if (slave.fuckdoll === 0) {
-			if (V.abbreviateClothes === 2) {
-				const dressingBlock = makeBlock(para);
-				if (slave.choosesOwnClothes === 1) {
-					makeSpan(dressingBlock, `Dressing ${getPronouns(slave).himself}.`);
-				}
-				long_clothes(slave, dressingBlock);
-				long_collar(slave, dressingBlock);
-				long_belly(slave, dressingBlock);
-				if (hasAnyArms(slave)) {
-					long_arms(slave, dressingBlock);
-				}
-				if (hasAnyLegs(slave)) {
-					long_legs(slave, dressingBlock);
-					long_shoes(slave, dressingBlock);
-				}
-				long_chastity(slave, dressingBlock);
-				long_vaginal_acc(slave, dressingBlock);
-				long_dick_acc(slave, dressingBlock);
-				long_buttplug(slave, dressingBlock);
-			}
-		}
-		const RABlock = makeBlock(para);
-		rules_assistant(slave, RABlock);
-		if (V.abbreviateOrigins === 2 && slave.origin !== 0) {
-			origins(slave, res);
-		}
-		return res;
-	}
-
-	/**
-	 * @param {App.Entity.SlaveState} slave
-	 * @param {Node} c
-	 */
-	function short_devotion(slave, c) {
-		if (slave.fetish === "mindbroken") {
-			makeSpan(c, "MB", "mindbroken");
-		} else if (slave.devotion < -95) {
-			makeSpan(c, "Hate", ["devotion", "hateful"], true, slave.devotion);
-		} else if (slave.devotion < -50) {
-			makeSpan(c, "Hate", ["devotion", "hateful"], true, slave.devotion);
-		} else if (slave.devotion < -20) {
-			makeSpan(c, "Res", ["devotion", "resistant"], true, slave.devotion);
-		} else if (slave.devotion <= 20) {
-			makeSpan(c, "Ambiv", ["devotion", "ambivalent"], true, slave.devotion);
-		} else if (slave.devotion <= 50) {
-			makeSpan(c, "Accept", ["devotion", "accept"], true, slave.devotion);
-		} else if (slave.devotion <= 95) {
-			makeSpan(c, "Devo", ["devotion", "devoted"], true, slave.devotion);
-		} else {
-			makeSpan(c, "Wor", ["devotion", "worship"], true, slave.devotion);
-		}
-		if (slave.fetish === "mindbroken") {
-			return;
-		} else if (slave.trust < -95) {
-			makeSpan(c, "ETerr", ["trust", "extremely-terrified"], true, slave.trust);
-		} else if (slave.trust < -50) {
-			makeSpan(c, "Terr", ["trust", "terrified"], true, slave.trust);
-		} else if (slave.trust < -20) {
-			makeSpan(c, "Fright", ["trust", "frightened"], true, slave.trust);
-		} else if (slave.trust <= 20) {
-			makeSpan(c, "Fear", ["trust", "fearful"], true, slave.trust);
-		} else if (slave.trust <= 50) {
-			if (slave.devotion < -20) {
-				makeSpan(c, "Caref", ["defiant", "careful"], true, slave.trust);
-			} else {
-				makeSpan(c, "Caref", ["trust", "careful"], true, slave.trust);
-			}
-		} else if (slave.trust < 95) {
-			if (slave.devotion < -20) {
-				makeSpan(c, "Bold", ["defiant", "bold"], true, slave.trust);
-			} else {
-				makeSpan(c, "Trust", ["trust", "trusting"], true, slave.trust);
-			}
-		} else {
-			if (slave.devotion < -20) {
-				makeSpan(c, "Defiant", ["defiant", "full"], true, slave.trust);
-			} else {
-				makeSpan(c, "VTrust", ["trust", "prof-trusting"], true, slave.trust);
-			}
-		}
-	}
-
-	/**
-	 * @param {App.Entity.SlaveState} slave
-	 * @param {Node} c
-	 * @returns {void}
-	 */
-	function long_devotion(slave, c) {
-		if (slave.fetish === "mindbroken") {
-			makeSpan(c, "Mindbroken.", "mindbroken");
-		} else if (slave.devotion < -95) {
-			makeSpan(c, "Very hateful", ["devotion", "hateful"], true, slave.devotion);
-		} else if (slave.devotion < -50) {
-			makeSpan(c, "Hateful", ["devotion", "hateful"], true, slave.devotion);
-		} else if (slave.devotion < -20) {
-			makeSpan(c, "Resistant", ["devotion", "resistant"], true, slave.devotion);
-		} else if (slave.devotion <= 20) {
-			makeSpan(c, "Ambivalent", ["devotion", "ambivalent"], true, slave.devotion);
-		} else if (slave.devotion <= 50) {
-			makeSpan(c, "Accepting", ["devotion", "accept"], true, slave.devotion);
-		} else if (slave.devotion <= 95) {
-			makeSpan(c, "Devoted", ["devotion", "devoted"], true, slave.devotion);
-		} else {
-			makeSpan(c, "Worshipful", ["devotion", "worship"], true, slave.devotion);
-		}
-		if (slave.fetish === "mindbroken") {
-			return;
-		} else if (slave.trust < -95) {
-			makeSpan(c, "Extremely terrified", ["trust", "extremely-terrified"], true, slave.trust);
-		} else if (slave.trust < -50) {
-			makeSpan(c, "Terrified", ["trust", "terrified"], true, slave.trust);
-		} else if (slave.trust < -20) {
-			makeSpan(c, "Frightened", ["trust", "frightened"], true, slave.trust);
-		} else if (slave.trust <= 20) {
-			makeSpan(c, "Fearful", ["trust", "fearful"], true, slave.trust);
-		} else if (slave.trust <= 50) {
-			if (slave.devotion < -20) {
-				makeSpan(c, "Careful", ["defiant", "careful"], true, slave.trust);
-			} else {
-				makeSpan(c, "Careful", ["trust", "careful"], true, slave.trust);
-			}
-		} else if (slave.trust <= 95) {
-			if (slave.devotion < -20) {
-				makeSpan(c, "Bold", ["defiant", "bold"], true, slave.trust);
-			} else {
-				makeSpan(c, "Trusting", ["trust", "trusting"], true, slave.trust);
-			}
-		} else {
-			if (slave.devotion < -20) {
-				makeSpan(c, "Defiant", ["defiant", "full"], true, slave.trust);
-			} else {
-				makeSpan(c, "Profoundly trusting", ["trust", "prof-trusting"], true, slave.trust);
-			}
-		}
-	}
-
-	/**
-	 * @param {App.Entity.SlaveState} slave
-	 * @param {Node} c
-	 * @returns {void}
-	 */
-	function short_rules(slave, c) {
-		const styles = "strong";
-		switch (slave.rules.living) {
-			case "luxurious":
-				makeSpan(c, "LS:Lux", styles);
-				break;
-			case "normal":
-				makeSpan(c, "LS:Nor", styles);
-				break;
-			default:
-				makeSpan(c, "LS:Spa", styles);
-				break;
-		}
-		if (canTalk(slave, false)) {
-			switch (slave.rules.speech) {
-				case "permissive":
-					makeSpan(c, "SpR:P", styles);
-					break;
-				case "accent elimination":
-					makeSpan(c, "SpR:NoAcc", styles);
-					break;
-				case "language lessons":
-					makeSpan(c, "SpR:LL", styles);
-					break;
-				default:
-					makeSpan(c, "SpR:R", styles);
-					break;
-			}
-		}
-		switch (slave.rules.relationship) {
-			case "permissive":
-				makeSpan(c, "ReR:P", styles);
-				break;
-			case "just friends":
-				makeSpan(c, "ReR:Fr", styles);
-				break;
-			default:
-				makeSpan(c, "ReR:R", styles);
-				break;
-		}
-		switch (slave.rules.punishment) {
-			case "confinement":
-				makeSpan(c, "Pun:Conf", styles);
-				break;
-			case "whipping":
-				makeSpan(c, "Pun:Whip", styles);
-				break;
-			case "chastity":
-				makeSpan(c, "Pun:Chas", styles);
-				break;
-			default:
-				makeSpan(c, "Pun:Situ", styles);
-				break;
-		}
-		switch (slave.rules.reward) {
-			case "relaxation":
-				makeSpan(c, "Rew:Relx", styles);
-				break;
-			case "drugs":
-				makeSpan(c, "Rew:Drug", styles);
-				break;
-			case "orgasm":
-				makeSpan(c, "Rew:Orga", styles);
-				break;
-			default:
-				makeSpan(c, "Rew:Situ", styles);
-				break;
-		}
-		makeSpan(c, "MaR:" + App.Utils.releaseSummaryShort(slave), styles);
-	}
-
-	/**
-	 * @param {App.Entity.SlaveState} slave
-	 * @param {Node} c
-	 * @returns {void}
-	 */
-	function long_rules(slave, c) {
-		addText(c, `Living standard: ${slave.rules.living}. `);
-		if (canTalk(slave, false)) {
-			addText(c, `Speech rules: ${slave.rules.speech}. `);
-		}
-		addText(c, `Relationship rules: ${slave.rules.relationship}. `);
-		addText(c, `Typical punishment: ${slave.rules.punishment}. `);
-		addText(c, `Typical reward: ${slave.rules.reward}. `);
-		addText(c, `Release rules: ${App.Utils.releaseSummaryLong(slave)}. `);
-	}
-
-	/**
-	 * @param {App.Entity.SlaveState} slave
-	 * @param {Node} c
-	 * @returns {void}
-	 */
-	function short_weight(slave, c) {
-		if (slave.weight < -95) {
-			makeSpan(c, "W---", ["red", "strong"], true, slave.weight);
-		} else if (slave.weight < -30) {
-			if (slave.hips < -1) {
-				makeSpan(c, "W--", "strong", true, slave.weight);
-			} else {
-				makeSpan(c, "W--", ["red", "strong>"], true, slave.weight);
-			}
-		} else if (slave.weight < -10) {
-			makeSpan(c, "W-", "strong", true, slave.weight);
-		} else if (slave.weight <= 10) {
-			makeSpan(c, "W", "strong", true, slave.weight);
-		} else if (slave.weight <= 30) {
-			makeSpan(c, "W+", "strong", true, slave.weight);
-		} else if (slave.weight <= 95) {
-			if (slave.hips > 1 || V.arcologies[0].FSHedonisticDecadence !== "unset") {
-				makeSpan(c, "W++", "strong", true, slave.weight);
-			} else {
-				makeSpan(c, "W++", ["red", "strong"], true, slave.weight);
-			}
-		} else if (slave.weight <= 130) {
-			if (slave.hips > 2 || V.arcologies[0].FSHedonisticDecadence !== "unset") {
-				makeSpan(c, "W+++", "strong", true, slave.weight);
-			} else {
-				makeSpan(c, "W+++", ["red", "strong"], true, slave.weight);
-			}
-		} else if (slave.weight <= 160) {
-			if (V.arcologies[0].FSHedonisticDecadence !== "unset") {
-				makeSpan(c, "W++++", "strong", true, slave.weight);
-			} else {
-				makeSpan(c, "W++++", ["red", "strong"], true, slave.weight);
-			}
-		} else if (slave.weight <= 190) {
-			if (V.arcologies[0].FSHedonisticDecadence !== "unset") {
-				makeSpan(c, "W+++++", "strong", true, slave.weight);
-			} else {
-				makeSpan(c, "W+++++", ["red", "strong"], true, slave.weight);
-			}
-		} else {
-			if (V.arcologies[0].FSHedonisticDecadence !== "unset") {
-				makeSpan(c, "W++++++", "strong", true, slave.weight);
-			} else {
-				makeSpan(c, "W++++++", ["red", "strong"], true, slave.weight);
-			}
-		}
-	}
-
-	/**
-	 * @param {App.Entity.SlaveState} slave
-	 * @param {Node} c
-	 * @returns {void}
-	 */
-	function long_weight(slave, c) {
-		if (slave.weight < -95) {
-			makeSpan(c, "Emaciated", "red", true, slave.weight);
-		} else if (slave.weight < -30) {
-			if (slave.hips < -1) {
-				makeSpan(c, "Model-thin", null, true, slave.weight);
-			} else {
-				makeSpan(c, "Very thin", "red", true, slave.weight);
-			}
-		} else if (slave.weight < -10) {
-			makeSpan(c, "Thin", null, true, slave.weight);
-		} else if (slave.weight <= 10) {
-			makeSpan(c, "Trim", null, true, slave.weight);
-		} else if (slave.weight <= 30) {
-			makeSpan(c, "Plush", null, true, slave.weight);
-		} else if (slave.weight <= 95) {
-			if (slave.hips > 1 || V.arcologies[0].FSHedonisticDecadence !== "unset") {
-				makeSpan(c, "Nicely chubby", null, true, slave.weight);
-			} else {
-				makeSpan(c, "Overweight", "red", true, slave.weight);
-			}
-		} else if (slave.weight <= 130) {
-			if (slave.hips > 2 || V.arcologies[0].FSHedonisticDecadence !== "unset") {
-				makeSpan(c, "Pleasantly soft and shapely", null, true, slave.weight);
-			} else {
-				makeSpan(c, "Fat", "red", true, slave.weight);
-			}
-		} else if (slave.weight <= 160) {
-			if (V.arcologies[0].FSHedonisticDecadence !== "unset") {
-				makeSpan(c, "Amazingly voluptuous", null, true, slave.weight);
-			} else {
-				makeSpan(c, "Obese", "red", true, slave.weight);
-			}
-		} else if (slave.weight <= 190) {
-			if (V.arcologies[0].FSHedonisticDecadence !== "unset") {
-				makeSpan(c, "SSBBW", null, true, slave.weight);
-			} else {
-				makeSpan(c, "Super Obese", "red", true, slave.weight);
-			}
-		} else {
-			if (V.arcologies[0].FSHedonisticDecadence !== "unset") {
-				makeSpan(c, "Perfectly massive", null, true, slave.weight);
-			} else {
-				makeSpan(c, "Dangerously Obese", "red", true, slave.weight);
-			}
-		}
-	}
-
-	/**
-	 * @param {App.Entity.SlaveState} slave
-	 * @param {Node} c
-	 * @returns {void}
-	 */
-	function short_diet(slave, c) {
-		let diet = makeSpan(null, "", ["teal", "strong"]);
-		switch (slave.diet) {
-			case "restricted":
-				diet.textContent = "Di:W-";
-				break;
-			case "fattening":
-				diet.textContent = "Di:W+";
-				break;
-			case "corrective":
-				diet.textContent = "Di:W=";
-				break;
-			case "XX":
-				diet.textContent = "Di:XX+";
-				break;
-			case "XY":
-				diet.textContent = "Di:XY+";
-				break;
-			case "XXY":
-				diet.textContent = "Di:XXY+";
-				break;
-			case "muscle building":
-				diet.textContent = "Di:M+";
-				break;
-			case "slimming":
-				diet.textContent = "Di:M-";
-				break;
-			case "cum production":
-				diet.textContent = "Di:C+";
-				break;
-			case "cleansing":
-				diet.textContent = "Di:H+";
-				break;
-			case "fertility":
-				diet.textContent = "Di:F+";
-				break;
-		}
-		if (diet.textContent.length > 0) {
-			c.appendChild(diet);
-		}
-		let specialDiet = makeSpan(null, "", ["cyan", "strong"]);
-		if (slave.dietCum === 2) {
-			specialDiet.textContent = "Cum++";
-		} else if (((slave.dietCum === 1) && (slave.dietMilk === 0))) {
-			specialDiet.textContent = "Cum+";
-		} else if (((slave.dietCum === 1) && (slave.dietMilk === 1))) {
-			specialDiet.textContent = "Cum+ Milk+";
-		} else if (((slave.dietCum === 0) && (slave.dietMilk === 1))) {
-			specialDiet.textContent = "Milk+";
-		} else if ((slave.dietMilk === 2)) {
-			specialDiet.textContent = ">Milk++";
-		}
-		if (specialDiet.textContent.length > 0) {
-			c.appendChild(specialDiet);
-		}
-	}
-
-	/**
-	 * @param {App.Entity.SlaveState} slave
-	 * @param {Node} c
-	 * @returns {void}
-	 */
-	function long_diet(slave, c) {
-		let dietDesc = "";
-		switch (slave.diet) {
-			case "restricted":
-				dietDesc = `Dieting.`;
-				break;
-			case "fattening":
-				dietDesc = `Gaining weight.`;
-				break;
-			case "corrective":
-				dietDesc = `Corrective.`;
-				break;
-			case "XX":
-				dietDesc = `Estrogen rich.`;
-				break;
-			case "XY":
-				dietDesc = `Testosterone rich.`;
-				break;
-			case "XXY":
-				dietDesc = `Futanari mix.`;
-				break;
-			case "muscle building":
-				dietDesc = `Pumping iron.`;
-				break;
-			case "slimming":
-				dietDesc = `Slimming down.`;
-				break;
-			case "cum production":
-				dietDesc = `Cum production.`;
-				break;
-			case "cleansing":
-				dietDesc = `Cleansing.`;
-				break;
-			case "fertility":
-				dietDesc = `Fertility.`;
-				break;
-		}
-
-		if (dietDesc) {
-			makeSpan(c, dietDesc, "teal");
-		}
-
-		function specialDiet(text) {
-			addText(c, "Diet base: ");
-			makeSpan(c, text, "cyan");
-		}
-
-		if (slave.dietCum === 2) {
-			specialDiet("Cum Based.");
-		} else if (((slave.dietCum === 1) && (slave.dietMilk === 0))) {
-			specialDiet("Cum Added.");
-		} else if (((slave.dietCum === 1) && (slave.dietMilk === 1))) {
-			specialDiet("Milk & Cum Added.");
-		} else if (((slave.dietCum === 0) && (slave.dietMilk === 1))) {
-			specialDiet("Milk Added.");
-		} else if ((slave.dietMilk === 2)) {
-			specialDiet("Milk Based.");
-		}
-	}
-
-	/**
-	 * @param {App.Entity.SlaveState} slave
-	 * @param {Node} c
-	 * @returns {void}
-	 */
-	function short_health(slave, c) {
-		if (slave.health.health < -20) {
-			makeSpan(c, "H", ["red", "strong"], true, slave.health.health);
-		} else if (slave.health.health <= 20) {
-			makeSpan(c, "H", ["yellow", "strong"], true, slave.health.health);
-		} else if (slave.health.health > 20) {
-			makeSpan(c, "H", ["green", "strong"], true, slave.health.health);
-		}
-		if (passage() === "Clinic" && V.clinicUpgradeScanner) {
-			if (slave.chem > 15) {
-				makeSpan(c, `C${Math.ceil(slave.chem/10)}`, ["cyan", "strong"]);
-			} else if (slave.chem <= 15 && slave.assignment === "get treatment in the clinic") {
-				makeSpan(c, `CSafe`, ["green", "strong"]);
-			}
-		}
-	}
-
-	/**
-	 * @param {App.Entity.SlaveState} slave
-	 * @param {Node} c
-	 * @returns {void}
-	 */
-	function long_health(slave, c) {
-		if (slave.health.health < -90) {
-			makeSpan(c, "On the edge of death", ["red", "strong"], true, slave.health.health);
-		} else if (slave.health.health < -50) {
-			makeSpan(c, "Extremely unhealthy", ["red", "strong"], true, slave.health.health);
-		} else if (slave.health.health < -20) {
-			makeSpan(c, "Unhealthy", ["red", "strong"], true, slave.health.health);
-		} else if (slave.health.health <= 20) {
-			makeSpan(c, "healthy", "yellow", true, slave.health.health);
-		} else if (slave.health.health <= 50) {
-			makeSpan(c, "Very healthy", "green", true, slave.health.health);
-		} else if (slave.health.health <= 90) {
-			makeSpan(c, "Extremely healthy", "green", true, slave.health.health);
-		} else {
-			makeSpan(c, "Unnaturally healthy", "green", true, slave.health.health);
-		}
-		if (passage() === "Clinic" && V.clinicUpgradeScanner) {
-			if (slave.chem > 15) {
-				makeSpan(c, `Carcinogen buildup: ${Math.ceil(slave.chem/10)}.`, "cyan");
-			} else if (slave.chem <= 15 && slave.assignment === "get treatment in the clinic") {
-				makeSpan(c, `Safe chem levels.`, "green");
-			}
-		}
-	}
-
-	function short_illness(slave, c) {
-		if (slave.health.illness > 4) {
-			makeSpan(c, `Ill${slave.health.illness}`, ["red", "strong"], true, slave.health.illness);
-		} else if (slave.health.illness > 3) {
-			makeSpan(c, `Ill${slave.health.illness}`, ["red", "strong"], true, slave.health.illness);
-		} else if (slave.health.illness > 2) {
-			makeSpan(c, `Ill${slave.health.illness}`, ["red", "strong"], true, slave.health.illness);
-		} else if (slave.health.illness > 0) {
-			makeSpan(c, `Ill${slave.health.illness}`, ["yellow", "strong"], true, slave.health.illness);
-		}
-	}
-
-	function long_illness(slave, c) {
-		if (slave.health.illness > 4) {
-			makeSpan(c, "Terribly ill", ["red", "strong"], true, slave.health.illness);
-		} else if (slave.health.illness > 3) {
-			makeSpan(c, "Very ill", ["red", "strong"], true, slave.health.illness);
-		} else if (slave.health.illness > 2) {
-			makeSpan(c, "Ill", ["red", "strong"], true, slave.health.illness);
-		} else if (slave.health.illness > 0) {
-			makeSpan(c, "Sick", "yellow", true, slave.health.illness);
-		}
-	}
-
-	function short_tired(slave, c) {
-		if (slave.health.tired > 90) {
-			makeSpan(c, "Exh", ["red", "strong"], true, slave.health.tired);
-		} else if (slave.health.tired > 60) {
-			makeSpan(c, "Tir+", "orange", true, slave.health.tired);
-		} else if (slave.health.tired > 30) {
-			makeSpan(c, "Tir", "yellow", true, slave.health.tired);
-		} else if (slave.health.tired < 0) {
-			makeSpan(c, "Ene", "green", true, slave.health.tired);
-		}
-	}
-
-	function long_tired(slave, c) {
-		if (slave.health.tired > 90) {
-			makeSpan(c, "Exhausted", ["red", "strong"], true, slave.health.tired);
-		} else if (slave.health.tired > 60) {
-			makeSpan(c, "Fatigued", "orange", true, slave.health.tired);
-		} else if (slave.health.tired > 30) {
-			makeSpan(c, "Tired", "yellow", true, slave.health.tired);
-		} else if (slave.health.tired < 0) {
-			makeSpan(c, "Energetic", "green", true, slave.health.tired);
-		}
-	}
-
-	/**
-	 * @param {App.Entity.SlaveState} slave
-	 * @param {Node} c
-	 * @returns {void}
-	 */
-	function short_drugs(slave, c) {
-		let drugDesc = "";
-		switch (slave.drugs) {
-			case "breast injections":
-				drugDesc = "Boobs+";
-				break;
-			case "intensive breast injections":
-				drugDesc = "Boobs++";
-				break;
-			case "hyper breast injections":
-				drugDesc = "Boobs+++";
-				break;
-			case "nipple enhancers":
-				drugDesc = "Nipple+";
-				break;
-			case "butt injections":
-				drugDesc = "Butt+";
-				break;
-			case "intensive butt injections":
-				drugDesc = "Butt++";
-				break;
-			case "hyper butt injections":
-				drugDesc = "Butt+++";
-				break;
-			case "lip injections":
-				drugDesc = "Lip+";
-				break;
-			case "fertility drugs":
-				drugDesc = "Fert+";
-				break;
-			case "super fertility drugs":
-				drugDesc = "Fert++";
-				break;
-			case "penis enhancement":
-				drugDesc = "Dick+";
-				break;
-			case "intensive penis enhancement":
-				drugDesc = "Dick++";
-				break;
-			case "hyper penis enhancement":
-				drugDesc = "Dick+++";
-				break;
-			case "testicle enhancement":
-				drugDesc = "Balls+";
-				break;
-			case "intensive testicle enhancement":
-				drugDesc = "Balls++";
-				break;
-			case "hyper testicle enhancement":
-				drugDesc = "Balls+++";
-				break;
-			case "psychosuppressants":
-				drugDesc = "Psych-";
-				break;
-			case "psychostimulants":
-				drugDesc = "Psych+";
-				break;
-			case "steroids":
-				drugDesc = "Ster";
-				break;
-			case "female hormone injections":
-				drugDesc = "HormXX++";
-				break;
-			case "male hormone injections":
-				drugDesc = "HormXY++";
-				break;
-			case "hormone enhancers":
-				drugDesc = "Horm+";
-				break;
-			case "hormone blockers":
-				drugDesc = "Horm-";
-				break;
-			case "anti-aging cream":
-				drugDesc = "Age-";
-				break;
-			case "appetite suppressors":
-				drugDesc = "ApSup";
-				break;
-			case "penis atrophiers":
-				drugDesc = "Dick-";
-				break;
-			case "testicle atrophiers":
-				drugDesc = "Balls-";
-				break;
-			case "clitoris atrophiers":
-				drugDesc = "Clit-";
-				break;
-			case "labia atrophiers":
-				drugDesc = "Labia-";
-				break;
-			case "nipple atrophiers":
-				drugDesc = "Nipple-";
-				break;
-			case "lip atrophiers":
-				drugDesc = "Lip-";
-				break;
-			case "breast redistributors":
-				drugDesc = "Breast-";
-				break;
-			case "butt redistributors":
-				drugDesc = "Butt-";
-				break;
-			case "sag-B-gone":
-				drugDesc = "AntiSag";
-				break;
-			case "growth stimulants":
-				drugDesc = "GroStim";
-				break;
-			case "priapism agents":
-				drugDesc = "Erection";
-				break;
-		}
-		if (drugDesc) {
-			makeSpan(c, "Dr:" + drugDesc, ["tan", "strong"]);
-		}
-		if (slave.curatives === 2) {
-			makeSpan(c, "Cura", ["lightgreen", "strong"]);
-		} else if (slave.curatives === 1) {
-			makeSpan(c, "Prev", ["lightgreen", "strong"]);
-		}
-		if (slave.aphrodisiacs !== 0) {
-			if (slave.aphrodisiacs === 1) {
-				makeSpan(c, "Aph", ["lightblue", "strong"]);
-			} else if (slave.aphrodisiacs === 2) {
-				makeSpan(c, "Aph++", ["lightblue", "strong"]);
-			} else {
-				makeSpan(c, "Anaph", ["lightblue", "strong"]);
-			}
-		}
-		if (slave.addict !== 0) {
-			makeSpan(c, "Add", "cyan");
-		}
-		let styles = ["lightsalmon", "strong"];
-		if (slave.hormones > 1) {
-			makeSpan(c, "Ho:F+", styles);
-		} else if (slave.hormones > 0) {
-			makeSpan(c, "Ho:F", styles);
-		} else if (slave.hormones < -1) {
-			makeSpan(c, "Ho:M+", styles);
-		} else if (slave.hormones < 0) {
-			makeSpan(c, "Ho:M", styles);
-		}
-
-		styles = ["mediumseagreen", "strong"];
-		if ((slave.bellyImplant > -1)) {
-			makeSpan(c, "Belly Imp", styles);
-		} else if (((slave.preg <= -2) || (slave.ovaries === 0)) && (slave.vagina !== -1)) {
-			makeSpan(c, "Barr", styles);
-		} else if (slave.pubertyXX === 0 && (slave.ovaries === 1 || slave.mpreg === 1)) {
-			makeSpan(c, "Prepub", styles);
-		} else if (slave.ovaryAge >= 47 && (slave.ovaries === 1 || slave.mpreg === 1)) {
-			makeSpan(c, "Meno", styles);
-		} else if (slave.pregWeek < 0) {
-			makeSpan(c, "Postpartum", styles);
-		} else if (slave.preg === -1) {
-			makeSpan(c, "CC", styles);
-		} else if (slave.preg === 0 && (slave.ovaries === 1 || slave.mpreg === 1)) {
-			makeSpan(c, "Fert+", styles);
-		} else if (((slave.preg < slave.pregData.normalBirth / 10) && (slave.preg > 0) && slave.pregKnown === 0) || slave.pregWeek === 1) {
-			makeSpan(c, "Preg?", styles);
-		} else if ((slave.preg >= 36) && (slave.broodmother > 0)) {
-			makeSpan(c, "Perm preg", styles);
-		} else if (slave.pregKnown === 1) {
-			makeSpan(c, `${slave.pregWeek} wks preg`, styles);
-		}
-		if (slave.induce === 1) {
-			makeSpan(c, "Early Labor", ["orange", "strong"]);
-		}
-		if (slave.pubertyXY === 0 && slave.balls > 0) {
-			makeSpan(c, "Prepub balls", "strong");
-		}
-		if (slave.balls > 0 && slave.vasectomy === 1) {
-			makeSpan(c, "Vasect", "strong");
-		}
-		styles = ["springgreen", "strong"];
-		if (slave.inflation === 3) {
-			makeSpan(c, `8 ltr ${slave.inflationType}`, styles);
-		} else if (slave.inflation === 2) {
-			makeSpan(c, `4 ltr ${slave.inflationType}`, styles);
-		} else if (slave.inflation === 1) {
-			makeSpan(c, `2 ltr ${slave.inflationType}`, styles);
-		} else if (slave.bellyFluid > 0) {
-			makeSpan(c, `${slave.bellyFluid}ccs ${slave.inflationType}`, styles);
-		}
-	}
-
-	/**
-	 * @param {App.Entity.SlaveState} slave
-	 * @param {Node} c
-	 * @returns {void}
-	 */
-	function long_drugs(slave, c) {
-		let swd = WombGetLittersData(slave);
-		if ((slave.drugs !== "no drugs") && (slave.drugs !== "none")) {
-			makeSpan(c, `On ${slave.drugs}.`, "tan");
-		}
-		if (slave.curatives === 2) {
-			makeSpan(c, "On curatives.", "lightgreen");
-		} else if (slave.curatives === 1) {
-			makeSpan(c, "On preventatives.", "lightgreen");
-		}
-		if (slave.aphrodisiacs > 0) {
-			makeSpan(c, `On ${slave.aphrodisiacs > 1 ? 'extreme' : ''} aphrodisiacs.`, "lightblue");
-		} else if (slave.aphrodisiacs === -1) {
-			makeSpan(c, "On anaphrodisiacs.", "lightblue");
-		}
-		if (slave.addict !== 0) {
-			makeSpan(c, "Addict.", "cyan");
-		}
-		if (slave.hormones > 1) {
-			makeSpan(c, "Heavy female hormones.", "lightsalmon");
-		} else if (slave.hormones > 0) {
-			makeSpan(c, "Female hormones.", "lightsalmon");
-		} else if (slave.hormones < -1) {
-			makeSpan(c, "Heavy male hormones.", "lightsalmon");
-		} else if (slave.hormones < 0) {
-			makeSpan(c, "Male hormones.", "lightsalmon");
-		}
-		let styles = "mediumseagreen";
-		if ((slave.bellyImplant > -1)) {
-			makeSpan(c, "Belly Implant.", styles);
-		} else if ((slave.preg <= -2) && (slave.ovaries === 1 || slave.mpreg === 1)) {
-			makeSpan(c, "Barren.", styles);
-		} else if ((slave.ovaries === 0) && (slave.vagina !== -1) && (slave.genes === "XX")) {
-			makeSpan(c, "Barren.", styles);
-		} else if (slave.pubertyXX === 0 && (slave.ovaries === 1 || slave.mpreg === 1)) {
-			makeSpan(c, "Not ovulating yet.", styles);
-		} else if (slave.ovaryAge >= 47 && (slave.ovaries === 1 || slave.mpreg === 1)) {
-			makeSpan(c, "Menopausal.", styles);
-		} else if (slave.pregWeek < 0) {
-			makeSpan(c, "Postpartum.", styles);
-		} else if (slave.preg === -1) {
-			makeSpan(c, "On contraceptives.", styles);
-		} else if (slave.preg === 0 && (slave.ovaries === 1 || slave.mpreg === 1)) {
-			makeSpan(c, "Fertile.", styles);
-		} else if ((slave.preg >= 36) && (slave.broodmother > 0)) {
-			makeSpan(c, "Permanently pregnant.", styles);
-		} else if (swd.litters.length > 1) {
-			let pregTxt = `Concurrent pregnancies: (${swd.litters.length} sets).`;
-			pregTxt += ` Max:${swd.litters[0]} / Min:${swd.litters[swd.litters.length-1]} week(s).`;
-			makeSpan(c, pregTxt, "lime");
-		} else if (((slave.preg < slave.pregData.normalBirth / 10) && (slave.preg > 0) && slave.pregKnown === 0) || slave.pregWeek === 1) {
-			makeSpan(c, "May be pregnant.");
-		} else if (slave.pregKnown === 1) {
-			if (slave.pregType < 2 || slave.broodmother > 0) {
-				makeSpan(c, `${slave.pregWeek} weeks pregnant.`);
-			} else {
-				let desc = `${slave.pregWeek} weeks pregnant with `;
-				if (slave.pregType >= 40) {
-					desc += `a tremendous brood of offspring.`;
-				} else if (slave.pregType >= 20) {
-					desc += `a brood of offspring.`;
-				} else if (slave.pregType >= 10) {
-					desc += `${slave.pregType} babies.`;
-				} else if (slave.pregType === 9) {
-					desc += `nonuplets.`;
-				} else if (slave.pregType === 8) {
-					desc += `octuplets.`;
-				} else if (slave.pregType === 7) {
-					desc += `septuplets.`;
-				} else if (slave.pregType === 6) {
-					desc += `sextuplets.`;
-				} else if (slave.pregType === 5) {
-					desc += `quintuplets.`;
-				} else if (slave.pregType === 4) {
-					desc += `quadruplets.`;
-				} else if (slave.pregType === 3) {
-					desc += `triplets.`;
-				} else {
-					desc += `twins.`;
-				}
-				makeSpan(c, desc);
-			}
-			if (slave.preg > slave.pregData.normalBirth && slave.broodmother === 0) {
-				makeSpan(c, "(Overdue.)");
-			}
-		}
-		if (slave.induce === 1) {
-			makeSpan(c, "Showing signs of early labor.", "orange");
-		}
-		if (slave.pubertyXY === 0 && slave.balls > 0) {
-			makeSpan(c, "Has not had first ejaculation.");
-		}
-		if (slave.balls > 0 && slave.vasectomy === 1) {
-			makeSpan(c, "Vasectomy.");
-		}
-		if (slave.inflation === 3) {
-			makeSpan(c, `Filled with 8 liters of ${slave.inflationType}.`, "springgreen");
-		} else if (slave.inflation === 2) {
-			makeSpan(c, `Filled with 4 liters of ${slave.inflationType}.`, "springgreen");
-		} else if (slave.inflation === 1) {
-			makeSpan(c, `Filled with 2 liters of ${slave.inflationType}.`, "springgreen");
-		} else if (slave.bellyFluid > 0) {
-			makeSpan(c, `Stuffed with ${slave.bellyFluid}ccs of ${slave.inflationType}.`, "springgreen");
-		}
-	}
-
-	/**
-	 * @param {App.Entity.SlaveState} slave
-	 * @returns {string}
-	 */
-	function long_race(slave) {
-		switch (slave.race) {
-			case "white":
-				return `Caucasian.`;
-			case "asian":
-				return `Asian.`;
-			case "indo-aryan":
-				return `Indo-aryan.`;
-			case "latina":
-				return `Latina.`;
-			case "middle eastern":
-				return `Middle Eastern.`;
-			case "black":
-				return `Black.`;
-			case "pacific islander":
-				return `Pacific Islander.`;
-			case "malay":
-				return `Malay.`;
-			case "amerindian":
-				return `Amerindian.`;
-			case "semitic":
-				return `Semitic.`;
-			case "southern european":
-				return `Southern European.`;
-			case "mixed race":
-				return `Mixed race.`;
-			default:
-				return `${slave.race.charAt(0).toUpperCase() + slave.race.slice(1)}.`;
-		}
-	}
-
-	/**
-	 * @param {App.Entity.SlaveState} slave
-	 * @returns {string}
-	 */
-	function short_race(slave) {
-		switch (slave.race) {
-			case "white":
-				return `C`;
-			case "asian":
-				return `A`;
-			case "indo-aryan":
-				return `I`;
-			case "latina":
-				return `L`;
-			case "middle eastern":
-				return `ME`;
-			case "black":
-				return `B`;
-			case "pacific islander":
-				return `PI`;
-			case "malay":
-				return `M`;
-			case "amerindian":
-				return `AI`;
-			case "semitic":
-				return `S`;
-			case "southern european":
-				return `SE`;
-			case "mixed race":
-				return `MR`;
-			default:
-				return `${slave.race.charAt(0).toUpperCase() + slave.race.charAt(1) + slave.race.charAt(2)}`;
-		}
-	}
-
-	/**
-	 * @param {App.Entity.SlaveState} slave
-	 * @returns {string}
-	 */
-	function short_nationality(slave) {
-		switch (slave.nationality) {
-			case "Afghan":
-				return "Afg";
-			case "Albanian":
-				return "Alb";
-			case "Algerian":
-				return "Alg";
-			case "American":
-				return "USA";
-			case "Andorran":
-				return "And";
-			case "Angolan":
-				return "Ang";
-			case "Antiguan":
-				return "AB";
-			case "Argentinian":
-				return "Arg";
-			case "Armenian":
-				return "Arm";
-			case "Aruban":
-				return "Aru";
-			case "Australian":
-				return "Aus";
-			case "Austrian":
-				return "Aut";
-			case "Azerbaijani":
-				return "Aze";
-			case "Bahamian":
-				return "Bah";
-			case "Bahraini":
-				return "Bah";
-			case "Bangladeshi":
-				return "Bgd";
-			case "Barbadian":
-				return "Bar";
-			case "Belarusian":
-				return "Ber";
-			case "Belgian":
-				return "Bel";
-			case "Belizean":
-				return "Blz";
-			case "Beninese":
-				return "Ben";
-			case "Bermudian":
-				return "Bmd";
-			case "Bhutanese":
-				return "Bhu";
-			case "Bissau-Guinean":
-				return "GB";
-			case "Bolivian":
-				return "Bol";
-			case "Bosnian":
-				return "Bos";
-			case "Brazilian":
-				return "Bra";
-			case "British":
-				return "UK";
-			case "Bruneian":
-				return "Bru";
-			case "Bulgarian":
-				return "Bul";
-			case "Burkinabé":
-				return "BF";
-			case "Burmese":
-				return "Bur";
-			case "Burundian":
-				return "Bnd";
-			case "Cambodian":
-				return "Kam";
-			case "Cameroonian":
-				return "Cam";
-			case "Canadian":
-				return "Can";
-			case "Cape Verdean":
-				return "CV";
-			case "Catalan":
-				return "Cat";
-			case "Central African":
-				return "CAR";
-			case "Chadian":
-				return "Cha";
-			case "Chilean":
-				return "Chl";
-			case "Chinese":
-				return "Chi";
-			case "Colombian":
-				return "Col";
-			case "Comorian":
-				return "Com";
-			case "Congolese":
-				return "RC";
-			case "a Cook Islander":
-				return "CI";
-			case "Costa Rican":
-				return "CR";
-			case "Croatian":
-				return "Cro";
-			case "Cuban":
-				return "Cub";
-			case "Curaçaoan":
-				return "Cur";
-			case "Cypriot":
-				return "Cyp";
-			case "Czech":
-				return "Cze";
-			case "Danish":
-				return "Den";
-			case "Djiboutian":
-				return "Dji";
-			case "Dominican":
-				return "DR";
-			case "Dominiquais":
-				return "Dom";
-			case "Dutch":
-				return "Nld";
-			case "East Timorese":
-				return "ET";
-			case "Ecuadorian":
-				return "Ecu";
-			case "Egyptian":
-				return "Egy";
-			case "Emirati":
-				return "UAE";
-			case "Equatoguinean":
-				return "EG";
-			case "Eritrean":
-				return "Eri";
-			case "Estonian":
-				return "Est";
-			case "Ethiopian":
-				return "Eth";
-			case "Fijian":
-				return "Fij";
-			case "Filipina":
-				return "Phl";
-			case "Finnish":
-				return "Fin";
-			case "French":
-				return "Fra";
-			case "French Guianan":
-				return "FG";
-			case "French Polynesian":
-				return "FP";
-			case "Gabonese":
-				return "Gab";
-			case "Gambian":
-				return "Gam";
-			case "Georgian":
-				return "Geo";
-			case "German":
-				return "Ger";
-			case "Ghanan":
-				return "Gha";
-			case "Greek":
-				return "Gre";
-			case "Greenlandic":
-				return "Grn";
-			case "Grenadian":
-				return "Gda";
-			case "Guamanian":
-				return "Gua";
-			case "Guatemalan":
-				return "Gtm";
-			case "Guinean":
-				return "Gui";
-			case "Guyanese":
-				return "Guy";
-			case "Haitian":
-				return "Hai";
-			case "Honduran":
-				return "Hon";
-			case "Hungarian":
-				return "Hun";
-			case "I-Kiribati":
-				return "Kir";
-			case "Icelandic":
-				return "Ice";
-			case "Indian":
-				return "Ind";
-			case "Indonesian":
-				return "Idn";
-			case "Iranian":
-				return "Irn";
-			case "Iraqi":
-				return "Irq";
-			case "Irish":
-				return "Irl";
-			case "Israeli":
-				return "Isr";
-			case "Italian":
-				return "Ita";
-			case "Ivorian":
-				return "IC";
-			case "Jamaican":
-				return "Jam";
-			case "Japanese":
-				return "Jpn";
-			case "Jordanian":
-				return "Jor";
-			case "Kazakh":
-				return "Kaz";
-			case "Kenyan":
-				return "Ken";
-			case "Kittitian":
-				return "SKN";
-			case "Korean":
-				return "Kor";
-			case "Kosovan":
-				return "Kos";
-			case "Kurdish":
-				return "Kur";
-			case "Kuwaiti":
-				return "Kuw";
-			case "Kyrgyz":
-				return "Kyr";
-			case "Laotian":
-				return "Lao";
-			case "Latvian":
-				return "Lat";
-			case "Lebanese":
-				return "Lbn";
-			case "Liberian":
-				return "Lib";
-			case "Libyan":
-				return "Lby";
-			case "a Liechtensteiner":
-				return "Lie";
-			case "Lithuanian":
-				return "Lit";
-			case "Luxembourgian":
-				return "Lux";
-			case "Macedonian":
-				return "Mac";
-			case "Malagasy":
-				return "Mad";
-			case "Malawian":
-				return "Mwi";
-			case "Malaysian":
-				return "Mys";
-			case "Maldivian":
-				return "Mdv";
-			case "Malian":
-				return "Mal";
-			case "Maltese":
-				return "Mlt";
-			case "Marshallese":
-				return "MI";
-			case "Mauritanian":
-				return "Mta";
-			case "Mauritian":
-				return "Mts";
-			case "Mexican":
-				return "Mex";
-			case "Micronesian":
-				return "FSM";
-			case "Moldovan":
-				return "Mol";
-			case "Monégasque":
-				return "Mnc";
-			case "Mongolian":
-				return "Mon";
-			case "Montenegrin":
-				return "Mng";
-			case "Moroccan":
-				return "Mor";
-			case "Mosotho":
-				return "Les";
-			case "Motswana":
-				return "Bot";
-			case "Mozambican":
-				return "Moz";
-			case "Namibian":
-				return "Nam";
-			case "Nauruan":
-				return "Nau";
-			case "Nepalese":
-				return "Npl";
-			case "New Caledonian":
-				return "NC";
-			case "a New Zealander":
-				return "NZ";
-			case "Ni-Vanuatu":
-				return "Van";
-			case "Nicaraguan":
-				return "Nic";
-			case "Nigerian":
-				return "Nga";
-			case "Nigerien":
-				return "Ngr";
-			case "Niuean":
-				return "Niu";
-			case "Norwegian":
-				return "Nor";
-			case "Omani":
-				return "Omn";
-			case "Pakistani":
-				return "Pak";
-			case "Palauan":
-				return "Plu";
-			case "Palestinian":
-				return "Pal";
-			case "Panamanian":
-				return "Pan";
-			case "Papua New Guinean":
-				return "PNG";
-			case "Paraguayan":
-				return "Par";
-			case "Peruvian":
-				return "Per";
-			case "Polish":
-				return "Pol";
-			case "Portuguese":
-				return "Por";
-			case "Puerto Rican":
-				return "PR";
-			case "Qatari":
-				return "Qat";
-			case "Romanian":
-				return "Rom";
-			case "Russian":
-				return "Rus";
-			case "Rwandan":
-				return "Rwa";
-			case "Sahrawi":
-				return "Sah";
-			case "Saint Lucian":
-				return "SL";
-			case "Salvadoran":
-				return "ES";
-			case "Sammarinese":
-				return "SM";
-			case "Samoan":
-				return "Sam";
-			case "São Toméan":
-				return "STP";
-			case "Saudi":
-				return "Sau";
-			case "Scottish":
-				return "Sco";
-			case "Senegalese":
-				return "Sen";
-			case "Serbian":
-				return "Srb";
-			case "Seychellois":
-				return "Sey";
-			case "Sierra Leonean":
-				return "Sie";
-			case "Singaporean":
-				return "Sng";
-			case "Slovak":
-				return "Svk";
-			case "Slovene":
-				return "Svn";
-			case "a Solomon Islander":
-				return "SI";
-			case "Somali":
-				return "Som";
-			case "South African":
-				return "RSA";
-			case "South Sudanese":
-				return "SS";
-			case "Spanish":
-				return "Spa";
-			case "Sri Lankan":
-				return "Sri";
-			case "Sudanese":
-				return "Sud";
-			case "Surinamese":
-				return "Sur";
-			case "Swazi":
-				return "Swa";
-			case "Swedish":
-				return "Swe";
-			case "Swiss":
-				return "Swi";
-			case "Syrian":
-				return "Syr";
-			case "Taiwanese":
-				return "Tai";
-			case "Tajik":
-				return "Taj";
-			case "Tanzanian":
-				return "Tza";
-			case "Thai":
-				return "Tha";
-			case "Tibetan":
-				return "Tib";
-			case "Togolese":
-				return "Tog";
-			case "Tongan":
-				return "Ton";
-			case "Trinidadian":
-				return "TT";
-			case "Tunisian":
-				return "Tun";
-			case "Turkish":
-				return "Tur";
-			case "Turkmen":
-				return "Tkm";
-			case "Tuvaluan":
-				return "Tuv";
-			case "Ugandan":
-				return "Uga";
-			case "Ukrainian":
-				return "Ukr";
-			case "Uruguayan":
-				return "Uru";
-			case "Uzbek":
-				return "Uzb";
-			case "Vatican":
-				return "VC";
-			case "Venezuelan":
-				return "Ven";
-			case "Vietnamese":
-				return "Vnm";
-			case "Vincentian":
-				return "SVG";
-			case "Yemeni":
-				return "Yem";
-			case "Zairian":
-				return "DRC";
-			case "Zambian":
-				return "Zam";
-			case "Zimbabwean":
-				if (slave.race === "white") {
-					return `Rho`;
-				} else {
-					return `Zwe`;
-				}
-			case "Ancient Chinese Revivalist":
-				return `Chi Rev`;
-			case "Ancient Egyptian Revivalist":
-				return `Egy Rev`;
-			case "Arabian Revivalist":
-				return `Ara Rev`;
-			case "Aztec Revivalist":
-				return `Azt Rev`;
-			case "Edo Revivalist":
-				return `Edo Rev`;
-			case "Roman Revivalist":
-				return `Rom Rev`;
-			case "":
-			case "none":
-			case "slave":
-			case "Stateless":
-				return "None";
-			default:
-				return `${slave.nationality.charAt(0) + slave.nationality.charAt(1) + slave.nationality.charAt(2)}`;
-		}
-	}
-
-	/**
-	 * @param {App.Entity.SlaveState} slave
-	 * @returns {string}
-	 */
-	function long_nationality(slave) {
-		switch (slave.nationality) {
-			case "a Cook Islander":
-				return `Cook Islander.`;
-			case "a Liechtensteiner":
-				return `Liechtensteiner.`;
-			case "a New Zealander":
-				return `New Zealander.`;
-			case "a Solomon Islander":
-				return `Solomon Islander.`;
-			case "Zimbabwean":
-				if (slave.race === "white") {
-					return `Rhodesian.`;
-				} else {
-					return `${slave.nationality}.`;
-				}
-			case "slave":
-			case "none":
-			case "":
-			case "Stateless":
-				return `Stateless.`;
-			default:
-				return `${slave.nationality}.`;
-		}
-	}
-
-	/**
-	 * @param {App.Entity.SlaveState} slave
-	 * @returns {string}
-	 */
-	function short_skin(slave) {
-		switch (slave.skin) {
-			case "pure white":
-				return `P. Whi`;
-			case "extremely fair":
-				return `E. Fai`;
-			case "very fair":
-				return `V. Fai`;
-			case "extremely pale":
-				return `E. Pal`;
-			case "very pale":
-				return `V. Pal`;
-			case "light brown":
-				return `L. Br`;
-			case "dark brown":
-				return `D. Br`;
-			case "light olive":
-				return `L. Oli`;
-			case "dark olive":
-				return `D. Oli`;
-			case "light beige":
-				return `L. Bei`;
-			case "dark beige":
-				return `D. Bei`;
-			case "tan":
-				return `Tan`;
-			case "bronze":
-				return `Bron`;
-			case "ebony":
-				return `Ebon`;
-			case "pure black":
-				return `P. Bla`;
-			case "dark":
-			case "fair":
-			case "pale":
-				return `${slave.skin.charAt(0).toUpperCase() + slave.skin.slice(1)}`;
-			default:
-				return `${slave.skin.charAt(0).toUpperCase() + slave.skin.charAt(1) + slave.skin.charAt(2)}`;
-		}
-	}
-
-	/**
-	 * @param {App.Entity.SlaveState} slave
-	 * @param {Node} c
-	 * @returns {void}
-	 */
-	function short_genitals(slave, c) {
-		if (slave.dick > 0) {
-			let dickDesc = "";
-			if (slave.balls === 0) {
-				dickDesc += `Geld`;
-			}
-			if ((slave.dick > 8) && (slave.balls > 8)) {
-				dickDesc += `Junk+++`;
-			} else if ((slave.dick > 5) && (slave.balls > 5)) {
-				dickDesc += `Junk++`;
-			} else if ((slave.dick > 4) && (slave.balls > 4)) {
-				dickDesc += `Junk+`;
-			} else if ((slave.dick > 3) && (slave.balls > 3)) {
-				dickDesc += `Junk`;
-			} else if (slave.dick > 8) {
-				dickDesc += `Dick+++`;
-			} else if (slave.dick > 5) {
-				dickDesc += `Dick++`;
-			} else if (slave.dick > 4) {
-				dickDesc += `Dick+`;
-			} else if (slave.dick > 3) {
-				dickDesc += `Dick`;
-			} else if (slave.balls > 10) {
-				dickDesc += `Balls+++`;
-			} else if (slave.balls > 5) {
-				dickDesc += `Balls++`;
-			} else if (slave.balls > 4) {
-				dickDesc += `Balls+`;
-			} else if (slave.balls > 3) {
-				dickDesc += `Balls`;
-			}
-			if (dickDesc.length) {
-				makeSpan(c, dickDesc, "pink");
-			}
-		}
-		if (slave.vagina === 0) {
-			makeSpan(c, "VV", "lime");
-		} else if ((slave.pregKnown === 1) && canWalk(slave) && (slave.clothes === "no clothing" || slave.clothes === "body oil") && (slave.shoes === "none")) {
-			makeSpan(c, "NBP", "pink");
-		}
-		if (slave.anus === 0) {
-			makeSpan(c, "AV", "lime");
-		}
-		let holesDesc = "";
-		if ((slave.vagina > 3) && (slave.anus > 3)) {
-			holesDesc += `V++A++`;
-		} else if ((slave.vagina > 2) && (slave.anus > 2)) {
-			holesDesc += `V+A+`;
-		} else if (slave.vagina > 3) {
-			holesDesc += `V++`;
-		} else if (slave.vagina > 2) {
-			holesDesc += `V+`;
-		} else if (slave.anus > 3) {
-			holesDesc += `A++`;
-		} else if (slave.anus > 2) {
-			holesDesc += `A+`;
-		}
-		if (holesDesc.length) {
-			makeSpan(c, holesDesc, "pink");
-		}
-	}
-
-	/**
-	 * @param {App.Entity.SlaveState} slave
-	 * @param {Node} c
-	 * @returns {void}
-	 */
-	function long_genitals(slave, c) {
-		if (slave.dick > 0) {
-			let dickDesc = "";
-			if (slave.balls === 0) {
-				dickDesc += 'Gelded.';
-			}
-			if ((slave.dick > 8) && (slave.balls > 8)) {
-				dickDesc += `Hyper dick & balls.`;
-			} else if ((slave.dick > 5) && (slave.balls > 5)) {
-				dickDesc += `Monster dick & balls.`;
-			} else if ((slave.dick > 4) && (slave.balls > 4)) {
-				dickDesc = `Huge dick & balls.`;
-			} else if ((slave.dick > 3) && (slave.balls > 3)) {
-				dickDesc = `Big dick & balls.`;
-			} else if (slave.dick > 8) {
-				dickDesc = `Hyper dong.`;
-			} else if (slave.dick > 5) {
-				dickDesc = `Monster dong.`;
-			} else if (slave.dick > 4) {
-				dickDesc = `Huge dick.`;
-			} else if (slave.dick > 3) {
-				dickDesc = `Big dick.`;
-			} else if (slave.balls > 8) {
-				dickDesc = `Hyper balls.`;
-			} else if (slave.balls > 5) {
-				dickDesc = `Monstrous balls.`;
-			} else if (slave.balls > 4) {
-				dickDesc = `Huge balls.`;
-			} else if (slave.balls > 3) {
-				dickDesc = `Big balls.`;
-			}
-			if (dickDesc.length) {
-				makeSpan(c, dickDesc, "pink");
-			}
-		}
-		if (slave.vagina === 0) {
-			makeSpan(c, "Virgin.", "lime");
-		} else if ((slave.pregKnown === 1) && canWalk(slave) && (slave.clothes === "no clothing" || slave.clothes === "body oil") && (slave.shoes === "none")) {
-			makeSpan(c, "Naked, barefoot, and pregnant.", "pink");
-		}
-		if (slave.anus === 0) {
-			makeSpan(c, "Anal virgin.", "lime");
-		}
-		let holesDesc = "";
-		if ((slave.vagina > 3) && (slave.anus > 3)) {
-			holesDesc += `Blown out holes.`;
-		} else if ((slave.vagina > 2) && (slave.anus > 2)) {
-			holesDesc += `High mileage.`;
-		} else if (slave.vagina > 3) {
-			holesDesc += `Cavernous pussy.`;
-		} else if (slave.vagina > 2) {
-			holesDesc += `Loose pussy.`;
-		} else if (slave.anus > 3) {
-			holesDesc += `Permagaped anus.`;
-		} else if (slave.anus > 2) {
-			holesDesc += `Gaping anus.`;
-		}
-		if (holesDesc.length) {
-			makeSpan(c, holesDesc, "pink");
-		}
-	}
-
-	/**
-	 * @param {App.Entity.SlaveState} slave
-	 * @param {Node} c
-	 * @returns {void}
-	 */
-	function short_age(slave, c) {
-		let r = makeSpan(c, "", "pink");
-		if (V.showAgeDetail === 1) {
-			r.textContent += slave.actualAge.toString();
-		} else if (slave.actualAge >= 40) {
-			r.textContent += "40s";
-		} else if (slave.actualAge >= 35) {
-			r.textContent += "Lt30s";
-		} else if (slave.actualAge >= 30) {
-			r.textContent += "Ea30s";
-		} else if (slave.actualAge >= 25) {
-			r.textContent += "Lt20s";
-		} else if (slave.actualAge >= 20) {
-			r.textContent += "Ea20s";
-		} else if (slave.actualAge >= 18) {
-			r.textContent += slave.actualAge.toString();
-		}
-		if (slave.actualAge !== slave.physicalAge) {
-			r.textContent += ` w ${slave.physicalAge}y-bdy`;
-		}
-		if (slave.visualAge !== slave.physicalAge) {
-			r.textContent += ` Lks${slave.visualAge}`;
-		}
-	}
-
-	/**
-	 * @param {App.Entity.SlaveState} slave
-	 * @param {Node} c
-	 * @returns {void}
-	 */
-	function short_face(slave, c) {
-		if (slave.face < -95) {
-			makeSpan(c, "Face---", "red", true, slave.face);
-		} else if (slave.face < -40) {
-			makeSpan(c, "Face--", "red", true, slave.face);
-		} else if (slave.face < -10) {
-			makeSpan(c, "Face-", "red", true, slave.face);
-		} else if (slave.face <= 10) {
-			makeSpan(c, "Face", null, true, slave.face);
-		} else if (slave.face <= 40) {
-			makeSpan(c, "Face+", "pink", true, slave.face);
-		} else if (slave.face <= 95) {
-			makeSpan(c, "Face++", "pink", true, slave.face);
-		} else {
-			makeSpan(c, "Face+++", "pink", true, slave.face);
-		}
-	}
-
-	/**
-	 * @param {App.Entity.SlaveState} slave
-	 * @param {Node} c
-	 * @returns {void}
-	 */
-	function short_eyes(slave, c) {
-		if (!canSee(slave)) {
-			makeSpan(c, "Blind", "red");
-		} else if (!canSeePerfectly(slave)) {
-			makeSpan(c, "Sight-", "yellow");
-		}
-	}
-
-	/**
-	 * @param {App.Entity.SlaveState} slave
-	 * @param {Node} c
-	 * @returns {void}
-	 */
-	function short_ears(slave, c) {
-		if (slave.hears === -2) {
-			makeSpan(c, "Deaf", "red");
-		} else if ((slave.hears === -1) && (slave.earwear !== "hearing aids")) {
-			makeSpan(c, "Hearing-", "yellow");
-		}
-	}
-
-	/**
-	 * @param {App.Entity.SlaveState} slave
-	 * @param {Node} c
-	 * @returns {void}
-	 */
-	function short_lips(slave, c) {
-		if (slave.lips > 95) {
-			makeSpan(c, "Facepussy");
-		} else if (slave.lips > 70) {
-			makeSpan(c, "Lips+++", null, true, slave.lips);
-		} else if (slave.lips > 40) {
-			makeSpan(c, "Lips++", null, true, slave.lips);
-		} else if (slave.lips > 20) {
-			makeSpan(c, "Lips+", null, true, slave.lips);
-		} else if (slave.lips > 10) {
-			makeSpan(c, "Lips", null, true, slave.lips);
-		} else {
-			makeSpan(c, "Lips-", "red", true, slave.lips);
-		}
-	}
-
-	/**
-	 * @param {App.Entity.SlaveState} slave
-	 * @param {Node} c
-	 * @returns {void}
-	 */
-	function short_teeth(slave, c) {
-		if (slave.teeth === "crooked") {
-			makeSpan(c, "Cr Teeth", "yellow");
-		} else if (slave.teeth === "gapped") {
-			makeSpan(c, "Gap", "yellow");
-		} else if (slave.teeth === "cosmetic braces") {
-			makeSpan(c, `Cos Braces`);
-		} else if (slave.teeth === "straightening braces") {
-			makeSpan(c, `Braces`);
-		} else if (slave.teeth === "removable") {
-			makeSpan(c, `Rem Teeth`);
-		} else if (slave.teeth === "pointy") {
-			makeSpan(c, `Fangs`);
-		} else if (slave.teeth === "baby") {
-			makeSpan(c, `Baby`);
-		} else if (slave.teeth === "mixed") {
-			makeSpan(c, `Mixed`);
-		}
-	}
-
-	/**
-	 * @param {App.Entity.SlaveState} slave
-	 * @param {Node} c
-	 * @returns {void}
-	 */
-	function short_muscles(slave, c) {
-		if (slave.muscles > 95) {
-			makeSpan(c, "Musc++", undefined, true, slave.muscles);
-		} else if (slave.muscles > 50) {
-			makeSpan(c, "Musc+", undefined, true, slave.muscles);
-		} else if (slave.muscles > 30) {
-			makeSpan(c, "Fit", undefined, true, slave.muscles);
-		} else if (slave.muscles > 5) {
-			makeSpan(c, "Toned", undefined, true, slave.muscles);
-		} else if (slave.muscles > -6) {
-			makeSpan(c, "Soft", undefined, true, slave.muscles);
-		} else if (slave.muscles > -31) {
-			if (V.arcologies[0].FSPhysicalIdealist === "unset") {
-				makeSpan(c, "Weak", "red", true, slave.muscles);
-			} else {
-				makeSpan(c, "Soft", undefined, true, slave.muscles);
-			}
-		} else if (slave.muscles > -96) {
-			if (V.arcologies[0].FSPhysicalIdealist === "unset") {
-				makeSpan(c, "Weak+", "red", true, slave.muscles);
-			} else {
-				makeSpan(c, "Soft+", undefined, true, slave.muscles);
-			}
-		} else {
-			makeSpan(c, "Weak++", "red", true, slave.muscles);
-		}
-	}
-
-	/**
-	 * @param {App.Entity.SlaveState} slave
-	 * @param {Node} c
-	 * @returns {void}
-	 */
-	function short_voice(slave, c) {
-		if (slave.voice === 0) {
-			makeSpan(c, "Mute", "red");
-		} else {
-			if (slave.accent === 3) {
-				makeSpan(c, "Acc--", "red");
-			} else if (slave.accent === 2) {
-				makeSpan(c, "Acc-");
-			} else if (slave.accent === 4) {
-				makeSpan(c, "Acc--");
-			} else if (slave.accent === 1) {
-				makeSpan(c, "Acc", "pink");
-			}
-		}
-	}
-
-	/**
-	 * @param {App.Entity.SlaveState} slave
-	 * @param {Node} c
-	 * @returns {void}
-	 */
-	function short_tits_ass(slave, c) {
-		let styles = "pink";
-		if ((slave.boobs >= 12000) && (slave.butt > 9)) {
-			makeSpan(c, "T&A+++", styles);
-		} else if ((slave.boobs > 4000) && (slave.butt > 8)) {
-			makeSpan(c, "T&A++", styles);
-		} else if ((slave.boobs > 2000) && (slave.butt > 6)) {
-			makeSpan(c, "T&A+", styles);
-		} else if ((slave.boobs > 800) && (slave.butt > 4)) {
-			makeSpan(c, "T&A", styles);
-		} else if ((slave.boobs < 500) && (slave.butt < 3) && (slave.weight <= 10) && (slave.muscles <= 30)) {
-			makeSpan(c, "Girlish", styles);
-		} else if (slave.boobs >= 12000) {
-			makeSpan(c, "Boobs+++", styles);
-		} else if (slave.boobs > 4000) {
-			makeSpan(c, "Boobs++", styles);
-		} else if (slave.boobs > 2000) {
-			makeSpan(c, "Boobs+", styles);
-		} else if (slave.boobs > 800) {
-			makeSpan(c, "Boobs", styles);
-		} else if (slave.butt > 9) {
-			makeSpan(c, "Ass+++", styles);
-		} else if (slave.butt > 8) {
-			makeSpan(c, "Ass++", styles);
-		} else if (slave.butt > 6) {
-			makeSpan(c, "Ass+", styles);
-		} else if (slave.butt > 4) {
-			makeSpan(c, "Ass", styles);
-		}
-	}
-
-	/**
-	 * @param {App.Entity.SlaveState} slave
-	 * @param {Node} c
-	 * @returns {void}
-	 */
-	function short_hips(slave, c) {
-		let desc = "";
-		if (slave.hips < -1) {
-			if (slave.butt > 2 && (V.arcologies[0].FSTransformationFetishist < 20 || V.arcologies[0].FSTransformationFetishist === "unset") && (V.arcologies[0].FSHedonisticDecadence < 20 || V.arcologies[0].FSHedonisticDecadence === "unset")) {
-				desc = `Disp+`;
-			}
-		} else if (slave.hips < 0) {
-			if (slave.butt > 4 && (V.arcologies[0].FSTransformationFetishist < 20 || V.arcologies[0].FSTransformationFetishist === "unset") && (V.arcologies[0].FSHedonisticDecadence < 20 || V.arcologies[0].FSHedonisticDecadence === "unset")) {
-				desc = `Disp+`;
-			}
-		} else if (slave.hips > 2) {
-			if (slave.butt <= 8) {
-				desc = `Disp-`;
-			}
-		} else if (slave.hips > 1) {
-			if (slave.butt <= 3 && (V.arcologies[0].FSSlimnessEnthusiast === "unset" || (slave.boobs >= 500))) {
-				desc = `Disp-`;
-			}
-		} else if (slave.hips > 0) {
-			if (slave.butt > 8) {
-				if ((V.arcologies[0].FSTransformationFetishist < 20 || V.arcologies[0].FSTransformationFetishist === "unset") && (V.arcologies[0].FSHedonisticDecadence < 20 || V.arcologies[0].FSHedonisticDecadence === "unset")) {
-					desc = `Disp+`;
-				}
-			} else if (slave.butt <= 2 && (V.arcologies[0].FSSlimnessEnthusiast === "unset" || (slave.boobs >= 500))) {
-				desc = `Disp-`;
-			}
-		} else {
-			if (slave.butt > 6) {
-				if ((V.arcologies[0].FSTransformationFetishist < 20 || V.arcologies[0].FSTransformationFetishist === "unset") && (V.arcologies[0].FSHedonisticDecadence < 20 || V.arcologies[0].FSHedonisticDecadence === "unset")) {
-					desc = `Disp+`;
-				}
-			} else if (slave.butt <= 1 && (V.arcologies[0].FSSlimnessEnthusiast === "unset" || (slave.boobs >= 500))) {
-				desc = `Disp-`;
-			}
-		}
-		if (desc) {
-			makeSpan(c, desc, "red");
-		}
-	}
-
-	/**
-	 * @param {App.Entity.SlaveState} slave
-	 * @param {Node} c
-	 * @returns {void}
-	 */
-	function short_waist(slave, c) {
-		if (slave.waist > 95) {
-			makeSpan(c, "Wst---", "red", false, slave.waist);
-		} else if (slave.waist > 40) {
-			makeSpan(c, "Wst--", "red", false, slave.waist);
-		} else if (slave.waist > 10) {
-			makeSpan(c, "Wst-", "red", false, slave.waist);
-		} else if (slave.waist >= -10) {
-			makeSpan(c, "Wst", undefined, false, slave.waist);
-		} else if (slave.waist >= -40) {
-			makeSpan(c, "Wst+", "pink", false, slave.waist);
-		} else if (slave.waist >= -95) {
-			makeSpan(c, "Wst++", "pink", false, slave.waist);
-		} else {
-			makeSpan(c, "Wst+++", "pink", false, slave.waist);
-		}
-	}
-
-	/**
-	 * @param {App.Entity.SlaveState} slave
-	 * @param {Node} c
-	 * @returns {void}
-	 */
-	function short_implants(slave, c) {
-		if ((slave.boobsImplant === 0) && (slave.buttImplant === 0) && (slave.waist >= -95) && (slave.lipsImplant === 0) && (slave.faceImplant <= 5) && (slave.bellyImplant === -1)) {
-			makeSpan(c, "Natr", "pink");
-		} else {
-			makeSpan(c, "Impl", "pink");
-		}
-	}
-
-	/**
-	 * @param {App.Entity.SlaveState} slave
-	 * @param {Node} c
-	 * @returns {void}
-	 */
-	function short_lactation(slave, c) {
-		if (slave.lactation === 1) {
-			makeSpan(c, "Lact", "pink");
-		} else if (slave.lactation === 2) {
-			makeSpan(c, "Lact", "pink");
-		}
-	}
-
-	/**
-	 * @param {App.Entity.SlaveState} slave
-	 * @param {Node} c
-	 * @returns {void}
-	 */
-	function short_mods(slave, c) {
-		V.modScore = SlaveStatsChecker.modScore(slave);
-		if (slave.corsetPiercing === 0 && V.piercingScore < 3 && V.tatScore < 2) {
-			return;
-		} else if (V.modScore > 15 || (V.piercingScore > 8 && V.tatScore > 5)) {
-			makeSpan(c, "Mods++");
-		} else if (V.modScore > 7) {
-			makeSpan(c, "Mods+");
-		} else {
-			makeSpan(c, "Mods");
-		}
-		if (!jQuery.isEmptyObject(slave.brand)) {
-			makeSpan(c, "Br");
-		}
-	}
-
-	/**
-	 * @param {App.Entity.SlaveState} slave
-	 * @param {Node} c
-	 * @returns {void}
-	 */
-	function long_age(slave, c) {
-		let r = makeSpan(c, "", "pink");
-		if (V.showAgeDetail === 1) {
-			r.textContent += `Age ` + `${slave.actualAge}` + `.`;
-		} else if (slave.actualAge >= 40) {
-			r.textContent += `Forties.`;
-		} else if (slave.actualAge >= 35) {
-			r.textContent += `Late thirties.`;
-		} else if (slave.actualAge >= 30) {
-			r.textContent += `Early thirties.`;
-		} else if (slave.actualAge >= 25) {
-			r.textContent += `Late twenties.`;
-		} else if (slave.actualAge >= 20) {
-			r.textContent += `Early twenties.`;
-		} else if (slave.actualAge >= 19) {
-			r.textContent += `Nineteen.`;
-		} else if (slave.actualAge >= 18) {
-			r.textContent += `Eighteen.`;
-		} else {
-			r.textContent += `Underage.`;
-		}
-		/*
-		 ** No NCS, then do the standard, However because of the wrinkles of Incubators, as long as visual age is greater
-		 ** than or equal to physical age, we do the old physical body/Looks for fresh out of the can NCS slaves.
-		 */
-		if (((slave.geneMods.NCS === 0) || (slave.visualAge >= slave.physicalAge))) {
-			if (slave.actualAge !== slave.physicalAge) {
-				r.textContent += ` ${slave.physicalAge}` + ` year old body.`;
-			}
-			if (slave.visualAge !== slave.physicalAge) {
-				r.textContent += ` Looks ` + `${slave.visualAge}` + `.`;
-			}
-		} else {
-			/*
-			 ** Now the rub. The use of physical Age for the year old body above, basically conflicts with the changes
-			 ** that NCS introduces, so here to *distinguish* the changes, we use visual age with the 'year old body'
-			 ** and appears, for example: Slave release from incubator at age 10, Her summary would show, 'Age 0. 10
-			 ** year old body.' But if she's given NCS a few weeks after release, while she's still before her first
-			 ** birthday, it'll appear the same. But once her birthday fires, if we ran with the above code it would
-			 ** say: 'Age 1. 11 year old body.' -- this conflicts with the way NCS works though, because she hasn't
-			 ** visually aged, so our change here makes it say 'Age 1. Appears to have a 10 year old body.'
-			 */
-			r.textContent += ` Appears to have a ` + `${slave.visualAge}` + ` year old body.`;
-		}
-		if (slave.geneMods.NCS === 1) {
-			makeSpan(r, "NCS", "orange");
-		}
-	}
-
-	/**
-	 * @param {App.Entity.SlaveState} slave
-	 * @param {Node} c
-	 * @returns {void}
-	 */
-	function long_face(slave, c) {
-		if (slave.face < -95) {
-			makeSpan(c, `Very ugly ${slave.faceShape} face`, "red", true, slave.face);
-		} else if (slave.face < -40) {
-			makeSpan(c, `Ugly ${slave.faceShape} face`, "red", true, slave.face);
-		} else if (slave.face < -10) {
-			makeSpan(c, `Unattractive ${slave.faceShape} face`, "red", true, slave.face);
-		} else if (slave.face <= 10) {
-			makeSpan(c, `Average ${slave.faceShape} face`, null, true, slave.face);
-		} else if (slave.face <= 40) {
-			makeSpan(c, `Attractive ${slave.faceShape} face`, "pink", true, slave.face);
-		} else if (slave.face <= 95) {
-			makeSpan(c, `Beautiful ${slave.faceShape} face`, "pink", true, slave.face);
-		} else {
-			makeSpan(c, `Very beautiful ${slave.faceShape} face`, "pink", true, slave.face);
-		}
-	}
-
-	/**
-	 * @param {App.Entity.SlaveState} slave
-	 * @param {Node} c
-	 * @returns {void}
-	 */
-	function long_eyes(slave, c) {
-		if (!canSee(slave)) {
-			makeSpan(c, "Blind.", "red");
-		} else if (!canSeePerfectly(slave)) {
-			makeSpan(c, "Nearsighted.", "yellow");
-		}
-	}
-
-	/**
-	 * @param {App.Entity.SlaveState} slave
-	 * @param {Node} c
-	 * @returns {void}
-	 */
-	function long_ears(slave, c) {
-		if (slave.hears <= -2) {
-			makeSpan(c, "Deaf.", "red");
-		} else if ((slave.hears === -1) && (slave.earwear !== "hearing aids")) {
-			makeSpan(c, "Hard of hearing.", "yellow");
-		}
-	}
-
-	/**
-	 * @param {App.Entity.SlaveState} slave
-	 * @param {Node} c
-	 * @returns {void}
-	 */
-	function long_lips(slave, c) {
-		if (slave.lips > 95) {
-			makeSpan(c, "Facepussy", undefined, true, slave.lips);
-		} else if (slave.lips > 70) {
-			makeSpan(c, "Huge lips", undefined, true, slave.lips);
-		} else if (slave.lips > 40) {
-			makeSpan(c, "Big lips", undefined, true, slave.lips);
-		} else if (slave.lips > 20) {
-			makeSpan(c, "Pretty lips", undefined, true, slave.lips);
-		} else if (slave.lips > 10) {
-			makeSpan(c, "Normal lips", undefined, true, slave.lips);
-		} else {
-			makeSpan(c, "Thin lips", "red", true, slave.lips);
-		}
-	}
-
-	/**
-	 * @param {App.Entity.SlaveState} slave
-	 * @param {Node} c
-	 * @returns {void}
-	 */
-	function long_teeth(slave, c) {
-		if (slave.teeth === "crooked") {
-			makeSpan(c, "Crooked teeth.", "yellow");
-		} else if (slave.teeth === "gapped") {
-			makeSpan(c, "Tooth gap.", "yellow");
-		} else if (slave.teeth === "cosmetic braces") {
-			makeSpan(c, "Cosmetic braces.");
-		} else if (slave.teeth === "straightening braces") {
-			makeSpan(c, "Braces.");
-		} else if (slave.teeth === "removable") {
-			makeSpan(c, "Removable teeth.");
-		} else if (slave.teeth === "pointy") {
-			makeSpan(c, "Sharp fangs.");
-		} else if (slave.teeth === "baby") {
-			makeSpan(c, "Baby teeth.");
-		} else if (slave.teeth === "mixed") {
-			makeSpan(c, "Mixed teeth.");
-		}
-	}
-
-	/**
-	 * @param {App.Entity.SlaveState} slave
-	 * @param {Node} c
-	 * @returns {void}
-	 */
-	function long_muscles(slave, c) {
-		if (slave.muscles > 95) {
-			makeSpan(c, "Hugely muscular", undefined, true, slave.muscles);
-		} else if (slave.muscles > 50) {
-			makeSpan(c, "Muscular", undefined, true, slave.muscles);
-		} else if (slave.muscles > 30) {
-			makeSpan(c, "Fit", undefined, true, slave.muscles);
-		} else if (slave.muscles > 5) {
-			makeSpan(c, "Toned", undefined, true, slave.muscles);
-		} else if (slave.muscles > -6) {
-			makeSpan(c, "Soft", undefined, true, slave.muscles);
-		} else if (slave.muscles > -31) {
-			if (V.arcologies[0].FSPhysicalIdealist === "unset") {
-				makeSpan(c, "Weak", "red", true, slave.muscles);
-			} else {
-				makeSpan(c, "Weak", undefined, true, slave.muscles);
-			}
-		} else if (slave.muscles > -96) {
-			if (V.arcologies[0].FSPhysicalIdealist === "unset") {
-				makeSpan(c, "Very weak", "red", true, slave.muscles);
-			} else {
-				makeSpan(c, "Very weak", undefined, true, slave.muscles);
-			}
-		} else {
-			makeSpan(c, "Frail", "red", true, slave.muscles);
-		}
-	}
-
-	/**
-	 * @param {App.Entity.SlaveState} slave
-	 * @param {Node} c
-	 * @returns {void}
-	 */
-	function long_voice(slave, c) {
-		if (slave.voice === 0) {
-			makeSpan(c, "Mute.", "red");
-		} else {
-			if (slave.accent === 3) {
-				makeSpan(c, "Bad accent.", "red");
-			} else if (slave.accent === 4) {
-				makeSpan(c, "No language skills.", "red");
-			} else if (slave.accent === 2) {
-				makeSpan(c, "Accent.");
-			} else if (slave.accent === 1) {
-				makeSpan(c, "Cute accent.", "pink");
-			}
-		}
-	}
-
-	/**
-	 * @param {App.Entity.SlaveState} slave
-	 * @param {Node} c
-	 * @returns {void}
-	 */
-	function long_tits_ass(slave, c) {
-		const styles = "pink";
-		if ((slave.boobs >= 12000) && (slave.butt > 9)) {
-			makeSpan(c, "Hyper T&A.", styles);
-		} else if ((slave.boobs > 4000) && (slave.butt > 8)) {
-			makeSpan(c, "Enormous T&A.", styles);
-		} else if ((slave.boobs > 2000) && (slave.butt > 6)) {
-			makeSpan(c, "Huge T&A.", styles);
-		} else if ((slave.boobs > 800) && (slave.butt > 4)) {
-			makeSpan(c, "Big T&A.", styles);
-		} else if ((slave.boobs < 500) && (slave.butt < 3) && (slave.weight <= 10) && (slave.muscles <= 30)) {
-			makeSpan(c, "Girlish figure.", styles);
-		} else if (slave.boobs >= 12000) {
-			makeSpan(c, "Immobilizing tits.", styles);
-		} else if (slave.boobs > 4000) {
-			makeSpan(c, "Monstrous tits.", styles);
-		} else if (slave.boobs > 2000) {
-			makeSpan(c, "Huge tits.", styles);
-		} else if (slave.boobs > 800) {
-			makeSpan(c, "Big tits.", styles);
-		} else if (slave.butt > 9) {
-			makeSpan(c, "Hyper ass.", styles);
-		} else if (slave.butt > 8) {
-			makeSpan(c, "Titanic ass.", styles);
-		} else if (slave.butt > 6) {
-			makeSpan(c, "Huge ass.", styles);
-		} else if (slave.butt > 4) {
-			makeSpan(c, "Big ass.", styles);
-		}
-	}
-
-	/**
-	 * @param {App.Entity.SlaveState} slave
-	 * @param {Node} c
-	 * @returns {void}
-	 */
-	function long_hips(slave, c) {
-		const styles = "red";
-		if (slave.hips < -1) {
-			if (slave.butt > 2 && (V.arcologies[0].FSTransformationFetishist < 20 || V.arcologies[0].FSTransformationFetishist === "unset") && (V.arcologies[0].FSHedonisticDecadence < 20 || V.arcologies[0].FSHedonisticDecadence === "unset") && (V.arcologies[0].FSAssetExpansionist < 20 || V.arcologies[0].FSAssetExpansionist === "unset") && (V.arcologies[0].FSIntellectualDependencyLawBeauty === 0)) {
-				makeSpan(c, "Disproportionately big butt.", styles);
-			}
-		} else if (slave.hips < 0) {
-			if (slave.butt > 4 && (V.arcologies[0].FSTransformationFetishist < 20 || V.arcologies[0].FSTransformationFetishist === "unset") && (V.arcologies[0].FSHedonisticDecadence < 20 || V.arcologies[0].FSHedonisticDecadence === "unset") && (V.arcologies[0].FSAssetExpansionist < 20 || V.arcologies[0].FSAssetExpansionist === "unset") && (V.arcologies[0].FSIntellectualDependencyLawBeauty === 0)) {
-				makeSpan(c, "Disproportionately big butt.", styles);
-			}
-		} else if (slave.hips > 2) {
-			if (slave.butt <= 8) {
-				makeSpan(c, "Disproportionately small butt.", styles);
-			}
-		} else if (slave.hips > 1) {
-			if (slave.butt <= 3 && ((V.arcologies[0].FSSlimnessEnthusiast === "unset") || (slave.boobs >= 500))) {
-				makeSpan(c, "Disproportionately small butt.", styles);
-			}
-		} else if (slave.hips > 0) {
-			if (slave.butt > 8) {
-				if ((V.arcologies[0].FSTransformationFetishist < 20 || V.arcologies[0].FSTransformationFetishist === "unset") && (V.arcologies[0].FSHedonisticDecadence < 20 || V.arcologies[0].FSHedonisticDecadence === "unset") && (V.arcologies[0].FSAssetExpansionist < 20 || V.arcologies[0].FSAssetExpansionist === "unset") && (V.arcologies[0].FSIntellectualDependencyLawBeauty === 0)) {
-					makeSpan(c, "Disproportionately big butt.", styles);
-				}
-			} else if (slave.butt <= 2 && ((V.arcologies[0].FSSlimnessEnthusiast === "unset") || (slave.boobs >= 500))) {
-				makeSpan(c, "Disproportionately small butt.", styles);
-			}
-		} else {
-			if (slave.butt > 6) {
-				if ((V.arcologies[0].FSTransformationFetishist < 20 || V.arcologies[0].FSTransformationFetishist === "unset") && (V.arcologies[0].FSHedonisticDecadence < 20 || V.arcologies[0].FSHedonisticDecadence === "unset") && (V.arcologies[0].FSAssetExpansionist < 20 || V.arcologies[0].FSAssetExpansionist === "unset") && (V.arcologies[0].FSIntellectualDependencyLawBeauty === 0)) {
-					makeSpan(c, "Disproportionately big butt.", styles);
-				}
-			} else if (slave.butt <= 1 && ((V.arcologies[0].FSSlimnessEnthusiast === "unset") || (slave.boobs >= 500))) {
-				makeSpan(c, "Disproportionately small butt.", styles);
-			}
-		}
-	}
-
-	/**
-	 * @param {App.Entity.SlaveState} slave
-	 * @param {Node} c
-	 * @returns {void}
-	 */
-	function long_waist(slave, c) {
-		if (slave.waist > 95) {
-			makeSpan(c, "Masculine waist", "red", true, slave.waist);
-		} else if (slave.waist > 40) {
-			makeSpan(c, "Ugly waist", "red", true, slave.waist);
-		} else if (slave.waist > 10) {
-			makeSpan(c, "Unattractive waist", "red", true, slave.waist);
-		} else if (slave.waist >= -10) {
-			makeSpan(c, "Average waist", null, true, slave.waist);
-		} else if (slave.waist >= -40) {
-			makeSpan(c, "Feminine waist", "pink", true, slave.waist);
-		} else if (slave.waist >= -95) {
-			makeSpan(c, "Hourglass waist", "pink", true, slave.waist);
-		} else {
-			makeSpan(c, "Absurdly narrow waist", "pink", true, slave.waist);
-		}
-	}
-
-	/**
-	 * @param {App.Entity.SlaveState} slave
-	 * @param {Node} c
-	 * @returns {void}
-	 */
-	function long_implants(slave, c) {
-		const styles = "pink";
-		if ((slave.boobsImplant !== 0) || (slave.buttImplant !== 0) || (slave.lipsImplant !== 0) || (slave.bellyImplant !== -1)) {
-			makeSpan(c, "Implants.", styles);
-		} else if ((slave.faceImplant >= 30) || (slave.waist < -95)) {
-			makeSpan(c, "Surgery enhanced.", styles);
-		} else {
-			makeSpan(c, "All natural.", styles);
-		}
-	}
-
-	/**
-	 * @param {App.Entity.SlaveState} slave
-	 * @param {Node} c
-	 * @returns {void}
-	 */
-	function long_lactation(slave, c) {
-		if (slave.lactation === 1) {
-			makeSpan(c, "Lactating naturally.", "pink");
-		} else if (slave.lactation === 2) {
-			makeSpan(c, "Heavy lactation.", "pink");
-		}
-	}
-
-	/**
-	 * @param {App.Entity.SlaveState} slave
-	 * @param {Node} c
-	 * @returns {void}
-	 */
-	function long_mods(slave, c) {
-		V.modScore = SlaveStatsChecker.modScore(slave);
-		if (slave.corsetPiercing === 0 && V.piercingScore < 3 && V.tatScore < 2) {
-			return;
-		} else if (V.modScore > 15 || (V.piercingScore > 8 && V.tatScore > 5)) {
-			makeSpan(c, "Extensive body mods.");
-		} else if (V.modScore > 7) {
-			makeSpan(c, "Noticeable body mods.");
-		} else {
-			makeSpan(c, "Light body mods.");
-		}
-	}
-
-	/**
-	 * @param {App.Entity.SlaveState} slave
-	 * @param {Node} c
-	 * @returns {void}
-	 */
-	function short_intelligence(slave, c) {
-		const intelligence = slave.intelligence + slave.intelligenceImplant;
-		if (slave.fetish === "mindbroken") {
-			return;
-		}
-		let education = "";
-		let naturalIntelligence = "";
-		let styles = undefined;
-		if (slave.intelligenceImplant >= 30) {
-			education = "(e+)";
-		} else if (slave.intelligenceImplant >= 15) {
-			education = "(e)";
-		} else if (slave.intelligenceImplant <= -15) {
-			education = "(e-)";
-		}
-		if (intelligence >= 130) {
-			naturalIntelligence = "I++++";
-			styles = "deepskyblue";
-		} else if (intelligence > 95) {
-			naturalIntelligence = "I+++";
-			styles = "deepskyblue";
-		} else if (intelligence > 50) {
-			naturalIntelligence = "I++";
-			styles = "deepskyblue";
-		} else if (intelligence > 15) {
-			naturalIntelligence = "I+";
-			styles = "deepskyblue";
-		} else if (intelligence >= -15) {
-			naturalIntelligence = "I";
-		} else if (intelligence >= -50) {
-			naturalIntelligence = "I-";
-			styles = "orangered";
-		} else if (intelligence >= -95) {
-			naturalIntelligence = "I--";
-			styles = "orangered";
-		} else {
-			naturalIntelligence = "I---";
-			styles = "orangered";
-		}
-		makeSpan(c, `${naturalIntelligence}${education}`, styles, true, intelligence);
-	}
-
-	/**
-	 * @param {App.Entity.SlaveState} slave
-	 * @param {Node} c
-	 * @returns {void}
-	 */
-	function short_skills(slave, c) {
-		let _SSkills = slave.skill.anal + slave.skill.oral;
-		let r = makeSpan(c, "", "aquamarine");
-		if (((_SSkills + slave.skill.whoring + slave.skill.entertainment) >= 400) && ((slave.vagina < 0) || (slave.skill.vaginal >= 100))) {
-			r.textContent += `MSS`;
-		} else {
-			_SSkills += slave.skill.vaginal;
-			_SSkills = Math.trunc(_SSkills);
-			if (_SSkills > 180) {
-				r.textContent += `S++`;
-			} else if ((_SSkills > 120) && (slave.vagina < 0)) {
-				r.textContent += `Sh++`;
-			} else if (_SSkills > 90) {
-				r.textContent += `S+`;
-			} else if (_SSkills > 30) {
-				r.textContent += `S`;
-			} else {
-				r.textContent += `S-`;
-			}
-			if (V.summaryStats) {
-				r.textContent += `[${_SSkills}]`;
-			}
-			r.textContent += " ";
-			if (slave.skill.whoring >= 100) {
-				r.textContent += `W+++`;
-			} else if (slave.skill.whoring > 60) {
-				r.textContent += `W++`;
-			} else if (slave.skill.whoring > 30) {
-				r.textContent += `W+`;
-			} else if (slave.skill.whoring > 10) {
-				r.textContent += `W`;
-			}
-			if (slave.skill.whoring > 10) {
-				if (V.summaryStats) {
-					r.textContent += `[${slave.skill.whoring}]`;
-				}
-			}
-			r.textContent += " ";
-			if (slave.skill.entertainment >= 100) {
-				r.textContent += `E+++`;
-			} else if (slave.skill.entertainment > 60) {
-				r.textContent += `E++`;
-			} else if (slave.skill.entertainment > 30) {
-				r.textContent += `E+`;
-			} else if (slave.skill.entertainment > 10) {
-				r.textContent += `E`;
-			}
-			if (slave.skill.entertainment > 10) {
-				if (V.summaryStats) {
-					r.textContent += `[${slave.skill.entertainment}]`;
-				}
-			}
-		}
-		if (slave.skill.combat > 0) {
-			r.textContent += " C";
-		}
-	}
-
-	/**
-	 * @param {App.Entity.SlaveState} slave
-	 * @param {Node} c
-	 * @returns {void}
-	 */
-	function short_prestige(slave, c) {
-		if (slave.prestige > 0) {
-			const styles = "green";
-			if (slave.prestige > 2) {
-				makeSpan(c, "Prest++", styles);
-			} else if (slave.prestige === 2) {
-				makeSpan(c, "Prest+", styles);
-			} else if (slave.prestige === 1) {
-				makeSpan(c, "Prest", styles);
-			}
-		}
-	}
-
-	/**
-	 * @param {App.Entity.SlaveState} slave
-	 * @param {Node} c
-	 * @returns {void}
-	 */
-	function short_porn_prestige(slave, c) {
-		if (slave.porn.prestige > 0) {
-			const styles = "green";
-			if (slave.porn.prestige > 2) {
-				makeSpan(c, "PPrest++", styles);
-			} else if (slave.porn.prestige === 2) {
-				makeSpan(c, "PPrest+", styles);
-			} else if (slave.porn.prestige === 1) {
-				makeSpan(c, "PPrest", styles);
-			}
-		}
-	}
-
-	/**
-	 * @param {App.Entity.SlaveState} slave
-	 * @param {Node} c
-	 * @returns {void}
-	 */
-	function long_intelligence(slave, c) {
-		const intelligence = slave.intelligence + slave.intelligenceImplant;
-		if (slave.fetish === "mindbroken") {
-			return;
-		}
-		let education = "";
-		let naturalIntelligence = "";
-		let styles = undefined;
-		if (slave.intelligenceImplant >= 30) {
-			education = ", well educated";
-		} else if (slave.intelligenceImplant >= 15) {
-			education = ", educated";
-		} else if (slave.intelligenceImplant <= -15) {
-			education = ", hindered";
-		}
-		if (intelligence >= 130) {
-			naturalIntelligence = "Genius";
-			styles = "deepskyblue";
-		} else if (intelligence > 95) {
-			naturalIntelligence = "Brilliant";
-			styles = "deepskyblue";
-		} else if (intelligence > 50) {
-			naturalIntelligence = "Very smart";
-			styles = "deepskyblue";
-		} else if (intelligence > 15) {
-			naturalIntelligence = "Smart";
-			styles = "deepskyblue";
-		} else if (intelligence >= -15) {
-			naturalIntelligence = "Average intelligence";
-		} else if (intelligence >= -50) {
-			naturalIntelligence = "Slow";
-			styles = "orangered";
-		} else if (intelligence >= -95) {
-			naturalIntelligence = "Very slow";
-			styles = "orangered";
-		} else {
-			naturalIntelligence = "Moronic";
-			styles = "orangered";
-		}
-		makeSpan(c, `${naturalIntelligence}${education}`, styles, true, intelligence);
-	}
-
-	/**
-	 * @param {App.Entity.SlaveState} slave
-	 * @param {Node} c
-	 * @returns {void}
-	 */
-	function long_skills(slave, c) {
-		let _SSkills = (slave.skill.anal + slave.skill.oral);
-		if (((_SSkills + slave.skill.whoring + slave.skill.entertainment) >= 400) && ((slave.vagina < 0) || (slave.skill.vaginal >= 100))) {
-			makeSpan(c, "Masterful Sex Slave.", "aquamarine");
-		} else {
-			let desc;
-			_SSkills += slave.skill.vaginal;
-			if (_SSkills > 180) {
-				desc = "Sex master";
-			} else if ((_SSkills > 120) && (slave.vagina < 0)) {
-				desc = "Masterful shemale";
-			} else if (_SSkills > 90) {
-				desc = "Sexual expert";
-			} else if (_SSkills > 30) {
-				desc = "Sexually skilled";
-			} else {
-				desc = "Sexually unskilled";
-			}
-			if (desc) {
-				makeSpan(c, desc, "aquamarine", true, Math.trunc(_SSkills));
-				desc = "";
-			}
-			if (slave.skill.whoring >= 100) {
-				desc = "Masterful whore";
-			} else if (slave.skill.whoring >= 60) {
-				desc = "Expert whore";
-			} else if (slave.skill.whoring >= 30) {
-				desc = "Skilled whore";
-			} else if (slave.skill.whoring >= 10) {
-				desc = "Basic whore";
-			}
-			if (desc) {
-				makeSpan(c, desc, "aquamarine", true, slave.skill.whoring);
-				desc = "";
-			}
-			if (slave.skill.entertainment >= 100) {
-				desc = "Masterful entertainer";
-			} else if (slave.skill.entertainment >= 60) {
-				desc = "Expert entertainer";
-			} else if (slave.skill.entertainment >= 30) {
-				desc = "Skilled entertainer";
-			} else if (slave.skill.entertainment >= 10) {
-				desc = "Basic entertainer";
-			}
-			if (desc) {
-				makeSpan(c, desc, "aquamarine", true, slave.skill.entertainment);
-				desc = "";
-			}
-		}
-		if (slave.skill.combat > 0) {
-			makeSpan(c, "Trained fighter.", "aquamarine");
-		}
-	}
-
-	/**
-	 * @param {App.Entity.SlaveState} slave
-	 * @param {Node} c
-	 * @returns {void}
-	 */
-	function long_prestige(slave, c) {
-		if (slave.prestige > 0) {
-			const styles = "green";
-			if (slave.prestige > 2) {
-				makeSpan(c, "Extremely prestigious.", styles);
-			} else if (slave.prestige === 2) {
-				makeSpan(c, "Very prestigious.", styles);
-			} else if (slave.prestige === 1) {
-				makeSpan(c, "Prestigious.", styles);
-			}
-		}
-	}
-
-	/**
-	 * @param {App.Entity.SlaveState} slave
-	 * @param {Node} c
-	 * @returns {void}
-	 */
-	function long_porn_prestige(slave, c) {
-		if (slave.porn.prestige > 0) {
-			const styles = "green";
-			if (slave.porn.prestige > 2) {
-				makeSpan(c, "Porn star.", styles);
-			} else if (slave.porn.prestige === 2) {
-				makeSpan(c, "Porn slut.", styles);
-			} else if (slave.porn.prestige === 1) {
-				makeSpan(c, "Porn amateur.", styles);
-			}
-		}
-	}
-
-	/**
-	 * @param {App.Entity.SlaveState} slave
-	 * @param {Node} c
-	 * @returns {void}
-	 */
-	function short_fetish(slave, c) {
-		let descStr = "";
-		switch (slave.fetish) {
-			case "submissive":
-				if (slave.fetishStrength > 95) {
-					descStr = `Sub++`;
-				} else if (slave.fetishStrength > 60) {
-					descStr = `Sub+`;
+	const shortRenderers = {
+		/**
+		 * @param {App.Entity.SlaveState} slave
+		 * @param {Node} c
+		 */
+		devotion: function(slave, c) {
+			const makeSpan = helpers.makeSpan;
+			if (slave.fetish === "mindbroken") {
+				makeSpan(c, "MB", "mindbroken");
+			} else if (slave.devotion < -95) {
+				makeSpan(c, "Hate", ["devotion", "hateful"], true, slave.devotion);
+			} else if (slave.devotion < -50) {
+				makeSpan(c, "Hate", ["devotion", "hateful"], true, slave.devotion);
+			} else if (slave.devotion < -20) {
+				makeSpan(c, "Res", ["devotion", "resistant"], true, slave.devotion);
+			} else if (slave.devotion <= 20) {
+				makeSpan(c, "Ambiv", ["devotion", "ambivalent"], true, slave.devotion);
+			} else if (slave.devotion <= 50) {
+				makeSpan(c, "Accept", ["devotion", "accept"], true, slave.devotion);
+			} else if (slave.devotion <= 95) {
+				makeSpan(c, "Devo", ["devotion", "devoted"], true, slave.devotion);
+			} else {
+				makeSpan(c, "Wor", ["devotion", "worship"], true, slave.devotion);
+			}
+			if (slave.fetish === "mindbroken") {
+				return;
+			} else if (slave.trust < -95) {
+				makeSpan(c, "ETerr", ["trust", "extremely-terrified"], true, slave.trust);
+			} else if (slave.trust < -50) {
+				makeSpan(c, "Terr", ["trust", "terrified"], true, slave.trust);
+			} else if (slave.trust < -20) {
+				makeSpan(c, "Fright", ["trust", "frightened"], true, slave.trust);
+			} else if (slave.trust <= 20) {
+				makeSpan(c, "Fear", ["trust", "fearful"], true, slave.trust);
+			} else if (slave.trust <= 50) {
+				if (slave.devotion < -20) {
+					makeSpan(c, "Caref", ["defiant", "careful"], true, slave.trust);
 				} else {
-					descStr = `Sub`;
+					makeSpan(c, "Caref", ["trust", "careful"], true, slave.trust);
 				}
-				break;
-			case "cumslut":
-				if (slave.fetishStrength > 95) {
-					descStr = `Oral++`;
-				} else if (slave.fetishStrength > 60) {
-					descStr = `Oral+`;
+			} else if (slave.trust < 95) {
+				if (slave.devotion < -20) {
+					makeSpan(c, "Bold", ["defiant", "bold"], true, slave.trust);
 				} else {
-					descStr = `Oral`;
+					makeSpan(c, "Trust", ["trust", "trusting"], true, slave.trust);
 				}
-				break;
-			case "humiliation":
-				if (slave.fetishStrength > 95) {
-					descStr = `Humil++`;
-				} else if (slave.fetishStrength > 60) {
-					descStr = `Humil+`;
+			} else {
+				if (slave.devotion < -20) {
+					makeSpan(c, "Defiant", ["defiant", "full"], true, slave.trust);
 				} else {
-					descStr = `Humil`;
+					makeSpan(c, "VTrust", ["trust", "prof-trusting"], true, slave.trust);
 				}
-				break;
-			case "buttslut":
-				if (slave.fetishStrength > 95) {
-					descStr = `Anal++`;
-				} else if (slave.fetishStrength > 60) {
-					descStr = `Anal+`;
-				} else {
-					descStr = `Anal`;
+			}
+		},
+
+		/**
+		 * @param {App.Entity.SlaveState} slave
+		 * @param {Node} c
+		 * @returns {void}
+		 */
+		rules: function(slave, c) {
+			const makeSpan = helpers.makeSpan;
+			const styles = "strong";
+			switch (slave.rules.living) {
+				case "luxurious":
+					makeSpan(c, "LS:Lux", styles);
+					break;
+				case "normal":
+					makeSpan(c, "LS:Nor", styles);
+					break;
+				default:
+					makeSpan(c, "LS:Spa", styles);
+					break;
+			}
+			if (canTalk(slave, false)) {
+				switch (slave.rules.speech) {
+					case "permissive":
+						makeSpan(c, "SpR:P", styles);
+						break;
+					case "accent elimination":
+						makeSpan(c, "SpR:NoAcc", styles);
+						break;
+					case "language lessons":
+						makeSpan(c, "SpR:LL", styles);
+						break;
+					default:
+						makeSpan(c, "SpR:R", styles);
+						break;
 				}
-				break;
-			case "boobs":
-				if (slave.fetishStrength > 95) {
-					descStr = `Boobs++`;
-				} else if (slave.fetishStrength > 60) {
-					descStr = `Boobs+`;
+			}
+			switch (slave.rules.relationship) {
+				case "permissive":
+					makeSpan(c, "ReR:P", styles);
+					break;
+				case "just friends":
+					makeSpan(c, "ReR:Fr", styles);
+					break;
+				default:
+					makeSpan(c, "ReR:R", styles);
+					break;
+			}
+			switch (slave.rules.punishment) {
+				case "confinement":
+					makeSpan(c, "Pun:Conf", styles);
+					break;
+				case "whipping":
+					makeSpan(c, "Pun:Whip", styles);
+					break;
+				case "chastity":
+					makeSpan(c, "Pun:Chas", styles);
+					break;
+				default:
+					makeSpan(c, "Pun:Situ", styles);
+					break;
+			}
+			switch (slave.rules.reward) {
+				case "relaxation":
+					makeSpan(c, "Rew:Relx", styles);
+					break;
+				case "drugs":
+					makeSpan(c, "Rew:Drug", styles);
+					break;
+				case "orgasm":
+					makeSpan(c, "Rew:Orga", styles);
+					break;
+				default:
+					makeSpan(c, "Rew:Situ", styles);
+					break;
+			}
+			makeSpan(c, "MaR:" + App.Utils.releaseSummaryShort(slave), styles);
+		},
+
+
+		/**
+		 * @param {App.Entity.SlaveState} slave
+		 * @param {Node} c
+		 * @returns {void}
+		 */
+		health: function(slave, c) {
+			const b = bits.short;
+			b.health(slave, c);
+			b.illness(slave, c);
+			b.tired(slave, c);
+		},
+
+		/**
+		 * @param {App.Entity.SlaveState} slave
+		 * @param {Node} c
+		 * @returns {void}
+		 */
+		weight: function(slave, c) {
+			const makeSpan = helpers.makeSpan;
+			if (slave.weight < -95) {
+				makeSpan(c, "W---", ["red", "strong"], true, slave.weight);
+			} else if (slave.weight < -30) {
+				if (slave.hips < -1) {
+					makeSpan(c, "W--", "strong", true, slave.weight);
 				} else {
-					descStr = `Boobs`;
+					makeSpan(c, "W--", ["red", "strong>"], true, slave.weight);
 				}
-				break;
-			case "sadist":
-				if (slave.fetishStrength > 95) {
-					descStr = `Sadist++`;
-				} else if (slave.fetishStrength > 60) {
-					descStr = `Sadist+`;
+			} else if (slave.weight < -10) {
+				makeSpan(c, "W-", "strong", true, slave.weight);
+			} else if (slave.weight <= 10) {
+				makeSpan(c, "W", "strong", true, slave.weight);
+			} else if (slave.weight <= 30) {
+				makeSpan(c, "W+", "strong", true, slave.weight);
+			} else if (slave.weight <= 95) {
+				if (slave.hips > 1 || V.arcologies[0].FSHedonisticDecadence !== "unset") {
+					makeSpan(c, "W++", "strong", true, slave.weight);
 				} else {
-					descStr = `Sadist`;
+					makeSpan(c, "W++", ["red", "strong"], true, slave.weight);
 				}
-				break;
-			case "masochist":
-				if (slave.fetishStrength > 95) {
-					descStr = `Pain++`;
-				} else if (slave.fetishStrength > 60) {
-					descStr = `Pain+`;
+			} else if (slave.weight <= 130) {
+				if (slave.hips > 2 || V.arcologies[0].FSHedonisticDecadence !== "unset") {
+					makeSpan(c, "W+++", "strong", true, slave.weight);
 				} else {
-					descStr = `Pain`;
+					makeSpan(c, "W+++", ["red", "strong"], true, slave.weight);
 				}
-				break;
-			case "dom":
-				if (slave.fetishStrength > 95) {
-					descStr = `Dom++`;
-				} else if (slave.fetishStrength > 60) {
-					descStr = `Dom+`;
+			} else if (slave.weight <= 160) {
+				if (V.arcologies[0].FSHedonisticDecadence !== "unset") {
+					makeSpan(c, "W++++", "strong", true, slave.weight);
 				} else {
-					descStr = `Dom`;
+					makeSpan(c, "W++++", ["red", "strong"], true, slave.weight);
 				}
-				break;
-			case "pregnancy":
-				if (slave.fetishStrength > 95) {
-					descStr = `Preg++`;
-				} else if (slave.fetishStrength > 60) {
-					descStr = `Preg+`;
+			} else if (slave.weight <= 190) {
+				if (V.arcologies[0].FSHedonisticDecadence !== "unset") {
+					makeSpan(c, "W+++++", "strong", true, slave.weight);
 				} else {
-					descStr = `Preg`;
-				}
-				break;
-			default:
-				descStr = `Vanilla`;
-				break;
-		}
-		if (V.summaryStats) {
-			descStr += `[${slave.fetishStrength}]`;
-		}
-		makeSpan(c, descStr, "lightcoral");
-	}
-
-	/**
-	 * @param {App.Entity.SlaveState} slave
-	 * @param {Node} c
-	 * @returns {void}
-	 */
-	function short_attraction(slave, c) {
-		if (slave.attrXY <= 5) {
-			makeSpan(c, "XY---", "red", false, slave.attrXY);
-		} else if (slave.attrXY <= 15) {
-			makeSpan(c, "XY--", "red", false, slave.attrXY);
-		} else if (slave.attrXY <= 35) {
-			makeSpan(c, "XY---", "red", false, slave.attrXY);
-		} else if (slave.attrXY <= 65) {
-			makeSpan(c, "XY", undefined, false, slave.attrXY);
-		} else if (slave.attrXY <= 85) {
-			makeSpan(c, "XY+", "green", false, slave.attrXY);
-		} else if (slave.attrXY <= 95) {
-			makeSpan(c, "XY++", "green", false, slave.attrXY);
-		} else if (slave.attrXX > 95) {
-			if (slave.energy <= 95) {
-				makeSpan(c, "Omni!", "green");
-			} else {
-				makeSpan(c, "Omni+Nympho!!", "green");
-			}
-		} else {
-			makeSpan(c, "XY+++", "green", false, slave.attrXY);
-		}
-		if (slave.attrXX <= 5) {
-			makeSpan(c, "XX---", "red", false, slave.attrXX);
-		} else if (slave.attrXX <= 15) {
-			makeSpan(c, "XX--", "red", false, slave.attrXX);
-		} else if (slave.attrXX <= 35) {
-			makeSpan(c, "XX-", "red", false, slave.attrXX);
-		} else if (slave.attrXX <= 65) {
-			makeSpan(c, "XX", undefined, false, slave.attrXX);
-		} else if (slave.attrXX <= 85) {
-			makeSpan(c, "XX+", "green", false, slave.attrXX);
-		} else if (slave.attrXX <= 95) {
-			makeSpan(c, "XX++", "green", false, slave.attrXX);
-		} else if (slave.attrXY <= 95) {
-			makeSpan(c, "XX+++", "green", false, slave.attrXX);
-		}
-		if (slave.energy > 95) {
-			if ((slave.attrXY <= 95) || (slave.attrXX <= 95)) {
-				makeSpan(c, "Nympho!", "green");
-			}
-		} else if (slave.energy > 80) {
-			makeSpan(c, "SD++", "green", false, slave.energy);
-		} else if (slave.energy > 60) {
-			makeSpan(c, "SD+", "green", false, slave.energy);
-		} else if (slave.energy > 40) {
-			makeSpan(c, "SD", "green", false, slave.energy);
-		} else if (slave.energy > 20) {
-			makeSpan(c, "SD-", "red", false, slave.energy);
-		} else {
-			makeSpan(c, "SD--", "red", false, slave.energy);
-		}
-	}
-
-	/**
-	 * @param {App.Entity.SlaveState} slave
-	 * @param {Node} c
-	 * @returns {void}
-	 */
-	function short_smart_fetish(slave, c) {
-		function settingStr() {
-			if (slave.fetishKnown === 1) {
-				if (slave.clitSetting === "off") {
-					return `SP-`;
-				} else if (((slave.fetish !== "submissive") || (slave.fetishStrength <= 95)) && (slave.clitSetting === "submissive")) {
-					return `SP:sub`;
-				} else if (((slave.fetish !== "cumslut") || (slave.fetishStrength <= 95)) && (slave.clitSetting === "oral")) {
-					return `SP:oral`;
-				} else if (((slave.fetish !== "humiliation") || (slave.fetishStrength <= 95)) && (slave.clitSetting === "humiliation")) {
-					return `SP:humil`;
-				} else if (((slave.fetish !== "buttslut") || (slave.fetishStrength <= 95)) && (slave.clitSetting === "anal")) {
-					return `SP:anal`;
-				} else if (((slave.fetish !== "boobs") || (slave.fetishStrength <= 95)) && (slave.clitSetting === "boobs")) {
-					return `SP:boobs`;
-				} else if (((slave.fetish !== "sadist") || (slave.fetishStrength <= 95)) && (slave.clitSetting === "sadist")) {
-					return `SP:sade`;
-				} else if (((slave.fetish !== "masochist") || (slave.fetishStrength <= 95)) && (slave.clitSetting === "masochist")) {
-					return `SP:pain`;
-				} else if (((slave.fetish !== "dom") || (slave.fetishStrength <= 95)) && (slave.clitSetting === "dom")) {
-					return `SP:dom`;
-				} else if (((slave.fetish !== "pregnancy") || (slave.fetishStrength <= 95)) && (slave.clitSetting === "pregnancy")) {
-					return `SP:preg`;
-				} else if (((slave.fetish !== "none") && (slave.clitSetting === "vanilla"))) {
-					return `SP:vanilla`;
-				} else if ((slave.energy <= 95) && (slave.clitSetting === "all")) {
-					return `SP:all`;
-				} else if ((slave.energy > 5) && (slave.clitSetting === "none")) {
-					return `SP:none`;
-				} else if (!["anti-men", "anti-women", "men", "women"].includes(slave.clitSetting)) {
-					return `SP:monitoring`;
+					makeSpan(c, "W+++++", ["red", "strong"], true, slave.weight);
 				}
 			} else {
-				switch (slave.clitSetting) {
-					case "off":
-						return `SP-`;
-					case "submissive":
-						return `SP:sub`;
-					case "lesbian":
-						return `SP:les`;
-					case "oral":
-						return `SP:oral`;
-					case "humiliation":
-						return `SP:humil`;
-					case "anal":
-						return `SP:anal`;
-					case "boobs":
-						return `SP:boobs`;
-					case "sadist":
-						return `SP:sade`;
-					case "masochist":
-						return `SP:pain`;
-					case "dom":
-						return `SP:dom`;
-					case "pregnancy":
-						return `SP:pregnancy`;
-					case "vanilla":
-						return `SP:vanilla`;
-					case "all":
-						return `SP:all`;
-					case "none":
-						return `SP:none`;
+				if (V.arcologies[0].FSHedonisticDecadence !== "unset") {
+					makeSpan(c, "W++++++", "strong", true, slave.weight);
+				} else {
+					makeSpan(c, "W++++++", ["red", "strong"], true, slave.weight);
 				}
 			}
-			return null;
-		}
-		const s = settingStr();
-		if (s) {
-			makeSpan(c, settingStr());
-		}
-	}
+		},
 
-	/**
-	 * @param {App.Entity.SlaveState} slave
-	 * @param {Node} c
-	 * @returns {void}
-	 */
-	function short_smart_attraction(slave, c) {
-		function settingStr() {
-			if (slave.attrKnown === 1) {
-				if (slave.clitSetting === "women") {
-					if (slave.attrXX < 95) {
-						return `SP:women`;
-					} else {
-						return `SP:monitoring`;
-					}
-				} else if (slave.clitSetting === "men") {
-					if (slave.attrXY < 95) {
-						return `SP:men`;
-					} else {
-						return `SP:monitoring`;
-					}
-				} else if (slave.clitSetting === "anti-women") {
-					if (slave.attrXX > 0) {
-						return `SP:anti-women`;
-					} else {
-						return `SP:monitoring`;
-					}
-				} else if (slave.clitSetting === "anti-men") {
-					if (slave.attrXY > 0) {
-						return `SP:anti-men`;
-					} else {
-						return `SP:monitoring`;
-					}
+		/**
+		 * @param {App.Entity.SlaveState} slave
+		 * @param {Node} c
+		 * @returns {void}
+		 */
+		genitalia: function(slave, c) {
+			const makeSpan = helpers.makeSpan;
+			if (slave.dick > 0) {
+				let dickDesc = "";
+				if (slave.balls === 0) {
+					dickDesc += `Geld`;
 				}
-			} else {
-				if (slave.clitSetting === "women") {
-					return `SP:women`;
-				} else if (slave.clitSetting === "men") {
-					return `SP:men`;
-				} else if (slave.clitSetting === "anti-women") {
-					return `SP:anti-women`;
-				} else if (slave.clitSetting === "anti-men") {
-					return `SP:anti-men`;
+				if ((slave.dick > 8) && (slave.balls > 8)) {
+					dickDesc += `Junk+++`;
+				} else if ((slave.dick > 5) && (slave.balls > 5)) {
+					dickDesc += `Junk++`;
+				} else if ((slave.dick > 4) && (slave.balls > 4)) {
+					dickDesc += `Junk+`;
+				} else if ((slave.dick > 3) && (slave.balls > 3)) {
+					dickDesc += `Junk`;
+				} else if (slave.dick > 8) {
+					dickDesc += `Dick+++`;
+				} else if (slave.dick > 5) {
+					dickDesc += `Dick++`;
+				} else if (slave.dick > 4) {
+					dickDesc += `Dick+`;
+				} else if (slave.dick > 3) {
+					dickDesc += `Dick`;
+				} else if (slave.balls > 10) {
+					dickDesc += `Balls+++`;
+				} else if (slave.balls > 5) {
+					dickDesc += `Balls++`;
+				} else if (slave.balls > 4) {
+					dickDesc += `Balls+`;
+				} else if (slave.balls > 3) {
+					dickDesc += `Balls`;
+				}
+				if (dickDesc.length) {
+					makeSpan(c, dickDesc, "pink");
 				}
 			}
-			return null;
-		}
-		const s = settingStr();
-		if (s) {
-			makeSpan(c, settingStr());
-		}
-	}
-
-	/**
-	 * @param {App.Entity.SlaveState} slave
-	 * @param {Node} c
-	 * @returns {void}
-	 */
-	function short_behavior_flaw(slave, c) {
-		function descStr() {
-			switch (slave.behavioralFlaw) {
-				case "arrogant":
-					return `Arrog`;
-				case "bitchy":
-					return `Bitchy`;
-				case "odd":
-					return `Odd`;
-				case "hates men":
-					return `Men-`;
-				case "hates women":
-					return `Women-`;
-				case "gluttonous":
-					return `Glut`;
-				case "anorexic":
-					return `Ano`;
-				case "devout":
-					return `Dev`;
-				case "liberated":
-					return `Lib`;
-				default:
-					slave.behavioralFlaw = "none";
-					return null;
-			}
-		}
-		const s = descStr();
-		if (s) {
-			makeSpan(c, descStr(), "red");
-		}
-	}
-
-	/**
-	 * @param {App.Entity.SlaveState} slave
-	 * @param {Node} c
-	 * @returns {void}
-	 */
-	function short_sex_flaw(slave, c) {
-		switch (slave.sexualFlaw) {
-			case "hates oral":
-				makeSpan(c, "Oral-", "red");
-				break;
-			case "hates anal":
-				makeSpan(c, "Anal-", "red");
-				break;
-			case "hates penetration":
-				makeSpan(c, "Fuck-", "red");
-				break;
-			case "shamefast":
-				makeSpan(c, "Shame", "red");
-				break;
-			case "idealistic":
-				makeSpan(c, "Ideal", "red");
-				break;
-			case "repressed":
-				makeSpan(c, "Repre", "red");
-				break;
-			case "apathetic":
-				makeSpan(c, "Apath", "red");
-				break;
-			case "crude":
-				makeSpan(c, "Crude", "red");
-				break;
-			case "judgemental":
-				makeSpan(c, "Judge", "red");
-				break;
-			case "cum addict":
-				makeSpan(c, "CumAdd", "yellow");
-				break;
-			case "anal addict":
-				makeSpan(c, "AnalAdd", "yellow");
-				break;
-			case "attention whore":
-				makeSpan(c, "Attention", "yellow");
-				break;
-			case "breast growth":
-				makeSpan(c, "BoobObsess", "yellow");
-				break;
-			case "abusive":
-				makeSpan(c, "Abusive", "yellow");
-				break;
-			case "malicious":
-				makeSpan(c, "Malice", "yellow");
-				break;
-			case "self hating":
-				makeSpan(c, "SelfHatr", "yellow");
-				break;
-			case "neglectful":
-				makeSpan(c, "SelfNeglect", "yellow");
-				break;
-			case "breeder":
-				makeSpan(c, "BreedObsess", "yellow");
-				break;
-			default:
-				slave.sexualFlaw = "none";
-				break;
-		}
-	}
-
-	/**
-	 * @param {App.Entity.SlaveState} slave
-	 * @param {Node} c
-	 * @returns {void}
-	 */
-	function short_behavior_quirk(slave, c) {
-		function descStr() {
-			switch (slave.behavioralQuirk) {
-				case "confident":
-					return `Confid`;
-				case "cutting":
-					return `Cutting`;
-				case "funny":
-					return `Funny`;
-				case "fitness":
-					return `Fit`;
-				case "adores women":
-					return `Women+`;
-				case "adores men":
-					return `Men+`;
-				case "insecure":
-					return `Insec`;
-				case "sinful":
-					return `Sinf`;
-				case "advocate":
-					return `Advoc`;
-				default:
-					slave.behavioralQuirk = "none";
-					return null;
-			}
-		}
-		const s = descStr();
-		if (s) {
-			makeSpan(c, s, "green");
-		}
-	}
-
-	/**
-	 * @param {App.Entity.SlaveState} slave
-	 * @param {Node} c
-	 * @returns {void}
-	 */
-	function short_sex_quirk(slave, c) {
-		function descStr() {
-			switch (slave.sexualQuirk) {
-				case "gagfuck queen":
-					return `Gagfuck`;
-				case "painal queen":
-					return `Painal`;
-				case "strugglefuck queen":
-					return `Struggle`;
-				case "tease":
-					return `Tease`;
-				case "romantic":
-					return `Romantic`;
-				case "perverted":
-					return `Perverted`;
-				case "caring":
-					return `Caring`;
-				case "unflinching":
-					return `Unflinch`;
-				case "size queen":
-					return `SizeQ`;
-				default:
-					slave.sexualQuirk = "none";
-					return null;
+			if (slave.vagina === 0) {
+				makeSpan(c, "VV", "lime");
+			} else if ((slave.pregKnown === 1) && canWalk(slave) && (slave.clothes === "no clothing" || slave.clothes === "body oil") && (slave.shoes === "none")) {
+				makeSpan(c, "NBP", "pink");
+			}
+			if (slave.anus === 0) {
+				makeSpan(c, "AV", "lime");
+			}
+			let holesDesc = "";
+			if ((slave.vagina > 3) && (slave.anus > 3)) {
+				holesDesc += `V++A++`;
+			} else if ((slave.vagina > 2) && (slave.anus > 2)) {
+				holesDesc += `V+A+`;
+			} else if (slave.vagina > 3) {
+				holesDesc += `V++`;
+			} else if (slave.vagina > 2) {
+				holesDesc += `V+`;
+			} else if (slave.anus > 3) {
+				holesDesc += `A++`;
+			} else if (slave.anus > 2) {
+				holesDesc += `A+`;
+			}
+			if (holesDesc.length) {
+				makeSpan(c, holesDesc, "pink");
+			}
+		},
+
+		/**
+		 * @param {App.Entity.SlaveState} slave
+		 * @param {Node} c
+		 * @returns {void}
+		 */
+		diet: function(slave, c) {
+			const makeSpan = helpers.makeSpan;
+			let diet = makeSpan(null, "", ["teal", "strong"]);
+			switch (slave.diet) {
+				case "restricted":
+					diet.textContent = "Di:W-";
+					break;
+				case "fattening":
+					diet.textContent = "Di:W+";
+					break;
+				case "corrective":
+					diet.textContent = "Di:W=";
+					break;
+				case "XX":
+					diet.textContent = "Di:XX+";
+					break;
+				case "XY":
+					diet.textContent = "Di:XY+";
+					break;
+				case "XXY":
+					diet.textContent = "Di:XXY+";
+					break;
+				case "muscle building":
+					diet.textContent = "Di:M+";
+					break;
+				case "slimming":
+					diet.textContent = "Di:M-";
+					break;
+				case "cum production":
+					diet.textContent = "Di:C+";
+					break;
+				case "cleansing":
+					diet.textContent = "Di:H+";
+					break;
+				case "fertility":
+					diet.textContent = "Di:F+";
+					break;
 			}
-		}
-		const s = descStr();
-		if (s) {
-			makeSpan(c, s, "green");
-		}
-	}
-
-	/**
-	 * @param {App.Entity.SlaveState} slave
-	 * @param {Node} c
-	 * @returns {void}
-	 */
-	function long_fetish(slave, c) {
-		function fetishStr() {
-			switch (slave.fetish) {
-				case "submissive":
-					if (slave.fetishStrength > 95) {
-						return "Complete submissive";
-					} else if (slave.fetishStrength > 60) {
-						return "Submissive";
-					} else {
-						return "Submissive tendencies";
-					}
-				case "cumslut":
-					if (slave.fetishStrength > 95) {
-						return "Cumslut";
-					} else if (slave.fetishStrength > 60) {
-						return "Oral fixation";
-					} else {
-						return "Prefers oral";
-					}
-				case "humiliation":
-					if (slave.fetishStrength > 95) {
-						return "Humiliation slut";
-					} else if (slave.fetishStrength > 60) {
-						return "Exhibitionist";
-					} else {
-						return "Interest in humiliation";
-					}
-				case "buttslut":
-					if (slave.fetishStrength > 95) {
-						return "Buttslut";
-					} else if (slave.fetishStrength > 60) {
-						return "Anal fixation";
-					} else {
-						return "Prefers anal";
-					}
-				case "boobs":
-					if (slave.fetishStrength > 95) {
-						return "Boobslut";
-					} else if (slave.fetishStrength > 60) {
-						return "Breast fixation";
-					} else {
-						return "Loves boobs";
-					}
-				case "sadist":
-					if (slave.fetishStrength > 95) {
-						return "Complete sadist";
-					} else if (slave.fetishStrength > 60) {
-						return "Sadist";
-					} else {
-						return "Sadistic tendencies";
-					}
-				case "masochist":
-					if (slave.fetishStrength > 95) {
-						return "Complete masochist";
-					} else if (slave.fetishStrength > 60) {
-						return "Masochist";
-					} else {
-						return "Masochistic tendencies";
-					}
-				case "dom":
-					if (slave.fetishStrength > 95) {
-						return "Complete dom";
-					} else if (slave.fetishStrength > 60) {
-						return "Dominant";
-					} else {
-						return "Dominant tendencies";
-					}
-				case "pregnancy":
-					if (slave.fetishStrength > 95) {
-						return "Pregnancy fetish";
-					} else if (slave.fetishStrength > 60) {
-						return "Pregnancy kink";
-					} else {
-						return "Interest in impregnation";
-					}
-				default:
-					return "Sexually vanilla";
+			if (diet.textContent.length > 0) {
+				c.appendChild(diet);
+			}
+			let specialDiet = makeSpan(null, "", ["cyan", "strong"]);
+			if (slave.dietCum === 2) {
+				specialDiet.textContent = "Cum++";
+			} else if (((slave.dietCum === 1) && (slave.dietMilk === 0))) {
+				specialDiet.textContent = "Cum+";
+			} else if (((slave.dietCum === 1) && (slave.dietMilk === 1))) {
+				specialDiet.textContent = "Cum+ Milk+";
+			} else if (((slave.dietCum === 0) && (slave.dietMilk === 1))) {
+				specialDiet.textContent = "Milk+";
+			} else if ((slave.dietMilk === 2)) {
+				specialDiet.textContent = ">Milk++";
+			}
+			if (specialDiet.textContent.length > 0) {
+				c.appendChild(specialDiet);
+			}
+		},
+
+		/**
+		 * @param {App.Entity.SlaveState} slave
+		 * @param {Node} c
+		 * @returns {void}
+		 */
+		drugs: function(slave, c) {
+			let drugDesc = "";
+			switch (slave.drugs) {
+				case "breast injections":
+					drugDesc = "Boobs+";
+					break;
+				case "intensive breast injections":
+					drugDesc = "Boobs++";
+					break;
+				case "hyper breast injections":
+					drugDesc = "Boobs+++";
+					break;
+				case "nipple enhancers":
+					drugDesc = "Nipple+";
+					break;
+				case "butt injections":
+					drugDesc = "Butt+";
+					break;
+				case "intensive butt injections":
+					drugDesc = "Butt++";
+					break;
+				case "hyper butt injections":
+					drugDesc = "Butt+++";
+					break;
+				case "lip injections":
+					drugDesc = "Lip+";
+					break;
+				case "fertility drugs":
+					drugDesc = "Fert+";
+					break;
+				case "super fertility drugs":
+					drugDesc = "Fert++";
+					break;
+				case "penis enhancement":
+					drugDesc = "Dick+";
+					break;
+				case "intensive penis enhancement":
+					drugDesc = "Dick++";
+					break;
+				case "hyper penis enhancement":
+					drugDesc = "Dick+++";
+					break;
+				case "testicle enhancement":
+					drugDesc = "Balls+";
+					break;
+				case "intensive testicle enhancement":
+					drugDesc = "Balls++";
+					break;
+				case "hyper testicle enhancement":
+					drugDesc = "Balls+++";
+					break;
+				case "psychosuppressants":
+					drugDesc = "Psych-";
+					break;
+				case "psychostimulants":
+					drugDesc = "Psych+";
+					break;
+				case "steroids":
+					drugDesc = "Ster";
+					break;
+				case "female hormone injections":
+					drugDesc = "HormXX++";
+					break;
+				case "male hormone injections":
+					drugDesc = "HormXY++";
+					break;
+				case "hormone enhancers":
+					drugDesc = "Horm+";
+					break;
+				case "hormone blockers":
+					drugDesc = "Horm-";
+					break;
+				case "anti-aging cream":
+					drugDesc = "Age-";
+					break;
+				case "appetite suppressors":
+					drugDesc = "ApSup";
+					break;
+				case "penis atrophiers":
+					drugDesc = "Dick-";
+					break;
+				case "testicle atrophiers":
+					drugDesc = "Balls-";
+					break;
+				case "clitoris atrophiers":
+					drugDesc = "Clit-";
+					break;
+				case "labia atrophiers":
+					drugDesc = "Labia-";
+					break;
+				case "nipple atrophiers":
+					drugDesc = "Nipple-";
+					break;
+				case "lip atrophiers":
+					drugDesc = "Lip-";
+					break;
+				case "breast redistributors":
+					drugDesc = "Breast-";
+					break;
+				case "butt redistributors":
+					drugDesc = "Butt-";
+					break;
+				case "sag-B-gone":
+					drugDesc = "AntiSag";
+					break;
+				case "growth stimulants":
+					drugDesc = "GroStim";
+					break;
+				case "priapism agents":
+					drugDesc = "Erection";
+					break;
 			}
-		}
-		makeSpan(c, fetishStr(), "lightcoral", true, slave.fetishStrength);
-	}
-
-	/**
-	 * @param {App.Entity.SlaveState} slave
-	 * @param {Node} c
-	 * @returns {void}
-	 */
-	function long_attraction(slave, c) {
-		if (slave.attrXY <= 5) {
-			makeSpan(c, "Disgusted by men", "red", true, slave.attrXY);
-		} else if (slave.attrXY <= 15) {
-			makeSpan(c, "Turned off by men", "red", true, slave.attrXY);
-		} else if (slave.attrXY <= 35) {
-			makeSpan(c, "Not attracted to men", "red", true, slave.attrXY);
-		} else if (slave.attrXY <= 65) {
-			makeSpan(c, "Indifferent to men", undefined, true, slave.attrXY);
-		} else if (slave.attrXY <= 85) {
-			makeSpan(c, "Attracted to men", "green", true, slave.attrXY);
-		} else if (slave.attrXY <= 95) {
-			makeSpan(c, "Aroused by men", "green", true, slave.attrXY);
-		} else if (slave.attrXX > 95) {
-			if (slave.energy <= 95) {
-				makeSpan(c, "Omnisexual!", "green");
-			} else {
-				makeSpan(c, "Omnisexual nymphomaniac!", "green");
+			const makeSpan = helpers.makeSpan;
+			if (drugDesc) {
+				makeSpan(c, "Dr:" + drugDesc, ["tan", "strong"]);
 			}
-		} else {
-			makeSpan(c, "Passionate about men", "green", true, slave.attrXY);
-		}
-		if (slave.attrXX <= 5) {
-			makeSpan(c, "disgusted by women", "red", true, slave.attrXX);
-		} else if (slave.attrXX <= 15) {
-			makeSpan(c, "turned off by women", "red", true, slave.attrXX);
-		} else if (slave.attrXX <= 35) {
-			makeSpan(c, "not attracted to women", "red", true, slave.attrXX);
-		} else if (slave.attrXX <= 65) {
-			makeSpan(c, "indifferent to women", undefined, true, slave.attrXX);
-		} else if (slave.attrXX <= 85) {
-			makeSpan(c, "attracted to women", "green", true, slave.attrXX);
-		} else if (slave.attrXX <= 95) {
-			makeSpan(c, "aroused by women", "green", true, slave.attrXX);
-		} else if (slave.attrXY <= 95) {
-			makeSpan(c, "passionate about women", "green", true, slave.attrXX);
-		}
-		if (slave.energy > 95) {
-			if ((slave.attrXY <= 95) || (slave.attrXX <= 95)) {
-				makeSpan(c, "Nymphomaniac!", "green");
+			if (slave.curatives === 2) {
+				makeSpan(c, "Cura", ["lightgreen", "strong"]);
+			} else if (slave.curatives === 1) {
+				makeSpan(c, "Prev", ["lightgreen", "strong"]);
 			}
-		} else if (slave.energy > 80) {
-			makeSpan(c, "Powerful sex drive", "green", true, slave.energy);
-		} else if (slave.energy > 60) {
-			makeSpan(c, "Good sex drive", "green", true, slave.energy);
-		} else if (slave.energy > 40) {
-			makeSpan(c, "Average sex drive", "yellow", true, slave.energy);
-		} else if (slave.energy > 20) {
-			makeSpan(c, "Poor sex drive", "red", true, slave.energy);
-		} else {
-			makeSpan(c, "No sex drive", "red", true, slave.energy);
-		}
-	}
-
-	/**
-	 * @param {App.Entity.SlaveState} slave
-	 * @param {Node} c
-	 * @returns {void}
-	 */
-	function long_smart_fetish(slave, c) {
-		function descStr() {
-			if (slave.fetishKnown === 1) {
-				if (slave.clitSetting === "off") {
-					return `SP off.`;
-				} else if (((slave.fetish !== "submissive") || (slave.fetishStrength <= 95)) && (slave.clitSetting === "submissive")) {
-					return `SP: submissive.`;
-				} else if (((slave.fetish !== "cumslut") || (slave.fetishStrength <= 95)) && (slave.clitSetting === "oral")) {
-					return `SP: oral.`;
-				} else if (((slave.fetish !== "humiliation") || (slave.fetishStrength <= 95)) && (slave.clitSetting === "humiliation")) {
-					return `SP: humiliation.`;
-				} else if (((slave.fetish !== "buttslut") || (slave.fetishStrength <= 95)) && (slave.clitSetting === "anal")) {
-					return `SP: anal.`;
-				} else if (((slave.fetish !== "boobs") || (slave.fetishStrength <= 95)) && (slave.clitSetting === "boobs")) {
-					return `SP: breasts.`;
-				} else if (((slave.fetish !== "sadist") || (slave.fetishStrength <= 95)) && (slave.clitSetting === "sadist")) {
-					return `SP: sadism.`;
-				} else if (((slave.fetish !== "masochist") || (slave.fetishStrength <= 95)) && (slave.clitSetting === "masochist")) {
-					return `SP: masochism.`;
-				} else if (((slave.fetish !== "dom") || (slave.fetishStrength <= 95)) && (slave.clitSetting === "dom")) {
-					return `SP: dominance.`;
-				} else if (((slave.fetish !== "pregnancy") || (slave.fetishStrength <= 95)) && (slave.clitSetting === "pregnancy")) {
-					return `SP: pregnancy.`;
-				} else if ((slave.fetish !== "none") && (slave.clitSetting === "vanilla")) {
-					return `SP: vanilla.`;
-				} else if ((slave.energy <= 95) && (slave.clitSetting === "all")) {
-					return `SP: all.`;
-				} else if ((slave.energy > 5) && (slave.clitSetting === "none")) {
-					return `SP: none.`;
-				} else if (!["anti-men", "anti-women", "men", "women"].includes(slave.clitSetting)) {
-					return `SP: monitoring.`;
-				}
-			} else {
-				switch (slave.clitSetting) {
-					case "off":
-						return `SP off.`;
-					case "submissive":
-						return `SP: submissive.`;
-					case "oral":
-						return `SP: oral.`;
-					case "humiliation":
-						return `SP: humiliation.`;
-					case "anal":
-						return `SP: anal.`;
-					case "boobs":
-						return `SP: breasts.`;
-					case "sadist":
-						return `SP: sadism.`;
-					case "masochist":
-						return `SP: masochism.`;
-					case "dom":
-						return `SP: dominance.`;
-					case "pregnancy":
-						return `SP: pregnancy.`;
-					case "vanilla":
-						return `SP: vanilla.`;
-					case "all":
-						return `SP: all.`;
-					case "none":
-						return `SP: none.`;
+			if (slave.aphrodisiacs !== 0) {
+				if (slave.aphrodisiacs === 1) {
+					makeSpan(c, "Aph", ["lightblue", "strong"]);
+				} else if (slave.aphrodisiacs === 2) {
+					makeSpan(c, "Aph++", ["lightblue", "strong"]);
+				} else {
+					makeSpan(c, "Anaph", ["lightblue", "strong"]);
 				}
 			}
-			return null;
-		}
-		const s = descStr();
-		if (s) {
-			makeSpan(c, s);
-		}
-	}
-
-	/**
-	 * @param {App.Entity.SlaveState} slave
-	 * @param {Node} c
-	 * @returns {void}
-	 */
-	function long_smart_attraction(slave, c) {
-		if (slave.attrKnown === 1) {
-			if ((slave.attrXX < 100) && (slave.clitSetting === "women")) {
-				makeSpan(c, `SP: women.`);
-			} else if ((slave.attrXY < 100) && (slave.clitSetting === "men")) {
-				makeSpan(c, `SP: men.`);
-			}
-		} else {
-			if (slave.clitSetting === "women") {
-				makeSpan(c, `SP: women.`);
-			} else if (slave.clitSetting === "men") {
-				makeSpan(c, `SP: men.`);
-			}
-		}
-	}
-
-	/**
-	 * @param {App.Entity.SlaveState} slave
-	 * @param {Node} c
-	 * @returns {void}
-	 */
-	function long_behavior_flaw(slave, c) {
-		function descStr() {
-			switch (slave.behavioralFlaw) {
-				case "arrogant":
-					return `Arrogant.`;
-				case "bitchy":
-					return `Bitchy.`;
-				case "odd":
-					return `Odd.`;
-				case "hates men":
-					return `Hates men.`;
-				case "hates women":
-					return `Hates women.`;
-				case "gluttonous":
-					return `Stress eater.`;
-				case "anorexic":
-					return `Anorexic.`;
-				case "devout":
-					return `Devoutly religious.`;
-				case "liberated":
-					return `Mentally liberated.`;
-				default:
-					slave.behavioralFlaw = "none";
-					return null;
+			if (slave.addict !== 0) {
+				makeSpan(c, "Add", "cyan");
+			}
+			let styles = ["lightsalmon", "strong"];
+			if (slave.hormones > 1) {
+				makeSpan(c, "Ho:F+", styles);
+			} else if (slave.hormones > 0) {
+				makeSpan(c, "Ho:F", styles);
+			} else if (slave.hormones < -1) {
+				makeSpan(c, "Ho:M+", styles);
+			} else if (slave.hormones < 0) {
+				makeSpan(c, "Ho:M", styles);
+			}
+
+			styles = ["mediumseagreen", "strong"];
+			if ((slave.bellyImplant > -1)) {
+				makeSpan(c, "Belly Imp", styles);
+			} else if (((slave.preg <= -2) || (slave.ovaries === 0)) && (slave.vagina !== -1)) {
+				makeSpan(c, "Barr", styles);
+			} else if (slave.pubertyXX === 0 && (slave.ovaries === 1 || slave.mpreg === 1)) {
+				makeSpan(c, "Prepub", styles);
+			} else if (slave.ovaryAge >= 47 && (slave.ovaries === 1 || slave.mpreg === 1)) {
+				makeSpan(c, "Meno", styles);
+			} else if (slave.pregWeek < 0) {
+				makeSpan(c, "Postpartum", styles);
+			} else if (slave.preg === -1) {
+				makeSpan(c, "CC", styles);
+			} else if (slave.preg === 0 && (slave.ovaries === 1 || slave.mpreg === 1)) {
+				makeSpan(c, "Fert+", styles);
+			} else if (((slave.preg < slave.pregData.normalBirth / 10) && (slave.preg > 0) && slave.pregKnown === 0) || slave.pregWeek === 1) {
+				makeSpan(c, "Preg?", styles);
+			} else if ((slave.preg >= 36) && (slave.broodmother > 0)) {
+				makeSpan(c, "Perm preg", styles);
+			} else if (slave.pregKnown === 1) {
+				makeSpan(c, `${slave.pregWeek} wks preg`, styles);
+			}
+			if (slave.induce === 1) {
+				makeSpan(c, "Early Labor", ["orange", "strong"]);
+			}
+			if (slave.pubertyXY === 0 && slave.balls > 0) {
+				makeSpan(c, "Prepub balls", "strong");
+			}
+			if (slave.balls > 0 && slave.vasectomy === 1) {
+				makeSpan(c, "Vasect", "strong");
+			}
+			styles = ["springgreen", "strong"];
+			if (slave.inflation === 3) {
+				makeSpan(c, `8 ltr ${slave.inflationType}`, styles);
+			} else if (slave.inflation === 2) {
+				makeSpan(c, `4 ltr ${slave.inflationType}`, styles);
+			} else if (slave.inflation === 1) {
+				makeSpan(c, `2 ltr ${slave.inflationType}`, styles);
+			} else if (slave.bellyFluid > 0) {
+				makeSpan(c, `${slave.bellyFluid}ccs ${slave.inflationType}`, styles);
+			}
+		},
+		/**
+		 * @param {App.Entity.SlaveState} slave
+		 * @param {Node} c
+		 * @returns {void}
+		 */
+		physicals: function(slave, c) {
+			const b = bits.short;
+			b.age(slave, c);
+			b.face(slave, c);
+			b.eyes(slave, c);
+			b.ears(slave, c);
+			if (slave.markings !== "none") {
+				helpers.makeSpan(c, "Markings");
+			}
+			b.lips(slave, c);
+			b.teeth(slave, c);
+			b.muscles(slave, c);
+			helpers.addText(c, App.Desc.shortLimbs(slave));
+			b.voice(slave, c);
+			b.tits_ass(slave, c);
+			b.hips(slave, c);
+			b.waist(slave, c);
+			b.implants(slave, c);
+			b.lactation(slave, c);
+			b.mods(slave, c);
+		},
+
+		/**
+		 * @param {App.Entity.SlaveState} slave
+		 * @param {Node} c
+		 * @returns {void}
+		 */
+		hormoneBalance: function(slave, c) {
+			if (slave.hormoneBalance <= -21) {
+				helpers.makeSpan(c, "HB:M", ["deepskyblue", "strong"]);
+			} else if (slave.hormoneBalance <= 20) {
+				helpers.makeSpan(c, "HB:N", ["pink", "strong"]);
+			} else if (slave.hormoneBalance <= 500) {
+				helpers.makeSpan(c, "HB:F", ["pink", "strong"]);
 			}
-		}
-		const s = descStr();
-		if (s) {
-			makeSpan(c, s, "red");
-		}
-	}
-
-	/**
-	 * @param {App.Entity.SlaveState} slave
-	 * @param {Node} c
-	 * @returns {void}
-	 */
-	function long_sex_flaw(slave, c) {
-		switch (slave.sexualFlaw) {
-			case "hates oral":
-			case "hates anal":
-			case "hates penetration":
-			case "shamefast":
-				makeSpan(c, slave.sexualFlaw, "red", true);
-				break;
-			case "idealistic":
-			case "repressed":
-			case "apathetic":
-			case "crude":
-			case "judgemental":
-				makeSpan(c, `Sexually ${slave.sexualFlaw}.`, "red");
-				break;
-			case "cum addict":
-			case "anal addict":
-			case "attention whore":
-				makeSpan(c, slave.sexualFlaw, "yellow", true);
-				break;
-			case "breast growth":
-				makeSpan(c, `Breast obsession.`, "yellow");
-				break;
-			case "abusive":
-			case "malicious":
-				makeSpan(c, `Sexually ${slave.sexualFlaw}.`, "yellow");
-				break;
-			case "self hating":
-				makeSpan(c, `Self hatred.`, "yellow");
-				break;
-			case "neglectful":
-				makeSpan(c, `Self neglectful.`, "yellow");
-				break;
-			case "breeder":
-				makeSpan(c, `Breeding obsession.`, "yellow");
-				break;
-			default:
-				slave.sexualFlaw = "none";
-				break;
-		}
-	}
-
-	/**
-	 * @param {App.Entity.SlaveState} slave
-	 * @param {Node} c
-	 * @returns {void}
-	 */
-	function long_behavior_quirk(slave, c) {
-		switch (slave.behavioralQuirk) {
-			case "confident":
-			case "cutting":
-			case "funny":
-			case "fitness":
-			case "adores women":
-			case "adores men":
-			case "insecure":
-			case "sinful":
-			case "advocate":
-				makeSpan(c, slave.behavioralQuirk, "green", true);
-				break;
-			default:
-				slave.behavioralQuirk = "none";
-				break;
-		}
-	}
-
-	/**
-	 * @param {App.Entity.SlaveState} slave
-	 * @param {Node} c
-	 * @returns {void}
-	 */
-	function long_sex_quirk(slave, c) {
-		switch (slave.sexualQuirk) {
-			case "gagfuck queen":
-			case "painal queen":
-			case "strugglefuck queen":
-			case "tease":
-			case "romantic":
-			case "perverted":
-			case "caring":
-			case "unflinching":
-			case "size queen":
-				makeSpan(c, slave.sexualQuirk, "green", true);
-				break;
-			default:
-				slave.sexualQuirk = "none";
-				break;
-		}
-	}
+		},
 
-	/**
-	 * @param {App.Entity.SlaveState} slave
-	 * @returns {string}
-	 */
-	function short_extended_family(slave) {
-		let res = "";
-		let handled = 0;
-		if (slave.mother > 0) {
-			const _ssj = V.slaves.findIndex(s => s.ID === slave.mother);
-			if (_ssj !== -1) {
-				res += `${SlaveFullName(V.slaves[_ssj])}'s ${getPronouns(slave).daughter}`;
-				if (slave.relationshipTarget === V.slaves[_ssj].ID) {
-					const friendShipShort = relationshipTermShort(slave);
-					res += ` & ${friendShipShort}`;
-					handled = 1;
+		/**
+		 * @param {App.Entity.SlaveState} slave
+		 * @param {Node} c
+		 * @returns {void}
+		 */
+		mental: function(slave, c) {
+			const b = bits.short;
+			if (slave.fetish !== "mindbroken") {
+				if (slave.fetishKnown === 1) {
+					b.fetish(slave, c);
 				}
-			}
-			res += " ";
-		} else if (slave.mother === -1) {
-			res += `Your ${getPronouns(slave).daughter}`;
-			if (slave.relationship < -1) {
-				res += ` & ${PCrelationshipTerm(slave)}`;
-				handled = 1;
-			}
-			res += " ";
-		} else if (slave.mother in V.missingTable && V.showMissingSlavesSD && V.showMissingSlaves) {
-			res += `${V.missingTable[slave.mother].fullName}'s ${getPronouns(slave).daughter} `;
-		}
-		if (slave.father > 0 && slave.father !== slave.mother) {
-			const _ssj = V.slaves.findIndex(s => s.ID === slave.father);
-			if (_ssj !== -1) {
-				res += `${SlaveFullName(V.slaves[_ssj])}'s ${getPronouns(slave).daughter}`;
-				if (slave.relationshipTarget === V.slaves[_ssj].ID && handled !== 1) {
-					const friendShipShort = relationshipTermShort(slave);
-					res += ` & ${friendShipShort}`;
-					handled = 1;
+				if (slave.attrKnown === 1) {
+					b.attraction(slave, c);
 				}
 			}
-			res += " ";
-		} else if (slave.father === -1 && slave.mother !== -1) {
-			res += `Your ${getPronouns(slave).daughter}`;
-			if (slave.relationship < -1) {
-				res += ` & ${PCrelationshipTerm(slave)}`;
-				handled = 1;
-			}
-			res += " ";
-		} else if (slave.father in V.missingTable && slave.father !== slave.mother && V.showMissingSlavesSD && V.showMissingSlaves) {
-			res += `${V.missingTable[slave.father].fullName}'s ${getPronouns(slave).daughter}`;
-		}
-		if (slave.daughters === 1) {
-			let _ssj = V.slaves.findIndex(s => s.mother === slave.ID);
-			if (_ssj !== -1) {
-				res += `${SlaveFullName(V.slaves[_ssj])}'s mother`;
-				if (slave.relationshipTarget === V.slaves[_ssj].ID) {
-					const friendShipShort = relationshipTermShort(slave);
-					res += ` & ${friendShipShort}`;
-					handled = 1;
+			if (slave.clitPiercing === 3) {
+				b.smart_fetish(slave, c);
+				b.smart_attraction(slave, c);
+			}
+			b.behavior_flaw(slave, c);
+			b.sex_flaw(slave, c);
+			b.behavior_quirk(slave, c);
+			b.sex_quirk(slave, c);
+		},
+
+		/**
+		 * @param {App.Entity.SlaveState} slave
+		 * @param {Node} c
+		 * @returns {void}
+		 */
+		skills: function(slave, c) {
+			const b = bits.short;
+			b.intelligence(slave, c);
+			b.skills(slave, c);
+			b.prestige(slave, c);
+			b.porn_prestige(slave, c);
+		},
+
+		/**
+		 * @param {App.Entity.SlaveState} slave
+		 * @param {Node} c
+		 * @returns {void}
+		 */
+		race: function(slave, c) {
+			function descStr(slave) {
+				switch (slave.race) {
+					case "white":
+						return `C`;
+					case "asian":
+						return `A`;
+					case "indo-aryan":
+						return `I`;
+					case "latina":
+						return `L`;
+					case "middle eastern":
+						return `ME`;
+					case "black":
+						return `B`;
+					case "pacific islander":
+						return `PI`;
+					case "malay":
+						return `M`;
+					case "amerindian":
+						return `AI`;
+					case "semitic":
+						return `S`;
+					case "southern european":
+						return `SE`;
+					case "mixed race":
+						return `MR`;
+					default:
+						return `${slave.race.charAt(0).toUpperCase() + slave.race.charAt(1) + slave.race.charAt(2)}`;
 				}
 			}
-			res += " ";
-			_ssj = V.slaves.findIndex(s => s.father === slave.ID);
-			if (_ssj !== -1) {
-				res += `${SlaveFullName(V.slaves[_ssj])}'s father`;
-				if (slave.relationshipTarget === V.slaves[_ssj].ID && handled !== 1) {
-					const friendShipShort = relationshipTermShort(slave);
-					res += ` & ${friendShipShort}`;
-					handled = 1;
+			helpers.makeSpan(c, descStr(slave), "tan");
+		},
+
+		/**
+		 * @param {App.Entity.SlaveState} slave
+		 * @param {Node} c
+		 * @returns {void}
+		 */
+		nationality: function(slave, c) {
+			function descStr(slave) {
+				switch (slave.nationality) {
+					case "Afghan":
+						return "Afg";
+					case "Albanian":
+						return "Alb";
+					case "Algerian":
+						return "Alg";
+					case "American":
+						return "USA";
+					case "Andorran":
+						return "And";
+					case "Angolan":
+						return "Ang";
+					case "Antiguan":
+						return "AB";
+					case "Argentinian":
+						return "Arg";
+					case "Armenian":
+						return "Arm";
+					case "Aruban":
+						return "Aru";
+					case "Australian":
+						return "Aus";
+					case "Austrian":
+						return "Aut";
+					case "Azerbaijani":
+						return "Aze";
+					case "Bahamian":
+						return "Bah";
+					case "Bahraini":
+						return "Bah";
+					case "Bangladeshi":
+						return "Bgd";
+					case "Barbadian":
+						return "Bar";
+					case "Belarusian":
+						return "Ber";
+					case "Belgian":
+						return "Bel";
+					case "Belizean":
+						return "Blz";
+					case "Beninese":
+						return "Ben";
+					case "Bermudian":
+						return "Bmd";
+					case "Bhutanese":
+						return "Bhu";
+					case "Bissau-Guinean":
+						return "GB";
+					case "Bolivian":
+						return "Bol";
+					case "Bosnian":
+						return "Bos";
+					case "Brazilian":
+						return "Bra";
+					case "British":
+						return "UK";
+					case "Bruneian":
+						return "Bru";
+					case "Bulgarian":
+						return "Bul";
+					case "Burkinabé":
+						return "BF";
+					case "Burmese":
+						return "Bur";
+					case "Burundian":
+						return "Bnd";
+					case "Cambodian":
+						return "Kam";
+					case "Cameroonian":
+						return "Cam";
+					case "Canadian":
+						return "Can";
+					case "Cape Verdean":
+						return "CV";
+					case "Catalan":
+						return "Cat";
+					case "Central African":
+						return "CAR";
+					case "Chadian":
+						return "Cha";
+					case "Chilean":
+						return "Chl";
+					case "Chinese":
+						return "Chi";
+					case "Colombian":
+						return "Col";
+					case "Comorian":
+						return "Com";
+					case "Congolese":
+						return "RC";
+					case "a Cook Islander":
+						return "CI";
+					case "Costa Rican":
+						return "CR";
+					case "Croatian":
+						return "Cro";
+					case "Cuban":
+						return "Cub";
+					case "Curaçaoan":
+						return "Cur";
+					case "Cypriot":
+						return "Cyp";
+					case "Czech":
+						return "Cze";
+					case "Danish":
+						return "Den";
+					case "Djiboutian":
+						return "Dji";
+					case "Dominican":
+						return "DR";
+					case "Dominiquais":
+						return "Dom";
+					case "Dutch":
+						return "Nld";
+					case "East Timorese":
+						return "ET";
+					case "Ecuadorian":
+						return "Ecu";
+					case "Egyptian":
+						return "Egy";
+					case "Emirati":
+						return "UAE";
+					case "Equatoguinean":
+						return "EG";
+					case "Eritrean":
+						return "Eri";
+					case "Estonian":
+						return "Est";
+					case "Ethiopian":
+						return "Eth";
+					case "Fijian":
+						return "Fij";
+					case "Filipina":
+						return "Phl";
+					case "Finnish":
+						return "Fin";
+					case "French":
+						return "Fra";
+					case "French Guianan":
+						return "FG";
+					case "French Polynesian":
+						return "FP";
+					case "Gabonese":
+						return "Gab";
+					case "Gambian":
+						return "Gam";
+					case "Georgian":
+						return "Geo";
+					case "German":
+						return "Ger";
+					case "Ghanan":
+						return "Gha";
+					case "Greek":
+						return "Gre";
+					case "Greenlandic":
+						return "Grn";
+					case "Grenadian":
+						return "Gda";
+					case "Guamanian":
+						return "Gua";
+					case "Guatemalan":
+						return "Gtm";
+					case "Guinean":
+						return "Gui";
+					case "Guyanese":
+						return "Guy";
+					case "Haitian":
+						return "Hai";
+					case "Honduran":
+						return "Hon";
+					case "Hungarian":
+						return "Hun";
+					case "I-Kiribati":
+						return "Kir";
+					case "Icelandic":
+						return "Ice";
+					case "Indian":
+						return "Ind";
+					case "Indonesian":
+						return "Idn";
+					case "Iranian":
+						return "Irn";
+					case "Iraqi":
+						return "Irq";
+					case "Irish":
+						return "Irl";
+					case "Israeli":
+						return "Isr";
+					case "Italian":
+						return "Ita";
+					case "Ivorian":
+						return "IC";
+					case "Jamaican":
+						return "Jam";
+					case "Japanese":
+						return "Jpn";
+					case "Jordanian":
+						return "Jor";
+					case "Kazakh":
+						return "Kaz";
+					case "Kenyan":
+						return "Ken";
+					case "Kittitian":
+						return "SKN";
+					case "Korean":
+						return "Kor";
+					case "Kosovan":
+						return "Kos";
+					case "Kurdish":
+						return "Kur";
+					case "Kuwaiti":
+						return "Kuw";
+					case "Kyrgyz":
+						return "Kyr";
+					case "Laotian":
+						return "Lao";
+					case "Latvian":
+						return "Lat";
+					case "Lebanese":
+						return "Lbn";
+					case "Liberian":
+						return "Lib";
+					case "Libyan":
+						return "Lby";
+					case "a Liechtensteiner":
+						return "Lie";
+					case "Lithuanian":
+						return "Lit";
+					case "Luxembourgian":
+						return "Lux";
+					case "Macedonian":
+						return "Mac";
+					case "Malagasy":
+						return "Mad";
+					case "Malawian":
+						return "Mwi";
+					case "Malaysian":
+						return "Mys";
+					case "Maldivian":
+						return "Mdv";
+					case "Malian":
+						return "Mal";
+					case "Maltese":
+						return "Mlt";
+					case "Marshallese":
+						return "MI";
+					case "Mauritanian":
+						return "Mta";
+					case "Mauritian":
+						return "Mts";
+					case "Mexican":
+						return "Mex";
+					case "Micronesian":
+						return "FSM";
+					case "Moldovan":
+						return "Mol";
+					case "Monégasque":
+						return "Mnc";
+					case "Mongolian":
+						return "Mon";
+					case "Montenegrin":
+						return "Mng";
+					case "Moroccan":
+						return "Mor";
+					case "Mosotho":
+						return "Les";
+					case "Motswana":
+						return "Bot";
+					case "Mozambican":
+						return "Moz";
+					case "Namibian":
+						return "Nam";
+					case "Nauruan":
+						return "Nau";
+					case "Nepalese":
+						return "Npl";
+					case "New Caledonian":
+						return "NC";
+					case "a New Zealander":
+						return "NZ";
+					case "Ni-Vanuatu":
+						return "Van";
+					case "Nicaraguan":
+						return "Nic";
+					case "Nigerian":
+						return "Nga";
+					case "Nigerien":
+						return "Ngr";
+					case "Niuean":
+						return "Niu";
+					case "Norwegian":
+						return "Nor";
+					case "Omani":
+						return "Omn";
+					case "Pakistani":
+						return "Pak";
+					case "Palauan":
+						return "Plu";
+					case "Palestinian":
+						return "Pal";
+					case "Panamanian":
+						return "Pan";
+					case "Papua New Guinean":
+						return "PNG";
+					case "Paraguayan":
+						return "Par";
+					case "Peruvian":
+						return "Per";
+					case "Polish":
+						return "Pol";
+					case "Portuguese":
+						return "Por";
+					case "Puerto Rican":
+						return "PR";
+					case "Qatari":
+						return "Qat";
+					case "Romanian":
+						return "Rom";
+					case "Russian":
+						return "Rus";
+					case "Rwandan":
+						return "Rwa";
+					case "Sahrawi":
+						return "Sah";
+					case "Saint Lucian":
+						return "SL";
+					case "Salvadoran":
+						return "ES";
+					case "Sammarinese":
+						return "SM";
+					case "Samoan":
+						return "Sam";
+					case "São Toméan":
+						return "STP";
+					case "Saudi":
+						return "Sau";
+					case "Scottish":
+						return "Sco";
+					case "Senegalese":
+						return "Sen";
+					case "Serbian":
+						return "Srb";
+					case "Seychellois":
+						return "Sey";
+					case "Sierra Leonean":
+						return "Sie";
+					case "Singaporean":
+						return "Sng";
+					case "Slovak":
+						return "Svk";
+					case "Slovene":
+						return "Svn";
+					case "a Solomon Islander":
+						return "SI";
+					case "Somali":
+						return "Som";
+					case "South African":
+						return "RSA";
+					case "South Sudanese":
+						return "SS";
+					case "Spanish":
+						return "Spa";
+					case "Sri Lankan":
+						return "Sri";
+					case "Sudanese":
+						return "Sud";
+					case "Surinamese":
+						return "Sur";
+					case "Swazi":
+						return "Swa";
+					case "Swedish":
+						return "Swe";
+					case "Swiss":
+						return "Swi";
+					case "Syrian":
+						return "Syr";
+					case "Taiwanese":
+						return "Tai";
+					case "Tajik":
+						return "Taj";
+					case "Tanzanian":
+						return "Tza";
+					case "Thai":
+						return "Tha";
+					case "Tibetan":
+						return "Tib";
+					case "Togolese":
+						return "Tog";
+					case "Tongan":
+						return "Ton";
+					case "Trinidadian":
+						return "TT";
+					case "Tunisian":
+						return "Tun";
+					case "Turkish":
+						return "Tur";
+					case "Turkmen":
+						return "Tkm";
+					case "Tuvaluan":
+						return "Tuv";
+					case "Ugandan":
+						return "Uga";
+					case "Ukrainian":
+						return "Ukr";
+					case "Uruguayan":
+						return "Uru";
+					case "Uzbek":
+						return "Uzb";
+					case "Vatican":
+						return "VC";
+					case "Venezuelan":
+						return "Ven";
+					case "Vietnamese":
+						return "Vnm";
+					case "Vincentian":
+						return "SVG";
+					case "Yemeni":
+						return "Yem";
+					case "Zairian":
+						return "DRC";
+					case "Zambian":
+						return "Zam";
+					case "Zimbabwean":
+						if (slave.race === "white") {
+							return `Rho`;
+						} else {
+							return `Zwe`;
+						}
+					case "Ancient Chinese Revivalist":
+						return `Chi Rev`;
+					case "Ancient Egyptian Revivalist":
+						return `Egy Rev`;
+					case "Arabian Revivalist":
+						return `Ara Rev`;
+					case "Aztec Revivalist":
+						return `Azt Rev`;
+					case "Edo Revivalist":
+						return `Edo Rev`;
+					case "Roman Revivalist":
+						return `Rom Rev`;
+					case "":
+					case "none":
+					case "slave":
+					case "Stateless":
+						return "None";
+					default:
+						return `${slave.nationality.charAt(0) + slave.nationality.charAt(1) + slave.nationality.charAt(2)}`;
 				}
 			}
-			res += " ";
-		} else if (slave.daughters > 1) {
-			res += `multiple daughters `;
-		}
-		if (slave.sisters === 1) {
-			const _ssj = V.slaves.findIndex(s => areSisters(s, slave) > 0);
-			if (_ssj !== -1) {
-				res += `${SlaveFullName(V.slaves[_ssj])}'s ${getPronouns(slave).sister}`;
-				if (slave.relationshipTarget === V.slaves[_ssj].ID) {
-					const friendShipShort = relationshipTermShort(slave);
-					res += `& ${friendShipShort}`;
-					handled = 1;
+
+			helpers.makeSpan(c, descStr(slave), "tan");
+		},
+
+		/**
+		 * @param {App.Entity.SlaveState} slave
+		 * @param {Node} c
+		 * @returns {void}
+		 */
+		skin: function(slave, c) {
+			function descStr(slave) {
+				switch (slave.skin) {
+					case "pure white":
+						return `P. Whi`;
+					case "extremely fair":
+						return `E. Fai`;
+					case "very fair":
+						return `V. Fai`;
+					case "extremely pale":
+						return `E. Pal`;
+					case "very pale":
+						return `V. Pal`;
+					case "light brown":
+						return `L. Br`;
+					case "dark brown":
+						return `D. Br`;
+					case "light olive":
+						return `L. Oli`;
+					case "dark olive":
+						return `D. Oli`;
+					case "light beige":
+						return `L. Bei`;
+					case "dark beige":
+						return `D. Bei`;
+					case "tan":
+						return `Tan`;
+					case "bronze":
+						return `Bron`;
+					case "ebony":
+						return `Ebon`;
+					case "pure black":
+						return `P. Bla`;
+					case "dark":
+					case "fair":
+					case "pale":
+						return `${slave.skin.charAt(0).toUpperCase() + slave.skin.slice(1)}`;
+					default:
+						return `${slave.skin.charAt(0).toUpperCase() + slave.skin.charAt(1) + slave.skin.charAt(2)}`;
 				}
 			}
-			res += " ";
-		} else if (slave.sisters > 1) {
-			res += `multiple sisters `;
-		}
-		if (slave.relationship > 0 && handled !== 1) {
-			const _ssj = V.slaves.findIndex(s => s.ID === slave.relationshipTarget);
-			if (_ssj !== -1) {
-				res += `${SlaveFullName(V.slaves[_ssj])}'s`;
-				const friendShipShort = relationshipTermShort(slave);
-				res += ` ${friendShipShort}`;
+			helpers.makeSpan(c, descStr(slave));
+		},
+
+		clothes: function() { },
+
+		/**
+		 * @param {App.Entity.SlaveState} slave
+		 * @param {Node} c
+		 * @returns {void}
+		 */
+		rulesets: function(slave, c) {
+			if (slave.useRulesAssistant === 0) {
+				helpers.makeSpan(c, "RA-Exmt", "lightgreen");
 			}
-		} else if (slave.relationship === -3 && slave.mother !== -1 && slave.father !== -1) {
-			res += `Your ${getPronouns(slave).wife}`;
-		} else if (slave.relationship === -2) {
-			res += `E Bonded`;
-		} else if (slave.relationship === -1) {
-			res += `E Slut`;
-		}
-		return res;
-	}
+		},
 
-	/**
-	 * @param {App.Entity.SlaveState} slave
-	 * @param {Node} c
-	 * @returns {void}
-	 */
-	function short_clone(slave, c) {
-		if (slave.clone !== 0) {
-			makeSpan(c, "Clone");
+		origins: function() { },
+
+		/**
+		 * @param {App.Entity.SlaveState} slave
+		 * @param {Node} c
+		 * @returns {void}
+		 */
+		relations: function(slave, c) {
+			const b = bits.short;
+			b.family(slave, c);
+			b.clone(slave, c);
+			b.rival(slave, c);
 		}
-	}
 
-	/**
-	 * @param {App.Entity.SlaveState} slave
-	 * @param {Node} c
-	 * @returns {void}
-	 */
-	function short_rival(slave, c) {
-		if (slave.rivalry !== 0) {
-			const block = makeBlock(c, "lightsalmon");
-			const _ssj = V.slaves.findIndex(s => s.ID === slave.rivalryTarget);
-			if (_ssj !== -1) {
-				if (slave.rivalry <= 1) {
-					block.textContent = `Disl ${SlaveFullName(V.slaves[_ssj])}`;
-				} else if (slave.rivalry <= 2) {
-					block.textContent = `${SlaveFullName(V.slaves[_ssj])}'s rival`;
+	};
+
+	const longRenderers = {
+		/**
+		 * @param {App.Entity.SlaveState} slave
+		 * @param {Node} c
+		 * @returns {void}
+		 */
+		devotion: function(slave, c) {
+			const makeSpan = helpers.makeSpan;
+			if (slave.fetish === "mindbroken") {
+				makeSpan(c, "Mindbroken.", "mindbroken");
+			} else if (slave.devotion < -95) {
+				makeSpan(c, "Very hateful", ["devotion", "hateful"], true, slave.devotion);
+			} else if (slave.devotion < -50) {
+				makeSpan(c, "Hateful", ["devotion", "hateful"], true, slave.devotion);
+			} else if (slave.devotion < -20) {
+				makeSpan(c, "Resistant", ["devotion", "resistant"], true, slave.devotion);
+			} else if (slave.devotion <= 20) {
+				makeSpan(c, "Ambivalent", ["devotion", "ambivalent"], true, slave.devotion);
+			} else if (slave.devotion <= 50) {
+				makeSpan(c, "Accepting", ["devotion", "accept"], true, slave.devotion);
+			} else if (slave.devotion <= 95) {
+				makeSpan(c, "Devoted", ["devotion", "devoted"], true, slave.devotion);
+			} else {
+				makeSpan(c, "Worshipful", ["devotion", "worship"], true, slave.devotion);
+			}
+			if (slave.fetish === "mindbroken") {
+				return;
+			} else if (slave.trust < -95) {
+				makeSpan(c, "Extremely terrified", ["trust", "extremely-terrified"], true, slave.trust);
+			} else if (slave.trust < -50) {
+				makeSpan(c, "Terrified", ["trust", "terrified"], true, slave.trust);
+			} else if (slave.trust < -20) {
+				makeSpan(c, "Frightened", ["trust", "frightened"], true, slave.trust);
+			} else if (slave.trust <= 20) {
+				makeSpan(c, "Fearful", ["trust", "fearful"], true, slave.trust);
+			} else if (slave.trust <= 50) {
+				if (slave.devotion < -20) {
+					makeSpan(c, "Careful", ["defiant", "careful"], true, slave.trust);
 				} else {
-					block.textContent = `Hates ${SlaveFullName(V.slaves[_ssj])}`;
+					makeSpan(c, "Careful", ["trust", "careful"], true, slave.trust);
 				}
-			}
-		}
-	}
-
-	/**
-	 * @param {App.Entity.SlaveState} slave
-	 * @param {Node} c
-	 * @returns {void}
-	 */
-	function long_extended_family(slave, c) {
-		let handled = 0;
-		const block = makeBlock();
-		if (slave.mother > 0) {
-			const _ssj = V.slaves.findIndex(s => s.ID === slave.mother);
-			if (_ssj !== -1) {
-				addText(block, `${SlaveFullName(V.slaves[_ssj])}'s `);
-				const tmpSpan = makeSpan(block, getPronouns(slave).daughter, "lightgreen");
-				if (slave.relationshipTarget === V.slaves[_ssj].ID) {
-					const friendShipShort = relationshipTerm(slave);
-					tmpSpan.textContent += ` and ${friendShipShort}`;
-					handled = 1;
+			} else if (slave.trust <= 95) {
+				if (slave.devotion < -20) {
+					makeSpan(c, "Bold", ["defiant", "bold"], true, slave.trust);
+				} else {
+					makeSpan(c, "Trusting", ["trust", "trusting"], true, slave.trust);
 				}
-				tmpSpan.textContent += '.';
-			}
-		} else if (slave.mother === -1) {
-			addText(block, `Your `);
-			if (slave.relationship < -1) {
-				makeSpan(block, `${getPronouns(slave).daughter} and ${PCrelationshipTerm(slave)}.`, "lightgreen");
-				handled = 1;
 			} else {
-				makeSpan(block, `${getPronouns(slave).daughter}.`, "lightgreen");
-			}
-		} else if (slave.mother in V.missingTable && V.showMissingSlavesSD && V.showMissingSlaves) {
-			addText(block, `${V.missingTable[slave.mother].fullName}'s `);
-			makeSpan(block, `${getPronouns(slave).daughter}.`, "lightgreen");
-		}
-		if (slave.father > 0 && slave.father !== slave.mother) {
-			const _ssj = V.slaves.findIndex(s => s.ID === slave.father);
-			if (_ssj !== -1) {
-				addText(block, `${SlaveFullName(V.slaves[_ssj])}'s `);
-				const tmpSpan = makeSpan(block, getPronouns(slave).daughter, "lightgreen");
-				if (slave.relationshipTarget === V.slaves[_ssj].ID) {
-					const friendShipShort = relationshipTerm(slave);
-					tmpSpan.textContent += ` and ${friendShipShort}`;
-					handled = 1;
+				if (slave.devotion < -20) {
+					makeSpan(c, "Defiant", ["defiant", "full"], true, slave.trust);
+				} else {
+					makeSpan(c, "Profoundly trusting", ["trust", "prof-trusting"], true, slave.trust);
 				}
-				tmpSpan.textContent += '.';
-			}
-		} else if (slave.father === -1 && slave.father !== slave.mother) {
-			addText(block, `Your `);
-			if (slave.relationship < -1) {
-				makeSpan(block, `${getPronouns(slave).daughter} and ${PCrelationshipTerm(slave)}.`, "lightgreen");
-				handled = 1;
-			} else {
-				makeSpan(block, `${getPronouns(slave).daughter}.`, "lightgreen");
 			}
-		} else if (slave.father in V.missingTable && slave.father !== slave.mother && V.showMissingSlavesSD && V.showMissingSlaves) {
-			addText(block, `${V.missingTable[slave.father].fullName}'s `);
-			makeSpan(block, `${getPronouns(slave).daughter}.`, "lightgreen");
-		}
-		if (areSisters(V.PC, slave) > 0) {
-			addText(block, `Your `);
-			if (slave.relationship < -1) {
-				makeSpan(block, `${relativeTerm(V.PC, slave)} and ${PCrelationshipTerm(slave)}.`, "lightgreen");
-				handled = 1;
-			} else {
-				makeSpan(block, `${relativeTerm(V.PC, slave)}.`, "lightgreen");
-			}
-		}
-		if (slave.daughters === 1) {
-			let _ssj = V.slaves.findIndex(s => s.mother === slave.ID);
-			if (_ssj !== -1) {
-				addText(block, `${SlaveFullName(V.slaves[_ssj])}'s `);
-				const tmpSpan = makeSpan(block, "mother", "lightgreen");
-				if (slave.relationshipTarget === V.slaves[_ssj].ID) {
-					const friendShipShort = relationshipTerm(slave);
-					tmpSpan.textContent += ` and ${friendShipShort}`;
-					handled = 1;
+		},
+		/**
+		 * @param {App.Entity.SlaveState} slave
+		 * @param {Node} c
+		 * @returns {void}
+		 */
+		health: function(slave, c) {
+			const b = bits.long;
+			b.health(slave, c);
+			b.illness(slave, c);
+			b.tired(slave, c);
+		},
+
+		/**
+		 * @param {App.Entity.SlaveState} slave
+		 * @param {Node} c
+		 * @returns {void}
+		 */
+		weight: function(slave, c) {
+			const makeSpan = helpers.makeSpan;
+			if (slave.weight < -95) {
+				makeSpan(c, "Emaciated", "red", true, slave.weight);
+			} else if (slave.weight < -30) {
+				if (slave.hips < -1) {
+					makeSpan(c, "Model-thin", null, true, slave.weight);
+				} else {
+					makeSpan(c, "Very thin", "red", true, slave.weight);
 				}
-				tmpSpan.textContent += '.';
-			}
-			_ssj = V.slaves.findIndex(s => s.father === slave.ID);
-			if (_ssj !== -1) {
-				addText(block, `${SlaveFullName(V.slaves[_ssj])}'s `);
-				const tmpSpan = makeSpan(block, "father", "lightgreen");
-				if (slave.relationshipTarget === V.slaves[_ssj].ID) {
-					const friendShipShort = relationshipTerm(slave);
-					tmpSpan.textContent += ` and ${friendShipShort}`;
-					handled = 1;
+			} else if (slave.weight < -10) {
+				makeSpan(c, "Thin", null, true, slave.weight);
+			} else if (slave.weight <= 10) {
+				makeSpan(c, "Trim", null, true, slave.weight);
+			} else if (slave.weight <= 30) {
+				makeSpan(c, "Plush", null, true, slave.weight);
+			} else if (slave.weight <= 95) {
+				if (slave.hips > 1 || V.arcologies[0].FSHedonisticDecadence !== "unset") {
+					makeSpan(c, "Nicely chubby", null, true, slave.weight);
+				} else {
+					makeSpan(c, "Overweight", "red", true, slave.weight);
 				}
-				tmpSpan.textContent += '.';
-			}
-		} else if (slave.daughters > 1) {
-			if (slave.daughters > 10) {
-				makeSpan(block, "Has tons of daughters.", "lightgreen");
-			} else if (slave.daughters > 5) {
-				makeSpan(block, "Has many daughters.", "lightgreen");
-			} else {
-				makeSpan(block, "Has several daughters.", "lightgreen");
-			}
-		}
-		if (slave.sisters === 1) {
-			const _ssj = V.slaves.findIndex(s => areSisters(s, slave) > 0);
-			if (_ssj !== -1) {
-				addText(block, `${SlaveFullName(V.slaves[_ssj])}'s `);
-				const tmpSpan = makeSpan(block, getPronouns(slave).sister, "lightgreen");
-				if (slave.relationshipTarget === V.slaves[_ssj].ID) {
-					const friendShipShort = relationshipTerm(slave);
-					tmpSpan.textContent += ` and ${friendShipShort}`;
-					handled = 1;
+			} else if (slave.weight <= 130) {
+				if (slave.hips > 2 || V.arcologies[0].FSHedonisticDecadence !== "unset") {
+					makeSpan(c, "Pleasantly soft and shapely", null, true, slave.weight);
+				} else {
+					makeSpan(c, "Fat", "red", true, slave.weight);
+				}
+			} else if (slave.weight <= 160) {
+				if (V.arcologies[0].FSHedonisticDecadence !== "unset") {
+					makeSpan(c, "Amazingly voluptuous", null, true, slave.weight);
+				} else {
+					makeSpan(c, "Obese", "red", true, slave.weight);
+				}
+			} else if (slave.weight <= 190) {
+				if (V.arcologies[0].FSHedonisticDecadence !== "unset") {
+					makeSpan(c, "SSBBW", null, true, slave.weight);
+				} else {
+					makeSpan(c, "Super Obese", "red", true, slave.weight);
 				}
-				tmpSpan.textContent += '.';
-			}
-		} else if (slave.sisters > 1) {
-			if (slave.sisters > 10) {
-				makeSpan(block, "One of many sisters.", "lightgreen");
-			} else if (slave.sisters > 5) {
-				makeSpan(block, "Has many sisters.", "lightgreen");
 			} else {
-				makeSpan(block, "Has several sisters.", "lightgreen");
-			}
-		}
-		if (slave.relationship > 0 && handled !== 1) {
-			const _ssj = V.slaves.findIndex(s => s.ID === slave.relationshipTarget);
-			if (_ssj !== -1) {
-				const friendship = relationshipTerm(slave);
-				addText(block, `${SlaveFullName(V.slaves[_ssj])}'s `);
-				makeSpan(block, `${friendship}.`, "lightgreen");
-			}
-		} else if (slave.relationship === -3 && slave.mother !== -1 && slave.father !== -1 && areSisters(V.PC, slave) === 0) {
-			makeSpan(block, `Your ${getPronouns(slave).wife}.`, "lightgreen");
-		} else if (slave.relationship === -2) {
-			makeSpan(block, "Emotionally bonded to you.", "lightgreen");
-		} else if (slave.relationship === -1) {
-			makeSpan(block, "Emotional slut.", "lightgreen");
-		}
-
-		if (block.textContent.length > 0) {
-			c.appendChild(block);
-		}
-	}
-
-	/**
-	 * @param {App.Entity.SlaveState} slave
-	 * @param {Node} c
-	 * @returns {void}
-	 */
-	function long_clone(slave, c) {
-		if (slave.clone !== 0) {
-			makeSpan(c, `Clone of ${slave.clone}.`, "skyblue");
-		}
-	}
-
-	/**
-	 * @param {App.Entity.SlaveState} slave
-	 * @param {Node} c
-	 * @returns {void}
-	 */
-	function long_rival(slave, c) {
-		if (slave.rivalry !== 0) {
-			const block = makeBlock(c);
-			const _ssj = V.slaves.findIndex(s => s.ID === slave.rivalryTarget);
-			if (_ssj !== -1) {
-				if (slave.rivalry <= 1) {
-					makeSpan(block, "Dislikes", "lightsalmon");
-					block.appendChild(document.createTextNode(` ${SlaveFullName(V.slaves[_ssj])}.`));
-				} else if (slave.rivalry <= 2) {
-					block.appendChild(document.createTextNode(`${SlaveFullName(V.slaves[_ssj])}'s `));
-					makeSpan(block, "rival.", "lightsalmon");
+				if (V.arcologies[0].FSHedonisticDecadence !== "unset") {
+					makeSpan(c, "Perfectly massive", null, true, slave.weight);
 				} else {
-					makeSpan(block, "Hates", "lightsalmon");
-					block.appendChild(document.createTextNode(` ${SlaveFullName(V.slaves[_ssj])}.`));
+					makeSpan(c, "Dangerously Obese", "red", true, slave.weight);
 				}
 			}
-		}
-	}
-
-	/**
-	 * @param {App.Entity.SlaveState} slave
-	 * @param {Node} c
-	 * @returns {void}
-	 */
-	function long_clothes(slave, c) {
-		function descStr() {
-			switch (slave.clothes) {
-				case "attractive lingerie":
-					return `Nice lingerie.`;
-				case "a succubus outfit":
-					return `Succubus outfit.`;
-				case "a string bikini":
-					return `String bikini.`;
-				case "a scalemail bikini":
-					return `Scalemail bikini.`;
-				case "striped panties":
-					return `Striped panties.`;
-				case "a monokini":
-					return `Monokini.`;
-				case "an apron":
-					return `Apron.`;
-				case "a cybersuit":
-					return `Cybersuit.`;
-				case "cutoffs and a t-shirt":
-					return `Cutoffs, t-shirt.`;
-				case "a slutty outfit":
-					return `Slutty outfit.`;
-				case "uncomfortable straps":
-					return `Leather straps.`;
-				case "a fallen nuns habit":
-					return `Slutty habit.`;
-				case "a chattel habit":
-					return `Chattel habit.`;
-				case "a penitent nuns habit":
-					return `Cilice.`;
-				case "slutty jewelry":
-					return `Bangles.`;
-				case "attractive lingerie for a pregnant woman":
-					return `Preggo lingerie.`;
-				case "a maternity dress":
-					return `Maternity dress.`;
-				case "stretch pants and a crop-top":
-					return `Stretch pants, crop-top.`;
-				case "harem gauze":
-					return `Harem outfit.`;
-				case "a slave gown":
-					return `Slave gown.`;
-				case "a halter top dress":
-					return `Halter top dress.`;
-				case "a mini dress":
-					return `Mini dress.`;
-				case "a ball gown":
-					return `Ball gown.`;
-				case "slutty business attire":
-					return `Slutty suit.`;
-				case "nice business attire":
-					return `Nice suit.`;
-				case "a comfortable bodysuit":
-					return `Bodysuit.`;
-				case "a military uniform":
-					return `Military uniform.`;
-				case "a schutzstaffel uniform":
-					return `Schutzstaffel uniform.`;
-				case "a slutty schutzstaffel uniform":
-					return `Slutty Schutzstaffel uniform.`;
-				case "a red army uniform":
-					return `Red Army uniform.`;
-				case "a long qipao":
-					return `Long Qipao.`;
-				case "battlearmor":
-					return `Battlearmor.`;
-				case "a mounty outfit":
-					return `Mounty outfit.`;
-				case "a dirndl":
-					return `Dirndl.`;
-				case "lederhosen":
-					return `Lederhosen.`;
-				case "a biyelgee costume":
-					return `Biyelgee costume.`;
-				case "a leotard":
-					return `Leotard.`;
-				case "a bunny outfit":
-					return `Bunny outfit.`;
-				case "a slutty maid outfit":
-					return `Slutty maid.`;
-				case "a nice maid outfit":
-					return `Nice maid.`;
-				case "a slutty nurse outfit":
-					return `Slutty nurse.`;
-				case "a nice nurse outfit":
-					return `Nice nurse.`;
-				case "a schoolgirl outfit":
-					return `Schoolgirl outfit.`;
-				case "a kimono":
-					return `Kimono.`;
-				case "a hijab and abaya":
-					return `Hijab and abaya.`;
-				case "battledress":
-					return `Battledress.`;
-				case "a latex catsuit":
-					return `Nice latex.`;
-				case "restrictive latex":
-					return `Bondage latex.`;
-				case "conservative clothing":
-					return `Conservative clothing.`;
-				case "chains":
-					return `Chains.`;
-				case "overalls":
-					return `Overalls.`;
-				case "a cheerleader outfit":
-					return `Cheerleader.`;
-				case "clubslut netting":
-					return `Netting.`;
-				case "shibari ropes":
-					return `Shibari.`;
-				case "Western clothing":
-					return `Chaps.`;
-				case "body oil":
-					return `Body oil.`;
-				case "a toga":
-					return `Toga.`;
-				case "a huipil":
-					return `Huipil.`;
-				case "a slutty qipao":
-					return `Slutty qipao.`;
-				case "spats and a tank top":
-					return `Spats, tank top.`;
-				case "a burkini":
-					return `Burkini.`;
-				case "a niqab and abaya":
-					return `Niqab and abaya.`;
-				case "a klan robe":
-					return `Klan robe.`;
-				case "a hijab and blouse":
-					return `Hijab and blouse.`;
-				case "a burqa":
-					return `Burqa.`;
-				case "kitty lingerie":
-					return `Kitty lingerie.`;
-				case "a tube top and thong":
-					return `Tube top, thong.`;
-				case "a button-up shirt and panties":
-					return `Button-up shirt, panties.`;
-				case "a gothic lolita dress":
-					return `Gothic lolita dress.`;
-				case "a hanbok":
-					return `Hanbok.`;
-				case "a bra":
-					return `Nice bra.`;
-				case "a button-up shirt":
-					return `Nice button-up shirt.`;
-				case "a nice pony outfit":
-					return `Nice pony outfit.`;
-				case "a sweater":
-					return `Nice sweater.`;
-				case "a tank-top":
-					return `Nice tank-top.`;
-				case "a thong":
-					return `Nice thong.`;
-				case "a tube top":
-					return `Nice tube top.`;
-				case "a one-piece swimsuit":
-					return `Swimsuit.`;
-				case "a police uniform":
-					return `Police uniform.`;
-				case "a striped bra":
-					return `Striped bra.`;
-				case "a skimpy loincloth":
-					return `Skimpy loincloth.`;
-				case "a slutty klan robe":
-					return `Slutty klan robe.`;
-				case "a slutty pony outfit":
-					return `Slutty pony outfit.`;
-				case "a Santa dress":
-					return `Santa dress.`;
-				case "a sports bra":
-					return `Sports bra.`;
-				case "a sweater and panties":
-					return `Sweater, panties.`;
-				case "a t-shirt":
-					return `T-shirt.`;
-				case "a tank-top and panties":
-					return `Tank-top, panties.`;
-				case "a t-shirt and thong":
-					return `Thong, t-shirt.`;
-				case "an oversized t-shirt and boyshorts":
-					return `Over-sized t-shirt, boy shorts.`;
-				case "an oversized t-shirt":
-					return `Nice over-sized t-shirt.`;
-				case "a t-shirt and jeans":
-					return `Blue jeans, t-shirt.`;
-				case "boyshorts":
-					return `Boy shorts.`;
-				case "cutoffs":
-					return `Jean shorts.`;
-				case "leather pants and pasties":
-					return `Leather pants, pasties.`;
-				case "leather pants":
-					return `Nice leather pants.`;
-				case "panties":
-					return `Nice panties.`;
-				case "sport shorts and a t-shirt":
-					return `Nice sport shorts, shirt.`;
-				case "a t-shirt and panties":
-					return `Panties, t-shirt.`;
-				case "panties and pasties":
-					return `Pasties, panties.`;
-				case "pasties":
-					return `Pasties.`;
-				case "striped underwear":
-					return `Striped underwear`;
-				case "sport shorts and a sports bra":
-					return `Shorts, bra.`;
-				case "jeans":
-					return `Tight blue jeans.`;
-				case "a sweater and cutoffs":
-					return `Jean shorts, sweater.`;
-				case "leather pants and a tube top":
-					return `Leather pants, tube top.`;
-				case "sport shorts":
-					return `Shorts.`;
-				case "a bimbo outfit":
-					return `Bimbo outfit.`;
-				case "a courtesan dress":
-					return `Courtesan dress.`;
-				default:
-					return `Naked.`;
-			}
-		}
-		makeSpan(c, descStr());
-	}
-
-	/**
-	 * @param {App.Entity.SlaveState} slave
-	 * @param {Node} c
-	 * @returns {void}
-	 */
-	function long_collar(slave, c) {
-		function descStr() {
-			switch (slave.collar) {
-				case "uncomfortable leather":
-					return `Leather collar.`;
-				case "tight steel":
-					return `Steel collar.`;
-				case "preg biometrics":
-					return `Pregnancy biometrics collar.`;
-				case "cruel retirement counter":
-					return `Cruel counter collar.`;
-				case "shock punishment":
-					return `Shock collar.`;
-				case "dildo gag":
-					return `Dildo gag.`;
-				case "massive dildo gag":
-					return `Throat-bulging dildo gag.`;
-				case "neck corset":
-					return `Neck corset.`;
-				case "stylish leather":
-					return `Stylish leather collar.`;
-				case "satin choker":
-					return `Satin choker.`;
-				case "silk ribbon":
-					return `Silken ribbon.`;
-				case "heavy gold":
-					return `Gold collar.`;
-				case "bowtie":
-					return `Bowtie collar.`;
-				case "pretty jewelry":
-					return `Pretty collar.`;
-				case "nice retirement counter":
-					return `Nice counter collar.`;
-				case "bell collar":
-					return `Bell collar.`;
-				case "leather with cowbell":
-					return `Cowbell collar.`;
-				case "ancient Egyptian":
-					return `Wesekh.`;
-				case "ball gag":
-					return `Ball gag.`;
-				case "bit gag":
-					return `Bit gag.`;
-				case "porcelain mask":
-					return `Porcelain mask.`;
-				default:
-					return null;
-			}
-		}
-		const s = descStr();
-		if (s) {
-			makeSpan(c, s);
-		}
-	}
+		},
 
-	/**
-	 * @param {App.Entity.SlaveState} slave
-	 * @param {Node} c
-	 * @returns {void}
-	 */
-	function long_belly(slave, c) {
-		function descStr() {
-			switch (slave.bellyAccessory) {
-				case "shapewear":
-					return `Shapewear.`;
-				case "a small empathy belly":
-					return `Small fake belly.`;
-				case "a medium empathy belly":
-					return `Medium fake belly.`;
-				case "a large empathy belly":
-					return `Large fake belly.`;
-				case "a huge empathy belly":
-					return `Huge fake belly.`;
-				case "a corset":
-					return `Corset.`;
-				case "an extreme corset":
-					return `Extreme corsetage.`;
-				case "a support band":
-					return `Support band.`;
-				default:
-					return null;
+		/**
+		 * @param {App.Entity.SlaveState} slave
+		 * @param {Node} c
+		 * @returns {void}
+		 */
+		rules: function(slave, c) {
+			const addText = helpers.addText;
+			addText(c, `Living standard: ${slave.rules.living}. `);
+			if (canTalk(slave, false)) {
+				addText(c, `Speech rules: ${slave.rules.speech}. `);
+			}
+			addText(c, `Relationship rules: ${slave.rules.relationship}. `);
+			addText(c, `Typical punishment: ${slave.rules.punishment}. `);
+			addText(c, `Typical reward: ${slave.rules.reward}. `);
+			addText(c, `Release rules: ${App.Utils.releaseSummaryLong(slave)}. `);
+		},
+
+		/**
+		 * @param {App.Entity.SlaveState} slave
+		 * @param {Node} c
+		 * @returns {void}
+		 */
+		genitalia: function(slave, c) {
+			if (slave.dick > 0) {
+				let dickDesc = "";
+				if (slave.balls === 0) {
+					dickDesc += 'Gelded.';
+				}
+				if ((slave.dick > 8) && (slave.balls > 8)) {
+					dickDesc += `Hyper dick & balls.`;
+				} else if ((slave.dick > 5) && (slave.balls > 5)) {
+					dickDesc += `Monster dick & balls.`;
+				} else if ((slave.dick > 4) && (slave.balls > 4)) {
+					dickDesc = `Huge dick & balls.`;
+				} else if ((slave.dick > 3) && (slave.balls > 3)) {
+					dickDesc = `Big dick & balls.`;
+				} else if (slave.dick > 8) {
+					dickDesc = `Hyper dong.`;
+				} else if (slave.dick > 5) {
+					dickDesc = `Monster dong.`;
+				} else if (slave.dick > 4) {
+					dickDesc = `Huge dick.`;
+				} else if (slave.dick > 3) {
+					dickDesc = `Big dick.`;
+				} else if (slave.balls > 8) {
+					dickDesc = `Hyper balls.`;
+				} else if (slave.balls > 5) {
+					dickDesc = `Monstrous balls.`;
+				} else if (slave.balls > 4) {
+					dickDesc = `Huge balls.`;
+				} else if (slave.balls > 3) {
+					dickDesc = `Big balls.`;
+				}
+				if (dickDesc.length) {
+					helpers.makeSpan(c, dickDesc, "pink");
+				}
 			}
-		}
-		const s = descStr();
-		if (s) {
-			makeSpan(c, s);
-		}
-	}
-
-	/**
-	 * @param {App.Entity.SlaveState} slave
-	 * @param {Node} c
-	 * @returns {void}
-	 */
-	function long_arms(slave, c) {
-		if (["hand gloves", "elbow gloves"].includes(slave.armAccessory)) {
-			makeSpan(c, slave.armAccessory, undefined, true);
-		}
-	}
-
-	/**
-	 * @param {App.Entity.SlaveState} slave
-	 * @param {Node} c
-	 * @returns {void}
-	 */
-	function long_legs(slave, c) {
-		if (slave.legAccessory === "short stockings") {
-			makeSpan(c, "Short stockings.");
-		} else if (slave.legAccessory === "long stockings") {
-			makeSpan(c, "Long stockings.");
-		}
-	}
-
-	/**
-	 * @param {App.Entity.SlaveState} slave
-	 * @param {Node} c
-	 * @returns {void}
-	 */
-	function long_shoes(slave, c) {
-		if (["boots", "extreme heels", "extreme platform heels", "flats", "heels", "platform heels", "platform shoes", "pumps"].includes(slave.shoes)) {
-			makeSpan(c, slave.shoes, undefined, true);
-		} else if (slave.heels === 1) {
-			makeSpan(c, "Crawling.", "yellow");
-		}
-	}
-
-	/**
-	 * @param {App.Entity.SlaveState} slave
-	 * @param {Node} c
-	 * @returns {void}
-	 */
-	function long_chastity(slave, c) {
-		if (slave.chastityAnus === 1 && slave.chastityPenis === 1 && slave.chastityVagina === 1) {
-			makeSpan(c, "Full chastity.");
-		} else if (slave.chastityPenis === 1 && slave.chastityVagina === 1) {
-			makeSpan(c, "Genital chastity.");
-		} else if ((slave.chastityAnus === 1 && slave.chastityVagina === 1) || (slave.chastityAnus === 1 && slave.chastityPenis === 1)) {
-			makeSpan(c, "Combined chastity.");
-		} else if (slave.chastityVagina === 1) {
-			makeSpan(c, "Vaginal chastity.");
-		} else if (slave.chastityPenis === 1) {
-			makeSpan(c, "Chastity cage.");
-		} else if (slave.chastityAnus === 1) {
-			makeSpan(c, "Anal chastity.");
-		}
-	}
-
-	/**
-	 * @param {App.Entity.SlaveState} slave
-	 * @param {Node} c
-	 * @returns {void}
-	 */
-	function long_vaginal_acc(slave, c) {
-		if (slave.vaginalAttachment !== "vibrator") {
-			switch (slave.vaginalAccessory) {
-				case "bullet vibrator":
-					makeSpan(c, "Attached bullet vibrator.");
+			if (slave.vagina === 0) {
+				helpers.makeSpan(c, "Virgin.", "lime");
+			} else if ((slave.pregKnown === 1) && canWalk(slave) && (slave.clothes === "no clothing" || slave.clothes === "body oil") && (slave.shoes === "none")) {
+				helpers.makeSpan(c, "Naked, barefoot, and pregnant.", "pink");
+			}
+			if (slave.anus === 0) {
+				helpers.makeSpan(c, "Anal virgin.", "lime");
+			}
+			let holesDesc = "";
+			if ((slave.vagina > 3) && (slave.anus > 3)) {
+				holesDesc += `Blown out holes.`;
+			} else if ((slave.vagina > 2) && (slave.anus > 2)) {
+				holesDesc += `High mileage.`;
+			} else if (slave.vagina > 3) {
+				holesDesc += `Cavernous pussy.`;
+			} else if (slave.vagina > 2) {
+				holesDesc += `Loose pussy.`;
+			} else if (slave.anus > 3) {
+				holesDesc += `Permagaped anus.`;
+			} else if (slave.anus > 2) {
+				holesDesc += `Gaping anus.`;
+			}
+			if (holesDesc.length) {
+				helpers.makeSpan(c, holesDesc, "pink");
+			}
+		},
+
+		/**
+		 * @param {App.Entity.SlaveState} slave
+		 * @param {Node} c
+		 * @returns {void}
+		 */
+		diet: function(slave, c) {
+			let dietDesc = "";
+			switch (slave.diet) {
+				case "restricted":
+					dietDesc = `Dieting.`;
 					break;
-				case "smart bullet vibrator":
-					makeSpan(c, "Attached smart bullet vibrator.");
+				case "fattening":
+					dietDesc = `Gaining weight.`;
 					break;
-				case "dildo":
-					makeSpan(c, "Vaginal dildo.");
+				case "corrective":
+					dietDesc = `Corrective.`;
 					break;
-				case "large dildo":
-					makeSpan(c, "Large vaginal dildo.");
+				case "XX":
+					dietDesc = `Estrogen rich.`;
 					break;
-				case "huge dildo":
-					makeSpan(c, "Huge vaginal dildo.");
+				case "XY":
+					dietDesc = `Testosterone rich.`;
 					break;
-				case "long dildo":
-					makeSpan(c, "Long vaginal dildo.");
+				case "XXY":
+					dietDesc = `Futanari mix.`;
 					break;
-				case "long, large dildo":
-					makeSpan(c, "Long and large vaginal dildo.");
+				case "muscle building":
+					dietDesc = `Pumping iron.`;
 					break;
-				case "long, huge dildo":
-					makeSpan(c, "Long and wide vaginal dildo.");
+				case "slimming":
+					dietDesc = `Slimming down.`;
 					break;
-			}
-		}
-		if (slave.vaginalAttachment !== "none") {
-			switch (slave.vaginalAttachment) {
-				case "vibrator":
-					makeSpan(c, "Vibrating dildo.");
+				case "cum production":
+					dietDesc = `Cum production.`;
+					break;
+				case "cleansing":
+					dietDesc = `Cleansing.`;
+					break;
+				case "fertility":
+					dietDesc = `Fertility.`;
 					break;
 			}
-		}
-	}
 
-	/**
-	 * @param {App.Entity.SlaveState} slave
-	 * @param {Node} c
-	 * @returns {void}
-	 */
-	function long_dick_acc(slave, c) {
-		switch (slave.dickAccessory) {
-			case "sock":
-				makeSpan(c, "Cock sock.");
-				break;
-			case "bullet vibrator":
-				makeSpan(c, "Frenulum bullet vibrator.");
-				break;
-			case "smart bullet vibrator":
-				makeSpan(c, "Smart frenulum bullet vibrator.");
-				break;
-		}
-	}
+			if (dietDesc) {
+				helpers.makeSpan(c, dietDesc, "teal");
+			}
 
-	/**
-	 * @param {App.Entity.SlaveState} slave
-	 * @param {Node} c
-	 * @returns {void}
-	 */
-	function long_buttplug(slave, c) {
-		switch (slave.buttplug) {
-			case "plug":
-				makeSpan(c, "Buttplug.");
-				break;
-			case "large plug":
-				makeSpan(c, "Large buttplug.");
-				break;
-			case "huge plug":
-				makeSpan(c, "Huge buttplug.");
-				break;
-			case "long plug":
-				makeSpan(c, "Long buttplug.");
-				break;
-			case "long, large plug":
-				makeSpan(c, "Large, long buttplug.");
-				break;
-			case "long, huge plug":
-				makeSpan(c, "Enormous buttplug.");
-				break;
-		}
-		switch (slave.buttplugAttachment) {
-			case "tail":
-				makeSpan(c, "Attached tail.");
-				break;
-			case "cat tail":
-				makeSpan(c, "Attached cat tail.");
-				break;
-			case "fox tail":
-				makeSpan(c, "Attached fox tail.");
-				break;
-			case "cow tail":
-				makeSpan(c, "Attached cow tail.");
-				break;
-		}
-	}
+			function specialDiet(text) {
+				helpers.addText(c, "Diet base: ");
+				helpers.makeSpan(c, text, "cyan");
+			}
 
-	/**
-	 * @param {App.Entity.SlaveState} slave
-	 * @param {Node} c
-	 * @returns {void}
-	 */
-	function rules_assistant(slave, c) {
-		if (slave.useRulesAssistant === 0) {
-			makeSpan(c, "RA-Exempt", "lightgreen");
-		} else if (V.abbreviateRulesets === 2 && (slave.currentRules !== undefined) && (slave.currentRules.length > 0)) {
-			c.innerHTML = `Rules: ${V.defaultRules.filter(x => ruleApplied(slave, x)).map(x => x.name).join(", ")}`;
-		}
-	}
+			if (slave.dietCum === 2) {
+				specialDiet("Cum Based.");
+			} else if (((slave.dietCum === 1) && (slave.dietMilk === 0))) {
+				specialDiet("Cum Added.");
+			} else if (((slave.dietCum === 1) && (slave.dietMilk === 1))) {
+				specialDiet("Milk & Cum Added.");
+			} else if (((slave.dietCum === 0) && (slave.dietMilk === 1))) {
+				specialDiet("Milk Added.");
+			} else if ((slave.dietMilk === 2)) {
+				specialDiet("Milk Based.");
+			}
+		},
 
-	/**
-	 * @param {App.Entity.SlaveState} slave
-	 * @param {Node} c
-	 * @returns {void}
-	 */
-	function origins(slave, c) {
-		const para = makeParagraph(c);
-		para.classList.add("gray");
-		const pronouns = getPronouns(slave);
-		para.textContent = `${slave.origin.replace(/\$([A-Z]?[a-z]+)/g, (match, cap1) => pronouns[cap1] || match)}`;
-	}
+		/**
+		 * @param {App.Entity.SlaveState} slave
+		 * @param {Node} c
+		 * @returns {void}
+		 */
+		drugs: function(slave, c) {
+			const makeSpan = helpers.makeSpan;
+			let swd = WombGetLittersData(slave);
+			if ((slave.drugs !== "no drugs") && (slave.drugs !== "none")) {
+				makeSpan(c, `On ${slave.drugs}.`, "tan");
+			}
+			if (slave.curatives === 2) {
+				makeSpan(c, "On curatives.", "lightgreen");
+			} else if (slave.curatives === 1) {
+				makeSpan(c, "On preventatives.", "lightgreen");
+			}
+			if (slave.aphrodisiacs > 0) {
+				makeSpan(c, `On ${slave.aphrodisiacs > 1 ? 'extreme' : ''} aphrodisiacs.`, "lightblue");
+			} else if (slave.aphrodisiacs === -1) {
+				makeSpan(c, "On anaphrodisiacs.", "lightblue");
+			}
+			if (slave.addict !== 0) {
+				makeSpan(c, "Addict.", "cyan");
+			}
+			if (slave.hormones > 1) {
+				makeSpan(c, "Heavy female hormones.", "lightsalmon");
+			} else if (slave.hormones > 0) {
+				makeSpan(c, "Female hormones.", "lightsalmon");
+			} else if (slave.hormones < -1) {
+				makeSpan(c, "Heavy male hormones.", "lightsalmon");
+			} else if (slave.hormones < 0) {
+				makeSpan(c, "Male hormones.", "lightsalmon");
+			}
+			let styles = "mediumseagreen";
+			if ((slave.bellyImplant > -1)) {
+				makeSpan(c, "Belly Implant.", styles);
+			} else if ((slave.preg <= -2) && (slave.ovaries === 1 || slave.mpreg === 1)) {
+				makeSpan(c, "Barren.", styles);
+			} else if ((slave.ovaries === 0) && (slave.vagina !== -1) && (slave.genes === "XX")) {
+				makeSpan(c, "Barren.", styles);
+			} else if (slave.pubertyXX === 0 && (slave.ovaries === 1 || slave.mpreg === 1)) {
+				makeSpan(c, "Not ovulating yet.", styles);
+			} else if (slave.ovaryAge >= 47 && (slave.ovaries === 1 || slave.mpreg === 1)) {
+				makeSpan(c, "Menopausal.", styles);
+			} else if (slave.pregWeek < 0) {
+				makeSpan(c, "Postpartum.", styles);
+			} else if (slave.preg === -1) {
+				makeSpan(c, "On contraceptives.", styles);
+			} else if (slave.preg === 0 && (slave.ovaries === 1 || slave.mpreg === 1)) {
+				makeSpan(c, "Fertile.", styles);
+			} else if ((slave.preg >= 36) && (slave.broodmother > 0)) {
+				makeSpan(c, "Permanently pregnant.", styles);
+			} else if (swd.litters.length > 1) {
+				let pregTxt = `Concurrent pregnancies: (${swd.litters.length} sets).`;
+				pregTxt += ` Max:${swd.litters[0]} / Min:${swd.litters[swd.litters.length - 1]} week(s).`;
+				makeSpan(c, pregTxt, "lime");
+			} else if (((slave.preg < slave.pregData.normalBirth / 10) && (slave.preg > 0) && slave.pregKnown === 0) || slave.pregWeek === 1) {
+				makeSpan(c, "May be pregnant.");
+			} else if (slave.pregKnown === 1) {
+				if (slave.pregType < 2 || slave.broodmother > 0) {
+					makeSpan(c, `${slave.pregWeek} weeks pregnant.`);
+				} else {
+					let desc = `${slave.pregWeek} weeks pregnant with `;
+					if (slave.pregType >= 40) {
+						desc += `a tremendous brood of offspring.`;
+					} else if (slave.pregType >= 20) {
+						desc += `a brood of offspring.`;
+					} else if (slave.pregType >= 10) {
+						desc += `${slave.pregType} babies.`;
+					} else if (slave.pregType === 9) {
+						desc += `nonuplets.`;
+					} else if (slave.pregType === 8) {
+						desc += `octuplets.`;
+					} else if (slave.pregType === 7) {
+						desc += `septuplets.`;
+					} else if (slave.pregType === 6) {
+						desc += `sextuplets.`;
+					} else if (slave.pregType === 5) {
+						desc += `quintuplets.`;
+					} else if (slave.pregType === 4) {
+						desc += `quadruplets.`;
+					} else if (slave.pregType === 3) {
+						desc += `triplets.`;
+					} else {
+						desc += `twins.`;
+					}
+					makeSpan(c, desc);
+				}
+				if (slave.preg > slave.pregData.normalBirth && slave.broodmother === 0) {
+					makeSpan(c, "(Overdue.)");
+				}
+			}
+			if (slave.induce === 1) {
+				makeSpan(c, "Showing signs of early labor.", "orange");
+			}
+			if (slave.pubertyXY === 0 && slave.balls > 0) {
+				makeSpan(c, "Has not had first ejaculation.");
+			}
+			if (slave.balls > 0 && slave.vasectomy === 1) {
+				makeSpan(c, "Vasectomy.");
+			}
+			if (slave.inflation === 3) {
+				makeSpan(c, `Filled with 8 liters of ${slave.inflationType}.`, "springgreen");
+			} else if (slave.inflation === 2) {
+				makeSpan(c, `Filled with 4 liters of ${slave.inflationType}.`, "springgreen");
+			} else if (slave.inflation === 1) {
+				makeSpan(c, `Filled with 2 liters of ${slave.inflationType}.`, "springgreen");
+			} else if (slave.bellyFluid > 0) {
+				makeSpan(c, `Stuffed with ${slave.bellyFluid}ccs of ${slave.inflationType}.`, "springgreen");
+			}
+		},
 
-	/**
-	 * @param {HTMLElement} element
-	 * @param {string|string[]} [classNames]
-	 */
-	function _addClassNames(element, classNames) {
-		if (classNames != undefined) { /* eslint-disable-line eqeqeq */
-			if (Array.isArray(classNames)) {
-				element.classList.add(...classNames);
-			} else {
-				element.classList.add(classNames);
+		/**
+		 * @param {App.Entity.SlaveState} slave
+		 * @param {Node} c
+		 * @returns {void}
+		 */
+		physicals: function(slave, c) {
+			const b = bits.long;
+			b.age(slave, c);
+			b.face(slave, c);
+			b.eyes(slave, c);
+			b.ears(slave, c);
+			b.lips(slave, c);
+			b.teeth(slave, c);
+			b.muscles(slave, c);
+			helpers.makeSpan(c, App.Desc.longLimbs(slave));
+			b.voice(slave, c);
+			b.tits_ass(slave, c);
+			b.hips(slave, c);
+			b.waist(slave, c);
+			b.implants(slave, c);
+			b.lactation(slave, c);
+			b.mods(slave, c);
+			if (!jQuery.isEmptyObject(slave.brand)) {
+				helpers.makeSpan(c, 'Branded.');
 			}
-		}
-	}
+		},
 
-	/**
-	 * @param {Node} container
-	 * @param {string} text
-	 * @param {string|string[]} [classNames]
-	 * @param {boolean} [stdDecor=false]
-	 * @param {number} [value]
-	 */
-	function makeSpan(container, text, classNames, stdDecor = false, value) {
-		let r = document.createElement("span");
-		r.classList.add("ssi");
-		_addClassNames(r, classNames);
-		if (value != undefined && V.summaryStats) { /* eslint-disable-line eqeqeq */
-			text += `[${value}]`;
+		/**
+		 * @param {App.Entity.SlaveState} slave
+		 * @param {Node} c
+		 * @returns {void}
+		 */
+		hormoneBalance: function(slave, c) {
+			const colorClass = slave.hormoneBalance <= -21 ? "deepskyblue" : "pink";
+			let desc = "";
+			if (slave.hormoneBalance < -400) {
+				desc = `Overwhelmingly masculine`;
+			} else if (slave.hormoneBalance <= -300) {
+				desc = `Extremely masculine`;
+			} else if (slave.hormoneBalance <= -200) {
+				desc = `Heavily masculine`;
+			} else if (slave.hormoneBalance <= -100) {
+				desc = `Very masculine`;
+			} else if (slave.hormoneBalance <= -21) {
+				desc = `Masculine`;
+			} else if (slave.hormoneBalance <= 20) {
+				desc = `Neutral`;
+			} else if (slave.hormoneBalance <= 99) {
+				desc = `Feminine`;
+			} else if (slave.hormoneBalance <= 199) {
+				desc = `Very feminine`;
+			} else if (slave.hormoneBalance <= 299) {
+				desc = `Heavily feminine`;
+			} else if (slave.hormoneBalance <= 399) {
+				desc = `Extremely feminine`;
+			} else if (slave.hormoneBalance <= 500) {
+				desc = `Overwhelmingly feminine`;
+			}
+			helpers.makeSpan(c, desc + " hormone balance.", colorClass);
+		},
+
+		/**
+		 * @param {App.Entity.SlaveState} slave
+		 * @param {Node} c
+		 * @returns {void}
+		 */
+		skills: function(slave, c) {
+			const b = bits.long;
+			b.intelligence(slave, c);
+			b.skills(slave, c);
+			b.prestige(slave, c);
+			b.porn_prestige(slave, c);
+		},
+
+		/**
+		 * @param {App.Entity.SlaveState} slave
+		 * @param {Node} c
+		 * @returns {void}
+		 */
+		clothes: function(slave, c) {
+			const b = bits.long;
+			const dressingBlock = helpers.makeBlock(c);
+			if (slave.choosesOwnClothes === 1) {
+				helpers.makeSpan(dressingBlock, `Dressing ${getPronouns(slave).himself}.`);
+			}
+			b.clothes(slave, dressingBlock);
+			b.collar(slave, dressingBlock);
+			b.belly(slave, dressingBlock);
+			if (hasAnyArms(slave)) {
+				b.arms(slave, dressingBlock);
+			}
+			if (hasAnyLegs(slave)) {
+				b.legs(slave, dressingBlock);
+				b.shoes(slave, dressingBlock);
+			}
+			b.chastity(slave, dressingBlock);
+			b.vaginal_acc(slave, dressingBlock);
+			b.dick_acc(slave, dressingBlock);
+			b.buttplug(slave, dressingBlock);
+		},
+
+		/**
+		 * @param {App.Entity.SlaveState} slave
+		 * @param {Node} c
+		 * @returns {void}
+		 */
+		mental: function(slave, c) {
+			const b = bits.long;
+			if (slave.fetish !== "mindbroken") {
+				if (slave.fetishKnown === 1) {
+					b.fetish(slave, c);
+				}
+				if (slave.attrKnown === 1) {
+					b.attraction(slave, c);
+				}
+			}
+			if (slave.clitPiercing === 3) {
+				b.smart_fetish(slave, c);
+				b.smart_attraction(slave, c);
+			}
+			b.behavior_flaw(slave, c);
+			b.sex_flaw(slave, c);
+			b.behavior_quirk(slave, c);
+			b.sex_quirk(slave, c);
+		},
+
+		/**
+		 * @param {App.Entity.SlaveState} slave
+		 * @param {Node} c
+		 * @returns {void}
+		 */
+		race: function(slave, c) {
+			function descStr(slave) {
+				switch (slave.race) {
+					case "white":
+						return `Caucasian.`;
+					case "asian":
+						return `Asian.`;
+					case "indo-aryan":
+						return `Indo-aryan.`;
+					case "latina":
+						return `Latina.`;
+					case "middle eastern":
+						return `Middle Eastern.`;
+					case "black":
+						return `Black.`;
+					case "pacific islander":
+						return `Pacific Islander.`;
+					case "malay":
+						return `Malay.`;
+					case "amerindian":
+						return `Amerindian.`;
+					case "semitic":
+						return `Semitic.`;
+					case "southern european":
+						return `Southern European.`;
+					case "mixed race":
+						return `Mixed race.`;
+					default:
+						return `${slave.race.charAt(0).toUpperCase() + slave.race.slice(1)}.`;
+				}
+			}
+			helpers.makeSpan(c, descStr(slave), "tan");
+		},
+
+		/**
+		 * @param {App.Entity.SlaveState} slave
+		 * @param {Node} c
+		 * @returns {void}
+		 */
+		nationality: function(slave, c) {
+			function descStr(slave) {
+				switch (slave.nationality) {
+					case "a Cook Islander":
+						return `Cook Islander.`;
+					case "a Liechtensteiner":
+						return `Liechtensteiner.`;
+					case "a New Zealander":
+						return `New Zealander.`;
+					case "a Solomon Islander":
+						return `Solomon Islander.`;
+					case "Zimbabwean":
+						if (slave.race === "white") {
+							return `Rhodesian.`;
+						} else {
+							return `${slave.nationality}.`;
+						}
+					case "slave":
+					case "none":
+					case "":
+					case "Stateless":
+						return `Stateless.`;
+					default:
+						return `${slave.nationality}.`;
+				}
+			}
+
+			helpers.makeSpan(c, descStr(slave), "tan");
+		},
+
+		/**
+		 * @param {App.Entity.SlaveState} slave
+		 * @param {Node} c
+		 * @returns {void}
+		 */
+		skin: function(slave, c) {
+			helpers.makeSpan(c, `${capFirstChar(slave.skin)} skin.`);
+		},
+
+		/**
+		 * @param {App.Entity.SlaveState} slave
+		 * @param {Node} c
+		 * @returns {void}
+		 */
+		rulesets: function(slave, c) {
+			if (slave.useRulesAssistant === 0) {
+				helpers.makeSpan(c, "RA-Exempt", "lightgreen");
+			} else if ((slave.currentRules !== undefined) && (slave.currentRules.length > 0)) {
+				c.innerHTML = `Rules: ${V.defaultRules.filter(x => ruleApplied(slave, x)).map(x => x.name).join(", ")}`;
+			}
+		},
+
+		/**
+		 * @param {App.Entity.SlaveState} slave
+		 * @param {Node} c
+		 * @returns {void}
+		 */
+		origins: function(slave, c) {
+			const para = helpers.makeParagraph(c);
+			para.classList.add("gray");
+			const pronouns = getPronouns(slave);
+			para.textContent = `${slave.origin.replace(/\$([A-Z]?[a-z]+)/g, (match, cap1) => pronouns[cap1] || match)}`;
+		},
+
+		/**
+		 * @param {App.Entity.SlaveState} slave
+		 * @param {Node} c
+		 * @returns {void}
+		 */
+		relations: function(slave, c) {
+			const b = bits.long;
+			b.family(slave, c);
+			b.clone(slave, c);
+			b.rival(slave, c);
+		}
+	};
+
+	return {
+		short: shortRenderers,
+		long: longRenderers,
+		empty: function(){}
+	};
+}();
+
+App.UI.SlaveSummary = function() {
+	const emptyRenderer = (/** @type {App.Entity.SlaveState} */ slave, /** @type {Node} */ c) => { };
+	const delegates = {
+		clothes: emptyRenderer,
+		devotion: emptyRenderer,
+		rules: emptyRenderer,
+		height: emptyRenderer,
+		diet: emptyRenderer,
+		health: emptyRenderer,
+		drugs: emptyRenderer,
+		race: emptyRenderer,
+		nationality: emptyRenderer,
+		genitalia: emptyRenderer,
+		physicals: emptyRenderer,
+		hormoneBalance: emptyRenderer,
+		skills: emptyRenderer,
+		mental: emptyRenderer,
+		weight: emptyRenderer,
+		skin: emptyRenderer,
+		origins: emptyRenderer,
+		rulesets: emptyRenderer,
+		relations: emptyRenderer
+	};
+
+	let delegatesAreValid = false;
+
+	/**
+	 * @returns {App.UI.SlaveSummary.State}
+	 */
+	function makeNewState() {
+		return {
+			abbreviation: {
+				clothes: 2,
+				devotion: 2,
+				diet: 2,
+				drugs: 2,
+				genitalia: 2,
+				health: 2,
+				mental: 2,
+				nationality: 2,
+				origins: 2,
+				physicals: 2,
+				race: 2,
+				rules: 2,
+				rulesets: 2,
+				skills: 2,
+			}
+		};
+	}
+
+	function delegateForSetting(name, setting) {
+		switch (setting) {
+			case 0: return App.UI.SlaveSummaryRenderers.empty;
+			case 1: return App.UI.SlaveSummaryRenderers.short[name];
+			case 2: return App.UI.SlaveSummaryRenderers.long[name];
+		}
+	}
+
+	function initDelegates(settingsObj) {
+		settingsObj = settingsObj || V.UI.slaveSummary;
+		/** @type {App.UI.SlaveSummary.AbbreviationState} */
+		const abbrSettings = settingsObj.abbreviation;
+		for (const setting in abbrSettings) {
+			delegates[setting] = delegateForSetting(setting, abbrSettings[setting]);
+		}
+		delegates.weight = delegateForSetting("weight", abbrSettings.diet);
+		delegates.skin = delegateForSetting("skin", abbrSettings.physicals);
+		delegates.relations = delegateForSetting("relations", abbrSettings.mental);
+		// special settings
+		if (!V.seeRace) {
+			delegates.race = emptyRenderer;
+		}
+	}
+
+	/**
+	 * @param {App.Entity.SlaveState} slave
+	 * @returns {DocumentFragment}
+	 */
+	function render(slave) {
+		/** @type {App.UI.SlaveSummary.AbbreviationState} */
+		const abbrSettings = V.UI.slaveSummary.abbreviation;
+		initDelegates(); // temporary
+
+		const helpers = App.UI.SlaveSummaryImpl.helpers;
+
+		const res = document.createDocumentFragment();
+		let para = helpers.makeParagraph(res);
+
+		delegates.devotion(slave, para);
+		if (!slave.fuckdoll) {
+			delegates.rules(slave, para);
+		}
+		delegates.weight(slave, para);
+		delegates.diet(slave, para);
+		delegates.health(slave, para);
+		delegates.drugs(slave, para);
+
+		para = helpers.makeParagraph(res);
+		para.classList.add("pink");
+		helpers.makeSpan(para, `${capFirstChar(SlaveTitle(slave))}${abbrSettings.physicals === 2 ? '.' : ''}`, ["coral", "strong"]);
+		delegates.race(slave, para);
+		delegates.nationality(slave, para);
+		delegates.skin(slave, para);
+		delegates.genitalia(slave, para);
+		delegates.physicals(slave, para);
+		delegates.hormoneBalance(slave, para);
+
+		para = helpers.makeParagraph(res);
+		delegates.skills(slave, para);
+		delegates.mental(slave, para);
+		if (slave.custom.label) {
+			helpers.makeSpan(res, `${capFirstChar(slave.custom.label)}.`, ["yellow", "strong"]);
 		}
-		r.textContent = stdDecor ? `${capFirstChar(text)}.` : text;
-		if (container) {
-			container.appendChild(r);
+		if ((slave.relationship !== 0) || (slave.relation !== 0) || (abbrSettings.clothes === 2) || (abbrSettings.rulesets === 2)) {
+			para = helpers.makeParagraph(res);
 		}
-		return r;
-	}
-
-	/**
-	 * @param {Node} container
-	 * @param {string} text
-	 * @returns {Text}
-	 */
-	function addText(container, text) {
-		const r = document.createTextNode(text);
-		if (container) {
-			container.appendChild(r);
+		delegates.relations(slave, para);
+		if (!slave.fuckdoll) {
+			delegates.clothes(slave, para);
 		}
-		return r;
-	}
-
-	/**
-	 * @param {Node} [container]
-	 * @param {string|string[]} [classNames]
-	 */
-	function makeBlock(container, classNames) {
-		let r = document.createElement("span");
-		r.classList.add("ssb");
-		_addClassNames(r, classNames);
-		if (container) {
-			container.appendChild(r);
+		const RABlock = helpers.makeBlock(para);
+		delegates.rulesets(slave, RABlock);
+		if (slave.origin !== 0) {
+			delegates.origins(slave, res);
 		}
-		return r;
+		return res;
 	}
 
-	/**
-	 * @param {Node} container
-	 * @param {string|string[]} [classNames]
-	 * @returns {HTMLParagraphElement}
-	 */
-	function makeParagraph(container, classNames) {
-		let r = document.createElement("p");
-		r.classList.add("si");
-		_addClassNames(r, classNames);
-		if (container) {
-			container.appendChild(r);
-		}
-		return r;
+	function displayOptionsFragment() {
+		const res = document.createDocumentFragment();
+
+		// SAH is "Summarized, Abbreviated, Hidden"
+		const SAHOptions = {
+			"Summarized": 2,
+			"Abbreviated": 1,
+			"Hidden": 0
+		};
+
+		function appendOption(name, desc, options) {
+			res.append(App.UI.DOM.Widgets.optionSelector((value) => {
+				V.UI.slaveSummary.abbreviation[name] = value; Engine.play(passage());
+			},
+			options, V.UI.slaveSummary.abbreviation[name], desc));
+		}
+
+		function appendSAHOption(name, desc) {
+			appendOption(name, desc, SAHOptions);
+		}
+
+		appendSAHOption("devotion", "Mental stats are");
+		appendSAHOption("mental", "Mental attributes are");
+		appendSAHOption("rules", "Rules are");
+		appendSAHOption("health", "Health is");
+		appendSAHOption("diet", "Diet and weight are");
+		appendSAHOption("drugs", "Drugs and addiction are");
+		appendSAHOption("hormoneBalance", "Hormone balance is");
+		appendSAHOption("genitalia", "Genitalia are");
+		appendSAHOption("physicals", "Physical traits are");
+		appendSAHOption("skills", "Skills are");
+		appendSAHOption("nationality", "Nationality is");
+		appendSAHOption("race", "Race is");
+		appendOption("rulesets", "Rules Assistant rulesets are", {
+			"Summarized": 2,
+			"Abbreviated": 1
+		});
+		appendOption("clothes", "Clothes are", {
+			"Summarized": 2,
+			"Hidden": 0
+		});
+		appendOption("origins", "Origins are", {
+			"Summarized": 2,
+			"Hidden": 0
+		});
+
+		return res;
 	}
 
-	return SlaveSummary;
-})();
+	return {
+		makeNewState: makeNewState,
+		initDelegates: initDelegates,
+		empty: function() { },
+		render: render,
+		displayOptionsFragment: displayOptionsFragment
+	};
+}();
diff --git a/src/uncategorized/summaryOptions.tw b/src/uncategorized/summaryOptions.tw
index 507d35f4e91..c839f964e85 100644
--- a/src/uncategorized/summaryOptions.tw
+++ b/src/uncategorized/summaryOptions.tw
@@ -70,95 +70,7 @@ Sample summary:
 	<<option 2 "Card">>
 <</options>>
 
-<<options $abbreviateDevotion "Summary Options">>
-	Mental stats are
-	<<option 2 "Summarized">>
-	<<option 1 "Abbreviated">>
-	<<option 0 "Hidden">>
-<</options>>
-
-<<options $abbreviateMental "Summary Options">>
-	Mental attributes are
-	<<option 2 "Summarized">>
-	<<option 1 "Abbreviated">>
-	<<option 0 "Hidden">>
-<</options>>
-
-<<options $abbreviateRules "Summary Options">>
-	Rules are
-	<<option 2 "Summarized">>
-	<<option 1 "Abbreviated">>
-	<<option 0 "Hidden">>
-<</options>>
-
-<<options $abbreviateHealth "Summary Options">>
-	Health is
-	<<option 2 "Summarized">>
-	<<option 1 "Abbreviated">>
-	<<option 0 "Hidden">>
-<</options>>
-
-<<options $abbreviateDiet "Summary Options">>
-	Diet and weight are
-	<<option 2 "Summarized">>
-	<<option 1 "Abbreviated">>
-	<<option 0 "Hidden">>
-<</options>>
-
-<<options $abbreviateDrugs "Summary Options">>
-	Drugs and addiction are
-	<<option 2 "Summarized">>
-	<<option 1 "Abbreviated">>
-	<<option 0 "Hidden">>
-<</options>>
-
-<<options $abbreviateHormoneBalance "Summary Options">>
-	Hormone balance is
-	<<option 2 "Summarized">>
-	<<option 1 "Abbreviated">>
-	<<option 0 "Hidden">>
-<</options>>
-
-<<options $abbreviateGenitalia "Summary Options">>
-	Genitalia are
-	<<option 2 "Summarized">>
-	<<option 1 "Abbreviated">>
-	<<option 0 "Hidden">>
-<</options>>
-
-<<options $abbreviatePhysicals "Summary Options">>
-	Physical traits are
-	<<option 2 "Summarized">>
-	<<option 1 "Abbreviated">>
-	<<option 0 "Hidden">>
-<</options>>
-
-<<options $abbreviateSkills "Summary Options">>
-	Skills are
-	<<option 2 "Summarized">>
-	<<option 1 "Abbreviated">>
-	<<option 0 "Hidden">>
-<</options>>
-
-<<options $abbreviateNationality "Summary Options">>
-	Nationality is
-	<<option 2 "Summarized">>
-	<<option 1 "Abbreviated">>
-	<<option 0 "Hidden">>
-<</options>>
-
-<<options $abbreviateRace "Summary Options">>
-	Race is
-	<<option 2 "Summarized">>
-	<<option 1 "Abbreviated">>
-	<<option 0 "Hidden">>
-<</options>>
-
-<<options $abbreviateRulesets "Summary Options">>
-	Rules Assistant rulesets are
-	<<option 2 "Summarized">>
-	<<option 1 "Abbreviated">>
-<</options>>
+<<= App.UI.DOM.includeDOM(App.UI.SlaveSummary.displayOptionsFragment(), "dof") >>
 
 <<options $summaryStats "Summary Options">>
 	Granular slave stat numbers are
@@ -172,12 +84,6 @@ Main menu assignment shortcuts are
 	<<option 0 "Hidden">>
 <</options>>
 
-<<options $abbreviateOrigins "Summary Options">>
-	Origins are
-	<<option 2 "Summarized">>
-	<<option 0 "Hidden">>
-<</options>>
-
 <<if $showMissingSlaves>>
 	<<options $showMissingSlavesSD "Summary Options">>
 		Missing slave parents are
@@ -187,5 +93,5 @@ Main menu assignment shortcuts are
 <</if>>
 
 <p style="font-style:italic">
-	[[FC Dev's preferred options|Summary Options ][$seeDesk = 0, $seeFCNN = 0, $sortSlavesBy = "devotion",$sortSlavesOrder = "descending",$sortSlavesMain = 0,$rulesAssistantMain = 1,$abbreviateDevotion = 1,$abbreviateRules = 1,$abbreviateClothes = 2,$abbreviateHealth = 1,$abbreviateDiet = 1,$abbreviateDrugs = 1,$abbreviateRace = 1,$abbreviateGenitalia = 1,$abbreviatePhysicals = 1,$abbreviateSkills = 1,$abbreviateMental = 1,$abbreviateSidebar = 1]]
+	[[FC Dev's preferred options|Summary Options ][$seeDesk = 0, $seeFCNN = 0, $sortSlavesBy = "devotion",$sortSlavesOrder = "descending",$sortSlavesMain = 0,$rulesAssistantMain = 1, $UI.slaveSummary.abbreviation = {devotion: 1, mental: 1, rules: 1, clothes: 2, health: 1, diet: 1, drugs: 1, hormoneBalance: 1, race: 1, genitalia: 1, physicals: 1, skills: 1, nationality: 1, rulesets: 1, clothes: 0, origins: 0} ,$abbreviateSidebar = 1]]
 </p>
-- 
GitLab