diff --git a/.gitignore b/.gitignore
index dfacdbb2c958b4a10bb6a18b65a735c72f851fb2..a8e5e95aaf38882c899baf4745d843619fbed5fe 100644
--- a/.gitignore
+++ b/.gitignore
@@ -48,6 +48,9 @@ yarn.lock
 # WebStorm
 .idea
 
+# Gulp
+build/
+
 # backup
 *.bak
 *.gho
diff --git a/Makefile b/Makefile
index e1bee417127f5b00a480ce5923ec21aa3d9b6423..45577632899afb6f539f1a14520626fcd896429a 100644
--- a/Makefile
+++ b/Makefile
@@ -36,9 +36,13 @@ bin/%.html: bin/tmp
 bin/fc.js: bin/
 	devTools/concatFiles.sh js/ '*.js' $@
 
-bin/tmp: bin/fc.js injectGitCommitHash
-	$(TWEEGO) --module=bin/fc.js --head devTools/head.html src/ > $@
+bin/fc.css: bin/
+	devTools/concatFiles.sh css/ '*.css' $@
+
+bin/tmp: bin/fc.js bin/fc.css injectGitCommitHash
+	$(TWEEGO) --module=bin/fc.js --module=bin/fc.css --head resources/raster/favicon/arcologyVector.html src/ > $@
 	rm -f bin/fc.js
+	rm -f bin/fc.css
 
 injectGitCommitHash:
 	printf "App.Version.commitHash = '%s';\n" $(COMMIT) > src/002-config/fc-version.js.commitHash.js
diff --git a/build.config.json b/build.config.json
index 53df91f839f39eaa1e6a83b4fc521639ec8f7d10..29c318251814ba9a463de44b1909ddf65c75d40a 100644
--- a/build.config.json
+++ b/build.config.json
@@ -8,7 +8,8 @@
 	"gitVersionFile": "src/002-config/fc-version.js.commitHash.js",
 	"sources": {
 		"module": {
-			"js": ["js/**/*.js"]
+			"js": ["js/**/*.js"],
+			"css": ["css/**/*.css"]
 		},
 		"story": {
 			"css": ["src/**/*.css"],
@@ -19,7 +20,7 @@
 				"src/art/vector_revamp/layers"
 			]
 		},
-		"head": "devTools/head.html"
+		"head": "resources/raster/favicon/arcologyVector.html"
 	},
 	"options": {
 		"css": {
diff --git a/compile.bat b/compile.bat
index ac1bb770ee1a70e6a490379eecd9b98d1b7111da..ec8bda25248803f824719dd59c073a36896d52d6 100644
--- a/compile.bat
+++ b/compile.bat
@@ -28,13 +28,15 @@ if %GITFOUND% == yes (
 
 if not exist "bin\resources" mkdir bin\resources
 CALL devTools/concatFiles.bat js\ "*.js" bin\fc.js
+CALL devTools/concatFiles.bat css\ "*.css" bin\fc.css
 :: Run the appropriate compiler for the user's CPU architecture.
 if %PROCESSOR_ARCHITECTURE% == AMD64 (
-	CALL "%~dp0devTools\tweeGo\tweego_win64.exe" -o "%~dp0bin/FC_pregmod.html" --module=bin/fc.js --head devTools/head.html "%~dp0src"
+	CALL "%~dp0devTools\tweeGo\tweego_win64.exe" -o "%~dp0bin/FC_pregmod.html" --module=bin/fc.js --module=bin/fc.css --head resources/raster/favicon/arcologyVector.html "%~dp0src"
 ) else (
-	CALL "%~dp0devTools\tweeGo\tweego_win86.exe" -o "%~dp0bin/FC_pregmod.html" --module=bin/fc.js --head devTools/head.html "%~dp0src"
+	CALL "%~dp0devTools\tweeGo\tweego_win86.exe" -o "%~dp0bin/FC_pregmod.html" --module=bin/fc.js --module=bin/fc.css --head resources/raster/favicon/arcologyVector.html "%~dp0src"
 )
 DEL bin\fc.js
+DEL bin\fc.css
 IF EXIST "%~dp0src\002-config\fc-version.js.commitHash.js" DEL "%~dp0src\002-config\fc-version.js.commitHash.js"
 
 popd
diff --git a/compile.sh b/compile.sh
index c77dc55742827eba6e208a4265ef3df92518c8fc..5c6ab810026d650dd61a1a97ce65c845ab272dfd 100755
--- a/compile.sh
+++ b/compile.sh
@@ -75,8 +75,10 @@ function compile() {
 	fi
 
 	devTools/concatFiles.sh js/ '*.js' bin/fc.js
-	$TWEEGO_EXE -o $file --module=bin/fc.js --head devTools/head.html src/ || build_failed="true"
+	devTools/concatFiles.sh css/ '*.css' bin/fc.css
+	$TWEEGO_EXE -o $file --module=bin/fc.js --module=bin/fc.css --head resources/raster/favicon/arcologyVector.html src/ || build_failed="true"
 	rm -f bin/fc.js
+	rm -f bin/fc.css
 	if [ "$build_failed" = "true" ]; then
 		echoError "Build failed."
 		exit 1
diff --git a/src/001-lib/Jquery/CSS.tw b/css/001-lib/Jquery.css
similarity index 99%
rename from src/001-lib/Jquery/CSS.tw
rename to css/001-lib/Jquery.css
index 47b288174bb6cd331925d8c5804890485fda83c7..5345c366310a8f252eb1fa4fb0988b62d51f1419 100644
--- a/src/001-lib/Jquery/CSS.tw
+++ b/css/001-lib/Jquery.css
@@ -1,8 +1,7 @@
-:: JQuery UI stylesheet [stylesheet]
 /*! jQuery UI - v1.12.1 - 2017-05-29
 * http://jqueryui.com
 * Includes: draggable.css, core.css, resizable.css, selectable.css, sortable.css, accordion.css, autocomplete.css, menu.css, button.css, controlgroup.css, checkboxradio.css, datepicker.css, dialog.css, progressbar.css, selectmenu.css, slider.css, spinner.css, tabs.css, tooltip.css, theme.css
 * To view and modify this theme, visit http://jqueryui.com/themeroller/?scope=&folderName=ui-darkness&cornerRadiusShadow=8px&offsetLeftShadow=-7px&offsetTopShadow=-7px&thicknessShadow=7px&opacityShadow=60&bgImgOpacityShadow=30&bgTextureShadow=flat&bgColorShadow=cccccc&opacityOverlay=80&bgImgOpacityOverlay=50&bgTextureOverlay=flat&bgColorOverlay=5c5c5c&iconColorError=a83300&fcError=111111&borderColorError=ffb73d&bgImgOpacityError=40&bgTextureError=glass&bgColorError=ffc73d&iconColorHighlight=4b8e0b&fcHighlight=2e7db2&borderColorHighlight=cccccc&bgImgOpacityHighlight=80&bgTextureHighlight=highlight_soft&bgColorHighlight=eeeeee&iconColorActive=222222&fcActive=ffffff&borderColorActive=ffaf0f&bgImgOpacityActive=30&bgTextureActive=inset_soft&bgColorActive=f58400&iconColorHover=ffffff&fcHover=ffffff&borderColorHover=59b4d4&bgImgOpacityHover=40&bgTextureHover=glass&bgColorHover=0078a3&iconColorDefault=cccccc&fcDefault=eeeeee&borderColorDefault=666666&bgImgOpacityDefault=20&bgTextureDefault=glass&bgColorDefault=555555&iconColorContent=cccccc&fcContent=ffffff&borderColorContent=666666&bgImgOpacityContent=25&bgTextureContent=inset_soft&bgColorContent=000000&iconColorHeader=ffffff&fcHeader=ffffff&borderColorHeader=333333&bgImgOpacityHeader=25&bgTextureHeader=gloss_wave&bgColorHeader=333333&cornerRadius=6px&fsDefault=1.1em&fwDefault=bold&ffDefault=Segoe%20UI%2CArial%2Csans-serif
 * Copyright jQuery Foundation and other contributors; Licensed MIT */
 
-.ui-draggable-handle{-ms-touch-action:none;touch-action:none}.ui-helper-hidden{display:none}.ui-helper-hidden-accessible{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.ui-helper-reset{margin:0;padding:0;border:0;outline:0;line-height:1.3;text-decoration:none;font-size:100%;list-style:none}.ui-helper-clearfix:before,.ui-helper-clearfix:after{content:"";display:table;border-collapse:collapse}.ui-helper-clearfix:after{clear:both}.ui-helper-zfix{width:100%;height:100%;top:0;left:0;position:absolute;opacity:0;filter:Alpha(Opacity=0)}.ui-front{z-index:100}.ui-state-disabled{cursor:default!important;pointer-events:none}.ui-icon{display:inline-block;vertical-align:middle;margin-top:-.25em;position:relative;text-indent:-99999px;overflow:hidden;background-repeat:no-repeat}.ui-widget-icon-block{left:50%;margin-left:-8px;display:block}.ui-widget-overlay{position:fixed;top:0;left:0;width:100%;height:100%}.ui-resizable{position:relative}.ui-resizable-handle{position:absolute;font-size:0.1px;display:block;-ms-touch-action:none;touch-action:none}.ui-resizable-disabled .ui-resizable-handle,.ui-resizable-autohide .ui-resizable-handle{display:none}.ui-resizable-n{cursor:n-resize;height:7px;width:100%;top:-5px;left:0}.ui-resizable-s{cursor:s-resize;height:7px;width:100%;bottom:-5px;left:0}.ui-resizable-e{cursor:e-resize;width:7px;right:-5px;top:0;height:100%}.ui-resizable-w{cursor:w-resize;width:7px;left:-5px;top:0;height:100%}.ui-resizable-se{cursor:se-resize;width:12px;height:12px;right:1px;bottom:1px}.ui-resizable-sw{cursor:sw-resize;width:9px;height:9px;left:-5px;bottom:-5px}.ui-resizable-nw{cursor:nw-resize;width:9px;height:9px;left:-5px;top:-5px}.ui-resizable-ne{cursor:ne-resize;width:9px;height:9px;right:-5px;top:-5px}.ui-selectable{-ms-touch-action:none;touch-action:none}.ui-selectable-helper{position:absolute;z-index:100;border:1px dotted black}.ui-sortable-handle{-ms-touch-action:none;touch-action:none}.ui-accordion .ui-accordion-header{display:block;cursor:pointer;position:relative;margin:2px 0 0 0;padding:.5em .5em .5em .7em;font-size:100%}.ui-accordion .ui-accordion-content{padding:1em 2.2em;border-top:0;overflow:auto}.ui-autocomplete{position:absolute;top:0;left:0;cursor:default}.ui-menu{list-style:none;padding:0;margin:0;display:block;outline:0}.ui-menu .ui-menu{position:absolute}.ui-menu .ui-menu-item{margin:0;cursor:pointer;list-style-image:url("data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7")}.ui-menu .ui-menu-item-wrapper{position:relative;padding:3px 1em 3px .4em}.ui-menu .ui-menu-divider{margin:5px 0;height:0;font-size:0;line-height:0;border-width:1px 0 0 0}.ui-menu .ui-state-focus,.ui-menu .ui-state-active{margin:-1px}.ui-menu-icons{position:relative}.ui-menu-icons .ui-menu-item-wrapper{padding-left:2em}.ui-menu .ui-icon{position:absolute;top:0;bottom:0;left:.2em;margin:auto 0}.ui-menu .ui-menu-icon{left:auto;right:0}.ui-button{padding:.4em 1em;display:inline-block;position:relative;line-height:normal;margin-right:.1em;cursor:pointer;vertical-align:middle;text-align:center;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;overflow:visible}.ui-button,.ui-button:link,.ui-button:visited,.ui-button:hover,.ui-button:active{text-decoration:none}.ui-button-icon-only{width:2em;box-sizing:border-box;text-indent:-9999px;white-space:nowrap}input.ui-button.ui-button-icon-only{text-indent:0}.ui-button-icon-only .ui-icon{position:absolute;top:50%;left:50%;margin-top:-8px;margin-left:-8px}.ui-button.ui-icon-notext .ui-icon{padding:0;width:2.1em;height:2.1em;text-indent:-9999px;white-space:nowrap}input.ui-button.ui-icon-notext .ui-icon{width:auto;height:auto;text-indent:0;white-space:normal;padding:.4em 1em}input.ui-button::-moz-focus-inner,button.ui-button::-moz-focus-inner{border:0;padding:0}.ui-controlgroup{vertical-align:middle;display:inline-block}.ui-controlgroup > .ui-controlgroup-item{float:left;margin-left:0;margin-right:0}.ui-controlgroup > .ui-controlgroup-item:focus,.ui-controlgroup > .ui-controlgroup-item.ui-visual-focus{z-index:9999}.ui-controlgroup-vertical > .ui-controlgroup-item{display:block;float:none;width:100%;margin-top:0;margin-bottom:0;text-align:left}.ui-controlgroup-vertical .ui-controlgroup-item{box-sizing:border-box}.ui-controlgroup .ui-controlgroup-label{padding:.4em 1em}.ui-controlgroup .ui-controlgroup-label span{font-size:80%}.ui-controlgroup-horizontal .ui-controlgroup-label + .ui-controlgroup-item{border-left:none}.ui-controlgroup-vertical .ui-controlgroup-label + .ui-controlgroup-item{border-top:none}.ui-controlgroup-horizontal .ui-controlgroup-label.ui-widget-content{border-right:none}.ui-controlgroup-vertical .ui-controlgroup-label.ui-widget-content{border-bottom:none}.ui-controlgroup-vertical .ui-spinner-input{width:75%;width:calc( 100% - 2.4em )}.ui-controlgroup-vertical .ui-spinner .ui-spinner-up{border-top-style:solid}.ui-checkboxradio-label .ui-icon-background{box-shadow:inset 1px 1px 1px #ccc;border-radius:.12em;border:none}.ui-checkboxradio-radio-label .ui-icon-background{width:16px;height:16px;border-radius:1em;overflow:visible;border:none}.ui-checkboxradio-radio-label.ui-checkboxradio-checked .ui-icon,.ui-checkboxradio-radio-label.ui-checkboxradio-checked:hover .ui-icon{background-image:none;width:8px;height:8px;border-width:4px;border-style:solid}.ui-checkboxradio-disabled{pointer-events:none}.ui-datepicker{width:17em;padding:.2em .2em 0;display:none}.ui-datepicker .ui-datepicker-header{position:relative;padding:.2em 0}.ui-datepicker .ui-datepicker-prev,.ui-datepicker .ui-datepicker-next{position:absolute;top:2px;width:1.8em;height:1.8em}.ui-datepicker .ui-datepicker-prev-hover,.ui-datepicker .ui-datepicker-next-hover{top:1px}.ui-datepicker .ui-datepicker-prev{left:2px}.ui-datepicker .ui-datepicker-next{right:2px}.ui-datepicker .ui-datepicker-prev-hover{left:1px}.ui-datepicker .ui-datepicker-next-hover{right:1px}.ui-datepicker .ui-datepicker-prev span,.ui-datepicker .ui-datepicker-next span{display:block;position:absolute;left:50%;margin-left:-8px;top:50%;margin-top:-8px}.ui-datepicker .ui-datepicker-title{margin:0 2.3em;line-height:1.8em;text-align:center}.ui-datepicker .ui-datepicker-title select{font-size:1em;margin:1px 0}.ui-datepicker select.ui-datepicker-month,.ui-datepicker select.ui-datepicker-year{width:45%}.ui-datepicker table{width:100%;font-size:.9em;border-collapse:collapse;margin:0 0 .4em}.ui-datepicker th{padding:.7em .3em;text-align:center;font-weight:bold;border:0}.ui-datepicker td{border:0;padding:1px}.ui-datepicker td span,.ui-datepicker td a{display:block;padding:.2em;text-align:right;text-decoration:none}.ui-datepicker .ui-datepicker-buttonpane{background-image:none;margin:.7em 0 0 0;padding:0 .2em;border-left:0;border-right:0;border-bottom:0}.ui-datepicker .ui-datepicker-buttonpane button{float:right;margin:.5em .2em .4em;cursor:pointer;padding:.2em .6em .3em .6em;width:auto;overflow:visible}.ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current{float:left}.ui-datepicker.ui-datepicker-multi{width:auto}.ui-datepicker-multi .ui-datepicker-group{float:left}.ui-datepicker-multi .ui-datepicker-group table{width:95%;margin:0 auto .4em}.ui-datepicker-multi-2 .ui-datepicker-group{width:50%}.ui-datepicker-multi-3 .ui-datepicker-group{width:33.3%}.ui-datepicker-multi-4 .ui-datepicker-group{width:25%}.ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header,.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header{border-left-width:0}.ui-datepicker-multi .ui-datepicker-buttonpane{clear:left}.ui-datepicker-row-break{clear:both;width:100%;font-size:0}.ui-datepicker-rtl{direction:rtl}.ui-datepicker-rtl .ui-datepicker-prev{right:2px;left:auto}.ui-datepicker-rtl .ui-datepicker-next{left:2px;right:auto}.ui-datepicker-rtl .ui-datepicker-prev:hover{right:1px;left:auto}.ui-datepicker-rtl .ui-datepicker-next:hover{left:1px;right:auto}.ui-datepicker-rtl .ui-datepicker-buttonpane{clear:right}.ui-datepicker-rtl .ui-datepicker-buttonpane button{float:left}.ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current,.ui-datepicker-rtl .ui-datepicker-group{float:right}.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header,.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header{border-right-width:0;border-left-width:1px}.ui-datepicker .ui-icon{display:block;text-indent:-99999px;overflow:hidden;background-repeat:no-repeat;left:.5em;top:.3em}.ui-dialog{position:absolute;top:0;left:0;padding:.2em;outline:0}.ui-dialog .ui-dialog-titlebar{padding:.4em 1em;position:relative}.ui-dialog .ui-dialog-title{float:left;margin:.1em 0;white-space:nowrap;width:90%;overflow:hidden;text-overflow:ellipsis}.ui-dialog .ui-dialog-titlebar-close{position:absolute;right:.3em;top:50%;width:20px;margin:-10px 0 0 0;padding:1px;height:20px}.ui-dialog .ui-dialog-content{position:relative;border:0;padding:.5em 1em;background:none;overflow:auto}.ui-dialog .ui-dialog-buttonpane{text-align:left;border-width:1px 0 0 0;background-image:none;margin-top:.5em;padding:.3em 1em .5em .4em}.ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset{float:right}.ui-dialog .ui-dialog-buttonpane button{margin:.5em .4em .5em 0;cursor:pointer}.ui-dialog .ui-resizable-n{height:2px;top:0}.ui-dialog .ui-resizable-e{width:2px;right:0}.ui-dialog .ui-resizable-s{height:2px;bottom:0}.ui-dialog .ui-resizable-w{width:2px;left:0}.ui-dialog .ui-resizable-se,.ui-dialog .ui-resizable-sw,.ui-dialog .ui-resizable-ne,.ui-dialog .ui-resizable-nw{width:7px;height:7px}.ui-dialog .ui-resizable-se{right:0;bottom:0}.ui-dialog .ui-resizable-sw{left:0;bottom:0}.ui-dialog .ui-resizable-ne{right:0;top:0}.ui-dialog .ui-resizable-nw{left:0;top:0}.ui-draggable .ui-dialog-titlebar{cursor:move}.ui-progressbar{height:2em;text-align:left;overflow:hidden}.ui-progressbar .ui-progressbar-value{margin:-1px;height:100%}.ui-progressbar .ui-progressbar-overlay{background:url("data:image/gif;base64,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");height:100%;filter:alpha(opacity=25);opacity:0.25}.ui-progressbar-indeterminate .ui-progressbar-value{background-image:none}.ui-selectmenu-menu{padding:0;margin:0;position:absolute;top:0;left:0;display:none}.ui-selectmenu-menu .ui-menu{overflow:auto;overflow-x:hidden;padding-bottom:1px}.ui-selectmenu-menu .ui-menu .ui-selectmenu-optgroup{font-size:1em;font-weight:bold;line-height:1.5;padding:2px 0.4em;margin:0.5em 0 0 0;height:auto;border:0}.ui-selectmenu-open{display:block}.ui-selectmenu-text{display:block;margin-right:20px;overflow:hidden;text-overflow:ellipsis}.ui-selectmenu-button.ui-button{text-align:left;white-space:nowrap;width:14em}.ui-selectmenu-icon.ui-icon{float:right;margin-top:0}.ui-slider{position:relative;text-align:left}.ui-slider .ui-slider-handle{position:absolute;z-index:2;width:1.2em;height:1.2em;cursor:default;-ms-touch-action:none;touch-action:none}.ui-slider .ui-slider-range{position:absolute;z-index:1;font-size:.7em;display:block;border:0;background-position:0 0}.ui-slider.ui-state-disabled .ui-slider-handle,.ui-slider.ui-state-disabled .ui-slider-range{filter:inherit}.ui-slider-horizontal{height:.8em}.ui-slider-horizontal .ui-slider-handle{top:-.3em;margin-left:-.6em}.ui-slider-horizontal .ui-slider-range{top:0;height:100%}.ui-slider-horizontal .ui-slider-range-min{left:0}.ui-slider-horizontal .ui-slider-range-max{right:0}.ui-slider-vertical{width:.8em;height:100px}.ui-slider-vertical .ui-slider-handle{left:-.3em;margin-left:0;margin-bottom:-.6em}.ui-slider-vertical .ui-slider-range{left:0;width:100%}.ui-slider-vertical .ui-slider-range-min{bottom:0}.ui-slider-vertical .ui-slider-range-max{top:0}.ui-spinner{position:relative;display:inline-block;overflow:hidden;padding:0;vertical-align:middle}.ui-spinner-input{border:none;background:none;color:inherit;padding:.222em 0;margin:.2em 0;vertical-align:middle;margin-left:.4em;margin-right:2em}.ui-spinner-button{width:1.6em;height:50%;font-size:.5em;padding:0;margin:0;text-align:center;position:absolute;cursor:default;display:block;overflow:hidden;right:0}.ui-spinner a.ui-spinner-button{border-top-style:none;border-bottom-style:none;border-right-style:none}.ui-spinner-up{top:0}.ui-spinner-down{bottom:0}.ui-tabs{position:relative;padding:.2em}.ui-tabs .ui-tabs-nav{margin:0;padding:.2em .2em 0}.ui-tabs .ui-tabs-nav li{list-style:none;float:left;position:relative;top:0;margin:1px .2em 0 0;border-bottom-width:0;padding:0;white-space:nowrap}.ui-tabs .ui-tabs-nav .ui-tabs-anchor{float:left;padding:.5em 1em;text-decoration:none}.ui-tabs .ui-tabs-nav li.ui-tabs-active{margin-bottom:-1px;padding-bottom:1px}.ui-tabs .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor,.ui-tabs .ui-tabs-nav li.ui-state-disabled .ui-tabs-anchor,.ui-tabs .ui-tabs-nav li.ui-tabs-loading .ui-tabs-anchor{cursor:text}.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor{cursor:pointer}.ui-tabs .ui-tabs-panel{display:block;border-width:0;padding:1em 1.4em;background:none}.ui-tooltip{padding:8px;position:absolute;z-index:9999;max-width:300px}body .ui-tooltip{border-width:2px}.ui-widget{font-family:Segoe UI,Arial,sans-serif;font-size:1.1em}.ui-widget .ui-widget{font-size:1em}.ui-widget input,.ui-widget select,.ui-widget textarea,.ui-widget button{font-family:Segoe UI,Arial,sans-serif;font-size:1em}.ui-widget.ui-widget-content{border:1px solid #666}.ui-widget-content{border:1px solid #666;background:#000 url("images/ui-bg_inset-soft_25_000000_1x100.png") 50% bottom repeat-x;color:#fff}.ui-widget-content a{color:#fff}.ui-widget-header{border:1px solid #333;background:#333 url("images/ui-bg_gloss-wave_25_333333_500x100.png") 50% 50% repeat-x;color:#fff;font-weight:bold}.ui-widget-header a{color:#fff}.ui-state-default,.ui-widget-content .ui-state-default,.ui-widget-header .ui-state-default,.ui-button,html .ui-button.ui-state-disabled:hover,html .ui-button.ui-state-disabled:active{border:1px solid #666;background:#555 url("images/ui-bg_glass_20_555555_1x400.png") 50% 50% repeat-x;font-weight:bold;color:#eee}.ui-state-default a,.ui-state-default a:link,.ui-state-default a:visited,a.ui-button,a:link.ui-button,a:visited.ui-button,.ui-button{color:#eee;text-decoration:none}.ui-state-hover,.ui-widget-content .ui-state-hover,.ui-widget-header .ui-state-hover,.ui-state-focus,.ui-widget-content .ui-state-focus,.ui-widget-header .ui-state-focus,.ui-button:hover,.ui-button:focus{border:1px solid #59b4d4;background:#0078a3 url("images/ui-bg_glass_40_0078a3_1x400.png") 50% 50% repeat-x;font-weight:bold;color:#fff}.ui-state-hover a,.ui-state-hover a:hover,.ui-state-hover a:link,.ui-state-hover a:visited,.ui-state-focus a,.ui-state-focus a:hover,.ui-state-focus a:link,.ui-state-focus a:visited,a.ui-button:hover,a.ui-button:focus{color:#fff;text-decoration:none}.ui-visual-focus{box-shadow:0 0 3px 1px rgb(94,158,214)}.ui-state-active,.ui-widget-content .ui-state-active,.ui-widget-header .ui-state-active,a.ui-button:active,.ui-button:active,.ui-button.ui-state-active:hover{border:1px solid #ffaf0f;background:#f58400 url("images/ui-bg_inset-soft_30_f58400_1x100.png") 50% 50% repeat-x;font-weight:bold;color:#fff}.ui-icon-background,.ui-state-active .ui-icon-background{border:#ffaf0f;background-color:#fff}.ui-state-active a,.ui-state-active a:link,.ui-state-active a:visited{color:#fff;text-decoration:none}.ui-state-highlight,.ui-widget-content .ui-state-highlight,.ui-widget-header .ui-state-highlight{border:1px solid #ccc;background:#eee url("images/ui-bg_highlight-soft_80_eeeeee_1x100.png") 50% top repeat-x;color:#2e7db2}.ui-state-checked{border:1px solid #ccc;background:#eee}.ui-state-highlight a,.ui-widget-content .ui-state-highlight a,.ui-widget-header .ui-state-highlight a{color:#2e7db2}.ui-state-error,.ui-widget-content .ui-state-error,.ui-widget-header .ui-state-error{border:1px solid #ffb73d;background:#ffc73d url("images/ui-bg_glass_40_ffc73d_1x400.png") 50% 50% repeat-x;color:#111}.ui-state-error a,.ui-widget-content .ui-state-error a,.ui-widget-header .ui-state-error a{color:#111}.ui-state-error-text,.ui-widget-content .ui-state-error-text,.ui-widget-header .ui-state-error-text{color:#111}.ui-priority-primary,.ui-widget-content .ui-priority-primary,.ui-widget-header .ui-priority-primary{font-weight:bold}.ui-priority-secondary,.ui-widget-content .ui-priority-secondary,.ui-widget-header .ui-priority-secondary{opacity:.7;filter:Alpha(Opacity=70);font-weight:normal}.ui-state-disabled,.ui-widget-content .ui-state-disabled,.ui-widget-header .ui-state-disabled{opacity:.35;filter:Alpha(Opacity=35);background-image:none}.ui-state-disabled .ui-icon{filter:Alpha(Opacity=35)}.ui-icon{width:16px;height:16px}.ui-icon,.ui-widget-content .ui-icon{background-image:url("images/ui-icons_cccccc_256x240.png")}.ui-widget-header .ui-icon{background-image:url("images/ui-icons_ffffff_256x240.png")}.ui-state-hover .ui-icon,.ui-state-focus .ui-icon,.ui-button:hover .ui-icon,.ui-button:focus .ui-icon{background-image:url("images/ui-icons_ffffff_256x240.png")}.ui-state-active .ui-icon,.ui-button:active .ui-icon{background-image:url("images/ui-icons_222222_256x240.png")}.ui-state-highlight .ui-icon,.ui-button .ui-state-highlight.ui-icon{background-image:url("images/ui-icons_4b8e0b_256x240.png")}.ui-state-error .ui-icon,.ui-state-error-text .ui-icon{background-image:url("images/ui-icons_a83300_256x240.png")}.ui-button .ui-icon{background-image:url("images/ui-icons_cccccc_256x240.png")}.ui-icon-blank{background-position:16px 16px}.ui-icon-caret-1-n{background-position:0 0}.ui-icon-caret-1-ne{background-position:-16px 0}.ui-icon-caret-1-e{background-position:-32px 0}.ui-icon-caret-1-se{background-position:-48px 0}.ui-icon-caret-1-s{background-position:-65px 0}.ui-icon-caret-1-sw{background-position:-80px 0}.ui-icon-caret-1-w{background-position:-96px 0}.ui-icon-caret-1-nw{background-position:-112px 0}.ui-icon-caret-2-n-s{background-position:-128px 0}.ui-icon-caret-2-e-w{background-position:-144px 0}.ui-icon-triangle-1-n{background-position:0 -16px}.ui-icon-triangle-1-ne{background-position:-16px -16px}.ui-icon-triangle-1-e{background-position:-32px -16px}.ui-icon-triangle-1-se{background-position:-48px -16px}.ui-icon-triangle-1-s{background-position:-65px -16px}.ui-icon-triangle-1-sw{background-position:-80px -16px}.ui-icon-triangle-1-w{background-position:-96px -16px}.ui-icon-triangle-1-nw{background-position:-112px -16px}.ui-icon-triangle-2-n-s{background-position:-128px -16px}.ui-icon-triangle-2-e-w{background-position:-144px -16px}.ui-icon-arrow-1-n{background-position:0 -32px}.ui-icon-arrow-1-ne{background-position:-16px -32px}.ui-icon-arrow-1-e{background-position:-32px -32px}.ui-icon-arrow-1-se{background-position:-48px -32px}.ui-icon-arrow-1-s{background-position:-65px -32px}.ui-icon-arrow-1-sw{background-position:-80px -32px}.ui-icon-arrow-1-w{background-position:-96px -32px}.ui-icon-arrow-1-nw{background-position:-112px -32px}.ui-icon-arrow-2-n-s{background-position:-128px -32px}.ui-icon-arrow-2-ne-sw{background-position:-144px -32px}.ui-icon-arrow-2-e-w{background-position:-160px -32px}.ui-icon-arrow-2-se-nw{background-position:-176px -32px}.ui-icon-arrowstop-1-n{background-position:-192px -32px}.ui-icon-arrowstop-1-e{background-position:-208px -32px}.ui-icon-arrowstop-1-s{background-position:-224px -32px}.ui-icon-arrowstop-1-w{background-position:-240px -32px}.ui-icon-arrowthick-1-n{background-position:1px -48px}.ui-icon-arrowthick-1-ne{background-position:-16px -48px}.ui-icon-arrowthick-1-e{background-position:-32px -48px}.ui-icon-arrowthick-1-se{background-position:-48px -48px}.ui-icon-arrowthick-1-s{background-position:-64px -48px}.ui-icon-arrowthick-1-sw{background-position:-80px -48px}.ui-icon-arrowthick-1-w{background-position:-96px -48px}.ui-icon-arrowthick-1-nw{background-position:-112px -48px}.ui-icon-arrowthick-2-n-s{background-position:-128px -48px}.ui-icon-arrowthick-2-ne-sw{background-position:-144px -48px}.ui-icon-arrowthick-2-e-w{background-position:-160px -48px}.ui-icon-arrowthick-2-se-nw{background-position:-176px -48px}.ui-icon-arrowthickstop-1-n{background-position:-192px -48px}.ui-icon-arrowthickstop-1-e{background-position:-208px -48px}.ui-icon-arrowthickstop-1-s{background-position:-224px -48px}.ui-icon-arrowthickstop-1-w{background-position:-240px -48px}.ui-icon-arrowreturnthick-1-w{background-position:0 -64px}.ui-icon-arrowreturnthick-1-n{background-position:-16px -64px}.ui-icon-arrowreturnthick-1-e{background-position:-32px -64px}.ui-icon-arrowreturnthick-1-s{background-position:-48px -64px}.ui-icon-arrowreturn-1-w{background-position:-64px -64px}.ui-icon-arrowreturn-1-n{background-position:-80px -64px}.ui-icon-arrowreturn-1-e{background-position:-96px -64px}.ui-icon-arrowreturn-1-s{background-position:-112px -64px}.ui-icon-arrowrefresh-1-w{background-position:-128px -64px}.ui-icon-arrowrefresh-1-n{background-position:-144px -64px}.ui-icon-arrowrefresh-1-e{background-position:-160px -64px}.ui-icon-arrowrefresh-1-s{background-position:-176px -64px}.ui-icon-arrow-4{background-position:0 -80px}.ui-icon-arrow-4-diag{background-position:-16px -80px}.ui-icon-extlink{background-position:-32px -80px}.ui-icon-newwin{background-position:-48px -80px}.ui-icon-refresh{background-position:-64px -80px}.ui-icon-shuffle{background-position:-80px -80px}.ui-icon-transfer-e-w{background-position:-96px -80px}.ui-icon-transferthick-e-w{background-position:-112px -80px}.ui-icon-folder-collapsed{background-position:0 -96px}.ui-icon-folder-open{background-position:-16px -96px}.ui-icon-document{background-position:-32px -96px}.ui-icon-document-b{background-position:-48px -96px}.ui-icon-note{background-position:-64px -96px}.ui-icon-mail-closed{background-position:-80px -96px}.ui-icon-mail-open{background-position:-96px -96px}.ui-icon-suitcase{background-position:-112px -96px}.ui-icon-comment{background-position:-128px -96px}.ui-icon-person{background-position:-144px -96px}.ui-icon-print{background-position:-160px -96px}.ui-icon-trash{background-position:-176px -96px}.ui-icon-locked{background-position:-192px -96px}.ui-icon-unlocked{background-position:-208px -96px}.ui-icon-bookmark{background-position:-224px -96px}.ui-icon-tag{background-position:-240px -96px}.ui-icon-home{background-position:0 -112px}.ui-icon-flag{background-position:-16px -112px}.ui-icon-calendar{background-position:-32px -112px}.ui-icon-cart{background-position:-48px -112px}.ui-icon-pencil{background-position:-64px -112px}.ui-icon-clock{background-position:-80px -112px}.ui-icon-disk{background-position:-96px -112px}.ui-icon-calculator{background-position:-112px -112px}.ui-icon-zoomin{background-position:-128px -112px}.ui-icon-zoomout{background-position:-144px -112px}.ui-icon-search{background-position:-160px -112px}.ui-icon-wrench{background-position:-176px -112px}.ui-icon-gear{background-position:-192px -112px}.ui-icon-heart{background-position:-208px -112px}.ui-icon-star{background-position:-224px -112px}.ui-icon-link{background-position:-240px -112px}.ui-icon-cancel{background-position:0 -128px}.ui-icon-plus{background-position:-16px -128px}.ui-icon-plusthick{background-position:-32px -128px}.ui-icon-minus{background-position:-48px -128px}.ui-icon-minusthick{background-position:-64px -128px}.ui-icon-close{background-position:-80px -128px}.ui-icon-closethick{background-position:-96px -128px}.ui-icon-key{background-position:-112px -128px}.ui-icon-lightbulb{background-position:-128px -128px}.ui-icon-scissors{background-position:-144px -128px}.ui-icon-clipboard{background-position:-160px -128px}.ui-icon-copy{background-position:-176px -128px}.ui-icon-contact{background-position:-192px -128px}.ui-icon-image{background-position:-208px -128px}.ui-icon-video{background-position:-224px -128px}.ui-icon-script{background-position:-240px -128px}.ui-icon-alert{background-position:0 -144px}.ui-icon-info{background-position:-16px -144px}.ui-icon-notice{background-position:-32px -144px}.ui-icon-help{background-position:-48px -144px}.ui-icon-check{background-position:-64px -144px}.ui-icon-bullet{background-position:-80px -144px}.ui-icon-radio-on{background-position:-96px -144px}.ui-icon-radio-off{background-position:-112px -144px}.ui-icon-pin-w{background-position:-128px -144px}.ui-icon-pin-s{background-position:-144px -144px}.ui-icon-play{background-position:0 -160px}.ui-icon-pause{background-position:-16px -160px}.ui-icon-seek-next{background-position:-32px -160px}.ui-icon-seek-prev{background-position:-48px -160px}.ui-icon-seek-end{background-position:-64px -160px}.ui-icon-seek-start{background-position:-80px -160px}.ui-icon-seek-first{background-position:-80px -160px}.ui-icon-stop{background-position:-96px -160px}.ui-icon-eject{background-position:-112px -160px}.ui-icon-volume-off{background-position:-128px -160px}.ui-icon-volume-on{background-position:-144px -160px}.ui-icon-power{background-position:0 -176px}.ui-icon-signal-diag{background-position:-16px -176px}.ui-icon-signal{background-position:-32px -176px}.ui-icon-battery-0{background-position:-48px -176px}.ui-icon-battery-1{background-position:-64px -176px}.ui-icon-battery-2{background-position:-80px -176px}.ui-icon-battery-3{background-position:-96px -176px}.ui-icon-circle-plus{background-position:0 -192px}.ui-icon-circle-minus{background-position:-16px -192px}.ui-icon-circle-close{background-position:-32px -192px}.ui-icon-circle-triangle-e{background-position:-48px -192px}.ui-icon-circle-triangle-s{background-position:-64px -192px}.ui-icon-circle-triangle-w{background-position:-80px -192px}.ui-icon-circle-triangle-n{background-position:-96px -192px}.ui-icon-circle-arrow-e{background-position:-112px -192px}.ui-icon-circle-arrow-s{background-position:-128px -192px}.ui-icon-circle-arrow-w{background-position:-144px -192px}.ui-icon-circle-arrow-n{background-position:-160px -192px}.ui-icon-circle-zoomin{background-position:-176px -192px}.ui-icon-circle-zoomout{background-position:-192px -192px}.ui-icon-circle-check{background-position:-208px -192px}.ui-icon-circlesmall-plus{background-position:0 -208px}.ui-icon-circlesmall-minus{background-position:-16px -208px}.ui-icon-circlesmall-close{background-position:-32px -208px}.ui-icon-squaresmall-plus{background-position:-48px -208px}.ui-icon-squaresmall-minus{background-position:-64px -208px}.ui-icon-squaresmall-close{background-position:-80px -208px}.ui-icon-grip-dotted-vertical{background-position:0 -224px}.ui-icon-grip-dotted-horizontal{background-position:-16px -224px}.ui-icon-grip-solid-vertical{background-position:-32px -224px}.ui-icon-grip-solid-horizontal{background-position:-48px -224px}.ui-icon-gripsmall-diagonal-se{background-position:-64px -224px}.ui-icon-grip-diagonal-se{background-position:-80px -224px}.ui-corner-all,.ui-corner-top,.ui-corner-left,.ui-corner-tl{border-top-left-radius:6px}.ui-corner-all,.ui-corner-top,.ui-corner-right,.ui-corner-tr{border-top-right-radius:6px}.ui-corner-all,.ui-corner-bottom,.ui-corner-left,.ui-corner-bl{border-bottom-left-radius:6px}.ui-corner-all,.ui-corner-bottom,.ui-corner-right,.ui-corner-br{border-bottom-right-radius:6px}.ui-widget-overlay{background:#5c5c5c;opacity:.8;filter:Alpha(Opacity=80)}.ui-widget-shadow{-webkit-box-shadow:-7px -7px 7px #ccc;box-shadow:-7px -7px 7px #ccc}
\ No newline at end of file
+.ui-draggable-handle{-ms-touch-action:none;touch-action:none}.ui-helper-hidden{display:none}.ui-helper-hidden-accessible{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.ui-helper-reset{margin:0;padding:0;border:0;outline:0;line-height:1.3;text-decoration:none;font-size:100%;list-style:none}.ui-helper-clearfix:before,.ui-helper-clearfix:after{content:"";display:table;border-collapse:collapse}.ui-helper-clearfix:after{clear:both}.ui-helper-zfix{width:100%;height:100%;top:0;left:0;position:absolute;opacity:0;filter:Alpha(Opacity=0)}.ui-front{z-index:100}.ui-state-disabled{cursor:default!important;pointer-events:none}.ui-icon{display:inline-block;vertical-align:middle;margin-top:-.25em;position:relative;text-indent:-99999px;overflow:hidden;background-repeat:no-repeat}.ui-widget-icon-block{left:50%;margin-left:-8px;display:block}.ui-widget-overlay{position:fixed;top:0;left:0;width:100%;height:100%}.ui-resizable{position:relative}.ui-resizable-handle{position:absolute;font-size:0.1px;display:block;-ms-touch-action:none;touch-action:none}.ui-resizable-disabled .ui-resizable-handle,.ui-resizable-autohide .ui-resizable-handle{display:none}.ui-resizable-n{cursor:n-resize;height:7px;width:100%;top:-5px;left:0}.ui-resizable-s{cursor:s-resize;height:7px;width:100%;bottom:-5px;left:0}.ui-resizable-e{cursor:e-resize;width:7px;right:-5px;top:0;height:100%}.ui-resizable-w{cursor:w-resize;width:7px;left:-5px;top:0;height:100%}.ui-resizable-se{cursor:se-resize;width:12px;height:12px;right:1px;bottom:1px}.ui-resizable-sw{cursor:sw-resize;width:9px;height:9px;left:-5px;bottom:-5px}.ui-resizable-nw{cursor:nw-resize;width:9px;height:9px;left:-5px;top:-5px}.ui-resizable-ne{cursor:ne-resize;width:9px;height:9px;right:-5px;top:-5px}.ui-selectable{-ms-touch-action:none;touch-action:none}.ui-selectable-helper{position:absolute;z-index:100;border:1px dotted black}.ui-sortable-handle{-ms-touch-action:none;touch-action:none}.ui-accordion .ui-accordion-header{display:block;cursor:pointer;position:relative;margin:2px 0 0 0;padding:.5em .5em .5em .7em;font-size:100%}.ui-accordion .ui-accordion-content{padding:1em 2.2em;border-top:0;overflow:auto}.ui-autocomplete{position:absolute;top:0;left:0;cursor:default}.ui-menu{list-style:none;padding:0;margin:0;display:block;outline:0}.ui-menu .ui-menu{position:absolute}.ui-menu .ui-menu-item{margin:0;cursor:pointer;list-style-image:url("data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7")}.ui-menu .ui-menu-item-wrapper{position:relative;padding:3px 1em 3px .4em}.ui-menu .ui-menu-divider{margin:5px 0;height:0;font-size:0;line-height:0;border-width:1px 0 0 0}.ui-menu .ui-state-focus,.ui-menu .ui-state-active{margin:-1px}.ui-menu-icons{position:relative}.ui-menu-icons .ui-menu-item-wrapper{padding-left:2em}.ui-menu .ui-icon{position:absolute;top:0;bottom:0;left:.2em;margin:auto 0}.ui-menu .ui-menu-icon{left:auto;right:0}.ui-button{padding:.4em 1em;display:inline-block;position:relative;line-height:normal;margin-right:.1em;cursor:pointer;vertical-align:middle;text-align:center;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;overflow:visible}.ui-button,.ui-button:link,.ui-button:visited,.ui-button:hover,.ui-button:active{text-decoration:none}.ui-button-icon-only{width:2em;box-sizing:border-box;text-indent:-9999px;white-space:nowrap}input.ui-button.ui-button-icon-only{text-indent:0}.ui-button-icon-only .ui-icon{position:absolute;top:50%;left:50%;margin-top:-8px;margin-left:-8px}.ui-button.ui-icon-notext .ui-icon{padding:0;width:2.1em;height:2.1em;text-indent:-9999px;white-space:nowrap}input.ui-button.ui-icon-notext .ui-icon{width:auto;height:auto;text-indent:0;white-space:normal;padding:.4em 1em}input.ui-button::-moz-focus-inner,button.ui-button::-moz-focus-inner{border:0;padding:0}.ui-controlgroup{vertical-align:middle;display:inline-block}.ui-controlgroup > .ui-controlgroup-item{float:left;margin-left:0;margin-right:0}.ui-controlgroup > .ui-controlgroup-item:focus,.ui-controlgroup > .ui-controlgroup-item.ui-visual-focus{z-index:9999}.ui-controlgroup-vertical > .ui-controlgroup-item{display:block;float:none;width:100%;margin-top:0;margin-bottom:0;text-align:left}.ui-controlgroup-vertical .ui-controlgroup-item{box-sizing:border-box}.ui-controlgroup .ui-controlgroup-label{padding:.4em 1em}.ui-controlgroup .ui-controlgroup-label span{font-size:80%}.ui-controlgroup-horizontal .ui-controlgroup-label + .ui-controlgroup-item{border-left:none}.ui-controlgroup-vertical .ui-controlgroup-label + .ui-controlgroup-item{border-top:none}.ui-controlgroup-horizontal .ui-controlgroup-label.ui-widget-content{border-right:none}.ui-controlgroup-vertical .ui-controlgroup-label.ui-widget-content{border-bottom:none}.ui-controlgroup-vertical .ui-spinner-input{width:75%;width:calc( 100% - 2.4em )}.ui-controlgroup-vertical .ui-spinner .ui-spinner-up{border-top-style:solid}.ui-checkboxradio-label .ui-icon-background{box-shadow:inset 1px 1px 1px #ccc;border-radius:.12em;border:none}.ui-checkboxradio-radio-label .ui-icon-background{width:16px;height:16px;border-radius:1em;overflow:visible;border:none}.ui-checkboxradio-radio-label.ui-checkboxradio-checked .ui-icon,.ui-checkboxradio-radio-label.ui-checkboxradio-checked:hover .ui-icon{background-image:none;width:8px;height:8px;border-width:4px;border-style:solid}.ui-checkboxradio-disabled{pointer-events:none}.ui-datepicker{width:17em;padding:.2em .2em 0;display:none}.ui-datepicker .ui-datepicker-header{position:relative;padding:.2em 0}.ui-datepicker .ui-datepicker-prev,.ui-datepicker .ui-datepicker-next{position:absolute;top:2px;width:1.8em;height:1.8em}.ui-datepicker .ui-datepicker-prev-hover,.ui-datepicker .ui-datepicker-next-hover{top:1px}.ui-datepicker .ui-datepicker-prev{left:2px}.ui-datepicker .ui-datepicker-next{right:2px}.ui-datepicker .ui-datepicker-prev-hover{left:1px}.ui-datepicker .ui-datepicker-next-hover{right:1px}.ui-datepicker .ui-datepicker-prev span,.ui-datepicker .ui-datepicker-next span{display:block;position:absolute;left:50%;margin-left:-8px;top:50%;margin-top:-8px}.ui-datepicker .ui-datepicker-title{margin:0 2.3em;line-height:1.8em;text-align:center}.ui-datepicker .ui-datepicker-title select{font-size:1em;margin:1px 0}.ui-datepicker select.ui-datepicker-month,.ui-datepicker select.ui-datepicker-year{width:45%}.ui-datepicker table{width:100%;font-size:.9em;border-collapse:collapse;margin:0 0 .4em}.ui-datepicker th{padding:.7em .3em;text-align:center;font-weight:bold;border:0}.ui-datepicker td{border:0;padding:1px}.ui-datepicker td span,.ui-datepicker td a{display:block;padding:.2em;text-align:right;text-decoration:none}.ui-datepicker .ui-datepicker-buttonpane{background-image:none;margin:.7em 0 0 0;padding:0 .2em;border-left:0;border-right:0;border-bottom:0}.ui-datepicker .ui-datepicker-buttonpane button{float:right;margin:.5em .2em .4em;cursor:pointer;padding:.2em .6em .3em .6em;width:auto;overflow:visible}.ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current{float:left}.ui-datepicker.ui-datepicker-multi{width:auto}.ui-datepicker-multi .ui-datepicker-group{float:left}.ui-datepicker-multi .ui-datepicker-group table{width:95%;margin:0 auto .4em}.ui-datepicker-multi-2 .ui-datepicker-group{width:50%}.ui-datepicker-multi-3 .ui-datepicker-group{width:33.3%}.ui-datepicker-multi-4 .ui-datepicker-group{width:25%}.ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header,.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header{border-left-width:0}.ui-datepicker-multi .ui-datepicker-buttonpane{clear:left}.ui-datepicker-row-break{clear:both;width:100%;font-size:0}.ui-datepicker-rtl{direction:rtl}.ui-datepicker-rtl .ui-datepicker-prev{right:2px;left:auto}.ui-datepicker-rtl .ui-datepicker-next{left:2px;right:auto}.ui-datepicker-rtl .ui-datepicker-prev:hover{right:1px;left:auto}.ui-datepicker-rtl .ui-datepicker-next:hover{left:1px;right:auto}.ui-datepicker-rtl .ui-datepicker-buttonpane{clear:right}.ui-datepicker-rtl .ui-datepicker-buttonpane button{float:left}.ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current,.ui-datepicker-rtl .ui-datepicker-group{float:right}.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header,.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header{border-right-width:0;border-left-width:1px}.ui-datepicker .ui-icon{display:block;text-indent:-99999px;overflow:hidden;background-repeat:no-repeat;left:.5em;top:.3em}.ui-dialog{position:absolute;top:0;left:0;padding:.2em;outline:0}.ui-dialog .ui-dialog-titlebar{padding:.4em 1em;position:relative}.ui-dialog .ui-dialog-title{float:left;margin:.1em 0;white-space:nowrap;width:90%;overflow:hidden;text-overflow:ellipsis}.ui-dialog .ui-dialog-titlebar-close{position:absolute;right:.3em;top:50%;width:20px;margin:-10px 0 0 0;padding:1px;height:20px}.ui-dialog .ui-dialog-content{position:relative;border:0;padding:.5em 1em;background:none;overflow:auto}.ui-dialog .ui-dialog-buttonpane{text-align:left;border-width:1px 0 0 0;background-image:none;margin-top:.5em;padding:.3em 1em .5em .4em}.ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset{float:right}.ui-dialog .ui-dialog-buttonpane button{margin:.5em .4em .5em 0;cursor:pointer}.ui-dialog .ui-resizable-n{height:2px;top:0}.ui-dialog .ui-resizable-e{width:2px;right:0}.ui-dialog .ui-resizable-s{height:2px;bottom:0}.ui-dialog .ui-resizable-w{width:2px;left:0}.ui-dialog .ui-resizable-se,.ui-dialog .ui-resizable-sw,.ui-dialog .ui-resizable-ne,.ui-dialog .ui-resizable-nw{width:7px;height:7px}.ui-dialog .ui-resizable-se{right:0;bottom:0}.ui-dialog .ui-resizable-sw{left:0;bottom:0}.ui-dialog .ui-resizable-ne{right:0;top:0}.ui-dialog .ui-resizable-nw{left:0;top:0}.ui-draggable .ui-dialog-titlebar{cursor:move}.ui-progressbar{height:2em;text-align:left;overflow:hidden}.ui-progressbar .ui-progressbar-value{margin:-1px;height:100%}.ui-progressbar .ui-progressbar-overlay{background:url("data:image/gif;base64,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");height:100%;filter:alpha(opacity=25);opacity:0.25}.ui-progressbar-indeterminate .ui-progressbar-value{background-image:none}.ui-selectmenu-menu{padding:0;margin:0;position:absolute;top:0;left:0;display:none}.ui-selectmenu-menu .ui-menu{overflow:auto;overflow-x:hidden;padding-bottom:1px}.ui-selectmenu-menu .ui-menu .ui-selectmenu-optgroup{font-size:1em;font-weight:bold;line-height:1.5;padding:2px 0.4em;margin:0.5em 0 0 0;height:auto;border:0}.ui-selectmenu-open{display:block}.ui-selectmenu-text{display:block;margin-right:20px;overflow:hidden;text-overflow:ellipsis}.ui-selectmenu-button.ui-button{text-align:left;white-space:nowrap;width:14em}.ui-selectmenu-icon.ui-icon{float:right;margin-top:0}.ui-slider{position:relative;text-align:left}.ui-slider .ui-slider-handle{position:absolute;z-index:2;width:1.2em;height:1.2em;cursor:default;-ms-touch-action:none;touch-action:none}.ui-slider .ui-slider-range{position:absolute;z-index:1;font-size:.7em;display:block;border:0;background-position:0 0}.ui-slider.ui-state-disabled .ui-slider-handle,.ui-slider.ui-state-disabled .ui-slider-range{filter:inherit}.ui-slider-horizontal{height:.8em}.ui-slider-horizontal .ui-slider-handle{top:-.3em;margin-left:-.6em}.ui-slider-horizontal .ui-slider-range{top:0;height:100%}.ui-slider-horizontal .ui-slider-range-min{left:0}.ui-slider-horizontal .ui-slider-range-max{right:0}.ui-slider-vertical{width:.8em;height:100px}.ui-slider-vertical .ui-slider-handle{left:-.3em;margin-left:0;margin-bottom:-.6em}.ui-slider-vertical .ui-slider-range{left:0;width:100%}.ui-slider-vertical .ui-slider-range-min{bottom:0}.ui-slider-vertical .ui-slider-range-max{top:0}.ui-spinner{position:relative;display:inline-block;overflow:hidden;padding:0;vertical-align:middle}.ui-spinner-input{border:none;background:none;color:inherit;padding:.222em 0;margin:.2em 0;vertical-align:middle;margin-left:.4em;margin-right:2em}.ui-spinner-button{width:1.6em;height:50%;font-size:.5em;padding:0;margin:0;text-align:center;position:absolute;cursor:default;display:block;overflow:hidden;right:0}.ui-spinner a.ui-spinner-button{border-top-style:none;border-bottom-style:none;border-right-style:none}.ui-spinner-up{top:0}.ui-spinner-down{bottom:0}.ui-tabs{position:relative;padding:.2em}.ui-tabs .ui-tabs-nav{margin:0;padding:.2em .2em 0}.ui-tabs .ui-tabs-nav li{list-style:none;float:left;position:relative;top:0;margin:1px .2em 0 0;border-bottom-width:0;padding:0;white-space:nowrap}.ui-tabs .ui-tabs-nav .ui-tabs-anchor{float:left;padding:.5em 1em;text-decoration:none}.ui-tabs .ui-tabs-nav li.ui-tabs-active{margin-bottom:-1px;padding-bottom:1px}.ui-tabs .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor,.ui-tabs .ui-tabs-nav li.ui-state-disabled .ui-tabs-anchor,.ui-tabs .ui-tabs-nav li.ui-tabs-loading .ui-tabs-anchor{cursor:text}.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor{cursor:pointer}.ui-tabs .ui-tabs-panel{display:block;border-width:0;padding:1em 1.4em;background:none}.ui-tooltip{padding:8px;position:absolute;z-index:9999;max-width:300px}body .ui-tooltip{border-width:2px}.ui-widget{font-family:Segoe UI,Arial,sans-serif;font-size:1.1em}.ui-widget .ui-widget{font-size:1em}.ui-widget input,.ui-widget select,.ui-widget textarea,.ui-widget button{font-family:Segoe UI,Arial,sans-serif;font-size:1em}.ui-widget.ui-widget-content{border:1px solid #666}.ui-widget-content{border:1px solid #666;background:#000 url("images/ui-bg_inset-soft_25_000000_1x100.png") 50% bottom repeat-x;color:#fff}.ui-widget-content a{color:#fff}.ui-widget-header{border:1px solid #333;background:#333 url("images/ui-bg_gloss-wave_25_333333_500x100.png") 50% 50% repeat-x;color:#fff;font-weight:bold}.ui-widget-header a{color:#fff}.ui-state-default,.ui-widget-content .ui-state-default,.ui-widget-header .ui-state-default,.ui-button,html .ui-button.ui-state-disabled:hover,html .ui-button.ui-state-disabled:active{border:1px solid #666;background:#555 url("images/ui-bg_glass_20_555555_1x400.png") 50% 50% repeat-x;font-weight:bold;color:#eee}.ui-state-default a,.ui-state-default a:link,.ui-state-default a:visited,a.ui-button,a:link.ui-button,a:visited.ui-button,.ui-button{color:#eee;text-decoration:none}.ui-state-hover,.ui-widget-content .ui-state-hover,.ui-widget-header .ui-state-hover,.ui-state-focus,.ui-widget-content .ui-state-focus,.ui-widget-header .ui-state-focus,.ui-button:hover,.ui-button:focus{border:1px solid #59b4d4;background:#0078a3 url("images/ui-bg_glass_40_0078a3_1x400.png") 50% 50% repeat-x;font-weight:bold;color:#fff}.ui-state-hover a,.ui-state-hover a:hover,.ui-state-hover a:link,.ui-state-hover a:visited,.ui-state-focus a,.ui-state-focus a:hover,.ui-state-focus a:link,.ui-state-focus a:visited,a.ui-button:hover,a.ui-button:focus{color:#fff;text-decoration:none}.ui-visual-focus{box-shadow:0 0 3px 1px rgb(94,158,214)}.ui-state-active,.ui-widget-content .ui-state-active,.ui-widget-header .ui-state-active,a.ui-button:active,.ui-button:active,.ui-button.ui-state-active:hover{border:1px solid #ffaf0f;background:#f58400 url("images/ui-bg_inset-soft_30_f58400_1x100.png") 50% 50% repeat-x;font-weight:bold;color:#fff}.ui-icon-background,.ui-state-active .ui-icon-background{border:#ffaf0f;background-color:#fff}.ui-state-active a,.ui-state-active a:link,.ui-state-active a:visited{color:#fff;text-decoration:none}.ui-state-highlight,.ui-widget-content .ui-state-highlight,.ui-widget-header .ui-state-highlight{border:1px solid #ccc;background:#eee url("images/ui-bg_highlight-soft_80_eeeeee_1x100.png") 50% top repeat-x;color:#2e7db2}.ui-state-checked{border:1px solid #ccc;background:#eee}.ui-state-highlight a,.ui-widget-content .ui-state-highlight a,.ui-widget-header .ui-state-highlight a{color:#2e7db2}.ui-state-error,.ui-widget-content .ui-state-error,.ui-widget-header .ui-state-error{border:1px solid #ffb73d;background:#ffc73d url("images/ui-bg_glass_40_ffc73d_1x400.png") 50% 50% repeat-x;color:#111}.ui-state-error a,.ui-widget-content .ui-state-error a,.ui-widget-header .ui-state-error a{color:#111}.ui-state-error-text,.ui-widget-content .ui-state-error-text,.ui-widget-header .ui-state-error-text{color:#111}.ui-priority-primary,.ui-widget-content .ui-priority-primary,.ui-widget-header .ui-priority-primary{font-weight:bold}.ui-priority-secondary,.ui-widget-content .ui-priority-secondary,.ui-widget-header .ui-priority-secondary{opacity:.7;filter:Alpha(Opacity=70);font-weight:normal}.ui-state-disabled,.ui-widget-content .ui-state-disabled,.ui-widget-header .ui-state-disabled{opacity:.35;filter:Alpha(Opacity=35);background-image:none}.ui-state-disabled .ui-icon{filter:Alpha(Opacity=35)}.ui-icon{width:16px;height:16px}.ui-icon,.ui-widget-content .ui-icon{background-image:url("images/ui-icons_cccccc_256x240.png")}.ui-widget-header .ui-icon{background-image:url("images/ui-icons_ffffff_256x240.png")}.ui-state-hover .ui-icon,.ui-state-focus .ui-icon,.ui-button:hover .ui-icon,.ui-button:focus .ui-icon{background-image:url("images/ui-icons_ffffff_256x240.png")}.ui-state-active .ui-icon,.ui-button:active .ui-icon{background-image:url("images/ui-icons_222222_256x240.png")}.ui-state-highlight .ui-icon,.ui-button .ui-state-highlight.ui-icon{background-image:url("images/ui-icons_4b8e0b_256x240.png")}.ui-state-error .ui-icon,.ui-state-error-text .ui-icon{background-image:url("images/ui-icons_a83300_256x240.png")}.ui-button .ui-icon{background-image:url("images/ui-icons_cccccc_256x240.png")}.ui-icon-blank{background-position:16px 16px}.ui-icon-caret-1-n{background-position:0 0}.ui-icon-caret-1-ne{background-position:-16px 0}.ui-icon-caret-1-e{background-position:-32px 0}.ui-icon-caret-1-se{background-position:-48px 0}.ui-icon-caret-1-s{background-position:-65px 0}.ui-icon-caret-1-sw{background-position:-80px 0}.ui-icon-caret-1-w{background-position:-96px 0}.ui-icon-caret-1-nw{background-position:-112px 0}.ui-icon-caret-2-n-s{background-position:-128px 0}.ui-icon-caret-2-e-w{background-position:-144px 0}.ui-icon-triangle-1-n{background-position:0 -16px}.ui-icon-triangle-1-ne{background-position:-16px -16px}.ui-icon-triangle-1-e{background-position:-32px -16px}.ui-icon-triangle-1-se{background-position:-48px -16px}.ui-icon-triangle-1-s{background-position:-65px -16px}.ui-icon-triangle-1-sw{background-position:-80px -16px}.ui-icon-triangle-1-w{background-position:-96px -16px}.ui-icon-triangle-1-nw{background-position:-112px -16px}.ui-icon-triangle-2-n-s{background-position:-128px -16px}.ui-icon-triangle-2-e-w{background-position:-144px -16px}.ui-icon-arrow-1-n{background-position:0 -32px}.ui-icon-arrow-1-ne{background-position:-16px -32px}.ui-icon-arrow-1-e{background-position:-32px -32px}.ui-icon-arrow-1-se{background-position:-48px -32px}.ui-icon-arrow-1-s{background-position:-65px -32px}.ui-icon-arrow-1-sw{background-position:-80px -32px}.ui-icon-arrow-1-w{background-position:-96px -32px}.ui-icon-arrow-1-nw{background-position:-112px -32px}.ui-icon-arrow-2-n-s{background-position:-128px -32px}.ui-icon-arrow-2-ne-sw{background-position:-144px -32px}.ui-icon-arrow-2-e-w{background-position:-160px -32px}.ui-icon-arrow-2-se-nw{background-position:-176px -32px}.ui-icon-arrowstop-1-n{background-position:-192px -32px}.ui-icon-arrowstop-1-e{background-position:-208px -32px}.ui-icon-arrowstop-1-s{background-position:-224px -32px}.ui-icon-arrowstop-1-w{background-position:-240px -32px}.ui-icon-arrowthick-1-n{background-position:1px -48px}.ui-icon-arrowthick-1-ne{background-position:-16px -48px}.ui-icon-arrowthick-1-e{background-position:-32px -48px}.ui-icon-arrowthick-1-se{background-position:-48px -48px}.ui-icon-arrowthick-1-s{background-position:-64px -48px}.ui-icon-arrowthick-1-sw{background-position:-80px -48px}.ui-icon-arrowthick-1-w{background-position:-96px -48px}.ui-icon-arrowthick-1-nw{background-position:-112px -48px}.ui-icon-arrowthick-2-n-s{background-position:-128px -48px}.ui-icon-arrowthick-2-ne-sw{background-position:-144px -48px}.ui-icon-arrowthick-2-e-w{background-position:-160px -48px}.ui-icon-arrowthick-2-se-nw{background-position:-176px -48px}.ui-icon-arrowthickstop-1-n{background-position:-192px -48px}.ui-icon-arrowthickstop-1-e{background-position:-208px -48px}.ui-icon-arrowthickstop-1-s{background-position:-224px -48px}.ui-icon-arrowthickstop-1-w{background-position:-240px -48px}.ui-icon-arrowreturnthick-1-w{background-position:0 -64px}.ui-icon-arrowreturnthick-1-n{background-position:-16px -64px}.ui-icon-arrowreturnthick-1-e{background-position:-32px -64px}.ui-icon-arrowreturnthick-1-s{background-position:-48px -64px}.ui-icon-arrowreturn-1-w{background-position:-64px -64px}.ui-icon-arrowreturn-1-n{background-position:-80px -64px}.ui-icon-arrowreturn-1-e{background-position:-96px -64px}.ui-icon-arrowreturn-1-s{background-position:-112px -64px}.ui-icon-arrowrefresh-1-w{background-position:-128px -64px}.ui-icon-arrowrefresh-1-n{background-position:-144px -64px}.ui-icon-arrowrefresh-1-e{background-position:-160px -64px}.ui-icon-arrowrefresh-1-s{background-position:-176px -64px}.ui-icon-arrow-4{background-position:0 -80px}.ui-icon-arrow-4-diag{background-position:-16px -80px}.ui-icon-extlink{background-position:-32px -80px}.ui-icon-newwin{background-position:-48px -80px}.ui-icon-refresh{background-position:-64px -80px}.ui-icon-shuffle{background-position:-80px -80px}.ui-icon-transfer-e-w{background-position:-96px -80px}.ui-icon-transferthick-e-w{background-position:-112px -80px}.ui-icon-folder-collapsed{background-position:0 -96px}.ui-icon-folder-open{background-position:-16px -96px}.ui-icon-document{background-position:-32px -96px}.ui-icon-document-b{background-position:-48px -96px}.ui-icon-note{background-position:-64px -96px}.ui-icon-mail-closed{background-position:-80px -96px}.ui-icon-mail-open{background-position:-96px -96px}.ui-icon-suitcase{background-position:-112px -96px}.ui-icon-comment{background-position:-128px -96px}.ui-icon-person{background-position:-144px -96px}.ui-icon-print{background-position:-160px -96px}.ui-icon-trash{background-position:-176px -96px}.ui-icon-locked{background-position:-192px -96px}.ui-icon-unlocked{background-position:-208px -96px}.ui-icon-bookmark{background-position:-224px -96px}.ui-icon-tag{background-position:-240px -96px}.ui-icon-home{background-position:0 -112px}.ui-icon-flag{background-position:-16px -112px}.ui-icon-calendar{background-position:-32px -112px}.ui-icon-cart{background-position:-48px -112px}.ui-icon-pencil{background-position:-64px -112px}.ui-icon-clock{background-position:-80px -112px}.ui-icon-disk{background-position:-96px -112px}.ui-icon-calculator{background-position:-112px -112px}.ui-icon-zoomin{background-position:-128px -112px}.ui-icon-zoomout{background-position:-144px -112px}.ui-icon-search{background-position:-160px -112px}.ui-icon-wrench{background-position:-176px -112px}.ui-icon-gear{background-position:-192px -112px}.ui-icon-heart{background-position:-208px -112px}.ui-icon-star{background-position:-224px -112px}.ui-icon-link{background-position:-240px -112px}.ui-icon-cancel{background-position:0 -128px}.ui-icon-plus{background-position:-16px -128px}.ui-icon-plusthick{background-position:-32px -128px}.ui-icon-minus{background-position:-48px -128px}.ui-icon-minusthick{background-position:-64px -128px}.ui-icon-close{background-position:-80px -128px}.ui-icon-closethick{background-position:-96px -128px}.ui-icon-key{background-position:-112px -128px}.ui-icon-lightbulb{background-position:-128px -128px}.ui-icon-scissors{background-position:-144px -128px}.ui-icon-clipboard{background-position:-160px -128px}.ui-icon-copy{background-position:-176px -128px}.ui-icon-contact{background-position:-192px -128px}.ui-icon-image{background-position:-208px -128px}.ui-icon-video{background-position:-224px -128px}.ui-icon-script{background-position:-240px -128px}.ui-icon-alert{background-position:0 -144px}.ui-icon-info{background-position:-16px -144px}.ui-icon-notice{background-position:-32px -144px}.ui-icon-help{background-position:-48px -144px}.ui-icon-check{background-position:-64px -144px}.ui-icon-bullet{background-position:-80px -144px}.ui-icon-radio-on{background-position:-96px -144px}.ui-icon-radio-off{background-position:-112px -144px}.ui-icon-pin-w{background-position:-128px -144px}.ui-icon-pin-s{background-position:-144px -144px}.ui-icon-play{background-position:0 -160px}.ui-icon-pause{background-position:-16px -160px}.ui-icon-seek-next{background-position:-32px -160px}.ui-icon-seek-prev{background-position:-48px -160px}.ui-icon-seek-end{background-position:-64px -160px}.ui-icon-seek-start{background-position:-80px -160px}.ui-icon-seek-first{background-position:-80px -160px}.ui-icon-stop{background-position:-96px -160px}.ui-icon-eject{background-position:-112px -160px}.ui-icon-volume-off{background-position:-128px -160px}.ui-icon-volume-on{background-position:-144px -160px}.ui-icon-power{background-position:0 -176px}.ui-icon-signal-diag{background-position:-16px -176px}.ui-icon-signal{background-position:-32px -176px}.ui-icon-battery-0{background-position:-48px -176px}.ui-icon-battery-1{background-position:-64px -176px}.ui-icon-battery-2{background-position:-80px -176px}.ui-icon-battery-3{background-position:-96px -176px}.ui-icon-circle-plus{background-position:0 -192px}.ui-icon-circle-minus{background-position:-16px -192px}.ui-icon-circle-close{background-position:-32px -192px}.ui-icon-circle-triangle-e{background-position:-48px -192px}.ui-icon-circle-triangle-s{background-position:-64px -192px}.ui-icon-circle-triangle-w{background-position:-80px -192px}.ui-icon-circle-triangle-n{background-position:-96px -192px}.ui-icon-circle-arrow-e{background-position:-112px -192px}.ui-icon-circle-arrow-s{background-position:-128px -192px}.ui-icon-circle-arrow-w{background-position:-144px -192px}.ui-icon-circle-arrow-n{background-position:-160px -192px}.ui-icon-circle-zoomin{background-position:-176px -192px}.ui-icon-circle-zoomout{background-position:-192px -192px}.ui-icon-circle-check{background-position:-208px -192px}.ui-icon-circlesmall-plus{background-position:0 -208px}.ui-icon-circlesmall-minus{background-position:-16px -208px}.ui-icon-circlesmall-close{background-position:-32px -208px}.ui-icon-squaresmall-plus{background-position:-48px -208px}.ui-icon-squaresmall-minus{background-position:-64px -208px}.ui-icon-squaresmall-close{background-position:-80px -208px}.ui-icon-grip-dotted-vertical{background-position:0 -224px}.ui-icon-grip-dotted-horizontal{background-position:-16px -224px}.ui-icon-grip-solid-vertical{background-position:-32px -224px}.ui-icon-grip-solid-horizontal{background-position:-48px -224px}.ui-icon-gripsmall-diagonal-se{background-position:-64px -224px}.ui-icon-grip-diagonal-se{background-position:-80px -224px}.ui-corner-all,.ui-corner-top,.ui-corner-left,.ui-corner-tl{border-top-left-radius:6px}.ui-corner-all,.ui-corner-top,.ui-corner-right,.ui-corner-tr{border-top-right-radius:6px}.ui-corner-all,.ui-corner-bottom,.ui-corner-left,.ui-corner-bl{border-bottom-left-radius:6px}.ui-corner-all,.ui-corner-bottom,.ui-corner-right,.ui-corner-br{border-bottom-right-radius:6px}.ui-widget-overlay{background:#5c5c5c;opacity:.8;filter:Alpha(Opacity=80)}.ui-widget-shadow{-webkit-box-shadow:-7px -7px 7px #ccc;box-shadow:-7px -7px 7px #ccc}
diff --git a/css/001-lib/macros.css b/css/001-lib/macros.css
new file mode 100644
index 0000000000000000000000000000000000000000..39a2dd5778ec12fd4f0bb7b9e179053e5fbf61a8
--- /dev/null
+++ b/css/001-lib/macros.css
@@ -0,0 +1,2 @@
+/*! <<checkvars>> macro for SugarCube 2.x */
+#ui-dialog-body.checkvars{padding:1em}#ui-dialog-body.checkvars h1{font-size:1em;margin-top:0}#ui-dialog-body.checkvars table{border-collapse:collapse;border-spacing:0}#ui-dialog-body.checkvars thead tr{border-bottom:2px solid #444}#ui-dialog-body.checkvars tr:not(:first-child){border-top:1px solid #444}#ui-dialog-body.checkvars td,#ui-dialog-body.checkvars th{padding:.25em 1em}#ui-dialog-body.checkvars td:first-child,#ui-dialog-body.checkvars th:first-child{padding-left:.5em;border-right:1px solid #444}#ui-dialog-body.checkvars td:last-child,#ui-dialog-body.checkvars th:last-child{padding-right:.5em}#ui-dialog-body.checkvars th:first-child{text-align:center}#ui-dialog-body.checkvars td:first-child{font-weight:700;text-align:right}#ui-dialog-body.checkvars td{font-family:monospace,monospace;vertical-align:top;white-space:pre-wrap}#ui-dialog-body.checkvars .scroll-pad{margin:0;padding:0}
diff --git a/src/002-config/colors.css b/css/002-variables/colors.css
similarity index 100%
rename from src/002-config/colors.css
rename to css/002-variables/colors.css
diff --git a/css/003-sugarcube-overwrite/general.css b/css/003-sugarcube-overwrite/general.css
new file mode 100644
index 0000000000000000000000000000000000000000..08a03244235a115489a0718a3cdbd419b39bbcec
--- /dev/null
+++ b/css/003-sugarcube-overwrite/general.css
@@ -0,0 +1,24 @@
+body {
+    overflow-x: hidden;
+}
+
+/* clears SugarCube's default transition */
+.passage {
+    transition: none;
+    -webkit-transition: none;
+}
+
+.passage-in {
+    opacity: 1 !important;
+}
+
+#passages {
+    /* max-width: 54em */
+    max-width: 100%;
+}
+
+/* makes HR colorflip compatible */
+hr {
+    background:#ccc;
+    border:0;
+}
diff --git a/src/002-config/modSC.css b/css/003-sugarcube-overwrite/sidebar.css
similarity index 75%
rename from src/002-config/modSC.css
rename to css/003-sugarcube-overwrite/sidebar.css
index b09893b63ac65cc1c62b2bedf44ecd1bf831cbfd..a43d1b8df06cb7da002cf9538860637ae89bf423 100644
--- a/src/002-config/modSC.css
+++ b/css/003-sugarcube-overwrite/sidebar.css
@@ -7,11 +7,19 @@
     height: calc(100% - 1.5em);
     margin: 1.5em 0;
 }
+
 #ui-bar-body > :not(:first-child) {
     /* margin-top: 2em; */
     margin-top: 1.5em;
 }
+
 #story-author {
     /* margin-top: 2em; */
     margin-top: 0;
 }
+
+/* make cheat text boxes fit in sidebar */
+#story-caption input {
+    min-width: 0;
+    width: calc(100% - 0.8em - 2px);
+}
diff --git a/src/003-assets/CSS/arcologyBuilding.css b/css/arcologyBuilding/arcologyBuilding.css
similarity index 100%
rename from src/003-assets/CSS/arcologyBuilding.css
rename to css/arcologyBuilding/arcologyBuilding.css
diff --git a/css/art/art.css b/css/art/art.css
new file mode 100644
index 0000000000000000000000000000000000000000..2610af5ed5c82ca8c8a1a98820ad24740e1022f0
--- /dev/null
+++ b/css/art/art.css
@@ -0,0 +1,112 @@
+/* small trick to hide broken images */
+img {
+    text-indent: -10000px;
+}
+
+.imageColumn { /* TODO: this is mostly a copy of imageRef to get its flex features working properly. They can probably be removed from imageRef at some point */
+    display: flex;
+    flex-direction: column;
+    flex-wrap: wrap;
+    align-items: flex-start;
+    position: relative;
+    float: right;
+}
+
+.imageRef {
+    display: flex;
+    flex-direction: column;
+    flex-wrap: wrap;
+    align-items: flex-start;
+    position: relative;
+    background-color: rgba(80, 80, 80, 0.5);
+    margin: 2px;
+}
+
+.tinyImg {
+    height: 120px;
+    width: 120px;
+    float: left;
+}
+
+.smlImg {
+    height: 150px;
+    width: 150px;
+    float: left;
+}
+
+.smlImg > img, .smlImg > video {
+    height: auto;
+}
+
+.medImg {
+    height: 300px;
+    width: 300px;
+    float: right;
+}
+
+.medImg > img, .medImg > video {
+    height: auto;
+}
+
+.lrgRender {
+    height: 531px;
+    width: 531px;
+    margin-right: -50px;
+    margin-left: -50px;
+    float: right;
+    z-index: -1;
+}
+
+.lrgVector {
+    height: 600px;
+    width: 600px;
+    margin-right: -125px;
+    margin-left: -125px;
+    float: right;
+    z-index: -1;
+}
+
+.lrgRender > div.mask {
+    width: 150px;
+    height: 100%;
+    background: linear-gradient(90deg, rgba(17, 17, 17, 1), rgba(17, 17, 17, 0.8) 60%, rgba(17, 17, 17, 0));
+    z-index: 1;
+    /*position: absolute;*/
+}
+
+.lrgRender > img, .lrgRender > video {
+    margin-left: -150px;
+    height: 531px;
+    width: auto;
+}
+
+.lrgVector > div.mask {
+    width: 150px;
+    height: 100%;
+    background: linear-gradient(90deg, rgba(17, 17, 17, 1), rgba(17, 17, 17, 0.8) 60%, rgba(17, 17, 17, 0));
+    z-index: 1;
+}
+
+.lrgVector > img, .lrgVector > video {
+    margin-left: -150px;
+    height: 600px;
+    width: auto;
+}
+
+.lrgVector svg {
+    width: 336px;
+}
+
+object {
+    object-fit: scale-down;
+    position: absolute;
+    top: 0;
+    left: 0;
+}
+
+img.paperdoll {
+    position: absolute;
+    top: 0;
+    left: 0;
+    margin-left: 0;
+}
diff --git a/css/corporation/corporation.css b/css/corporation/corporation.css
new file mode 100644
index 0000000000000000000000000000000000000000..2c6e95350204026e0da50b0bc8b4294b3af35426
--- /dev/null
+++ b/css/corporation/corporation.css
@@ -0,0 +1,39 @@
+.founding {
+	font-size: 0.8em;
+	margin-top: -0.8em;
+	margin-left: 0.5em;
+	font-style: italic;
+}
+
+table.corporate {
+	border: 3px darkgreen double;
+	border-collapse: collapse;
+	min-width: 33%;
+}
+
+table.corporate tbody tr:nth-child(even) {
+	background-color: rgb(0, 30, 0);
+}
+
+table.corporate tbody tr:nth-child(odd) {
+	background-color: rgb(15, 40, 15);
+}
+
+table.corporate td {
+	vertical-align: top;
+}
+
+table.corporate tbody th, table.corporate thead th {
+	background-color: black;
+	font-weight: bold;
+}
+
+.minor-note {
+	font-size: 0.75em;
+	font-style: italic;
+}
+
+.majorText {
+	margin-top: 0.5em;
+	margin-bottom: 1.5em;
+}
diff --git a/css/css.md b/css/css.md
new file mode 100644
index 0000000000000000000000000000000000000000..f259684518eda9eb52a1895036d44904fbfcc39c
--- /dev/null
+++ b/css/css.md
@@ -0,0 +1,22 @@
+# CSS module
+
+This directory contains ALL style files for this project.
+
+## Structure
+
+Most of the structure should be self-explanatory, this is a list of the main rules when adding new styles
+
+* `general/`: Only Styles that can be used in many different places and are not part of a specific system may be added
+  here.
+
+* When adding styles that are only used in one place put them in a directory that matches the top directory of the
+  corresponding JS file in `src/` or `js/`.
+
+* There is no catch-all file, if there is no place where your style goes create one instead of mixing them together with
+  unrelated styles. This does mean there are many small files, but properly sorted and named this is preferable to one
+  large catch-all file.
+
+## Compiling
+
+During compiling all CSS files in this directory get combined and then added as a module, which means the styles are put
+directly into <head> element of the final HTML file.
diff --git a/src/pregmod/FCTV/FCTV.css b/css/endWeek/FCTV.css
similarity index 79%
rename from src/pregmod/FCTV/FCTV.css
rename to css/endWeek/FCTV.css
index f7a3b69f149ad68fc4437c2355e9f3c0d18bc199..8d7bdd5ac3342703136f3e88971cefb6200354d5 100644
--- a/src/pregmod/FCTV/FCTV.css
+++ b/css/endWeek/FCTV.css
@@ -1,13 +1,14 @@
-.FCTV {
+.fctv {
 	display: float;
 }
+
 .fctv-remote {
 	text-align: center;
 	justify-items: center;
 	display: grid;
-	float:left;
-	width:min-content;
-	padding-right:20px;
+	float: left;
+	width: min-content;
+	padding-right: 20px;
 }
 .fctv-remote-numbers {
 	display: grid;
@@ -17,4 +18,4 @@
 }
 .fctv-remote-button {
 	margin-top: 10px;
-}
\ No newline at end of file
+}
diff --git a/src/003-assets/CSS/endWeekAnim.css b/css/endWeek/endWeekAnim.css
similarity index 100%
rename from src/003-assets/CSS/endWeekAnim.css
rename to css/endWeek/endWeekAnim.css
diff --git a/css/endWeek/slavesReport.css b/css/endWeek/slavesReport.css
new file mode 100644
index 0000000000000000000000000000000000000000..f07dbecbe1e82f6363fb316a8bff981287e33acf
--- /dev/null
+++ b/css/endWeek/slavesReport.css
@@ -0,0 +1,4 @@
+div.slave-report {
+    margin-top: 1em;
+    margin-bottom: 1em;
+}
diff --git a/src/facilities/facilities.css b/css/facilities/facilities.css
similarity index 100%
rename from src/facilities/facilities.css
rename to css/facilities/facilities.css
diff --git a/src/facilities/farmyard/farmyard.css b/css/facilities/farmyard.css
similarity index 100%
rename from src/facilities/farmyard/farmyard.css
rename to css/facilities/farmyard.css
diff --git a/src/facilities/incubator/incubator.css b/css/facilities/incubator.css
similarity index 100%
rename from src/facilities/incubator/incubator.css
rename to css/facilities/incubator.css
diff --git a/src/facilities/nursery/nursery.css b/css/facilities/nursery.css
similarity index 69%
rename from src/facilities/nursery/nursery.css
rename to css/facilities/nursery.css
index f2276b59eeaa1d146949dd10b1c48286e0e3b609..b9de00814e2aac8a1eb9f28a38ea1169985b95d0 100644
--- a/src/facilities/nursery/nursery.css
+++ b/css/facilities/nursery.css
@@ -1,5 +1,3 @@
-/* FEEL FREE TO MOVE */
-
 .child-section {
 	margin-top: 1em;
 	margin-bottom: 1em;
diff --git a/src/facilities/pit/pit.css b/css/facilities/pit.css
similarity index 100%
rename from src/facilities/pit/pit.css
rename to css/facilities/pit.css
diff --git a/src/facilities/statistics.css b/css/facilities/statistics.css
similarity index 61%
rename from src/facilities/statistics.css
rename to css/facilities/statistics.css
index 91320c60544b476fb4f354b35bdc4ce5e865ca77..092409605f4aa23e6ff477e4b9d2391283795252 100644
--- a/src/facilities/statistics.css
+++ b/css/facilities/statistics.css
@@ -1,46 +1,46 @@
-table.stats {
+table.facility-stats {
 	width: 100%;
 	padding-left: 20px;
 	padding-right: 20px;
 }
 
-table.stats > tr.header {
+table.facility-stats > tr.header {
 	border-bottom: 2px solid white;
 }
 
-table.stats > tr.total {
+table.facility-stats > tr.total {
 	border-top: 1px solid white;
 }
 
-table.stats > tr > th.narrow {
+table.facility-stats > tr > th.narrow {
 	width: 10em;
 	text-align: right;
 }
 
-table.stats > tr > th.wide {
+table.facility-stats > tr > th.wide {
 	width: 20em;
 	text-align: right;
 }
 
-table.stats-slave {
+table.facility-stats-slave {
 	width: 100%;
 	font-size: 90%;
 	line-height: 110%;
 }
 
-table.stats-slave > tr {
+table.facility-stats-slave > tr {
 	border-bottom: 1px solid #aaa;
 	border-left: none;
 	border-right: none;
 	border-top: none
 }
 
-table.stats-slave > tr > th.narrow {
+table.facility-stats-slave > tr > th.narrow {
 	width: 11em;
 	text-align: right;
 }
 
-table.stats-slave > tr > th.wide {
+table.facility-stats-slave > tr > th.wide {
 	width: 22em;
 	text-align: right;
 }
@@ -52,4 +52,4 @@ td.value {
 
 .decimalZero {
 	opacity: 0.3;
-}
\ No newline at end of file
+}
diff --git a/src/facilities/wardrobe/wardrobeShopping.css b/css/facilities/wardrobe.css
similarity index 100%
rename from src/facilities/wardrobe/wardrobeShopping.css
rename to css/facilities/wardrobe.css
diff --git a/css/general/formatting.css b/css/general/formatting.css
new file mode 100644
index 0000000000000000000000000000000000000000..b0a408d0c50b27bd40e337e754731380ccefb372
--- /dev/null
+++ b/css/general/formatting.css
@@ -0,0 +1,71 @@
+/* Styles that mainly affect how text looks, but not where it is */
+
+/* setting at the beginning of a scene / subscene */
+.scene-intro {
+    font-style: italic;
+}
+
+/* adds detail to an option: Do something. <span class="detail">Sentence that explains the effect/conditions */
+.detail {
+    font-style: italic;
+}
+
+/* additional information not related to a specific option */
+.note {
+    font-style: italic;
+}
+
+.icons {
+    font-family: 'tme-fa-icons';
+}
+
+.story-label, .regularParties, .underline {
+    text-decoration: underline;
+}
+
+/* Note: Do not do a linebreak after span in HTML, because it will underline the automatic space it inserts: "Matilda_is a cow" */
+.slave-name {
+    color: pink;
+    font-weight: bold;
+    text-decoration: underline;
+    text-decoration-color: white;
+}
+
+.name {
+    font-weight: bold;
+}
+
+.custom-label {
+    color: yellow;
+    font-weight: bold;
+}
+
+/* strong is deprecated, use bold instead */
+.major-link, .bold, .strong {
+    font-weight: bold;
+}
+
+.clear-formatting {
+    color: white;
+    font-weight: normal;
+    font-style: normal;
+}
+
+.major-warning {
+    font-weight: bold;
+    color: red;
+}
+
+input:invalid {
+    border-color: #900;
+    background-color: rgba(255, 0, 0, 0.25);
+}
+
+input:focus:invalid {
+    outline: none;
+}
+
+input:out-of-range {
+    background-color: rgba(255, 0, 0, 0.25);
+    border: 2px solid #900;
+}
diff --git a/css/general/layout.css b/css/general/layout.css
new file mode 100644
index 0000000000000000000000000000000000000000..6d5fa3a1b13e5d428190a773473115da02a90708
--- /dev/null
+++ b/css/general/layout.css
@@ -0,0 +1,43 @@
+/* Styles that mainly affect where text is, but not how it looks */
+
+h1, h2, h3 {
+    margin-bottom: 0;
+    margin-top: 0.25em;
+}
+
+h1 + p, h2 + p, h3 + p {
+    margin-top: 0;
+}
+
+div.center, p.center {
+    margin-left: auto;
+    margin-right: auto;
+    text-align: center;
+}
+
+div.flex-container {
+    display: flex;
+}
+
+/* makes the first line indented */
+div.indent, p.indent {
+    text-indent: 2em;
+}
+
+div.double-indent, p.double-indent {
+    text-indent: 4em;
+}
+
+/* makes avery line indented */
+.choices, .choices {
+    margin-left: 2em;
+}
+
+.double-choices, .double-choices {
+    margin-left: 4em;
+}
+
+div.grid-2columns-auto {
+    display: grid;
+    grid-template-columns: max-content auto;
+}
diff --git a/css/general/textColors.css b/css/general/textColors.css
new file mode 100644
index 0000000000000000000000000000000000000000..3b1292571e8b0bf5ccf11b7593e46e9c4440c4b6
--- /dev/null
+++ b/css/general/textColors.css
@@ -0,0 +1,201 @@
+/* Colors are made as css classes, to allow them to be changed for a light color scheme (for example). */
+/* a version is for this case: <span class="..."><a>text</a></span> */
+
+/* link color */
+.link, .link a {
+    color: var(--link-color)
+}
+
+.aquamarine, .aquamarine a, .skill, .skill a {
+    color: aquamarine
+}
+
+.coral, .coral a, .fetish.loss, .fetish.loss a {
+    color: coral
+}
+
+/* used for aphrodisiac & neighbor arcs */
+.cyan, .cyan a, .hotkey {
+    color: cyan
+}
+
+.darkgoldenrod, .darkgoldenrod a, .trust.extremely-terrified, .trust.extremely-terrified a {
+    color: darkgoldenrod
+}
+
+.darkred, .darkred a, .defiant.full, .defiant.full a {
+    color: darkred
+}
+
+.darkviolet, .darkviolet a, .devotion.hateful, .devotion.hateful a {
+    color: darkviolet
+}
+
+/* used for devotion once & agent */
+.deeppink, .deeppink a, .devotion.devoted, .devotion.devoted a {
+    color: deeppink
+}
+
+.steelblue, .steelblue a {
+    color: steelblue
+}
+
+.deepskyblue, .deepskyblue a, .intelligent, .intelligent a {
+    color: deepskyblue
+}
+
+.dodgerblue, .dodgerblue a {
+    color: dodgerblue
+}
+
+.blue, .blue a {
+    color: blue
+}
+
+.gold, .gold a, .trust.dec, .trust.dec a, .trust.frightened, .trust.frightened a {
+    color: gold
+}
+
+.goldenrod, .goldenrod a, .trust.terrified, .trust.terrified a {
+    color: goldenrod
+}
+
+.gray, .gray a {
+    color: gray
+}
+
+.green, .green a, .reputation.inc, .reputation.inc a, .improvement, .improvement a, .flaw.break, .flaw.break a,
+.skill.inc, .skill.inc a, .fuckdoll, .fuckdoll a, .positive, .positive a, .health.inc, .health.inc a {
+    color: green
+}
+
+.hotpink, .hotpink a, .devotion.inc, .devotion.inc a, .devotion.accept, .devotion.accept a {
+    color: hotpink
+}
+
+.lawngreen, .lawngreen a {
+    color: lawngreen
+}
+
+.lightblue, .lightblue a {
+    color: lightblue
+}
+
+/* compare pink for fetish */
+.lightcoral, .lightcoral a, .fetish.gain, .fetish.gain a {
+    color: lightcoral
+}
+
+.lightgreen, .lightgreen a, .relationship, .relationship a, .rivalry.dec, .rivalry.dec a {
+    color: lightgreen
+}
+
+.lightpink, .lightpink a {
+    color: lightpink
+}
+
+.lightsalmon, .lightsalmon a, .fetish.inc, .fetish.inc a, .rivalry.inc, .rivalry.inc a,
+.relationship.dec, .relationship.dec a {
+    color: lightsalmon
+}
+
+/* tight orifices, breast changes, take virginity, not sure on good aliases */
+.lime, .lime a, .change.positive, .change.positive a, .virginity.loss, .virginity.loss a, .puberty, .puberty a,
+.pregnant, .pregnant a {
+    color: lime
+}
+
+/* multiple questionable uses */
+.limegreen, .limegreen a {
+    color: limegreen
+}
+
+.magenta, .magenta a, .devotion.worship, .devotion.worship a {
+    color: magenta
+}
+
+.mediumaquamarine, .mediumaquamarine a, .trust.inc, .trust.inc a, .trust.careful, .trust.careful a {
+    color: mediumaquamarine
+}
+
+.mediumorchid, .mediumorchid a, .devotion.dec, .devotion.dec a, .devotion.resistant, .devotion.resistant a {
+    color: mediumorchid
+}
+
+.mediumseagreen, .mediumseagreen a, .trust.trusting, .trust.trusting a {
+    color: mediumseagreen
+}
+
+/* generally between red and green, and a lot of other places */
+.orange, .orange a, .stupid, .stupid a, .change.negative, .change.negative a, .defiant.careful, .defiant.careful a,
+.ncs, .ncs a, .miscarriage, .miscarriage a, .intro.question {
+    color: orange
+}
+
+.orangered, .orangered a, .defiant.inc, .defiant.inc a, .defiant.bold, .defiant.bold, .education.neg a {
+    color: orangered
+}
+
+/* used once (wrong? */
+.orchid, .orchid a {
+    color: orchid
+}
+
+/* also fetish start ??? , and a lot of other stuff */
+.pink, .pink a, .slave.name.simple {
+    color: pink
+}
+
+/* generally bad stuff */
+/* note: .error is for unexpected behavior, .warning for player feedback */
+.red, .red a, .health.dec, .health.dec a, .cash.dec, .cash.dec a, .stat.drop, .stat.drop a, .flaw.gain, .flaw.gain a,
+.mindbreak, .mindbreak a, .error, .error a, .elites.loss, .elites.loss a, .reputation.dec, .reputation.dec a,
+.warning, .warning a {
+    color: red
+}
+
+.seagreen, .seagreen a, .trust.prof-trusting, .trust.prof-trusting a {
+    color: seagreen
+}
+
+.springgreen, .springgreen a, .skill.player, .skill.player a {
+    color: springgreen
+}
+
+/* some ethnicity */
+.tan, .tan a {
+    color: tan
+}
+
+.chocolate, .chocolate a {
+    color: chocolate
+}
+
+.saddlebrown, .saddlebrown a {
+    color: saddlebrown
+}
+
+.teal, .teal a {
+    color: teal
+}
+
+.yellow, .yellow a, .noteworthy, .noteworthy a, .paraphilia.gain, .paraphilia.gain a,
+.devotion.ambivalent, .devotion.ambivalent a, .trust.fearful, .trust.fearful a, .job.change {
+    color: yellow
+}
+
+.yellowgreen, .yellowgreen a, .cash.inc, .cash.inc a, .cash, .cash a {
+    color: yellowgreen
+}
+
+.white a {
+    color: white
+}
+
+.violet, .libido.inc {
+    color: violet
+}
+
+.khaki, .libido.dec {
+    color: khaki
+}
diff --git a/src/gui/css/accordion.css b/css/gui/accordion.css
similarity index 100%
rename from src/gui/css/accordion.css
rename to css/gui/accordion.css
diff --git a/src/gui/Encyclopedia/encyclopedia.css b/css/gui/encyclopedia.css
similarity index 100%
rename from src/gui/Encyclopedia/encyclopedia.css
rename to css/gui/encyclopedia.css
diff --git a/css/gui/favorite.css b/css/gui/favorite.css
new file mode 100644
index 0000000000000000000000000000000000000000..e6069066bcdaa3aa9953bb5751391e7a0e2605b3
--- /dev/null
+++ b/css/gui/favorite.css
@@ -0,0 +1,9 @@
+.favorite, .favorite:hover {
+    color: yellow;
+    text-decoration: none;
+}
+
+.not-favorite, .not-favorite:hover {
+    color: grey;
+    text-decoration: none;
+}
diff --git a/src/gui/options/hotkeySettings.css b/css/gui/hotkeySettings.css
similarity index 100%
rename from src/gui/options/hotkeySettings.css
rename to css/gui/hotkeySettings.css
diff --git a/css/gui/linksStrip.css b/css/gui/linksStrip.css
new file mode 100644
index 0000000000000000000000000000000000000000..2ae24c635862ceb42a6a35fbaf6b12049055aafe
--- /dev/null
+++ b/css/gui/linksStrip.css
@@ -0,0 +1,20 @@
+ul.choicesStrip {
+    display: inline;
+    list-style-type: none;
+    padding: 0mm;
+    margin-left: 0em;
+}
+
+ul.choicesStrip li {
+    display: inline;
+}
+
+ul.choicesStrip li + li:before {
+    content: " | ";
+}
+
+a.disabled {
+    color: white;
+    pointer-events: none;
+    cursor: default;
+}
diff --git a/src/gui/css/options.css b/css/gui/options.css
similarity index 100%
rename from src/gui/css/options.css
rename to css/gui/options.css
diff --git a/src/003-assets/CSS/quicklinks.css b/css/gui/quicklinks.css
similarity index 100%
rename from src/003-assets/CSS/quicklinks.css
rename to css/gui/quicklinks.css
diff --git a/src/003-assets/CSS/cardStyle.css b/css/gui/slaveList/cardStyle.css
similarity index 100%
rename from src/003-assets/CSS/cardStyle.css
rename to css/gui/slaveList/cardStyle.css
diff --git a/src/gui/css/quickListCSS.css b/css/gui/slaveList/quickListCSS.css
similarity index 100%
rename from src/gui/css/quickListCSS.css
rename to css/gui/slaveList/quickListCSS.css
diff --git a/src/003-assets/CSS/slaveList.css b/css/gui/slaveList/slaveList.css
similarity index 90%
rename from src/003-assets/CSS/slaveList.css
rename to css/gui/slaveList/slaveList.css
index 1622a6a9f60b779856d1aa0468867cb8aadfaf3e..a88ed7430ab4fa4a8937d62476a57f45b9d22ae1 100644
--- a/src/003-assets/CSS/slaveList.css
+++ b/css/gui/slaveList/slaveList.css
@@ -20,7 +20,3 @@ span.freeAssignment {
 	margin-right: 2em;
 	text-indent: 0;
 }
-
-.strong {
-	font-weight: bold;
-}
diff --git a/src/003-assets/CSS/tabs.css b/css/gui/tabs.css
similarity index 100%
rename from src/003-assets/CSS/tabs.css
rename to css/gui/tabs.css
diff --git a/css/gui/tooltips/hasTooltip.css b/css/gui/tooltips/hasTooltip.css
new file mode 100644
index 0000000000000000000000000000000000000000..1eaca7af0ac5c88d57e07a07314f5ac8ab93b4eb
--- /dev/null
+++ b/css/gui/tooltips/hasTooltip.css
@@ -0,0 +1,21 @@
+/* TODO unify tooltip systems */
+.hasTooltip {
+    text-decoration: underline;
+}
+
+/* interactable tooltip-like container - created/destroyed dynamically */
+.details-overlay {
+    display: inline-block;
+    font-size: smaller;
+    width: max-content;
+    height: max-content;
+    border-style: solid;
+    border-color: slategray;
+    border-width: 2px;
+    border-radius: 3px;
+    background-color: rgb(17, 17, 17);
+    padding: 3px;
+    position: absolute;
+    z-index: 2;
+    text-indent: 0;
+}
diff --git a/css/gui/tooltips/textWithTooltip.css b/css/gui/tooltips/textWithTooltip.css
new file mode 100644
index 0000000000000000000000000000000000000000..60036f7ff6dfdb4509470a83523403b9c0b68d5f
--- /dev/null
+++ b/css/gui/tooltips/textWithTooltip.css
@@ -0,0 +1,48 @@
+/* TODO unify tooltip systems */
+.textWithTooltip {
+    position: relative;
+    display: inline-block;
+    text-decoration: underline;
+    text-decoration-color: lightblue;
+}
+
+.textWithTooltip .tooltip {
+    visibility: hidden;
+    display: block;
+    font-size: smaller;
+    width: 20em;
+    margin-left: -10em;
+    background-color: rgb(29, 30, 32);
+    text-align: center;
+    border-radius: 3px;
+    padding: 3px;
+    position: absolute;
+    z-index: 1;
+    bottom: 100%;
+    left: 50%;
+}
+
+.textWithTooltip .tooltip ul {
+    margin-left: 5px;
+    margin-right: 0px;
+    padding-left: 10px;
+    padding-right: 0px;
+    text-align: left;
+}
+
+.textWithTooltip .tooltip::after {
+    content: "";
+    position: absolute;
+    top: 100%;
+    left: 50%;
+    margin-left: -5px;
+    border-width: 5px;
+    border-style: solid;
+    border-color: #555 transparent transparent transparent;
+}
+
+.textWithTooltip:hover .tooltip {
+    visibility: visible;
+    opacity: 1;
+    transition-delay: 0.3s;
+}
diff --git a/css/interaction/export.css b/css/interaction/export.css
new file mode 100644
index 0000000000000000000000000000000000000000..72eabfbdb7af31eb594f96cf15d088517b088ca2
--- /dev/null
+++ b/css/interaction/export.css
@@ -0,0 +1,6 @@
+div.output {
+    width: 100vw;
+    max-width: 100%;
+    word-break: break-all;
+    white-space: normal;
+}
diff --git a/src/gui/css/familyTree.css b/css/interaction/familyTree.css
similarity index 100%
rename from src/gui/css/familyTree.css
rename to css/interaction/familyTree.css
diff --git a/src/003-assets/CSS/gridTemplates.css b/css/interaction/prosthetics.css
similarity index 75%
rename from src/003-assets/CSS/gridTemplates.css
rename to css/interaction/prosthetics.css
index bdc2adf2e7f4ce6c1b970d3059b45c2dcb7cf382..0b6a4b4b2dec88df4948f78efe87e67b5327fd0b 100644
--- a/src/003-assets/CSS/gridTemplates.css
+++ b/css/interaction/prosthetics.css
@@ -1,12 +1,3 @@
-/* general use */
-div.grid-2columns-auto {
-	display: grid;
-	grid-template-columns: max-content auto;
-}
-
-/* specific uses */
-
-/* limb selector in limbs.js */
 div.limb-selector {
 	display: grid;
 	grid-template-columns: 200px 100px 100px 100px 100px;
@@ -18,7 +9,6 @@ div.limb-selector div.full {
 	text-align: center;
 }
 
-/* prostheticConfig.tw */
 div.eyeContainer {
 	display: grid;
 	grid-template-columns: 80px 50px 70px 50px;
diff --git a/css/interaction/slaveInteract.css b/css/interaction/slaveInteract.css
new file mode 100644
index 0000000000000000000000000000000000000000..587ffa7234093ab4d043479cc9ee4c0b403336a8
--- /dev/null
+++ b/css/interaction/slaveInteract.css
@@ -0,0 +1,7 @@
+.adjacent-slave {
+    font-weight: bold;
+}
+
+.interact-name {
+    margin: 0 2em;
+}
diff --git a/src/interaction/wardrobe.css b/css/interaction/wardrobe.css
similarity index 100%
rename from src/interaction/wardrobe.css
rename to css/interaction/wardrobe.css
diff --git a/src/events/intro/customizeSlaveTrade/customizeSlaveTrade.css b/css/intro/customizeSlaveTrade.css
similarity index 100%
rename from src/events/intro/customizeSlaveTrade/customizeSlaveTrade.css
rename to css/intro/customizeSlaveTrade.css
diff --git a/src/003-assets/CSS/table.css b/css/manage/budget.css
similarity index 72%
rename from src/003-assets/CSS/table.css
rename to css/manage/budget.css
index d71878e44483a7243eb66aa161bf63a4a53419a2..eca4573e7de36fe73373de9e5aa2346db05897aa 100644
--- a/src/003-assets/CSS/table.css
+++ b/css/manage/budget.css
@@ -1,16 +1,3 @@
-table.wardrobe {
-	text-align: left;
-	border-collapse: separate;
-	border-spacing: 5px;
-	/*border-style: hidden;*/
-	/*empty-cells: hide;*/
-	width: 900px
-}
-table.wardrobe td {
-	width: 50%;
-	border: 1px solid white;
-}
-
 table.budget {
 	text-align: right;
 	border-collapse: separate;
diff --git a/css/manage/main.css b/css/manage/main.css
new file mode 100644
index 0000000000000000000000000000000000000000..3b1c3042dd81fd8e6ed1c4756b96fd8921e051d1
--- /dev/null
+++ b/css/manage/main.css
@@ -0,0 +1,4 @@
+.main-fcnn {
+    text-align: center;
+    margin: 0 auto;
+}
diff --git a/css/manage/manage.css b/css/manage/manage.css
new file mode 100644
index 0000000000000000000000000000000000000000..9b5838df9f4b328cc5549a4763a8b2e36915d9e3
--- /dev/null
+++ b/css/manage/manage.css
@@ -0,0 +1,6 @@
+/* puts a div in the right upper corner while not influencing the layout of the rest of the page */
+div.cheat-menu {
+    font-style: italic;
+    position: absolute;
+    right: 50px;
+}
diff --git a/src/neighbor/neighborDisplay.css b/css/neighbor/neighborDisplay.css
similarity index 100%
rename from src/neighbor/neighborDisplay.css
rename to css/neighbor/neighborDisplay.css
diff --git a/src/npc/interaction/slaveOnSlaveFeeding/slaveOnSlaveFeeding.css b/css/npc/slaveOnSlaveFeeding.css
similarity index 98%
rename from src/npc/interaction/slaveOnSlaveFeeding/slaveOnSlaveFeeding.css
rename to css/npc/slaveOnSlaveFeeding.css
index e4fb2cc907eab6d4d2fc07e8aef967eeb0ec919a..bb7e81979fb99693ae0f5b52904a374e0c06bfd1 100644
--- a/src/npc/interaction/slaveOnSlaveFeeding/slaveOnSlaveFeeding.css
+++ b/css/npc/slaveOnSlaveFeeding.css
@@ -4,4 +4,4 @@ table.slave-on-slave-feeding {
 
 table.slave-on-slave-feeding tr {
 	vertical-align: top;
-}
\ No newline at end of file
+}
diff --git a/css/rulesAssistant/raLists.css b/css/rulesAssistant/raLists.css
new file mode 100644
index 0000000000000000000000000000000000000000..70cd924e242db5577c85ede9dd4c92025361e5e3
--- /dev/null
+++ b/css/rulesAssistant/raLists.css
@@ -0,0 +1,41 @@
+.rajs-list-item {
+    display: inline-block;
+    color: var(--link-color);
+    margin-right: 1em;
+}
+
+.rajs-list-item.selected {
+    color: gray;
+    text-decoration: none;
+}
+
+.rajs-list-item:last-of-type {
+    margin-right: 0;
+}
+
+.rajs-list-item:hover {
+    cursor: pointer;
+    text-decoration: underline;
+}
+
+.rajs-list-item.selected:hover {
+    cursor: default;
+    text-decoration: none;
+}
+
+.rajs-list strong:first-of-type, .rajs-list input {
+    margin-right: 2em;
+}
+
+.rajs-list-item input {
+    margin: 0.25em;
+}
+
+.rajs-section h1 {
+    border-bottom: 1px solid white;
+    cursor: pointer;
+}
+
+.rajs-section h1:hover {
+    text-decoration: underline;
+}
diff --git a/src/003-assets/CSS/RAoptions.css b/css/rulesAssistant/raOptions.css
similarity index 99%
rename from src/003-assets/CSS/RAoptions.css
rename to css/rulesAssistant/raOptions.css
index 3a3c4fcc3d53779a892516ff7aedc21e424ff436..079895f20ae600c74c1b04f739d18d4529700d98 100644
--- a/src/003-assets/CSS/RAoptions.css
+++ b/css/rulesAssistant/raOptions.css
@@ -4,33 +4,40 @@
 	vertical-align: middle;
 	-webkit-user-select:none; -moz-user-select:none; -ms-user-select: none;
 }
+
 .ra-onoffswitch-checkbox {
 	display: none;
 }
+
 .ra-onoffswitch-label {
 	display: block; overflow: hidden; cursor: pointer;
 	border: 2px solid #999999; border-radius: 2px;
 }
+
 .ra-onoffswitch-inner {
 	display: block; width: 200%; margin-left: -100%;
 	transition: margin 0.3s ease-in 0s;
 }
+
 .ra-onoffswitch-inner:before, .ra-onoffswitch-inner:after {
 	display: block; float: left; width: 50%; height: 3.5ex; padding: 0; line-height: 3.5ex;
 	font-size: x-small; color: white; font-family: FreeSans, sans-serif; font-weight: bold;
 	box-sizing: border-box;
 }
+
 .ra-onoffswitch-inner:before {
 	content: "ON";
 	padding-left: 7px;
 	background-color: #111111; color: #FFFFFF;
 }
+
 .ra-onoffswitch-inner:after {
 	content: "OFF";
 	padding-right: 7px;
 	background-color: #111111; color: #D9D9D9;
 	text-align: right;
 }
+
 .ra-onoffswitch-switch {
 	display: block; width: 1.5em; margin: 1px;
 	background: #8A8A8A;
@@ -39,13 +46,16 @@
 	border: 2px solid #414141; border-radius: 2px;
 	transition: all 0.3s ease-in 0s;
 }
+
 .ra-onoffswitch-checkbox:checked + .ra-onoffswitch-label .ra-onoffswitch-inner {
 	margin-left: 0;
 }
+
 .ra-onoffswitch-checkbox:checked + .ra-onoffswitch-label .ra-onoffswitch-switch {
 	right: 0px;
 	background-color: #2D80E0;
 }
+
 .ra-radio-label {
 	margin: 0.5em;
 }
diff --git a/css/rulesAssistant/raSummary.css b/css/rulesAssistant/raSummary.css
new file mode 100644
index 0000000000000000000000000000000000000000..b9734d8fc017ea4f50347937dd2f3aa377bdfc3c
--- /dev/null
+++ b/css/rulesAssistant/raSummary.css
@@ -0,0 +1,3 @@
+.scroll {
+    overflow: auto;
+}
diff --git a/js/003-data/gameVariableData.js b/js/003-data/gameVariableData.js
index b859b9718de84ccb55cad8f0f9e0a02895929dcc..15d295d1db54e7e4953cf219bf72dd1c859cec38 100644
--- a/js/003-data/gameVariableData.js
+++ b/js/003-data/gameVariableData.js
@@ -163,7 +163,7 @@ App.Data.defaultGameStateVariables = {
 	summaryStats: 0,
 	surnameOrder: 0,
 	/** @type {Object.<string, string>} */
-	tabChoice: {Main: "all"},
+	tabChoice: { Main: "all" },
 	universalRulesAssignsSelfFacility: 0,
 	universalRulesBirthing: 0,
 	universalRulesCSec: 0,
@@ -342,7 +342,7 @@ App.Data.resetOnNGPlus = {
 	},
 	/** @type {assistant} */
 	assistant: {},
-	targetArcology: {fs: "New"},
+	targetArcology: { fs: "New" },
 	readySlaves: 0,
 
 	plot: 1,
@@ -782,6 +782,11 @@ App.Data.resetOnNGPlus = {
 			smartVaginalAttachments: 0,
 		},
 	},
+	customItem: {
+		/** @type {Map<string, slaveButtplugs>} */
+		buttPlugs: new Map([]),
+		dildos: new Map([]),
+	},
 	dairyPiping: 0,
 	milkPipeline: 0,
 	cumPipeline: 0,
@@ -911,11 +916,11 @@ App.Data.resetOnNGPlus = {
 	ui: "start",
 	tooltipsEnabled: 0,
 
-	brandTarget: {primary: "left buttock", secondary: "left buttock", local: "left buttock"},
-	brandDesign: {primary: "your initials", official: "your initials", local: "your initials"},
+	brandTarget: { primary: "left buttock", secondary: "left buttock", local: "left buttock" },
+	brandDesign: { primary: "your initials", official: "your initials", local: "your initials" },
 
-	scarTarget: {primary: "left cheek", secondary: "left cheek", local: "left cheek"},
-	scarDesign: {primary: "generic", local: "generic"},
+	scarTarget: { primary: "left cheek", secondary: "left cheek", local: "left cheek" },
+	scarDesign: { primary: "generic", local: "generic" },
 
 	oralTotal: 0,
 	vaginalTotal: 0,
@@ -1000,6 +1005,7 @@ App.Data.resetOnNGPlus = {
 	animalTesticles: 0, /* {pigTestes: 0, dogTestes: 0, horseTestes: 0, cowTestes: 0} currently unused*/
 	animalMpreg: 0, /* {pigMpreg: 0, dogMpreg: 0, horseMpreg: 0, cowMpreg: 0} currently unused*/
 	geneticMappingUpgrade: 0,
+	toyShop: false,
 	pregnancyMonitoringUpgrade: 0,
 	cloningSystem: 0,
 	geneticFlawLibrary: 0,
diff --git a/js/003-data/slaveWearData.js b/js/003-data/slaveWearData.js
index acce98a8329fa781d6d392059ee753aa1f261429..8cab5e39f1d0c3014ffd3718bef01027589d2894 100644
--- a/js/003-data/slaveWearData.js
+++ b/js/003-data/slaveWearData.js
@@ -828,7 +828,7 @@ App.Data.clothes = new Map([
  */
 
 /**
- * @typedef {Map<string, slaveWear|slaveWearChastity>} slaveWearCategory
+ * @typedef {Map<string, slaveWear>} slaveWearCategory
  */
 
 /** @type {Object.<string, slaveWearCategory>} */
@@ -983,53 +983,6 @@ App.Data.slaveWear = {
 		]
 	]),
 
-	vaginalAccessories: new Map([
-		["none", {name: "None"}],
-		["bullet vibrator", {name: "Bullet vibrator"}],
-		["smart bullet vibrator",
-			{
-				name: "Smart bullet vibrator",
-				get requirements() {
-					return V.boughtItem.toys.smartVibes === 1;
-				}
-			}
-		],
-		["dildo", {name: "Dildo"}],
-		["long dildo",
-			{
-				name: "Long dildo",
-				get requirements() {
-					return V.boughtItem.toys.dildos === 1;
-				}
-			}
-		],
-		["large dildo", {name: "Large dildo"}],
-		["long, large dildo",
-			{
-				name: "Long, large dildo",
-				get requirements() {
-					return V.boughtItem.toys.dildos === 1;
-				}
-			}
-		],
-		["huge dildo",
-			{
-				name: "Huge dildo",
-				get requirements() {
-					return V.boughtItem.toys.dildos === 1;
-				}
-			}
-		],
-		["long, huge dildo",
-			{
-				name: "Long, huge dildo",
-				get requirements() {
-					return V.boughtItem.toys.dildos === 1;
-				}
-			}
-		]
-	]),
-
 	vaginalAttachments: new Map([
 		["none", {name: "None"}],
 		["vibrator",
@@ -1195,13 +1148,12 @@ App.Data.shoes = new Map([ // TODO: add lift property
  * @property {string} name
  * @property {FC.FutureSociety} [fs] Automatically unlocked with this FS.
  * @property {boolean} [requirements]
- * @property {boolean} [harsh]
- * @property {0|1|2|3} width height in cm.  Adds to heel height.
- * @property {0|1|2} length height in cm.  Over 4cm they may totter.  21cm and over (8 inch heels) will be painful/extreme
+ * @property {0|1|2|3} width
+ * @property {0|1|2} length
  */
 
 /**
- * @type {Map<string, slaveButtplugs>} slaveShoesCategory
+ * @type {Map<string, slaveButtplugs>}
  */
 App.Data.buttplugs = new Map([
 	["none",
@@ -1263,17 +1215,110 @@ App.Data.buttplugs = new Map([
 		}
 	]
 ]);
+/**
+ * @typedef {object} vaginalAccessories
+ * @property {string} name
+ * @property {FC.FutureSociety} [fs] Automatically unlocked with this FS.
+ * @property {boolean} [requirements]
+ * @property {0|1|2|3} width
+ * @property {0|1|2} length
+ * @property {0|1|2} [vibrates=0] 0: none, 1: standard, 2: "smart" vibe
+ */
 
+/**
+ * @type {Map<string, vaginalAccessories>}
+ */
+App.Data.vaginalAccessories = new Map([
+	["none",
+		{
+			name: "None",
+			width: 0,
+			length: 0
+		}
+	],
+	["bullet vibrator",
+		{
+			name: "Bullet vibrator",
+			width: 0,
+			length: 1,
+			vibrates: 1
+		}
+	],
+	["smart bullet vibrator",
+		{
+			name: "Smart bullet vibrator",
+			get requirements() {
+				return V.boughtItem.toys.smartVibes === 1;
+			},
+			width: 0,
+			length: 1,
+			vibrates: 2
+		}
+	],
+	["dildo",
+		{
+			name: "Dildo",
+			width: 1,
+			length: 1
+		}
+	],
+	["long dildo",
+		{
+			name: "Long dildo",
+			get requirements() {
+				return V.boughtItem.toys.dildos === 1;
+			},
+			width: 1,
+			length: 2
+		}
+	],
+	["large dildo",
+		{
+			name: "Large dildo",
+			width: 2,
+			length: 1
+		}
+	],
+	["long, large dildo",
+		{
+			name: "Long, large dildo",
+			get requirements() {
+				return V.boughtItem.toys.dildos === 1;
+			},
+			width: 2,
+			length: 2
+		}
+	],
+	["huge dildo",
+		{
+			name: "Huge dildo",
+			get requirements() {
+				return V.boughtItem.toys.dildos === 1;
+			},
+			width: 3,
+			length: 1
+		}
+	],
+	["long, huge dildo",
+		{
+			name: "Long, huge dildo",
+			get requirements() {
+				return V.boughtItem.toys.dildos === 1;
+			},
+			width: 3,
+			length: 2
+		}
+	]
+]);
 /**
  * @typedef {object} slaveWearChastity
  * @property {string} name
- * @property {string} value
  * @property {object} updateSlave
  * @property {FC.FutureSociety} [fs]
  */
 
 /** @type {Map<string, slaveWearChastity>} */
-App.Data.slaveWear.chastityDevices = new Map([
+App.Data.chastityDevices = new Map([
 	// '.value' must be a string, so using update slave so I can update multiple values.
 	["none",
 		{
@@ -1382,3 +1427,4 @@ App.Data.slaveWear.chastityDevices = new Map([
 		}
 	]
 ]);
+
diff --git a/resources/raster/favicon/arcologyVector.html b/resources/raster/favicon/arcologyVector.html
new file mode 100644
index 0000000000000000000000000000000000000000..654baa88eae790a8a1967a201a6c8a75e7413a04
--- /dev/null
+++ b/resources/raster/favicon/arcologyVector.html
@@ -0,0 +1,2 @@
+<!-- embedded icon so no resources folder is required to display it. -->
+<link rel="shortcut icon" href="data:image/x-icon;base64,AAABAAMAQEAAAAEAIAAoQgAANgAAACAgAAABACAAqBAAAF5CAAAQEAAAAQAgAGgEAAAGUwAAKAAAAEAAAACAAAAAAQAgAAAAAAAAQAAAwQ4AAMEOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJKSkgCCgoJVl5eY/JmZmv+ZmZr/mZma/5mZmv+ZmZr/mZma/5mZmv+ZmZn/mZmZ/5mZmf+ZmZn/mZmZ/5mZmf+ZmZn/mZmZ/5mZmf+ZmZn/mZmZ/5mZmf+ZmZn/mZmZ/5mZmf+ZmZn/mZmZ/5mZmf+ZmZn/mZmZ/5mZmf+ZmZn/mZmZ/5mZmf+ampr/ZmZm/z4+Pv9nZ2f/jIyM/5GRkf+RkZH/kZGR/5GRkf+Ojo7/hYWF/4WFhf+FhYX/hYWF/4GBgf94eHjsZmZmMGhoaAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/9+wA/vftKf/z5Ob/8N3//+/Z///t1f//6s3//+rN///qzf//9ef/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////xcXF/1RUVP9ra2v/ysrK/+vr6//t7e3/7e3t/+3t7f/t7e3/5ubm/9TU1P/T09P/09PT/9PT0//IyMj/v7+/zL+/vxG/v78AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/+nLAP/pywn/6s25/+fH///kvv//4rv//9ur///aqP//2qf//+bD///+/f//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////xcXF/1JSUv9qamr/zMzM/+zs7P/t7e3/7e3t/+3t7f/t7e3/7e3t/+Li4v/T09P/09PT/9PT0//S0tL/xMTE/7+/v5u/v78Bv7+/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/qzgD/6s4A/+rOhf/py///5MD//+S////esv//26r//9up///esv//+fH/////////////////////////////////////////////////////////////////////////////////////////////////////////////////xcXF/1JSUv9qamr/zMzM//Hx8f/w8PD/7e3t/+3t7f/t7e3/7e3t/+3t7f/e3t7/09PT/9PT0//T09P/0NDQ/8HBwf+/v79pv7+/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/+rOAP/qzk//6s36/+XC///kv///4bf//9uq///bqv//26r///Dc////////////////////////////////////////////////////////////////////////////////////////////////////////////xcXF/1JSUv9qamr/zMzM//Hx8f/7+/v/8PDw/+3t7f/t7e3/7e3t/+3t7f/s7Oz/2tra/9PT0//T09P/09PT/83Nzf+/v7/yv7+/PL+/vwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/t1QD/7dYk/+3U4v/nxv//5L///+O8///crf//26r//9qp///mxP///v3/////////////////////////////////////////////////////////////////////////////////////////////////xcXF/1JSUv9qamr/zMzM//Hx8f/9/f3//f39/+/v7//t7e3/7e3t/+3t7f/t7e3/6urq/9fX1//T09P/09PT/9PT0//IyMj/v7+/1L+/vxe/v78AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/7tcA//DbCf/v2bn/6cz//+XB///lwf//37T//9yt///crP//4LX///ny////////////////////////////////////////////////////////////////////////////////////////////xcXF/1JSUv9qamr/zMzM//Hx8f/9/f3///////v7+//u7u7/7e3t/+3t7f/t7e3/7e3t/+fn5//U1NT/09PT/9PT0//S0tL/xMTE/7+/v6a/v78Dv7+/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/+nLAP///gD/+vSF//rz///58P//+fD///ft///26v//9uv///fr///9+v//////////////////////////////////////////////////////////////////////////////////////39/f/1dXV/9qamr/zMzM//Hy8v/9/v7////////////7+/v/7u7u/+3t7v/t7e7/7e3u/+3u7v/k5OX/09PU/9PT1P/T09T/0NDR/8HBwv+/v79vv7+/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/9OUA//bpT//z4/r/8d3//+/a///v2f//69D//+rO///qzv//6s3//+jI///mw///5sP//+bD///mw///4bj//9+z///ftP//37T//9+0///ftP//37T//9+0///ftP//37L//+/W/87Oz/9RUVH/ubi3//XdvP/+3bH//9+0///ftP//37T/+9uw/+7Qp//t0Kf/7dCn/+3Qp//t0Kf/5Mig/9m+l//Zvpj/2b6Y/9S5kf/LsIfyybKPPMmxjAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/+nNAP/pzCT/6s3i/+bF///jvv//477//96w///aqP//2qj//9qp///Yo///05j//9OX///Tl///05f//82I///IfP//yH3//8h9///Iff//yH3//8h9///Iff//yH3//8d6///htf/Pz9D/VVVW/8PBv//70pn//8h7///Iff//yH3//8h9//vFe//uu3T/7bp0/+26dP/tunT/7bp0/+Ozb//drmz/3a5s/92ubP/Xp2H/06Nb2dSjWRrUo1kAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/qzgD/6s4J/+rPuf/oyv//5L///+S////ht///26r//9uq///bqv//2qj//9Wc///Umf//1Jn//9SZ///Pjv//yX///8l////Jf///yX///8l////Jf///yX///8l////Iff//4rb/z8/Q/1RUVP/Avrv/+9Ob///Iff//yX///8l////Jf//6xXz/7bt2/+27dv/tu3b/7bt2/+y6df/gsXD/3a9u/92vbv/crmz/1KZf/9OkXbDTpF0F06RdAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/6s4A/+7XAP/u1oX/6s7//+XB///kv///47z//9ys///bqf//26n//9up///Xn///1Jj//9SY///Umf//0ZH//8l////Jfv//yX7//8l+///Jfv//yX7//8l+///Jfv//yHz//+K2/8/Q0P9NTU3/mJiY/+jSs///zIX//8h9///Jfv//yX7/+MN6/+27df/tu3X/7bt1/+27df/quXT/3rBu/92vbf/dr23/2qxp/9OkXf/TpF1606RcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/x3QD/8dxP//Da+v/rzf//6cj//+nI///kvP//4bb//+G2///htv//37H//9un///bp///26f//9mj///Skv//0ZD//9GQ///RkP//0ZD//9GQ///RkP//0ZD//9CO///nwP/P0ND/S0tL/19gYP+gn5//7te4///Skv//0ZD//9GQ//jLi//uwob/7sKG/+7Chv/vw4b/6L2C/920e//dtHv/3bR7/9eucv/RqGn40admSNGnZwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADk4dwA5eHcJNjW0+LW1ND/19PP/9fTz//X087/19LM/9fSzP/X0sz/19LM/9fRyv/X0cr/19HK/9fRyv/X0Mj/19DH/9fQx//X0Mf/19DH/9fQx//X0Mf/19DH/9fQx//Z1dD/sLCw/1VVVf+bm5v/b29v/5+fnv/Vz8f/19DH/9bQx//QysH/zMa+/8zGvv/Mxr7/zMa+/8bAuP++uLH/vrix/764sf+3san/tK6l3ryyoiG8sqMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdHR1AHR1dQlbW1u5WFhZ/1hYWf9YWFn/WFhY/1dXWP9XV1j/V1dY/1dXWP9XV1j/V1dY/1dXWP9XV1j/V1dY/1dXWP9XV1j/V1dY/1dXWP9XV1j/V1dY/1dXWP9XV1j/V1hY/1BQUP9QUFD/y8vL/8nJyf9sbG3/VlZX/1dXWP9XV1j/V1dY/1dYWP9XWFj/V1hY/1dYWP9XWFj/WFhZ/1hZWf9YWVn/WFlZ/1pbW7dpa20HZ2lsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQUFABHR0cAPj4+eT4+PuQ+Pj7hPj4+4EVFRehUVVX+VVVV/1VVVf9VVVX/VVVV/1VVVf9VVVX/VVVV/1VVVf9VVVX/VVVV/1VVVf9VVVX/VVVV/1VVVf9VVVX/VVVV/1VVVf9UVVX/Z2dn/+Dg4P//////1dXV/2tra/9TU1P/U1NT/1NTU/9TU1P/U1NT/1JSUv9QUFD/UFBQ/0VFRe0+Pj7gPj4+4T4+PuQ+Pj55R0dHABQUFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAAEBAQAxAQEAeQEBAHigoKBu8u7pW6Ofm9+jn5v/o5+b/6Ofl/+jn5v/o6Oj/6Ofl/+jn5f/o5+X/6Ofk/+jm5P/o5uT/6Obk/+jm5P/o5uT/6Obk/+jm5P/o5uT/6Obk/+vp5v/8+vj///77///+/P/x7+3/393a/9jW1P/Y19T/2NfU/9nX1f/NzMn/wsC+/7y7uP6enZtwLS4uGkBAQB5AQEAeQEBADEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/8dwA//HcP//w2vb/7dL//+rM///lwP//6sz///z4///qy///4LP//+Cz///apf//2KD//9ig///YoP//2KD//9ig///YoP//2KD//9ig///YoP//2KD//9ef///Wn///1p///9eg//XPmf/uyJX/7smV/+7Jlf/vyZX/5MCO/9y5iP/WtIH0z615Pc+seAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/+rNAP/qzj//6cv2/+TA///huf//26n//9yt///26v//68///9OX///Tl///y4T//8h9///Iff//yH3//8h9///Iff//yH3//8h9///Iff//yH3//8h9///Iff//yH3//8h9//7Iff/yvnf/7bp0/+26dP/tunT/7bp0/+Ozb//drmz/2Khj39KiWCDUo1oAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/qzgD/6s4//+nM9v/lwf//4rr//9ur///aqP//6s7///bq///XoP//05j//8yF///Jf///yX///8l////Jf///yX///8l////Jf///yX///8l////Jf///yX///8l////Jf//+yH7/8L54/+27dv/tu3b/7bt2/+y6dv/hsnD/3K5t/9aoY8LQoFcL06RdAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/6s4A/+rOP//pzPb/5cH//+K6///bq///2qj//9+z///68///37P//9OX///Mhf//yX///8l////Jf///yX///8l////Jf///yX///8l////Jf///yX///8l////Jf///yX///cd+/++9d//tu3b/7bt2/+27dv/runX/37Fv/9ytbP/VpmGgu4o1AdOkXQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/+vQAP/r0D//6s32/+XB///iuv//26v//9up///Yov//9Ob//+vQ///Tl///zIX//8l////Jf///yX///8l////Jf///yX///8l////Jf///yX///8l////Jf///yX///8l///vGff/uvHf/7bt2/+27dv/tu3b/6rh0/96wb//brGr/1KVfe9anYQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/v2QD/8No//+vR9v/lwf//4rr//9ur///bqf//1Zz//+nK///26v//1p///8yF///Jf///yX///8l////Jf///yX///8l////Jf///yX///8l////Jf///yX///8l////Jf//6xX3/7rt2/+27dv/tu3b/7bt2/+i3c//dr27/2qto+9OkXVDTpV4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/8NsA//DcP//s0fb/5cH//+K6///bq///26n//9Wc///drv//+vP//9+y///LhP//yX///8l////Jf///yX///8l////Jf///yX///8l////Jf///yX///8l////Jf///yX//+MR8/+27dv/tu3b/7bt2/+27dv/ltXL/3a9u/9mqZu3So1wy06RdAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//HbAP/x3D//7NL2/+XB///iuv//3Kv//9up///Wnf//1p3///Xm///s0P//y4T//8l+///Jf///yX///8l////Jf///yX///8l////Jf///yX///8l////Jf///yX///8l///bCe//tu3b/7bt2/+27dv/tu3b/47Nx/92vbv/XqGTZ0aJaGdOkXQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPbw5wD28Og/9u7j9vbr3f/26tr/9ufT//bn0//25c7/9uTM//bv5v/28u3//Nim///Jfv//yX///8l////Jf///yX///8l////Jf///yX///8l////Jf///yX///8l////Jf//0wXr/7bt2/+27dv/tu3b/7Lp2/+GycP/crm3/1qdivM+gVgjTpF0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACGhocAhoaHP4aHh/aGh4f/hoeH/4aHiP+Gh4j/hoeI/4aHiP+Ghob/jIyN/8jCu//71qL//8l+///Jf///yX///8l////Jf///yX///8l////Jf///yX///8l////Jf///yX//8795/+27dv/tu3b/7bt2/+u6df/fsW//261r/9WmYJbrvoUA06RdAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPz8/AD8/Pz8/Pz/2Pz8//z8/P/8+Pj7/PT09/z09Pf89PT3/PT09/z4+Pv9sbW3/yMK6//vWov//yX7//8l////Jf///yX///8l////Jf///yX///8l////Jf///yX///sh///G+eP/tu3b/7bt2/+27dv/quHT/3rBv/9qsav/UpV9t1aZgAAAA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AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/Pz8APj4+bz4+Pv8+Pj7/Pj4+/z4+Pv8+Pj7/Pj4+/z4+Pv8+Pj7/Pj4+/z4+Pv8+Pj7/Pj4+9j4+Pj8+Pj4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD+AAAAAAAAf/4AAAAAAAB//gAAAAAAAH//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//+AAAAAAAH//4AAAAAAAf//gAAAAAAB//+AAAAAAAH//8AAAAAAA///wAAAAAAD///AAAAAAAP//8AAAAAAA///4AAAAAAH///gAAAAAAf///4AAAAAf////gAAAAB////+AAAAAH////4AAAAAf////gAAAAD////+AAAAAP////4AAAAA/////gAAAAD////+AAAAAP////4AAAAB/////gAAAAH////+AAAAAf/////gAAAB/////+AAAAH/////4AAAAf/////gAAAD/////+AAAAP/////4AAAA//////wAAAD//////AAAAP/////8AAAA//////wAAAH//////AAAAf/////8AAAB//////wAAB///////AAAH//////8AAAf//////4AAD///////gAAP//////+AAA///////4AAD///////gAAP//////+AAB///////4AAH///////gAAf//////+AAB///////8AAP///////wAA////////AAD///////8AAP///////wAA////////AAH///////8AAf///////wAB////////AAH///////+AAf///////4AB////ygAAAAgAAAAQAAAAAEAIAAAAAAAABAAAMEOAADBDgAAAAAAAAAAAAAAAAAAAAAAAL+6tAC8uLIr0Me96NLIuf/SxbP/0sm7/9LS0f/S0tL/0tLS/9LS0v/S0tL/0tLS/9LS0v/S0tL/0tLS/9LS0v/T09P/0dHR/4KCgv+BgYH/wsLC/8XFxf/BwcH/srKy/7CwsP+kpKTcjo6OHZCQkAAAAAAAAAAAAAAAAAAAAAAA//DVAP/x2Q3/683D/+bB///fsP//47r///z3//////////////////////////////////////////////////39/f+1tbX/i4uL/97e3v/v7+//7+/v/+fn5//V1dX/0tLS/8XFxbe9vb0HxMTEAAAAAAAAAAAAAAAAAAAAAAD/6s4A/+bDAP/qzpD/5cL//96y///bqv//8+P////////////////////////////////////////////9/f3/s7Oz/4iJif/k5OT/9vf3/+3t7f/t7u7/4eLi/9PT0//Ozs7/wcHBhcTExQC/v78AAAAAAAAAAAAAAAAAAAAAAAAAAAD/8+MA//PiWf/w2/z/7NL//+jJ///z4v///vz///37///9+////fr///36///9+v///fr////9/729vf+Ih4b/5OLf///++//18/H/7evo/+3r6f/e3Nr/09LP/8vJx/q/vrxPwL68AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/y4AD/8+Ir/+7X6P/rz///5sP//+S////ht///37L//9ys///Wn///1p///9af///Wnf//4bf/m5ua/8y7pP//2KD//9ef//TOmP/tx5P/7ceT/+C8i//at4b/0rB95MqsfyXMroAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/+rOAP/s0w3/6s3D/+bB///gs///3Kn//9mi///VmP//0pL//8p+///Jff//yX3//8h7///Xnv+ZmJf/wK+Y///MhP//yX3/9cB3/+67dP/tunP/4bFt/92taf/VpV2+0qFWC9SjWQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/79oAk5CNAOfczpDg1ML/4NG8/+DOtf/gzbP/4Mut/+DKq//gxaH/4MWg/+DFoP/gxJ//4Myw/4qKiP+HhoT/zbmf/+HFoP/WvZn/0rmX/8+3lf/Fro7/waqJ/7+lfY2ZnKEA0qVhAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABWVlcAX2BgUlhZWd9cXV7ma2xt/Wxtb/9sbW//bG1v/2xucP9sbnD/bG5w/2xucP9rbW//cXJz/8vMzv+SlJb/amtu/2prbf9pamz/ZWdp/lpbXOhWV1jfWltdUVRVVgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADQ0NAAzMzMIIiIkG6eim0fl287v59nH/+ff1P/n2cb/59O4/+fQsv/n0LL/59Cy/+fQsv/q1LX//OfJ//TfwP/bxqn/18Km/9K9ov/BrpTwjYJySicpKxs0NDQINTU1AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/688A/+zQLv/ox+3/37L//+jG///lv///0I7//8qA///KgP//yoD//8qA///KgP//yX7//sh+//G/eP/uvHf/6Ld0/9ytatnVpl4a1qZfAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/rzwD/69Au/+fG7f/esv//3rD//+rO///Qkf//yX///8l////Jf///yX///8l////Jf//9x37/77x3/+27dv/ktXL/2atou8+fVQnTpF0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/+/XAP/v2C7/6Mjt/9+y///Zo///6s3//9ae///Jfv//yX///8l////Jf///yX///8l///vGff/uvHb/7bt2/+KzcP/YqmaW/9iuANOkXQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADz6NkA8+jaLvPjzu3z3b//89iz//Phyf/43bj//8qA///Jf///yX///8l////Jf///yX//+sV8/+27dv/sunb/37Fu/9eoZHDbrGoA06RdAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAG1tbQBtbW0sbW1t5G9vbvlzc3P/cXFy/4mGgv/nx5r//8uB///Jf///yX///8l////Jf//4w3v/7bt2/+u5df/dr2351qdiS9eoZAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANjY2ADY2NgsuLi44goB9ZsvEuvPMxLj/iYiH/398eP/nx5v//8uB///Jf///yX///8l///bC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">
diff --git a/slave variables documentation - Pregmod.txt b/slave variables documentation - Pregmod.txt
index 1d740d27a4f3d56e51bbb33549cc78d0af0ecac6..50ac8ed6708813151a92e4acd7c4e90aa855697f 100644
--- a/slave variables documentation - Pregmod.txt	
+++ b/slave variables documentation - Pregmod.txt	
@@ -46,7 +46,449 @@ career:
 career prior to enslavement
 accepts string
 
-setup.gratefulCareers
+App.Data.Careers.General.veryYoung
+"a babysitter"
+"a beggar"
+"a bully hunter"
+"a bully"
+"a camp counselor"
+"a cheerleader"
+"a child actress"
+"a child prodigy"
+"a child prostitute"
+"a child soldier"
+"a club manager"
+"a club recruiter"
+"a club treasurer"
+"a cum dump"
+"a dropout"
+"a drug mule"
+"a farmer's daughter"
+"a girl scout"
+"a hall monitor"
+"a handmaiden"
+"a hospital volunteer"
+"a housesitter"
+"a juvenile delinquent"
+"a latchkey kid"
+"a lemonade stand operator"
+"a marching band leader"
+"a meat toilet"
+"a military brat"
+"a model-UN star"
+"a model"
+"a noblewoman"
+"a pageant star"
+"a paper girl"
+"a part-time farm laborer"
+"a pick-pocket"
+"a refugee"
+"a school nurse's assistant"
+"a shrine maiden"
+"a street thug"
+"a street urchin"
+"a student council president"
+"a student from a boarding school"
+"a student from a private school"
+"a student from a public school"
+"a sweatshop worker"
+"a teacher's pet"
+"an apprentice"
+"an aspiring pop star"
+"an idol"
+"an orphan"
+"being homeschooled by her parents"
+"captain of the kendo club"
+"from a lower class family"
+"from a middle class family"
+"from an upper class family"
+"homeless"
+
+App.Data.Careers.General.young
+"a babysitter"
+"a ballerina"
+"a barista"
+"a bartender"
+"a beggar"
+"a blogger"
+"a butler"
+"a camgirl"
+"a camp counselor"
+"a camwhore"
+"a cashier"
+"a cheerleader"
+"a cocktail waitress"
+"a comedian"
+"a con artist"
+"a cook"
+"a courier"
+"a cowgirl"
+"a criminal"
+"a croupier"
+"a cum dump"
+"a dairy worker"
+"a dancer"
+"a delivery woman"
+"a dominatrix"
+"a drug mule"
+"a factory worker"
+"a farm laborer"
+"a farmer's daughter"
+"a florist"
+"a gang member"
+"a gardener"
+"a groomer"
+"a gymnast"
+"a handmaiden"
+"a house DJ"
+"a housesitter"
+"a housewife"
+"a law enforcement officer"
+"a lifeguard"
+"a magician's assistant"
+"a maid"
+"a mail-order bride"
+"a masseuse"
+"a meat toilet"
+"a mechanic"
+"a medical student"
+"a mistress"
+"a model"
+"a musician"
+"a noblewoman"
+"a nun"
+"a nurse"
+"a paramedic"
+"a party girl"
+"a personal assistant"
+"a personal trainer"
+"a pirate"
+"a political activist"
+"a porn star"
+"a prisoner"
+"a programmer"
+"a prostitute"
+"a racing driver"
+"a reality show star"
+"a receptionist"
+"a refugee"
+"a ride attendant"
+"a saleswoman"
+"a school nurse"
+"a secretary"
+"a security guard"
+"a service worker"
+"a shrine maiden"
+"a shut-in"
+"a soldier"
+"a street performer"
+"a street vendor"
+"a stripper"
+"a student"
+"a switchboard operator"
+"a teaching assistant"
+"a tour guide"
+"a trophy wife"
+"a truck driver"
+"a video game streamer"
+"a waitress"
+"a wet nurse"
+"a yoga instructor"
+"an actress"
+"an air hostess"
+"an apprentice"
+"an arcade attendant"
+"an artist"
+"an aspiring pop star"
+"an assassin"
+"an athlete"
+"an au pair"
+"an escort"
+"an exotic dancer"
+"an idol"
+"an installation technician"
+"an intern"
+"an office worker"
+"homeless"
+"in a militia"
+"unemployed"
+
+App.Data.Careers.General.educated
+"a ballerina"
+"a banker"
+"a bureaucrat"
+"a business owner"
+"a businessman"
+"a captain"
+"a chemist"
+"a chief of police"
+"a classical dancer"
+"a classical musician"
+"a coach"
+"a college scout"
+"a concierge"
+"a coroner"
+"a corporate executive"
+"a cosmetologist"
+"a counselor"
+"a criminal"
+"a critic"
+"a cult leader"
+"a dean"
+"a dentist"
+"a director"
+"a dispatch officer"
+"a doctor"
+"a historian"
+"a housekeeper"
+"a journalist"
+"a judge"
+"a lawyer"
+"a librarian"
+"a lobbyist"
+"a madam"
+"a manager"
+"a mechanic"
+"a mediator"
+"a medical student"
+"a mercenary"
+"a military officer"
+"a military recruiter"
+"a nanny"
+"a noblewoman"
+"a nun"
+"a painter"
+"a paramedic"
+"a personal assistant"
+"a pharmacist"
+"a photographer"
+"a physician"
+"a pilot"
+"a poet"
+"a police detective"
+"a police negotiator"
+"a police officer"
+"a political activist"
+"a politician"
+"a practitioner"
+"a principal"
+"a prison warden"
+"a private detective"
+"a private instructor"
+"a procuress"
+"a producer"
+"a professional bartender"
+"a professor"
+"a programmer"
+"a prostitute"
+"a psychologist"
+"a refugee"
+"a scholar"
+"a scientist"
+"a sculptor"
+"a secretary"
+"a serial divorcee"
+"a shut-in"
+"a stockbroker"
+"a surgeon"
+"a teacher"
+"a teaching assistant"
+"a therapist"
+"a train conductor"
+"a transporter"
+"a veterinarian"
+"a wedding planner"
+"a writer"
+"a zookeeper"
+"an actress"
+"an air hostess"
+"an animator"
+"an archaeologist"
+"an architect"
+"an artist"
+"an assassin"
+"an astronaut"
+"an economist"
+"an editor"
+"an engineer"
+"an escort"
+"an estate agent"
+"an investor"
+"an MS pilot"
+"an office worker"
+"an orchestra conductor"
+"retired"
+"unemployed"
+
+App.Data.Careers.General.uneducated
+"a baker"
+"a barber"
+"a barista"
+"a bartender"
+"a beekeeper"
+"a beggar"
+"a blacksmith"
+"a blogger"
+"a bodyguard"
+"a bouncer"
+"a bounty hunter"
+"a boxer"
+"a brewer"
+"a bullfighter"
+"a bus driver"
+"a butcher"
+"a butler"
+"a camgirl"
+"a camp counselor"
+"a camwhore"
+"a candlestick maker"
+"a caregiver"
+"a carpenter"
+"a cashier"
+"a charity worker"
+"a chauffeur"
+"a cheerleader"
+"a chiropractor"
+"a clown"
+"a cobbler"
+"a cocktail waitress"
+"a comedian"
+"a con artist"
+"a construction worker"
+"a cook"
+"a cowgirl"
+"a criminal"
+"a croupier"
+"a cum dump"
+"a dairy worker"
+"a dancer"
+"a delivery woman"
+"a dominatrix"
+"a driller"
+"a drug mule"
+"a factory worker"
+"a farm laborer"
+"a farmer's daughter"
+"a farmer"
+"a firefighter"
+"a fisherwoman"
+"a florist"
+"a fortune teller"
+"a gang leader"
+"a gang member"
+"a gardener"
+"a gravedigger"
+"a groomer"
+"a gymnast"
+"a handmaiden"
+"a hotel manager"
+"a house DJ"
+"a housewife"
+"a hunter"
+"a janitor"
+"a landlady"
+"a launderer"
+"a law enforcement officer"
+"a lifeguard"
+"a local news anchor"
+"a lumberjack"
+"a magician's assistant"
+"a maid"
+"a mail carrier"
+"a mail-order bride"
+"a masseuse"
+"a meat toilet"
+"a medic"
+"a medium"
+"a messenger"
+"a midwife"
+"a milkmaid"
+"a mime"
+"a miner"
+"a missionary"
+"a mistress"
+"a model"
+"a mortician"
+"a musician"
+"a nanny"
+"a nurse"
+"a paramedic"
+"a park ranger"
+"a party girl"
+"a peddler"
+"a personal trainer"
+"a pimp"
+"a pirate"
+"a plumber"
+"a political activist"
+"a prison guard"
+"a prisoner"
+"a procuress"
+"a prostitute"
+"a racing driver"
+"a radio show host"
+"a rancher"
+"a receptionist"
+"a referee"
+"a refugee"
+"a repairman"
+"a revolutionary"
+"a ride attendant"
+"a roadie"
+"a rodeo star"
+"a sailor"
+"a saleswoman"
+"a school nurse"
+"a seamstress"
+"a secretary"
+"a security guard"
+"a service worker"
+"a shepherd"
+"a shrine maiden"
+"a soldier"
+"a stage magician"
+"a street performer"
+"a street vendor"
+"a stripper"
+"a student"
+"a student athlete"
+"a stuntwoman"
+"a switchboard operator"
+"a tailor"
+"a talent scout"
+"a taxi driver"
+"a teacher"
+"a tour guide"
+"a trophy wife"
+"a truck driver"
+"a waitress"
+"a weathergirl"
+"a welder"
+"a wet nurse"
+"a whaler"
+"a wrestler"
+"a zookeeper"
+"an acrobat"
+"an actress"
+"an arcade attendant"
+"an artist"
+"an aspiring pop star"
+"an athlete"
+"an electrician"
+"an enforcer"
+"an escort"
+"an exotic dancer"
+"an exterminator"
+"an innkeeper"
+"an installation technician"
+"an office worker"
+"an orderly"
+"homeless"
+"in a militia"
+"retired"
+"unemployed"
+
+App.Data.Careers.General.grateful
 "a beggar"
 "a drug mule"
 "a peddler"
@@ -63,7 +505,7 @@ setup.gratefulCareers
 "homeless"
 "unemployed"
 
-setup.menialCareers
+App.Data.Careers.General.menial
 "a baker"
 "a blacksmith"
 "a bus driver"
@@ -129,7 +571,7 @@ setup.menialCareers
 "an installation technician"
 "an intern"
 
-setup.entertainmentCareers
+App.Data.Careers.General.entertainment
 "a ballerina"
 "a blogger"
 "a camgirl"
@@ -166,7 +608,8 @@ setup.entertainmentCareers
 "an artist"
 "an athlete"
 
-setup.whoreCareers
+App.Data.Careers.General.whore
+"a bimbo"
 "a child prostitute"
 "a criminal"
 "a cum dump"
@@ -188,15 +631,7 @@ setup.whoreCareers
 "an escort"
 "an exotic dancer"
 
-setup.servantCareers
-"a butler"
-"a cook"
-"a handmaiden"
-"a housewife"
-"a maid"
-"a shrine maiden"
-
-setup.HGCareers
+App.Data.Careers.Leader.HG
 "a captain"
 "a corporate executive"
 "a director"
@@ -213,7 +648,7 @@ setup.HGCareers
 "a slaver"
 "a student council president"
 
-setup.madamCareers
+ App.Data.Careers.Leader.madam
 "a banker"
 "a business owner"
 "a businessman"
@@ -229,7 +664,7 @@ setup.madamCareers
 "a stockbroker"
 "an innkeeper"
 
-setup.DJCareers
+ App.Data.Careers.Leader.DJ
 "a classical dancer"
 "a classical musician"
 "a dancer"
@@ -241,7 +676,7 @@ setup.DJCareers
 "an idol"
 "an orchestra conductor"
 
-setup.bodyguardCareers
+ App.Data.Careers.Leader.bodyguard
 "a bodyguard"
 "a boxer"
 "a bully hunter"
@@ -261,7 +696,7 @@ setup.bodyguardCareers
 "in a militia"
 "spec ops"
 
-setup.wardenessCareers
+ App.Data.Careers.Leader.wardeness
 "a bouncer"
 "a bounty hunter"
 "a bully"
@@ -279,7 +714,7 @@ setup.wardenessCareers
 "an enforcer"
 "an orderly"
 
-setup.nurseCareers
+ App.Data.Careers.Leader.nurse
 "a chemist"
 "a chiropractor"
 "a coroner"
@@ -298,7 +733,7 @@ setup.nurseCareers
 "a school nurse"
 "a surgeon"
 
-setup.attendantCareers
+ App.Data.Careers.Leader.attendant
 "a barber"
 "a cosmetologist"
 "a counselor"
@@ -315,14 +750,14 @@ setup.attendantCareers
 "a therapist"
 "a yoga instructor"
 
-setup.matronCareers
+ App.Data.Careers.Leader.matron
 "a babysitter"
 "a nanny"
 "a practitioner"
 "a wet nurse"
 "an au pair"
 
-setup.milkmaidCareers
+ App.Data.Careers.Leader.milkmaid
 "a cowgirl"
 "a dairy worker"
 "a farmer's daughter"
@@ -330,7 +765,7 @@ setup.milkmaidCareers
 "a shepherd"
 "a veterinarian"
 
-setup.farmerCareers
+ App.Data.Careers.Leader.farmer
 "a beekeeper"
 "a bullfighter"
 "a farmer"
@@ -339,7 +774,7 @@ setup.farmerCareers
 "a rodeo star"
 "a zookeeper"
 
-setup.stewardessCareers
+ App.Data.Careers.Leader.stewardess
 "a barista"
 "a bartender"
 "a brewer"
@@ -363,7 +798,7 @@ setup.stewardessCareers
 "an investor"
 "an office worker"
 
-setup.schoolteacherCareers
+ App.Data.Careers.Leader.schoolteacher
 "a child prodigy"
 "a coach"
 "a dean"
@@ -381,7 +816,7 @@ setup.schoolteacherCareers
 "an astronaut"
 "an economist"
 
-setup.recruiterCareers
+ App.Data.Careers.Leader.recruiter
 "a club recruiter"
 "a college scout"
 "a con artist"
@@ -397,36 +832,13 @@ setup.recruiterCareers
 "a talent scout"
 "retired"
 
-setup.otherCareers
-"a bioreactor"
-"a breeder"
-"a breeding bull"
-"a businesswoman"
-"a cat burglar"
-"a criminal businesswoman"
-"a dairy cow"
-"a dairy slave"
-"a drug pusher"
-"a drug smuggler"
-"a fence"
-"a Fuckdoll"
-"a lady courtier"
-"a merchant"
-"a murderer"
-"a priest"
-"a producer"
-"a slave since birth"
-"a slave"
-"a smuggler"
-"a trophy spouse"
-"a wanderer"
-"a well connected individual"
-"an antislavery activist"
-"an arcology owner"
-"an arms dealer"
-"being homeschooled by her parents"
-"from a middle class family"
-"from an upper class family"
+ App.Data.Careers.Leader.servant
+"a butler"
+"a cook"
+"a handmaiden"
+"a housewife"
+"a maid"
+"a shrine maiden"
 
 ID:
 
diff --git a/src/002-config/fc-version.js b/src/002-config/fc-version.js
index c0159ceb1e40363fe3d02c90f290ad8926aefd46..393d11da8a111d1fbbbecb3174255714e1d76ba8 100644
--- a/src/002-config/fc-version.js
+++ b/src/002-config/fc-version.js
@@ -2,5 +2,5 @@ App.Version = {
 	base: "0.10.7.1", // The vanilla version the mod is based off of, this should never be changed.
 	pmod: "3.8.4",
 	commitHash: null,
-	release: 1112 // When getting close to 2000,  please remove the check located within the onLoad() function defined at line five of src/js/eventHandlers.js.
+	release: 1113 // When getting close to 2000,  please remove the check located within the onLoad() function defined at line five of src/js/eventHandlers.js.
 };
diff --git a/src/002-config/fc-version.js_after.js b/src/002-config/z_after_fc-version.js
similarity index 100%
rename from src/002-config/fc-version.js_after.js
rename to src/002-config/z_after_fc-version.js
diff --git a/src/003-assets/CSS/general.css b/src/003-assets/CSS/general.css
deleted file mode 100644
index f3467c9abe50b08fbfaa5a0fb83f80f058e02fe1..0000000000000000000000000000000000000000
--- a/src/003-assets/CSS/general.css
+++ /dev/null
@@ -1,13 +0,0 @@
-input:invalid{
-	border-color: #900;
-	background-color: rgba(255, 0, 0, 0.25);
-}
-
-input:focus:invalid {
-	outline: none;
-}
-
-input:out-of-range {
-	background-color: rgba(255, 0, 0, 0.25);
-	border: 2px solid #900;
-}
diff --git a/src/003-assets/CSS/links.css b/src/003-assets/CSS/links.css
deleted file mode 100644
index 5ea75b9308265e8e8d462f309f020e44ac34d277..0000000000000000000000000000000000000000
--- a/src/003-assets/CSS/links.css
+++ /dev/null
@@ -1,68 +0,0 @@
-.textWithTooltip {
-	position: relative;
-	display: inline-block;
-	text-decoration: underline;
-	text-decoration-color: lightblue;
-}
-
-.textWithTooltip .tooltip {
-	visibility: hidden;
-	display: block;
-	font-size: smaller;
-	width: 20em;
-	margin-left: -10em;
-	background-color: rgb(29, 30, 32);
-	text-align: center;
-	border-radius: 3px;
-	padding: 3px;
-	position: absolute;
-	z-index: 1;
-	bottom: 100%;
-	left: 50%;
-}
-
-.textWithTooltip .tooltip ul {
-	margin-left: 5px;
-	margin-right: 0px;
-	padding-left: 10px;
-	padding-right: 0px;
-	text-align: left;
-}
-
-.textWithTooltip .tooltip::after {
-	content: "";
-	position: absolute;
-	top: 100%;
-	left: 50%;
-	margin-left: -5px;
-	border-width: 5px;
-	border-style: solid;
-	border-color: #555 transparent transparent transparent;
-}
-
-.textWithTooltip:hover .tooltip {
-	visibility: visible;
-	opacity: 1;
-	transition-delay: 0.3s;
-}
-
-ul.choicesStrip {
-	display: inline;
-	list-style-type: none;
-	padding: 0mm;
-	margin-left: 0em;
-}
-
-ul.choicesStrip li {
-	display: inline;
-}
-
-ul.choicesStrip li + li:before {
-    content: " | ";
-}
-
-a.disabled {
-	color: white;
-	pointer-events: none;
-	cursor: default;
-}
diff --git a/src/004-base/domPassage.js b/src/004-base/domPassage.js
index e051f45dd2766e3eea75262f6bf112a4f8117782..c5bc9037593c7ba8fc742b79c4f96208f4c952f9 100644
--- a/src/004-base/domPassage.js
+++ b/src/004-base/domPassage.js
@@ -25,21 +25,7 @@ App.DomPassage = class extends Passage {
 		try {
 			return this.callback();
 		} catch (ex) {
-			const fragment = document.createDocumentFragment();
-
-			App.UI.DOM.appendNewElement("p", fragment, `${ex.name}: ${ex.message}`, ["bold", "error"]);
-
-			const p = document.createElement("p");
-			const lines = ex.stack.split("\n");
-			for (const ll of lines) {
-				const div = document.createElement("div");
-				// remove file path from error message
-				div.append(ll.replace(/file:.*\//, "<path>/"));
-				p.append(div);
-			}
-			fragment.append(p);
-
-			return fragment;
+			return App.UI.DOM.formatException(ex);
 		}
 	}
 };
diff --git a/src/005-passages/endWeekPassages.js b/src/005-passages/endWeekPassages.js
index ccc13ab8a4fe660126efcabaf4d82fe7626471cc..b039a2bed3eb32f3585a4b7c80ac6461bed695eb 100644
--- a/src/005-passages/endWeekPassages.js
+++ b/src/005-passages/endWeekPassages.js
@@ -1,12 +1,17 @@
 new App.DomPassage("Slave Assignments Report",
 	() => {
-		V.nextLink = "Economics"; V.nextButton = "Continue";
+		V.nextLink = "Economics";
+		V.nextButton = "Continue";
 
 		const f = document.createDocumentFragment();
-		App.UI.DOM.appendNewElement("h1", f, `${V.arcologies[0].name} Weekly Slave Report - Week ${V.week}`);
-		f.append(App.EndWeek.slaveAssignmentReport());
 
-		App.UI.EndWeekAnim.end();
+		try {
+			App.UI.DOM.appendNewElement("h1", f, `${V.arcologies[0].name} Weekly Slave Report - Week ${V.week}`);
+			f.append(App.EndWeek.slaveAssignmentReport());
+		} finally {
+			// whatever happens, stop the end week animation so we at least know there is an error.
+			App.UI.EndWeekAnim.end();
+		}
 
 		return f;
 	}
diff --git a/src/005-passages/facilitiesPassages.js b/src/005-passages/facilitiesPassages.js
index 0a372a4f922ae23e0d70ba36c8b93d31a79ab590..0fcb73572a5b57709a5a37271459a350aeddc86b 100644
--- a/src/005-passages/facilitiesPassages.js
+++ b/src/005-passages/facilitiesPassages.js
@@ -68,3 +68,12 @@ new App.DomPassage("Rules Assistant",
 		return div;
 	}, ["jump-to-safe", "jump-from-safe"]
 );
+
+new App.DomPassage("Toy Shop",
+	() => {
+		V.nextButton = "Back";
+		V.nextLink = "Manage Penthouse";
+
+		return App.UI.toyShop();
+	}, ["jump-to-safe", "jump-from-safe"]
+);
diff --git a/src/005-passages/slaveMarketPassages.js b/src/005-passages/slaveMarketPassages.js
index 9ea818ab7347c1648da5d39668e6af1a7ad1b56a..2969e72df114a05d57ee88546bc90025a0023870 100644
--- a/src/005-passages/slaveMarketPassages.js
+++ b/src/005-passages/slaveMarketPassages.js
@@ -1,4 +1,10 @@
-new App.DomPassage("Market", () => App.Markets[V.market.slaveMarket](), ["jump-from-safe"]);
+new App.DomPassage("Market",
+	() => {
+		const span = App.UI.DOM.makeElement("span", App.Markets[V.market.slaveMarket]());
+		span.id = "slave-markets";
+		return span;
+	}, ["jump-from-safe"]
+);
 
 new App.DomPassage("Buy Slaves",
 	() => {
diff --git a/src/art/vector/VectorArtJS.js b/src/art/vector/VectorArtJS.js
index 05f494ec1451c625adb5cec15ef0962e1ffd8c42..d58a6ce3ed272f59a680a1cada7789984ef2df1e 100644
--- a/src/art/vector/VectorArtJS.js
+++ b/src/art/vector/VectorArtJS.js
@@ -1771,7 +1771,7 @@ App.Art.vectorArtElement = (function() {
 						} else if (slave.vaginalAccessory === "long, huge dildo") {
 							svgQueue.add("Art_Vector_Dildo_Huge_Long");
 						}
-					} /* else if (slave.vaginalAccessory === "bullet vibrator" || slave.vaginalAccessory === "smart bullet vibrator") {
+					} /* else if (dildoWidth(slave) === 0) {
 						svgQueue.add("Art_Vector_Bullet_Vibrator");
 					} */
 			}
diff --git a/src/data/backwardsCompatibility/updateSlaveObject.js b/src/data/backwardsCompatibility/updateSlaveObject.js
index 7567a248fe8e0bf378e875e673bb34761204e9b9..7b93adc17b724f159287a3983dc643f17b736e90 100644
--- a/src/data/backwardsCompatibility/updateSlaveObject.js
+++ b/src/data/backwardsCompatibility/updateSlaveObject.js
@@ -926,30 +926,29 @@ App.Update.Slave = function(slave, genepool = false) {
 		slave.pregControl = "labor suppressors";
 	}
 
-	if (slave.chastityAnus === undefined || slave.chastityPenis === undefined || slave.chastityVagina === undefined) {
-		if (slave.dickAccessory === "combined chastity") {
-			slave.chastityAnus = 1;
-			slave.chastityPenis = 1;
-			slave.dickAccessory = "none";
-		} else if (slave.vaginalAccessory === "combined chastity") {
-			slave.chastityAnus = 1;
-			slave.chastityVagina = 1;
-			slave.vaginalAccessory = "none";
-		} else if (slave.dickAccessory === "anal chastity" || slave.vaginalAccessory === "anal chastity") {
-			slave.chastityAnus = 1;
-			slave.dickAccessory = "none";
-			slave.vaginalAccessory = "none";
-		} else if (slave.dickAccessory === "chastity") {
-			slave.chastityPenis = 1;
-			slave.dickAccessory = "none";
-		} else if (slave.vaginalAccessory === "chastity belt") {
-			slave.chastityVagina = 1;
-			slave.vaginalAccessory = "none";
-		} else {
-			slave.chastityAnus = 0;
-			slave.chastityPenis = 0;
-			slave.chastityVagina = 0;
-		}
+	// Fix dickAccessory
+	if (slave.dickAccessory === "combined chastity") {
+		slave.chastityAnus = 1;
+		slave.chastityPenis = 1;
+		slave.dickAccessory = "none";
+	} else if (slave.dickAccessory === "chastity") {
+		slave.chastityPenis = 1;
+		slave.dickAccessory = "none";
+	} else if (slave.dickAccessory === "anal chastity") {
+		slave.chastityAnus = 1;
+		slave.dickAccessory = "none";
+	}
+	// Fix vaginalAccessory
+	if (slave.vaginalAccessory === "combined chastity") {
+		slave.chastityAnus = 1;
+		slave.chastityVagina = 1;
+		slave.vaginalAccessory = "none";
+	} else if (slave.vaginalAccessory === "chastity belt") {
+		slave.chastityVagina = 1;
+		slave.vaginalAccessory = "none";
+	} else if (slave.vaginalAccessory === "anal chastity") {
+		slave.chastityAnus = 1;
+		slave.vaginalAccessory = "none";
 	}
 
 	if (slave.rules !== undefined && slave.rules.rest === undefined) {
diff --git a/src/descriptions/officeDescription.js b/src/descriptions/officeDescription.js
index 4ecac53c275b09bf69800c17cb5e04b75ea9c2ce..6c38742fa843b58a7abbf5b013e0ec97dfb2e539 100644
--- a/src/descriptions/officeDescription.js
+++ b/src/descriptions/officeDescription.js
@@ -454,7 +454,7 @@ App.Desc.officeDescription = function(lastElement) {
 		}
 		r.push(` face stares back at you.`);
 		if (V.playerAging !== 0 && V.PC.birthWeek === 51) {
-			r.push(`You'll be turning ${V.V.PC.actualAge + 1} next week.`);
+			r.push(`You'll be turning ${V.PC.actualAge + 1} next week.`);
 		}
 
 		r.push(App.Desc.Player.boobs(), App.Desc.Player.belly(), App.Desc.Player.crotch(), App.Desc.Player.butt());
diff --git a/src/endWeek/economics/reputation.js b/src/endWeek/economics/reputation.js
index 66c3e8668376c8c6a44afdb57440fcdb5993ebf8..bbc9d8d15a1aedda1e9ffe6d5d1dcb8ec90b6a86 100644
--- a/src/endWeek/economics/reputation.js
+++ b/src/endWeek/economics/reputation.js
@@ -638,7 +638,7 @@ App.EndWeek.reputation = function() {
 		if (V.slaves.length > 20 && V.cash > 50000) {
 			r.push(`Society <span class="green">strongly approves</span> of your great wealth and prosperity, as is only fitting for an`);
 			if (V.PC.customTitle) {
-				r.push(`${V.PC.customTitle}`);
+				r.push(`${V.PC.customTitle}.`);
 			} else if (V.PC.title === 1) {
 				r.push(`proper Imperial noble.`);
 			} else {
diff --git a/src/endWeek/reports/spaReport.js b/src/endWeek/reports/spaReport.js
index d0d4f0770c1b3f351f57f31453f46ce16c9829fb..d127e367b02fe02e9085e35fdfaa42c301f1e3cc 100644
--- a/src/endWeek/reports/spaReport.js
+++ b/src/endWeek/reports/spaReport.js
@@ -121,7 +121,7 @@ App.EndWeek.spaReport = function() {
 						slave.intelligence = gp.intelligence - 30;
 					}
 					if (V.arcologies[0].FSPaternalist !== "unset" && V.arcologies[0].FSPaternalist > 0) {
-						curedArray.push(`Society <span class="green">strongly approves</span> of${slave.slaveName} being restored to sanity, which advances ideals about enlightened slaveownership.`);
+						curedArray.push(`Society <span class="green">strongly approves</span> of ${slave.slaveName} being restored to sanity, which advances ideals about enlightened slaveownership.`);
 						V.arcologies[0].FSPaternalist += 0.01 * V.FSSingleSlaveRep;
 						repX(2 * V.FSSingleSlaveRep * (V.arcologies[0].FSPaternalist / V.FSLockinLevel), "spa", slave);
 					}
diff --git a/src/endWeek/saClothes.js b/src/endWeek/saClothes.js
index 30075c19d6384c3c14d08d3fd865829da542269d..3a967c423c10129982072b43fcc85f44079d59ee 100644
--- a/src/endWeek/saClothes.js
+++ b/src/endWeek/saClothes.js
@@ -71,7 +71,7 @@ App.SlaveAssignment.clothes = (function() {
 			slave.vaginalAccessory = "none";
 			slave.vaginalAttachment = "none";
 		} else {
-			if (["none", "bullet vibrator", "smart bullet vibrator"].includes(slave.vaginalAccessory)) {
+			if (dildoWidth(slave) === 0) {
 				slave.vaginalAttachment = "none";
 			}
 		}
@@ -241,7 +241,7 @@ App.SlaveAssignment.clothes = (function() {
 							r.push(`The outfit ${he}'s wearing constantly give ${him} little twinges of pain, <span class="hotpink">titillating ${him}.</span>`);
 							slave.devotion += 2;
 						} else if (slave.devotion <= 20 && slave.trust >= -50) {
-							r.push(`The outfit ${he}'s wearing keep ${him} <span class="hotpink">servile</span> and <span class="gold">afraid.</span>`);
+							r.push(`The outfit ${he}'s wearing keeps ${him} <span class="hotpink">servile</span> and <span class="gold">afraid.</span>`);
 							slave.devotion += 1;
 							slave.trust -= 1;
 							if (slave.fetish === "masochist" && slave.fetishKnown === 0) {
@@ -920,9 +920,10 @@ App.SlaveAssignment.clothes = (function() {
 	 *
 	 */
 	function vaginaAccessories(slave) {
+		const dildo = App.Data.vaginalAccessories.get(slave.vaginalAccessory) || V.customItem.dildos.get(slave.vaginalAccessory);
 		if (slave.vaginalAccessory !== "none") {
-			if (slave.vaginalAccessory === "bullet vibrator" || slave.vaginalAccessory === "smart bullet vibrator") {
-				r.push(`Constantly wearing a bullet vibrator`);
+			if (dildo.width === 0) {
+				r.push(`Constantly wearing a ${slave.vaginalAccessory}`);
 				if (slave.devotion < 20) {
 					r.push(`habituates ${him} to sexual slavery and <span class="hotpink">increases ${his} submissiveness.</span>`);
 					slave.devotion += 2;
@@ -930,7 +931,7 @@ App.SlaveAssignment.clothes = (function() {
 					r.push(`reminds ${him} of ${his} place and <span class="hotpink">increases ${his} devotion to you.</span>`);
 					slave.devotion++;
 				}
-			} else if (slave.vaginalAccessory === "dildo") {
+			} else if (dildo.width === 1) {
 				if (slave.vagina < 1 && jsRandom(1, 100) > 50) {
 					r.push(`Constantly wearing a dildo in ${his} virgin pussy <span class="lime">gets it used to penetration.</span>`);
 					slave.vagina += 1;
@@ -943,29 +944,16 @@ App.SlaveAssignment.clothes = (function() {
 						slave.sexualFlaw = "none";
 					}
 				}
-			} else if (slave.vaginalAccessory === "long dildo") {
-				if (slave.vagina < 1 && jsRandom(1, 100) > 50) {
-					r.push(`Constantly wearing a dildo in ${his} virgin pussy <span class="lime">gets it used to penetration.</span>`);
-					slave.vagina += 1;
-				} else {
-					r.push(`${His} pussy easily accommodates the dildo ${he}'s required to wear.`);
-				}
-				if (slave.fuckdoll === 0) {
-					if (slave.fetish !== "mindbroken") {
-						if (slave.sexualFlaw === "hates penetration" && jsRandom(1, 100) > 50) {
-							r.push(`The habit <span class="green">reduces ${his} dislike of having ${his} pussy filled.</span>`);
-							slave.sexualFlaw = "none";
-						}
-						if (slave.sexualQuirk === "size queen") {
-							r.push(`Being able to hold such a long dildo is a <span class="hotpink">point of pride</span> for the ostentatious size queen.`);
-							slave.devotion += 2;
-						} else {
-							r.push(`It penetrates ${his} cervix causing ${him} tremendous discomfort, making ${him} a little <span class="gold">less trusting</span> of you.`);
-							slave.trust -= 1;
-						}
+				if (dildo.length > 1) {
+					if (slave.sexualQuirk === "size queen") {
+						r.push(`Being able to hold such a long dildo is a <span class="hotpink">point of pride</span> for the ostentatious size queen.`);
+						slave.devotion += 2;
+					} else {
+						r.push(`It penetrates ${his} cervix causing ${him} tremendous discomfort, making ${him} a little <span class="gold">less trusting</span> of you.`);
+						slave.trust -= 1;
 					}
 				}
-			} else if (slave.vaginalAccessory === "large dildo") {
+			} else if (dildo.width === 2) {
 				if (slave.vagina < 3) {
 					if (jsRandom(1, 4) === 1) {
 						r.push(`Constantly wearing a large dildo in ${his} pussy <span class="lime">stretches it out.</span>`);
@@ -979,105 +967,93 @@ App.SlaveAssignment.clothes = (function() {
 				if (slave.fuckdoll === 0) {
 					if (slave.fetish !== "mindbroken") {
 						if (slave.vagina < 2) {
-							r.push(`The big dildo in ${his} tight cunt`);
-							if (slave.sexualQuirk === "size queen") {
-								r.push(`is a <span class="hotpink">point of pride</span> for the ostentatious size queen.`);
-								slave.devotion += 2;
-							} else {
-								r.push(`<span class="hotpink">breaks ${him} to sexual slavery</span> slightly.`);
-								slave.devotion += 1;
-							}
-							if (slave.vagina === 1) {
-								r.push(`It stretches ${his} tight cunt to soreness by the end of every day, so it also makes ${him} a little <span class="gold">less trusting</span> of you.`);
-								slave.trust -= 1;
-							}
-						}
-					}
-				}
-			} else if (slave.vaginalAccessory === "long, large dildo") {
-				if (slave.vagina < 3) {
-					if (jsRandom(1, 4) === 1) {
-						r.push(`Constantly wearing a large dildo in ${his} pussy <span class="lime">stretches it out.</span>`);
-						slave.vagina += 1;
-					} else {
-						r.push(`The large dildo ${he}'s required to wear is a stretch for ${his} cunt, but pussies are resilient and ${he}rs isn't seriously affected.`);
-					}
-				} else {
-					r.push(`${His} pussy accommodates the large dildo ${he}'s required to wear.`);
-				}
-				if (slave.vagina < 2) {
-					if (slave.fuckdoll === 0) {
-						if (slave.fetish !== "mindbroken") {
-							r.push(`The big, long dildo in ${his} tight cunt`);
-							if (slave.sexualQuirk === "size queen") {
-								r.push(`is a <span class="hotpink">point of pride</span> for the ostentatious size queen.`);
-								slave.devotion += 2;
+							if (dildo.length === 1) {
+								r.push(`The big dildo in ${his} tight cunt`);
+								if (slave.sexualQuirk === "size queen") {
+									r.push(`is a <span class="hotpink">point of pride</span> for the ostentatious size queen.`);
+									slave.devotion += 2;
+								} else {
+									r.push(`<span class="hotpink">breaks ${him} to sexual slavery</span> slightly.`);
+									slave.devotion += 1;
+								}
+								if (slave.vagina === 1) {
+									r.push(`It stretches ${his} tight cunt to soreness by the end of every day, so it also makes ${him} a little <span class="gold">less trusting</span> of you.`);
+									slave.trust -= 1;
+								}
 							} else {
-								r.push(`<span class="hotpink">breaks ${him} to sexual slavery</span> slightly. It also penetrates ${his} cervix, causing ${him} tremendous discomfort, and making ${him} a little <span class="gold">less trusting</span> of you.`);
-								slave.devotion += 1;
-								slave.trust -= 1;
-							}
-							if (slave.vagina === 1) {
-								r.push(`It stretches ${his} tight cunt to soreness by the end of every day, so it also makes ${him} a little <span class="gold">less trusting</span> of you.`);
-								slave.trust -= 1;
+								r.push(`The big, long dildo in ${his} tight cunt`);
+								if (slave.sexualQuirk === "size queen") {
+									r.push(`is a <span class="hotpink">point of pride</span> for the ostentatious size queen.`);
+									slave.devotion += 2;
+								} else {
+									r.push(`<span class="hotpink">breaks ${him} to sexual slavery</span> slightly. It also penetrates ${his} cervix, causing ${him} tremendous discomfort, and making ${him} a little <span class="gold">less trusting</span> of you.`);
+									slave.devotion += 1;
+									slave.trust -= 1;
+								}
+								if (slave.vagina === 1) {
+									r.push(`It stretches ${his} tight cunt to soreness by the end of every day, so it also makes ${him} a little <span class="gold">less trusting</span> of you.`);
+									slave.trust -= 1;
+								}
 							}
 						}
 					}
 				}
-			} else if (slave.vaginalAccessory === "huge dildo") {
-				if (slave.vagina < 4) {
-					if (slave.fuckdoll === 0) {
-						if (slave.fetish !== "mindbroken") {
-							if (slave.sexualQuirk === "size queen") {
-								r.push(`${He} thinks of the massive dildo stretching out ${his} womanhood as <span class="lime">preparation for the biggest cocks,</span> and <span class="hotpink">looks forward</span> to take anything — dicks, hands, truly anything — inside ${his} newly capacious cunt.`);
-								slave.devotion += 4;
-							} else if (slave.fetish === "masochist" && slave.fetishKnown === 1 && slave.fetishStrength > 60) {
-								r.push(`${He} gets off on the agony of having ${his} cunt <span class="lime">permanently stretched</span> by a huge dildo. The terrible combination of pain and pleasure <span class="hotpink">breaks ${his} will</span> but fills ${him} with <span class="gold">fear.</span>`);
-								slave.devotion += 5;
-								slave.trust -= 5;
-							} else if (slave.fetish === "submissive" && slave.fetishKnown === 1 && slave.fetishStrength > 60) {
-								r.push(`${He} submits to the agony of having ${his} cunt <span class="lime">permanently stretched</span> by a huge dildo. Having ${his} hole ruined at your whim <span class="hotpink">breaks ${his} will</span> but fills ${him} with <span class="gold">fear.</span>`);
-								slave.devotion += 5;
-								slave.trust -= 5;
-							} else {
-								r.push(`The agony of having ${his} cunt <span class="lime">permanently stretched</span> by a huge dildo fills ${him} with <span class="mediumorchid">resentment</span> and <span class="gold">fear.</span>`);
-								slave.devotion -= 5;
-								slave.trust -= 5;
+			} else if (dildo.width === 3) {
+				if (dildo.length === 1) {
+					if (slave.vagina < 4) {
+						if (slave.fuckdoll === 0) {
+							if (slave.fetish !== "mindbroken") {
+								if (slave.sexualQuirk === "size queen") {
+									r.push(`${He} thinks of the massive dildo stretching out ${his} womanhood as <span class="lime">preparation for the biggest cocks,</span> and <span class="hotpink">looks forward</span> to take anything — dicks, hands, truly anything — inside ${his} newly capacious cunt.`);
+									slave.devotion += 4;
+								} else if (slave.fetish === "masochist" && slave.fetishKnown === 1 && slave.fetishStrength > 60) {
+									r.push(`${He} gets off on the agony of having ${his} cunt <span class="lime">permanently stretched</span> by a huge dildo. The terrible combination of pain and pleasure <span class="hotpink">breaks ${his} will</span> but fills ${him} with <span class="gold">fear.</span>`);
+									slave.devotion += 5;
+									slave.trust -= 5;
+								} else if (slave.fetish === "submissive" && slave.fetishKnown === 1 && slave.fetishStrength > 60) {
+									r.push(`${He} submits to the agony of having ${his} cunt <span class="lime">permanently stretched</span> by a huge dildo. Having ${his} hole ruined at your whim <span class="hotpink">breaks ${his} will</span> but fills ${him} with <span class="gold">fear.</span>`);
+									slave.devotion += 5;
+									slave.trust -= 5;
+								} else {
+									r.push(`The agony of having ${his} cunt <span class="lime">permanently stretched</span> by a huge dildo fills ${him} with <span class="mediumorchid">resentment</span> and <span class="gold">fear.</span>`);
+									slave.devotion -= 5;
+									slave.trust -= 5;
+								}
 							}
 						}
+						slave.vagina += 1;
+					} else {
+						r.push(`${His} cavernous pussy accommodates the huge dildo ${he}'s required to wear.`);
 					}
-					slave.vagina += 1;
-				} else {
-					r.push(`${His} cavernous pussy accommodates the huge dildo ${he}'s required to wear.`);
-				}
-			} else if (slave.vaginalAccessory === "long, huge dildo") {
-				if (slave.vagina < 4) {
-					if (slave.fuckdoll === 0) {
-						if (slave.fetish !== "mindbroken") {
-							if (slave.sexualQuirk === "size queen") {
-								r.push(`${He} thinks of the massive dildo stretching out ${his} womanhood and stomach as <span class="lime">preparation for the biggest cocks,</span> and <span class="hotpink">looks forward</span> to take anything — dicks, hands, arms, truly anything — inside ${his} newly capacious cunt.`);
-								slave.devotion += 4;
-							} else if (slave.fetish === "masochist" && slave.fetishKnown === 1 && slave.fetishStrength > 60) {
-								r.push(`${He} gets off on the agony of having ${his} cunt <span class="lime">permanently stretched</span> and ${his} cervix penetrated by a huge dildo. The terrible combination of pain and pleasure <span class="hotpink">breaks ${his} will</span> but fills ${him} with <span class="gold">fear.</span>`);
-								slave.devotion += 5;
-								slave.trust -= 5;
-							} else if (slave.fetish === "submissive" && slave.fetishKnown === 1 && slave.fetishStrength > 60) {
-								r.push(`${He} submits to the agony of having ${his} cunt <span class="lime">permanently stretched</span> and ${his} cervix penetrated by a huge dildo. Having ${his} hole and cervix ruined at your whim <span class="hotpink">breaks ${his} will</span> but fills ${him} with <span class="gold">fear.</span>`);
-								slave.devotion += 5;
-								slave.trust -= 5;
-							} else {
-								r.push(`The agony of having ${his} cunt <span class="lime">permanently stretched</span> and ${his} cervix penetrated by a huge dildo fills ${him} with <span class="mediumorchid">resentment</span> and <span class="gold">fear.</span>`);
-								slave.devotion -= 5;
-								slave.trust -= 5;
+				} else  {
+					if (slave.vagina < 4) {
+						if (slave.fuckdoll === 0) {
+							if (slave.fetish !== "mindbroken") {
+								if (slave.sexualQuirk === "size queen") {
+									r.push(`${He} thinks of the massive dildo stretching out ${his} womanhood and stomach as <span class="lime">preparation for the biggest cocks,</span> and <span class="hotpink">looks forward</span> to take anything — dicks, hands, arms, truly anything — inside ${his} newly capacious cunt.`);
+									slave.devotion += 4;
+								} else if (slave.fetish === "masochist" && slave.fetishKnown === 1 && slave.fetishStrength > 60) {
+									r.push(`${He} gets off on the agony of having ${his} cunt <span class="lime">permanently stretched</span> and ${his} cervix penetrated by a huge dildo. The terrible combination of pain and pleasure <span class="hotpink">breaks ${his} will</span> but fills ${him} with <span class="gold">fear.</span>`);
+									slave.devotion += 5;
+									slave.trust -= 5;
+								} else if (slave.fetish === "submissive" && slave.fetishKnown === 1 && slave.fetishStrength > 60) {
+									r.push(`${He} submits to the agony of having ${his} cunt <span class="lime">permanently stretched</span> and ${his} cervix penetrated by a huge dildo. Having ${his} hole and cervix ruined at your whim <span class="hotpink">breaks ${his} will</span> but fills ${him} with <span class="gold">fear.</span>`);
+									slave.devotion += 5;
+									slave.trust -= 5;
+								} else {
+									r.push(`The agony of having ${his} cunt <span class="lime">permanently stretched</span> and ${his} cervix penetrated by a huge dildo fills ${him} with <span class="mediumorchid">resentment</span> and <span class="gold">fear.</span>`);
+									slave.devotion -= 5;
+									slave.trust -= 5;
+								}
 							}
 						}
+						slave.vagina += 1;
+					} else {
+						r.push(`${His} cavernous pussy accommodates the huge dildo ${he}'s required to wear.`);
 					}
-					slave.vagina += 1;
-				} else {
-					r.push(`${His} cavernous pussy accommodates the huge dildo ${he}'s required to wear.`);
 				}
 			}
-			if (slave.vaginalAccessory === "long, huge dildo" || slave.vaginalAccessory === "long, large dildo" || slave.vaginalAccessory === "long dildo") {
+			if (dildo.length > 1) {
 				if ((slave.preg > slave.pregData.normalBirth / 10) && slave.pregKnown === 1) {
 					if (jsRandom(1, 100) > 50) {
 						r.push(`The dildo penetrating ${his} womb <span class="orange">caused ${him} to miscarry,</span> which <span class="health dec">damages ${his} health.</span>`);
diff --git a/src/endWeek/saLongTermPhysicalEffects.js b/src/endWeek/saLongTermPhysicalEffects.js
index b900d14cad38a796c175906622d970b80024d41e..c5238e801b77a78108b47354d897f669db6b1a41 100644
--- a/src/endWeek/saLongTermPhysicalEffects.js
+++ b/src/endWeek/saLongTermPhysicalEffects.js
@@ -233,7 +233,7 @@ App.SlaveAssignment.longTermPhysicalEffects = (function() {
 			if (slave.assignment !== "serve in the master suite" || V.masterSuiteUpgradeLuxury < 2) {
 				if (slave.assignment !== "work in the dairy" || V.dairyStimulatorsSetting === 0) {
 					if (slave.geneMods.rapidCellGrowth !== 1) {
-						if (slave.vagina >= 3 && !["huge dildo", "large dildo", "long, huge dildo", "long, large dildo"].includes(slave.vaginalAccessory)) {
+						if (slave.vagina >= 3 && dildoWidth(slave) < 2) {
 							r.push(`With a rest from strenuous use, <span class="improvement">${his} loose vagina recovers a little.</span>`);
 							slave.vagina -= 1;
 						} else if (slave.anus >= 3 && plugWidth(slave) < 2) {
diff --git a/src/endWeek/saSmartPiercingEffects.js b/src/endWeek/saSmartPiercingEffects.js
index 7b13bbba49b4293714d45b25fa80c3eee48c523c..56bdc815258f98808601d286cc9bf1c209807011 100644
--- a/src/endWeek/saSmartPiercingEffects.js
+++ b/src/endWeek/saSmartPiercingEffects.js
@@ -409,7 +409,7 @@ App.SlaveAssignment.SmartPiercing.sadist = class extends App.SlaveAssignment.Sma
 App.SlaveAssignment.saSmartPiercingEffects = function(slave) {
 	const {he, his, His, him} = getPronouns(slave);
 	const hasBV = slave.vaginalAccessory === "bullet vibrator" || slave.dickAccessory === "bullet vibrator";
-	const hasSmartBV = slave.vaginalAccessory === "smart bullet vibrator" || slave.dickAccessory === "smart bullet vibrator";
+	const hasSmartBV = dildoVibeLevel(slave) > 1 || slave.dickAccessory === "smart bullet vibrator";
 	const hasDildoVibe = slave.vaginalAttachment === "vibrator";
 	const hasSmartDildoVibe = slave.vaginalAttachment === "smart vibrator";
 	const hasSP = slave.clitPiercing === 3;
diff --git a/src/facilities/bodyModification/bodyModification.js b/src/facilities/bodyModification/bodyModification.js
index 93e3be757f1c1fa864bbd37018aa0e28c5c1aa97..83bc6d6ba04e82f98d82fa0e8377ae41017f7c98 100644
--- a/src/facilities/bodyModification/bodyModification.js
+++ b/src/facilities/bodyModification/bodyModification.js
@@ -362,11 +362,11 @@ App.UI.bodyModification = function(slave, cheat = false) {
 		// DESCRIPTIONS
 		App.UI.DOM.appendNewElement("h2", el, "Tattoos");
 
-		for (const name of tattooLocations.keys()) {
-			if (name === "leg") {
-				r.push(App.UI.DOM.makeElement("div", App.Desc.tattoo(slave, "thigh")));
-			} else {
-				r.push(App.UI.DOM.makeElement("div", App.Desc.tattoo(slave, name)));
+		for (let name of tattooLocations.keys()) {
+			name = (name === "leg") ? "thigh" : name; // Leg/thigh is a weird naming exception for now.
+			const desc = App.Desc.tattoo(slave, name);
+			if (desc) {
+				r.push(App.UI.DOM.makeElement("div", desc));
 			}
 		}
 		if (r.length === 0) {
diff --git a/src/facilities/farmyard/farmyard.js b/src/facilities/farmyard/farmyard.js
index 0c51e6a6676479a35766a14cca9694772af441b2..fcbb9365ac2a8d298cf19e81c7b6ba2542515dcf 100644
--- a/src/facilities/farmyard/farmyard.js
+++ b/src/facilities/farmyard/farmyard.js
@@ -13,7 +13,14 @@ App.Facilities.Farmyard.farmyard = function() {
 	V.returnTo = "Farmyard";
 	V.encyclopedia = "Farmyard";
 
-	frag.append(intro(), expand(), menials());
+	frag.append(
+		intro(),
+		expand(),
+		menials(),
+		rules(),
+		upgrades(),
+		animals()
+	);
 
 	App.UI.DOM.appendNewElement("div", frag, App.UI.SlaveList.stdFacilityPage(App.Entity.facilities.farmyard), "farmyard-slaves");
 
diff --git a/src/facilities/salon/salonPassage.js b/src/facilities/salon/salonPassage.js
index f2e6f5189f9286600a5fc64a0837c81f514619dd..31ba8037f5b6ca460feb03dd4b0b9c18216860c0 100644
--- a/src/facilities/salon/salonPassage.js
+++ b/src/facilities/salon/salonPassage.js
@@ -128,6 +128,7 @@ App.UI.salon = function(slave, cheat = false) {
 		const options = new App.UI.OptionsGroup();
 
 		options.addOption(App.Desc.makeup(slave), "makeup", slave)
+			.addValue("Makeup free", 0)
 			.addValue("Nice", 1, billMod)
 			.addValue("Gorgeous", 2, billMod)
 			.addValue("Slutty", 4, billMod)
@@ -159,11 +160,11 @@ App.UI.salon = function(slave, cheat = false) {
 			.addValue("Very long and garish", 4, billMod)
 			.addValue("Color-coordinate with hair", 2, billMod);
 
-		options.addOption("", "makeup", slave)
+		options.addOption("", "nails", slave)
 			.addValue("Neon", 6, billMod)
 			.addValue("Neon, color-coordinate with hair", 7, billMod);
 
-		options.addOption("", "makeup", slave)
+		options.addOption("", "nails", slave)
 			.addValue("Metallic", 8, billMod)
 			.addValue("Metallic, color-coordinate with hair", 9, billMod);
 
diff --git a/src/facilities/statistics.js b/src/facilities/statistics.js
index 380e5499cf6ce95d5624ade61565755554b1ed56..4d0af165db08327df3725360cc19bccfede5d8cd 100644
--- a/src/facilities/statistics.js
+++ b/src/facilities/statistics.js
@@ -6,7 +6,7 @@ App.Facilities.StatsHelper = class {
 	makeStatsTable(columns) {
 		const table = document.createElement("table");
 		table.border = "1";
-		table.className = "stats";
+		table.className = "facility-stats";
 		const header = App.UI.DOM.appendNewElement("tr", table, "", "header");
 		App.UI.DOM.appendNewElement("th", header, "Items"); // first column, flexible width
 		App.UI.DOM.appendNewElement("th", header, columns[0], "wide"); // "revenue" column, wider
@@ -155,7 +155,7 @@ App.Facilities.StatsHelper = class {
 		row.appendChild(bigCell);
 
 		const table = document.createElement("table");
-		table.className = "stats-slave";
+		table.className = "facility-stats-slave";
 		const header = App.UI.DOM.appendNewElement("tr", table, "", "header");
 		App.UI.DOM.appendNewElement("th", header, columns[0]); // first column, flexible width
 		App.UI.DOM.appendNewElement("th", header, columns[1], "narrow"); // facility-specific output details
diff --git a/src/facilities/toyShop/toyShop.js b/src/facilities/toyShop/toyShop.js
new file mode 100644
index 0000000000000000000000000000000000000000..84ac5b700889cf72295d9af2100f280f12df2f16
--- /dev/null
+++ b/src/facilities/toyShop/toyShop.js
@@ -0,0 +1,241 @@
+/**
+ * UI for the Body Modification system/studio.  Refreshes without refreshing the passage.
+ */
+App.UI.toyShop = function() {
+	const container = document.createElement("span");
+	let buttPlugName;
+	let buttPlugData;
+	let selectedPlug;
+	init();
+
+	container.append(createPage());
+	return container;
+
+	function createPage() {
+		const el = new DocumentFragment();
+		el.append(intro());
+		el.append(buttPlugs());
+		return el;
+	}
+
+	function init() {
+		buttPlugName = "";
+		buttPlugData = {
+			name: "",
+			width: 1,
+			length: 1
+		};
+	}
+
+	function intro() {
+		const el = new DocumentFragment();
+		App.UI.DOM.appendNewElement("h1", el, "Toy Shop");
+		App.UI.DOM.appendNewElement("div", el, `The room is filled with the smell of rubber, latex, and various synthetic materials and solvents.  A series of screens allows you to design toys of various shapes and sizes, and then produce them at scale.  A bin of defects sits in the corner, glistening a bit under a layer of lubrication.`, "scene-intro");
+		return el;
+	}
+
+
+	function buttPlugs() {
+		const el = new DocumentFragment();
+		let linkArray;
+		App.UI.DOM.appendNewElement("h2", el, "Buttplugs");
+		const select = App.UI.DOM.appendNewElement("div", el, App.UI.DOM.link("Start a new design", () => {
+			init();
+			refresh();
+		}));
+		if (V.customItem.buttPlugs.size > 0) {
+			select.append(selectDesign());
+		}
+		el.append(create());
+		return el;
+
+		function create() {
+			const el = new DocumentFragment();
+			const existingDesign = V.customItem.buttPlugs.get(buttPlugName);
+			if (existingDesign) {
+				el.append(descLocked());
+			} else {
+				el.append(desc());
+			}
+			if (buttPlugData.name) {
+				el.append(title());
+			}
+			el.append(
+				width(),
+				length(),
+			);
+
+			if (existingDesign) {
+				const build = App.UI.DOM.appendNewElement("div", el, `Send updated design to production and make sure all appropriate slaves are updated `);
+				const linkArray = [];
+				linkArray.push(
+					App.UI.DOM.link(
+						"Update the mold",
+						() => { buildPlug(); }
+					)
+				);
+
+				linkArray.push(
+					App.UI.DOM.link(
+						`Recall "${buttPlugName}"`,
+						() => { deletePlug(); }
+					)
+				);
+				build.append(App.UI.DOM.generateLinksStrip(linkArray));
+			} else if (buttPlugName && buttPlugData.name){
+				el.append(apply());
+			}
+
+			return el;
+
+			function descLocked() {
+				return App.UI.DOM.makeElement("div", `Description has already been selected for this model: "${buttPlugName}"`);
+			}
+		}
+		function selectDesign() {
+			const el = new DocumentFragment();
+			const choice = App.UI.DOM.appendNewElement("span", el, ` or choose an existing design to edit `);
+			const select = App.UI.DOM.appendNewElement("select", choice);
+			let matchFound = false;
+			for (const [key, values] of V.customItem.buttPlugs) {
+				const option = App.UI.DOM.appendNewElement("option", select, values.name);
+				option.value = key;
+				if (option.value === buttPlugName) {
+					option.selected = true;
+					matchFound = true;
+				}
+			}
+			if (!matchFound) {
+				select.selectedIndex = -1;
+			}
+			select.onchange = () => {
+				const O = select.options[select.selectedIndex];
+				selectedPlug = O.value;
+				buttPlugName = selectedPlug;
+				buttPlugData = V.customItem.buttPlugs.get(selectedPlug);
+				refresh();
+			};
+			return el;
+		}
+
+		function desc() {
+			const value = App.UI.DOM.makeElement("div", `Enter shape here as it will appear in descriptions `);
+			value.append(App.UI.DOM.makeTextBox(
+				buttPlugName,
+				v => {
+					buttPlugName = v;
+					buttPlugData.name = capFirstChar(v);
+					refresh();
+				}
+			));
+			App.UI.DOM.appendNewElement("span", value, ` Your slave has a standard ${buttPlugName ? buttPlugName : `spade-shaped plug`} wedged firmly in their asshole.`, "note");
+			return value;
+		}
+
+		function title() {
+			const title = App.UI.DOM.makeElement("div", `Enter title as it will appear in lists of choices `);
+			title.append(App.UI.DOM.makeTextBox(
+				buttPlugData.name,
+				v => {
+					buttPlugData.name = capFirstChar(v);
+					refresh();
+				}
+			));
+			return title;
+		}
+
+		function width() {
+			const widthOptions = new Map([
+				["standard", 1],
+				["large", 2],
+				["huge", 3],
+			]);
+			const width = App.UI.DOM.makeElement("div", `Select width `);
+			linkArray = [];
+			for (const [key, value] of widthOptions) {
+				if (buttPlugData.width === value) {
+					linkArray.push(
+						App.UI.DOM.disabledLink(
+							key,
+							["Currently selected"]
+						)
+					);
+				} else {
+					linkArray.push(
+						App.UI.DOM.link(
+							key,
+							() => {
+								buttPlugData.width = value;
+								refresh();
+							}
+						)
+					);
+				}
+			}
+			width.append(App.UI.DOM.generateLinksStrip(linkArray));
+			return width;
+		}
+
+		function length() {
+			const lengthOptions = new Map([
+				["standard", 1],
+				["long", 2],
+			]);
+			const length = App.UI.DOM.makeElement("div", `Select length `);
+			linkArray = [];
+			for (const [key, value] of lengthOptions) {
+				if (buttPlugData.length === value) {
+					linkArray.push(
+						App.UI.DOM.disabledLink(
+							key,
+							["Currently selected"]
+						)
+					);
+				} else {
+					linkArray.push(
+						App.UI.DOM.link(
+							key,
+							() => {
+								buttPlugData.length = value;
+								refresh();
+							}
+						)
+					);
+				}
+			}
+			length.append(App.UI.DOM.generateLinksStrip(linkArray));
+			return length;
+		}
+
+		function buildPlug() {
+			V.customItem.buttPlugs.set(buttPlugName, buttPlugData);
+			init();
+			refresh();
+		}
+
+		function apply() {
+			const build = App.UI.DOM.appendNewElement("div", el, `Send design to production and make available for all slaves `);
+			build.append(
+				App.UI.DOM.link(
+					"Start the mold",
+					() => { buildPlug(); }
+				)
+			);
+			return build;
+		}
+
+		function deletePlug() {
+			V.customItem.buttPlugs.delete(buttPlugName);
+			for (const slave of V.slaves) {
+				if (slave.buttplug === buttPlugName) {
+					slave.buttplug = "none";
+				}
+			}
+			refresh();
+		}
+	}
+
+	function refresh() {
+		jQuery(container).empty().append(createPage());
+	}
+};
diff --git a/src/gui/css/mainStyleSheet.css b/src/gui/css/mainStyleSheet.css
deleted file mode 100644
index 7c5b01938e6b32475f8084c2c965795994bbe61f..0000000000000000000000000000000000000000
--- a/src/gui/css/mainStyleSheet.css
+++ /dev/null
@@ -1,419 +0,0 @@
-body {
-	overflow-x: hidden;
-}
-
-/* makes HR colorflip compatible */
-hr {
-	background:#ccc;
-	border:0;
-}
-
-/* clears SugarCube's default transition */
-.passage {
-	transition: none;
-	-webkit-transition: none;
-}
-
-.passage-in {
-	opacity: 1 !important;
-}
-
-/* default is 54em */
-#passages {
-	max-width: 100%;
-}
-
-/* small trick to hide broken images */
-img {
-	text-indent: -10000px;
-}
-
-.imageColumn { /* TODO: this is mostly a copy of imageRef to get its flex features working properly. They can probably be removed from imageRef at some point */
-	display: flex;
-	flex-direction: column;
-	flex-wrap: wrap;
-	align-items: flex-start;
-	position: relative;
-	float: right;
-}
-
-.imageRef {
-	display: flex;
-	flex-direction: column;
-	flex-wrap: wrap;
-	align-items: flex-start;
-	position: relative;
-	background-color: rgba(80, 80, 80, 0.5);
-	margin: 2px;
-}
-
-.tinyImg {
-	height: 120px;
-	width: 120px;
-	float: left;
-}
-
-.smlImg {
-	height: 150px;
-	width: 150px;
-	float: left;
-}
-
-.smlImg > img, .smlImg > video {
-	height: auto;
-}
-
-.medImg {
-	height: 300px;
-	width: 300px;
-	float: right;
-}
-
-.medImg > img, .medImg > video {
-	height: auto;
-}
-
-.lrgRender {
-	height: 531px;
-	width: 531px;
-	margin-right: -50px;
-	margin-left: -50px;
-	float: right;
-	z-index: -1;
-}
-
-.lrgVector {
-	height: 600px;
-	width: 600px;
-	margin-right: -125px;
-	margin-left: -125px;
-	float: right;
-	z-index: -1;
-}
-
-.lrgRender > div.mask {
-	width: 150px;
-	height: 100%;
-	background: linear-gradient(90deg, rgba(17,17,17,1), rgba(17,17,17,0.8) 60%, rgba(17,17,17,0));
-	z-index: 1;
-	/*position: absolute;*/
-}
-
-.lrgRender > img, .lrgRender > video {
-	margin-left: -150px;
-	height: 531px;
-	width: auto;
-}
-
-.lrgVector > div.mask {
-	width: 150px;
-	height: 100%;
-	background: linear-gradient(90deg, rgba(17,17,17,1), rgba(17,17,17,0.8) 60%, rgba(17,17,17,0));
-	z-index: 1;
-}
-
-.lrgVector > img, .lrgVector > video {
-	margin-left: -150px;
-	height: 600px;
-	width: auto;
-}
-
-.lrgVector svg {
-	width: 336px;
-}
-
-object {
-	object-fit: scale-down;
-	position: absolute;
-	top: 0;
-	left: 0;
-}
-
-img.paperdoll {
-	position: absolute;
-	top: 0;
-	left: 0;
-	margin-left: 0;
-}
-
-/* Colors are made as css classes, to allow them to be changed for a light color scheme (for example). */
-/* a version is for this case: <span class="-.."><a>text</a></span> */
-.link, .link a { color: var(--link-color) } /* link color */
-.aquamarine, .aquamarine a, .skill, .skill a { color: aquamarine }
-.coral, .coral a, .fetish.loss, .fetish.loss a { color: coral }
-.cyan, .cyan a, .hotkey { color: cyan } /* used for aphrodisiac & neighbor arcs */
-.darkgoldenrod, .darkgoldenrod a, .trust.extremely-terrified, .trust.extremely-terrified a { color: darkgoldenrod }
-.darkred, .darkred a, .defiant.full, .defiant.full a { color: darkred }
-.darkviolet, .darkviolet a, .devotion.hateful, .devotion.hateful a { color: darkviolet }
-.deeppink, .deeppink a, .devotion.devoted, .devotion.devoted a { color: deeppink } /* used for devotion once & agent */
-.steelblue, .steelblue a { color: steelblue }
-.deepskyblue, .deepskyblue a, .intelligent, .intelligent a { color: deepskyblue }
-.dodgerblue, .dodgerblue a { color: dodgerblue }
-.blue, .blue a { color: blue }
-.gold, .gold a, .trust.dec, .trust.dec a, .trust.frightened, .trust.frightened a { color: gold }
-.goldenrod, .goldenrod a, .trust.terrified, .trust.terrified a { color: goldenrod }
-.gray, .gray a { color: gray }
-.green, .green a, .reputation.inc, .reputation.inc a, .improvement, .improvement a, .flaw.break, .flaw.break a, .skill.inc, .skill.inc a, .fuckdoll, .fuckdoll a, .positive, .positive a, .health.inc, .health.inc a { color: green }
-.hotpink, .hotpink a, .devotion.inc, .devotion.inc a, .devotion.accept, .devotion.accept a { color: hotpink }
-.lawngreen, .lawngreen a { color: lawngreen }
-.lightblue, .lightblue a { color: lightblue }
-.lightcoral, .lightcoral a, .fetish.gain, .fetish.gain a { color: lightcoral } /* compare pink for fetish */
-.lightgreen, .lightgreen a, .relationship, .relationship a, .rivalry.dec, .rivalry.dec a  { color: lightgreen }
-.lightpink, .lightpink a { color: lightpink }
-.lightsalmon, .lightsalmon a, .fetish.inc, .fetish.inc a, .rivalry.inc, .rivalry.inc a, .relationship.dec, .relationship.dec a { color: lightsalmon }
-.lime, .lime a, .change.positive, .change.positive a, .virginity.loss, .virginity.loss a, .puberty, .puberty a, .pregnant, .pregnant a { color: lime } /* tight orifices, breast changes, take virginity, not sure on good aliases */
-.limegreen, .limegreen a { color: limegreen } /* multiple questionable uses */
-.magenta, .magenta a, .devotion.worship, .devotion.worship a { color: magenta }
-.mediumaquamarine, .mediumaquamarine a, .trust.inc, .trust.inc a, .trust.careful, .trust.careful a { color: mediumaquamarine }
-.mediumorchid, .mediumorchid a, .devotion.dec, .devotion.dec a, .devotion.resistant, .devotion.resistant a { color: mediumorchid }
-.mediumseagreen, .mediumseagreen a, .trust.trusting, .trust.trusting a { color: mediumseagreen }
-.orange, .orange a, .stupid, .stupid a, .change.negative, .change.negative a, .defiant.careful, .defiant.careful a, .ncs, .ncs a, .miscarriage, .miscarriage a, .intro.question { color: orange } /* generally between red and green, and a lot of other places */
-.orangered, .orangered a, .defiant.inc, .defiant.inc a, .defiant.bold, .defiant.bold, .education.neg a { color: orangered }
-.orchid, .orchid a { color: orchid } /* used once (wrong? */
-.pink, .pink a, .slave.name.simple { color: pink } /* also fetish start ??? , and a lot of other stuff */
-.red, .red a, .health.dec, .health.dec a, .cash.dec, .cash.dec a, .stat.drop, .stat.drop a, .flaw.gain, .flaw.gain a, .mindbreak, .mindbreak a, .error, .error a, .elites.loss, .elites.loss a, .reputation.dec, .reputation.dec a, .warning, .warning a { color: red } /* also generally bad stuff */
-/* note: .error is for unexpected behavior, .warning for player feedback */
-.seagreen, .seagreen a, .trust.prof-trusting, .trust.prof-trusting a { color: seagreen }
-.springgreen, .springgreen a, .skill.player, .skill.player a { color: springgreen }
-.tan, .tan a { color: tan } /* some ethnicity */
-.chocolate, .chocolate a { color: chocolate }
-.saddlebrown, .saddlebrown a { color: saddlebrown }
-.teal, .teal a { color: teal }
-.yellow, .yellow a, .noteworthy, .noteworthy a, .paraphilia.gain, .paraphilia.gain a, .devotion.ambivalent, .devotion.ambivalent a, .trust.fearful, .trust.fearful a, .job.change { color: yellow }
-.yellowgreen, .yellowgreen a, .cash.inc, .cash.inc a, .cash, .cash a { color: yellowgreen }
-.white a { color: white }
-.violet, .libido.inc { color: violet }
-.khaki, .libido.dec { color: khaki }
-
-/*! <<checkvars>> macro for SugarCube 2.x */
-#ui-dialog-body.checkvars{padding:1em}#ui-dialog-body.checkvars h1{font-size:1em;margin-top:0}#ui-dialog-body.checkvars table{border-collapse:collapse;border-spacing:0}#ui-dialog-body.checkvars thead tr{border-bottom:2px solid #444}#ui-dialog-body.checkvars tr:not(:first-child){border-top:1px solid #444}#ui-dialog-body.checkvars td,#ui-dialog-body.checkvars th{padding:.25em 1em}#ui-dialog-body.checkvars td:first-child,#ui-dialog-body.checkvars th:first-child{padding-left:.5em;border-right:1px solid #444}#ui-dialog-body.checkvars td:last-child,#ui-dialog-body.checkvars th:last-child{padding-right:.5em}#ui-dialog-body.checkvars th:first-child{text-align:center}#ui-dialog-body.checkvars td:first-child{font-weight:700;text-align:right}#ui-dialog-body.checkvars td{font-family:monospace,monospace;vertical-align:top;white-space:pre-wrap}#ui-dialog-body.checkvars .scroll-pad{margin:0;padding:0}
-
-div.output{
-width: 100%;
-width: 100vw;
-max-width: 100%;
-word-break: break-all;
-white-space: normal;
-}
-/* css rules for rules assistant */
-.rajs-list-item {
-	display: inline-block;
-	color: var(--link-color);
-	margin-right: 1em;
-}
-.rajs-list-item.selected {
-	color: gray;
-	text-decoration: none;
-}
-.rajs-list-item:last-of-type { margin-right: 0; }
-.rajs-list-item:hover {
-	cursor: pointer;
-	text-decoration: underline;
-}
-.rajs-list-item.selected:hover {
-	cursor: default;
-	text-decoration: none;
-}
-.rajs-list strong:first-of-type, .rajs-list input {
-	margin-right: 2em;
-}
-.rajs-list-item input {
-	margin: 0.25em;
-}
-.rajs-section h1 {
-	border-bottom: 1px solid white;
-	cursor: pointer;
-}
-.rajs-section h1:hover { text-decoration: underline; }
-
-.scroll {
-	overflow: auto;
-}
-
-h1, h2, h3 {
-	margin-bottom: 0;
-	margin-top: 0.25em;
-}
-.founding {
-	font-size: 0.8em;
-	margin-top: -0.8em;
-	margin-left: 0.5em;
-	font-style: italic;
-}
-table.corporate {
-	border: 3px darkgreen double;
-	border-collapse: collapse;
-	min-width: 33%;
-}
-table.corporate tbody tr:nth-child(even) {
-	background-color: rgb(0, 30, 0);
-}
-table.corporate tbody tr:nth-child(odd) {
-	background-color: rgb(15, 40, 15);
-}
-table.corporate td {
-	vertical-align: top;
-}
-table.corporate tbody th, table.corporate thead th {
-	background-color: black;
-	font-weight: bold;
-}
-.minor-note {
-	font-size: 0.75em;
-	font-style: italic;
-}
-.majorText {
-	margin-top: 0.5em;
-	margin-bottom: 1.5em;
-}
-.tab {
-	margin-left: 2em;
-}
-div.slave-report {
-	margin-top: 1em;
-	margin-bottom: 1em;
-}
-div.indent, p.indent {
-	text-indent: 2em;
-}
-div.double-indent, p.double-indent {
-	text-indent: 4em;
-}
-div.choices, p.choices {
-	margin-left: 2em;
-}
-div.double-choices, p.double-choices {
-	margin-left: 4em;
-}
-
-/* setting at the beginning of a scene / subscene */
-.scene-intro {
-	font-style: italic;
-}
-
-/* adds detail to an option: Do something. <span class="detail">Sentence that explains the effect/conditions */
-.detail {
-	font-style: italic;
-}
-
-/* additional information not related to a specific option */
-.note {
-	font-style: italic;
-}
-
-.story-label, .regularParties, .underline {
-	text-decoration: underline;
-}
-
-/* Note: Do not do a linebreak after span in HTML, because it will underline the automatic space it inserts: "Matilda_is a cow" */
-.slave-name {
-	color: pink;
-	font-weight: bold;
-	text-decoration: underline;
-	text-decoration-color: white;
-}
-
-.name {
-	font-weight: bold;
-}
-
-.custom-label {
-	color: yellow;
-	font-weight: bold;
-}
-
-div.cheat-menu {
-	font-style: italic;
-	position: absolute;
-	right: 50px;
-}
-
-h1 + p {
-	margin-top: 0;
-}
-h2 + p {
-	margin-top: 0;
-}
-h3 + p {
-	margin-top: 0;
-}
-
-.main-fcnn {
-	text-align: center;
-	margin: 0 auto;
-}
-
-.major-link, .bold {
-	font-weight: bold;
-}
-
-.clear-formatting {
-	color: white;
-	font-weight: normal;
-	font-style: normal;
-}
-
-.major-warning {
-	font-weight: bold;
-	color: red;
-}
-
-div.center, p.center {
-	margin-left: auto;
-	margin-right: auto;
-	text-align: center;
-}
-
-div.flex-container {
-	display: flex;
-}
-
-/* TODO unify tooltip systems */
-.hasTooltip {
-	text-decoration: underline;
-}
-
-/* interactable tooltip-like container - created/destroyed dynamically */
-.details-overlay {
-	display: inline-block;
-	font-size: smaller;
-	width: max-content;
-	height: max-content;
-	border-style: solid;
-	border-color: slategray;
-	border-width: 2px;
-	border-radius: 3px;
-	background-color: rgb(17, 17, 17);
-	padding: 3px;
-	position: absolute;
-	z-index: 2;
-	text-indent: 0;
-}
-
-/* make cheat textboxes fit in sidebar */
-#story-caption input {
-	min-width: 0;
-	width: calc(100% - 0.8em - 2px);
-}
-
-/* slave interact navigation */
-.adjacent-slave {
-	font-weight: bold;
-}
-.interact-name {
-	margin: 0 2em;
-}
-
-.icons {
-	font-family: 'tme-fa-icons';
-}
-
-.favorite, .favorite:hover {
-	color: yellow;
-	text-decoration: none;
-}
-
-.not-favorite, .not-favorite:hover {
-	color: grey;
-	text-decoration: none;
-}
diff --git a/src/gui/css/wardrobeUse.css b/src/gui/css/wardrobeUse.css
deleted file mode 100644
index 94a110b434caf8680e6b94b7d7fb28987dc18ea3..0000000000000000000000000000000000000000
--- a/src/gui/css/wardrobeUse.css
+++ /dev/null
@@ -1,24 +0,0 @@
-/* Style sheet for WardrobeUse.tw */
-
-#passage-wardrobe-use .optionMacro {
-	display: inline;
-}
-
-#passage-wardrobe-use .optionDescription {
-	width: unset;
-	text-align: left;
-}
-
-#passage-wardrobe-use .optionValue {
-	display: flex;
-}
-
-#passage-wardrobe-use .optionMacroOption {
-	flex-grow: 1;
-}
-
-/* Last line shouldn't grow */
-#passage-wardrobe-use .optionValue::after {
-	flex-grow: 1000000000;
-	content: '';
-}
diff --git a/src/gui/quicklinks.js b/src/gui/quicklinks.js
index c7a5dbb9347e69d586d7466daa550ebb0a43e461..f993e46a2038ab8f40f373312f0e156ea1212795 100644
--- a/src/gui/quicklinks.js
+++ b/src/gui/quicklinks.js
@@ -65,6 +65,7 @@ App.UI.quickMenu = (function() {
 			"Implant Manufactory": true,
 			"Prosthetic Lab": true,
 			"Wardrobe": true,
+			"Toy Shop": true,
 			"The Black Market": true,
 		},
 		Tools: {
@@ -96,6 +97,7 @@ App.UI.quickMenu = (function() {
 		"Firebase": () => !V.SF.Toggle || V.SF.Toggle < 1 || V.SF.Active < 1,
 		"Future Society": () => !V.FSAnnounced,
 		"Gene Lab": () => !V.geneticMappingUpgrade,
+		"Toy Shop": () => !V.toyShop,
 		"Head Girl Suite": () => !V.HGSuite,
 		"Implant Manufactory": () => !V.ImplantProductionUpgrade,
 		"Incubator": () => !V.incubator,
diff --git a/src/interaction/main/walkPast.js b/src/interaction/main/walkPast.js
index 516e06e3e8e2d7ac1e6af9de0ef477bf78c4d90e..4e7e2a8267e464aa028447e84de82fe004130a71 100644
--- a/src/interaction/main/walkPast.js
+++ b/src/interaction/main/walkPast.js
@@ -8374,7 +8374,7 @@ globalThis.walkPast = (function() {
 					t += `You get a good view of ${his} pussy.`;
 				}
 		}
-		if ((slave.vaginalAccessory === "long dildo") || (slave.vaginalAccessory === "long, large dildo") || (slave.vaginalAccessory === "long, huge dildo")) {
+		if (dildoLength(slave) > 1) {
 			t += `With every motion ${he} makes, ${his} dildo shifts, bulging out ${his} stomach.`;
 			if (plugLength(slave) > 1) {
 				t += `Beside it, a second bulge caused by ${his} extra long buttplug.`;
@@ -8964,7 +8964,7 @@ globalThis.walkPast = (function() {
 					t += `You get a good view of ${his} pussy.`;
 				}
 		}
-		if ((slave.vaginalAccessory === "long dildo") || (slave.vaginalAccessory === "long, large dildo") || (slave.vaginalAccessory === "long, huge dildo")) {
+		if (dildoLength(slave) > 1) {
 			t += `With every motion ${he} makes, ${his} dildo shifts, bulging out ${his} stomach.`;
 			if (plugLength(slave) > 1) {
 				t += `Beside it, a second bulge caused by ${his} extra long buttplug.`;
diff --git a/src/interaction/prostheticConfig.tw b/src/interaction/prostheticConfig.tw
index 4326995e2739557b650eb27dddce73f1203e6b58..d6dade1c2a87e361ba903f195ec5e179568523c1 100644
--- a/src/interaction/prostheticConfig.tw
+++ b/src/interaction/prostheticConfig.tw
@@ -32,7 +32,7 @@ This room is lined with shelves and cabinets; it could be easily mistaken for a
 
 <<if hasAnyCyberneticEyes(getSlave($AS))>>
 	<h2>Eyes</h2>
-	<p class="tab"> /* tab works better with links */
+	<p class="choices"> /* tab works better with links */
 	$He has <<if hasBothCyberneticEyes(getSlave($AS))>> ocular implants <<else>> an ocular implant <</if>> installed. You can change <<if hasBothCyberneticEyes(getSlave($AS))>>their<<else>>its<</if>> settings:
 
 	<div class="eyeContainer">
diff --git a/src/interaction/siRules.js b/src/interaction/siRules.js
index b5e02a194109390fe129440b443977390d131e8e..2d96e64db46a466810f4c76f21e32b5591372196 100644
--- a/src/interaction/siRules.js
+++ b/src/interaction/siRules.js
@@ -374,7 +374,7 @@ App.UI.SlaveInteract.rules = function(slave) {
 
 	function smartSettings(slave) {
 		let el = document.createElement('div');
-		const smartBulletVibe = slave.vaginalAccessory === "smart bullet vibrator" || slave.dickAccessory === "smart bullet vibrator";
+		const smartBulletVibe = dildoVibeLevel(slave) > 1 || slave.dickAccessory === "smart bullet vibrator";
 		const smartDildoVibe = slave.vaginalAttachment === "smart vibrator";
 
 		if (slave.clitPiercing === 3 || smartBulletVibe || smartDildoVibe) {
diff --git a/src/interaction/siWardrobe.js b/src/interaction/siWardrobe.js
index cc7345285c07d56ef67ef9217efd26af95ba47d0..ec4100d6ad67a39bf43c266666f08bcf6309dde7 100644
--- a/src/interaction/siWardrobe.js
+++ b/src/interaction/siWardrobe.js
@@ -520,6 +520,19 @@ App.UI.SlaveInteract.wardrobe = function(slave) {
 		App.UI.DOM.appendNewElement("div", el, generateRows(normalArray, "buttplug", true), "choices");
 		App.UI.DOM.appendNewElement("div", el, generateRows(longArray, "buttplug", true), "choices");
 
+		if (V.customItem.buttPlugs.size > 0) {
+			let customArray = [];
+			for (const [key, object] of V.customItem.buttPlugs) {
+				const reshapedItem = {
+					text: object.name,
+					updateSlave: {buttplug: key},
+					FS: object.fs,
+				};
+				customArray.push(reshapedItem);
+			}
+			App.UI.DOM.appendNewElement("div", el, generateRows(customArray, "buttplug", false), "choices");
+		}
+
 		return el;
 	}
 
@@ -589,9 +602,11 @@ App.UI.SlaveInteract.wardrobe = function(slave) {
 		}
 		el.appendChild(label);
 
-		let optionsArray = [];
+		let bulletArray = [];
+		let normalArray = [];
+		let longArray = [];
 
-		for (const [key, object] of App.Data.slaveWear.vaginalAccessories) {
+		for (const [key, object] of App.Data.vaginalAccessories) {
 			if (key === "none") {
 				// skip none in set, we set the link elsewhere.
 				continue;
@@ -601,24 +616,29 @@ App.UI.SlaveInteract.wardrobe = function(slave) {
 				updateSlave: {vaginalAccessory: key},
 				FS: object.fs,
 			};
-			optionsArray.push(reshapedItem);
+			if (object.width === 0) {
+				bulletArray.push(reshapedItem);
+			} else if (object.length > 1) {
+				longArray.push(reshapedItem);
+			} else {
+				normalArray.push(reshapedItem);
+			}
 		}
 
 		// Sort
 		// No sort here since we want small -> large. optionsArray = optionsArray.sort((a, b) => (a.text > b.text) ? 1 : -1);
 
 		// Options
-		let links = document.createElement('div');
-		links.className = "choices";
-		links.appendChild(generateRows(optionsArray, "vaginalAccessory", true));
-		el.appendChild(links);
+		App.UI.DOM.appendNewElement("div", el, generateRows(bulletArray, "vaginalAccessory", true), "choices");
+		App.UI.DOM.appendNewElement("div", el, generateRows(normalArray, "vaginalAccessory", true), "choices");
+		App.UI.DOM.appendNewElement("div", el, generateRows(longArray, "vaginalAccessory", true), "choices");
 
 		return el;
 	}
 
 	function vaginalAttachment() {
 		let el = document.createElement('div');
-		if (["none", "bullet vibrator", "smart bullet vibrator"].includes(slave.vaginalAccessory)) {
+		if (dildoWidth(slave) === 0) {
 			return el;
 		}
 
@@ -645,7 +665,7 @@ App.UI.SlaveInteract.wardrobe = function(slave) {
 			}
 			const reshapedItem = {
 				text: object.name,
-				updateSlave: {vaginalAttachments: key},
+				updateSlave: {vaginalAttachment: key},
 				FS: object.fs,
 			};
 			optionsArray.push(reshapedItem);
@@ -757,7 +777,7 @@ App.UI.SlaveInteract.wardrobe = function(slave) {
 
 		let optionsArray = [];
 
-		for (const [key, object] of App.Data.slaveWear.chastityDevices) {
+		for (const [key, object] of App.Data.chastityDevices) {
 			if (key === "none") {
 				// skip none in set, we set the link elsewhere.
 				continue;
diff --git a/src/js/itemAvailability.js b/src/js/itemAvailability.js
index ada89536918edb9a648dc4b203036f1292ec4ec0..1a70b09f052bc9cbde194c99b878d0eb70d12841 100644
--- a/src/js/itemAvailability.js
+++ b/src/js/itemAvailability.js
@@ -34,7 +34,7 @@ globalThis.isItemAccessible = (function() {
 				selectedDB = App.Data.slaveWear.buttplugAttachments;
 				break;
 			case "vaginalAccessory":
-				selectedDB = App.Data.slaveWear.vaginalAccessories;
+				selectedDB = App.Data.vaginalAccessories;
 				break;
 			case "vaginalAttachment":
 				selectedDB = App.Data.slaveWear.vaginalAttachments;
@@ -46,7 +46,7 @@ globalThis.isItemAccessible = (function() {
 				selectedDB = App.Data.shoes;
 				break;
 			case "chastity":
-				selectedDB = App.Data.slaveWear.chastityDevices;
+				selectedDB = App.Data.chastityDevices;
 				break;
 			default:
 				// console.log(`made a category for ${category} automatically, may need to define this by hand`);
@@ -224,7 +224,9 @@ globalThis.isItemAccessible = (function() {
 					case "vibrator":
 						if (slave.vaginalAccessory === "none") {
 							return "No vaginal accessory to attach it to";
-						} else if (slave.vaginalAccessory === "bullet vibrator" || slave.vaginalAccessory === "smart bullet vibrator") {
+						} else if (dildoWidth(slave) === 0) {
+							return "Vaginal accessory is too small";
+						} else if (dildoVibeLevel(slave)) {
 							return "Vaginal accessory already vibrates";
 						} else {
 							return true;
diff --git a/src/js/main.js b/src/js/main.js
index 750d32686277c38d6865c7cac47a8c4311cb13cf..7999c7603212a83e156bc04d596f575bce22f14d 100644
--- a/src/js/main.js
+++ b/src/js/main.js
@@ -225,7 +225,7 @@ App.MainView.full = function() {
 		div.append(App.UI.DOM.makeElement("span", "MAIN MENU", "name"));
 
 		App.UI.DOM.appendNewElement("span", div, App.UI.DOM.passageLink("Summary Options", "Summary Options"),
-			["tab", "note"]);
+			["choices", "note"]);
 
 		if (V.rulesAssistantMain !== 0) {
 			div.append(" | ");
@@ -349,17 +349,7 @@ App.MainView.full = function() {
 
 		fragment.append(assemble());
 	} catch (ex) {
-		App.UI.DOM.appendNewElement("p", fragment, `${ex.name}: ${ex.message}`, ["bold", "error"]);
-
-		const p = document.createElement("p");
-		const lines = ex.stack.split("\n");
-		for (const ll of lines) {
-			const div = document.createElement("div");
-			// remove file path from error message
-			div.append(ll.replace(/file:.*\//, "<path>/"));
-			p.append(div);
-		}
-		fragment.append(p);
+		fragment.append(App.UI.DOM.formatException(ex));
 	}
 
 	return fragment;
diff --git a/src/js/rulesAssistantOptions.js b/src/js/rulesAssistantOptions.js
index 294b86564f30c9595c969fb68c540dbb72a02da9..23c59b39e43381f354f08f40a589136c55afc656 100644
--- a/src/js/rulesAssistantOptions.js
+++ b/src/js/rulesAssistantOptions.js
@@ -1928,7 +1928,7 @@ App.RA.options = (function() {
 
 	class VagAccVirginsList extends ListSelector {
 		constructor() {
-			super("Vaginal accessories for virgins", isItemAccessible.array(App.Data.slaveWear.vaginalAccessories));
+			super("Vaginal accessories for virgins", isItemAccessible.array(App.Data.vaginalAccessories));
 			this.setValue(current_rule.set.virginAccessory);
 			this.onchange = (value) => current_rule.set.virginAccessory = value;
 		}
@@ -1936,7 +1936,7 @@ App.RA.options = (function() {
 
 	class VagAccAVirginsList extends ListSelector {
 		constructor() {
-			super("Vaginal accessories for anal virgins", isItemAccessible.array(App.Data.slaveWear.vaginalAccessories));
+			super("Vaginal accessories for anal virgins", isItemAccessible.array(App.Data.vaginalAccessories));
 			this.setValue(current_rule.set.aVirginAccessory);
 			this.onchange = (value) => current_rule.set.aVirginAccessory = value;
 		}
@@ -1944,7 +1944,7 @@ App.RA.options = (function() {
 
 	class VagAccOtherList extends ListSelector {
 		constructor() {
-			super("Vaginal accessories for other slaves", isItemAccessible.array(App.Data.slaveWear.vaginalAccessories));
+			super("Vaginal accessories for other slaves", isItemAccessible.array(App.Data.vaginalAccessories));
 			this.setValue(current_rule.set.vaginalAccessory);
 			this.onchange = (value) => current_rule.set.vaginalAccessory = value;
 		}
diff --git a/src/js/slaveCostJS.js b/src/js/slaveCostJS.js
index 98d54d5a1ef59b370acc8d40768f49aade5c63cf..a736300474d519c13b931212395c8c6d950ffa36 100644
--- a/src/js/slaveCostJS.js
+++ b/src/js/slaveCostJS.js
@@ -213,9 +213,9 @@ globalThis.BeautyArray = (function() {
 				}
 			} else {
 				if (heightPass(slave)) {
-					adjustBeauty("Height: Statuesque Glorification", ((slave.height + heelLength(slave) - 169) * ((arcology.FSStatuesqueGlorification / 50) + 0.5)));
+					adjustBeauty("Height: Statuesque Glorification", ((slave.height + shoeHeight(slave) - 169) * ((arcology.FSStatuesqueGlorification / 50) + 0.5)));
 				} else {
-					adjustBeauty("Height: Statuesque Glorification", -(((arcology.FSStatuesqueGlorification / 10) + (170 - slave.height + heelLength(slave))) * 2));
+					adjustBeauty("Height: Statuesque Glorification", -(((arcology.FSStatuesqueGlorification / 10) + (170 - slave.height + shoeHeight(slave))) * 2));
 				}
 			}
 		} else {
diff --git a/src/js/utilsAssessSlave.js b/src/js/utilsAssessSlave.js
index 5dfda9f45376541bcf3a49cdc56a67136472f72a..804be4ec9edc2951ae2003b6e1ae607a055a4dc4 100644
--- a/src/js/utilsAssessSlave.js
+++ b/src/js/utilsAssessSlave.js
@@ -274,7 +274,8 @@ globalThis.shoeHeight = function(slave) {
  * @returns {0|1|2|3}
  */
 globalThis.plugWidth = function(slave) {
-	return App.Data.buttplugs.get(slave.buttplug) ? App.Data.buttplugs.get(slave.buttplug).width : 0;
+	const plug = App.Data.buttplugs.get(slave.buttplug) || V.customItem.buttPlugs.get(slave.buttplug);
+	return plug.width || 0;
 };
 
 /**
@@ -282,8 +283,37 @@ globalThis.plugWidth = function(slave) {
  * @returns {0|1|2|3}
  */
 globalThis.plugLength = function(slave) {
-	return App.Data.buttplugs.get(slave.buttplug) ? App.Data.buttplugs.get(slave.buttplug).length : 0;
+	const plug = App.Data.buttplugs.get(slave.buttplug) || V.customItem.buttPlugs.get(slave.buttplug);
+	return plug.length || 0;
 };
 
+/**
+ * @param {App.Entity.SlaveState} slave
+ * @returns {0|1|2|3}
+ */
+globalThis.dildoWidth = function(slave) {
+	const dildo = App.Data.vaginalAccessories.get(slave.vaginalAccessory) || V.customItem.dildos.get(slave.vaginalAccessory);
+	if (dildo === undefined) {
+		console.log("missing dildo: ", slave.vaginalAccessory)
+		return 0
+	}
+	return dildo.width || 0;
+};
 
+/**
+ * @param {App.Entity.SlaveState} slave
+ * @returns {0|1|2}
+ */
+globalThis.dildoLength = function(slave) {
+	const dildo = App.Data.vaginalAccessories.get(slave.vaginalAccessory) || V.customItem.dildos.get(slave.vaginalAccessory);
+	return dildo.length || 0;
+};
 
+/**
+ * @param {App.Entity.SlaveState} slave
+ * @returns {number}
+ */
+globalThis.dildoVibeLevel = function(slave) {
+	const dildo = App.Data.vaginalAccessories.get(slave.vaginalAccessory) || V.customItem.dildos.get(slave.vaginalAccessory);
+	return dildo.vibrates || 0;
+};
diff --git a/src/js/utilsDOM.js b/src/js/utilsDOM.js
index a904b1117d55ad28749c8419ac08551872fc53e8..926132a916b73f0c9d95ee497a8225994a06e769 100644
--- a/src/js/utilsDOM.js
+++ b/src/js/utilsDOM.js
@@ -438,3 +438,65 @@ App.UI.DOM.cashFormat = function(s) {
 	span.textContent = cashFormat(Math.trunc(s));
 	return span;
 };
+
+/**
+ * Renders an exception to DOM.
+ * Tries it's best to not fail itself.
+ *
+ * @param {Error } ex Exception
+ * @param {boolean} recursion set if formatException() called itself, never set from outside
+ * @returns {DocumentFragment|HTMLParagraphElement}
+ */
+App.UI.DOM.formatException = function formatException(ex, recursion = false) {
+	/**
+	 * In case the normal rendering failed attempts to provide some information on it.
+	 * In the worst case gives back a default error message.
+	 *
+	 * @param exception
+	 * @returns {DocumentFragment|HTMLParagraphElement}
+	 */
+	function failSafe(exception) {
+		if (!recursion) {
+			return formatException(exception, true);
+		} else {
+			// Not using custom functions here, as they may be the cause of the error
+			const p = document.createElement("p");
+			p.classList.add("bold", "error");
+			p.append("Unrecoverable error in App.UI.DOM.formatException()! Please report this.");
+			return p;
+		}
+	}
+
+	/**
+	 * Renders the exception to DOM
+	 *
+	 * @returns {DocumentFragment}
+	 */
+	function render() {
+		const fragment = document.createDocumentFragment();
+
+		App.UI.DOM.appendNewElement("p", fragment, `${ex.name}: ${ex.message}; ${Config.saves.version}`, ["bold", "error"]);
+
+		const p = document.createElement("p");
+		const lines = ex.stack.split("\n");
+		for (const ll of lines) {
+			const div = document.createElement("div");
+			// remove file path from error message
+			div.append(ll.replace(/file:.*\//, "<path>/"));
+			p.append(div);
+		}
+		fragment.append(p);
+
+		return fragment;
+	}
+
+	try {
+		if (!ex) {
+			// Create a new Error so we have access to a stacktrace.
+			return failSafe(new Error("No exception provided!"));
+		}
+		return render();
+	} catch (ex) {
+		return failSafe(ex);
+	}
+};
diff --git a/src/npc/descriptions/butt/buttplug.js b/src/npc/descriptions/butt/buttplug.js
index bf8bfd502dff87d6cd2b0935e35a0b1b88928ed4..eda8f53815e9c790dc38fef555aca17a43de2340 100644
--- a/src/npc/descriptions/butt/buttplug.js
+++ b/src/npc/descriptions/butt/buttplug.js
@@ -5,7 +5,7 @@
  * @param {boolean} [params.eventDescription]
  * @returns {string}
  */
-App.Desc.buttplug = function(slave, {market, eventDescription} = {}) {
+App.Desc.buttplug = function(slave, { market, eventDescription } = {}) {
 	const r = [];
 	const {
 		he, him, his, He, His
@@ -612,73 +612,76 @@ App.Desc.buttplug = function(slave, {market, eventDescription} = {}) {
 			}
 		}
 	}
-
-	switch (slave.buttplug) {
-		case "plug":
-			r.push(`It's filled by a standard`);
+	const buttplug = App.Data.buttplugs.get(slave.buttplug) || V.customItem.buttPlugs.get(slave.buttplug);
+	if (buttplug.width === 1) {
+		if (buttplug.length === 1) {
+			r.push(`It's filled by a standard sized`);
 			if (slave.anus > 2) {
-				r.push(`buttplug, which is on the verge of falling out.`);
+				r.push(`${slave.buttplug}, which is on the verge of falling out.`);
 			} else {
-				r.push(`buttplug.`);
-			}
-			if (slave.buttplugAttachment === "tail") {
-				r.push(`A tail protrudes from the back of the plug and dangles from ${his} rear.`);
-			} else if (slave.buttplugAttachment === "fox tail") {
-				r.push(`A bushy ${slave.hColor} tail with a white tip protrudes from the back of the plug and dangles from ${his} rear.`);
-			} else if (slave.buttplugAttachment === "cow tail") {
-				r.push(`A slim, spotted tail with a cute tuft at its tip protrudes from the back of the plug and dangles from ${his} rear.`);
-			} else if (slave.buttplugAttachment === "cat tail") {
-				r.push(`A tail protrudes from the back of the plug and springs upwards from ${his} rear.`);
+				r.push(`${slave.buttplug}.`);
 			}
-			break;
-		case "long plug":
+		} else {
 			r.push(`It's filled by a standard sized, overly long`);
 			if (slave.anus > 2) {
-				r.push(`buttplug, which is on the verge of sliding out ${his} rear.`);
+				r.push(`${slave.buttplug}, which is on the verge of sliding out ${his} rear.`);
 			} else {
-				r.push(`buttplug.`);
+				r.push(`${slave.buttplug}.`);
 			}
 			r.push(`It causes a noticeable bulge in ${his} belly.`);
-			if (slave.buttplugAttachment === "tail") {
-				r.push(`A tail protrudes from the back of the plug and dangles from ${his} rear.`);
-			} else if (slave.buttplugAttachment === "fox tail") {
-				r.push(`A bushy ${slave.hColor} tail with a white tip protrudes from the back of the plug and dangles from ${his} rear.`);
-			} else if (slave.buttplugAttachment === "cow tail") {
-				r.push(`A slim, spotted tail with a cute tuft at its tip protrudes from the back of the plug and dangles from ${his} rear.`);
-			} else if (slave.buttplugAttachment === "cat tail") {
-				r.push(`A tail protrudes from the back of the plug and springs upwards from ${his} rear.`);
+		}
+	} else if (buttplug.width === 2) {
+		r.push(`It's`);
+		if (slave.anus < 2) {
+			r.push(`agonizingly stretched`);
+		} else if (slave.anus < 3) {
+			r.push(`uncomfortably stretched`);
+		} else {
+			r.push(`comfortably stretched`);
+		}
+		if (buttplug.length === 1) {
+			r.push(`by a large ${slave.buttplug}.`);
+		} else {
+			r.push(`by a large and long ${slave.buttplug}. It causes a noticeable bulge in ${his} belly.`);
+		}
+	} else if (buttplug.width === 3) {
+		if (buttplug.length === 1) {
+			if (slave.anus < 4) {
+				r.push(`It's agonizingly stretched by a ${slave.buttplug} so huge ${his} anus is probably being stretched into a permanent gape.`);
+			} else {
+				r.push(`Its ridiculous gape is comfortably filled by a huge ${slave.buttplug}.`);
 			}
-			break;
-		case "large plug":
-			r.push(`It's`);
-			if (slave.anus < 2) {
-				r.push(`agonizingly stretched`);
-			} else if (slave.anus < 3) {
-				r.push(`uncomfortably stretched`);
+		} else {
+			if (slave.anus < 4) {
+				r.push(`It's agonizingly stretched by a ${slave.buttplug} so huge it causes ${his} belly to bulge and is likely stretching ${his} anus into a permanent gape.`);
 			} else {
-				r.push(`comfortably stretched`);
+				r.push(`Its ridiculous gape is comfortably filled by a wide and long ${slave.buttplug}. It causes a noticeable bulge in ${his} belly.`);
 			}
-			r.push(`by a large buttplug.`);
+		}
+		if (slave.anus < 4) {
+			if (slave.fuckdoll === 0) {
+				if (slave.fetish === "masochist" && slave.fetishKnown === 1 && slave.fetishStrength > 60) {
+					r.push(`${He}'s frequently in tears from the pain, which is so sharp it often tips ${him} over into spontaneous orgasm.`);
+				} else {
+					r.push(`${He} spends much of ${his} time sobbing with anal pain and fear at having ${his} hole ruined.`);
+				}
+			}
+		}
+	}
+
+	switch (buttplug.width) {
+		case 3:
 			if (slave.buttplugAttachment === "tail") {
-				r.push(`${He} swings the tail from side to side with every shift of ${his} rear.`);
+				r.push(`${He} sways the tail back and forth with every ginger movement of ${his} rear.`);
 			} else if (slave.buttplugAttachment === "fox tail") {
-				r.push(`${He} swings the bushy ${slave.hColor} tail from side to side with every shift of ${his} rear.`);
+				r.push(`${He} sways the bushy ${slave.hColor} tail back and forth with every ginger movement of ${his} rear.`);
 			} else if (slave.buttplugAttachment === "cow tail") {
-				r.push(`${He} swings the spotted tail from side to side with every shift of ${his} rear.`);
+				r.push(`${He} sways the spotted tail back and forth with every ginger movement of ${his} rear.`);
 			} else if (slave.buttplugAttachment === "cat tail") {
-				r.push(`${He} bounces the tail from side to side with every shift of ${his} rear.`);
+				r.push(`${He} jiggles the tail back and forth with every ginger movement of ${his} rear.`);
 			}
 			break;
-		case "long, large plug":
-			r.push(`It's`);
-			if (slave.anus < 2) {
-				r.push(`agonizingly stretched`);
-			} else if (slave.anus < 3) {
-				r.push(`uncomfortably stretched`);
-			} else {
-				r.push(`comfortably stretched`);
-			}
-			r.push(`by a large and long buttplug. It causes a noticeable bulge in ${his} belly.`);
+		case 2:
 			if (slave.buttplugAttachment === "tail") {
 				r.push(`${He} swings the tail from side to side with every shift of ${his} rear.`);
 			} else if (slave.buttplugAttachment === "fox tail") {
@@ -689,51 +692,17 @@ App.Desc.buttplug = function(slave, {market, eventDescription} = {}) {
 				r.push(`${He} bounces the tail from side to side with every shift of ${his} rear.`);
 			}
 			break;
-		case "huge plug":
-			if (slave.anus < 4) {
-				r.push(`It's agonizingly stretched by a plug so huge ${his} anus is probably being stretched into a permanent gape.`);
-				if (slave.fuckdoll === 0) {
-					if (slave.fetish === "masochist" && slave.fetishKnown === 1 && slave.fetishStrength > 60) {
-						r.push(`${He}'s frequently in tears from the pain, which is so sharp it often tips ${him} over into spontaneous orgasm.`);
-					} else {
-						r.push(`${He} spends much of ${his} time sobbing with anal pain and fear at having ${his} hole ruined.`);
-					}
-				}
-			} else {
-				r.push(`Its ridiculous gape is comfortably filled by a huge buttplug.`);
-			}
-			if (slave.buttplugAttachment === "tail") {
-				r.push(`${He} sways the tail back and forth with every ginger movement of ${his} rear.`);
-			} else if (slave.buttplugAttachment === "fox tail") {
-				r.push(`${He} sways the bushy ${slave.hColor} tail back and forth with every ginger movement of ${his} rear.`);
-			} else if (slave.buttplugAttachment === "cow tail") {
-				r.push(`${He} sways the spotted tail back and forth with every ginger movement of ${his} rear.`);
-			} else if (slave.buttplugAttachment === "cat tail") {
-				r.push(`${He} jiggles the tail back and forth with every ginger movement of ${his} rear.`);
-			}
-			break;
-		case "long, huge plug":
-			if (slave.anus < 4) {
-				r.push(`It's agonizingly stretched by a plug so huge it causes ${his} belly to bulge and is likely stretching ${his} anus into a permanent gape.`);
-				if (slave.fuckdoll === 0) {
-					if (slave.fetish === "masochist" && slave.fetishKnown === 1 && slave.fetishStrength > 60) {
-						r.push(`${He}'s frequently in tears from the pain, which is so sharp it often tips ${him} over into spontaneous orgasm.`);
-					} else {
-						r.push(`${He} spends much of ${his} time sobbing with anal pain and fear at having ${his} hole ruined.`);
-					}
-				}
-			} else {
-				r.push(`Its ridiculous gape is comfortably filled by a wide and long buttplug. It causes a noticeable bulge in ${his} belly.`);
-			}
+		case 1:
 			if (slave.buttplugAttachment === "tail") {
-				r.push(`${He} sways the tail back and forth with every ginger movement of ${his} rear.`);
+				r.push(`A tail protrudes from the back of the plug and dangles from ${his} rear.`);
 			} else if (slave.buttplugAttachment === "fox tail") {
-				r.push(`${He} sways the bushy ${slave.hColor} tail back and forth with every ginger movement of ${his} rear.`);
+				r.push(`A bushy ${slave.hColor} tail with a white tip protrudes from the back of the plug and dangles from ${his} rear.`);
 			} else if (slave.buttplugAttachment === "cow tail") {
-				r.push(`${He} sways the spotted tail back and forth with every ginger movement of ${his} rear.`);
+				r.push(`A slim, spotted tail with a cute tuft at its tip protrudes from the back of the plug and dangles from ${his} rear.`);
 			} else if (slave.buttplugAttachment === "cat tail") {
-				r.push(`${He} jiggles the tail back and forth with every ginger movement of ${his} rear.`);
+				r.push(`A tail protrudes from the back of the plug and springs upwards from ${his} rear.`);
 			}
 	}
+
 	return r.join(" ");
 };
diff --git a/src/npc/descriptions/crotch/vagina.js b/src/npc/descriptions/crotch/vagina.js
index 45c1c6ba13156cdaba99775c41e788f00210b149..f2d81c77964d16829ce7ca524ba68e7f055bda4e 100644
--- a/src/npc/descriptions/crotch/vagina.js
+++ b/src/npc/descriptions/crotch/vagina.js
@@ -249,7 +249,9 @@ App.Desc.vagina = function(slave) {
 				}
 			}
 		}
-		r.push(App.Desc.vaginalAccessory(slave));
+		if (slave.vaginalAccessory !== "none") {
+			r.push(App.Desc.vaginalAccessory(slave));
+		}
 	}
 
 	if (slave.ovaImplant !== 0) {
diff --git a/src/npc/descriptions/crotch/vaginalAccessory.js b/src/npc/descriptions/crotch/vaginalAccessory.js
index 847437102c87cd652268f90f032854b154cf3911..948766998f0f5488617774baff953795c8effd19 100644
--- a/src/npc/descriptions/crotch/vaginalAccessory.js
+++ b/src/npc/descriptions/crotch/vaginalAccessory.js
@@ -3,6 +3,9 @@
  * @returns {string}
  */
 App.Desc.vaginalAccessory = function(slave) {
+	if (slave.vaginalAccessory === "none") {
+		return "";
+	}
 	const r = [];
 	const {
 		he, his, He, His
@@ -10,35 +13,25 @@ App.Desc.vaginalAccessory = function(slave) {
 	let held;
 	if (slave.chastityVagina) {
 		held = "held in place by a chastity belt";
-	} else if (slave.vaginalAccessory === "bullet vibrator" || slave.vaginalAccessory === "smart bullet vibrator") {
+	} else if (dildoWidth(slave) === 0) {
 		held = "held in place by a strap";
 	} else {
 		held = `held in place by a strap, which ${he} can remove for vaginal intercourse`;
 	}
-	switch (slave.vaginalAccessory) {
-		case "bullet vibrator":
-		case "smart bullet vibrator":	// FIXME: two different descriptions?
-			r.push(`A bullet vibrator is attached on ${his} clit, ${held}.`);	// FIXME: not super happy with this
-			break;
-		case "dildo":
-			/* TODO: these may need to be updated for slaves with gaping+ vaginas */
-			r.push(`${His} pussy is filled by a dildo ${held}.`);
-			break;
-		case "long dildo":
-			r.push(`${His} pussy is filled by a very long dildo ${held}. It noticeably bulges ${his} stomach.`);
+	const dildo = App.Data.vaginalAccessories.get(slave.vaginalAccessory) || V.customItem.dildos.get(slave.vaginalAccessory);
+	switch (dildo.width) {
+		case 0:
+			r.push(`A ${slave.vaginalAccessory} is attached on ${his} clit, ${held}.`);	// FIXME: not super happy with this
 			break;
-		case "large dildo":
-			r.push(`${His} pussy is`);
-			if (slave.vagina < 2) {
-				r.push(`painfully stretched`);
-			} else if (slave.vagina < 3) {
-				r.push(`uncomfortably filled`);
+		case 1:
+			if (dildo.length === 1) {
+				/* TODO: these may need to be updated for slaves with gaping+ vaginas */
+				r.push(`${His} pussy is filled by a dildo ${held}.`);
 			} else {
-				r.push(`comfortably filled`);
+				r.push(`${His} pussy is filled by a very long dildo ${held}. It noticeably bulges ${his} stomach.`);
 			}
-			r.push(`by a large dildo ${held}.`);
 			break;
-		case "long, large dildo":
+		case 2:
 			r.push(`${His} pussy is`);
 			if (slave.vagina < 2) {
 				r.push(`painfully stretched`);
@@ -47,33 +40,35 @@ App.Desc.vaginalAccessory = function(slave) {
 			} else {
 				r.push(`comfortably filled`);
 			}
-			r.push(`by a very long and large dildo ${held}. It noticeably bulges ${his} stomach.`);
-			break;
-		case "huge dildo":
-			if (slave.vagina < 4) {
-				r.push(`${His} pussy is filled to the breaking point by an enormous dildo.`);
-				if (slave.fetish === "masochist" && slave.fetishKnown === 1 && slave.fetishStrength > 60) {
-					r.push(`${He} can barely move with the discomfort, but ${he} frequently climaxes with agony.`);
-				} else {
-					r.push(`${He} can barely move with the discomfort, and ${he} sometimes breaks down in tears at having ${his} cunt permanently stretched.`);
-				}
+			if (dildo.length === 1) {
+				r.push(`by a large dildo ${held}.`);
 			} else {
-				r.push(`${His} cavernous pussy is comfortably filled by a huge dildo.`);
-			}
-			if (slave.chastityVagina) {
-				r.push(`A chastity belt locks it securely in place.`);
+				r.push(`by a very long and large dildo ${held}. It noticeably bulges ${his} stomach.`);
 			}
 			break;
-		case "long, huge dildo":
-			if (slave.vagina < 4) {
-				r.push(`${His} pussy is filled to the breaking point by an enormously wide and long dildo. It noticeably bulges ${his} stomach.`);
-				if (slave.fetish === "masochist" && slave.fetishKnown === 1 && slave.fetishStrength > 60) {
-					r.push(`${He} can barely move with the discomfort, but ${he} frequently climaxes with agony.`);
+		case 3:
+			if (dildo.length === 1) {
+				if (slave.vagina < 4) {
+					r.push(`${His} pussy is filled to the breaking point by an enormous dildo.`);
+					if (slave.fetish === "masochist" && slave.fetishKnown === 1 && slave.fetishStrength > 60) {
+						r.push(`${He} can barely move with the discomfort, but ${he} frequently climaxes with agony.`);
+					} else {
+						r.push(`${He} can barely move with the discomfort, and ${he} sometimes breaks down in tears at having ${his} cunt permanently stretched.`);
+					}
 				} else {
-					r.push(`${He} can barely move with the discomfort, and ${he} sometimes breaks down in tears at having ${his} cunt permanently stretched.`);
+					r.push(`${His} cavernous pussy is comfortably filled by a huge dildo.`);
 				}
 			} else {
-				r.push(`${His} cavernous pussy is comfortably filled by an enormously wide and long dildo. It noticeably bulges ${his} stomach.`);
+				if (slave.vagina < 4) {
+					r.push(`${His} pussy is filled to the breaking point by an enormously wide and long dildo. It noticeably bulges ${his} stomach.`);
+					if (slave.fetish === "masochist" && slave.fetishKnown === 1 && slave.fetishStrength > 60) {
+						r.push(`${He} can barely move with the discomfort, but ${he} frequently climaxes with agony.`);
+					} else {
+						r.push(`${He} can barely move with the discomfort, and ${he} sometimes breaks down in tears at having ${his} cunt permanently stretched.`);
+					}
+				} else {
+					r.push(`${His} cavernous pussy is comfortably filled by an enormously wide and long dildo. It noticeably bulges ${his} stomach.`);
+				}
 			}
 			if (slave.chastityVagina) {
 				r.push(`A chastity belt locks it securely in place.`);
@@ -107,27 +102,25 @@ App.Desc.vaginalAttachment = function(slave) {
 	const {
 		his, He, His
 	} = getPronouns(slave);
-	switch (slave.vaginalAttachment) {
-		case "vibrator":
+	switch (dildoVibeLevel(slave)) {
+		case 2:
 			// TODO: not sure about this description
-			r.push(`${He} looks distinctly uncomfortable as ${his} dildo buzzes every so often.`);
+			r.push(`${His} dildo buzzes every so often, when prompted by the arcology's systems to train ${his} sexuality.`);
 			if (slave.chastityVagina) {
 				r.push(`The chastity belt locking it in place means there is no escape.`);
 			}
 			// TODO: add descriptions for slaves with gaping+ vaginas
 			break;
-		case "smart vibrator":
+		case 1:
 			// TODO: not sure about this description
-			r.push(`${His} dildo buzzes every so often, when prompted by the arcology's systems to train ${his} sexuality.`);
+			r.push(`${He} looks distinctly uncomfortable as ${his} dildo buzzes every so often.`);
 			if (slave.chastityVagina) {
 				r.push(`The chastity belt locking it in place means there is no escape.`);
 			}
 			// TODO: add descriptions for slaves with gaping+ vaginas
 			break;
-		default:
-			if (!(["none", "bullet vibrator", "smart bullet vibrator"].includes(slave.vaginalAccessory))) {
-				r.push(`${His} current accessory is silent.`);
-			}
+		case 0:
+			r.push(`${His} current accessory is silent.`);
 	}
 	return r.join(" ");
 };
diff --git a/src/npc/descriptions/descriptionWidgets.js b/src/npc/descriptions/descriptionWidgets.js
index fc40a143f5189de6e64078d7de6291a5de458fb3..fa0da8a7f21bae215aa3c3bf0aac65e9d6c79903 100644
--- a/src/npc/descriptions/descriptionWidgets.js
+++ b/src/npc/descriptions/descriptionWidgets.js
@@ -1441,7 +1441,7 @@ App.Desc.geneticQuirkAssessment = function(slave) {
 		if (slave.geneticQuirks.androgyny === 2) {
 			r.push(`${He} has a hormonal condition resulting in androgyny.`);
 		} else if (slave.geneticQuirks.androgyny === 1 && V.geneticMappingUpgrade >= 2) {
-			r.push(`${He} is a carrier of a gene that result in androgyny.`);
+			r.push(`${He} is a carrier of a gene that results in androgyny.`);
 		}
 		if (slave.geneticQuirks.pFace === 2) {
 			r.push(`${He} has an exceedingly rare trait associated with perfect facial beauty.`);
diff --git a/src/npc/surgery/organFarm.js b/src/npc/surgery/organFarm.js
index e1951cdaafe6f080a73af59d0162bdd2f72b74e5..7294c990068158e73cb30238a2893e46284ccbc0 100644
--- a/src/npc/surgery/organFarm.js
+++ b/src/npc/surgery/organFarm.js
@@ -55,7 +55,6 @@ App.Medicine.OrganFarm.growActions = function(slave) {
 	// put everything in one string
 	let r = "";
 	if (grow !== "") {
-		// div.grid-2columns-auto is defined in mainStyleSheet.css
 		r += `The fabricator is ready to grow an organ for ${him}. Extract tissue to begin growing:<div class="grid-2columns-auto">${grow}</div>`;
 	}
 	if (wait !== []) {
diff --git a/src/pregmod/cloningWorkaround.tw b/src/pregmod/cloningWorkaround.tw
index 8be5b548e3c651d5b5cf9968dcd196c9a3405e8b..b4456a8f0355fe7502364a7b7b808867be953b67 100644
--- a/src/pregmod/cloningWorkaround.tw
+++ b/src/pregmod/cloningWorkaround.tw
@@ -8,7 +8,7 @@
 <div class="note">Blank ovum prepared, please select genetic source and surrogate.</div>
 <div>Chosen source: _impreg</div>
 
-<div class="majorText">
+<p>
 [[Yourself|Cloning Workaround][$donatrix = $PC]]
 <<for _cw = 0; _cw < $slaves.length; _cw++>>
 	<<capture _cw>>
@@ -20,10 +20,10 @@
 		<</if>>
 	<</capture>>
 <</for>>
-</div>
+</p>
 <h2>Surrogate</h2>
 <div>Chosen surrogate: _receive</div>
-<div class="majorText">
+<p>
 <<for _cw1 = 0; _cw1 < $slaves.length; _cw1++>>
 	<<capture _cw1>>
 		<<if ($slaves[_cw1].ovaries > 0 || $slaves[_cw1].mpreg > 0) && isSlaveAvailable($slaves[_cw1]) && $slaves[_cw1].preg >= 0 && $slaves[_cw1].preg < 4 && $slaves[_cw1].pregWeek >= 0 && $slaves[_cw1].pubertyXX == 1 && $slaves[_cw1].pregType < 12 && $slaves[_cw1].bellyImplant == -1 && $slaves[_cw1].broodmother == 0 && $slaves[_cw1].inflation <= 2 && $slaves[_cw1].physicalAge < 70>>
@@ -52,9 +52,9 @@
 	<</if>>
 	</div>
 <</if>>
-</div>
+</p>
 <h2>Implantation</h2>
-<div class="majorText">
+<p>
 <<if _impreg != "Undecided" && _receive != "Undecided">>
 _impreg will be cloned and _receive shall act as the incubator.
 	[[Implant clone ovum|Surrogacy][cashX(forceNeg($surgeryCost*2), "slaveSurgery"), $surgeryType = "clone"]]
@@ -65,4 +65,4 @@ _receive shall act as the incubator. //Please select a genetic source//
 <<else>>
 //Please select a genetic source and surrogate//
 <</if>>
-</div>
+</p>
diff --git a/src/uncategorized/managePenthouse.tw b/src/uncategorized/managePenthouse.tw
index 34163138a6feb591ba32f7e89e4aeb2102fea304..7133d8f82669f540bda3db6de7e871ff67bd9d65 100644
--- a/src/uncategorized/managePenthouse.tw
+++ b/src/uncategorized/managePenthouse.tw
@@ -279,6 +279,15 @@
 		</div>
 	<</if>>
 
+	<div>
+		<<if !$toyShop>>
+			[[Install a workshop for making custom toys|Manage Penthouse][cashX(-10000, "capEx"), $toyShop = true, $PC.skill.engineering += .1]]
+			<span class="detail">Costs <<print cashFormat(10000)>></span>
+		<<else>>
+			There is a [[workshop|Toy Shop]] for making custom toys.
+		<</if>>
+	</div>
+
 	<div>
 	<<if $studio == 0>>
 		[[Install a media hub to convert slave video feeds into pornography|Manage Penthouse][cashX(forceNeg(Math.trunc(10000*$upgradeMultiplierArcology)), "capEx"), $studio = 1, $PC.skill.engineering += 1]]